From: Kern Sibbald Date: Wed, 12 Aug 2015 06:01:35 +0000 (+0200) Subject: Backport from Bacula Enterprise X-Git-Tag: Release-7.2.0~36 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=4d2b94fa3e8018d1a462756ad6e1df7e12a29d20;p=bacula%2Fbacula Backport from Bacula Enterprise --- diff --git a/bacula/.gitignore b/bacula/.gitignore index 682e5dc599..447e49c3a0 100644 --- a/bacula/.gitignore +++ b/bacula/.gitignore @@ -6,7 +6,7 @@ # *.[oa] # *~ -# +# *.la *.a *.o @@ -26,6 +26,7 @@ console.log console.sum diff fd +update gconsole kernsconfig kernsconfignodb @@ -93,7 +94,6 @@ oldtxt kerns-bs-config libtool config.status.lineno -win32 # autoconf/ autoconf/autom4te.cache @@ -172,8 +172,8 @@ po/*.gmo # scripts/ scripts/bs_alert -scripts/bsg_persist scripts/breload +scripts/bsg_persist scripts/make_catalog_backup.pl scripts/bacula_config scripts/wxconsole.console_apps @@ -313,10 +313,10 @@ src/console/static-bconsole src/console/.libs # src/dird/ -src/dird/bdirjson src/dird/1 src/dird/2 src/dird/3 +src/dird/bdirjson src/dird/Makefile src/dird/bacula-dir src/dird/bacula-dir.conf @@ -329,10 +329,10 @@ src/dird/filelist.exc src/dird/.libs # src/filed/ -src/filed/bfdjson src/filed/Makefile src/filed/bacula-fd src/filed/bacula-fd.conf +src/filed/bfdjson src/filed/btraceback src/filed/btraceback.gdb src/filed/host.h @@ -382,7 +382,7 @@ src/lib/libbaccfg.a src/lib/libbacpy.a # src/plugins/dir/ -src/plugins/dir/*.o +src/plugins/dir/*.o src/plugins/dir/*.so src/plugins/dir/main src/plugins/dir/Makefile @@ -412,6 +412,8 @@ src/qt-console/mult-inheritance src/qt-console/print-func src/qt-console/qrc_main.cpp src/qt-console/moc_*.cpp +src/qt-console/moc64 +src/qt-console/ui64 src/qt-console/v src/qt-console/ui src/qt-console/Makefile @@ -431,6 +433,9 @@ src/qt-console/debug src/qt-console/release src/qt-console/Makefile.Debug src/qt-console/Makefile.Release +src/qt-console/Makefile.mingw64 +src/qt-console/Makefile.mingw64.Debug +src/qt-console/Makefile.mingw64.Release src/qt-console/object_script.bat.Debug src/qt-console/object_script.bat.Release src/qt-console/pkg-conf @@ -440,18 +445,6 @@ src/qt-console/Makefile.mingw32 src/qt-console/Makefile.mingw32.Debug src/qt-console/Makefile.mingw32.Release src/qt-console/bat.pro.mingw32 -src/qt-console/Makefile.mingw64 -src/qt-console/Makefile.mingw64.Debug -src/qt-console/Makefile.mingw64.Release -src/qt-console/moc64/ -src/qt-console/tray-monitor/Makefile.mingw64 -src/qt-console/tray-monitor/Makefile.mingw64.Debug -src/qt-console/tray-monitor/Makefile.mingw64.Release -src/qt-console/tray-monitor/moc32/ -src/qt-console/tray-monitor/moc64/ -src/qt-console/tray-monitor/ui32/ -src/qt-console/tray-monitor/ui64/ -src/qt-console/ui64/ # src/qt-console/clients/ src/qt-console/clients/.*.swp @@ -498,19 +491,27 @@ src/qt-console/testprogs/putz/moc src/qt-console/tray-monitor/Makefile.mingw32 src/qt-console/tray-monitor/Makefile.mingw32.Debug src/qt-console/tray-monitor/Makefile.mingw32.Release +src/qt-console/tray-monitor/Makefile.mingw64 +src/qt-console/tray-monitor/Makefile.mingw64.Debug +src/qt-console/tray-monitor/Makefile.mingw64.Release src/qt-console/tray-monitor/debug/ src/qt-console/tray-monitor/release/ src/qt-console/tray-monitor/moc/ src/qt-console/tray-monitor/tray-monitor.conf src/qt-console/tray-monitor/tray-monitor.pro src/qt-console/tray-monitor/ui/ +src/qt-console/tray-monitor/ui32/ +src/qt-console/tray-monitor/ui64/ +src/qt-console/tray-monitor/moc32/ +src/qt-console/tray-monitor/moc64/ +src/qt-console/tray-monitor/tray-monitor.pro.mingw32 +src/qt-console/tray-monitor/tray-monitor.pro.mingw64 # src/qt-console/ts/ src/qt-console/ts/bat_fr.qm src/qt-console/ts/bat_de.qm # src/stored/ -src/stored/bsdjson src/stored/1 src/stored/2 src/stored/Makefile @@ -521,6 +522,7 @@ src/stored/bls src/stored/bscan src/stored/btape src/stored/bcopy +src/stored/bsdjson src/stored/btraceback src/stored/btraceback.gdb src/stored/file1Job1.bsr @@ -539,10 +541,15 @@ src/stored/mount-simulator src/stored/mounted src/stored/slots src/stored/unmount-simulator +src/stored/test-dedup src/stored/.libs +src/stored/obj32 +src/stored/obj64 # src/tools/ -src/tools/find_bad_jobmedia.pl +src/tools/bsnapshot +src/tools/bpluginfo +src/tools/timelimit src/tools/ing_test src/tools/bregex src/tools/bwild @@ -561,8 +568,6 @@ src/tools/bregtest src/tools/grow src/tools/.libs src/tools/bvfs_test -src/tools/bpluginfo -src/tools/timelimit # src/tray-monitor/ src/tray-monitor/tray-monitor.conf @@ -592,7 +597,6 @@ src/win32/debug src/win32/release32 src/win32/release64 src/win32/dll -src/win32/build.log # src/win32 src/win32*.user @@ -690,6 +694,7 @@ src/win32/scripts/obj64 src/win32/stored/*.d src/win32/stored/*.res src/win32/stored/obj32 +src/win32/stored/obj64 # src/win32/stored/bcopy/ src/win32/stored/bcopy/*.user @@ -800,15 +805,6 @@ src/wx-console/bwx-console.conf src/wx-console/.libs # updatedb/ -updatedb/update_mysql_tables_1014_to_1015 -updatedb/update_mysql_tables_1015_to_1016 -updatedb/update_mysql_tables_12_to_13 -updatedb/update_mysql_tables_13_to_14 -updatedb/update_mysql_tables_14_to_1014 -updatedb/update_postgresql_tables_1014_to_1015 -updatedb/update_postgresql_tables_12_to_13 -updatedb/update_postgresql_tables_13_to_14 -updatedb/update_postgresql_tables_14_to_1014 updatedb/update_mysql_tables_12_to_14 updatedb/update_postgresql_tables_12_to_14 updatedb/update_sqlite3_tables_12_to_14 @@ -823,6 +819,20 @@ updatedb/update_mysql_tables_9_to_10 updatedb/update_postgresql_tables_9_to_10 updatedb/update_sqlite3_tables_9_to_10 updatedb/update_sqlite_tables_9_to_10 +updatedb/update_mysql_tables_1014_to_1015 +updatedb/update_mysql_tables_12_to_13 +updatedb/update_mysql_tables_13_to_14 +updatedb/update_mysql_tables_14_to_1014 +updatedb/update_mysql_tables_1015_to_1016 +updatedb/update_mysql_tables_1016_to_1017 +updatedb/update_postgresql_tables_1014_to_1015 +updatedb/update_postgresql_tables_12_to_13 +updatedb/update_postgresql_tables_13_to_14 +updatedb/update_postgresql_tables_14_to_1014 +updatedb/update_postgresql_tables_1015_to_1016 +updatedb/update_postgresql_tables_1016_to_1017 +updatedb/update_sqlite3_tables_1015_to_1016 + # /docs/ /docs/manual-fr-base @@ -1164,6 +1174,7 @@ updatedb/update_sqlite_tables_9_to_10 /gui/bimagemgr/bacula-bimagemgr.spec # /regress/ +/regress/testtime.out /regress/kerns.config /regress/1 /regress/config @@ -1182,6 +1193,8 @@ updatedb/update_sqlite_tables_9_to_10 /regress/DartConfiguration.tcl /regress/DartTestfile.txt /regress/Testing +/regress/rtest.out +/regress/testtime.out # /regress/scripts/ /regress/scripts/multi-client-bacula-dir.conf @@ -1261,146 +1274,6 @@ updatedb/update_sqlite_tables_9_to_10 /regress/tests/1 /regress/tests/2 -# /rescue/ -/rescue/autom4te.cache -/rescue/config.log -/rescue/config.status -/rescue/Makefile -/rescue/config.out -/rescue/autoconf/config.log -/rescue/kernsconfig -/rescue/diff -/rescue/mkcdrec -/rescue/mkCDrec_* - -# /rescue/autoconf/ -/rescue/autoconf/config.log -/rescue/autoconf/Make.common -/rescue/autoconf/config.h.in - -# /rescue/freebsd/ -/rescue/freebsd/Makefile -/rescue/freebsd/diskinfo -/rescue/freebsd/format.hda -/rescue/freebsd/mount_drives -/rescue/freebsd/partition.hda -/rescue/freebsd/sfdisk -/rescue/freebsd/start_network -/rescue/freebsd/1 -/rescue/freebsd/bacula-fd -/rescue/freebsd/bacula-fd.conf - -# /rescue/knoppix/ -/rescue/knoppix/Makefile -/rescue/knoppix/diskinfo -/rescue/knoppix/format.hda -/rescue/knoppix/mount_drives -/rescue/knoppix/partition.hda -/rescue/knoppix/sfdisk -/rescue/knoppix/start_network -/rescue/knoppix/1 -/rescue/knoppix/bacula-fd -/rescue/knoppix/bacula-fd.conf - -# /rescue/knoppix/cdrom/ -/rescue/knoppix/cdrom/Makefile - -# /rescue/knoppix/cdrom -/rescue/knoppix/cdromMakefile - -# /rescue/linux/ -/rescue/linux/Makefile -/rescue/linux/diskinfo -/rescue/linux/format.hda -/rescue/linux/mount_drives -/rescue/linux/partition.hda -/rescue/linux/sfdisk -/rescue/linux/start_network -/rescue/linux/1 -/rescue/linux/bacula-fd -/rescue/linux/bacula-fd.conf - -# /rescue/linux/cdrom/ -/rescue/linux/cdrom/bootcd.iso -/rescue/linux/cdrom/Makefile -/rescue/linux/cdrom/cdtree - -# /rescue/linux/cdrom -/rescue/linux/cdromformat.hda -/rescue/linux/cdromformat.hdb -/rescue/linux/cdromformat.sda -/rescue/linux/cdromformat.sdb -/rescue/linux/cdromstart_network -/rescue/linux/cdrompartition.hda -/rescue/linux/cdrompartition.hdb -/rescue/linux/cdrommount_drives -/rescue/linux/cdrometc.gz -/rescue/linux/cdromdiskinfo -/rescue/linux/cdromMakefile -/rescue/linux/cdromcreate-lv -/rescue/linux/cdromcreate-pv -/rescue/linux/cdromcreate-vg - -# /rescue/linux/cdrombin/ -/rescue/linux/cdrombin/bacula-fd - -# /rescue/linux/cdrom/cdtree/ -/rescue/linux/cdrom/cdtree/root.tar.gz -/rescue/linux/cdrom/cdtree/boot -/rescue/linux/cdrom/cdtree/bacula-timmy -/rescue/linux/cdrom/cdtree/bacula-rufus -/rescue/linux/cdrom/cdtree/bacula-polymatou -/rescue/linux/cdrom/cdtree/bacula-matou -/rescue/linux/cdrom/cdtree/bacula-omally - -# /rescue/linux/cdrom/cdtree/boot/ -/rescue/linux/cdrom/cdtree/boot/map - -# /rescue/linux/cdrom/cdtree/boot/isolinux/ -/rescue/linux/cdrom/cdtree/boot/isolinux/boot.msg -/rescue/linux/cdrom/cdtree/boot/isolinux/map -/rescue/linux/cdrom/cdtree/boot/isolinux/initrd.img -/rescue/linux/cdrom/cdtree/boot/isolinux/isolinux.cfg -/rescue/linux/cdrom/cdtree/boot/isolinux/vmlinuz - -# /rescue/linux/cdrom/roottree/ -/rescue/linux/cdrom/roottree/var -/rescue/linux/cdrom/roottree/tmp -/rescue/linux/cdrom/roottree/sbin -/rescue/linux/cdrom/roottree/proc -/rescue/linux/cdrom/roottree/mnt -/rescue/linux/cdrom/roottree/lib -/rescue/linux/cdrom/roottree/initrd -/rescue/linux/cdrom/roottree/dev -/rescue/linux/cdrom/roottree/cdrom -/rescue/linux/cdrom/roottree/bacula-rufus - -# /rescue/linux/cdrom/roottree/etc/ -/rescue/linux/cdrom/roottree/etc/init.d -/rescue/linux/cdrom/roottree/etc/terminfo -/rescue/linux/cdrom/roottree/etc/ssh -/rescue/linux/cdrom/roottree/etc/shadow -/rescue/linux/cdrom/roottree/etc/security -/rescue/linux/cdrom/roottree/etc/passwd -/rescue/linux/cdrom/roottree/etc/pam.d -/rescue/linux/cdrom/roottree/etc/ld.so.cache -/rescue/linux/cdrom/roottree/etc/gshadow -/rescue/linux/cdrom/roottree/etc/group -/rescue/linux/cdrom/roottree/etc/protocols -/rescue/linux/cdrom/roottree/etc/services -/rescue/linux/cdrom/roottree/etc/syslog.conf - -# /rescue/solaris/ -/rescue/solaris/Makefile -/rescue/solaris/diskinfo -/rescue/solaris/format.hda -/rescue/solaris/mount_drives -/rescue/solaris/partition.hda -/rescue/solaris/sfdisk -/rescue/solaris/start_network -/rescue/solaris/1 -/rescue/solaris/bacula-fd -/rescue/solaris/bacula-fd.conf platforms/osx/build platforms/osx/dl platforms/osx/products diff --git a/bacula/ChangeLog b/bacula/ChangeLog index 6d79a28c82..392780a177 100644 --- a/bacula/ChangeLog +++ b/bacula/ChangeLog @@ -1,4 +1,323 @@ - Changelog on version 7.0.5 + Changelog on version 7.2.0 + + +Release Version 7.2.0 + +29Jul15 + - Put back old pruning + - Fix max vol size test accidently deleted + - Remove gigaslam and grow on uninstall -- from bug report + - Revert to Branch-8.3 fd_snapshot.c + - Pull more recent changes from Branch-8.2 + - Fix bvfs_lsdir pattern parameter setting + - Remove CheckList nolonger used + - Revert "Use db_lock()/unlock() around JobMedia creation transaction" + - Fix #1099 about director crash with rescheduled jobs + - Fix #1209 about bat segfault when clicking on Media + - Qmsg(M_FATAL) set jcr->JobStatus to JS_FatalError immediately + - snapshot: Abort the job by default if a snapshot creation fails + - Revert to old SD-FD close session protocol + - Remove drive reservation if no Jobs running + - Remove filename patch + - snapshot: Try to detect LVM when the filesystem is ext3 or XFS + - Fix bad debug message in mac_sql.c + - Fix restore-multi-session test by incrementing found files only on next + file + - Add -T description in man pages + - Correct incorrect Fatal error message text in bsock + - mysql: Add support for multiple instances binary backup in the same fileset + - Fix compilation with new debug hook + - mysql: Avoid warning with abort_on_job plugin option + - Fix compilation after patch "prune volume yes" + - Do not print message about retention when using "prune volume yes" command + - Fix #536 about Copy/Migration/VF that should not use Client "Maximum Concurrent + Jobs" + - Fix potential segfault with unused ConfigFile objects + - Fix #1108 Enhance setdebug help command and console completion + - Add more JCR variables in lockdump procedure + - Fix error in update_postgresql_tables.in caused by bad search and replace + - Fix #1127 about the repositioning enhancement during restore + - Correct try_reposition() return code after a seek() + - Add position information in the block structure + - Fix a number of acl and xattr bugs + give more understandable variable + names + - Make btraceback.dbx and .gdb use new sql engine name + - Revert most of patch ef57e6c4 and replace with old cats code + - Revert useless parts of patch 08d8e2d29 + - Revert patch d7f71d2c94a and rewrite it using simpler public domain example + - Fix batch mode detection for SQLite3 + - Revert d9aa76fa and simplify + - Revert patch 30388e447fa3 + fix bug #1948 + - Use a more appropriate name for the acl context + - Use class pointer rather than jcr in src/lib/jcr.c + - Revert patch f294b276 + - Change B_DB to BDB to correspond to naming convention + - Add -T option in bacula-sd to use trace file + - Force use of newer TLS protocols + - Avoid problem with db_get_job_record() when SchedTime or RealEndTime is + NULL + - Update our regexec() to support NULL argument + - Add function to copy a file in bsys.c + - Fix bug 2141 fork before TLS initialization + - Update LICENSE-FOSS + - Change license on src/lib/crc32.c as agreed with the author, Joakim Tjernlund + - Update po + - More license updates + - Fix compilation + - Add read_control command between Plugin/FD and Storage Daemon + - Add .bvfs_get_jobs and .bvfs_get_bootstrap functions + - Fix compilation for Solaris9 + - Fix Makefile.in tabs + - Update Windows .def files + - More copyright notices + - Fix Windows plugin licenses + - Change license copyright for updatedb and qt-console/tray-monitor + - Change copyright for logwatch + - Update more copyrights + - Update copyrights in pebuilder + - Update plugin licenses + - Add copyrights + license to platforms + - Update copyrights in po + - More license clarifications + - One more copyright in src/cats + - Update src/cats .in file copyrights + - Compute Job "Compression Ratio" using SDJobBytes instead of JobBytes + - Get correct attributions for bsmtp.c + - Switch from LGPLv3 for scripts to BSD 2-Clause + - Fix segfault on dot commands used in RunScript::Console directive + - Fix patch c0f0e6c01c7 to optimize retries only for autochangers + - Fix #876 about SD reads too far with complex bootstrap + - Correct unmount test in dev.c + - Add debug JobId in next-vol-test script + - Fix patch c59e5da29 to not orphan buffers + - Fix bad implementation of enable/disable job,client,schedules + implement + enable/disable storage devices + - Implement enable/disable schedule and client + - Optimize Volume protocol when Volume not InChanger + - Do not trash existing record during label of new volume + - During accurate restore unstrip as soon as possible + - Better handline of no storage device found + - Fix #1075 The replace=never flag was not properly handled when combined with + database= option in mysql/postgresql plugin + - display timestamp in X_msg() in one single pass to avoid double flush() + - Update copyrights in scripts directory + - Fix bug #1083 RT14512 + - configure.in: new HAVE_FCNTL_LOCK detect fcntl() locking capability + - Fix #1008 about status storage that displays "Writing" and "Reading" information + for the same DCR + - Add new %E job code to use non fatal job errors in scripts + - Revert to old htable, but add 64 bit hash + - Fix possible race condition in smartalloc + - Refactor + optimize fstype.c + revert mntent_cache.c/h + - snap: Fix small initialization problem with LVM backend + - Fix compilation warning in bextract + - lock the pid file using fcntl(F_SETLK) + - bat: Fix segfault in client view when the Uname field is empty + - bat: Fix #1047 about segfaults in Client, Media and Pool view + - Revert patch 62ab7eb5 for filed/backup.c + - Revert patch 62ab7eb5 for filed/verify.c + - Refactor mount/unmount to use class calls + - Add return status to DEVICE:close and report error at end of Job + - Fix seg fault + - fix a Dmsg in match_bsr.c:match_volume() + - Fix #861 about bad help command on status schedule + - Add new cats header file + - Refactor DB engine to be class based + - Remove regression cancel_test from do_all + - Fix invalid .mod command in BAT during restore (bugfix #858) + - Use B_ISXDIGIT() in rangescanner + - Handle hex numbers in str_to_uint64() + - Fix prune-migration-test -- wait in wrong place + - fix MA 987 cannot copy/migrate jobs with a Level=VF in the job resource + - Fix basejob error caused by patch on bug #965 + - Allow to list restore jobs in llist jobid= command + - Fix #940 about segfault in bat when doing an "update slots" + - Fix #983 about segfault on win32 filedaemon when using bat to monitor the + status + - Fix #969 about a segfault while doing a cancel of a copy job + - Fill errmsg after an error with FETCH query in db_big_sql_query() + - Fix #965 about an empty error message after a problem when sending accurate + file list + - Fix #972 about segfault in show command used with multiple resources + - Work bsnapshot for SLES12 and fix issue with ZFS + - Fix small memory leak in cancel command with ujobid and job parameters + - Ensure that client resource is not freed during setbandwidth command + - fix errors in the use of a Mmsg() + - Use a specific mutex for auth instead of jcr->mutex + - update po + - Add missing call to free_jcr() in previous patch + - Lock the jcr when using sd_calls_client_bsock variable + - Ensure that only one thread can use the auth code in the Storage + - Fix #951 about SDCallsClient not used during restore jobs + - snapshot: Get the creation date from the zfs list snapshot command + - snapshot: Fix small issue with Name parameter in list snapshot + - Fix bsnapshot to return status=0 on error + - fix a mempool error at SD shutdown + - snapshot: Call support() only if the device is in the fileset + - snapshot: Avoid double / in path and files when volume is / + - Fix segfault with Console runscript introduced by "Stop ua commands if comm + line drops" + - handle ctrl-C and SIGTERM the same way in SD + - Startup scripts return proper exitcode for service restart action + - Implement tables configuration + - Add ReadBytes to FD status output + - Accept 0/1 for @BOOL@ type in ConfigFile module + - Set cmd_plugin only in pluginCreateFile if not SKIP/ERROR/CORE + - Fix #13680 about systemd message "unknown lvalue" + - Stop ua commands if comm line drops + - Fix weird compilation problem on rhel5 + - Display TLS information in status client/storage +25Feb15 + - Fix rpms where unix user were not properly defined + - update extrajs package in debs/rpm package + - Fix segfault with new filesetcmd + - snapshot: Reset JobId in Snapshot table when deleting a job + - snapshot: Add ability to list snapshots from the FD + - snapshot: Add a confirmation message when pruning snapshots + - Add RunScript AfterSnapshot event + - Fix #431 About upon upgrade, RPMs resets group membership + - snapshot: Display bsnapshot error message if possible + - Fix jobmedia-bug3 + - Set error code in return from run regress script + - snapshot: More work on LVM backend and on list/sync commands + - snapshot: Add EnableSnapshot directive in fileset + - snapshot: Add errmsg and status to SNAPSHOT_DBR + - snapshot: Send SnapshotRetention parameter to the Client and work on the + prune command + - Add bacula-snapshot.spec + - Add disabled=yes/no in bsnapshot.conf + - Fix #875 about bvfs repeats the same output many times + - Revert "Storing the result in a local variable from sql_num_fields saves us a + lot of callbacks." + - Remove passing args to cats driver class initialization + - Simplify cats by eliminating the B_DB_PRIV class + - Convert more db funcs to class calls + - Add Snapshot Engine to bacula core + - Change more db calls into class calls + - Add files missed in last commit + - Convert db_lock/unlock to be called via class + - Fix small memory leak + - Remove more vestages of Ingres + - Fix #843 about "show storage" option missing in the help command output + - Use bzip2 for sles dependency + - Avoid warning with uninitialized variables + - update "help status" + - Revert "Small fix to Eric great patch for readline commandcompletion so it + also compiles on non gcc compilers." + - Separate out definitions into new header + - Remove bad restore.h + - Revert "Move restore struct defintions to seperate include file. Small change + to acl.h and xattr.h to use define inline with other header files." + - Revert "Fix MediaView::getSelection" + - Bat: ensure sufficient rows to display drives in storage display + - new MmsgDx() macro that combine Mmsg(errmsg, fmt, ...) and Dmsg in once + - add a ASEERTD() for DEVELOPPER + - Fix wrong KiB value + - Revert "Fix bug #1934 Wrong values at media list in BAT" + - Change bplugin_list to b_plugin_list which is more appropriate + - Remove Ingres related unused files + - Simplify rwlock coding + - Make subroutine names clearer + - Back out useless patches + - Put back old code prior to excessive edits + - Remove over complicated acl/xattr code + - Add license to files without any + - Fix #805 about nextpool command line argument not properly used + - Remove recursion from free_bsr() and free_bsr_item() to handle very large + BSR + - Avoid segfault in connect_to_file_daemon() when jcr->client is NULL + - #776 Volume created in the catalog but not on disk and #464 SD can't read an + existing volume + - Add schedule to show command tab completion + - Make global my_name hold 127 chars + - Mark file volumes that are not accessible in Error in mount_next_vol + - Fix #743 about bat permission conflict on /opt/bacula/etc + - Add copyright to Makefiles + - change in lockmgr.c to avoid the report of a memory leak in testls + - lib: integrate SHA2 into bacula + - Fix #747 about restore problem failing on "Unexpected cryptographic session + data stream + - Revert previous copyright accidentally changed + - Fix btape fill command by removing some debug code in empty_block() + - Add Accurate Fileset option "M" to compare ctime/mtime with the save_time + like with normal Incremental + - Add index on Job(JobTDate) to mysql catalog + - Fix bad check on bopen_rsrc return status. bug #2106 + - Do not stop the storage daemon startup if the File device is not yet accessible + - Fix double free in btape + - Fix failed mount request in btape fill test + - Avoid ASSERT() when using btape with vtape driver + - Possible fix for NULL client bug #2105 + - Fix compilation of Nagios check_bacula + - Add test for restict c99 in autoconf + - Allow to use device= option in release/mount/unmount command + - Fix #699 about duplicated job name when starting two jobs at the same time + - Fix #701 about status schedule missing from tab completion and correct job + filter + - remove autoconf/configre + - Fix #346 Add ipv6 support for Solaris + - Fix #692 about compatibility issue with community FD + - Fix new match_bsr patch + - Fix #588 Improve SD bsr read performance + - Fix ownership bug in html-manuals package + - Add EFS in the client status flag list + - Implement Win EFS Support + - Fix QT windows build for 32bit + - Add SLES113 to spec files + - Add @encode and sp_decode functions for plugins + - Fix tls-duplicate-job seg fault + harden pthread_kill() code + - Update plugin version to ensure 8.0 will not load 6.6 plugins + - Add JobBytes and ReadBytes to llist jobid= output + - Rewrite store_drivetype and store_fstype to allow a comma separated list of + items + - Fix #633 about JobDefs MaximumBandwidth Job inheritance + - Fix possible editing truncation due to 32 bit calculations + - Remove non-portable -ne in echo + - update po + - Add Makefile for mssql-fd plugin + - Improve error message of open_bpipe() on win32 + - Add jobid= parameter in .status dir running command + - Add worker states + - Pull latest worker files from development branch + - Add comment about incorrect scripting + - Put Dsm_check() on reasonable debug level + - Remove auto-generated tray-monitor.pro.mingwxx file + - Display message about MaximumBlockSize default value only if a value was + specified + - fix solaris : replace be64toh() by unserial_uint64() + - update SD <-> SD capabilities exchange + - Handle RestoreObjects with Copy/Migration jobs + - Add free list to worker class + - Fix bad caps with SDcallsClient + debug + fix seg fault on connection error + - Implement blowup=nn for FD and hangup+blowup for SD + - Correct bat copyright + - Change sizeof expressions to be more standard + - Remove regress trap that causes sd-sd-test to fail + - Dmsg was not handling tag anymore + - Fix for SD seg fault while swapping volumes + - Make bextract able to handle dedup streams + - Remove unused file + - Make sure mount_next_read_volume() will cancel the current job + - Forbid llist command in runscript + - Fix #295 about query file message + - Add no_mount_request to DCR + - Update Windows .def file + - Add spec file for redhat/suse html manual package + - Fix bug #2091 bad vtape device definitions + - Fix bug #2089 compiler warning + - Make sure level is tag free when printing debug message + - fix tags in Dmsg + - Regenerated configure script + - Remove spaces at the end of lines in Bat file + - Revert bat.pro.in file + - Fix recursive echo bug #2088 + - Add new fifo class flist.h/c + - Allow to create temp DEVICE from DEVRES + - For bat always use g++ + - Make selection by Volume Name or MediaId a bit clearer + - Optimize Dmsg() with tags by keeping current tags into a separate variable + - Make message more understandable + Release version 7.0.5 diff --git a/bacula/LICENSE b/bacula/LICENSE index ae5618b8dc..83b6ff1ae6 100644 --- a/bacula/LICENSE +++ b/bacula/LICENSE @@ -24,17 +24,23 @@ General Public License are as follows: a source code file, it must be preserved when source code is conveyed and/or propagated: - Copyright (C) 20xx-2014 Free Software Foundation Europe e.V. + Bacula(R) - The Network Backup Solution - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2015 Free Software Foundation Europe e.V. - You may use this file and others of this release according to the - license defined in the LICENSE file, which includes the Affero General - Public License, v3.0 ("AGPLv3") and some additional permissions and - terms pursuant to its AGPLv3 Section 7. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. - Bacula® is a registered trademark of Kern Sibbald. + You may use this file and others of this release according to the + license defined in the LICENSE file, which includes the Affero General + Public License, v3.0 ("AGPLv3") and some additional permissions and + terms pursuant to its AGPLv3 Section 7. + + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. Additional Permissions on the work licensed herein, pursuant to Section 7 of AGPLv3 are as follows: @@ -53,6 +59,51 @@ AGPLv3 are as follows: the AGPLv3 in all respects for all of the code used other than for the Microsoft VSS code. +Copyrights of certain "script" files such as headers, shell script, Makefiles, +etc ... were never explicitly defined. In almost all cases, they have +been copyrighted with a BSD 2-Clause copyright to make them easier. However, +as is the case of all BSD type copyrights you must keep the copyright in +place and on any binary only released the copyright notice must also be +released with the binaries. An example of such a copyright is: + +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + +It is equivalent to the full BSD copyright of: + +===== +Copyright (C) 2000-2015 Kern Sibbald +License: BSD 2-Clause; see file LICENSE-FOSS + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +==== + +Note: the exact form of the copyright (dates, name) might vary, but +the intent is the same, namely that the full BSD 2-Clause coypright +applies. The file LICENSE-FOSS has a few more details. + + ###################################################################### The entire AGPL is below, in the manuals distributed with the Bacula documentation and can also be found online on the GNU web site at diff --git a/bacula/LICENSE-FAQ b/bacula/LICENSE-FAQ index 8d1cb5b065..a5e25839c6 100644 --- a/bacula/LICENSE-FAQ +++ b/bacula/LICENSE-FAQ @@ -15,7 +15,7 @@ the copyright was transferred to the Free Software Foundation Europe on 15 November 2006. The license was changed from GPLv2 to AGPLv3 on 24 July 2010. The copyright Fiduciary License Agreement signed with Kern Sibbald and the FSFE 15 November 2006 was terminated as -of 3 March 2015. Code subsequent to that date is +of 3 March 2015. Code subsequent to 3 March 2015 is Copyright, Kern Sibbald. Trademark: @@ -79,12 +79,12 @@ GPLv2 or later license: * The Regents of the University of California. All rights reserved. Permissive licenses: - Most Makefile.in, *.in, and script files are copyright LGPLv3 as noted + Most Makefile.in, *.in, and script files are copyright BSD 2-Clause as noted in each individual file. src/lib/crc32.c - Copyright (C) 2010 Joakim Tjernlund - Under LGPLv3 or later + Copyright (C) 2010-2015 Joakim Tjernlund + Under BSD 2-Clause src/lib/var.c/h ** OSSP var - Variable Expansion @@ -115,7 +115,7 @@ that contains cryptographic software written by Eric Young (eay@cryptsoft.com) and also software written by Tim Hudson (tjh@cryptsoft.com). -There are parts of Bacula that are licensed under the LGPL so +There are parts of Bacula that are licensed under the BSD 2-Clause so that those files may be used in proprietary code to interface with Bacula. diff --git a/bacula/LICENSE-FOSS b/bacula/LICENSE-FOSS new file mode 100644 index 0000000000..1e22e24933 --- /dev/null +++ b/bacula/LICENSE-FOSS @@ -0,0 +1,319 @@ + + FOSS Licenses used in Bacula + +Note: This file corresponds to the Bacula Community (bacula.org) license. + +Trademark: +The name Bacula is a registered trademark of Kern Sibbald. + +"Fair use" of the trademark is permitted following standard customs +that any prominent use (e.g. cover of a book) or the first use of +the name Bacula will include a trademark symbol. If you fork the +Bacula project and make any significant changes to the functionality +of Bacula, to avoid confusion between your fork and Bacula, you must +give your fork another name. You are not required to remove all +references to Bacula in the source code or "fair uses" in the +documentation. + +=================================== + +What follows is information from the authors of the code: + +License: +To the best of our knowledge, all code used in Bacula, which is +copyrighted by a third party, has licenses that are compatible. + + +Intellectual Property rights: +Recipient understands that although each Contributor to Bacula grants +the licenses to its Contributions set forth herein, no assurances are +provided by any Contributor that the Program does not infringe the +patent or other intellectual property rights of any other entity. +Each Contributor disclaims any liability to Recipient for claims +brought by any other entity based on infringement of intellectual +property rights or otherwise. As a condition to exercising the rights +and licenses granted hereunder, each Recipient hereby assumes sole +responsibility to secure any other intellectual property rights +needed, if any. For example, if a third party patent license is +required to allow Recipient to distribute the Program, it is +Recipient's responsibility to acquire that license before distributing +the Program. + +Copyrights: +Each Contributor to Bacula represents that to its knowledge it has +sufficient copyright rights in its Contribution, if any, to grant +the copyright license set forth in the LICENSE file.. + +Notices: +The Bacula community version uses a certain number of files that have +FOSS (Free or Open Software) licenses. Many of these files come from and are +identical to the Bacula community code. Most 3rd party FOSS licenses require +no notification so they are not included here. + +However, the Bacula Community binary releases consist of +files, with few source files (mostly scripts), and some of the FOSS licenses +such such as the BSD (Berkeley Software Development) require publication of +the copyright notices if the code is released in binary format. For example +certain copyright notifications are simplifed such as: + +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS + +This license corresponds to the following: + +===== +Copyright (C) 2000-2015 Kern Sibbald +License: BSD 2-Clause; see file LICENSE-FOSS + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +==== + +The release of binaires mentioned above is covered in point 2 (above) of +license. This file contains a list of all such licenses. + +Database scripts (src/cats): +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS + +Translations (po): +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS + +# Copyright (C) 2010 Inteos Sp. z o.o. +# Copyright (C) 2010-2014 Kern Sibbald +# License: BSD 2-Clause + +# Copyright (C) 2005-2006 Free Software Foundation Europe e.V. +# License: BSD 2-Clause + +Manpages: +This man page document is released under the BSD 2-Clause license. + +Update datbase (updatedb): +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS + +Scripts (scripts): +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS + +Platforms (platforms): +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS + +Libraries (src/lib): +fnmatch.c/h +/* + * Copyright (c) 1989, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Guido van Rossum. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +sha2.c/h +/* + * FIPS 180-2 SHA-224/256/384/512 implementation + * Last update: 02/02/2007 + * Issue date: 04/30/2005 + * + * Copyright (C) 2005, 2007 Olivier Gay + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +bmtio.h +/*- + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)mtio.h 8.1 (Berkeley) 6/2/93 + * $FreeBSD: stable/7/sys/sys/mtio.h 139825 2005-01-07 02:29:27Z imp $ + */ + +bregex.c/h + * + * Author: Tatu Ylonen + * + * Copyright (c) 1991 Tatu Ylonen, Espoo, Finland + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies. + * This software is provided "as is" without express or implied + * warranty. + +var.c/h +** OSSP var - Variable Expansion +** Copyright (c) 2001-2002 Ralf S. Engelschall +** Copyright (c) 2001-2002 The OSSP Project (http://www.ossp.org/) +** Copyright (c) 2001-2002 Cable & Wireless Deutschland (http://www.cw.com/de/) +** +** This file is part of OSSP var, a variable expansion +** library which can be found at http://www.ossp.org/pkg/lib/var/. +** +** Permission to use, copy, modify, and distribute this software for +** any purpose with or without fee is hereby granted, provided that +** the above copyright notice and this permission notice appear in all +** copies. +** + +lz4.c lz4_encoder.h lz4.h +====== +/* + LZ4 - Fast LZ compression algorithm + Copyright (C) 2011-2013, Yann Collet. + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - LZ4 homepage : http://fastcompression.blogspot.com/p/lz4.html + - LZ4 source repository : http://code.google.com/p/lz4/ +*/ +=== + +crc32.c +===== +/* + Bacula® - The Network Backup Solution + + Copyright (c) 2010-2015, Joakim Tjernlund + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +==== diff --git a/bacula/Makefile.in b/bacula/Makefile.in index 6e2990630b..64db60f03d 100755 --- a/bacula/Makefile.in +++ b/bacula/Makefile.in @@ -1,7 +1,8 @@ +# # Master Makefile # -# Author: Kern Sibbald, Copyright 2000-2015 -# License: BSD 2-Clause +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # @MCOMMON@ @@ -12,8 +13,8 @@ dir_user=@dir_user@ srcdir = @srcdir@ VPATH = @srcdir@ .PATH: @srcdir@ -topdir = . -thisdir = . +topdir = @BUILD_DIR@ +thisdir = @BUILD_DIR@ first_rule: all @@ -35,7 +36,7 @@ DIST_CFG = autoconf/aclocal.m4 autoconf/configure.in \ autoconf/install-sh autoconf/mkinstalldirs doc_files = VERIFYING ChangeLog README ReleaseNotes LICENSE \ - LICENSE-FAQ INSTALL + LICENSE-FAQ LICENSE-FOSS INSTALL MKDIR = $(srcdir)/autoconf/mkinstalldirs LIBTOOL_DEPS = @LIBTOOL_DEPS@ @@ -53,7 +54,7 @@ depend: @for I in ${all_subdirs}; \ do (cd $$I; echo "==>Entering directory `pwd`"; $(MAKE) DESTDIR=$(DESTDIR) $@ || exit 1); done -bacula-fd: Makefile +bacula-fd: Makefile @for I in ${fd_subdirs}; \ do (cd $$I; echo "==>Entering directory `pwd`"; \ $(MAKE) DESTDIR=$(DESTDIR) all || \ @@ -106,15 +107,19 @@ installdirs: $(MKDIR) $(DESTDIR)$(scriptdir) $(MKDIR) $(DESTDIR)$(docdir) $(MKDIR) $(DESTDIR)$(archivedir) + $(MKDIR) $(DESTDIR)$(bsrdir) + $(MKDIR) $(DESTDIR)${logdir} -if test ! -d $(DESTDIR)$(working_dir) ; then \ $(MKDIR) $(DESTDIR)$(working_dir); \ chmod 770 $(DESTDIR)$(working_dir); \ fi -if test "x$(dir_user)" != "x" ; then \ chown $(dir_user) $(DESTDIR)$(working_dir); \ + chown $(dir_user) $(DESTDIR)$(logdir); \ fi -if test "x$(dir_group)" != "x" ; then \ chgrp $(dir_group) $(DESTDIR)$(working_dir); \ + chgrp $(dir_group) $(DESTDIR)$(logdir); \ fi install: installdirs @@ -125,16 +130,16 @@ uninstall: @for I in $(all_subdirs); do (cd $$I && $(MAKE) DESTDIR=$(DESTDIR) $@ || exit 1); done install-autostart: - (cd platforms && $(MAKE) DESTDIR=$(DESTDIR) $@ || exit 1) + (cd platforms && $(MAKE) DESTDIR=$(DESTDIR) $@ || exit 1) install-autostart-dir: - (cd platforms && $(MAKE) DESTDIR=$(DESTDIR) $@ || exit 1) + (cd platforms && $(MAKE) DESTDIR=$(DESTDIR) $@ || exit 1) install-autostart-fd: - (cd platforms && $(MAKE) DESTDIR=$(DESTDIR) $@ || exit 1) + (cd platforms && $(MAKE) DESTDIR=$(DESTDIR) $@ || exit 1) install-autostart-sd: - (cd platforms && $(MAKE) DESTDIR=$(DESTDIR) $@ || exit 1) + (cd platforms && $(MAKE) DESTDIR=$(DESTDIR) $@ || exit 1) uninstall-autostart: (cd platforms && $(MAKE) DESTDIR=$(DESTDIR) $@ || exit 1) @@ -190,7 +195,7 @@ distclean: @$(RMF) bacula fd Makefile startmysql stopmysql startit stopit btraceback @$(RMF) bconsole gconsole @$(RMF) *~ 1 2 3 core core.* config.guess console.log console.sum - @$(RMF) working/* kerns-* + @$(RMF) working/* kerns-* @$(RMF) -rf txt diff src/python src/testprogs @$(RMF) libtool @@ -217,22 +222,4 @@ distcopy: distrib: configure autoconf/config.h.in distdirs distcopy -test: - - -tar.gz: ../$(VERNAME).tar.gz -../$(VERNAME).tar.gz: - (cd ..; tar cvf - $(VERNAME) | gzip -f9 > $(VERNAME).tar.gz) - -tar.Z: ../$(VERNAME).tar.Z -../$(VERNAME).tar.Z: - (cd ..; tar cvf - $(VERNAME) | compress > $(VERNAME).tar.Z) - -tar.bz2: ../$(VERNAME).tar.bz2 -../$(VERNAME).tar.bz2: - (cd ..; tar cvf - $(VERNAME) | bzip2 -f9 > $(VERNAME).tar.bz2) - -uuencode: tar.gz - uuencode ../$(VERNAME).tar.gz $(VERNAME).tar.gz > ../$(VERNAME).tgz.uu - # ------------------------------------------------------------------------ diff --git a/bacula/ReleaseNotes b/bacula/ReleaseNotes index 20ca3dc288..f67c3622ff 100644 --- a/bacula/ReleaseNotes +++ b/bacula/ReleaseNotes @@ -1,5 +1,327 @@ - Release Notes for Bacula 7.0.5 + Release Notes for Bacula 7.2.0 + +Release version 7.2.0 + +29Jul15 + - Put back old pruning + - Fix max vol size test accidently deleted + - Remove gigaslam and grow on uninstall -- from bug report + - Revert to Branch-8.3 fd_snapshot.c + - Pull more recent changes from Branch-8.2 + - Fix bvfs_lsdir pattern parameter setting + - Remove CheckList nolonger used + - Revert "Use db_lock()/unlock() around JobMedia creation transaction" + - Fix #1099 about director crash with rescheduled jobs + - Fix #1209 about bat segfault when clicking on Media + - Qmsg(M_FATAL) set jcr->JobStatus to JS_FatalError immediately + - snapshot: Abort the job by default if a snapshot creation fails + - Revert to old SD-FD close session protocol + - Remove drive reservation if no Jobs running + - Remove filename patch + - snapshot: Try to detect LVM when the filesystem is ext3 or XFS + - Fix bad debug message in mac_sql.c + - Fix restore-multi-session test by incrementing found files only on next + file + - Add -T description in man pages + - Correct incorrect Fatal error message text in bsock + - mysql: Add support for multiple instances binary backup in the same fileset + - Fix compilation with new debug hook + - mysql: Avoid warning with abort_on_job plugin option + - Fix compilation after patch "prune volume yes" + - Do not print message about retention when using "prune volume yes" command + - Fix #536 about Copy/Migration/VF that should not use Client "Maximum Concurrent + Jobs" + - Fix potential segfault with unused ConfigFile objects + - Fix #1108 Enhance setdebug help command and console completion + - Add more JCR variables in lockdump procedure + - Fix error in update_postgresql_tables.in caused by bad search and replace + - Fix #1127 about the repositioning enhancement during restore + - Correct try_reposition() return code after a seek() + - Add position information in the block structure + - Fix a number of acl and xattr bugs + give more understandable variable + names + - Make btraceback.dbx and .gdb use new sql engine name + - Revert most of patch ef57e6c4 and replace with old cats code + - Revert useless parts of patch 08d8e2d29 + - Revert patch d7f71d2c94a and rewrite it using simpler public domain example + - Fix batch mode detection for SQLite3 + - Revert d9aa76fa and simplify + - Revert patch 30388e447fa3 + fix bug #1948 + - Use a more appropriate name for the acl context + - Use class pointer rather than jcr in src/lib/jcr.c + - Revert patch f294b276 + - Change B_DB to BDB to correspond to naming convention + - Add -T option in bacula-sd to use trace file + - Force use of newer TLS protocols + - Avoid problem with db_get_job_record() when SchedTime or RealEndTime is + NULL + - Update our regexec() to support NULL argument + - Add function to copy a file in bsys.c + - Fix bug 2141 fork before TLS initialization + - Update LICENSE-FOSS + - Change license on src/lib/crc32.c as agreed with the author, Joakim Tjernlund + - Update po + - More license updates + - Fix compilation + - Add read_control command between Plugin/FD and Storage Daemon + - Add .bvfs_get_jobs and .bvfs_get_bootstrap functions + - Fix compilation for Solaris9 + - Fix Makefile.in tabs + - Update Windows .def files + - More copyright notices + - Fix Windows plugin licenses + - Change license copyright for updatedb and qt-console/tray-monitor + - Change copyright for logwatch + - Update more copyrights + - Update copyrights in pebuilder + - Update plugin licenses + - Add copyrights + license to platforms + - Update copyrights in po + - More license clarifications + - One more copyright in src/cats + - Update src/cats .in file copyrights + - Compute Job "Compression Ratio" using SDJobBytes instead of JobBytes + - Get correct attributions for bsmtp.c + - Switch from LGPLv3 for scripts to BSD 2-Clause + - Fix segfault on dot commands used in RunScript::Console directive + - Fix patch c0f0e6c01c7 to optimize retries only for autochangers + - Fix #876 about SD reads too far with complex bootstrap + - Correct unmount test in dev.c + - Add debug JobId in next-vol-test script + - Fix patch c59e5da29 to not orphan buffers + - Fix bad implementation of enable/disable job,client,schedules + implement + enable/disable storage devices + - Implement enable/disable schedule and client + - Optimize Volume protocol when Volume not InChanger + - Do not trash existing record during label of new volume + - During accurate restore unstrip as soon as possible + - Better handline of no storage device found + - Fix #1075 The replace=never flag was not properly handled when combined with + database= option in mysql/postgresql plugin + - display timestamp in X_msg() in one single pass to avoid double flush() + - Update copyrights in scripts directory + - Fix bug #1083 RT14512 + - configure.in: new HAVE_FCNTL_LOCK detect fcntl() locking capability + - Fix #1008 about status storage that displays "Writing" and "Reading" information + for the same DCR + - Add new %E job code to use non fatal job errors in scripts + - Revert to old htable, but add 64 bit hash + - Fix possible race condition in smartalloc + - Refactor + optimize fstype.c + revert mntent_cache.c/h + - snap: Fix small initialization problem with LVM backend + - Fix compilation warning in bextract + - lock the pid file using fcntl(F_SETLK) + - bat: Fix segfault in client view when the Uname field is empty + - bat: Fix #1047 about segfaults in Client, Media and Pool view + - Revert patch 62ab7eb5 for filed/backup.c + - Revert patch 62ab7eb5 for filed/verify.c + - Refactor mount/unmount to use class calls + - Add return status to DEVICE:close and report error at end of Job + - Fix seg fault + - fix a Dmsg in match_bsr.c:match_volume() + - Fix #861 about bad help command on status schedule + - Add new cats header file + - Refactor DB engine to be class based + - Remove regression cancel_test from do_all + - Fix invalid .mod command in BAT during restore (bugfix #858) + - Use B_ISXDIGIT() in rangescanner + - Handle hex numbers in str_to_uint64() + - Fix prune-migration-test -- wait in wrong place + - fix MA 987 cannot copy/migrate jobs with a Level=VF in the job resource + - Fix basejob error caused by patch on bug #965 + - Allow to list restore jobs in llist jobid= command + - Fix #940 about segfault in bat when doing an "update slots" + - Fix #983 about segfault on win32 filedaemon when using bat to monitor the + status + - Fix #969 about a segfault while doing a cancel of a copy job + - Fill errmsg after an error with FETCH query in db_big_sql_query() + - Fix #965 about an empty error message after a problem when sending accurate + file list + - Fix #972 about segfault in show command used with multiple resources + - Work bsnapshot for SLES12 and fix issue with ZFS + - Fix small memory leak in cancel command with ujobid and job parameters + - Ensure that client resource is not freed during setbandwidth command + - fix errors in the use of a Mmsg() + - Use a specific mutex for auth instead of jcr->mutex + - update po + - Add missing call to free_jcr() in previous patch + - Lock the jcr when using sd_calls_client_bsock variable + - Ensure that only one thread can use the auth code in the Storage + - Fix #951 about SDCallsClient not used during restore jobs + - snapshot: Get the creation date from the zfs list snapshot command + - snapshot: Fix small issue with Name parameter in list snapshot + - Fix bsnapshot to return status=0 on error + - fix a mempool error at SD shutdown + - snapshot: Call support() only if the device is in the fileset + - snapshot: Avoid double / in path and files when volume is / + - Fix segfault with Console runscript introduced by "Stop ua commands if comm + line drops" + - handle ctrl-C and SIGTERM the same way in SD + - Startup scripts return proper exitcode for service restart action + - Implement tables configuration + - Add ReadBytes to FD status output + - Accept 0/1 for @BOOL@ type in ConfigFile module + - Set cmd_plugin only in pluginCreateFile if not SKIP/ERROR/CORE + - Fix #13680 about systemd message "unknown lvalue" + - Stop ua commands if comm line drops + - Fix weird compilation problem on rhel5 + - Display TLS information in status client/storage + - Fix rpms where unix user were not properly defined + - update extrajs package in debs/rpm package + - Fix segfault with new filesetcmd + - snapshot: Reset JobId in Snapshot table when deleting a job + - snapshot: Add ability to list snapshots from the FD + - snapshot: Add a confirmation message when pruning snapshots + - Add RunScript AfterSnapshot event + - Fix #431 About upon upgrade, RPMs resets group membership + - snapshot: Display bsnapshot error message if possible + - Fix jobmedia-bug3 + - Set error code in return from run regress script + - snapshot: More work on LVM backend and on list/sync commands + - snapshot: Add EnableSnapshot directive in fileset + - snapshot: Add errmsg and status to SNAPSHOT_DBR + - snapshot: Send SnapshotRetention parameter to the Client and work on the + prune command + - Add bacula-snapshot.spec + - Add disabled=yes/no in bsnapshot.conf + - Fix #875 about bvfs repeats the same output many times + - Revert "Storing the result in a local variable from sql_num_fields saves us a + lot of callbacks." + - Remove passing args to cats driver class initialization + - Simplify cats by eliminating the B_DB_PRIV class + - Convert more db funcs to class calls + - Add Snapshot Engine to bacula core + - Change more db calls into class calls + - Add files missed in last commit + - Convert db_lock/unlock to be called via class + - Fix small memory leak + - Remove more vestages of Ingres + - Fix #843 about "show storage" option missing in the help command output + - Use bzip2 for sles dependency + - Avoid warning with uninitialized variables + - update "help status" + - Revert "Small fix to Eric great patch for readline commandcompletion so it + also compiles on non gcc compilers." + - Separate out definitions into new header + - Remove bad restore.h + - Revert "Move restore struct defintions to seperate include file. Small change + to acl.h and xattr.h to use define inline with other header files." + - Revert "Fix MediaView::getSelection" + - Bat: ensure sufficient rows to display drives in storage display + - new MmsgDx() macro that combine Mmsg(errmsg, fmt, ...) and Dmsg in once + - add a ASEERTD() for DEVELOPPER + - Fix wrong KiB value + - Revert "Fix bug #1934 Wrong values at media list in BAT" + - Change bplugin_list to b_plugin_list which is more appropriate + - Remove Ingres related unused files + - Simplify rwlock coding + - Make subroutine names clearer + - Back out useless patches + - Put back old code prior to excessive edits + - Remove over complicated acl/xattr code + - Add license to files without any + - Fix #805 about nextpool command line argument not properly used + - Remove recursion from free_bsr() and free_bsr_item() to handle very large + BSR + - Avoid segfault in connect_to_file_daemon() when jcr->client is NULL + - #776 Volume created in the catalog but not on disk and #464 SD can't read an + existing volume + - Add schedule to show command tab completion + - Make global my_name hold 127 chars + - Mark file volumes that are not accessible in Error in mount_next_vol + - Fix #743 about bat permission conflict on /opt/bacula/etc + - Add copyright to Makefiles + - change in lockmgr.c to avoid the report of a memory leak in testls + - lib: integrate SHA2 into bacula + - Fix #747 about restore problem failing on "Unexpected cryptographic session + data stream + - Revert previous copyright accidentally changed + - Fix btape fill command by removing some debug code in empty_block() + - Add Accurate Fileset option "M" to compare ctime/mtime with the save_time + like with normal Incremental + - Add index on Job(JobTDate) to mysql catalog + - Fix bad check on bopen_rsrc return status. bug #2106 + - Do not stop the storage daemon startup if the File device is not yet accessible + - Fix double free in btape + - Fix failed mount request in btape fill test + - Avoid ASSERT() when using btape with vtape driver + - Possible fix for NULL client bug #2105 + - Fix compilation of Nagios check_bacula + - Add test for restict c99 in autoconf + - Allow to use device= option in release/mount/unmount command + - Fix #699 about duplicated job name when starting two jobs at the same time + - Fix #701 about status schedule missing from tab completion and correct job + filter + - remove autoconf/configre + - Fix #346 Add ipv6 support for Solaris + - Fix #692 about compatibility issue with community FD + - Fix new match_bsr patch + - Fix #588 Improve SD bsr read performance + - Fix ownership bug in html-manuals package + - Add EFS in the client status flag list + - Implement Win EFS Support + - Fix QT windows build for 32bit + - Add SLES113 to spec files + - Add @encode and sp_decode functions for plugins + - Fix tls-duplicate-job seg fault + harden pthread_kill() code + - Update plugin version to ensure 8.0 will not load 6.6 plugins + - Add JobBytes and ReadBytes to llist jobid= output + - Rewrite store_drivetype and store_fstype to allow a comma separated list of + items + - Fix #633 about JobDefs MaximumBandwidth Job inheritance + - Fix possible editing truncation due to 32 bit calculations + - Remove non-portable -ne in echo + - update po + - Add Makefile for mssql-fd plugin + - Improve error message of open_bpipe() on win32 + - Add jobid= parameter in .status dir running command + - Add worker states + - Pull latest worker files from development branch + - Add comment about incorrect scripting + - Put Dsm_check() on reasonable debug level + - Remove auto-generated tray-monitor.pro.mingwxx file + - Display message about MaximumBlockSize default value only if a value was + specified + - fix solaris : replace be64toh() by unserial_uint64() + - update SD <-> SD capabilities exchange + - Handle RestoreObjects with Copy/Migration jobs + - Add free list to worker class + - Fix bad caps with SDcallsClient + debug + fix seg fault on connection error + - Implement blowup=nn for FD and hangup+blowup for SD + - Correct bat copyright + - Change sizeof expressions to be more standard + - Remove regress trap that causes sd-sd-test to fail + - Dmsg was not handling tag anymore + - Fix for SD seg fault while swapping volumes + - Make bextract able to handle dedup streams + - Remove unused file + - Make sure mount_next_read_volume() will cancel the current job + - Forbid llist command in runscript + - Fix #295 about query file message + - Add no_mount_request to DCR + - Update Windows .def file + - Add spec file for redhat/suse html manual package + - Fix bug #2091 bad vtape device definitions + - Fix bug #2089 compiler warning + - Make sure level is tag free when printing debug message + - fix tags in Dmsg + - Regenerated configure script + - Remove spaces at the end of lines in Bat file + - Revert bat.pro.in file + - Fix recursive echo bug #2088 + - Add new fifo class flist.h/c + - Allow to create temp DEVICE from DEVRES + - For bat always use g++ + - Make selection by Volume Name or MediaId a bit clearer + - Optimize Dmsg() with tags by keeping current tags into a separate variable + - Make message more understandable + + +========================================================================= + + +================= Old 7.0.x Release ==================================== Release version 7.0.5 This is an important bug fix release to version 7.0.4. Since it fixes several diff --git a/bacula/autoconf/Make.common.in b/bacula/autoconf/Make.common.in index e989887b40..cd57f07c45 100644 --- a/bacula/autoconf/Make.common.in +++ b/bacula/autoconf/Make.common.in @@ -1,6 +1,6 @@ # -# Author: Kern Sibbald, 2002 -# License: BSD 2-Clause +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # This file is pulled in by all the Unix Bacula Makefiles # so it has all the "common" definitions diff --git a/bacula/autoconf/acconfig.h b/bacula/autoconf/acconfig.h index 7985d2450f..3a694a0fce 100644 --- a/bacula/autoconf/acconfig.h +++ b/bacula/autoconf/acconfig.h @@ -3,8 +3,8 @@ /* ------------------------------------------------------------------------- */ /* - * Author: Kern Sibbald, 2002 - * License: BSD 2-Clause + * Copyright (C) 2000-2015 Kern Sibbald + * License: BSD 2-Clause; see file LICENSE-FOSS */ /* Define if you want to use MySQL as Catalog database */ diff --git a/bacula/autoconf/bacula-macros/db.m4 b/bacula/autoconf/bacula-macros/db.m4 index 0f4650cf79..a9a32912c3 100644 --- a/bacula/autoconf/bacula-macros/db.m4 +++ b/bacula/autoconf/bacula-macros/db.m4 @@ -1,6 +1,6 @@ # -# Author: Kern Sibbald, 2008 -# License: BSD 2-Clause +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # AC_DEFUN([BA_CHECK_DBI_DB], [ @@ -808,7 +808,7 @@ AC_HELP_STRING([--with-sqlite3@<:@=DIR@:>@], [Include SQLite3 support. DIR is th if test "x$support_batch_insert" = "xyes"; then dnl For sqlite checking saved_LDFLAGS="${LDFLAGS}" - LDFLAGS="${saved_LDFLAGS} -L$SQLITE_LIBDIR" + LDFLAGS="${saved_LDFLAGS} -lpthread -L$SQLITE_LIBDIR" AC_CHECK_LIB(sqlite3, sqlite3_threadsafe, AC_DEFINE(HAVE_SQLITE3_THREADSAFE, 1, [Set if have sqlite3_threadsafe])) if test "x$ac_cv_lib_sqlite3_sqlite3_threadsafe" = "xyes"; then diff --git a/bacula/autoconf/bacula-macros/os.m4 b/bacula/autoconf/bacula-macros/os.m4 index a090d861e5..eb249a6e4f 100644 --- a/bacula/autoconf/bacula-macros/os.m4 +++ b/bacula/autoconf/bacula-macros/os.m4 @@ -1,7 +1,7 @@ dnl Check type of signal routines (posix, 4.2bsd, 4.1bsd or v7) dln Author: Nicolas Boichat -dnl License: BSD 2-Clause +dnl License: BSD 2-Clause; see file LICENSE-FOSS AC_DEFUN([SIGNAL_CHECK], [AC_REQUIRE([AC_TYPE_SIGNAL]) diff --git a/bacula/autoconf/config.h.in b/bacula/autoconf/config.h.in index 33b04f1e80..5cc08b80ad 100644 --- a/bacula/autoconf/config.h.in +++ b/bacula/autoconf/config.h.in @@ -2,6 +2,11 @@ /* ------------------------------------------------------------------------- */ /* -- CONFIGURE SPECIFIED FEATURES -- */ /* ------------------------------------------------------------------------- */ + +/* + * Copyright (C) 2000-2015 Kern Sibbald + * License: BSD 2-Clause; see file LICENSE-FOSS + */ /* Define if you want to use MySQL as Catalog database */ #undef USE_MYSQL_DB @@ -150,7 +155,6 @@ #undef llu #undef HAVE_READLINE -#undef HAVE_PYTHON #undef HAVE_GMP @@ -273,6 +277,9 @@ /* Set if Bacula bat Qt4 GUI support enabled */ #undef HAVE_BAT +/* Define to 1 if you have the `be64toh' function. */ +#undef HAVE_BE64TOH + /* Big Endian */ #undef HAVE_BIG_ENDIAN @@ -398,6 +405,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H +/* Set if fcntl supports file locking */ +#undef HAVE_FCNTL_LOCK + /* Define to 1 if you have the `fdatasync' function. */ #undef HAVE_FDATASYNC @@ -488,6 +498,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_GRP_H +/* Define to 1 if you have the `htobe64' function. */ +#undef HAVE_HTOBE64 + /* Define to 1 if you have the `iconv()' function. */ #undef HAVE_ICONV @@ -669,6 +682,9 @@ /* Define to 1 if you have the `posix_fadvise' function. */ #undef HAVE_POSIX_FADVISE +/* Define to 1 if you have the `posix_fallocate' function. */ +#undef HAVE_POSIX_FALLOCATE + /* Define if your printf() function supports format strings with positions. */ #undef HAVE_POSIX_PRINTF @@ -1022,6 +1038,9 @@ . */ #undef MAJOR_IN_SYSMACROS +/* Whether to have in6addr_any support */ +#undef NEED_IN6ADDR_ANY + /* Define to 1 if your C compiler doesn't accept -c and -o together. */ #undef NO_MINUS_C_MINUS_O @@ -1100,6 +1119,9 @@ /* Set if DB batch insert code enabled */ #undef USE_BATCH_FILE_INSERT +/* Set if you want Lock Manager enabled */ +#undef USE_LOCKMGR + /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD @@ -1124,9 +1146,6 @@ /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES -/* Set if you want Lock Manager enabled */ -#undef _USE_LOCKMGR - /* Define to empty if `const' does not conform to ANSI C. */ #undef const @@ -1171,6 +1190,20 @@ doesn't define it. */ #undef ptrdiff_t +/* Define to the equivalent of the C99 'restrict' keyword, or to + nothing if this is not supported. Do not define if restrict is + supported directly. */ +#undef restrict +/* Work around a bug in Sun C++: it does not support _Restrict or + __restrict__, even though the corresponding Sun C compiler ends up with + "#define restrict _Restrict" or "#define restrict __restrict__" in the + previous line. Perhaps some future version of Sun C++ will work with + restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ +#if defined __SUNPRO_CC && !defined __RESTRICT +# define _Restrict +# define __restrict__ +#endif + /* Define to empty if the C compiler doesn't support this keyword. */ #undef signed diff --git a/bacula/autoconf/configure.in b/bacula/autoconf/configure.in index 5cda35bc33..db86e4dd6f 100644 --- a/bacula/autoconf/configure.in +++ b/bacula/autoconf/configure.in @@ -2,8 +2,8 @@ dnl dnl dnl Process this file with autoconf to produce a configure script. dnl -dnl Author: Kern Sibbald, Copyright, 2000-2015 -dnl License: BSD 2-Clause +dnl Copyright (C) 2000-2015 Kern Sibbald +dnl License: BSD 2-Clause; see file LICENSE-FOSS dnl dnl require a recent autoconf AC_PREREQ(2.61) @@ -52,6 +52,7 @@ dnl src/lib dnl can be overwritten by specific values from version.h LIBBAC_LT_RELEASE=`sed -n -e 's/^#.*LIBBAC_LT_RELEASE.*"\(.*\)"$/\1/p' ${srcdir}/src/version.h` LIBBACCFG_LT_RELEASE=`sed -n -e 's/^#.*LIBBACCFG_LT_RELEASE.*"\(.*\)"$/\1/p' ${srcdir}/src/version.h` +LIBBACPY_LT_RELEASE=`sed -n -e 's/^#.*LIBBACPY_LT_RELEASE.*"\(.*\)"$/\1/p' ${srcdir}/src/version.h` LIBBAC_LT_RELEASE=${LIBBAC_LT_RELEASE:-$VERSION} LIBBACCFG_LT_RELEASE=${LIBBACCFG_LT_RELEASE:-$VERSION} @@ -78,6 +79,10 @@ LIBBACFIND_LT_RELEASE=${LIBBACFIND_LT_RELEASE:-$VERSION} AC_SUBST(LIBBACFIND_LT_RELEASE)dnl + +dnl PFILES are platform or plugin specific files +PFILES="platforms/Makefile" + echo "configuring for ${BACULA} $VERSION ($DATE)" @@ -129,7 +134,6 @@ AC_PATH_PROG(DVDRWFORMAT, dvd+rw-format, dvd+rw-format) AC_PATH_PROG(PKGCONFIG, pkg-config, pkg-config) AC_PATH_PROG(QMAKE, qmake, none) AC_PATH_PROG(GMAKE, gmake, none) -AC_PATH_PROG(CDRECORD, cdrecord, cdrecord) AC_PATH_PROG(PIDOF, pidof, pidof) AC_PROG_AWK # Some AWK programs fail, so test it and warn the user @@ -469,7 +473,6 @@ AC_SUBST(QWT_LDFLAGS) AC_SUBST(QWT_LIB) AC_SUBST(QWT) - dnl ------------------------------------------- dnl smartalloc (default off) dnl ------------------------------------------- @@ -499,7 +502,7 @@ AC_ARG_ENABLE(lockmgr, ) if test x$support_lockmgr = xyes; then - AC_DEFINE(_USE_LOCKMGR, 1, [Set if you want Lock Manager enabled]) + AC_DEFINE(USE_LOCKMGR, 1, [Set if you want Lock Manager enabled]) fi @@ -644,13 +647,10 @@ AC_ARG_ENABLE(build-dird, fi ] ) -if test x$build_dird = xyes; then - DIRD_DIR="src/dird" - DIR_TOOLS="DIRTOOLS" -else - DIRD_DIR="" - DIR_TOOLS="NODIRTOOLS" -fi + +DIRD_DIR="src/dird" +DIR_TOOLS="DIRTOOLS" + AC_SUBST(DIRD_DIR) AC_SUBST(DIR_TOOLS) @@ -703,12 +703,27 @@ AC_ARG_ENABLE(ipv6, if test x$support_ipv6 = xyes; then AC_TRY_LINK([ #include #include -#include ], [struct sockaddr_in6 s; struct in6_addr t=in6addr_any; int i=AF_INET6; s; t.s6_addr[0] = 0;], +#include ], [struct in6_addr t=in6addr_any; t.s6_addr[0] = 0;], + [support_in6addr_any=yes], [support_in6addr_any=no]) + + if test x$support_in6addr_any = xno ; then + in6addr_any="const struct in6_addr in6addr_any" + else + in6addr_any="1" + fi + + AC_TRY_LINK([ #include +#include +#include ], [$in6addr_any; struct sockaddr_in6 s; struct in6_addr t=in6addr_any; int i=AF_INET6; s; t.s6_addr[0] = 0;], [support_ipv6=yes], [support_ipv6=no]) fi if test x$support_ipv6 = xyes; then AC_DEFINE(HAVE_IPV6,1,[Whether to enable IPv6 support]) + + if test x$support_in6addr_any = xno ; then + AC_DEFINE(NEED_IN6ADDR_ANY,1,[Whether to have in6addr_any support]) + fi fi TERM_LIB="" @@ -835,6 +850,7 @@ AC_HEADER_DIRENT AC_CHECK_FUNCS(strcasecmp select setenv putenv tcgetattr) AC_CHECK_FUNCS(lstat lchown lchmod futimes fchmod fchown) AC_CHECK_FUNCS(nanosleep nl_langinfo) +AC_CHECK_FUNCS(be64toh htobe64) AC_CHECK_HEADERS(varargs.h) dnl End of readline/conio stuff @@ -907,7 +923,6 @@ AC_ARG_WITH(tcp-wrappers, ] ) - dnl ----------------------------------------------------------- dnl Check whether OpenSSL is available dnl ----------------------------------------------------------- @@ -1154,6 +1169,10 @@ AC_ARG_WITH(plugindir, AC_SUBST(plugindir) +dnl ------------------------------------------ +dnl Where to send dump email +dnl ------------------------------------------ + dnl ------------------------------------------ dnl Where to send dump email dnl ------------------------------------------ @@ -1880,6 +1899,7 @@ AC_STRUCT_ST_BLOCKS AC_STRUCT_ST_RDEV AC_STRUCT_TM AC_C_CONST +AC_C_RESTRICT AC_CHECK_SIZEOF(char, 1) AC_CHECK_SIZEOF(short int, 2) @@ -2160,6 +2180,13 @@ AC_CHECK_DECL( [#include ] ) +AC_CHECK_DECL( + F_SETLK, + AC_DEFINE(HAVE_FCNTL_LOCK, 1, [Set if fcntl supports file locking]), + , + [#include ] +) + AC_CHECK_FUNC(closefrom, [AC_DEFINE(HAVE_CLOSEFROM, 1, [Define to 1 if you have the 'closefrom' function.])]) AC_CHECK_FUNCS(getpagesize, [AC_DEFINE(HAVE_GETPAGESIZE, 1, [Set if have getpagesize])]) AC_CHECK_FUNCS(malloc_trim, [AC_DEFINE(HAVE_MALLOC_TRIM, 1, [Set if have malloc_trim])]) @@ -2167,6 +2194,7 @@ AC_CHECK_FUNCS(malloc_trim, [AC_DEFINE(HAVE_MALLOC_TRIM, 1, [Set if have malloc_ AC_CHECK_FUNCS(fchdir, [AC_DEFINE(HAVE_FCHDIR)]) AC_CHECK_FUNCS(strtoll, [AC_DEFINE(HAVE_STRTOLL)]) AC_CHECK_FUNCS(posix_fadvise) +AC_CHECK_FUNCS(posix_fallocate) AC_CHECK_FUNCS(fdatasync) AC_CHECK_FUNCS(chflags) @@ -2893,9 +2921,8 @@ dnl dnl Finally we set appropriate distribution specific dnl variables and defaults dnl -dnl PFILES are platform specific files -PFILES="platforms/Makefile" PSCMD="ps -e" +WIN32= MACOSX= COMPRESS_MANPAGES=yes @@ -2903,10 +2930,9 @@ case "$DISTNAME" in aix) DISTVER=`uname -r` PSCMD="ps -e -o pid,comm" - PFILES="${PFILES} \ - platforms/aix/Makefile" - TAPEDRIVE="/dev/rmt0.1" - ;; + PFILES="${PFILES} platforms/aix/Makefile" + TAPEDRIVE="/dev/rmt0.1" + ;; alpha) DISTVER=`uname -r` PTHREAD_LIB="-lpthread -lexc" @@ -2934,6 +2960,13 @@ bsdi) platforms/bsdi/bacula-dir" largefile_support="yes" ;; +cygwin) + DISTVER=`uname -a |awk '{print $3}'` + TAPEDRIVE="/dev/nrst0" + WIN32=win32 + WCFLAGS="-mwindows" + WLDFLAGS="-mwindows" + ;; darwin) DISTVER=`uname -r` TAPEDRIVE="/dev/nst0" @@ -3180,7 +3213,6 @@ AC_ARG_WITH(systemd, PFILES="${PFILES} \ platforms/systemd/Makefile \ - platforms/systemd/bacula.conf \ platforms/systemd/bacula-dir.service \ platforms/systemd/bacula-fd.service \ platforms/systemd/bacula-sd.service" @@ -3206,6 +3238,7 @@ AC_DEFINE_UNQUOTED(lld, "$lld") AC_DEFINE_UNQUOTED(llu, "$llu") AC_SUBST(TAPEDRIVE) AC_SUBST(PSCMD) +AC_SUBST(WIN32) AC_SUBST(MACOSX) AC_SUBST(DISTNAME) AC_SUBST(DISTVER) @@ -3229,6 +3262,7 @@ if test "x${subsysdir}" = "x${sbindir}" ; then exit 1 fi + AC_OUTPUT([autoconf/Make.common \ Makefile \ manpages/Makefile \ @@ -3258,7 +3292,10 @@ AC_OUTPUT([autoconf/Make.common \ src/qt-console/bat.conf \ src/qt-console/bat.pro \ src/qt-console/bat.pro.mingw32 \ + src/qt-console/bat.pro.mingw64 \ src/qt-console/install_conf_file \ + src/qt-console/tray-monitor/tray-monitor.pro.mingw32 \ + src/qt-console/tray-monitor/tray-monitor.pro.mingw64 \ src/dird/Makefile \ src/dird/bacula-dir.conf \ src/lib/Makefile \ @@ -3303,6 +3340,9 @@ AC_OUTPUT([autoconf/Make.common \ src/plugins/sd/Makefile \ src/plugins/dir/Makefile \ po/Makefile.in \ + updatedb/update_mysql_tables \ + updatedb/update_sqlite3_tables \ + updatedb/update_postgresql_tables \ updatedb/update_mysql_tables_9_to_10 \ updatedb/update_sqlite3_tables_9_to_10 \ updatedb/update_postgresql_tables_9_to_10 \ @@ -3312,9 +3352,10 @@ AC_OUTPUT([autoconf/Make.common \ updatedb/update_mysql_tables_11_to_12 \ updatedb/update_sqlite3_tables_11_to_12 \ updatedb/update_postgresql_tables_11_to_12 \ - updatedb/update_mysql_tables_12_to_14 \ - updatedb/update_sqlite3_tables_12_to_14 \ - updatedb/update_postgresql_tables_12_to_14 \ + updatedb/update_mysql_tables_12_to_13 \ + updatedb/update_postgresql_tables_12_to_13 \ + updatedb/update_mysql_tables_13_to_14 \ + updatedb/update_postgresql_tables_13_to_14 \ examples/nagios/check_bacula/Makefile \ platforms/rpms/redhat/bacula.spec \ platforms/rpms/redhat/bacula-bat.spec \ @@ -3358,7 +3399,7 @@ chmod 755 install_conf_file build-depkgs-qt-console cd ${BUILD_DIR} cd scripts -chmod 755 bacula btraceback mtx-changer storage-ctl bsg_persist +chmod 755 bacula btraceback mtx-changer chmod 755 dvd-handler dvd-simulator chmod 755 bconsole disk-changer devel_bacula logrotate cd .. @@ -3419,70 +3460,70 @@ ${MAKE:-make} clean echo " Configuration on `date`: - Host: ${host}${post_host} -- ${DISTNAME} ${DISTVER} - Bacula version: ${BACULA} ${VERSION} (${DATE}) - Source code location: ${srcdir} - Install binaries: ${sbindir} - Install libraries: ${libdir} - Install config files: ${sysconfdir} - Scripts directory: ${scriptdir} - Archive directory: ${archivedir} - Working directory: ${working_dir} - PID directory: ${piddir} - Subsys directory: ${subsysdir} - Man directory: ${mandir} - Data directory: ${datarootdir} - Plugin directory: ${plugindir} - C Compiler: ${CC} ${CCVERSION} - C++ Compiler: ${CXX} ${CXXVERSION} - Compiler flags: ${WCFLAGS} ${CFLAGS} - Linker flags: ${WLDFLAGS} ${LDFLAGS} - Libraries: ${LIBS} - Statically Linked Tools: ${support_static_tools} - Statically Linked FD: ${support_static_fd} - Statically Linked SD: ${support_static_sd} - Statically Linked DIR: ${support_static_dir} - Statically Linked CONS: ${support_static_cons} - Database backends: ${db_backends} - Database port: ${db_port} - Database name: ${db_name} - Database user: ${db_user} - - Job Output Email: ${job_email} - Traceback Email: ${dump_email} - SMTP Host Address: ${smtp_host} - - Director Port: ${dir_port} - File daemon Port: ${fd_port} - Storage daemon Port: ${sd_port} - - Director User: ${dir_user} - Director Group: ${dir_group} - Storage Daemon User: ${sd_user} - Storage DaemonGroup: ${sd_group} - File Daemon User: ${fd_user} - File Daemon Group: ${fd_group} - - Large file support: $largefile_support - Bacula conio support: ${got_conio} ${CONS_LIBS} - readline support: ${got_readline} ${PRTREADLINE_SRC} - TCP Wrappers support: ${TCPW_MSG} ${WRAPLIBS} - TLS support: ${support_tls} - Encryption support: ${support_crypto} - ZLIB support: ${have_zlib} - LZO support: ${have_lzo} - enable-smartalloc: ${support_smartalloc} - enable-lockmgr: ${support_lockmgr} - bat support: ${support_bat} - client-only: ${build_client_only} - build-dird: ${build_dird} - build-stored: ${build_stored} - Plugin support: ${have_plugins} - AFS support: ${have_afs} - ACL support: ${have_acl} - XATTR support: ${have_xattr} - systemd support: ${support_systemd} ${SYSTEMD_UNITDIR} - Batch insert enabled: ${batch_insert_db_backends} + Host: ${host}${post_host} -- ${DISTNAME} ${DISTVER} + Bacula version: ${BACULA} ${VERSION} (${DATE}) + Source code location: ${srcdir} + Install binaries: ${sbindir} + Install libraries: ${libdir} + Install config files: ${sysconfdir} + Scripts directory: ${scriptdir} + Archive directory: ${archivedir} + Working directory: ${working_dir} + PID directory: ${piddir} + Subsys directory: ${subsysdir} + Man directory: ${mandir} + Data directory: ${datarootdir} + Plugin directory: ${plugindir} + C Compiler: ${CC} ${CCVERSION} + C++ Compiler: ${CXX} ${CXXVERSION} + Compiler flags: ${WCFLAGS} ${CFLAGS} + Linker flags: ${WLDFLAGS} ${LDFLAGS} + Libraries: ${LIBS} + Statically Linked Tools: ${support_static_tools} + Statically Linked FD: ${support_static_fd} + Statically Linked SD: ${support_static_sd} + Statically Linked DIR: ${support_static_dir} + Statically Linked CONS: ${support_static_cons} + Database backends: ${db_backends} + Database port: ${db_port} + Database name: ${db_name} + Database user: ${db_user} + + Job Output Email: ${job_email} + Traceback Email: ${dump_email} + SMTP Host Address: ${smtp_host} + + Director Port: ${dir_port} + File daemon Port: ${fd_port} + Storage daemon Port: ${sd_port} + + Director User: ${dir_user} + Director Group: ${dir_group} + Storage Daemon User: ${sd_user} + Storage DaemonGroup: ${sd_group} + File Daemon User: ${fd_user} + File Daemon Group: ${fd_group} + + Large file support: $largefile_support + Bacula conio support: ${got_conio} ${CONS_LIBS} + readline support: ${got_readline} ${PRTREADLINE_SRC} + TCP Wrappers support: ${TCPW_MSG} ${WRAPLIBS} + TLS support: ${support_tls} + Encryption support: ${support_crypto} + ZLIB support: ${have_zlib} + LZO support: ${have_lzo} + enable-smartalloc: ${support_smartalloc} + enable-lockmgr: ${support_lockmgr} + bat support: ${support_bat} + client-only: ${build_client_only} + build-dird: ${build_dird} + build-stored: ${build_stored} + Plugin support: ${have_plugins} + AFS support: ${have_afs} + ACL support: ${have_acl} + XATTR support: ${have_xattr} + systemd support: ${support_systemd} ${SYSTEMD_UNITDIR} + Batch insert enabled: ${batch_insert_db_backends} " > config.out diff --git a/bacula/autoconf/mkinstalldirs b/bacula/autoconf/mkinstalldirs index 6fbe5e1176..4191a45dbd 100755 --- a/bacula/autoconf/mkinstalldirs +++ b/bacula/autoconf/mkinstalldirs @@ -1,7 +1,7 @@ #! /bin/sh # mkinstalldirs --- make directory hierarchy -scriptversion=2004-02-15.20 +scriptversion=2009-04-28.21; # UTC # Original author: Noah Friedman # Created: 1993-05-16 @@ -11,8 +11,11 @@ scriptversion=2004-02-15.20 # bugs to or send patches to # . +nl=' +' +IFS=" "" $nl" errstatus=0 -dirmode="" +dirmode= usage="\ Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... @@ -27,7 +30,7 @@ while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" - exit 0 + exit $? ;; -m) # -m PERM arg shift @@ -37,7 +40,7 @@ while test $# -gt 0 ; do ;; --version) echo "$0 $scriptversion" - exit 0 + exit $? ;; --) # stop option processing shift @@ -103,13 +106,21 @@ esac for file do - set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + case $file in + /*) pathcomp=/ ;; + *) pathcomp= ;; + esac + oIFS=$IFS + IFS=/ + set fnord $file shift + IFS=$oIFS - pathcomp= for d do - pathcomp="$pathcomp$d" + test "x$d" = x && continue + + pathcomp=$pathcomp$d case $pathcomp in -*) pathcomp=./$pathcomp ;; esac @@ -124,7 +135,7 @@ do else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" - lasterr="" + lasterr= chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then @@ -134,7 +145,7 @@ do fi fi - pathcomp="$pathcomp/" + pathcomp=$pathcomp/ done done @@ -146,5 +157,6 @@ exit $errstatus # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" # End: diff --git a/bacula/commits b/bacula/commits deleted file mode 100755 index 12076fa163..0000000000 --- a/bacula/commits +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -git log --pretty=oneline Release-5.0.3..Branch-5.2 | wc -l diff --git a/bacula/configure b/bacula/configure index 3a80aabe5a..ba59ba1c08 100755 --- a/bacula/configure +++ b/bacula/configure @@ -1,11 +1,9 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.68 for bacula 7.0.2. +# Generated by GNU Autoconf 2.69 for bacula 7.1.0. # # -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software -# Foundation, Inc. +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation @@ -134,6 +132,31 @@ export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh @@ -167,7 +190,8 @@ if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi -test x\$exitcode = x0 || exit 1" +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && @@ -220,21 +244,25 @@ IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : - # We cannot yet assume a decent shell, so we have to provide a - # neutralization value for shells without unset; and this also - # works around shells that cannot unset nonexistent variables. - # Preserve -v and -x to the replacement shell. - BASH_ENV=/dev/null - ENV=/dev/null - (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV - export CONFIG_SHELL - case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; - esac - exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 fi if test x$as_have_required = xno; then : @@ -336,6 +364,14 @@ $as_echo X"$as_dir" | } # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take @@ -457,6 +493,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). @@ -491,16 +531,16 @@ if (echo >conf$$.file) 2>/dev/null; then # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. + # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' + as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @@ -512,28 +552,8 @@ else as_mkdir_p=false fi -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x +as_test_x='test -x' +as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -567,8 +587,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='bacula' PACKAGE_TARNAME='bacula' -PACKAGE_VERSION='7.0.2' -PACKAGE_STRING='bacula 7.0.2' +PACKAGE_VERSION='7.1.0' +PACKAGE_STRING='bacula 7.1.0' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -615,6 +635,7 @@ COMPRESS_MANPAGES DISTVER DISTNAME MACOSX +WIN32 PSCMD TAPEDRIVE SYSTEMD_UNITDIR @@ -816,7 +837,6 @@ MAKE_SHELL ARFLAGS AWK PIDOF -CDRECORD GMAKE QMAKE PKGCONFIG @@ -1457,8 +1477,6 @@ target=$target_alias if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe - $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi @@ -1544,7 +1562,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures bacula 7.0.2 to adapt to many kinds of systems. +\`configure' configures bacula 7.1.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1613,7 +1631,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of bacula 7.0.2:";; + short | recursive ) echo "Configuration of bacula 7.1.0:";; esac cat <<\_ACEOF @@ -1808,10 +1826,10 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -bacula configure 7.0.2 -generated by GNU Autoconf 2.68 +bacula configure 7.1.0 +generated by GNU Autoconf 2.69 -Copyright (C) 2010 Free Software Foundation, Inc. +Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -1962,7 +1980,7 @@ $as_echo "$ac_try_echo"; } >&5 test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext + test -x conftest$ac_exeext }; then : ac_retval=0 else @@ -2185,7 +2203,7 @@ $as_echo "$ac_try_echo"; } >&5 test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext + test -x conftest$ac_exeext }; then : ac_retval=0 else @@ -2408,7 +2426,8 @@ int main () { static int test_array [1 - 2 * !(($2) >= 0)]; -test_array [0] = 0 +test_array [0] = 0; +return test_array [0]; ; return 0; @@ -2424,7 +2443,8 @@ int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; -test_array [0] = 0 +test_array [0] = 0; +return test_array [0]; ; return 0; @@ -2450,7 +2470,8 @@ int main () { static int test_array [1 - 2 * !(($2) < 0)]; -test_array [0] = 0 +test_array [0] = 0; +return test_array [0]; ; return 0; @@ -2466,7 +2487,8 @@ int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; -test_array [0] = 0 +test_array [0] = 0; +return test_array [0]; ; return 0; @@ -2500,7 +2522,8 @@ int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; -test_array [0] = 0 +test_array [0] = 0; +return test_array [0]; ; return 0; @@ -2738,8 +2761,8 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by bacula $as_me 7.0.2, which was -generated by GNU Autoconf 2.68. Invocation command line was +It was created by bacula $as_me 7.1.0, which was +generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3149,7 +3172,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_TRUEPRG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3195,7 +3218,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_FALSEPRG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3239,6 +3262,7 @@ BQT_VERSION=`sed -n -e 's/^#define BQT_VERSION.*"\(.*\)"$/\1/p' ${srcdir}/src/ve LIBBAC_LT_RELEASE=`sed -n -e 's/^#.*LIBBAC_LT_RELEASE.*"\(.*\)"$/\1/p' ${srcdir}/src/version.h` LIBBACCFG_LT_RELEASE=`sed -n -e 's/^#.*LIBBACCFG_LT_RELEASE.*"\(.*\)"$/\1/p' ${srcdir}/src/version.h` +LIBBACPY_LT_RELEASE=`sed -n -e 's/^#.*LIBBACPY_LT_RELEASE.*"\(.*\)"$/\1/p' ${srcdir}/src/version.h` LIBBAC_LT_RELEASE=${LIBBAC_LT_RELEASE:-$VERSION} LIBBACCFG_LT_RELEASE=${LIBBACCFG_LT_RELEASE:-$VERSION} @@ -3256,6 +3280,9 @@ LIBBACFIND_LT_RELEASE=`sed -n -e 's/^#.*LIBBACFIND_LT_RELEASE.*"\(.*\)"$/\1/p' $ LIBBACFIND_LT_RELEASE=${LIBBACFIND_LT_RELEASE:-$VERSION} + +PFILES="platforms/Makefile" + echo "configuring for ${BACULA} $VERSION ($DATE)" @@ -3282,7 +3309,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3322,7 +3349,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3375,7 +3402,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3416,7 +3443,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue @@ -3474,7 +3501,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3518,7 +3545,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3964,8 +3991,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include -#include -#include +struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); @@ -4078,7 +4104,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4122,7 +4148,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4572,7 +4598,7 @@ do for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue + as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in @@ -4638,7 +4664,7 @@ do for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue + as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in @@ -4753,7 +4779,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_CXX="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4817,7 +4843,7 @@ case $as_dir/ in #(( # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. @@ -4891,7 +4917,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MV="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4932,7 +4958,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_REMOVE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4973,7 +4999,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_CP="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5014,7 +5040,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_SED="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5055,7 +5081,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ECHO="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5096,7 +5122,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_CMP="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5137,7 +5163,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_TBL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5178,7 +5204,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_AR="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5219,7 +5245,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_OPENSSL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5260,7 +5286,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MTX="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5301,7 +5327,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_DD="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5342,7 +5368,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MKISOFS="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5383,7 +5409,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5424,7 +5450,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GROWISOFS="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5465,7 +5491,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_DVDRWMEDIAINFO="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5506,7 +5532,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_DVDRWFORMAT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5547,7 +5573,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5588,7 +5614,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_QMAKE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5629,7 +5655,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMAKE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5652,47 +5678,6 @@ $as_echo "no" >&6; } fi -# Extract the first word of "cdrecord", so it can be a program name with args. -set dummy cdrecord; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_CDRECORD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $CDRECORD in - [\\/]* | ?:[\\/]*) - ac_cv_path_CDRECORD="$CDRECORD" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_CDRECORD="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - test -z "$ac_cv_path_CDRECORD" && ac_cv_path_CDRECORD="cdrecord" - ;; -esac -fi -CDRECORD=$ac_cv_path_CDRECORD -if test -n "$CDRECORD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CDRECORD" >&5 -$as_echo "$CDRECORD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - # Extract the first word of "pidof", so it can be a program name with args. set dummy pidof; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 @@ -5711,7 +5696,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PIDOF="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5752,7 +5737,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5806,7 +5791,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_AWK="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6040,7 +6025,7 @@ do for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue + as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in @@ -6119,7 +6104,7 @@ do for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue + as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in @@ -6375,7 +6360,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6419,7 +6404,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6844,7 +6829,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6884,7 +6869,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7186,7 +7171,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7226,7 +7211,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7329,7 +7314,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7373,7 +7358,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7498,7 +7483,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7538,7 +7523,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7597,7 +7582,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7637,7 +7622,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -8299,7 +8284,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -8339,7 +8324,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -8419,7 +8404,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -8459,7 +8444,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -8511,7 +8496,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -8551,7 +8536,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -8603,7 +8588,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -8643,7 +8628,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -8695,7 +8680,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -8735,7 +8720,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -8787,7 +8772,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -8827,7 +8812,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -17322,7 +17307,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -18966,7 +18951,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -19049,7 +19034,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -19089,7 +19074,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -19178,11 +19163,11 @@ else int main () { -/* FIXME: Include the comments suggested by Paul. */ + #ifndef __cplusplus - /* Ultrix mips cc rejects this. */ + /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; - const charset cs; + const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; @@ -19199,8 +19184,9 @@ main () ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; - { /* SCO 3.2v4 cc rejects this. */ - char *t; + { /* SCO 3.2v4 cc rejects this sort of thing. */ + char tx; + char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; @@ -19216,10 +19202,10 @@ main () iptr p = 0; ++p; } - { /* AIX XL C 1.02.0.0 rejects this saying + { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; }; - struct s *b; b->j = 5; + struct s { int j; const int *ap[3]; } bx; + struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; @@ -19812,23 +19798,20 @@ else /* end confdefs.h. */ $ac_includes_default int -find_stack_direction () +find_stack_direction (int *addr, int depth) { - static char *addr = 0; - auto char dummy; - if (addr == 0) - { - addr = &dummy; - return find_stack_direction (); - } - else - return (&dummy > addr) ? 1 : -1; + int dir, dummy = 0; + if (! addr) + addr = &dummy; + *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; + dir = depth ? find_stack_direction (addr, depth - 1) : 0; + return dir + dummy; } int -main () +main (int argc, char **argv) { - return find_stack_direction () < 0; + return find_stack_direction (0, argc + !argv + 20) < 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : @@ -20936,7 +20919,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_INTLBISON="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -21815,7 +21798,6 @@ no_qwt=no - # Check whether --enable-smartalloc was given. if test "${enable_smartalloc+set}" = set; then : enableval=$enable_smartalloc; @@ -21846,7 +21828,7 @@ fi if test x$support_lockmgr = xyes; then -$as_echo "#define _USE_LOCKMGR 1" >>confdefs.h +$as_echo "#define USE_LOCKMGR 1" >>confdefs.h fi @@ -21985,13 +21967,10 @@ if test "${enable_build_dird+set}" = set; then : fi -if test x$build_dird = xyes; then - DIRD_DIR="src/dird" - DIR_TOOLS="DIRTOOLS" -else - DIRD_DIR="" - DIR_TOOLS="NODIRTOOLS" -fi + +DIRD_DIR="src/dird" +DIR_TOOLS="DIRTOOLS" + @@ -22045,7 +22024,34 @@ if test x$support_ipv6 = xyes; then int main () { -struct sockaddr_in6 s; struct in6_addr t=in6addr_any; int i=AF_INET6; s; t.s6_addr[0] = 0; +struct in6_addr t=in6addr_any; t.s6_addr[0] = 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + support_in6addr_any=yes +else + support_in6addr_any=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + if test x$support_in6addr_any = xno ; then + in6addr_any="const struct in6_addr in6addr_any" + else + in6addr_any="1" + fi + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +#include +#include +int +main () +{ +$in6addr_any; struct sockaddr_in6 s; struct in6_addr t=in6addr_any; int i=AF_INET6; s; t.s6_addr[0] = 0; ; return 0; } @@ -22063,6 +22069,12 @@ if test x$support_ipv6 = xyes; then $as_echo "#define HAVE_IPV6 1" >>confdefs.h + + if test x$support_in6addr_any = xno ; then + +$as_echo "#define NEED_IN6ADDR_ANY 1" >>confdefs.h + + fi fi TERM_LIB="" @@ -22628,6 +22640,18 @@ _ACEOF fi done +for ac_func in be64toh htobe64 +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + for ac_header in varargs.h do : ac_fn_c_check_header_mongrel "$LINENO" "varargs.h" "ac_cv_header_varargs_h" "$ac_includes_default" @@ -22935,7 +22959,6 @@ rm -f core conftest.err conftest.$ac_objext \ fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenSSL" >&5 $as_echo_n "checking for OpenSSL... " >&6; } @@ -23331,6 +23354,7 @@ fi + dump_email=root@localhost # Check whether --with-dump-email was given. @@ -24051,10 +24075,11 @@ if test "${with_mysql+set}" = set; then : # MYSQL_LIBDIR=`${MYSQL_CONFIG} --variable=pkglibdir` # MYSQL_INCDIR=`${MYSQL_CONFIG} --variable=pkgincludedir` # else -# MYSQL_LIBDIR=`${MYSQL_CONFIG} --libs | sed -e 's/.*-L//' -e 's/ .*//'` +# MYSQL_LIBDIR=`${MYSQL_CONFIG} --libs_r | sed -e 's/.*-L//' -e 's/ .*//'` # MYSQL_INCDIR=`${MYSQL_CONFIG} --include | sed -e 's/-I//'` # fi -# elif test -f /usr/local/mysql/include/mysql/mysql.h; then +# fi +# if [ "x${MYSQL_LIB}" = x -o "x${MYSQL_INCDIR}" = x ]; then if test -f /usr/local/mysql/include/mysql/mysql.h; then MYSQL_INCDIR=/usr/local/mysql/include/mysql if test -f /usr/local/mysql/lib64/mysql/libmysqlclient_r.a \ @@ -24139,6 +24164,39 @@ $as_echo "no" >&6; } MYSQL_LIBDIR=$withval/lib fi MYSQL_BINDIR=$withval/bin + elif test -f $withval/mysql.h; then + MYSQL_INCDIR=$withval + { $as_echo "$as_me:${as_lineno-$LINENO}: Got with-mysql variable $MYSQL_INCDIR checking MySQL version" >&5 +$as_echo "$as_me: Got with-mysql variable $MYSQL_INCDIR checking MySQL version" >&6;} + case $MYSQL_INCDIR in + *mysql55*) + { $as_echo "$as_me:${as_lineno-$LINENO}: Assuming MacPorts MySQL 5.5 variant installed" >&5 +$as_echo "$as_me: Assuming MacPorts MySQL 5.5 variant installed" >&6;} + if test -f $prefix/lib/mysql55/mysql/libmysqlclient_r.a \ + -o -f $prefix/lib/mysql55/mysql/libmysqlclient_r.so; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found MySQL 5.5 library in $prefix/lib/mysql55/mysql" >&5 +$as_echo "$as_me: Found MySQL 5.5 library in $prefix/lib/mysql55/mysql" >&6;} + MYSQL_LIBDIR=$prefix/lib/mysql55/mysql + fi + MYSQL_BINDIR=$prefix/lib/mysql55/bin + ;; + *mysql51*) + { $as_echo "$as_me:${as_lineno-$LINENO}: Assuming MacPorts MySQL 5.1 variant installed" >&5 +$as_echo "$as_me: Assuming MacPorts MySQL 5.1 variant installed" >&6;} + if test -f $prefix/lib/mysql51/mysql/libmysqlclient_r.a \ + -o -f $prefix/lib/mysql51/mysql/libmysqlclient_r.so; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found MySQL 5.1 library in $prefix/lib/mysql55/mysql" >&5 +$as_echo "$as_me: Found MySQL 5.1 library in $prefix/lib/mysql55/mysql" >&6;} + MYSQL_LIBDIR=$prefix/lib/mysql51/mysql + fi + MYSQL_BINDIR=$prefix/lib/mysql51/bin + ;; + esac + if test -z "${MYSQL_LIBDIR}" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + as_fn_error $? "MySQL $withval - unable to find MySQL libraries" "$LINENO" 5 + fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } @@ -24514,7 +24572,7 @@ $as_echo "yes" >&6; } if test "x$support_batch_insert" = "xyes"; then saved_LDFLAGS="${LDFLAGS}" - LDFLAGS="${saved_LDFLAGS} -L$SQLITE_LIBDIR" + LDFLAGS="${saved_LDFLAGS} -lpthread -L$SQLITE_LIBDIR" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqlite3_threadsafe in -lsqlite3" >&5 $as_echo_n "checking for sqlite3_threadsafe in -lsqlite3... " >&6; } @@ -24687,7 +24745,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_GETCONF="${ac_tool_prefix}getconf" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -24727,7 +24785,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_GETCONF="getconf" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -26455,11 +26513,11 @@ else int main () { -/* FIXME: Include the comments suggested by Paul. */ + #ifndef __cplusplus - /* Ultrix mips cc rejects this. */ + /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; - const charset cs; + const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; @@ -26476,8 +26534,9 @@ main () ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; - { /* SCO 3.2v4 cc rejects this. */ - char *t; + { /* SCO 3.2v4 cc rejects this sort of thing. */ + char tx; + char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; @@ -26493,10 +26552,10 @@ main () iptr p = 0; ++p; } - { /* AIX XL C 1.02.0.0 rejects this saying + { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; }; - struct s *b; b->j = 5; + struct s { int j; const int *ap[3]; } bx; + struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; @@ -27096,7 +27155,8 @@ int main () { static int test_array [1 - 2 * !(sizeof (void *) <= sizeof ($ac_type))]; -test_array [0] = 0 +test_array [0] = 0; +return test_array [0]; ; return 0; @@ -27132,7 +27192,8 @@ int main () { static int test_array [1 - 2 * !(sizeof (void *) <= sizeof ($ac_type))]; -test_array [0] = 0 +test_array [0] = 0; +return test_array [0]; ; return 0; @@ -27297,11 +27358,11 @@ else int main () { -/* FIXME: Include the comments suggested by Paul. */ + #ifndef __cplusplus - /* Ultrix mips cc rejects this. */ + /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; - const charset cs; + const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; @@ -27318,8 +27379,9 @@ main () ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; - { /* SCO 3.2v4 cc rejects this. */ - char *t; + { /* SCO 3.2v4 cc rejects this sort of thing. */ + char tx; + char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; @@ -27335,10 +27397,10 @@ main () iptr p = 0; ++p; } - { /* AIX XL C 1.02.0.0 rejects this saying + { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; }; - struct s *b; b->j = 5; + struct s { int j; const int *ap[3]; } bx; + struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; @@ -27366,6 +27428,52 @@ $as_echo "#define const /**/" >>confdefs.h fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5 +$as_echo_n "checking for C/C++ restrict keyword... " >&6; } +if ${ac_cv_c_restrict+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_restrict=no + # The order here caters to the fact that C++ does not require restrict. + for ac_kw in __restrict __restrict__ _Restrict restrict; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +typedef int * int_ptr; + int foo (int_ptr $ac_kw ip) { + return ip[0]; + } +int +main () +{ +int s[1]; + int * $ac_kw t = s; + t[0] = 0; + return foo(t) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_restrict=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_restrict" != no && break + done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5 +$as_echo "$ac_cv_c_restrict" >&6; } + + case $ac_cv_c_restrict in + restrict) ;; + no) $as_echo "#define restrict /**/" >>confdefs.h + ;; + *) cat >>confdefs.h <<_ACEOF +#define restrict $ac_cv_c_restrict +_ACEOF + ;; + esac + # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects @@ -28123,6 +28231,16 @@ $as_echo "#define HAVE_FCNTL_F_CLOSEM 1" >>confdefs.h fi +ac_fn_c_check_decl "$LINENO" "F_SETLK" "ac_cv_have_decl_F_SETLK" "#include + +" +if test "x$ac_cv_have_decl_F_SETLK" = xyes; then : + +$as_echo "#define HAVE_FCNTL_LOCK 1" >>confdefs.h + +fi + + ac_fn_c_check_func "$LINENO" "closefrom" "ac_cv_func_closefrom" if test "x$ac_cv_func_closefrom" = xyes; then : @@ -28192,6 +28310,17 @@ _ACEOF fi done +for ac_func in posix_fallocate +do : + ac_fn_c_check_func "$LINENO" "posix_fallocate" "ac_cv_func_posix_fallocate" +if test "x$ac_cv_func_posix_fallocate" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_POSIX_FALLOCATE 1 +_ACEOF + +fi +done + for ac_func in fdatasync do : ac_fn_c_check_func "$LINENO" "fdatasync" "ac_cv_func_fdatasync" @@ -28777,23 +28906,20 @@ else /* end confdefs.h. */ $ac_includes_default int -find_stack_direction () +find_stack_direction (int *addr, int depth) { - static char *addr = 0; - auto char dummy; - if (addr == 0) - { - addr = &dummy; - return find_stack_direction (); - } - else - return (&dummy > addr) ? 1 : -1; + int dir, dummy = 0; + if (! addr) + addr = &dummy; + *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; + dir = depth ? find_stack_direction (addr, depth - 1) : 0; + return dir + dummy; } int -main () +main (int argc, char **argv) { - return find_stack_direction () < 0; + return find_stack_direction (0, argc + !argv + 20) < 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : @@ -30397,8 +30523,8 @@ llu="llu" WCFLAGS= WLDFLAGS= -PFILES="platforms/Makefile" PSCMD="ps -e" +WIN32= MACOSX= COMPRESS_MANPAGES=yes @@ -30406,8 +30532,7 @@ case "$DISTNAME" in aix) DISTVER=`uname -r` PSCMD="ps -e -o pid,comm" - PFILES="${PFILES} \ - platforms/aix/Makefile" + PFILES="${PFILES} platforms/aix/Makefile" TAPEDRIVE="/dev/rmt0.1" ;; alpha) @@ -30437,6 +30562,13 @@ bsdi) platforms/bsdi/bacula-dir" largefile_support="yes" ;; +cygwin) + DISTVER=`uname -a |awk '{print $3}'` + TAPEDRIVE="/dev/nrst0" + WIN32=win32 + WCFLAGS="-mwindows" + WLDFLAGS="-mwindows" + ;; darwin) DISTVER=`uname -r` TAPEDRIVE="/dev/nst0" @@ -30686,7 +30818,6 @@ if test "${with_systemd+set}" = set; then : PFILES="${PFILES} \ platforms/systemd/Makefile \ - platforms/systemd/bacula.conf \ platforms/systemd/bacula-dir.service \ platforms/systemd/bacula-fd.service \ platforms/systemd/bacula-sd.service" @@ -30732,6 +30863,7 @@ _ACEOF + MCOMMON=./autoconf/Make.common @@ -30748,7 +30880,8 @@ if test "x${subsysdir}" = "x${sbindir}" ; then exit 1 fi -ac_config_files="$ac_config_files autoconf/Make.common Makefile manpages/Makefile scripts/btraceback scripts/bconsole scripts/bacula scripts/bacula-ctl-dir scripts/bacula-ctl-fd scripts/bacula-ctl-sd scripts/devel_bacula scripts/Makefile scripts/logrotate scripts/mtx-changer scripts/disk-changer scripts/dvd-handler scripts/dvd-simulator scripts/logwatch/Makefile scripts/logwatch/logfile.bacula.conf scripts/bat.desktop scripts/bat.desktop.xsu scripts/bat.desktop.consolehelper scripts/bat.console_apps src/Makefile src/host.h src/console/Makefile src/console/bconsole.conf src/qt-console/bat.conf src/qt-console/bat.pro src/qt-console/bat.pro.mingw32 src/qt-console/install_conf_file src/dird/Makefile src/dird/bacula-dir.conf src/lib/Makefile src/stored/Makefile src/stored/bacula-sd.conf src/filed/Makefile src/filed/bacula-fd.conf src/cats/Makefile src/cats/make_catalog_backup.pl src/cats/make_catalog_backup src/cats/delete_catalog_backup src/cats/create_postgresql_database src/cats/update_postgresql_tables src/cats/make_postgresql_tables src/cats/grant_postgresql_privileges src/cats/drop_postgresql_tables src/cats/drop_postgresql_database src/cats/create_mysql_database src/cats/update_mysql_tables src/cats/make_mysql_tables src/cats/grant_mysql_privileges src/cats/drop_mysql_tables src/cats/drop_mysql_database src/cats/create_sqlite3_database src/cats/update_sqlite3_tables src/cats/make_sqlite3_tables src/cats/grant_sqlite3_privileges src/cats/drop_sqlite3_tables src/cats/drop_sqlite3_database src/cats/sqlite src/cats/mysql src/cats/create_bacula_database src/cats/update_bacula_tables src/cats/grant_bacula_privileges src/cats/make_bacula_tables src/cats/drop_bacula_tables src/cats/drop_bacula_database src/cats/install-default-backend src/findlib/Makefile src/tools/Makefile src/plugins/fd/Makefile src/plugins/sd/Makefile src/plugins/dir/Makefile po/Makefile.in updatedb/update_mysql_tables_9_to_10 updatedb/update_sqlite3_tables_9_to_10 updatedb/update_postgresql_tables_9_to_10 updatedb/update_mysql_tables_10_to_11 updatedb/update_sqlite3_tables_10_to_11 updatedb/update_postgresql_tables_10_to_11 updatedb/update_mysql_tables_11_to_12 updatedb/update_sqlite3_tables_11_to_12 updatedb/update_postgresql_tables_11_to_12 updatedb/update_mysql_tables_12_to_14 updatedb/update_sqlite3_tables_12_to_14 updatedb/update_postgresql_tables_12_to_14 examples/nagios/check_bacula/Makefile platforms/rpms/redhat/bacula.spec platforms/rpms/redhat/bacula-bat.spec platforms/rpms/redhat/bacula-docs.spec platforms/rpms/redhat/bacula-mtx.spec platforms/rpms/suse/bacula.spec platforms/rpms/suse/bacula-bat.spec platforms/rpms/suse/bacula-docs.spec platforms/rpms/suse/bacula-mtx.spec $PFILES" + +ac_config_files="$ac_config_files autoconf/Make.common Makefile manpages/Makefile scripts/btraceback scripts/bconsole scripts/bacula scripts/bacula-ctl-dir scripts/bacula-ctl-fd scripts/bacula-ctl-sd scripts/devel_bacula scripts/Makefile scripts/logrotate scripts/mtx-changer scripts/disk-changer scripts/dvd-handler scripts/dvd-simulator scripts/logwatch/Makefile scripts/logwatch/logfile.bacula.conf scripts/bat.desktop scripts/bat.desktop.xsu scripts/bat.desktop.consolehelper scripts/bat.console_apps src/Makefile src/host.h src/console/Makefile src/console/bconsole.conf src/qt-console/bat.conf src/qt-console/bat.pro src/qt-console/bat.pro.mingw32 src/qt-console/bat.pro.mingw64 src/qt-console/install_conf_file src/qt-console/tray-monitor/tray-monitor.pro.mingw32 src/qt-console/tray-monitor/tray-monitor.pro.mingw64 src/dird/Makefile src/dird/bacula-dir.conf src/lib/Makefile src/stored/Makefile src/stored/bacula-sd.conf src/filed/Makefile src/filed/bacula-fd.conf src/cats/Makefile src/cats/make_catalog_backup.pl src/cats/make_catalog_backup src/cats/delete_catalog_backup src/cats/create_postgresql_database src/cats/update_postgresql_tables src/cats/make_postgresql_tables src/cats/grant_postgresql_privileges src/cats/drop_postgresql_tables src/cats/drop_postgresql_database src/cats/create_mysql_database src/cats/update_mysql_tables src/cats/make_mysql_tables src/cats/grant_mysql_privileges src/cats/drop_mysql_tables src/cats/drop_mysql_database src/cats/create_sqlite3_database src/cats/update_sqlite3_tables src/cats/make_sqlite3_tables src/cats/grant_sqlite3_privileges src/cats/drop_sqlite3_tables src/cats/drop_sqlite3_database src/cats/sqlite src/cats/mysql src/cats/create_bacula_database src/cats/update_bacula_tables src/cats/grant_bacula_privileges src/cats/make_bacula_tables src/cats/drop_bacula_tables src/cats/drop_bacula_database src/cats/install-default-backend src/findlib/Makefile src/tools/Makefile src/plugins/fd/Makefile src/plugins/sd/Makefile src/plugins/dir/Makefile po/Makefile.in updatedb/update_mysql_tables updatedb/update_sqlite3_tables updatedb/update_postgresql_tables updatedb/update_mysql_tables_9_to_10 updatedb/update_sqlite3_tables_9_to_10 updatedb/update_postgresql_tables_9_to_10 updatedb/update_mysql_tables_10_to_11 updatedb/update_sqlite3_tables_10_to_11 updatedb/update_postgresql_tables_10_to_11 updatedb/update_mysql_tables_11_to_12 updatedb/update_sqlite3_tables_11_to_12 updatedb/update_postgresql_tables_11_to_12 updatedb/update_mysql_tables_12_to_13 updatedb/update_postgresql_tables_12_to_13 updatedb/update_mysql_tables_13_to_14 updatedb/update_postgresql_tables_13_to_14 examples/nagios/check_bacula/Makefile platforms/rpms/redhat/bacula.spec platforms/rpms/redhat/bacula-bat.spec platforms/rpms/redhat/bacula-docs.spec platforms/rpms/redhat/bacula-mtx.spec platforms/rpms/suse/bacula.spec platforms/rpms/suse/bacula-bat.spec platforms/rpms/suse/bacula-docs.spec platforms/rpms/suse/bacula-mtx.spec $PFILES" ac_config_commands="$ac_config_commands default" @@ -31160,16 +31293,16 @@ if (echo >conf$$.file) 2>/dev/null; then # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. + # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' + as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @@ -31229,28 +31362,16 @@ else as_mkdir_p=false fi -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -31271,8 +31392,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by bacula $as_me 7.0.2, which was -generated by GNU Autoconf 2.68. Invocation command line was +This file was extended by bacula $as_me 7.1.0, which was +generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -31337,11 +31458,11 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -bacula config.status 7.0.2 -configured by $0, generated by GNU Autoconf 2.68, +bacula config.status 7.1.0 +configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" -Copyright (C) 2010 Free Software Foundation, Inc. +Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -31431,7 +31552,7 @@ fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then - set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' @@ -31878,7 +31999,10 @@ do "src/qt-console/bat.conf") CONFIG_FILES="$CONFIG_FILES src/qt-console/bat.conf" ;; "src/qt-console/bat.pro") CONFIG_FILES="$CONFIG_FILES src/qt-console/bat.pro" ;; "src/qt-console/bat.pro.mingw32") CONFIG_FILES="$CONFIG_FILES src/qt-console/bat.pro.mingw32" ;; + "src/qt-console/bat.pro.mingw64") CONFIG_FILES="$CONFIG_FILES src/qt-console/bat.pro.mingw64" ;; "src/qt-console/install_conf_file") CONFIG_FILES="$CONFIG_FILES src/qt-console/install_conf_file" ;; + "src/qt-console/tray-monitor/tray-monitor.pro.mingw32") CONFIG_FILES="$CONFIG_FILES src/qt-console/tray-monitor/tray-monitor.pro.mingw32" ;; + "src/qt-console/tray-monitor/tray-monitor.pro.mingw64") CONFIG_FILES="$CONFIG_FILES src/qt-console/tray-monitor/tray-monitor.pro.mingw64" ;; "src/dird/Makefile") CONFIG_FILES="$CONFIG_FILES src/dird/Makefile" ;; "src/dird/bacula-dir.conf") CONFIG_FILES="$CONFIG_FILES src/dird/bacula-dir.conf" ;; "src/lib/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/Makefile" ;; @@ -31923,6 +32047,9 @@ do "src/plugins/sd/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/sd/Makefile" ;; "src/plugins/dir/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/dir/Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; + "updatedb/update_mysql_tables") CONFIG_FILES="$CONFIG_FILES updatedb/update_mysql_tables" ;; + "updatedb/update_sqlite3_tables") CONFIG_FILES="$CONFIG_FILES updatedb/update_sqlite3_tables" ;; + "updatedb/update_postgresql_tables") CONFIG_FILES="$CONFIG_FILES updatedb/update_postgresql_tables" ;; "updatedb/update_mysql_tables_9_to_10") CONFIG_FILES="$CONFIG_FILES updatedb/update_mysql_tables_9_to_10" ;; "updatedb/update_sqlite3_tables_9_to_10") CONFIG_FILES="$CONFIG_FILES updatedb/update_sqlite3_tables_9_to_10" ;; "updatedb/update_postgresql_tables_9_to_10") CONFIG_FILES="$CONFIG_FILES updatedb/update_postgresql_tables_9_to_10" ;; @@ -31932,9 +32059,10 @@ do "updatedb/update_mysql_tables_11_to_12") CONFIG_FILES="$CONFIG_FILES updatedb/update_mysql_tables_11_to_12" ;; "updatedb/update_sqlite3_tables_11_to_12") CONFIG_FILES="$CONFIG_FILES updatedb/update_sqlite3_tables_11_to_12" ;; "updatedb/update_postgresql_tables_11_to_12") CONFIG_FILES="$CONFIG_FILES updatedb/update_postgresql_tables_11_to_12" ;; - "updatedb/update_mysql_tables_12_to_14") CONFIG_FILES="$CONFIG_FILES updatedb/update_mysql_tables_12_to_14" ;; - "updatedb/update_sqlite3_tables_12_to_14") CONFIG_FILES="$CONFIG_FILES updatedb/update_sqlite3_tables_12_to_14" ;; - "updatedb/update_postgresql_tables_12_to_14") CONFIG_FILES="$CONFIG_FILES updatedb/update_postgresql_tables_12_to_14" ;; + "updatedb/update_mysql_tables_12_to_13") CONFIG_FILES="$CONFIG_FILES updatedb/update_mysql_tables_12_to_13" ;; + "updatedb/update_postgresql_tables_12_to_13") CONFIG_FILES="$CONFIG_FILES updatedb/update_postgresql_tables_12_to_13" ;; + "updatedb/update_mysql_tables_13_to_14") CONFIG_FILES="$CONFIG_FILES updatedb/update_mysql_tables_13_to_14" ;; + "updatedb/update_postgresql_tables_13_to_14") CONFIG_FILES="$CONFIG_FILES updatedb/update_postgresql_tables_13_to_14" ;; "examples/nagios/check_bacula/Makefile") CONFIG_FILES="$CONFIG_FILES examples/nagios/check_bacula/Makefile" ;; "platforms/rpms/redhat/bacula.spec") CONFIG_FILES="$CONFIG_FILES platforms/rpms/redhat/bacula.spec" ;; "platforms/rpms/redhat/bacula-bat.spec") CONFIG_FILES="$CONFIG_FILES platforms/rpms/redhat/bacula-bat.spec" ;; @@ -33516,7 +33644,7 @@ chmod 755 install_conf_file build-depkgs-qt-console cd ${BUILD_DIR} cd scripts -chmod 755 bacula btraceback mtx-changer storage-ctl bsg_persist +chmod 755 bacula btraceback mtx-changer chmod 755 dvd-handler dvd-simulator chmod 755 bconsole disk-changer devel_bacula logrotate cd .. @@ -33542,10 +33670,6 @@ chmod 755 $c/grant_sqlite3_privileges $c/drop_sqlite3_tables $c/drop_sqlite3_d chmod 755 $c/create_postgresql_database $c/update_postgresql_tables $c/make_postgresql_tables chmod 755 $c/grant_postgresql_privileges $c/drop_postgresql_tables $c/drop_postgresql_database -#chmod 755 $c/create_ingres_database $c/update_ingres_tables $c/make_ingres_tables -#chmod 755 $c/grant_ingres_privileges $c/drop_ingres_tables $c/drop_ingres_database - - chmod 755 $c/make_catalog_backup $c/delete_catalog_backup $c/make_catalog_backup.pl chmod 755 $c/sqlite chmod 755 $c/mysql @@ -33576,70 +33700,70 @@ ${MAKE:-make} clean echo " Configuration on `date`: - Host: ${host}${post_host} -- ${DISTNAME} ${DISTVER} - Bacula version: ${BACULA} ${VERSION} (${DATE}) - Source code location: ${srcdir} - Install binaries: ${sbindir} - Install libraries: ${libdir} - Install config files: ${sysconfdir} - Scripts directory: ${scriptdir} - Archive directory: ${archivedir} - Working directory: ${working_dir} - PID directory: ${piddir} - Subsys directory: ${subsysdir} - Man directory: ${mandir} - Data directory: ${datarootdir} - Plugin directory: ${plugindir} - C Compiler: ${CC} ${CCVERSION} - C++ Compiler: ${CXX} ${CXXVERSION} - Compiler flags: ${WCFLAGS} ${CFLAGS} - Linker flags: ${WLDFLAGS} ${LDFLAGS} - Libraries: ${LIBS} - Statically Linked Tools: ${support_static_tools} - Statically Linked FD: ${support_static_fd} - Statically Linked SD: ${support_static_sd} - Statically Linked DIR: ${support_static_dir} - Statically Linked CONS: ${support_static_cons} - Database backends: ${db_backends} - Database port: ${db_port} - Database name: ${db_name} - Database user: ${db_user} - - Job Output Email: ${job_email} - Traceback Email: ${dump_email} - SMTP Host Address: ${smtp_host} - - Director Port: ${dir_port} - File daemon Port: ${fd_port} - Storage daemon Port: ${sd_port} - - Director User: ${dir_user} - Director Group: ${dir_group} - Storage Daemon User: ${sd_user} - Storage DaemonGroup: ${sd_group} - File Daemon User: ${fd_user} - File Daemon Group: ${fd_group} - - Large file support: $largefile_support - Bacula conio support: ${got_conio} ${CONS_LIBS} - readline support: ${got_readline} ${PRTREADLINE_SRC} - TCP Wrappers support: ${TCPW_MSG} ${WRAPLIBS} - TLS support: ${support_tls} - Encryption support: ${support_crypto} - ZLIB support: ${have_zlib} - LZO support: ${have_lzo} - enable-smartalloc: ${support_smartalloc} - enable-lockmgr: ${support_lockmgr} - bat support: ${support_bat} - client-only: ${build_client_only} - build-dird: ${build_dird} - build-stored: ${build_stored} - Plugin support: ${have_plugins} - AFS support: ${have_afs} - ACL support: ${have_acl} - XATTR support: ${have_xattr} - systemd support: ${support_systemd} ${SYSTEMD_UNITDIR} - Batch insert enabled: ${batch_insert_db_backends} + Host: ${host}${post_host} -- ${DISTNAME} ${DISTVER} + Bacula version: ${BACULA} ${VERSION} (${DATE}) + Source code location: ${srcdir} + Install binaries: ${sbindir} + Install libraries: ${libdir} + Install config files: ${sysconfdir} + Scripts directory: ${scriptdir} + Archive directory: ${archivedir} + Working directory: ${working_dir} + PID directory: ${piddir} + Subsys directory: ${subsysdir} + Man directory: ${mandir} + Data directory: ${datarootdir} + Plugin directory: ${plugindir} + C Compiler: ${CC} ${CCVERSION} + C++ Compiler: ${CXX} ${CXXVERSION} + Compiler flags: ${WCFLAGS} ${CFLAGS} + Linker flags: ${WLDFLAGS} ${LDFLAGS} + Libraries: ${LIBS} + Statically Linked Tools: ${support_static_tools} + Statically Linked FD: ${support_static_fd} + Statically Linked SD: ${support_static_sd} + Statically Linked DIR: ${support_static_dir} + Statically Linked CONS: ${support_static_cons} + Database backends: ${db_backends} + Database port: ${db_port} + Database name: ${db_name} + Database user: ${db_user} + + Job Output Email: ${job_email} + Traceback Email: ${dump_email} + SMTP Host Address: ${smtp_host} + + Director Port: ${dir_port} + File daemon Port: ${fd_port} + Storage daemon Port: ${sd_port} + + Director User: ${dir_user} + Director Group: ${dir_group} + Storage Daemon User: ${sd_user} + Storage DaemonGroup: ${sd_group} + File Daemon User: ${fd_user} + File Daemon Group: ${fd_group} + + Large file support: $largefile_support + Bacula conio support: ${got_conio} ${CONS_LIBS} + readline support: ${got_readline} ${PRTREADLINE_SRC} + TCP Wrappers support: ${TCPW_MSG} ${WRAPLIBS} + TLS support: ${support_tls} + Encryption support: ${support_crypto} + ZLIB support: ${have_zlib} + LZO support: ${have_lzo} + enable-smartalloc: ${support_smartalloc} + enable-lockmgr: ${support_lockmgr} + bat support: ${support_bat} + client-only: ${build_client_only} + build-dird: ${build_dird} + build-stored: ${build_stored} + Plugin support: ${have_plugins} + AFS support: ${have_afs} + ACL support: ${have_acl} + XATTR support: ${have_xattr} + systemd support: ${support_systemd} ${SYSTEMD_UNITDIR} + Batch insert enabled: ${batch_insert_db_backends} " > config.out diff --git a/bacula/examples/conf/kernsconfig b/bacula/examples/conf/kernsconfig index 62eca3873b..4aff6af6da 100755 --- a/bacula/examples/conf/kernsconfig +++ b/bacula/examples/conf/kernsconfig @@ -1,16 +1,30 @@ #!/bin/sh +# This is Kern's configure script for Bacula # -# This is Kern's configure script for a test Bacula +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # -CFLAGS="-g -O2 -Wall" ./configure \ - --sbindir=$HOME/bacula/bin \ - --sysconfdir=$HOME/bacula/bin \ - --with-pid-dir=$HOME/bacula/bin/working \ - --with-subsys-dir=$HOME/bacula/bin/working \ + +PREFIX=/opt/bacula +CFLAGS="-g -O2 -Wall" \ + ./configure \ + --sbindir=${PREFIX}/bin \ + --sysconfdir=${PREFIX}/etc \ + --docdir=${PREFIX}/html \ + --htmldir=${PREFIX}/html \ + --with-working-dir=${PREFIX}/working \ + --with-pid-dir=${PREFIX}/working \ + --with-scriptdir=${PREFIX}/scripts \ + --with-plugindir=${PREFIX}/plugins \ + --libdir=${PREFIX}/lib \ --enable-smartalloc \ - --with-mysql=$HOME/mysql \ - --with-working-dir=$HOME/bacula/working \ - --with-dump-email=$USER \ - --with-job-email=$USER + --disable-conio \ + --enable-readline \ + --enable-bat \ + --with-mysql \ + --with-dump-email=localhost \ + --with-job-email=localhost \ + --with-smtp-host=localhost \ + --with-baseport=9101 exit 0 diff --git a/bacula/examples/nagios/check_bacula/Makefile.in b/bacula/examples/nagios/check_bacula/Makefile.in index 5c22e2a1a0..7cdc7a37fb 100644 --- a/bacula/examples/nagios/check_bacula/Makefile.in +++ b/bacula/examples/nagios/check_bacula/Makefile.in @@ -1,5 +1,7 @@ # -# Version $Id: Makefile.in,v 1.4 2004/09/25 10:19:59 nboichat Exp $ +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # @MCOMMON@ diff --git a/bacula/examples/nagios/check_bacula/check_bacula.c b/bacula/examples/nagios/check_bacula/check_bacula.c index 1546da7938..db0e22d2b8 100644 --- a/bacula/examples/nagios/check_bacula/check_bacula.c +++ b/bacula/examples/nagios/check_bacula/check_bacula.c @@ -345,7 +345,7 @@ int docmd(monitoritem* item, const char* command, char *answer) { item->D_sock->signal(BNET_HB_RESPONSE); } else { - sprintf(answer, "BACULA WARNING - Unexpected signal received : %s ", bnet_sig_to_ascii(item->D_sock)); + sprintf(answer, "BACULA WARNING - Unexpected signal received : %s ", bnet_sig_to_ascii(item->D_sock->msglen)); } } else { /* BNET_HARDEOF || BNET_ERROR */ diff --git a/bacula/get_authors b/bacula/get_authors deleted file mode 100755 index df3f70cb21..0000000000 --- a/bacula/get_authors +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -git log --format='%aN' Release-5.0.3..Branch-5.2| sort -u diff --git a/bacula/manpages/Makefile.in b/bacula/manpages/Makefile.in index dfc4a9ea26..e4d107a2ab 100644 --- a/bacula/manpages/Makefile.in +++ b/bacula/manpages/Makefile.in @@ -1,6 +1,6 @@ # -# Author: Kern Sibbald, Copyright, 2000-2015 -# License: BSD 2-Clause +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # @MCOMMON@ diff --git a/bacula/manpages/bacula-dir.8 b/bacula/manpages/bacula-dir.8 index 14eb5ee2cb..1fdc89bce1 100644 --- a/bacula/manpages/bacula-dir.8 +++ b/bacula/manpages/bacula-dir.8 @@ -31,6 +31,9 @@ Set debug level to \fInn\fP. .BI \-dt Print timestamp in debug output. .TP +.BI \-T +Send debug messages to the trace file. +.TP .BI \-f Run in foreground (for debugging). .TP diff --git a/bacula/manpages/bacula-fd.8 b/bacula/manpages/bacula-fd.8 index 79fdfe8e71..4f2c584a07 100644 --- a/bacula/manpages/bacula-fd.8 +++ b/bacula/manpages/bacula-fd.8 @@ -33,6 +33,9 @@ Set debug level to \fInn\fP. .BI \-dt Print timestamp in debug output. .TP +.BI \-T +Send debug messages to the trace file. +.TP .BI \-f Run in foreground (for debugging). .TP diff --git a/bacula/manpages/bacula-sd.8 b/bacula/manpages/bacula-sd.8 index 25af0c51fb..56ee77891d 100644 --- a/bacula/manpages/bacula-sd.8 +++ b/bacula/manpages/bacula-sd.8 @@ -31,6 +31,9 @@ Set debug level to \fInn\fP. .BI \-dt Print timestamp in debug output. .TP +.BI \-T +Send debug messages to the trace file. +.TP .BI \-f Run in foreground (for debugging). .TP diff --git a/bacula/manpages/bacula-tray-monitor.1 b/bacula/manpages/bacula-tray-monitor.1 index 1a62cf3c51..a07cb596ff 100644 --- a/bacula/manpages/bacula-tray-monitor.1 +++ b/bacula/manpages/bacula-tray-monitor.1 @@ -43,4 +43,4 @@ This manual page was written by Jose Luis Tallon .nh . .SH COPYRIGHT -This man page document is released under the LGPL version 3.0 license. +This man page document is released under the BSD 2-Clause license. diff --git a/bacula/manpages/bcopy.8 b/bacula/manpages/bcopy.8 index 47314c6b05..c6aebfe1f6 100644 --- a/bacula/manpages/bcopy.8 +++ b/bacula/manpages/bcopy.8 @@ -8,9 +8,9 @@ .SH NAME bcopy \- Bacula's 'Copy from tape' .SH SYNOPSIS -.B bcopy +.B bcopy .RI [ options ] -.I input-archive +.I input-archive .I output-archive .br .SH DESCRIPTION @@ -19,7 +19,7 @@ This manual page documents briefly the command. .PP .\" TeX users may be more comfortable with the \fB\fP and -.\" \fI\fP escape sequences to invoke bold face and italics, +.\" \fI\fP escape sequences to invoke bold face and italics, .\" respectively. .SH OPTIONS A summary of options is included below. @@ -59,7 +59,7 @@ Set verbose mode. .br .SH AUTHOR This manual page was written by Jose Luis Tallon -.nh +.nh . .SH COPYRIGHT -This man page document is released under the LGPL version 3.0 license. +This man page document is released under the BSD 2-Clause license. diff --git a/bacula/platforms/Makefile.in b/bacula/platforms/Makefile.in index fedcde3cf7..afdb9c866f 100644 --- a/bacula/platforms/Makefile.in +++ b/bacula/platforms/Makefile.in @@ -1,4 +1,7 @@ # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # This is the makefile template for the platform directory # which contains general platform installation. # diff --git a/bacula/platforms/aix/Makefile.in b/bacula/platforms/aix/Makefile.in index 3dbee96cc1..656638378a 100644 --- a/bacula/platforms/aix/Makefile.in +++ b/bacula/platforms/aix/Makefile.in @@ -4,6 +4,9 @@ # # 1 March 2003 -- Kern Sibbald # +# Copyright (C) 2003-2015, Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # for Bacula release @VERSION@ (@DATE@) -- @DISTNAME@ # diff --git a/bacula/platforms/alpha/Makefile.in b/bacula/platforms/alpha/Makefile.in index 038615bfc7..3e2d9c54e2 100644 --- a/bacula/platforms/alpha/Makefile.in +++ b/bacula/platforms/alpha/Makefile.in @@ -1,4 +1,7 @@ # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # This file is used as the template to create the # Makefile for the Tru64 specific installation. # diff --git a/bacula/platforms/alpha/bacula-fd.in b/bacula/platforms/alpha/bacula-fd.in index 74a12c00dd..b162cb495e 100644 --- a/bacula/platforms/alpha/bacula-fd.in +++ b/bacula/platforms/alpha/bacula-fd.in @@ -1,5 +1,8 @@ #!/bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula File daemon. # @@ -9,6 +12,7 @@ # for Bacula release @VERSION@ (@DATE@) -- @DISTNAME@ # +RETVAL=0 case "$1" in start) echo "Starting the Bacula File daemon: " @@ -30,10 +34,11 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac -exit 0 +exit $RETVAL diff --git a/bacula/platforms/bsdi/Makefile.in b/bacula/platforms/bsdi/Makefile.in index 5a84037692..d228a8b6a7 100644 --- a/bacula/platforms/bsdi/Makefile.in +++ b/bacula/platforms/bsdi/Makefile.in @@ -1,3 +1,6 @@ +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # This file is used as the template to create the # Makefile for the Solaris specific installation. diff --git a/bacula/platforms/bsdi/bacula-dir.in b/bacula/platforms/bsdi/bacula-dir.in index af7b0c5c1a..342a0638dd 100755 --- a/bacula/platforms/bsdi/bacula-dir.in +++ b/bacula/platforms/bsdi/bacula-dir.in @@ -1,4 +1,6 @@ #! /bin/sh +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # bacula This shell script takes care of starting and stopping # the bacula Director daemon @@ -29,10 +31,11 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac -exit 0 +exit $RETVAL diff --git a/bacula/platforms/bsdi/bacula-fd.in b/bacula/platforms/bsdi/bacula-fd.in index 2c41b34325..e98f7ad2d7 100755 --- a/bacula/platforms/bsdi/bacula-fd.in +++ b/bacula/platforms/bsdi/bacula-fd.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula File daemon. # @@ -9,6 +12,7 @@ # For Bacula release @VERSION@ (@DATE@) -- @DISTNAME@ # +RETVAL=0 case "$1" in start) echo "Starting the Bacula File daemon: " @@ -28,10 +32,11 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac -exit 0 +exit $RETVAL diff --git a/bacula/platforms/bsdi/bacula-sd.in b/bacula/platforms/bsdi/bacula-sd.in index 9f4e6f0c70..7aafe60b70 100755 --- a/bacula/platforms/bsdi/bacula-sd.in +++ b/bacula/platforms/bsdi/bacula-sd.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Storage daemon. # @@ -9,6 +12,7 @@ # For Bacula release @VERSION@ (@DATE@) -- @DISTNAME@ # +RETVAL=0 case "$1" in start) echo "Starting the Bacula Storage daemon: " @@ -28,10 +32,11 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac -exit 0 +exit $RETVAL diff --git a/bacula/platforms/contrib-rpm/build_rpm.sh b/bacula/platforms/contrib-rpm/build_rpm.sh index 67d82dc7da..07f4efe400 100755 --- a/bacula/platforms/contrib-rpm/build_rpm.sh +++ b/bacula/platforms/contrib-rpm/build_rpm.sh @@ -3,9 +3,10 @@ # shell script to build bacula rpm release # copy this script into a working directory with the src rpm to build and execute # 19 Aug 2006 D. Scott Barninger +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS -# Copyright (C) 2006 Free Software Foundation Europe e.V. -# licensed under GPL-v2 # signing rpms # Make sure you have a .rpmmacros file in your home directory containing the following: @@ -115,10 +116,10 @@ rpmbuild --rebuild --define "build_${PLATFORM} 1" \ rm -rf ${RPMBUILD}/* if [ "$BUILDBAT" = "1" ]; then - echo Building Bat package for "$PLATFORM"... - sleep 2 - rpmbuild --rebuild ${SRPM2} - rm -rf ${RPMBUILD}/* + echo Building Bat package for "$PLATFORM"... + sleep 2 + rpmbuild --rebuild ${SRPM2} + rm -rf ${RPMBUILD}/* fi echo Building Docs package for "$PLATFORM"... @@ -127,10 +128,10 @@ rpmbuild --rebuild ${SRPM3} rm -rf ${RPMBUILD}/* if [ "$BUILDMTX" = "1" ]; then - echo Building mtx package for "$PLATFORM"... - sleep 2 - rpmbuild --rebuild ${SRPM4} - rm -rf ${RPMBUILD}/* + echo Building mtx package for "$PLATFORM"... + sleep 2 + rpmbuild --rebuild ${SRPM4} + rm -rf ${RPMBUILD}/* fi # delete the updatedb package and any debuginfo packages built @@ -153,8 +154,8 @@ mv -f ${RPMDIR}/bacula-sqlite-${VERSION}-${RELEASE}.${ARCH}.rpm \ ./bacula-sqlite-${VERSION}-${RELEASE}.${FILENAME}.${ARCH}.rpm if [ "$BUILDMTX" = "1" ]; then - mv -f ${RPMDIR}/bacula-mtx-${VERSION}-${RELEASE}.${ARCH}.rpm \ - ./bacula-mtx-${VERSION}-${RELEASE}.${FILENAME}.${ARCH}.rpm + mv -f ${RPMDIR}/bacula-mtx-${VERSION}-${RELEASE}.${ARCH}.rpm \ + ./bacula-mtx-${VERSION}-${RELEASE}.${FILENAME}.${ARCH}.rpm fi mv -f ${RPMDIR}/bacula-client-${VERSION}-${RELEASE}.${ARCH}.rpm \ @@ -164,8 +165,8 @@ mv -f ${RPMDIR}/bacula-libs-${VERSION}-${RELEASE}.${ARCH}.rpm \ ./bacula-libs-${VERSION}-${RELEASE}.${FILENAME}.${ARCH}.rpm if [ "$BUILDBAT" = "1" ]; then - mv -f ${RPMDIR}/bacula-bat-${VERSION}-${RELEASE}.${ARCH}.rpm \ - ./bacula-bat-${VERSION}-${RELEASE}.${FILENAME}.${ARCH}.rpm + mv -f ${RPMDIR}/bacula-bat-${VERSION}-${RELEASE}.${ARCH}.rpm \ + ./bacula-bat-${VERSION}-${RELEASE}.${FILENAME}.${ARCH}.rpm fi mv -f ${RPMDIR2}/bacula-docs-${VERSION}-${RELEASE}.noarch.rpm . diff --git a/bacula/platforms/contrib-rpm/rpm_wizard.sh b/bacula/platforms/contrib-rpm/rpm_wizard.sh index 89857dc623..0ff3628ffb 100755 --- a/bacula/platforms/contrib-rpm/rpm_wizard.sh +++ b/bacula/platforms/contrib-rpm/rpm_wizard.sh @@ -3,9 +3,10 @@ # shell script wizard to build bacula rpm using gnome dialogs # requires zenity to be installed # 30 Jul 2006 D. Scott Barninger +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS -# Copyright (C) 2006 Free Software Foundation Europe e.V. -# licensed under GPL-v2 # usage ./rpm_wizard.sh diff --git a/bacula/platforms/contrib-rpm/rpmkey.spec b/bacula/platforms/contrib-rpm/rpmkey.spec index 81183a1abb..662e8e3949 100644 --- a/bacula/platforms/contrib-rpm/rpmkey.spec +++ b/bacula/platforms/contrib-rpm/rpmkey.spec @@ -1,6 +1,7 @@ # rpm public key package -# Copyright (C) 2006 Free Software Foundation Europe e.V. # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # replace the string yournam with your name @@ -14,7 +15,7 @@ Summary: The %{pubkeyname} rpm public key Name: rpmkey-%{pubkeyname} Version: 0.1 Release: 1 -License: GPL v2 +License: BSD 2-Clause; see file LICENSE-FOSS Group: System/Packages Source0: %{pubkeyname}.asc BuildArch: noarch diff --git a/bacula/platforms/darwin/Makefile.in b/bacula/platforms/darwin/Makefile.in index c6fde3ee46..b11f51ea74 100644 --- a/bacula/platforms/darwin/Makefile.in +++ b/bacula/platforms/darwin/Makefile.in @@ -1,4 +1,7 @@ # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # This file is used as the template to create the # Makefile for the Darwin specific installation. # diff --git a/bacula/platforms/debian/Makefile.in b/bacula/platforms/debian/Makefile.in index aa77f36013..7f0aa2dc5e 100644 --- a/bacula/platforms/debian/Makefile.in +++ b/bacula/platforms/debian/Makefile.in @@ -1,3 +1,6 @@ +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # This file is used as the template to create the # Makefile for the Debian/Ubuntu/Kubuntu specific installation. diff --git a/bacula/platforms/debian/bacula-dir.in b/bacula/platforms/debian/bacula-dir.in index 73253dce8e..a6715e7935 100644 --- a/bacula/platforms/debian/bacula-dir.in +++ b/bacula/platforms/debian/bacula-dir.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Director daemon on Debian/Ubuntu/Kubuntu # systems. @@ -48,6 +51,7 @@ if [ "x${BUSER}" != "x" ]; then fi fi +RETVAL=0 case "$1" in start) echo -n "Starting ${DESC}: " @@ -65,6 +69,7 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; *) echo "Usage: /etc/init.d/${NAME} {start|stop|restart|force-reload}" >&2 diff --git a/bacula/platforms/debian/bacula-fd.in b/bacula/platforms/debian/bacula-fd.in index 181625ce7d..86568cb766 100644 --- a/bacula/platforms/debian/bacula-fd.in +++ b/bacula/platforms/debian/bacula-fd.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Director daemon on Debian/Ubuntu/Kubuntu # systems. @@ -48,6 +51,7 @@ if [ "x${BUSER}" != "x" ]; then fi fi +RETVAL=0 case "$1" in start) echo -n "Starting ${DESC}: " @@ -65,6 +69,7 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; *) echo "Usage: /etc/init.d/${NAME} {start|stop|restart|force-reload}" >&2 diff --git a/bacula/platforms/debian/bacula-sd.in b/bacula/platforms/debian/bacula-sd.in index 1753304755..13b726e5cd 100644 --- a/bacula/platforms/debian/bacula-sd.in +++ b/bacula/platforms/debian/bacula-sd.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Director daemon on Debian/Ubuntu/Kubuntu # systems. @@ -48,6 +51,7 @@ if [ "x${BUSER}" != "x" ]; then fi fi +RETVAL=0 case "$1" in start) echo -n "Starting ${DESC}: " @@ -65,6 +69,7 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; *) echo "Usage: /etc/init.d/${NAME} {start|stop|restart|force-reload}" >&2 diff --git a/bacula/platforms/freebsd/Makefile.in b/bacula/platforms/freebsd/Makefile.in index b97f62c803..9aab6943ed 100644 --- a/bacula/platforms/freebsd/Makefile.in +++ b/bacula/platforms/freebsd/Makefile.in @@ -1,3 +1,6 @@ +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # This file is used as the template to create the # Makefile for the Solaris specific installation. diff --git a/bacula/platforms/freebsd/bacula-dir.in b/bacula/platforms/freebsd/bacula-dir.in index af7b0c5c1a..78dde0366d 100755 --- a/bacula/platforms/freebsd/bacula-dir.in +++ b/bacula/platforms/freebsd/bacula-dir.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Director daemon # @@ -29,10 +32,11 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac -exit 0 +exit $RETVAL diff --git a/bacula/platforms/freebsd/bacula-fd.in b/bacula/platforms/freebsd/bacula-fd.in index 2c41b34325..e98f7ad2d7 100755 --- a/bacula/platforms/freebsd/bacula-fd.in +++ b/bacula/platforms/freebsd/bacula-fd.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula File daemon. # @@ -9,6 +12,7 @@ # For Bacula release @VERSION@ (@DATE@) -- @DISTNAME@ # +RETVAL=0 case "$1" in start) echo "Starting the Bacula File daemon: " @@ -28,10 +32,11 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac -exit 0 +exit $RETVAL diff --git a/bacula/platforms/freebsd/bacula-sd.in b/bacula/platforms/freebsd/bacula-sd.in index 9f4e6f0c70..7aafe60b70 100755 --- a/bacula/platforms/freebsd/bacula-sd.in +++ b/bacula/platforms/freebsd/bacula-sd.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Storage daemon. # @@ -9,6 +12,7 @@ # For Bacula release @VERSION@ (@DATE@) -- @DISTNAME@ # +RETVAL=0 case "$1" in start) echo "Starting the Bacula Storage daemon: " @@ -28,10 +32,11 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac -exit 0 +exit $RETVAL diff --git a/bacula/platforms/gentoo/Makefile.in b/bacula/platforms/gentoo/Makefile.in index 4c7c9b0250..ee90620f5f 100644 --- a/bacula/platforms/gentoo/Makefile.in +++ b/bacula/platforms/gentoo/Makefile.in @@ -1,4 +1,7 @@ -# +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # This file is used as the template to create the # Makefile for the Gentoo specific installation. # diff --git a/bacula/platforms/gentoo/bacula-dir.in b/bacula/platforms/gentoo/bacula-dir.in index a4cbca733d..391cbf632f 100755 --- a/bacula/platforms/gentoo/bacula-dir.in +++ b/bacula/platforms/gentoo/bacula-dir.in @@ -1,5 +1,8 @@ #!/sbin/runscript # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Director daemon for the Gentoo release # diff --git a/bacula/platforms/gentoo/bacula-fd.in b/bacula/platforms/gentoo/bacula-fd.in index 98e5efeb36..fdf1555526 100755 --- a/bacula/platforms/gentoo/bacula-fd.in +++ b/bacula/platforms/gentoo/bacula-fd.in @@ -1,5 +1,8 @@ #!/sbin/runscript # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula File daemon for the Gentoo release. # diff --git a/bacula/platforms/gentoo/bacula-sd.in b/bacula/platforms/gentoo/bacula-sd.in index 26c6f74566..020047dec3 100755 --- a/bacula/platforms/gentoo/bacula-sd.in +++ b/bacula/platforms/gentoo/bacula-sd.in @@ -1,5 +1,8 @@ #!/sbin/runscript # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Storage daemon for the Gentoo release. # diff --git a/bacula/platforms/gentoo/bacula.ebuild b/bacula/platforms/gentoo/bacula.ebuild index b87c6248f4..f80e4d8d26 100644 --- a/bacula/platforms/gentoo/bacula.ebuild +++ b/bacula/platforms/gentoo/bacula.ebuild @@ -1,5 +1,7 @@ # Copyright 2004 D. Scott Barninger -# Distributed under the terms of the GNU General Public License v2 +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # # Modified from bacula-1.34.5.ebuild for 1.36.0 release # 24 Oct 2004 D. Scott Barninger @@ -37,7 +39,7 @@ DESCRIPTION="featureful client/server network backup suite" HOMEPAGE="http://www.bacula.org/" SRC_URI="mirror://sourceforge/bacula/${P}.tar.gz" -LICENSE="GPL-2" +LICENSE="BSD 2-Clause" SLOT="0" KEYWORDS="x86 ~ppc ~sparc ~amd64" IUSE="readline tcpd gnome mysql sqlite X static postgres wxwindows bacula-clientonly bacula-split" @@ -48,379 +50,379 @@ inherit eutils # mysql is the recommended choice ... # may need sys-libs/libtermcap-compat but try without first DEPEND=">=sys-libs/zlib-1.1.4 - readline? ( >=sys-libs/readline-4.1 ) - tcpd? ( >=sys-apps/tcp-wrappers-7.6 ) - gnome? ( gnome-base/libgnome ) - gnome? ( app-admin/gnomesu ) - !bacula-clientonly? ( - sqlite? ( =dev-db/sqlite-2* ) - mysql? ( >=dev-db/mysql-3.23 ) - postgres? ( >=dev-db/postgresql-7.4.0 ) - sys-apps/mtx - ) - X? ( virtual/x11 ) - wxwindows? ( >=x11-libs/wxGTK-2.4.2 ) - virtual/mta - dev-libs/gmp - app-text/tetex - dev-tex/latex2html" + readline? ( >=sys-libs/readline-4.1 ) + tcpd? ( >=sys-apps/tcp-wrappers-7.6 ) + gnome? ( gnome-base/libgnome ) + gnome? ( app-admin/gnomesu ) + !bacula-clientonly? ( + sqlite? ( =dev-db/sqlite-2* ) + mysql? ( >=dev-db/mysql-3.23 ) + postgres? ( >=dev-db/postgresql-7.4.0 ) + sys-apps/mtx + ) + X? ( virtual/x11 ) + wxwindows? ( >=x11-libs/wxGTK-2.4.2 ) + virtual/mta + dev-libs/gmp + app-text/tetex + dev-tex/latex2html" RDEPEND="${DEPEND} - !bacula-clientonly? ( - sys-apps/mtx - app-arch/mt-st - )" + !bacula-clientonly? ( + sys-apps/mtx + app-arch/mt-st + )" src_compile() { - # this resolves bug #181 - epatch ${FILESDIR}/1.36.2-cdrecord-configure.patch - - local myconf="" - - myconf=" - `use_enable readline` - `use_enable gnome` - `use_enable tcpd tcp-wrappers` - `use_enable X x`" - - # define this to skip building the other daemons ... - if use bacula-clientonly - then - myconf="${myconf} --enable-client-only" - fi - - # select database support - if ! use bacula-clientonly - then - # mysql is the recomended choice ... - if use mysql - then - myconf="${myconf} --with-mysql=/usr" - elif use postgres - then - myconf="${myconf} --with-postgresql=/usr" - elif use sqlite - then - myconf="${myconf} --with-sqlite=/usr" - elif use sqlite && use mysql - then - myconf="${myconf/--with-sqlite/}" - fi - fi - - if use wxwindows - then - myconf="${myconf} --enable-wx-console" - fi - - if use readline - then - myconf="${myconf} --enable-readline" - fi - - if use gnome - then - myconf="${myconf} --enable-tray-monitor" - fi - - ./configure \ - --enable-smartalloc \ - --prefix=/usr \ - --mandir=/usr/share/man \ - --with-pid-dir=/var/run \ - --sysconfdir=/etc/bacula \ - --infodir=/usr/share/info \ - --with-subsys-dir=/var/lock/subsys \ - --with-working-dir=/var/bacula \ - --with-scriptdir=/etc/bacula \ - --with-dir-user=root \ - --with-dir-group=bacula \ - --with-sd-user=root \ - --with-sd-group=bacula \ - --with-fd-user=root \ - --with-fd-group=bacula \ - --host=${CHOST} ${myconf} || die "bad ./configure" - - emake || die "compile problem" - - # for the rescue package regardless of use static - cd ${S}/src/filed - make static-bacula-fd - cd ${S} - - # make the docs - cd ${S}/doc/latex - make - cd ${S} - - if use static - then - cd ${S}/src/console - make static-console - cd ${S}/src/dird - make static-bacula-dir - if use gnome - then - cd ${S}/src/gnome-console - make static-gnome-console - fi - if use wxwindows - then - cd ${S}/src/wx-console - make static-wx-console - fi - cd ${S}/src/stored - make static-bacula-sd - fi + # this resolves bug #181 + epatch ${FILESDIR}/1.36.2-cdrecord-configure.patch + + local myconf="" + + myconf=" + `use_enable readline` + `use_enable gnome` + `use_enable tcpd tcp-wrappers` + `use_enable X x`" + + # define this to skip building the other daemons ... + if use bacula-clientonly + then + myconf="${myconf} --enable-client-only" + fi + + # select database support + if ! use bacula-clientonly + then + # mysql is the recomended choice ... + if use mysql + then + myconf="${myconf} --with-mysql=/usr" + elif use postgres + then + myconf="${myconf} --with-postgresql=/usr" + elif use sqlite + then + myconf="${myconf} --with-sqlite=/usr" + elif use sqlite && use mysql + then + myconf="${myconf/--with-sqlite/}" + fi + fi + + if use wxwindows + then + myconf="${myconf} --enable-wx-console" + fi + + if use readline + then + myconf="${myconf} --enable-readline" + fi + + if use gnome + then + myconf="${myconf} --enable-tray-monitor" + fi + + ./configure \ + --enable-smartalloc \ + --prefix=/usr \ + --mandir=/usr/share/man \ + --with-pid-dir=/var/run \ + --sysconfdir=/etc/bacula \ + --infodir=/usr/share/info \ + --with-subsys-dir=/var/lock/subsys \ + --with-working-dir=/var/bacula \ + --with-scriptdir=/etc/bacula \ + --with-dir-user=root \ + --with-dir-group=bacula \ + --with-sd-user=root \ + --with-sd-group=bacula \ + --with-fd-user=root \ + --with-fd-group=bacula \ + --host=${CHOST} ${myconf} || die "bad ./configure" + + emake || die "compile problem" + + # for the rescue package regardless of use static + cd ${S}/src/filed + make static-bacula-fd + cd ${S} + + # make the docs + cd ${S}/doc/latex + make + cd ${S} + + if use static + then + cd ${S}/src/console + make static-console + cd ${S}/src/dird + make static-bacula-dir + if use gnome + then + cd ${S}/src/gnome-console + make static-gnome-console + fi + if use wxwindows + then + cd ${S}/src/wx-console + make static-wx-console + fi + cd ${S}/src/stored + make static-bacula-sd + fi } src_install() { - make DESTDIR=${D} install || die - - if use static - then - cd ${S}/src/filed - cp static-bacula-fd ${D}/usr/sbin/bacula-fd - cd ${S}/src/console - cp static-console ${D}/usr/sbin/console - cd ${S}/src/dird - cp static-bacula-dir ${D}/usr/sbin/bacula-dir - if use gnome - then - cd ${S}/src/gnome-console - cp static-gnome-console ${D}/usr/sbin/gnome-console - fi - if use wxwindows - then - cd ${S}/src/wx-console - cp static-wx-console ${D}/usr/sbin/wx-console - fi - cd ${S}/src/stored - cp static-bacula-sd ${D}/usr/sbin/bacula-sd - fi - - # the menu stuff - if use gnome - then - mkdir -p ${D}/usr/share/pixmaps - mkdir -p ${D}/usr/share/applications - cp ${S}/scripts/bacula.png ${D}/usr/share/pixmaps/bacula.png - cp ${S}/scripts/bacula.desktop.gnome2.xsu ${D}/usr/share/applications/bacula.desktop - cp ${S}/src/tray-monitor/generic.xpm ${D}/usr/share/pixmaps/bacula-tray-monitor.xpm - cp ${S}/scripts/bacula-tray-monitor.desktop \ - ${D}/usr/share/applications/bacula-tray-monitor.desktop - chmod 755 ${D}/usr/sbin/bacula-tray-monitor - chmod 644 ${D}/etc/bacula/tray-monitor.conf - fi - - if ! use bacula-clientonly - then - # the database update scripts - mkdir -p ${D}/etc/bacula/updatedb - cp ${S}/updatedb/* ${D}/etc/bacula/updatedb/ - chmod 754 ${D}/etc/bacula/updatedb/* - - # the logrotate configuration - mkdir -p ${D}/etc/logrotate.d - cp ${S}/scripts/logrotate ${D}/etc/logrotate.d/bacula - chmod 644 ${D}/etc/logrotate.d/bacula - - # the logwatch scripts - mkdir -p ${D}/etc/log.d/conf/logfiles - mkdir -p ${D}/etc/log.d/conf/services - mkdir -p ${D}/etc/log.d/scripts/services - cp ${S}/scripts/logwatch/bacula ${D}/etc/log.d/scripts/services/bacula - cp ${S}/scripts/logwatch/logfile.bacula.conf ${D}/etc/log.d/conf/logfiles/bacula.conf - cp ${S}/scripts/logwatch/services.bacula.conf ${D}/etc/log.d/conf/services/bacula.conf - chmod 755 ${D}/etc/log.d/scripts/services/bacula - chmod 644 ${D}/etc/log.d/conf/logfiles/bacula.conf - chmod 644 ${D}/etc/log.d/conf/services/bacula.conf - - fi - - # the cdrom rescue package - mkdir -p ${D}/etc/bacula/rescue/cdrom - cp -R ${S}/rescue/linux/cdrom/* ${D}/etc/bacula/rescue/cdrom/ - mkdir ${D}/etc/bacula/rescue/cdrom/bin - cp ${S}/src/filed/static-bacula-fd ${D}/etc/bacula/rescue/cdrom/bin/bacula-fd - chmod 754 ${D}/etc/bacula/rescue/cdrom/bin/bacula-fd - - # documentation - for a in ${S}/{ChangeLog,README,ReleaseNotes,kernstodo,LICENSE,doc/latex/bacula.pdf} - do - dodoc $a - done - - dohtml -r ${S}/doc/latex/bacula - - # clean up permissions left broken by install - chmod o-r ${D}/etc/bacula/query.sql - - # remove the working dir so we can add it postinst with group - rmdir ${D}/var/bacula - - # init scripts - exeinto /etc/init.d - if use bacula-clientonly - then - newexe ${S}/platforms/gentoo/bacula-fd bacula-fd - else - if use bacula-split - then - newexe ${S}/platforms/gentoo/bacula-fd bacula-fd - newexe ${S}/platforms/gentoo/bacula-sd bacula-sd - newexe ${S}/platforms/gentoo/bacula-dir bacula-dir - else - newexe ${S}/platforms/gentoo/bacula-init bacula - fi - fi + make DESTDIR=${D} install || die + + if use static + then + cd ${S}/src/filed + cp static-bacula-fd ${D}/usr/sbin/bacula-fd + cd ${S}/src/console + cp static-console ${D}/usr/sbin/console + cd ${S}/src/dird + cp static-bacula-dir ${D}/usr/sbin/bacula-dir + if use gnome + then + cd ${S}/src/gnome-console + cp static-gnome-console ${D}/usr/sbin/gnome-console + fi + if use wxwindows + then + cd ${S}/src/wx-console + cp static-wx-console ${D}/usr/sbin/wx-console + fi + cd ${S}/src/stored + cp static-bacula-sd ${D}/usr/sbin/bacula-sd + fi + + # the menu stuff + if use gnome + then + mkdir -p ${D}/usr/share/pixmaps + mkdir -p ${D}/usr/share/applications + cp ${S}/scripts/bacula.png ${D}/usr/share/pixmaps/bacula.png + cp ${S}/scripts/bacula.desktop.gnome2.xsu ${D}/usr/share/applications/bacula.desktop + cp ${S}/src/tray-monitor/generic.xpm ${D}/usr/share/pixmaps/bacula-tray-monitor.xpm + cp ${S}/scripts/bacula-tray-monitor.desktop \ + ${D}/usr/share/applications/bacula-tray-monitor.desktop + chmod 755 ${D}/usr/sbin/bacula-tray-monitor + chmod 644 ${D}/etc/bacula/tray-monitor.conf + fi + + if ! use bacula-clientonly + then + # the database update scripts + mkdir -p ${D}/etc/bacula/updatedb + cp ${S}/updatedb/* ${D}/etc/bacula/updatedb/ + chmod 754 ${D}/etc/bacula/updatedb/* + + # the logrotate configuration + mkdir -p ${D}/etc/logrotate.d + cp ${S}/scripts/logrotate ${D}/etc/logrotate.d/bacula + chmod 644 ${D}/etc/logrotate.d/bacula + + # the logwatch scripts + mkdir -p ${D}/etc/log.d/conf/logfiles + mkdir -p ${D}/etc/log.d/conf/services + mkdir -p ${D}/etc/log.d/scripts/services + cp ${S}/scripts/logwatch/bacula ${D}/etc/log.d/scripts/services/bacula + cp ${S}/scripts/logwatch/logfile.bacula.conf ${D}/etc/log.d/conf/logfiles/bacula.conf + cp ${S}/scripts/logwatch/services.bacula.conf ${D}/etc/log.d/conf/services/bacula.conf + chmod 755 ${D}/etc/log.d/scripts/services/bacula + chmod 644 ${D}/etc/log.d/conf/logfiles/bacula.conf + chmod 644 ${D}/etc/log.d/conf/services/bacula.conf + + fi + + # the cdrom rescue package + mkdir -p ${D}/etc/bacula/rescue/cdrom + cp -R ${S}/rescue/linux/cdrom/* ${D}/etc/bacula/rescue/cdrom/ + mkdir ${D}/etc/bacula/rescue/cdrom/bin + cp ${S}/src/filed/static-bacula-fd ${D}/etc/bacula/rescue/cdrom/bin/bacula-fd + chmod 754 ${D}/etc/bacula/rescue/cdrom/bin/bacula-fd + + # documentation + for a in ${S}/{ChangeLog,README,ReleaseNotes,kernstodo,LICENSE,doc/latex/bacula.pdf} + do + dodoc $a + done + + dohtml -r ${S}/doc/latex/bacula + + # clean up permissions left broken by install + chmod o-r ${D}/etc/bacula/query.sql + + # remove the working dir so we can add it postinst with group + rmdir ${D}/var/bacula + + # init scripts + exeinto /etc/init.d + if use bacula-clientonly + then + newexe ${S}/platforms/gentoo/bacula-fd bacula-fd + else + if use bacula-split + then + newexe ${S}/platforms/gentoo/bacula-fd bacula-fd + newexe ${S}/platforms/gentoo/bacula-sd bacula-sd + newexe ${S}/platforms/gentoo/bacula-dir bacula-dir + else + newexe ${S}/platforms/gentoo/bacula-init bacula + fi + fi } pkg_postinst() { - # create the daemon group - HAVE_BACULA=`cat /etc/group | grep bacula 2>/dev/null` - if [ -z $HAVE_BACULA ]; then - enewgroup bacula - einfo - einfo "The group bacula has been created. Any users you add to" - einfo "this group have access to files created by the daemons." - fi - - # the working directory - install -m0750 -o root -g bacula -d ${ROOT}/var/bacula - - # link installed bacula-fd.conf into rescue directory - #ln -s /etc/bacula/bacula-fd.conf /etc/bacula/rescue/cdrom/bacula-fd.conf - # no longer necessary after 1.36.2 - - einfo - einfo "The CDRom rescue disk package has been installed into the" - einfo "/etc/bacula/rescue/cdrom/ directory. Please examine the manual" - einfo "for information on creating a rescue CD. CDR device detection" - einfo "during build has been disabled to prevent sandbox violations." - einfo "You need to examine /etc/bacula/rescue/cdrom/Makefile and adjust" - einfo "the device information for your CD recorder." - einfo - - if ! use bacula-clientonly; then - einfo - einfo "Please note either/or nature of database USE flags for" - einfo "Bacula. If mysql is set, it will be used, else postgres" - einfo "else finally SQLite. If you wish to have multiple DBs on" - einfo "one system, you may wish to unset auxillary DBs for this" - einfo "build." - einfo - - if use mysql - then - # test for an existing database - # note: this ASSUMES no password has been set for bacula database - DB_VER=`mysql 2>/dev/null bacula -e 'select * from Version;'|tail -n 1` - if [ -z "$DB_VER" ]; then - einfo "This appears to be a new install and you plan to use mysql" - einfo "for your catalog database. You should now create it by doing" - einfo "these commands:" - einfo " sh /etc/bacula/grant_mysql_privileges" - einfo " sh /etc/bacula/create_mysql_database" - einfo " sh /etc/bacula/make_mysql_tables" - elif [ "$DB_VER" -lt "8" ]; then - elinfo "This release requires an upgrade to your bacula database" - einfo "as the database format has changed. Please read the" - einfo "manual chapter for how to upgrade your database!!!" - einfo - einfo "Backup your database with the command:" - einfo " mysqldump -f --opt bacula | bzip2 > /var/bacula/bacula_backup.sql.bz" - einfo - einfo "Then update your database using the scripts found in" - einfo "/etc/bacula/updatedb/ from your current version $DB_VER to" - einfo "version 8. Note that scripts must be run in order from your" - einfo "version to the current version." - fi - fi - - if use postgres - then - # test for an existing database - # note: this ASSUMES no password has been set for bacula database - DB_VER=`echo 'select * from Version;' | psql bacula 2>/dev/null | tail -3 | head -1` - if [ -z "$DB_VER" ]; then - einfo "This appears to be a new install and you plan to use postgresql" - einfo "for your catalog database. You should now create it by doing" - einfo "these commands:" - einfo " sh /etc/bacula/create_postgresql_database" - einfo " sh /etc/bacula/make_postgresql_tables" - einfo " sh /etc/bacula/grant_postgresql_privileges" - elif [ "$DB_VER" -lt "8" ]; then - elinfo "This release requires an upgrade to your bacula database" - einfo "as the database format has changed. Please read the" - einfo "manual chapter for how to upgrade your database!!!" - einfo - einfo "Backup your database with the command:" - einfo " pg_dump bacula | bzip2 > /var/bacula/bacula_backup.sql.bz2" - einfo - einfo "Then update your database using the scripts found in" - einfo "/etc/bacula/updatedb/ from your current version $DB_VER to" - einfo "version 8. Note that scripts must be run in order from your" - einfo "version to the current version." - fi - fi - - if use sqlite - then - # test for an existing database - # note: this ASSUMES no password has been set for bacula database - DB_VER=`echo "select * from Version;" | sqlite 2>/dev/null /var/bacula/bacula.db | tail -n 1` - if [ -z "$DB_VER" ]; then - einfo "This appears to be a new install and you plan to use sqlite" - einfo "for your catalog database. You should now create it by doing" - einfo "these commands:" - einfo " sh /etc/bacula/grant_sqlite_privileges" - einfo " sh /etc/bacula/create_sqlite_database" - einfo " sh /etc/bacula/make_sqlite_tables" - elif [ "$DB_VER" -lt "8" ]; then - elinfo "This release requires an upgrade to your bacula database" - einfo "as the database format has changed. Please read the" - einfo "manual chapter for how to upgrade your database!!!" - einfo - einfo "Backup your database with the command:" - einfo " echo .dump | sqlite /var/bacula/bacula.db | bzip2 > \\" - einfo " /var/bacula/bacula_backup.sql.bz2" - einfo - einfo "Then update your database using the scripts found in" - einfo "/etc/bacula/updatedb/ from your current version $DB_VER to" - einfo "version 8. Note that scripts must be run in order from your" - einfo "version to the current version." - fi - fi - fi - - einfo - einfo "Review your configuration files in /etc/bacula and" - einfo "start the daemons:" - if use bacula-clientonly; then - einfo " /etc/init.d/bacula-fd start" - else - if use bacula-split; then - einfo " /etc/init.d/bacula-sd start" - einfo " /etc/init.d/bacula-dir start" - einfo " /etc/init.d/bacula-fd start" - einfo " or /etc/bacula/bacula will start all three." - else - einfo " /etc/init.d/bacula start" - fi - fi - einfo - einfo "You may also wish to:" - if use bacula-clientonly; then - einfo " rc-update add bacula-fd default" - else - if use bacula-split; then - einfo " rc-update add bacula-sd default" - einfo " rc-update add bacula-dir default" - einfo " rc-update add bacula-fd default" - else - einfo " rc-update add bacula default" - fi - fi - einfo + # create the daemon group + HAVE_BACULA=`cat /etc/group | grep bacula 2>/dev/null` + if [ -z $HAVE_BACULA ]; then + enewgroup bacula + einfo + einfo "The group bacula has been created. Any users you add to" + einfo "this group have access to files created by the daemons." + fi + + # the working directory + install -m0750 -o root -g bacula -d ${ROOT}/var/bacula + + # link installed bacula-fd.conf into rescue directory + #ln -s /etc/bacula/bacula-fd.conf /etc/bacula/rescue/cdrom/bacula-fd.conf + # no longer necessary after 1.36.2 + + einfo + einfo "The CDRom rescue disk package has been installed into the" + einfo "/etc/bacula/rescue/cdrom/ directory. Please examine the manual" + einfo "for information on creating a rescue CD. CDR device detection" + einfo "during build has been disabled to prevent sandbox violations." + einfo "You need to examine /etc/bacula/rescue/cdrom/Makefile and adjust" + einfo "the device information for your CD recorder." + einfo + + if ! use bacula-clientonly; then + einfo + einfo "Please note either/or nature of database USE flags for" + einfo "Bacula. If mysql is set, it will be used, else postgres" + einfo "else finally SQLite. If you wish to have multiple DBs on" + einfo "one system, you may wish to unset auxillary DBs for this" + einfo "build." + einfo + + if use mysql + then + # test for an existing database + # note: this ASSUMES no password has been set for bacula database + DB_VER=`mysql 2>/dev/null bacula -e 'select * from Version;'|tail -n 1` + if [ -z "$DB_VER" ]; then + einfo "This appears to be a new install and you plan to use mysql" + einfo "for your catalog database. You should now create it by doing" + einfo "these commands:" + einfo " sh /etc/bacula/grant_mysql_privileges" + einfo " sh /etc/bacula/create_mysql_database" + einfo " sh /etc/bacula/make_mysql_tables" + elif [ "$DB_VER" -lt "8" ]; then + elinfo "This release requires an upgrade to your bacula database" + einfo "as the database format has changed. Please read the" + einfo "manual chapter for how to upgrade your database!!!" + einfo + einfo "Backup your database with the command:" + einfo " mysqldump -f --opt bacula | bzip2 > /var/bacula/bacula_backup.sql.bz" + einfo + einfo "Then update your database using the scripts found in" + einfo "/etc/bacula/updatedb/ from your current version $DB_VER to" + einfo "version 8. Note that scripts must be run in order from your" + einfo "version to the current version." + fi + fi + + if use postgres + then + # test for an existing database + # note: this ASSUMES no password has been set for bacula database + DB_VER=`echo 'select * from Version;' | psql bacula 2>/dev/null | tail -3 | head -1` + if [ -z "$DB_VER" ]; then + einfo "This appears to be a new install and you plan to use postgresql" + einfo "for your catalog database. You should now create it by doing" + einfo "these commands:" + einfo " sh /etc/bacula/create_postgresql_database" + einfo " sh /etc/bacula/make_postgresql_tables" + einfo " sh /etc/bacula/grant_postgresql_privileges" + elif [ "$DB_VER" -lt "8" ]; then + elinfo "This release requires an upgrade to your bacula database" + einfo "as the database format has changed. Please read the" + einfo "manual chapter for how to upgrade your database!!!" + einfo + einfo "Backup your database with the command:" + einfo " pg_dump bacula | bzip2 > /var/bacula/bacula_backup.sql.bz2" + einfo + einfo "Then update your database using the scripts found in" + einfo "/etc/bacula/updatedb/ from your current version $DB_VER to" + einfo "version 8. Note that scripts must be run in order from your" + einfo "version to the current version." + fi + fi + + if use sqlite + then + # test for an existing database + # note: this ASSUMES no password has been set for bacula database + DB_VER=`echo "select * from Version;" | sqlite 2>/dev/null /var/bacula/bacula.db | tail -n 1` + if [ -z "$DB_VER" ]; then + einfo "This appears to be a new install and you plan to use sqlite" + einfo "for your catalog database. You should now create it by doing" + einfo "these commands:" + einfo " sh /etc/bacula/grant_sqlite_privileges" + einfo " sh /etc/bacula/create_sqlite_database" + einfo " sh /etc/bacula/make_sqlite_tables" + elif [ "$DB_VER" -lt "8" ]; then + elinfo "This release requires an upgrade to your bacula database" + einfo "as the database format has changed. Please read the" + einfo "manual chapter for how to upgrade your database!!!" + einfo + einfo "Backup your database with the command:" + einfo " echo .dump | sqlite /var/bacula/bacula.db | bzip2 > \\" + einfo " /var/bacula/bacula_backup.sql.bz2" + einfo + einfo "Then update your database using the scripts found in" + einfo "/etc/bacula/updatedb/ from your current version $DB_VER to" + einfo "version 8. Note that scripts must be run in order from your" + einfo "version to the current version." + fi + fi + fi + + einfo + einfo "Review your configuration files in /etc/bacula and" + einfo "start the daemons:" + if use bacula-clientonly; then + einfo " /etc/init.d/bacula-fd start" + else + if use bacula-split; then + einfo " /etc/init.d/bacula-sd start" + einfo " /etc/init.d/bacula-dir start" + einfo " /etc/init.d/bacula-fd start" + einfo " or /etc/bacula/bacula will start all three." + else + einfo " /etc/init.d/bacula start" + fi + fi + einfo + einfo "You may also wish to:" + if use bacula-clientonly; then + einfo " rc-update add bacula-fd default" + else + if use bacula-split; then + einfo " rc-update add bacula-sd default" + einfo " rc-update add bacula-dir default" + einfo " rc-update add bacula-fd default" + else + einfo " rc-update add bacula default" + fi + fi + einfo } diff --git a/bacula/platforms/hurd/Makefile.in b/bacula/platforms/hurd/Makefile.in index c8f392eea1..9f27248202 100644 --- a/bacula/platforms/hurd/Makefile.in +++ b/bacula/platforms/hurd/Makefile.in @@ -1,4 +1,7 @@ # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # This file is used as the template to create the # Makefile for the Debian GNU Hurd specific installation. # diff --git a/bacula/platforms/hurd/bacula-dir.in b/bacula/platforms/hurd/bacula-dir.in index 88c13a31a1..8c4535a4cf 100644 --- a/bacula/platforms/hurd/bacula-dir.in +++ b/bacula/platforms/hurd/bacula-dir.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Director daemon on Debian GNU Hurd systems. # @@ -47,6 +50,7 @@ if [ "x${BUSER}" != "x" ]; then fi fi +RETVAL=0 case "$1" in start) echo -n "Starting ${DESC}: " @@ -64,6 +68,7 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; *) echo "Usage: /etc/init.d/${NAME} {start|stop|restart|force-reload}" >&2 diff --git a/bacula/platforms/hurd/bacula-fd.in b/bacula/platforms/hurd/bacula-fd.in index 270950a7dd..b2578c59bf 100644 --- a/bacula/platforms/hurd/bacula-fd.in +++ b/bacula/platforms/hurd/bacula-fd.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Director daemon on Debian GNU Hurd systems. # @@ -47,6 +50,7 @@ if [ "x${BUSER}" != "x" ]; then fi fi +RETVAL=0 case "$1" in start) echo -n "Starting ${DESC}: " @@ -64,6 +68,7 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; *) echo "Usage: /etc/init.d/${NAME} {start|stop|restart|force-reload}" >&2 diff --git a/bacula/platforms/hurd/bacula-sd.in b/bacula/platforms/hurd/bacula-sd.in index ff1ad29a8d..28920782e9 100644 --- a/bacula/platforms/hurd/bacula-sd.in +++ b/bacula/platforms/hurd/bacula-sd.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Director daemon on Debian GNU Hurd systems. # @@ -47,6 +50,7 @@ if [ "x${BUSER}" != "x" ]; then fi fi +RETVAL=0 case "$1" in start) echo -n "Starting ${DESC}: " @@ -64,6 +68,7 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; *) echo "Usage: /etc/init.d/${NAME} {start|stop|restart|force-reload}" >&2 diff --git a/bacula/platforms/irix/Makefile.in b/bacula/platforms/irix/Makefile.in index 88b188b8a6..ac0250d7e5 100644 --- a/bacula/platforms/irix/Makefile.in +++ b/bacula/platforms/irix/Makefile.in @@ -1,3 +1,6 @@ +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # This file is used as the template to create the # Makefile for the Solaris specific installation. diff --git a/bacula/platforms/irix/bacula-dir.in b/bacula/platforms/irix/bacula-dir.in index af7b0c5c1a..78dde0366d 100755 --- a/bacula/platforms/irix/bacula-dir.in +++ b/bacula/platforms/irix/bacula-dir.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Director daemon # @@ -29,10 +32,11 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac -exit 0 +exit $RETVAL diff --git a/bacula/platforms/irix/bacula-fd.in b/bacula/platforms/irix/bacula-fd.in index 671eb4b0c2..678d4af14b 100755 --- a/bacula/platforms/irix/bacula-fd.in +++ b/bacula/platforms/irix/bacula-fd.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula File daemon. # @@ -9,6 +12,7 @@ # For Bacula release @VERSION@ (@DATE@) -- @DISTNAME@ # +RETVAL=0 case "$1" in 'start') echo "Starting the Bacula File daemon: " @@ -30,10 +34,11 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac -exit 0 +exit $RETVAL diff --git a/bacula/platforms/irix/bacula-sd.in b/bacula/platforms/irix/bacula-sd.in index 9f4e6f0c70..7aafe60b70 100755 --- a/bacula/platforms/irix/bacula-sd.in +++ b/bacula/platforms/irix/bacula-sd.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Storage daemon. # @@ -9,6 +12,7 @@ # For Bacula release @VERSION@ (@DATE@) -- @DISTNAME@ # +RETVAL=0 case "$1" in start) echo "Starting the Bacula Storage daemon: " @@ -28,10 +32,11 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac -exit 0 +exit $RETVAL diff --git a/bacula/platforms/mandrake/Makefile.in b/bacula/platforms/mandrake/Makefile.in index 1d43bbb9e6..7a80062f62 100644 --- a/bacula/platforms/mandrake/Makefile.in +++ b/bacula/platforms/mandrake/Makefile.in @@ -1,3 +1,6 @@ +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # This file is used as the template to create the # Makefile for the Mandrake specific installation. diff --git a/bacula/platforms/mandrake/bacula-dir.in b/bacula/platforms/mandrake/bacula-dir.in index 431244672c..e1f7bdbd01 100755 --- a/bacula/platforms/mandrake/bacula-dir.in +++ b/bacula/platforms/mandrake/bacula-dir.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Director daemon # @@ -32,6 +35,7 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; status) status @sbindir@/bacula-dir @@ -41,4 +45,4 @@ case "$1" in exit 1 ;; esac -exit 0 +exit $RETVAL diff --git a/bacula/platforms/mandrake/bacula-fd.in b/bacula/platforms/mandrake/bacula-fd.in index c447fb159f..2b7ff01a26 100755 --- a/bacula/platforms/mandrake/bacula-fd.in +++ b/bacula/platforms/mandrake/bacula-fd.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula File daemon. # @@ -12,6 +15,7 @@ # Source function library . /etc/rc.d/init.d/functions +RETVAL=0 case "$1" in start) echo -n "Starting the Bacula File daemon: " @@ -31,6 +35,7 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; status) status @sbindir@/bacula-fd @@ -40,4 +45,4 @@ case "$1" in exit 1 ;; esac -exit 0 +exit $RETVAL diff --git a/bacula/platforms/mandrake/bacula-sd.in b/bacula/platforms/mandrake/bacula-sd.in index f0144dd955..61de07b762 100755 --- a/bacula/platforms/mandrake/bacula-sd.in +++ b/bacula/platforms/mandrake/bacula-sd.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Storage daemon. # @@ -12,6 +15,7 @@ # Source function library . /etc/rc.d/init.d/functions +RETVAL=0 case "$1" in start) echo -n "Starting the Bacula Storage daemon: " @@ -31,6 +35,7 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; status) status @sbindir@/bacula-sd @@ -40,4 +45,4 @@ case "$1" in exit 1 ;; esac -exit 0 +exit $RETVAL diff --git a/bacula/platforms/mandrake/bacula.spec.bluca.in b/bacula/platforms/mandrake/bacula.spec.bluca.in index 8f596c29ed..01ac1315f3 100644 --- a/bacula/platforms/mandrake/bacula.spec.bluca.in +++ b/bacula/platforms/mandrake/bacula.spec.bluca.in @@ -20,7 +20,7 @@ Name: %{name} Version: %{version} Release: %{release} Group: Archiving/Backup -License: GPL +License: BSD 2-Clause; see file LICENSE-FOSS Source: http://www.prdownloads.sourceforge.net/bacula/%{name}-%{version}.tar.bz2 Source1: %{name}-icons.tar.bz2 BuildRoot: %{_tmppath}/%{name}-root diff --git a/bacula/platforms/openbsd/Makefile.in b/bacula/platforms/openbsd/Makefile.in index 5a84037692..d228a8b6a7 100644 --- a/bacula/platforms/openbsd/Makefile.in +++ b/bacula/platforms/openbsd/Makefile.in @@ -1,3 +1,6 @@ +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # This file is used as the template to create the # Makefile for the Solaris specific installation. diff --git a/bacula/platforms/openbsd/bacula-dir.in b/bacula/platforms/openbsd/bacula-dir.in index af7b0c5c1a..78dde0366d 100755 --- a/bacula/platforms/openbsd/bacula-dir.in +++ b/bacula/platforms/openbsd/bacula-dir.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Director daemon # @@ -29,10 +32,11 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac -exit 0 +exit $RETVAL diff --git a/bacula/platforms/openbsd/bacula-fd.in b/bacula/platforms/openbsd/bacula-fd.in index 2c41b34325..e98f7ad2d7 100755 --- a/bacula/platforms/openbsd/bacula-fd.in +++ b/bacula/platforms/openbsd/bacula-fd.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula File daemon. # @@ -9,6 +12,7 @@ # For Bacula release @VERSION@ (@DATE@) -- @DISTNAME@ # +RETVAL=0 case "$1" in start) echo "Starting the Bacula File daemon: " @@ -28,10 +32,11 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac -exit 0 +exit $RETVAL diff --git a/bacula/platforms/openbsd/bacula-sd.in b/bacula/platforms/openbsd/bacula-sd.in index 9f4e6f0c70..7aafe60b70 100755 --- a/bacula/platforms/openbsd/bacula-sd.in +++ b/bacula/platforms/openbsd/bacula-sd.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Storage daemon. # @@ -9,6 +12,7 @@ # For Bacula release @VERSION@ (@DATE@) -- @DISTNAME@ # +RETVAL=0 case "$1" in start) echo "Starting the Bacula Storage daemon: " @@ -28,10 +32,11 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac -exit 0 +exit $RETVAL diff --git a/bacula/platforms/osx/Makefile.in b/bacula/platforms/osx/Makefile.in index b0de11f813..f62e031dd3 100644 --- a/bacula/platforms/osx/Makefile.in +++ b/bacula/platforms/osx/Makefile.in @@ -1,4 +1,7 @@ # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # This is the makefile template for the platform directory # which contains general platform installation. # @@ -39,8 +42,8 @@ BACULA_FD_CONF:=/Library/Preferences/bacula/bacula-fd.conf BACULA_WORKING_DIR:=/private/var/bacula/working BACULA_PMDOC:=${WORKING_DIR}/installer.pmdoc -# Detect whether we sit inside the bacula source tree. In this case we won't -# download the tar from sourceforge but instead work with what its there +# Detect whether we sit inside the Bacula source tree. In this case we won't +# download the tar from sourceforge but instead work with what is there # already CURSUB:=$(CURDIR:%/platforms/osx=%) ifneq ($(CURDIR),$(CURSUB)) @@ -58,12 +61,18 @@ PACKAGE_RESOURCES:=ReadMe.html postflight preupgrade PACKAGE_XRESOURCES:=postflight preupgrade # Flags for the toolchain -CONFIGFLAGS:=--enable-client-only --prefix=${BACULA_PREFIX} \ - --with-dir-password=@DIR_PW@ --with-fd-password=@FD_PW@ \ - --with-sd-password=@SD_PW@ --with-mon-dir-password=@MON_DIR_PW@ \ - --with-mon-fd-password=@MON_FD_PW@ --with-mon-sd-password=@MON_SD_PW@ \ - --with-basename=@BASENAME@ --with-hostname=@HOSTNAME@ \ - --with-working-dir=${BACULA_WORKING_DIR} +CONFIGFLAGS:= \ + --enable-client-only \ + --prefix=${BACULA_PREFIX} \ + --with-dir-password=@DIR_PW@ \ + --with-fd-password=@FD_PW@ \ + --with-sd-password=@SD_PW@ \ + --with-mon-dir-password=@MON_DIR_PW@ \ + --with-mon-fd-password=@MON_FD_PW@ \ + --with-mon-sd-password=@MON_SD_PW@ \ + --with-basename=@BASENAME@ \ + --with-hostname=@HOSTNAME@ \ + --with-working-dir=${BACULA_WORKING_DIR} CPPFLAGS:=-isysroot ${MACOSX_SDK_SYSROOT} ${MACOSX_VERSION_FLAGS} CFLAGS:=-O -g ${ARCHFLAGS} CXXFLAGS:=${CFLAGS} @@ -134,8 +143,8 @@ ${BACULA_DESTDIR}: ${BACULA_SOURCE} done mkdir -p "${BACULA_DESTDIR}${BACULA_PREFIX}/Library/LaunchDaemons" - sed ${INFILE_SUBST} files/org.bacula.bacula-fd.plist.in \ - > "${BACULA_DESTDIR}${BACULA_PREFIX}/Library/LaunchDaemons/org.bacula.bacula-fd.plist" + sed ${INFILE_SUBST} files/com.baculasystems.bacula-fd.plist.in \ + > "${BACULA_DESTDIR}${BACULA_PREFIX}/Library/LaunchDaemons/com.baculasystems.bacula-fd.plist" ${BACULA_SOURCE}: ${BACULA_TAR} mkdir -p "${WORKING_DIR}" @@ -152,4 +161,3 @@ distclean: clean .PHONY: clean clean: rm -rf "${BUILD_DIR}" "${PACKAGE_DIR}" "${PACKAGE_DMG}" - diff --git a/bacula/platforms/osx/README b/bacula/platforms/osx/README index 44813d11e2..4b1391d6e1 100644 --- a/bacula/platforms/osx/README +++ b/bacula/platforms/osx/README @@ -2,10 +2,10 @@ Bacula file daemon package builder for Mac OS X =============================================== This package build script lets you download, compile and package the bacula -file daemon easily with a single command line. Beside the bacula file daemon +file daemon easily with a single command line. In addition to the Bacula file daemon the resulting installer package contains a short ReadMe file with instructions on how to install and use the software. Also a basic launchd property list is -included along with preugrade and postflight installer scripts to stop and +included along with preupgrade and postflight installer scripts to stop and restart the daemon while upgrading. To ensure the security of the users the passwords in the configuration files are generated during a first time installation and file permissions are checked and corrected on upgrades. @@ -14,7 +14,7 @@ Requirements: * Mac OS X 10.5 or later (building/packaging), 10.4 or later (deployment) * Mac OS X developer tools installed -Example (compile and create package from within bacula source tree): +Example (compile and create package from within Bacula source tree): $ ./configure --enable-client-only $ make -C platforms/osx diff --git a/bacula/platforms/redhat/Makefile.in b/bacula/platforms/redhat/Makefile.in index 0c2d5e6e85..2cd8f1d7dc 100644 --- a/bacula/platforms/redhat/Makefile.in +++ b/bacula/platforms/redhat/Makefile.in @@ -1,3 +1,6 @@ +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # This file is used as the template to create the # Makefile for the RedHat specific installation. diff --git a/bacula/platforms/redhat/bacula-dir.in b/bacula/platforms/redhat/bacula-dir.in index 06038560ea..a36d4a4615 100755 --- a/bacula/platforms/redhat/bacula-dir.in +++ b/bacula/platforms/redhat/bacula-dir.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Director daemon # @@ -12,6 +15,8 @@ # Source function library . /etc/rc.d/init.d/functions +DAEMON_OPTIONS='' +DAEMON_USER='yes' DIR_USER=@dir_user@ DIR_GROUP=@dir_group@ DIR_OPTIONS='' @@ -22,7 +27,7 @@ if [ -d "/lib/tls" -a $OS = "Linux" -a `uname -r | cut -c1-3` = "2.4" ] ; then export LD_ASSUME_KERNEL=2.4.19 fi -# pull in any user defined DIR_DIR_OPTIONS, DIR_USER, or DIR_GROUP +# pull in any user defined DIR_DIR_OPTIONS, DIR_USER, DIR_GROUP or DAEMON_USER [ -f /etc/sysconfig/bacula ] && . /etc/sysconfig/bacula # @@ -41,8 +46,18 @@ case "$1" in if [ "${DIR_GROUP}" != '' ]; then DIR_OPTIONS="${DIR_OPTIONS} -g ${DIR_GROUP}" fi + + if [ "${DAEMON_USER}" != '' -a "${DIR_USER}" != '' ]; then + DIR_OPTIONS="" + if [ "${DIR_GROUP}" != '' ]; then + chown ${DIR_USER}:${DIR_GROUP} @working_dir@/bacula-dir* 2> /dev/null + else + chown ${DIR_USER} @working_dir@/bacula-dir* 2> /dev/null + fi + DAEMON_OPTIONS="--user ${DIR_USER}" + fi echo -n "Starting Bacula Director services: " - daemon @sbindir@/bacula-dir $2 ${DIR_OPTIONS} -c @sysconfdir@/bacula-dir.conf + daemon $DAEMON_OPTIONS @sbindir@/bacula-dir $2 ${DIR_OPTIONS} -c @sysconfdir@/bacula-dir.conf RETVAL=$? echo [ $RETVAL -eq 0 ] && touch @subsysdir@/bacula-dir @@ -58,6 +73,7 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; status) status @sbindir@/bacula-dir diff --git a/bacula/platforms/redhat/bacula-fd.in b/bacula/platforms/redhat/bacula-fd.in index ba9445397c..72a897ae03 100755 --- a/bacula/platforms/redhat/bacula-fd.in +++ b/bacula/platforms/redhat/bacula-fd.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula File daemon. # @@ -12,6 +15,8 @@ # Source function library . /etc/rc.d/init.d/functions +DAEMON_OPTIONS='' +DAEMON_USER='yes' FD_USER=@fd_user@ FD_GROUP=@fd_group@ FD_OPTIONS='' @@ -41,8 +46,19 @@ case "$1" in if [ "${FD_GROUP}" != '' ]; then FD_OPTIONS="${FD_OPTIONS} -g ${FD_GROUP}" fi + + if [ "${DAEMON_USER}" != '' -a "${FD_USER}" != '' ]; then + FD_OPTIONS="" + if [ "${FD_GROUP}" != '' ]; then + chown ${FD_USER}:${FD_GROUP} @working_dir@/bacula-fd* 2> /dev/null + else + chown ${FD_USER} @working_dir@/bacula-fd* 2> /dev/null + fi + DAEMON_OPTIONS="--user ${FD_USER}" + fi + echo -n "Starting Bacula File services: " - daemon @sbindir@/bacula-fd $2 ${FD_OPTIONS} -c @sysconfdir@/bacula-fd.conf + daemon ${DAEMON_OPTIONS} @sbindir@/bacula-fd $2 ${FD_OPTIONS} -c @sysconfdir@/bacula-fd.conf RETVAL=$? echo [ $RETVAL -eq 0 ] && touch @subsysdir@/bacula-fd @@ -58,6 +74,7 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; status) status @sbindir@/bacula-fd diff --git a/bacula/platforms/redhat/bacula-sd.in b/bacula/platforms/redhat/bacula-sd.in index ab5d8732c7..d8c3440bcc 100755 --- a/bacula/platforms/redhat/bacula-sd.in +++ b/bacula/platforms/redhat/bacula-sd.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Storage daemon. # @@ -12,6 +15,8 @@ # Source function library . /etc/rc.d/init.d/functions +DAEMON_OPTIONS='' +DAEMON_USER=yes SD_USER=@sd_user@ SD_GROUP=@sd_group@ SD_OPTIONS='' @@ -22,7 +27,7 @@ if [ -d "/lib/tls" -a $OS = "Linux" -a `uname -r | cut -c1-3` = "2.4" ] ; then export LD_ASSUME_KERNEL=2.4.19 fi -# pull in any user defined SD_OPTIONS, SD_USER, or SD_GROUP +# pull in any user defined SD_OPTIONS, SD_USER, SD_GROUP or DAEMON_USER [ -f /etc/sysconfig/bacula ] && . /etc/sysconfig/bacula # @@ -41,9 +46,19 @@ case "$1" in if [ "${SD_GROUP}" != '' ]; then SD_OPTIONS="${SD_OPTIONS} -g ${SD_GROUP}" fi - + + if [ "${DAEMON_USER}" != '' -a "${SD_USER}" != '' ]; then + SD_OPTIONS="" + if [ "${SD_GROUP}" != '' ]; then + chown ${SD_USER}:${SD_GROUP} @working_dir@/bacula-sd* 2> /dev/null + else + chown ${SD_USER} @working_dir@/bacula-sd* 2> /dev/null + fi + DAEMON_OPTIONS="--user ${SD_USER}" + fi + echo -n "Starting Bacula Storage services: " - daemon @sbindir@/bacula-sd $2 ${SD_OPTIONS} -c @sysconfdir@/bacula-sd.conf + daemon $DAEMON_OPTIONS @sbindir@/bacula-sd $2 ${SD_OPTIONS} -c @sysconfdir@/bacula-sd.conf RETVAL=$? echo [ $RETVAL -eq 0 ] && touch @subsysdir@/bacula-sd @@ -59,6 +74,7 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; status) status @sbindir@/bacula-sd diff --git a/bacula/platforms/rpms/redhat/bacula-bat.spec.in b/bacula/platforms/rpms/redhat/bacula-bat.spec.in index ecfcb73f34..8c81a6e244 100644 --- a/bacula/platforms/rpms/redhat/bacula-bat.spec.in +++ b/bacula/platforms/rpms/redhat/bacula-bat.spec.in @@ -1,7 +1,9 @@ # # Bacula RPM spec file # -# Copyright (C) 2000-2014 Bacula Systems SA +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # Platform Build Configuration @@ -11,7 +13,6 @@ %define _version @VERSION@ %define depkgs_qt_version @DEPKGS_QT_VERSION@ %define product bacula -%define base_package_name %{product} # Don't strip binaries %define __os_install_post %{nil} @@ -102,6 +103,8 @@ exit 1 %define sqlite 0 %{?build_sqlite:%define sqlite 1} +%define base_package_name bacula + Summary: Bacula - The Network Backup Solution Name: %{base_package_name}-bat Version: %{_version} @@ -143,14 +146,13 @@ BuildRequires: freetype-devel %define depkgs_qt ../depkgs-qt # define the basic package description -%define blurb Bacula - The Leading Open Source Backup Solution. +%define blurb Bacula - The Network Backup Solution. %define blurb2 Bacula is a set of computer programs that permit you (or the system %define blurb3 administrator) to manage backup, recovery, and verification of computer %define blurb4 data across a network of computers of different kinds. In technical terms, %define blurb5 it is a network client/server based backup program. Bacula is relatively %define blurb6 easy to use and efficient, while offering many advanced storage management %define blurb7 features that make it easy to find and recover lost or damaged files. -%define blurb8 Bacula source code has been released under the AGPL version 3 license. %define group_file /etc/group %define groupadd /usr/sbin/groupadd @@ -167,13 +169,12 @@ Group: System Environment/Daemons %{blurb5} %{blurb6} %{blurb7} -%{blurb8} This is the Bacula Administration Tool (bat) graphical user interface package. It is an add-on to the client or server packages. # Don't strip symbols -%define debug_package %{nil} +%define debug_package %{nil} # Must explicitly enable debug pkg on SuSE # but not in opensuse_bs @@ -285,7 +286,7 @@ ln -sf consolehelper $RPM_BUILD_ROOT/usr/bin/bat %files %defattr(-,root,root) %attr(-, root, %{daemon_group}) %{_sbindir}/bat -%attr(-, root, %{daemon_group}) %dir %{sysconf_dir} +%attr(770, root, %{daemon_group}) %dir %{sysconf_dir} %attr(-, root, %{daemon_group}) %config(noreplace) %{sysconf_dir}/bat.conf %attr(-, root, %{daemon_group}) %{docs_dir}/*.html %attr(-, root, %{daemon_group}) %{docs_dir}/*.png diff --git a/bacula/platforms/rpms/redhat/bacula-client-static.spec.in b/bacula/platforms/rpms/redhat/bacula-client-static.spec.in new file mode 100644 index 0000000000..d3bff82cdb --- /dev/null +++ b/bacula/platforms/rpms/redhat/bacula-client-static.spec.in @@ -0,0 +1,286 @@ +# Bacula RPM spec file +# +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + +# Platform Build Configuration +# TODO: merge all plugins into one spec file + +# basic defines for every build +%define _release @RELEASE@ +%define _version @VERSION@ +%define product bacula +%define _packager Kern Sibbald +%define depkgs_version @DEPKGS_VERSION@ + +# Don't strip binaries +%define __os_install_post %{nil} +%define __debug_install_post %{nil} +%define debug_package %{nil} + +%define single_dir 1 +%{?single_dir_install:%define single_dir 1} + +# Installation Directory locations +%if %{single_dir} +# Installation Directory locations +%define _prefix /opt/bacula +%define _sbindir /opt/bacula/sbin +%define _bindir /opt/bacula/bin +%define _subsysdir /opt/bacula/working +%define sqlite_bindir /opt/bacula/sqlite +%define _mandir /usr/share/man +%define _man_bacula /opt/bacula/share/man/ +%define sysconf_dir /opt/bacula/etc +%define scripts_dir /opt/bacula/scripts +%define working_dir /opt/bacula/working +%define pid_dir /opt/bacula/working +%define plugin_dir /opt/bacula/plugins +%define lib_dir /opt/bacula/lib +%define script_dir /opt/bacula/scripts +%define doc_dir /opt/bacula/share/doc +%define var_dir /opt/bacula/var +%else +%define _prefix /usr +%define _sbindir %_prefix/sbin +%define _bindir %_prefix/bin +%define _subsysdir /var/lock/subsys +%define sqlite_bindir %_libdir/bacula/sqlite +%define _mandir %_prefix/share/man +%define sysconf_dir /etc/bacula +%define script_dir %_libdir/bacula +%define working_dir /var/lib/bacula +%define pid_dir /var/run +%define plugin_dir %_libdir/bacula/plugins +%define lib_dir %_libdir/bacula/lib +%endif + +#-------------------------------------------------------------------------- +# it should not be necessary to change anything below here for a release +# except for patch macros in the setup section +#-------------------------------------------------------------------------- + +%define file_daemon_user root +%define daemon_group bacula + +%define base_package_name bacula + +%{?contrib_packager:%define _packager %{contrib_packager}} + +Summary: Bacula - The Network Backup Solution +Name: %{base_package_name}-client-static +Version: %{_version} +Release: %{_release} +Group: System Environment/Daemons +License: AGPLv3 +BuildRoot: %{_tmppath}/%{name}-root +URL: http://www.baculasystems.com/ +Vendor: Bacula Project +Packager: %{_packager} +Prefix: %{_prefix} +Distribution: Bacula Static Client +Source0: https://www.baculasystems.com/dl/download/bacula-%{_version}.tar.gz + +%description +%{blurb} This is Bacula static FD package. + +# define the basic package description +%define blurb Bacula static FD - The Network Backup Solution. +%define blurb2 Bacula static FD staticly linked FD + +BuildRequires: gcc, gcc-c++, make, autoconf +BuildRequires: glibc, glibc-devel +BuildRequires: ncurses-devel, perl, readline-devel +BuildRequires: libstdc++-devel, zlib-devel +BuildRequires: libacl-devel +BuildRequires: pkgconfig + +Provides: bacula-fd +Conflicts: bacula-client + +Summary: Bacula static fd package - The Network Backup Solution +Group: System Environment/Daemons + +%prep +%setup -T -D -n bacula-%{_version} -b 0 + +%build + +cd ../bacula-%{_version} +./configure \ + --prefix=%{_prefix} \ + --sbindir=%{_sbindir} \ + --sysconfdir=%{sysconf_dir} \ + --with-scriptdir=%{scripts_dir} \ + --with-working-dir=%{working_dir} \ + --with-plugindir=%{plugin_dir} \ + --with-pid-dir=%{pid_dir} \ + --with-subsys-dir=%{_subsysdir} \ + --enable-smartalloc \ + --disable-bat \ + --enable-client-only \ + --with-basename="XXX_HOSTNAME_XXX" \ + --with-hostname="XXX_HOSTNAME_XXX" \ + --with-fd-password="XXX_REPLACE_WITH_CLIENT_PASSWORD_XXX" \ + --with-mon-fd-password="XXX_REPLACE_WITH_CLIENT_MONITOR_PASSWORD_XXX" \ + --enable-static-fd=yes \ + --enable-static-tools=yes \ + --enable-static-cons=yes \ + --without-openssl \ + --disable-libtool +make -j3 + +%install + +cwd=${PWD} +[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT" +mkdir -p $RPM_BUILD_ROOT/etc/init.d +mkdir -p $RPM_BUILD_ROOT%{_sbindir} +mkdir -p $RPM_BUILD_ROOT%{_bindir} +mkdir -p $RPM_BUILD_ROOT%{plugin_dir} +mkdir -p $RPM_BUILD_ROOT%{sysconf_dir} +mkdir -p $RPM_BUILD_ROOT%{working_dir} +mkdir -p $RPM_BUILD_ROOT/etc/logrotate.d/bacula + +cp -p platforms/redhat/bacula-fd $RPM_BUILD_ROOT/etc/init.d/static-bacula-fd +chmod 0754 $RPM_BUILD_ROOT/etc/init.d/* + +make DESTDIR=$RPM_BUILD_ROOT install + +# fix me - building enable-client-only installs files not included in bacula-client package +# Program docs not installed on client + +cp $RPM_BUILD_ROOT%{sysconf_dir}/bacula-fd.conf $RPM_BUILD_ROOT%{sysconf_dir}/static-bacula-fd.conf + +rm -f $RPM_BUILD_ROOT%{_sbindir}/bconsole +rm -f $RPM_BUILD_ROOT%{_sbindir}/bbconsjson +rm -f $RPM_BUILD_ROOT%{_sbindir}/btraceback +rm -f $RPM_BUILD_ROOT%{sysconf_dir}/mtx-changer.conf.new +rm -f $RPM_BUILD_ROOT%{sysconf_dir}/btraceback.mdb +rm -f $RPM_BUILD_ROOT%{sysconf_dir}/dvd-handler.old +rm -f $RPM_BUILD_ROOT%{sysconf_dir}/storage-ctl.conf.new +rm -f $RPM_BUILD_ROOT%{sysconf_dir}/disk-changer.old +rm -f $RPM_BUILD_ROOT%{sysconf_dir}/bacula-ctl-sd +rm -f $RPM_BUILD_ROOT%{sysconf_dir}/bconsole +rm -f $RPM_BUILD_ROOT%{sysconf_dir}/btraceback.gdb +rm -f $RPM_BUILD_ROOT%{sysconf_dir}/disk-changer +rm -f $RPM_BUILD_ROOT%{sysconf_dir}/dvd-handler +rm -f $RPM_BUILD_ROOT%{sysconf_dir}/storage-ctl +rm -f $RPM_BUILD_ROOT%{sysconf_dir}/mtx-changer +rm -f $RPM_BUILD_ROOT%{sysconf_dir}/mtx-changer.conf +rm -f $RPM_BUILD_ROOT%{sysconf_dir}/bacula-ctl-dir +rm -f $RPM_BUILD_ROOT%{sysconf_dir}/bconsole.conf.new +rm -f $RPM_BUILD_ROOT%{sysconf_dir}/storage-ctl.conf +rm -f $RPM_BUILD_ROOT%{sysconf_dir}/btraceback.dbx +rm -f $RPM_BUILD_ROOT%{sysconf_dir}/bacula-fd.conf +rm -f $RPM_BUILD_ROOT%{_bindir}/bfdjson +rm -f $RPM_BUILD_ROOT%{_bindir}/bacula +rm -f $RPM_BUILD_ROOT%{_sbindir}/bacula +rm -f $RPM_BUILD_ROOT%{_sbindir}/bacula-fd +rm -f $RPM_BUILD_ROOT%{_sbindir}/bfdjson +rm -f $RPM_BUILD_ROOT%{_man_bacula}/man1/bacula-tray-monitor.1.gz +rm -f $RPM_BUILD_ROOT%{_man_bacula}/man1/bat.1.gz +rm -f $RPM_BUILD_ROOT%{_man_bacula}/man1/bsmtp.1.gz +rm -f $RPM_BUILD_ROOT%{_man_bacula}/man8/bacula-dir.8.gz +rm -f $RPM_BUILD_ROOT%{_man_bacula}/man8/bacula-sd.8.gz +rm -f $RPM_BUILD_ROOT%{_man_bacula}/man8/bacula.8.gz +rm -f $RPM_BUILD_ROOT%{_man_bacula}/man8/bcopy.8.gz +rm -f $RPM_BUILD_ROOT%{_man_bacula}/man8/bextract.8.gz +rm -f $RPM_BUILD_ROOT%{_man_bacula}/man8/bls.8.gz +rm -f $RPM_BUILD_ROOT%{_man_bacula}/man8/bregex.8.gz +rm -f $RPM_BUILD_ROOT%{_man_bacula}/man8/bscan.8.gz +rm -f $RPM_BUILD_ROOT%{_man_bacula}/man8/btape.8.gz +rm -f $RPM_BUILD_ROOT%{_man_bacula}/man8/btraceback.8.gz +rm -f $RPM_BUILD_ROOT%{_man_bacula}/man8/bwild.8.gz +rm -f $RPM_BUILD_ROOT%{_man_bacula}/man8/dbcheck.8.gz +rm -f $RPM_BUILD_ROOT%{_man_bacula}/man1/bacula-bwxconsole.1.gz +rm -f $RPM_BUILD_ROOT%{script_dir}/bacula +rm -f $RPM_BUILD_ROOT%{script_dir}/bacula-ctl-dir +rm -f $RPM_BUILD_ROOT%{script_dir}/bacula-ctl-sd +rm -f $RPM_BUILD_ROOT%{script_dir}/bacula_config +rm -f $RPM_BUILD_ROOT%{script_dir}/bconsole +rm -f $RPM_BUILD_ROOT%{script_dir}/breload +rm -f $RPM_BUILD_ROOT%{script_dir}/btraceback.dbx +rm -f $RPM_BUILD_ROOT%{script_dir}/btraceback.gdb +rm -f $RPM_BUILD_ROOT%{script_dir}/btraceback.mdb +rm -f $RPM_BUILD_ROOT%{script_dir}/disk-changer +rm -f $RPM_BUILD_ROOT%{script_dir}/dvd-handler +rm -f $RPM_BUILD_ROOT%{script_dir}/manual_prune.pl +rm -f $RPM_BUILD_ROOT%{script_dir}/mtx-changer +rm -f $RPM_BUILD_ROOT%{script_dir}/mtx-changer.conf +rm -f $RPM_BUILD_ROOT%{script_dir}/storage-ctl +rm -f $RPM_BUILD_ROOT%{script_dir}/storage-ctl.conf +rm -f $RPM_BUILD_ROOT%{doc_dir}/bacula/ChangeLog +rm -f $RPM_BUILD_ROOT%{doc_dir}/bacula/INSTALL +rm -f $RPM_BUILD_ROOT%{doc_dir}/bacula/LICENSE +rm -f $RPM_BUILD_ROOT%{doc_dir}/bacula/README +rm -f $RPM_BUILD_ROOT%{doc_dir}/bacula/ReleaseNotes +rm -f $RPM_BUILD_ROOT%{doc_dir}/bacula/VERIFYING +rm -f $RPM_BUILD_ROOT%/opt/bacula/share/man/man1/bacula-bwxconsole.1.gz + +%files +%defattr(-,root,root) + +%attr(-, root, %{daemon_group}) %dir %{script_dir} +%attr(-, root, %{daemon_group}) %dir %{sysconf_dir} +%attr(-, root, %{daemon_group}) %dir %{working_dir} +%attr(-, root, %{daemon_group}) %{script_dir}/bacula-ctl-fd +%attr(-, root, %{daemon_group}) %dir %{plugin_dir} +%attr(-, root, %{daemon_group}) %config(noreplace) %{sysconf_dir}/static-bacula-fd.conf +%attr(-, root, %{daemon_group}) %config(noreplace) %{sysconf_dir}/bconsole.conf +%attr(-, root, %{daemon_group}) %{_sbindir}/static-bconsole +%attr(-, root, %{daemon_group}) %{_sbindir}/static-bacula-fd + +%attr(-, root, %{daemon_group}) /etc/init.d/static-bacula-fd +%attr(-, root, %{daemon_group}) %dir /etc/logrotate.d/bacula +%attr(-, root, %{daemon_group}) %{_man_bacula}/man8/bconsole.8.gz +%attr(-, root, %{daemon_group}) %{_man_bacula}/man8/bacula-fd.8.gz + +%post +# add our link + +if [ "$1" -ge 1 ] ; then + /sbin/chkconfig --add static-bacula-fd +fi + +if [ -d %{sysconf_dir} ]; then + cd %{sysconf_dir} + if [ ! -f .rpm.sed ]; then + (umask 0177 + echo "# This file is used to ensure that all passwords will" > .rpm.sed + echo "# match between configuration files" >> .rpm.sed + ) + for string in XXX_REPLACE_WITH_DIRECTOR_PASSWORD_XXX XXX_REPLACE_WITH_CLIENT_PASSWORD_XXX XXX_REPLACE_WITH_STORAGE_PASSWORD_XXX XXX_REPLACE_WITH_DIRECTOR_MONITOR_PASSWORD_XXX XXX_REPLACE_WITH_CLIENT_MONITOR_PASSWORD_XXX XXX_REPLACE_WITH_STORAGE_MONITOR_PAS\ +SWORD_XXX; do + pass=`openssl rand -base64 33` + echo "s@${string}@${pass}@g" >> .rpm.sed + done + fi + host=`hostname -s` + echo "s@XXX_HOSTNAME_XXX@${host}@g" >> .rpm.sed + for file in *.conf; do + sed -f .rpm.sed $file > $file.new + sed "s@XXX_HOSTNAME_XXX@${host}@g" $file.new > $file + rm -f $file.new + done + rm .rpm.sed + cd /tmp + cat /etc/init.d/static-bacula-fd | sed s@bacula-fd@static-bacula-fd@g > .rpm.sed + cp .rpm.sed /etc/init.d/static-bacula-fd + chmod 755 /etc/init.d/static-bacula-fd + rm .rpm.sed + cd %{sysconf_dir} +fi + +%preun +# delete our link +if [ $1 = 0 ]; then + /sbin/chkconfig --del static-bacula-fd +fi + +%clean +[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT" + +%changelog diff --git a/bacula/platforms/rpms/redhat/bacula-docs.spec.in b/bacula/platforms/rpms/redhat/bacula-docs.spec.in index 2c24b067d3..afe268234a 100644 --- a/bacula/platforms/rpms/redhat/bacula-docs.spec.in +++ b/bacula/platforms/rpms/redhat/bacula-docs.spec.in @@ -1,7 +1,6 @@ # # Bacula RPM spec file # -# Copyright (C) 2000-2014 Bacula Systems SA # Platform Build Configuration diff --git a/bacula/platforms/rpms/redhat/bacula-mtx.spec.in b/bacula/platforms/rpms/redhat/bacula-mtx.spec.in index eee1c7b431..b53067cb35 100644 --- a/bacula/platforms/rpms/redhat/bacula-mtx.spec.in +++ b/bacula/platforms/rpms/redhat/bacula-mtx.spec.in @@ -1,7 +1,10 @@ # # Bacula RPM spec file # -# Copyright (C) 2000-2014 Bacula Systems SA +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # Platform Build Configuration @@ -58,14 +61,13 @@ Distribution: Bacula Bat Source: http://www.prdownloads.sourceforge.net/bacula/depkgs-%{depkgs_version}.tar.gz # define the basic package description -%define blurb Bacula - The Leading Open Source Backup Solution. +%define blurb Bacula - The Network Backup Solution. %define blurb2 Bacula is a set of computer programs that permit you (or the system %define blurb3 administrator) to manage backup, recovery, and verification of computer %define blurb4 data across a network of computers of different kinds. In technical terms, %define blurb5 it is a network client/server based backup program. Bacula is relatively %define blurb6 easy to use and efficient, while offering many advanced storage management %define blurb7 features that make it easy to find and recover lost or damaged files. -%define blurb8 Bacula source code has been released under the AGPL version 3 license. Summary: Bacula - The Network Backup Solution Group: System Environment/Daemons @@ -79,7 +81,6 @@ Group: System Environment/Daemons %{blurb5} %{blurb6} %{blurb7} -%{blurb8} This is Bacula's version of mtx tape utilities for Linux distributions that do not provide their own mtx package diff --git a/bacula/platforms/rpms/redhat/bacula.spec.in b/bacula/platforms/rpms/redhat/bacula.spec.in index b9a16978b9..8f59a8f413 100644 --- a/bacula/platforms/rpms/redhat/bacula.spec.in +++ b/bacula/platforms/rpms/redhat/bacula.spec.in @@ -1,7 +1,5 @@ # Bacula RPM spec file # -# Copyright (C) 2000-2014 Bacula Systems SA -# # Platform Build Configuration diff --git a/bacula/platforms/rpms/suse/bacula-bat.spec.in b/bacula/platforms/rpms/suse/bacula-bat.spec.in index 62a3daee3e..33d5308e1f 100644 --- a/bacula/platforms/rpms/suse/bacula-bat.spec.in +++ b/bacula/platforms/rpms/suse/bacula-bat.spec.in @@ -1,7 +1,10 @@ # # Bacula RPM spec file # -# Copyright (C) 2000-2014 Bacula Systems SA +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # Platform Build Configuration @@ -147,14 +150,13 @@ BuildRequires: freetype-devel %define depkgs_qt ../depkgs-qt # define the basic package description -%define blurb Bacula - The Leading Open Source Backup Solution. +%define blurb Bacula - The Network Backup Solution. %define blurb2 Bacula is a set of computer programs that permit you (or the system %define blurb3 administrator) to manage backup, recovery, and verification of computer %define blurb4 data across a network of computers of different kinds. In technical terms, %define blurb5 it is a network client/server based backup program. Bacula is relatively %define blurb6 easy to use and efficient, while offering many advanced storage management %define blurb7 features that make it easy to find and recover lost or damaged files. -%define blurb8 Bacula source code has been released under the AGPL version 3 license. %define group_file /etc/group %define groupadd /usr/sbin/groupadd @@ -171,13 +173,12 @@ Group: System Environment/Daemons %{blurb5} %{blurb6} %{blurb7} -%{blurb8} This is the Bacula Administration Tool (bat) graphical user interface package. It is an add-on to the client or server packages. # Don't strip symbols -%define debug_package %{nil} +%define debug_package %{nil} # Must explicitly enable debug pkg on SuSE # but not in opensuse_bs @@ -289,7 +290,7 @@ ln -sf consolehelper $RPM_BUILD_ROOT/usr/bin/bat %files %defattr(-,root,root) %attr(-, root, %{daemon_group}) %{_sbindir}/bat -%attr(-, root, %{daemon_group}) %dir %{sysconf_dir} +%attr(770, root, %{daemon_group}) %dir %{sysconf_dir} %attr(-, root, %{daemon_group}) %config(noreplace) %{sysconf_dir}/bat.conf %attr(-, root, %{daemon_group}) %{docs_dir}/*.html %attr(-, root, %{daemon_group}) %{docs_dir}/*.png diff --git a/bacula/platforms/rpms/suse/bacula-docs.spec.in b/bacula/platforms/rpms/suse/bacula-docs.spec.in index 2c24b067d3..605b9cea7f 100644 --- a/bacula/platforms/rpms/suse/bacula-docs.spec.in +++ b/bacula/platforms/rpms/suse/bacula-docs.spec.in @@ -1,7 +1,10 @@ # # Bacula RPM spec file # -# Copyright (C) 2000-2014 Bacula Systems SA +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # Platform Build Configuration diff --git a/bacula/platforms/rpms/suse/bacula-mtx.spec.in b/bacula/platforms/rpms/suse/bacula-mtx.spec.in index eee1c7b431..b53067cb35 100644 --- a/bacula/platforms/rpms/suse/bacula-mtx.spec.in +++ b/bacula/platforms/rpms/suse/bacula-mtx.spec.in @@ -1,7 +1,10 @@ # # Bacula RPM spec file # -# Copyright (C) 2000-2014 Bacula Systems SA +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # Platform Build Configuration @@ -58,14 +61,13 @@ Distribution: Bacula Bat Source: http://www.prdownloads.sourceforge.net/bacula/depkgs-%{depkgs_version}.tar.gz # define the basic package description -%define blurb Bacula - The Leading Open Source Backup Solution. +%define blurb Bacula - The Network Backup Solution. %define blurb2 Bacula is a set of computer programs that permit you (or the system %define blurb3 administrator) to manage backup, recovery, and verification of computer %define blurb4 data across a network of computers of different kinds. In technical terms, %define blurb5 it is a network client/server based backup program. Bacula is relatively %define blurb6 easy to use and efficient, while offering many advanced storage management %define blurb7 features that make it easy to find and recover lost or damaged files. -%define blurb8 Bacula source code has been released under the AGPL version 3 license. Summary: Bacula - The Network Backup Solution Group: System Environment/Daemons @@ -79,7 +81,6 @@ Group: System Environment/Daemons %{blurb5} %{blurb6} %{blurb7} -%{blurb8} This is Bacula's version of mtx tape utilities for Linux distributions that do not provide their own mtx package diff --git a/bacula/platforms/rpms/suse/bacula.spec.in b/bacula/platforms/rpms/suse/bacula.spec.in index 792f760f36..1739c5fdc5 100644 --- a/bacula/platforms/rpms/suse/bacula.spec.in +++ b/bacula/platforms/rpms/suse/bacula.spec.in @@ -1,6 +1,9 @@ # Bacula RPM spec file # -# Copyright (C) 2000-2014 Bacula Systems SA +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # Platform Build Configuration diff --git a/bacula/platforms/slackware/Makefile.in b/bacula/platforms/slackware/Makefile.in index ecdee1b2dc..908aa548fb 100644 --- a/bacula/platforms/slackware/Makefile.in +++ b/bacula/platforms/slackware/Makefile.in @@ -1,3 +1,6 @@ +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # This file is used as the template to create the # Makefile for the Slackware specific installation. diff --git a/bacula/platforms/slackware/functions.bacula.in b/bacula/platforms/slackware/functions.bacula.in index f9ef20bb5f..dc956087a5 100644 --- a/bacula/platforms/slackware/functions.bacula.in +++ b/bacula/platforms/slackware/functions.bacula.in @@ -1,7 +1,10 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping -# the bacula daemons. +# the bacula daemons. # # This is pretty much watered down version of the RedHat script # that works on Solaris as well as Linux, but it won't work everywhere. @@ -40,17 +43,17 @@ killproc() { RC=0 # Test syntax. if [ $# = 0 ]; then - echo "Usage: killproc {program} [signal]" - return 1 + echo "Usage: killproc {program} [signal]" + return 1 fi notset=0 # check for third arg to be kill level if [ "$3" != "" ] ; then - killlevel=$3 + killlevel=$3 else - notset=1 - killlevel="-9" + notset=1 + killlevel="-9" fi # Get base program name @@ -61,39 +64,39 @@ killproc() { # Kill it. if [ "$pid" != "" ] ; then - if [ "$notset" = "1" ] ; then - if ps -p $pid>/dev/null 2>&1; then - # TERM first, then KILL if not dead - kill -TERM $pid 2>/dev/null - sleep 1 - if ps -p $pid >/dev/null 2>&1 ; then - sleep 1 - if ps -p $pid >/dev/null 2>&1 ; then - sleep 3 - if ps -p $pid >/dev/null 2>&1 ; then - kill -KILL $pid 2>/dev/null - fi - fi - fi - fi - ps -p $pid >/dev/null 2>&1 - RC=$? - [ $RC -eq 0 ] && failure "$base shutdown" || success "$base shutdown" - # RC=$((! $RC)) - # use specified level only - else - if ps -p $pid >/dev/null 2>&1; then - kill $killlevel $pid 2>/dev/null - RC=$? - [ $RC -eq 0 ] && success "$base $killlevel" || failure "$base $killlevel" - fi - fi + if [ "$notset" = "1" ] ; then + if ps -p $pid>/dev/null 2>&1; then + # TERM first, then KILL if not dead + kill -TERM $pid 2>/dev/null + sleep 1 + if ps -p $pid >/dev/null 2>&1 ; then + sleep 1 + if ps -p $pid >/dev/null 2>&1 ; then + sleep 3 + if ps -p $pid >/dev/null 2>&1 ; then + kill -KILL $pid 2>/dev/null + fi + fi + fi + fi + ps -p $pid >/dev/null 2>&1 + RC=$? + [ $RC -eq 0 ] && failure "$base shutdown" || success "$base shutdown" + # RC=$((! $RC)) + # use specified level only + else + if ps -p $pid >/dev/null 2>&1; then + kill $killlevel $pid 2>/dev/null + RC=$? + [ $RC -eq 0 ] && success "$base $killlevel" || failure "$base $killlevel" + fi + fi else - failure "$base shutdown" + failure "$base shutdown" fi # Remove pid file if any. if [ "$notset" = "1" ]; then - rm -f ${PIDDIR}/$base.$2.pid + rm -f ${PIDDIR}/$base.$2.pid fi return $RC } @@ -103,8 +106,8 @@ pidofproc() { pid="" # Test syntax. if [ $# = 0 ] ; then - echo "Usage: pidofproc {program}" - return 1 + echo "Usage: pidofproc {program}" + return 1 fi # Get base program name @@ -112,11 +115,11 @@ pidofproc() { # First try PID file if [ -f ${PIDDIR}/$base.$2.pid ] ; then - pid=`head -1 ${PIDDIR}/$base.$2.pid` - if [ "$pid" != "" ] ; then - echo $pid - return 0 - fi + pid=`head -1 ${PIDDIR}/$base.$2.pid` + if [ "$pid" != "" ] ; then + echo $pid + return 0 + fi fi # Next try "pidof" @@ -136,8 +139,8 @@ pidofproc() { status() { # Test syntax. if [ $# = 0 ] ; then - echo "Usage: status {program}" - return 1 + echo "Usage: status {program}" + return 1 fi # Get base program name @@ -152,27 +155,27 @@ status() { return 0 else pid=`${PSCMD} | awk 'BEGIN { prog=ARGV[1]; ARGC=1 } - { if ((prog == $2) || (("(" prog ")") == $2) || - (("[" prog "]") == $2) || - ((prog ":") == $2)) { print $1 ; exit 0 } }' $1` + { if ((prog == $2) || (("(" prog ")") == $2) || + (("[" prog "]") == $2) || + ((prog ":") == $2)) { print $1 ; exit 0 } }' $1` if [ "$pid" != "" ] ; then - echo "$base (pid $pid) is running..." - return 0 + echo "$base (pid $pid) is running..." + return 0 fi fi # Next try the PID files if [ -f ${PIDDIR}/$base.$2.pid ] ; then - pid=`head -1 ${PIDDIR}/$base.$2.pid` - if [ "$pid" != "" ] ; then - echo "$base not running, but pid file exists" - return 1 - fi + pid=`head -1 ${PIDDIR}/$base.$2.pid` + if [ "$pid" != "" ] ; then + echo "$base not running, but pid file exists" + return 1 + fi fi # See if the subsys lock exists if [ -f ${SUBSYSDIR}/$base ] ; then - echo "$base not running, but subsys locked" - return 2 + echo "$base not running, but subsys locked" + return 2 fi echo "$base is stopped" return 3 diff --git a/bacula/platforms/slackware/rc.bacula-dir.in b/bacula/platforms/slackware/rc.bacula-dir.in index 3a613a9e7e..8c9745bc3f 100644 --- a/bacula/platforms/slackware/rc.bacula-dir.in +++ b/bacula/platforms/slackware/rc.bacula-dir.in @@ -1,7 +1,10 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping -# the bacula Director daemon +# the bacula Director daemon # # chkconfig: 2345 92 99 # description: The Leading Open Source Backup Solution. @@ -12,42 +15,47 @@ # Source function library . /etc/rc.d/functions.bacula +RETVAL=0 case "$1" in start) - [ -x ${BACDIRBIN}/bacula-dir ] && { - sleep 2 - echo -n "Starting the Director daemon: " - OPTIONS='' - if [ "${DIR_USER}" != '' ]; then - OPTIONS="${OPTIONS} -u ${DIR_USER}" - fi + [ -x ${BACDIRBIN}/bacula-dir ] && { + sleep 2 + echo -n "Starting the Director daemon: " + OPTIONS='' + if [ "${DIR_USER}" != '' ]; then + OPTIONS="${OPTIONS} -u ${DIR_USER}" + fi - if [ "${DIR_GROUP}" != '' ]; then - OPTIONS="${OPTIONS} -g ${DIR_GROUP}" - fi + if [ "${DIR_GROUP}" != '' ]; then + OPTIONS="${OPTIONS} -g ${DIR_GROUP}" + fi - ${BACDIRBIN}/bacula-dir $2 ${OPTIONS} -v -c ${BACDIRCFG}/bacula-dir.conf - echo Done. - } - ;; + ${BACDIRBIN}/bacula-dir $2 ${OPTIONS} -v -c ${BACDIRCFG}/bacula-dir.conf + RETVAL=$? + echo Done. + } + ;; stop) - [ -x ${BACDIRBIN}/bacula-dir ] && { - echo -n "Stopping the Director daemon: " - killproc ${BACDIRBIN}/bacula-dir ${DIR_PORT} - echo Done. - } - ;; + [ -x ${BACDIRBIN}/bacula-dir ] && { + echo -n "Stopping the Director daemon: " + killproc ${BACDIRBIN}/bacula-dir ${DIR_PORT} + RETVAL=$? + echo Done. + } + ;; restart) - $0 stop - sleep 5 - $0 start - ;; + $0 stop + sleep 5 + $0 start + RETVAL=$? + ;; status) - [ -x ${BACDIRBIN}/bacula-dir ] && status ${BACDIRBIN}/bacula-dir ${DIR_PORT} - ;; + [ -x ${BACDIRBIN}/bacula-dir ] && status ${BACDIRBIN}/bacula-dir ${DIR_PORT} + RETVAL=$? + ;; *) - echo "Usage: $0 {start|stop|restart|status}" - exit 1 - ;; + echo "Usage: $0 {start|stop|restart|status}" + exit 1 + ;; esac -exit 0 +exit $RETVAL diff --git a/bacula/platforms/slackware/rc.bacula-fd.in b/bacula/platforms/slackware/rc.bacula-fd.in index 99a3c2db95..b5f0b672b2 100644 --- a/bacula/platforms/slackware/rc.bacula-fd.in +++ b/bacula/platforms/slackware/rc.bacula-fd.in @@ -1,7 +1,10 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping -# the bacula File daemon. +# the bacula File daemon. # # chkconfig: 2345 91 99 # description: The Leading Open Source Backup Solution. @@ -12,42 +15,47 @@ # Source function library . /etc/rc.d/functions.bacula +RETVAL=0 case "$1" in start) - [ -x ${BACFDBIN}/bacula-fd ] && { - sleep 2 - echo -n "Starting the File daemon: " - OPTIONS='' - if [ "${FD_USER}" != '' ]; then - OPTIONS="${OPTIONS} -u ${FD_USER}" - fi + [ -x ${BACFDBIN}/bacula-fd ] && { + sleep 2 + echo -n "Starting the File daemon: " + OPTIONS='' + if [ "${FD_USER}" != '' ]; then + OPTIONS="${OPTIONS} -u ${FD_USER}" + fi - if [ "${FD_GROUP}" != '' ]; then - OPTIONS="${OPTIONS} -g ${FD_GROUP}" - fi + if [ "${FD_GROUP}" != '' ]; then + OPTIONS="${OPTIONS} -g ${FD_GROUP}" + fi - ${BACFDBIN}/bacula-fd $2 ${OPTIONS} -v -c ${BACFDCFG}/bacula-fd.conf - echo Done. - } - ;; + ${BACFDBIN}/bacula-fd $2 ${OPTIONS} -v -c ${BACFDCFG}/bacula-fd.conf + RETVAL=$? + echo Done. + } + ;; stop) - [ -x ${BACFDBIN}/bacula-fd ] && { - echo -n "Stopping the File daemon: " - killproc ${BACFDBIN}/bacula-fd ${FD_PORT} - echo Done. - } - ;; + [ -x ${BACFDBIN}/bacula-fd ] && { + echo -n "Stopping the File daemon: " + killproc ${BACFDBIN}/bacula-fd ${FD_PORT} + RETVAL=$? + echo Done. + } + ;; restart) - $0 stop - sleep 5 - $0 start - ;; + $0 stop + sleep 5 + $0 start + RETVAL=$? + ;; status) - [ -x ${BACFDBIN}/bacula-fd ] && status ${BACFDBIN}/bacula-fd ${FD_PORT} - ;; + [ -x ${BACFDBIN}/bacula-fd ] && status ${BACFDBIN}/bacula-fd ${FD_PORT} + RETVAL=$? + ;; *) - echo "Usage: $0 {start|stop|restart|status}" - exit 1 - ;; + echo "Usage: $0 {start|stop|restart|status}" + exit 1 + ;; esac -exit 0 +exit $RETVAL diff --git a/bacula/platforms/slackware/rc.bacula-sd.in b/bacula/platforms/slackware/rc.bacula-sd.in index 9c77a6ab7e..ff7a687a22 100644 --- a/bacula/platforms/slackware/rc.bacula-sd.in +++ b/bacula/platforms/slackware/rc.bacula-sd.in @@ -1,7 +1,10 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping -# the bacula Storage daemon. +# the bacula Storage daemon. # # chkconfig: 2345 90 99 # description: The Leading Open Source Backup Solution. @@ -12,43 +15,47 @@ # Source function library . /etc/rc.d/functions.bacula +RETVAL=0 case "$1" in start) - [ -x ${BACSDBIN}/bacula-sd ] && { - sleep 2 - echo -n "Starting the Storage daemon: " - OPTIONS='' - if [ "${SD_USER}" != '' ]; then - OPTIONS="${OPTIONS} -u ${SD_USER}" - fi + [ -x ${BACSDBIN}/bacula-sd ] && { + sleep 2 + echo -n "Starting the Storage daemon: " + OPTIONS='' + if [ "${SD_USER}" != '' ]; then + OPTIONS="${OPTIONS} -u ${SD_USER}" + fi - if [ "${SD_GROUP}" != '' ]; then - OPTIONS="${OPTIONS} -g ${SD_GROUP}" - fi + if [ "${SD_GROUP}" != '' ]; then + OPTIONS="${OPTIONS} -g ${SD_GROUP}" + fi - ${BACSDBIN}/bacula-sd $2 ${OPTIONS} -v -c ${BACSDCFG}/bacula-sd.conf - echo Done. - } - ;; + ${BACSDBIN}/bacula-sd $2 ${OPTIONS} -v -c ${BACSDCFG}/bacula-sd.conf + RETVAL=$? + echo Done. + } + ;; stop) - [ -x ${BACSDBIN}/bacula-sd ] && { - echo -n "Stopping the Storage daemon: " - killproc ${BACSDBIN}/bacula-sd ${SD_PORT} - echo Done. - } - ;; + [ -x ${BACSDBIN}/bacula-sd ] && { + echo -n "Stopping the Storage daemon: " + killproc ${BACSDBIN}/bacula-sd ${SD_PORT} + RETVAL=$? + echo Done. + } + ;; restart) - $0 stop - sleep 5 - $0 start - ;; + $0 stop + sleep 5 + $0 start + RETVAL=$? + ;; status) - [ -x ${BACSDBIN}/bacula-sd ] && status ${BACSDBIN}/bacula-sd ${SD_PORT} - ;; + [ -x ${BACSDBIN}/bacula-sd ] && status ${BACSDBIN}/bacula-sd ${SD_PORT} + RETVAL=$? + ;; *) - echo "Usage: $0 {start|stop|restart|status}" - exit 1 - ;; + echo "Usage: $0 {start|stop|restart|status}" + exit 1 + ;; esac -exit 0 - +exit $RETVAL diff --git a/bacula/platforms/solaris/Makefile.in b/bacula/platforms/solaris/Makefile.in index 4347e4707b..fae0ff0c64 100644 --- a/bacula/platforms/solaris/Makefile.in +++ b/bacula/platforms/solaris/Makefile.in @@ -1,3 +1,6 @@ +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # This file is used as the template to create the # Makefile for the Solaris specific installation. @@ -12,7 +15,6 @@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DIR = $(INSTALL) -d -m 755 nothing: @@ -20,28 +22,62 @@ install: install-autostart install-autostart: install-autostart-fd install-autostart-sd install-autostart-dir -install-autostart-%: - @rm -f $(DESTDIR)/etc/rc0.d/K20bacula-$* - @rm -f $(DESTDIR)/etc/rc1.d/S99bacula-$* - @rm -f $(DESTDIR)/etc/rc2.d/S99bacula-$* - @$(INSTALL_DIR) $(DESTDIR)/etc/init.d - @$(INSTALL_DIR) $(DESTDIR)/etc/rc0.d $(DESTDIR)/etc/rc1.d \ - $(DESTDIR)/etc/rc2.d - @$(INSTALL_PROGRAM) -m 744 bacula-$* $(DESTDIR)/etc/init.d/bacula-$* + +install-autostart-fd: + @rm -f /etc/rc0.d/K20bacula-fd + @rm -f /etc/rc1.d/S99bacula-fd + @rm -f /etc/rc2.d/S99bacula-fd + @$(INSTALL_PROGRAM) -m 744 bacula-fd /etc/init.d/bacula-fd + # set symlinks for script at startup and shutdown + @ln -f -s /etc/init.d/bacula-fd /etc/rc0.d/K20bacula-fd + @ln -f -s /etc/init.d/bacula-fd /etc/rc1.d/S99bacula-fd + @ln -f -s /etc/init.d/bacula-fd /etc/rc2.d/S99bacula-fd + + +install-autostart-sd: + @rm -f /etc/rc0.d/K20bacula-sd + @rm -f /etc/rc1.d/S99bacula-sd + @rm -f /etc/rc2.d/S99bacula-sd + @$(INSTALL_PROGRAM) -m 744 bacula-sd /etc/init.d/bacula-sd # set symlinks for script at startup and shutdown - @ln -f -s /etc/init.d/bacula-$* $(DESTDIR)/etc/rc0.d/K20bacula-$* - @ln -f -s /etc/init.d/bacula-$* $(DESTDIR)/etc/rc1.d/S99bacula-$* - @ln -f -s /etc/init.d/bacula-$* $(DESTDIR)/etc/rc2.d/S99bacula-$* + @ln -f -s /etc/init.d/bacula-sd /etc/rc0.d/K20bacula-sd + @ln -f -s /etc/init.d/bacula-sd /etc/rc1.d/S99bacula-sd + @ln -f -s /etc/init.d/bacula-sd /etc/rc2.d/S99bacula-sd + + +install-autostart-dir: + @rm -f /etc/rc0.d/K20bacula-dir + @rm -f /etc/rc1.d/S99bacula-dir + @rm -f /etc/rc2.d/S99bacula-dir + @$(INSTALL_PROGRAM) -m 744 bacula-dir /etc/init.d/bacula-dir + # set symlinks for script at startup and shutdown + @ln -f -s /etc/init.d/bacula-dir /etc/rc0.d/K20bacula-dir + @ln -f -s /etc/init.d/bacula-dir /etc/rc1.d/S99bacula-dir + @ln -f -s /etc/init.d/bacula-dir /etc/rc2.d/S99bacula-dir + uninstall: uninstall-autostart uninstall-autostart: uninstall-autostart-fd uninstall-autostart-sd uninstall-autostart-dir -uninstall-autostart-%: - @rm -f $(DESTDIR)/etc/rc0.d/K20bacula-$* - @rm -f $(DESTDIR)/etc/rc1.d/S99bacula-$* - @rm -f $(DESTDIR)/etc/rc2.d/S99bacula-$* - @rm -f $(DESTDIR)/etc/init.d/bacula-$* +uninstall-autostart-fd: + @rm -f /etc/rc0.d/K20bacula-fd + @rm -f /etc/rc1.d/S99bacula-fd + @rm -f /etc/rc2.d/S99bacula-fd + @rm -f /etc/init.d/bacula-fd + + +uninstall-autostart-sd: + @rm -f /etc/rc0.d/K20bacula-sd + @rm -f /etc/rc1.d/S99bacula-sd + @rm -f /etc/rc2.d/S99bacula-sd + @rm -f /etc/init.d/bacula-sd + +uninstall-autostart-dir: + @rm -f /etc/rc0.d/K20bacula-dir + @rm -f /etc/rc1.d/S99bacula-dir + @rm -f /etc/rc2.d/S99bacula-dir + @rm -f /etc/init.d/bacula-dir clean: @rm -f 1 2 3 diff --git a/bacula/platforms/solaris/bacula-dir.in b/bacula/platforms/solaris/bacula-dir.in index 84df47ecfa..bc78e595c8 100755 --- a/bacula/platforms/solaris/bacula-dir.in +++ b/bacula/platforms/solaris/bacula-dir.in @@ -1,5 +1,8 @@ #!/bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Director daemon # @@ -15,12 +18,12 @@ DIR_OPTIONS='' case "$1" in start) if [ ! -z "${DIR_USER}" ]; then - [ -z "${DIR_OPTIONS}" ] && DIR_OPTIONS="-u ${DIR_USER}" || \ - DIR_OPTIONS="${DIR_OPTIONS} -u ${DIR_USER}" + [ -z "${DIR_OPTIONS}" ] && DIR_OPTIONS="-u ${DIR_USER}" || \ + DIR_OPTIONS="${DIR_OPTIONS} -u ${DIR_USER}" fi if [ ! -z "${DIR_GROUP}" ]; then - [ -z "${DIR_OPTIONS}" ] && DIR_OPTIONS="-g ${DIR_GROUP}" || \ - DIR_OPTIONS="${DIR_OPTIONS} -g ${DIR_GROUP}" + [ -z "${DIR_OPTIONS}" ] && DIR_OPTIONS="-g ${DIR_GROUP}" || \ + DIR_OPTIONS="${DIR_OPTIONS} -g ${DIR_GROUP}" fi echo "Starting the Bacula Director: " @@ -29,16 +32,16 @@ case "$1" in stop) echo "Stopping the Director daemon: " if [ -x /usr/bin/zonename ]; then - case `/usr/bin/zonename` in - global) - pkill -z global -x bacula-dir - ;; - *) - pkill -x bacula-dir - ;; - esac + case `/usr/bin/zonename` in + global) + pkill -z global -x bacula-dir + ;; + *) + pkill -x bacula-dir + ;; + esac else - pkill -x bacula-dir + pkill -x bacula-dir fi ;; restart) diff --git a/bacula/platforms/solaris/bacula-fd.in b/bacula/platforms/solaris/bacula-fd.in index a9eb2044b1..36fb431cfb 100755 --- a/bacula/platforms/solaris/bacula-fd.in +++ b/bacula/platforms/solaris/bacula-fd.in @@ -1,5 +1,8 @@ #!/bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula File daemon. # @@ -15,12 +18,12 @@ FD_OPTIONS='' case "$1" in start) if [ ! -z "${DIR_USER}" ]; then - [ -z "${DIR_OPTIONS}" ] && DIR_OPTIONS="-u ${DIR_USER}" || \ - DIR_OPTIONS="${DIR_OPTIONS} -u ${DIR_USER}" + [ -z "${DIR_OPTIONS}" ] && DIR_OPTIONS="-u ${DIR_USER}" || \ + DIR_OPTIONS="${DIR_OPTIONS} -u ${DIR_USER}" fi if [ ! -z "${DIR_GROUP}" ]; then - [ -z "${DIR_OPTIONS}" ] && DIR_OPTIONS="-g ${DIR_GROUP}" || \ - DIR_OPTIONS="${DIR_OPTIONS} -g ${DIR_GROUP}" + [ -z "${DIR_OPTIONS}" ] && DIR_OPTIONS="-g ${DIR_GROUP}" || \ + DIR_OPTIONS="${DIR_OPTIONS} -g ${DIR_GROUP}" fi echo "Starting the Bacula File daemon: " @@ -29,16 +32,16 @@ case "$1" in stop) echo "Stopping the Bacula File daemon: " if [ -x /usr/bin/zonename ]; then - case `/usr/bin/zonename` in - global) - pkill -z global -x bacula-fd - ;; - *) - pkill -x bacula-fd - ;; - esac + case `/usr/bin/zonename` in + global) + pkill -z global -x bacula-fd + ;; + *) + pkill -x bacula-fd + ;; + esac else - pkill -x bacula-fd + pkill -x bacula-fd fi ;; restart) diff --git a/bacula/platforms/solaris/bacula-sd.in b/bacula/platforms/solaris/bacula-sd.in index 752579e1cb..9ffff5cfe5 100755 --- a/bacula/platforms/solaris/bacula-sd.in +++ b/bacula/platforms/solaris/bacula-sd.in @@ -1,5 +1,8 @@ #!/bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Storage daemon. # @@ -15,12 +18,12 @@ SD_OPTIONS='' case "$1" in start) if [ ! -z "${DIR_USER}" ]; then - [ -z "${DIR_OPTIONS}" ] && DIR_OPTIONS="-u ${DIR_USER}" || \ - DIR_OPTIONS="${DIR_OPTIONS} -u ${DIR_USER}" + [ -z "${DIR_OPTIONS}" ] && DIR_OPTIONS="-u ${DIR_USER}" || \ + DIR_OPTIONS="${DIR_OPTIONS} -u ${DIR_USER}" fi if [ ! -z "${DIR_GROUP}" ]; then - [ -z "${DIR_OPTIONS}" ] && DIR_OPTIONS="-g ${DIR_GROUP}" || \ - DIR_OPTIONS="${DIR_OPTIONS} -g ${DIR_GROUP}" + [ -z "${DIR_OPTIONS}" ] && DIR_OPTIONS="-g ${DIR_GROUP}" || \ + DIR_OPTIONS="${DIR_OPTIONS} -g ${DIR_GROUP}" fi echo "Starting the Bacula Storage daemon: " @@ -29,16 +32,16 @@ case "$1" in stop) echo "Stopping the Bacula Storage daemon: " if [ -x /usr/bin/zonename ]; then - case `/usr/bin/zonename` in - global) - pkill -z global -x bacula-sd - ;; - *) - pkill -x bacula-sd - ;; - esac + case `/usr/bin/zonename` in + global) + pkill -z global -x bacula-sd + ;; + *) + pkill -x bacula-sd + ;; + esac else - pkill -x bacula-sd + pkill -x bacula-sd fi ;; restart) diff --git a/bacula/platforms/solaris/copyright b/bacula/platforms/solaris/copyright index 1660acf753..ee235b21cd 100644 --- a/bacula/platforms/solaris/copyright +++ b/bacula/platforms/solaris/copyright @@ -1,28 +1,18 @@ - Bacula - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 2000-2006 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from - many others, a complete list can be found in the file AUTHORS. - This program is Free Software; you can redistribute it and/or - modify it under the terms of version two of the GNU General Public - License as published by the Free Software Foundation, a copy of which - is in the LICENSE file + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. - - Bacula is a registered trademark of John Walker. - The licensor of Bacula is the Free Software Foundation Europe - (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 ZC # Added rc.status functions 3/13/2004 D. Scott Barninger # Added LSB init info 10/14/2004 D. Scott Barninger -# Added $remote_fs, add bacula specific daemon user & group Bruno Friedmann # ### BEGIN INIT INFO # Provides: bacula-dir -# Required-Start: $local_fs $remote_fs $network -# Required-Stop: $local_fs $remote_fs $network -# Default-Start: 3 5 +# Required-Start: $local_fs $network @DEFAULT_DB_TYPE@ +# Required-Stop: $local_fs $network @DEFAULT_DB_TYPE@ +# Default-Start: 3 5 # Default-Stop: 0 1 2 6 # Short-Description: bacula director # Description: Bacula network backup system director daemon @@ -31,7 +32,7 @@ RETVAL=0 case "$1" in start) echo -n "Starting the Bacula Director: " - /sbin/startproc @sbindir@/bacula-dir $2 -u @dir_user@ -g @dir_group@ -c @sysconfdir@/bacula-dir.conf + /sbin/startproc @sbindir@/bacula-dir $2 -c @sysconfdir@/bacula-dir.conf RETVAL=$? rc_status -v echo @@ -49,6 +50,7 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; status) /sbin/checkproc @sbindir@/bacula-dir diff --git a/bacula/platforms/suse/bacula-fd.in b/bacula/platforms/suse/bacula-fd.in index e8618ddf55..b1c770fca7 100755 --- a/bacula/platforms/suse/bacula-fd.in +++ b/bacula/platforms/suse/bacula-fd.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula File daemon. # @@ -7,17 +10,15 @@ # description: The Leading Open Source Backup Solution. # # For Bacula release @VERSION@ (@DATE@) -- @DISTNAME@ -# Copyright (C) 2011 Free Software Foundation Europe e.V. # Modified to work on SuSE 1/31/2004 D. Scott Barninger # Added rc.status functions 3/13/2004 D. Scott Barninger # Added LSB init info 10/14/2004 D. Scott Barninger -# Added $remote_fs, add bacula specific daemon user & group Bruno Friedmann # ### BEGIN INIT INFO # Provides: bacula-fd -# Required-Start: $local_fs $remote_fs $network -# Required-Stop: $local_fs $remote_fs $network -# Default-Start: 3 5 +# Required-Start: $local_fs $network +# Required-Stop: $local_fs $network +# Default-Start: 3 5 # Default-Stop: 0 1 2 6 # Short-Description: bacula file daemon # Description: Bacula network backup system file daemon @@ -27,10 +28,11 @@ # this gives us funtion rc_status -v to tell us if we succeed or fail . /etc/rc.status +RETVAL=0 case "$1" in start) echo -n "Starting the Bacula File daemon: " - /sbin/startproc @sbindir@/bacula-fd $2 -u @fd_user@ -g @fd_group@ -c @sysconfdir@/bacula-fd.conf + /sbin/startproc @sbindir@/bacula-fd $2 -c @sysconfdir@/bacula-fd.conf RETVAL=$? rc_status -v echo @@ -48,6 +50,7 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; status) /sbin/checkproc @sbindir@/bacula-fd diff --git a/bacula/platforms/suse/bacula-sd.in b/bacula/platforms/suse/bacula-sd.in index 7a61784d58..0444ff4934 100755 --- a/bacula/platforms/suse/bacula-sd.in +++ b/bacula/platforms/suse/bacula-sd.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Storage daemon. # @@ -7,16 +10,14 @@ # description: The Leading Open Source Backup Solution. # # For Bacula release @VERSION@ (@DATE@) -- @DISTNAME@ -# Copyright (C) 2011 Free Software Foundation Europe e.V. # Modified to work on SuSE 1/31/2004 D. Scott Barninger # Added rc.status functions 3/13/2004 D. Scott Barninger # Added LSB init info 10/14/2004 D. Scott Barninger -# Added $remote_fs, add bacula specific daemon user & group Bruno Friedmann # ### BEGIN INIT INFO # Provides: bacula-sd -# Required-Start: $local_fs $remote_fs $network -# Required-Stop: $local_fs $remote_fs $network +# Required-Start: $local_fs $network +# Required-Stop: $local_fs $network # Default-Start: 3 5 # Default-Stop: 0 1 2 6 # Short-Description: bacula storage daemon @@ -27,10 +28,11 @@ # this gives us funtion rc_status -v to tell us if we succeed or fail . /etc/rc.status +RETVAL=0 case "$1" in start) echo -n "Starting the Bacula Storage daemon: " - /sbin/startproc @sbindir@/bacula-sd $2 -u @sd_user@ -g @sd_group@ -c @sysconfdir@/bacula-sd.conf + /sbin/startproc @sbindir@/bacula-sd $2 -c @sysconfdir@/bacula-sd.conf RETVAL=$? rc_status -v echo @@ -48,6 +50,7 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; status) /sbin/checkproc @sbindir@/bacula-sd diff --git a/bacula/platforms/suse/bacula.in b/bacula/platforms/suse/bacula.in index 6907794ac2..2bd9685f25 100644 --- a/bacula/platforms/suse/bacula.in +++ b/bacula/platforms/suse/bacula.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula daemons. # diff --git a/bacula/platforms/systemd/Makefile.in b/bacula/platforms/systemd/Makefile.in index c3da39c347..37c257d275 100644 --- a/bacula/platforms/systemd/Makefile.in +++ b/bacula/platforms/systemd/Makefile.in @@ -1,4 +1,7 @@ # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # This file is used as the template to create the # Makefile for the systemd specific installation. # @@ -17,52 +20,56 @@ nothing: install: install-dir install-conf install-autostart -install-dir: $(DESTDIR)/$(SYSTEMD_UNITDIR) - mkdir -p $(DESTDIR)/$(SYSTEMD_UNITDIR) $(DESTDIR)/$(SYSTEMD_TMPFILES) +install-dir: + mkdir -p $(DESTDIR)/$(SYSTEMD_UNITDIR) $(DESTDIR)/$(SYSTEMD_TMPFILES) install-conf: - @$(INSTALL_PROGRAM) -m 644 bacula.conf $(DESTDIR)/$(SYSTEMD_TMPFILES)/bacula.conf + @$(INSTALL_PROGRAM) -m 644 bacula.conf $(DESTDIR)/$(SYSTEMD_TMPFILES)/bacula.conf install-autostart: install-autostart-fd install-autostart-sd install-autostart-dir +install-service: + @$(INSTALL_PROGRAM) -m 644 bacula-fd.service $(DESTDIR)/$(SYSTEMD_UNITDIR) + @$(INSTALL_PROGRAM) -m 644 bacula-dir.service $(DESTDIR)/$(SYSTEMD_UNITDIR) + @$(INSTALL_PROGRAM) -m 644 bacula-sd.service $(DESTDIR)/$(SYSTEMD_UNITDIR) install-autostart-fd: - @if test x$(DESTDIR) = x -a -f $(SYSTEMD_UNITDIR)/bacula-fd.service; then \ - /bin/systemctl stop bacula-fd.service; \ - /bin/systemctl disable bacula-fd.service; \ - fi - @$(INSTALL_PROGRAM) -m 644 bacula-fd.service $(DESTDIR)/$(SYSTEMD_UNITDIR)/bacula-fd.service - # set symlinks for script at startup and shutdown - @if test x$(DESTDIR) = x ; then \ - /bin/systemctl enable bacula-fd.service; \ - /bin/systemctl start bacula-fd.service; \ - fi + @if test x$(DESTDIR) = x -a -f $(SYSTEMD_UNITDIR)/bacula-fd.service; then \ + /bin/systemctl stop bacula-fd.service; \ + /bin/systemctl disable bacula-fd.service; \ + fi + @$(INSTALL_PROGRAM) -m 644 bacula-fd.service $(DESTDIR)/$(SYSTEMD_UNITDIR)/bacula-fd.service + # set symlinks for script at startup and shutdown + @if test x$(DESTDIR) = x ; then \ + /bin/systemctl enable bacula-fd.service; \ + /bin/systemctl start bacula-fd.service; \ + fi install-autostart-sd: - @if test x$(DESTDIR) = x -a -f $(SYSTEMD_UNITDIR)/bacula-sd.service; then \ - /bin/systemctl stop bacula-sd.service; \ - /bin/systemctl disable bacula-sd.service; \ - fi - @$(INSTALL_PROGRAM) -m 644 bacula-sd.service $(DESTDIR)/$(SYSTEMD_UNITDIR)/bacula-sd.service - # set symlinks for script at startup and shutdown - @if test x$(DESTDIR) = x ; then \ - /bin/systemctl enable bacula-sd.service; \ - /bin/systemctl start bacula-sd.service; \ - fi + @if test x$(DESTDIR) = x -a -f $(SYSTEMD_UNITDIR)/bacula-sd.service; then \ + /bin/systemctl stop bacula-sd.service; \ + /bin/systemctl disable bacula-sd.service; \ + fi + @$(INSTALL_PROGRAM) -m 644 bacula-sd.service $(DESTDIR)/$(SYSTEMD_UNITDIR)/bacula-sd.service + # set symlinks for script at startup and shutdown + @if test x$(DESTDIR) = x ; then \ + /bin/systemctl enable bacula-sd.service; \ + /bin/systemctl start bacula-sd.service; \ + fi install-autostart-dir: - @if test x$(DESTDIR) = x -a -f $(SYSTEMD_UNITDIR)/bacula-dir.service; then \ - /bin/systemctl stop bacula-dir.service; \ - /bin/systemctl disable bacula-dir.service; \ - fi - @$(INSTALL_PROGRAM) -m 644 bacula-dir.service $(DESTDIR)/$(SYSTEMD_UNITDIR)/bacula-dir.service - # set symlinks for script at startup and shutdown - @if test x$(DESTDIR) = x ; then \ - /bin/systemctl enable bacula-dir.service; \ - /bin/systemctl start bacula-dir.service; \ - fi + @if test x$(DESTDIR) = x -a -f $(SYSTEMD_UNITDIR)/bacula-dir.service; then \ + /bin/systemctl stop bacula-dir.service; \ + /bin/systemctl disable bacula-dir.service; \ + fi + @$(INSTALL_PROGRAM) -m 644 bacula-dir.service $(DESTDIR)/$(SYSTEMD_UNITDIR)/bacula-dir.service + # set symlinks for script at startup and shutdown + @if test x$(DESTDIR) = x ; then \ + /bin/systemctl enable bacula-dir.service; \ + /bin/systemctl start bacula-dir.service; \ + fi uninstall: uninstall-autostart uninstall-conf @@ -70,38 +77,37 @@ uninstall: uninstall-autostart uninstall-conf uninstall-autostart: uninstall-autostart-fd uninstall-autostart-sd uninstall-autostart-dir uninstall-autostart-fd: - @if test x$(DESTDIR) = x -a -f $(SYSTEMD_UNITDIR)/bacula-fd.service; then \ - /bin/systemctl stop bacula-fd.service; \ - /bin/systemctl disable bacula-fd.service; \ - fi - @rm -f $(DESTDIR)$(SYSTEMD_UNITDIR)/bacula-fd.service + @if test x$(DESTDIR) = x -a -f $(SYSTEMD_UNITDIR)/bacula-fd.service; then \ + /bin/systemctl stop bacula-fd.service; \ + /bin/systemctl disable bacula-fd.service; \ + fi + @rm -f $(DESTDIR)$(SYSTEMD_UNITDIR)/bacula-fd.service uninstall-autostart-sd: - @if test x$(DESTDIR) = x -a -f $(SYSTEMD_UNITDIR)/bacula-sd.service; then \ - /bin/systemctl stop bacula-fd.service; \ - /bin/systemctl disable bacula-fd.service; \ - fi - @rm -f $(DESTDIR)$(SYSTEMD_UNITDIR)/bacula-sd.service + @if test x$(DESTDIR) = x -a -f $(SYSTEMD_UNITDIR)/bacula-sd.service; then \ + /bin/systemctl stop bacula-fd.service; \ + /bin/systemctl disable bacula-fd.service; \ + fi + @rm -f $(DESTDIR)$(SYSTEMD_UNITDIR)/bacula-sd.service uninstall-autostart-dir: - @if test x$(DESTDIR) = x -a -f $(SYSTEMD)/bacula-dir.service; then \ - /bin/systemctl stop bacula-dir.service; \ - /bin/systemctl disable bacula-dir.service; \ - fi - @rm -f $(DESTDIR)$(SYSTEMD_UNITDIR)/bacula-dir.service + @if test x$(DESTDIR) = x -a -f $(SYSTEMD)/bacula-dir.service; then \ + /bin/systemctl stop bacula-dir.service; \ + /bin/systemctl disable bacula-dir.service; \ + fi + @rm -f $(DESTDIR)$(SYSTEMD_UNITDIR)/bacula-dir.service uninstall-conf: - @rm -f $(DESTDIR)/$(SYSTEMD_TMPFILES)/bacula.conf + @rm -f $(DESTDIR)/$(SYSTEMD_TMPFILES)/bacula.conf clean: - @rm -f 1 2 3 + @rm -f 1 2 3 distclean: clean - @rm -f Makefile bacula-*.spec bacula.*.spec bacula.spec - @rm -f bacula.conf bacula-sd.service bacula-fd.service bacula-dir.service + @rm -f Makefile bacula-*.spec bacula.*.spec bacula.spec + @rm -f bacula.conf bacula-sd.service bacula-fd.service bacula-dir.service devclean: clean - @rm -f Makefile bacula-*.spec bacula.*.spec bacula.spec - @rm -f bacula.conf bacula-sd.service bacula-fd.service bacula-dir.service - + @rm -f Makefile bacula-*.spec bacula.*.spec bacula.spec + @rm -f bacula.conf bacula-sd.service bacula-fd.service bacula-dir.service diff --git a/bacula/platforms/systemd/bacula-dir.service.in b/bacula/platforms/systemd/bacula-dir.service.in index 9a82532e29..28995ad63e 100644 --- a/bacula/platforms/systemd/bacula-dir.service.in +++ b/bacula/platforms/systemd/bacula-dir.service.in @@ -1,39 +1,35 @@ -# This file is part of package Bacula Director Daemon +# Systemd Bacula service file +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# +# /lib/systemd/system/bacula-dir.service # -# Copyright (c) 2011 Free Software Foundation Europe e.V. -# Bacula Community -# Author: Bruno Friedmann # Description: -# Used to start the bacula director daemon service (bacula-dir) -# will be installed as /lib/systemd/system/bacula-dir.service -# enable : systemctl enable bacula-dir.service -# start : systemctl start bacula-dir.service +# Used to start/stop/reload the bacula director daemon service (bacula-dir) +# +# enable : systemctl enable bacula-dir +# start : systemctl start bacula-dir # -# Bacula Director Daemon service # + +# From http://www.freedesktop.org/software/systemd/man/systemd.unit.html [Unit] Description=Bacula Director Daemon service -Alias=bacula-dir -Requires=var-run.mount nss-lookup.target network.target remote-fs.target syslog.target time-sync.target -After=var-run.mount nss-lookup.target network.target remote-fs.target syslog.target time-sync.target -# Dependency about the database -# We let administrators decide if they need it (if local db instance) -# Wants=@DEFAULT_DB_TYPE@.service -# Check if working dir exist and is a directory -ConditionPathIsDirectory=@working_dir@ -# Before= -# Conflicts= +Requires=network.target +After=network.target +RequiresMountsFor=@working_dir@ @sysconfdir@ @sbindir@ @piddir@ +# From http://www.freedesktop.org/software/systemd/man/systemd.service.html [Service] Type=forking User=@dir_user@ Group=@dir_group@ -PIDFile=@piddir@/bacula-dir.@dir_port@.pid -# EnvironmentFile=-/etc/sysconfig/bacula-dir -StandardOutput=syslog ExecStart=@sbindir@/bacula-dir -c @sysconfdir@/bacula-dir.conf -# This daemon should be able to reload the conf file -#ExecReload=/sbin/killproc -p @piddir@/bacula-dir.pid -HUP @sbindir@/bacula-dir +PIDFile=@piddir@/bacula-dir.@dir_port@.pid +ExecReload=@sbindir@/bacula-dir -t -c @sysconfdir@/bacula-dir.conf +ExecReload=/bin/kill -HUP $MAINPID +StandardError=syslog [Install] WantedBy=multi-user.target diff --git a/bacula/platforms/systemd/bacula-fd.service.in b/bacula/platforms/systemd/bacula-fd.service.in index 3efb256628..456ea1d4ce 100644 --- a/bacula/platforms/systemd/bacula-fd.service.in +++ b/bacula/platforms/systemd/bacula-fd.service.in @@ -1,31 +1,33 @@ -# This file is part of package Bacula File Daemon +# Systemd Bacula service file +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# +# /lib/systemd/system/bacula-fd.service # -# Copyright (c) 2011 Free Software Foundation Europe e.V. -# Bacula Community -# Author: Bruno Friedmann # Description: # Used to start the bacula file daemon service (bacula-fd) -# will be installed as /lib/systemd/system/bacula-fd.service -# enable : systemctl enable bacula-fd.service -# start : systemctl start bacula-fd.service # -# Bacula File Daemon service +# enable : systemctl enable bacula-fd +# start : systemctl start bacula-fd +# # + +# from http://www.freedesktop.org/software/systemd/man/systemd.unit.html [Unit] Description=Bacula File Daemon service -Requires=var-run.mount nss-lookup.target network.target remote-fs.target syslog.target time-sync.target -After=var-run.mount nss-lookup.target network.target remote-fs.target syslog.target time-sync.target -# Wants= -# Before= -# Conflicts= +Requires=network.target +After=network.target +RequiresMountsFor=@working_dir@ @sysconfdir@ @sbindir@ @piddir@ +# from http://www.freedesktop.org/software/systemd/man/systemd.service.html [Service] Type=forking User=@fd_user@ Group=@fd_group@ -PIDFile=@piddir@/bacula-fd.@fd_port@.pid -StandardOutput=syslog ExecStart=@sbindir@/bacula-fd -c @sysconfdir@/bacula-fd.conf +PIDFile=@piddir@/bacula-fd.@fd_port@.pid +StandardError=syslog [Install] WantedBy=multi-user.target diff --git a/bacula/platforms/systemd/bacula-sd.service.in b/bacula/platforms/systemd/bacula-sd.service.in index 2d4dc1a519..9663f749ac 100644 --- a/bacula/platforms/systemd/bacula-sd.service.in +++ b/bacula/platforms/systemd/bacula-sd.service.in @@ -1,32 +1,32 @@ -# This file is part of package Bacula Storage Daemon +# Systemd Bacula service file +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# +# /lib/systemd/system/bacula-sd.service # -# Copyright (c) 2011 Free Software Foundation Europe e.V. -# for Bacula Community -# Author: Bruno Friedmann # Description: # Used to start the bacula storage daemon service (bacula-sd) -# will be installed as /lib/systemd/system/bacula-sd.service -# enable : systemctl enable bacula-sd.service -# start : systemctl start bacula-sd.service +# enable : systemctl enable bacula-sd +# start : systemctl start bacula-sd # -# Bacula Storage Daemon service # + +# from http://www.freedesktop.org/software/systemd/man/systemd.unit.html [Unit] Description=Bacula Storage Daemon service -Requires=var-run.mount nss-lookup.target network.target remote-fs.target syslog.target time-sync.target -After=var-run.mount nss-lookup.target network.target remote-fs.target syslog.target time-sync.target -# Wants= -# Before= -# Conflicts= +Requires=network.target +After=network.target +RequiresMountsFor=@working_dir@ @sysconfdir@ @sbindir@ @piddir@ +# from http://www.freedesktop.org/software/systemd/man/systemd.service.html [Service] Type=forking User=@sd_user@ Group=@sd_group@ -PIDFile=@piddir@/bacula-sd.@sd_port@.pid -# EnvironmentFile=-/etc/sysconfig/bacula-sd -StandardOutput=syslog ExecStart=@sbindir@/bacula-sd -c @sysconfdir@/bacula-sd.conf +PIDFile=@piddir@/bacula-sd.@sd_port@.pid +StandardError=syslog [Install] WantedBy=multi-user.target diff --git a/bacula/platforms/systemd/bacula.conf.in b/bacula/platforms/systemd/bacula.conf.in deleted file mode 100644 index 8a8b4a6dd7..0000000000 --- a/bacula/platforms/systemd/bacula.conf.in +++ /dev/null @@ -1,2 +0,0 @@ -# See tmpfiles.d(5) for details -d @piddir@ 2775 bacula bacula - diff --git a/bacula/platforms/ubuntu/Makefile.in b/bacula/platforms/ubuntu/Makefile.in index aa77f36013..7f0aa2dc5e 100644 --- a/bacula/platforms/ubuntu/Makefile.in +++ b/bacula/platforms/ubuntu/Makefile.in @@ -1,3 +1,6 @@ +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # This file is used as the template to create the # Makefile for the Debian/Ubuntu/Kubuntu specific installation. diff --git a/bacula/platforms/ubuntu/bacula-dir.in b/bacula/platforms/ubuntu/bacula-dir.in index c7d99642ca..798d49e6b7 100644 --- a/bacula/platforms/ubuntu/bacula-dir.in +++ b/bacula/platforms/ubuntu/bacula-dir.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Director daemon on Debian/Ubuntu/Kubuntu # systems. @@ -56,6 +59,7 @@ if [ "x${BUSER}" != "x" ]; then fi fi +RETVAL=0 case "$1" in start) echo -n "Starting ${DESC}: " @@ -73,6 +77,7 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; *) echo "Usage: /etc/init.d/${NAME} {start|stop|restart|force-reload}" >&2 diff --git a/bacula/platforms/ubuntu/bacula-fd.in b/bacula/platforms/ubuntu/bacula-fd.in index 9fb7aff06b..ebdb4bfe71 100644 --- a/bacula/platforms/ubuntu/bacula-fd.in +++ b/bacula/platforms/ubuntu/bacula-fd.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Director daemon on Debian/Ubuntu/Kubuntu # systems. @@ -56,6 +59,7 @@ if [ "x${BUSER}" != "x" ]; then fi fi +RETVAL=0 case "$1" in start) echo -n "Starting ${DESC}: " @@ -73,6 +77,7 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; *) echo "Usage: /etc/init.d/${NAME} {start|stop|restart|force-reload}" >&2 diff --git a/bacula/platforms/ubuntu/bacula-sd.in b/bacula/platforms/ubuntu/bacula-sd.in index e778ea9613..16763b7e6f 100644 --- a/bacula/platforms/ubuntu/bacula-sd.in +++ b/bacula/platforms/ubuntu/bacula-sd.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula Director daemon on Debian/Ubuntu/Kubuntu # systems. @@ -56,6 +59,7 @@ if [ "x${BUSER}" != "x" ]; then fi fi +RETVAL=0 case "$1" in start) echo -n "Starting ${DESC}: " @@ -73,6 +77,7 @@ case "$1" in $0 stop sleep 5 $0 start + RETVAL=$? ;; *) echo "Usage: /etc/init.d/${NAME} {start|stop|restart|force-reload}" >&2 diff --git a/bacula/platforms/unknown/Makefile.in b/bacula/platforms/unknown/Makefile.in index 124b381fdf..519527b3f3 100644 --- a/bacula/platforms/unknown/Makefile.in +++ b/bacula/platforms/unknown/Makefile.in @@ -1,3 +1,6 @@ +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # This file is used as the template to create the # Makefile for the unknown specific installation. diff --git a/bacula/po/POTFILES.in b/bacula/po/POTFILES.in index b5e4e337f7..acb359ece7 100644 --- a/bacula/po/POTFILES.in +++ b/bacula/po/POTFILES.in @@ -2,19 +2,17 @@ # To generate this file, type 'make gen-potfiles' autoconf/acconfig.h autoconf/confdefs.h -examples/nagios/check_bacula/check_bacula.h src/baconfig.h src/bacula.h src/bc_types.h +src/cats/bdb.h src/cats/bdb_mysql.h src/cats/bdb_postgresql.h -src/cats/bdb_priv.h src/cats/bdb_sqlite.h src/cats/bvfs.h src/cats/cats.h src/cats/protos.h src/cats/sql_cmds.h -src/cats/sql_glue.h src/ch.h src/console/conio.h src/console/console_conf.h @@ -27,7 +25,9 @@ src/dird/jobq.h src/dird/protos.h src/dird/ua.h src/filed/acl.h +src/filed/backup.h src/filed/fd_plugins.h +src/filed/fd_snapshot.h src/filed/filed.h src/filed/filed_conf.h src/filed/protos.h @@ -38,12 +38,14 @@ src/filetypes.h src/findlib/bfile.h src/findlib/find.h src/findlib/protos.h +src/findlib/savecwd.h src/jcr.h src/lib/address_conf.h src/lib/alist.h src/lib/attr.h src/lib/base64.h src/lib/berrno.h +src/lib/bget_msg.h src/lib/bits.h src/lib/bmtio.h src/lib/bpipe.h @@ -65,7 +67,6 @@ src/lib/lockmgr.h src/lib/md5.h src/lib/mem_pool.h src/lib/message.h -src/lib/mntent_cache.h src/lib/mutex_list.h src/lib/openssl.h src/lib/parse_conf.h @@ -88,6 +89,7 @@ src/lib/waitq.h src/lib/watchdog.h src/lib/workq.h src/plugins/fd/fd_common.h +src/plugins/sd/sd_common.h src/qt-console/bat.h src/qt-console/bat_conf.cpp src/qt-console/bat_conf.h @@ -175,6 +177,7 @@ src/qt-console/util/comboutil.h src/qt-console/util/fmtwidgetitem.cpp src/qt-console/util/fmtwidgetitem.h src/qt-console/win32/qplatformdefs.h +src/stored/bitarray.h src/stored/block.h src/stored/bsr.h src/stored/dev.h @@ -190,5 +193,4 @@ src/stored/tape_dev.h src/stored/vol_mgr.h src/stored/vtape_dev.h src/streams.h -src/tools/assert_macro.h src/version.h diff --git a/bacula/po/bacula.pot b/bacula/po/bacula.pot index faf9132886..d023595314 100644 --- a/bacula/po/bacula.pot +++ b/bacula/po/bacula.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: bacula-devel@lists.sourceforge.net\n" -"POT-Creation-Date: 2014-07-29 18:18+0200\n" +"POT-Creation-Date: 2015-08-09 15:05+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,232 +17,237 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: src/baconfig.h:60 src/baconfig.h:61 src/baconfig.h:66 src/baconfig.h:67 +#: src/baconfig.h:64 src/baconfig.h:65 src/baconfig.h:70 src/baconfig.h:71 +#: src/baconfig.h:82 src/baconfig.h:83 #, c-format msgid "Failed ASSERT: %s\n" msgstr "" -#: src/baconfig.h:76 +#: src/baconfig.h:91 msgid "*None*" msgstr "" -#: src/lib/status.h:73 +#: src/lib/status.h:78 msgid "" "\n" "Terminated Jobs:\n" msgstr "" -#: src/lib/status.h:80 +#: src/lib/status.h:85 msgid " JobId Level Files Bytes Status Finished Name \n" msgstr "" -#: src/lib/status.h:82 +#: src/lib/status.h:87 msgid "===================================================================\n" msgstr "" -#: src/lib/status.h:102 +#: src/lib/status.h:107 msgid "Created" msgstr "" -#: src/lib/status.h:106 +#: src/lib/status.h:111 msgid "Error" msgstr "" -#: src/lib/status.h:109 +#: src/lib/status.h:114 msgid "Diffs" msgstr "" -#: src/lib/status.h:112 +#: src/lib/status.h:117 msgid "Cancel" msgstr "" -#: src/lib/status.h:115 +#: src/lib/status.h:120 msgid "OK" msgstr "" -#: src/lib/status.h:118 +#: src/lib/status.h:123 msgid "OK -- with warnings" msgstr "" -#: src/lib/status.h:122 +#: src/lib/status.h:126 +msgid "Incomplete" +msgstr "" + +#: src/lib/status.h:129 msgid "Other" msgstr "" -#: src/lib/status.h:134 +#: src/lib/status.h:141 #, c-format msgid "%6d\t%-6s\t%8s\t%10s\t%-7s\t%-8s\t%s\n" msgstr "" -#: src/lib/status.h:142 +#: src/lib/status.h:149 #, c-format msgid "%6d %-6s %8s %10s %-7s %-8s %s\n" msgstr "" -#: src/lib/status.h:171 src/lib/status.h:182 src/lib/status.h:196 -#: src/lib/status.h:200 src/lib/status.h:204 +#: src/lib/status.h:178 src/lib/status.h:189 src/lib/status.h:203 +#: src/lib/status.h:207 src/lib/status.h:211 msgid "Bacula " msgstr "" -#: src/qt-console/bat_conf.cpp:130 +#: src/qt-console/bat_conf.cpp:133 #, c-format msgid "No record for %d %s\n" msgstr "" -#: src/qt-console/bat_conf.cpp:139 +#: src/qt-console/bat_conf.cpp:142 #, c-format msgid "Director: name=%s address=%s DIRport=%d\n" msgstr "" -#: src/qt-console/bat_conf.cpp:143 +#: src/qt-console/bat_conf.cpp:146 #, c-format msgid "Console: name=%s\n" msgstr "" -#: src/qt-console/bat_conf.cpp:146 -#: src/qt-console/tray-monitor/tray_conf.cpp:183 +#: src/qt-console/bat_conf.cpp:149 +#: src/qt-console/tray-monitor/tray_conf.cpp:187 #, c-format msgid "ConsoleFont: name=%s font face=%s\n" msgstr "" -#: src/qt-console/bat_conf.cpp:150 src/qt-console/bat_conf.cpp:231 -#: src/qt-console/bat_conf.cpp:279 src/qt-console/bat_conf.cpp:309 +#: src/qt-console/bat_conf.cpp:153 src/qt-console/bat_conf.cpp:234 +#: src/qt-console/bat_conf.cpp:284 src/qt-console/bat_conf.cpp:314 #, c-format msgid "Unknown resource type %d\n" msgstr "" -#: src/qt-console/bat_conf.cpp:257 -#: src/qt-console/tray-monitor/tray_conf.cpp:276 +#: src/qt-console/bat_conf.cpp:262 +#: src/qt-console/tray-monitor/tray_conf.cpp:280 #, c-format msgid "%s item is required in %s resource, but not found.\n" msgstr "" -#: src/qt-console/bat_conf.cpp:326 -#: src/qt-console/tray-monitor/tray_conf.cpp:360 +#: src/qt-console/bat_conf.cpp:331 +#: src/qt-console/tray-monitor/tray_conf.cpp:364 #, c-format msgid "Attempt to define second %s resource named \"%s\" is not permitted.\n" msgstr "" -#: src/qt-console/bcomm/dircomm.cpp:85 +#: src/qt-console/bcomm/dircomm.cpp:89 #, c-format msgid "Already connected\"%s\".\n" msgstr "" -#: src/qt-console/bcomm/dircomm.cpp:96 -#: src/qt-console/tray-monitor/tray-monitor.cpp:347 +#: src/qt-console/bcomm/dircomm.cpp:100 +#: src/qt-console/tray-monitor/tray-monitor.cpp:353 #, c-format msgid "Connecting to Director %s:%d" msgstr "" -#: src/qt-console/bcomm/dircomm.cpp:98 +#: src/qt-console/bcomm/dircomm.cpp:102 #, c-format msgid "" "Connecting to Director %s:%d\n" "\n" msgstr "" -#: src/qt-console/bcomm/dircomm.cpp:150 +#: src/qt-console/bcomm/dircomm.cpp:154 #, c-format msgid "Failed to initialize TLS context for Console \"%s\".\n" msgstr "" -#: src/qt-console/bcomm/dircomm.cpp:173 +#: src/qt-console/bcomm/dircomm.cpp:177 #, c-format msgid "Failed to initialize TLS context for Director \"%s\".\n" msgstr "" -#: src/qt-console/bcomm/dircomm.cpp:195 -#: src/qt-console/tray-monitor/tray-monitor.cpp:352 +#: src/qt-console/bcomm/dircomm.cpp:199 +#: src/qt-console/tray-monitor/tray-monitor.cpp:358 msgid "Director daemon" msgstr "" -#: src/qt-console/bcomm/dircomm.cpp:233 +#: src/qt-console/bcomm/dircomm.cpp:237 msgid "Initializing ..." msgstr "" -#: src/qt-console/bcomm/dircomm.cpp:249 src/qt-console/console/console.cpp:130 +#: src/qt-console/bcomm/dircomm.cpp:253 src/qt-console/console/console.cpp:134 msgid "Connected" msgstr "" -#: src/qt-console/bcomm/dircomm.cpp:373 +#: src/qt-console/bcomm/dircomm.cpp:377 msgid "Command completed ..." msgstr "" -#: src/qt-console/bcomm/dircomm.cpp:380 src/qt-console/console/console.cpp:367 +#: src/qt-console/bcomm/dircomm.cpp:384 src/qt-console/console/console.cpp:371 msgid "Processing command ..." msgstr "" -#: src/qt-console/bcomm/dircomm.cpp:387 +#: src/qt-console/bcomm/dircomm.cpp:391 msgid "At main prompt waiting for input ..." msgstr "" -#: src/qt-console/bcomm/dircomm.cpp:394 src/qt-console/bcomm/dircomm.cpp:407 +#: src/qt-console/bcomm/dircomm.cpp:398 src/qt-console/bcomm/dircomm.cpp:408 msgid "At prompt waiting for input ..." msgstr "" -#: src/qt-console/bcomm/dircomm.cpp:415 +#: src/qt-console/bcomm/dircomm.cpp:416 msgid "Command failed." msgstr "" -#: src/qt-console/bcomm/dircomm.cpp:487 +#: src/qt-console/bcomm/dircomm.cpp:488 msgid "Director disconnected." msgstr "" -#: src/qt-console/bcomm/dircomm_auth.cpp:107 +#: src/qt-console/bcomm/dircomm_auth.cpp:111 #, c-format msgid "Director authorization problem at \"%s:%d\"\n" msgstr "" -#: src/qt-console/bcomm/dircomm_auth.cpp:114 +#: src/qt-console/bcomm/dircomm_auth.cpp:118 #, c-format msgid "" "Authorization problem: Remote server at \"%s:%d\" did not advertise required " "TLS support.\n" msgstr "" -#: src/qt-console/bcomm/dircomm_auth.cpp:122 +#: src/qt-console/bcomm/dircomm_auth.cpp:126 #, c-format msgid "" "Authorization problem with Director at \"%s:%d\": Remote server requires " "TLS.\n" msgstr "" -#: src/qt-console/bcomm/dircomm_auth.cpp:133 +#: src/qt-console/bcomm/dircomm_auth.cpp:137 #, c-format msgid "TLS negotiation failed with Director at \"%s:%d\"\n" msgstr "" -#: src/qt-console/bcomm/dircomm_auth.cpp:145 +#: src/qt-console/bcomm/dircomm_auth.cpp:149 #, c-format msgid "" "Bad response to Hello command: ERR=%s\n" "The Director at \"%s:%d\" is probably not running.\n" msgstr "" -#: src/qt-console/bcomm/dircomm_auth.cpp:154 +#: src/qt-console/bcomm/dircomm_auth.cpp:158 #, c-format msgid "Director at \"%s:%d\" rejected Hello command\n" msgstr "" -#: src/qt-console/bcomm/dircomm_auth.cpp:169 +#: src/qt-console/bcomm/dircomm_auth.cpp:173 #, c-format msgid "" "Authorization problem with Director at \"%s:%d\"\n" "Most likely the passwords do not agree.\n" "If you are using TLS, there may have been a certificate validation error " "during the TLS handshake.\n" -"Please see " +"For help, please see " msgstr "" -#: src/qt-console/main.cpp:154 +#: src/qt-console/main.cpp:159 msgid "Cryptography library initialization failed.\n" msgstr "" -#: src/qt-console/main.cpp:158 +#: src/qt-console/main.cpp:163 #, c-format msgid "Please correct configuration file: %s\n" msgstr "" -#: src/qt-console/main.cpp:180 +#: src/qt-console/main.cpp:187 #, c-format msgid "" "\n" @@ -257,88 +262,88 @@ msgid "" "\n" msgstr "" -#: src/qt-console/main.cpp:213 src/qt-console/main.cpp:243 +#: src/qt-console/main.cpp:220 src/qt-console/main.cpp:250 msgid "TLS required but not configured in Bacula.\n" msgstr "" -#: src/qt-console/main.cpp:221 +#: src/qt-console/main.cpp:228 #, c-format msgid "" "Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " "Director \"%s\" in %s. At least one CA certificate store is required.\n" msgstr "" -#: src/qt-console/main.cpp:230 +#: src/qt-console/main.cpp:237 #, c-format msgid "" "No Director resource defined in %s\n" "Without that I don't how to speak to the Director :-(\n" msgstr "" -#: src/qt-console/main.cpp:251 +#: src/qt-console/main.cpp:258 #, c-format msgid "" "Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " "Console \"%s\" in %s.\n" msgstr "" -#: src/qt-console/tray-monitor/authenticate.cpp:75 +#: src/qt-console/tray-monitor/authenticate.cpp:79 msgid "" "Director authorization problem.\n" "Most likely the passwords do not agree.\n" -"Please see " +"For help, please see " msgstr "" -#: src/qt-console/tray-monitor/authenticate.cpp:84 +#: src/qt-console/tray-monitor/authenticate.cpp:88 #, c-format msgid "Bad response to Hello command: ERR=%s\n" msgstr "" -#: src/qt-console/tray-monitor/authenticate.cpp:91 +#: src/qt-console/tray-monitor/authenticate.cpp:95 msgid "Director rejected Hello command\n" msgstr "" -#: src/qt-console/tray-monitor/authenticate.cpp:119 +#: src/qt-console/tray-monitor/authenticate.cpp:123 #, c-format msgid "Error sending Hello to Storage daemon. ERR=%s\n" msgstr "" -#: src/qt-console/tray-monitor/authenticate.cpp:125 +#: src/qt-console/tray-monitor/authenticate.cpp:129 msgid "" "Director and Storage daemon passwords or names not the same.\n" -"Please see " +"For help, please see " msgstr "" -#: src/qt-console/tray-monitor/authenticate.cpp:132 +#: src/qt-console/tray-monitor/authenticate.cpp:136 #, c-format msgid "bdird\n" +"Last-Translator: Kern Sibbald \n" "Language-Team: \n" -"Language: \n" +"Language: German\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: examples/nagios/check_bacula/check_bacula.c:57 -#, c-format -msgid "" -"Copyright (C) 2005 Christian Masopust\n" -"Written by Christian Masopust (2005)\n" -"\n" -"Version: " -msgstr "" - -#: src/baconfig.h:61 src/baconfig.h:62 src/baconfig.h:67 src/baconfig.h:68 -#: src/baconfig.h:79 src/baconfig.h:80 +#: src/baconfig.h:64 src/baconfig.h:65 src/baconfig.h:70 src/baconfig.h:71 +#: src/baconfig.h:82 src/baconfig.h:83 #, c-format msgid "Failed ASSERT: %s\n" msgstr "" -#: src/baconfig.h:88 src/dird/ua_dotcmds.c:1675 src/dird/ua_dotcmds.c:1683 -#: src/dird/ua_run.c:810 src/dird/ua_run.c:1863 src/dird/ua_run.c:1890 -#: src/dird/ua_run.c:1921 src/dird/ua_run.c:1948 src/dird/ua_run.c:1986 -#: src/dird/ua_select.c:622 src/dird/ua_select.c:642 src/dird/ua_update.c:364 +#: src/baconfig.h:91 msgid "*None*" msgstr "" -#: src/cats/cats.c:132 src/cats/mysql.c:408 src/cats/postgresql.c:529 -#: src/cats/postgresql.c:579 src/cats/sqlite.c:478 -#, c-format -msgid "Query failed: %s: ERR=%s\n" -msgstr "Abfrage gescheitert: %s: ERR=%s\n" - -#: src/cats/cats_null.c:30 -msgid "Please replace this null libbaccats library with a proper one.\n" -msgstr "" - -#: src/cats/mysql.c:91 -msgid "A user name for MySQL must be supplied.\n" -msgstr "Ein Benutzername für MySQL muss angegeben werden.\n" - -#: src/cats/mysql.c:178 src/cats/postgresql.c:232 src/cats/sqlite.c:177 -#, c-format -msgid "Unable to initialize DB lock. ERR=%s\n" -msgstr "Kann DB lock nicht initialisieren. ERR=%s\n" - -#: src/cats/mysql.c:221 -#, fuzzy, c-format +#: src/lib/status.h:78 msgid "" -"Unable to connect to MySQL server.\n" -"Database=%s User=%s\n" -"MySQL connect failed either server not running or your authorization is " -"incorrect.\n" +"\n" +"Terminated Jobs:\n" msgstr "" -"Kann Verbindung zu MySQL Server nicht aufbauen. \n" -"Datenbank=%s Benutzer=%s\n" -"Der Datenbankserver läuft möglicherweise nicht oder das Passwort ist nicht " -"korrekt.\n" - -#: src/cats/mysql.c:385 src/cats/postgresql.c:476 src/cats/sqlite.c:402 -#: src/dird/fd_cmds.c:926 src/dird/fd_cmds.c:987 -#, c-format -msgid "Attribute create error. %s" -msgstr "Attribute create error. %s" - -#: src/cats/postgresql.c:103 -msgid "A user name for PostgreSQL must be supplied.\n" -msgstr "Ein Benutzername für PostgreSQL muss angegeben werden.\n" - -#: src/cats/postgresql.c:187 src/cats/sql.c:336 src/cats/sql.c:343 -#: src/cats/sql_create.c:550 src/cats/sql_get.c:199 src/cats/sql_get.c:570 -#: src/cats/sql_get.c:780 src/cats/sql_get.c:1096 src/cats/sql_get.c:1468 -#, c-format -msgid "error fetching row: %s\n" -msgstr "Fehler beim holen von Zeile: %s\n" -#: src/cats/postgresql.c:203 -#, c-format -msgid "Encoding error for database \"%s\". Wanted SQL_ASCII, got %s\n" +#: src/lib/status.h:85 +msgid " JobId Level Files Bytes Status Finished Name \n" msgstr "" -#: src/cats/postgresql.c:268 -#, fuzzy, c-format -msgid "" -"Unable to connect to PostgreSQL server. Database=%s User=%s\n" -"Possible causes: SQL server not running; password incorrect; max_connections " -"exceeded.\n" +#: src/lib/status.h:87 +msgid "===================================================================\n" msgstr "" -"Kann Verbindung zu PostgreSQL Server nicht aufbauen.\n" -"Datenbank=%s Benutzer=%s\n" -"Der Datenbankserver läuft möglicherweise nicht oder das Passwort ist nicht " -"korrekt.\n" -#: src/cats/postgresql.c:372 -msgid "PQescapeStringConn returned non-zero.\n" +#: src/lib/status.h:107 +msgid "Created" msgstr "" -#: src/cats/postgresql.c:390 -msgid "PQescapeByteaConn returned NULL.\n" +#: src/lib/status.h:111 +msgid "Error" msgstr "" -#: src/cats/postgresql.c:421 -msgid "PQunescapeByteaConn returned NULL.\n" +#: src/lib/status.h:114 +msgid "Diffs" msgstr "" -#: src/cats/postgresql.c:536 -#, fuzzy, c-format -msgid "Fetch failed: ERR=%s\n" -msgstr "pthread_create: ERR=%s\n" - -#: src/cats/postgresql.c:839 -#, c-format -msgid "error fetching currval: %s\n" -msgstr "Fehler beim Holen des aktuellen Wertes: %s\n" - -#: src/cats/postgresql.c:1030 -#, fuzzy, c-format -msgid "error starting batch mode: %s" -msgstr "Fehler beim holen von Zeile: %s\n" +#: src/lib/status.h:117 +msgid "Cancel" +msgstr "" -#: src/cats/postgresql.c:1059 src/cats/postgresql.c:1066 -#, fuzzy, c-format -msgid "error ending batch mode: %s" -msgstr "Fehler beim holen von Zeile: %s\n" +#: src/lib/status.h:120 +msgid "OK" +msgstr "" -#: src/cats/postgresql.c:1115 -#, fuzzy, c-format -msgid "error copying in batch mode: %s" -msgstr "Fehler beim holen von Zeile: %s\n" +#: src/lib/status.h:123 +#, fuzzy +msgid "OK -- with warnings" +msgstr "%s OK -- mit Warnungen" -#: src/cats/sql.c:185 -#, c-format -msgid "" -"Potential performance problem:\n" -"max_connections=%d set for %s database \"%s\" should be larger than " -"Director's MaxConcurrentJobs=%d\n" +#: src/lib/status.h:126 +msgid "Incomplete" msgstr "" -#: src/cats/sql.c:229 -#, c-format -msgid "" -"query %s failed:\n" -"%s\n" +#: src/lib/status.h:129 +msgid "Other" msgstr "" -"Abfrage %s gescheitert:\n" -"%s\n" -#: src/cats/sql.c:250 +#: src/lib/status.h:141 #, c-format -msgid "" -"insert %s failed:\n" -"%s\n" +msgid "%6d\t%-6s\t%8s\t%10s\t%-7s\t%-8s\t%s\n" msgstr "" -"einfügen %s gescheitert:\n" -"%s\n" - -#: src/cats/sql.c:262 -#, c-format -msgid "Insertion problem: affected_rows=%s\n" -msgstr "Problem beim Einfügen: affected_rows=%s\n" -#: src/cats/sql.c:280 +#: src/lib/status.h:149 #, c-format -msgid "" -"update %s failed:\n" -"%s\n" +msgid "%6d %-6s %8s %10s %-7s %-8s %s\n" msgstr "" -"Aktualisierung %s gescheitert:\n" -"%s\n" -#: src/cats/sql.c:290 -#, fuzzy, c-format -msgid "Update failed: affected_rows=%s for %s\n" -msgstr "Aktualisierungsproblem: affected_rows=%s\n" +#: src/lib/status.h:178 src/lib/status.h:189 src/lib/status.h:203 +#: src/lib/status.h:207 src/lib/status.h:211 +msgid "Bacula " +msgstr "Bacula " -#: src/cats/sql.c:310 +#: src/qt-console/bat_conf.cpp:133 #, c-format -msgid "" -"delete %s failed:\n" -"%s\n" +msgid "No record for %d %s\n" msgstr "" -"löschen von %s fehlgeschlagen:\n" -"%s\n" -#: src/cats/sql.c:396 +#: src/qt-console/bat_conf.cpp:142 #, c-format -msgid "Path length is zero. File=%s\n" -msgstr "Pfadlänge ist null. Datei=%s\n" - -#: src/cats/sql.c:610 -msgid "No results to list.\n" -msgstr "Keine Ergebnisse zu \"list\" Kommando.\n" - -#: src/cats/sql.c:751 -#, fuzzy -msgid "Could not init database batch connection\n" -msgstr "Konnte Datenbank \"%s\" nicht öffen.\n" - -#: src/cats/sql.c:757 -#, fuzzy, c-format -msgid "Could not open database \"%s\": ERR=%s\n" -msgstr "Konnte Datenbank \"%s\" nicht öffen.\n" - -#: src/cats/sql.c:857 -msgid "" -"Your database is no longer functional. This is most likely due to\n" -"the fact that your Bacula Enterprise Edition period has expired.\n" -"You can continue testing by re-initializing the catalog database orcontact " -"Bacula Systems to order a subscription.\n" +msgid "Director: name=%s address=%s DIRport=%d\n" msgstr "" -#: src/cats/sql_create.c:82 -#, c-format -msgid "Create DB Job record %s failed. ERR=%s\n" -msgstr "Erzeugung von DB Job Eintrag %s fehlgeschlagen. ERR=%s\n" - -#: src/cats/sql_create.c:125 +#: src/qt-console/bat_conf.cpp:146 #, c-format -msgid "Create JobMedia record %s failed: ERR=%s\n" -msgstr "Erzeugung von JobMedia Eintrag %s fehlgeschlagen: ERR=%s\n" +msgid "Console: name=%s\n" +msgstr "" -#: src/cats/sql_create.c:134 +#: src/qt-console/bat_conf.cpp:149 +#: src/qt-console/tray-monitor/tray_conf.cpp:187 #, c-format -msgid "Update Media record %s failed: ERR=%s\n" -msgstr "Aktualisierung von Media Eintrag %s fehlgeschlagen: ERR=%s\n" +msgid "ConsoleFont: name=%s font face=%s\n" +msgstr "" -#: src/cats/sql_create.c:164 +#: src/qt-console/bat_conf.cpp:153 src/qt-console/bat_conf.cpp:234 +#: src/qt-console/bat_conf.cpp:284 src/qt-console/bat_conf.cpp:314 #, c-format -msgid "pool record %s already exists\n" -msgstr "pool Eintrag %s bereits vorhanden\n" +msgid "Unknown resource type %d\n" +msgstr "" -#: src/cats/sql_create.c:196 +#: src/qt-console/bat_conf.cpp:262 +#: src/qt-console/tray-monitor/tray_conf.cpp:280 #, c-format -msgid "Create db Pool record %s failed: ERR=%s\n" -msgstr "Erzeugung von db Pool Eintrag %s fehlgeschlagen: ERR=%s\n" +msgid "%s item is required in %s resource, but not found.\n" +msgstr "%s item wird in %s resource benötigt, wurde aber nicht gefunden.\n" -#: src/cats/sql_create.c:225 +#: src/qt-console/bat_conf.cpp:331 +#: src/qt-console/tray-monitor/tray_conf.cpp:364 #, c-format -msgid "Device record %s already exists\n" -msgstr "Device Eintrag %s bereits vorhanden\n" +msgid "Attempt to define second %s resource named \"%s\" is not permitted.\n" +msgstr "" +"Der Versuch der Definition einer zweiten %s resource mit dem Namen \"%s\" " +"ist nicht erlaubt.\n" -#: src/cats/sql_create.c:241 +#: src/qt-console/bcomm/dircomm.cpp:89 #, c-format -msgid "Create db Device record %s failed: ERR=%s\n" -msgstr "Erzeugung von db Device Eintrag %s fehlgeschlagen: ERR=%s\n" +msgid "Already connected\"%s\".\n" +msgstr "" -#: src/cats/sql_create.c:274 +#: src/qt-console/bcomm/dircomm.cpp:100 +#: src/qt-console/tray-monitor/tray-monitor.cpp:353 #, c-format -msgid "More than one Storage record!: %d\n" -msgstr "Mehr als ein Storage Eintrag!: %d\n" +msgid "Connecting to Director %s:%d" +msgstr "" -#: src/cats/sql_create.c:279 +#: src/qt-console/bcomm/dircomm.cpp:102 #, c-format -msgid "error fetching Storage row: %s\n" -msgstr "Fehler beim holen der Storage Zeile: %s\n" +msgid "" +"Connecting to Director %s:%d\n" +"\n" +msgstr "" -#: src/cats/sql_create.c:299 +#: src/qt-console/bcomm/dircomm.cpp:154 #, c-format -msgid "Create DB Storage record %s failed. ERR=%s\n" -msgstr "Erzeugung des DB Storage Eintrags %s fehlgeschlagen. ERR=%s\n" +msgid "Failed to initialize TLS context for Console \"%s\".\n" +msgstr "" -#: src/cats/sql_create.c:330 +#: src/qt-console/bcomm/dircomm.cpp:177 #, c-format -msgid "mediatype record %s already exists\n" -msgstr "Medientyp Eintrag %s bereits vorhanden\n" +msgid "Failed to initialize TLS context for Director \"%s\".\n" +msgstr "" -#: src/cats/sql_create.c:346 -#, c-format -msgid "Create db mediatype record %s failed: ERR=%s\n" -msgstr "Erzeuge db Medientyp Eintrag %s fehlgeschlagen: ERR=%s\n" +#: src/qt-console/bcomm/dircomm.cpp:199 +#: src/qt-console/tray-monitor/tray-monitor.cpp:358 +msgid "Director daemon" +msgstr "" -#: src/cats/sql_create.c:384 -#, c-format -msgid "Volume \"%s\" already exists.\n" -msgstr "Volume \"%s\" bereits vorhanden.\n" +#: src/qt-console/bcomm/dircomm.cpp:237 +msgid "Initializing ..." +msgstr "" -#: src/cats/sql_create.c:429 -#, c-format -msgid "Create DB Media record %s failed. ERR=%s\n" -msgstr "Erzeugung DB Media Eintrag %s fehlgeschlagen. ERR=%s\n" +#: src/qt-console/bcomm/dircomm.cpp:253 src/qt-console/console/console.cpp:134 +msgid "Connected" +msgstr "" -#: src/cats/sql_create.c:478 -#, c-format -msgid "More than one Client!: %d\n" -msgstr "Mehr als ein Client!: %d\n" +#: src/qt-console/bcomm/dircomm.cpp:377 +msgid "Command completed ..." +msgstr "" -#: src/cats/sql_create.c:483 -#, c-format -msgid "error fetching Client row: %s\n" -msgstr "Fehler beim holen der Client Zeile: %s\n" +#: src/qt-console/bcomm/dircomm.cpp:384 src/qt-console/console/console.cpp:371 +msgid "Processing command ..." +msgstr "" -#: src/cats/sql_create.c:510 -#, c-format -msgid "Create DB Client record %s failed. ERR=%s\n" -msgstr "Erzeugung des DB Client Eintrags %s fehlgeschlagen. ERR=%s\n" +#: src/qt-console/bcomm/dircomm.cpp:391 +msgid "At main prompt waiting for input ..." +msgstr "" -#: src/cats/sql_create.c:543 src/cats/sql_get.c:192 -#, c-format -msgid "More than one Path!: %s for path: %s\n" -msgstr "Mehr als ein Pfad!: %s für Pfad: %s\n" +#: src/qt-console/bcomm/dircomm.cpp:398 src/qt-console/bcomm/dircomm.cpp:408 +msgid "At prompt waiting for input ..." +msgstr "" -#: src/cats/sql_create.c:576 -#, c-format -msgid "Create db Path record %s failed. ERR=%s\n" -msgstr "Erzeugung des db Path Eintrags %s fehlgeschlagen. ERR=%s\n" +#: src/qt-console/bcomm/dircomm.cpp:416 +msgid "Command failed." +msgstr "" -#: src/cats/sql_create.c:621 -#, c-format -msgid "Create DB Counters record %s failed. ERR=%s\n" -msgstr "Erzeugung des DB Counters Eintrag %s fehlgeschlagen. ERR=%s\n" +#: src/qt-console/bcomm/dircomm.cpp:488 +msgid "Director disconnected." +msgstr "" -#: src/cats/sql_create.c:657 -#, c-format -msgid "More than one FileSet!: %d\n" -msgstr "Mehr als ein FileSet!: %d\n" +#: src/qt-console/bcomm/dircomm_auth.cpp:111 +#, fuzzy, c-format +msgid "Director authorization problem at \"%s:%d\"\n" +msgstr "Authorisationsproblem: FD an \"%s:%d\" erfordert TLS.\n" -#: src/cats/sql_create.c:662 -#, c-format -msgid "error fetching FileSet row: ERR=%s\n" -msgstr "Fehler beim holen der FileSet Zeile: ERR=%s\n" +#: src/qt-console/bcomm/dircomm_auth.cpp:118 +#, fuzzy, c-format +msgid "" +"Authorization problem: Remote server at \"%s:%d\" did not advertise required " +"TLS support.\n" +msgstr "" +"Authorisationsproblem: Entfernter Server hat benötigte TLS Unterstützung " +"nicht angeboten.\n" -#: src/cats/sql_create.c:692 -#, c-format -msgid "Create DB FileSet record %s failed. ERR=%s\n" -msgstr "Erzeugung des DB FileSet Eintrags %s fehlgeschlagen. ERR=%s\n" +#: src/qt-console/bcomm/dircomm_auth.cpp:126 +#, fuzzy, c-format +msgid "" +"Authorization problem with Director at \"%s:%d\": Remote server requires " +"TLS.\n" +msgstr "Authorisationsproblem: Enfernter Server erfordert TLS.\n" -#: src/cats/sql_create.c:930 -#, c-format -msgid "Create db File record %s failed. ERR=%s" -msgstr "Erzeugung des db File Eintrags %s fehlgeschlagen. ERR=%s" +#: src/qt-console/bcomm/dircomm_auth.cpp:137 +#, fuzzy, c-format +msgid "TLS negotiation failed with Director at \"%s:%d\"\n" +msgstr "TLS Aushandlung fehlgeschlagen mit SD an \"%s:%d\"\n" -#: src/cats/sql_create.c:953 +#: src/qt-console/bcomm/dircomm_auth.cpp:149 #, c-format -msgid "Attempt to put non-attributes into catalog. Stream=%d\n" -msgstr "Versuche \"non-attributes\" in catalog einzufügen. Stream=%d\n" - -#: src/cats/sql_create.c:969 -msgid "Cannot Copy/Migrate job using BaseJob.\n" -msgstr "" - -#: src/cats/sql_create.c:1069 src/cats/sql_get.c:1196 -msgid "ERR=JobIds are empty\n" +msgid "" +"Bad response to Hello command: ERR=%s\n" +"The Director at \"%s:%d\" is probably not running.\n" msgstr "" -#: src/cats/sql_create.c:1122 +#: src/qt-console/bcomm/dircomm_auth.cpp:158 #, fuzzy, c-format -msgid "Create db Object record %s failed. ERR=%s" -msgstr "Erzeugung des db File Eintrags %s fehlgeschlagen. ERR=%s" +msgid "Director at \"%s:%d\" rejected Hello command\n" +msgstr "File daemon auf \"%s:%d\" hat Hello Kommando abgelehnt\n" -#: src/cats/sql_delete.c:60 -#, c-format -msgid "No pool record %s exists\n" -msgstr "Kein pool Eintrag %s vorhanden\n" +#: src/qt-console/bcomm/dircomm_auth.cpp:173 +#, fuzzy, c-format +msgid "" +"Authorization problem with Director at \"%s:%d\"\n" +"Most likely the passwords do not agree.\n" +"If you are using TLS, there may have been a certificate validation error " +"during the TLS handshake.\n" +"For help, please see " +msgstr "" +"Kann mit File daemon on \"%s:%d\" nicht authentisieren. Mögliche Ursachen:\n" +"Passworte oder Namen nicht gleich oder\n" +"Maximum Concurrent Jobs überschritten auf dem FD oder\n" +"FD Netzwerk durcheinander (Daemon neustarten).\n" +"Für Hilfe bitte unter http://www.bacula.org/rel-manual/faq." +"html#AuthorizationErrors nachsehen.\n" -#: src/cats/sql_delete.c:65 -#, c-format -msgid "Expecting one pool record, got %d\n" -msgstr "Erwartete einen \"pool\" Eintrag, erhielt %d\n" +#: src/qt-console/main.cpp:159 +msgid "Cryptography library initialization failed.\n" +msgstr "Initialisierung der Verschlüsselungsbibliothek fehlgeschlagen.\n" -#: src/cats/sql_delete.c:71 +#: src/qt-console/main.cpp:163 #, c-format -msgid "Error fetching row %s\n" -msgstr "Fehler beim Holen der Zeile %s\n" +msgid "Please correct configuration file: %s\n" +msgstr "Bitte die Konfigurationsdatei korrigieren: %s\n" -#: src/cats/sql_find.c:84 src/cats/sql_find.c:113 src/cats/sql_find.c:167 -#, c-format +#: src/qt-console/main.cpp:187 +#, fuzzy, c-format msgid "" -"Query error for start time request: ERR=%s\n" -"CMD=%s\n" +"\n" +"Version: %s (%s) %s %s %s\n" +"\n" +"Usage: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" +" -c set configuration file to file\n" +" -dnn set debug level to nn\n" +" -s no signals\n" +" -t test - read configuration and exit\n" +" -? print this message.\n" +"\n" msgstr "" -"Fehler bei Abfrage von Startzeit: ERR=%s\n" -"CMD=%s\n" - -#: src/cats/sql_find.c:90 src/cats/sql_find.c:173 -msgid "No prior Full backup Job record found.\n" -msgstr "Keinen vorherigen \"Full backup\" Job Eintrag gefunden.\n" +"\n" +"Version: %s (%s)\n" +"\n" +"Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +" -c setze Konfigurationsdatei auf Datei\n" +" -dnn setze debug level auf nn\n" +" -f starte im Vordergrund (für debugging Zwecke)\n" +" -g groupid\n" +" -r starte jetzt\n" +" -s no signals\n" +" -t test - Konfiguration Lesen und beenden\n" +" -u userid\n" +" -v ausführliche Benutzer Meldungen\n" +" -? diese Meldung ausgeben.\n" +"\n" -#: src/cats/sql_find.c:102 -#, c-format -msgid "Unknown level=%d\n" -msgstr "Unbekannter level=%d\n" +#: src/qt-console/main.cpp:220 src/qt-console/main.cpp:250 +msgid "TLS required but not configured in Bacula.\n" +msgstr "TLS benötigt aber nicht konfiguriert in Bacula.\n" -#: src/cats/sql_find.c:119 +#: src/qt-console/main.cpp:228 #, c-format msgid "" -"No Job record found: ERR=%s\n" -"CMD=%s\n" +"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " +"Director \"%s\" in %s. At least one CA certificate store is required.\n" msgstr "" -"Kein \"Job\" Eintrag gefunden: ERR=%s\n" -"CMD=%s\n" -#: src/cats/sql_find.c:274 +#: src/qt-console/main.cpp:237 #, c-format -msgid "Unknown Job level=%d\n" -msgstr "Unbekannter Job level=%d\n" +msgid "" +"No Director resource defined in %s\n" +"Without that I don't how to speak to the Director :-(\n" +msgstr "" -#: src/cats/sql_find.c:284 +#: src/qt-console/main.cpp:258 #, c-format -msgid "No Job found for: %s.\n" -msgstr "Kein Job gefunden für: %s.\n" +msgid "" +"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " +"Console \"%s\" in %s.\n" +msgstr "" -#: src/cats/sql_find.c:295 -#, c-format -msgid "No Job found for: %s\n" -msgstr "Keinen Job gefunden für: %s\n" +#: src/qt-console/tray-monitor/authenticate.cpp:79 +#, fuzzy +msgid "" +"Director authorization problem.\n" +"Most likely the passwords do not agree.\n" +"For help, please see " +msgstr "" +"Kann mit File daemon on \"%s:%d\" nicht authentisieren. Mögliche Ursachen:\n" +"Passworte oder Namen nicht gleich oder\n" +"Maximum Concurrent Jobs überschritten auf dem FD oder\n" +"FD Netzwerk durcheinander (Daemon neustarten).\n" +"Für Hilfe bitte unter http://www.bacula.org/rel-manual/faq." +"html#AuthorizationErrors nachsehen.\n" -#: src/cats/sql_find.c:396 +#: src/qt-console/tray-monitor/authenticate.cpp:88 #, c-format -msgid "Request for Volume item %d greater than max %d or less than 1\n" +msgid "Bad response to Hello command: ERR=%s\n" msgstr "" -"Anforderung von \"Volume item\" %d größer als Max %d oder weniger als 1\n" -#: src/cats/sql_find.c:411 -#, fuzzy, c-format -msgid "No Volume record found for item %d.\n" -msgstr "Kein Volume Eintrag gefunden für item %d.\n" +#: src/qt-console/tray-monitor/authenticate.cpp:95 +msgid "Director rejected Hello command\n" +msgstr "" -#: src/cats/sql_get.c:140 +#: src/qt-console/tray-monitor/authenticate.cpp:123 #, c-format -msgid "Error fetching row: %s\n" -msgstr "Fehler beim holen der Zeile: %s\n" - -#: src/cats/sql_get.c:147 -#, fuzzy, c-format -msgid "get_file_record want 1 got rows=%d PathId=%s Filename=%s\n" -msgstr "get_file_record erwartet 1 erhalten rows=%d\n" - -#: src/cats/sql_get.c:155 -#, fuzzy, c-format -msgid "File record for PathId=%s Filename=%s not found.\n" -msgstr "File Eintrag für PathId=%s FilenameId=%s nicht gefunden.\n" - -#: src/cats/sql_get.c:161 -msgid "File record not found in Catalog.\n" -msgstr "File Eintrag nicht im Catalog gefunden.\n" +msgid "Error sending Hello to Storage daemon. ERR=%s\n" +msgstr "Fehler beim senden von \"Hello\" an Storage daemon. ERR=%s\n" -#: src/cats/sql_get.c:203 -#, c-format -msgid "Get DB path record %s found bad record: %s\n" -msgstr "Get DB path record %s fehlerhaften Eintrag gefunden: %s\n" +#: src/qt-console/tray-monitor/authenticate.cpp:129 +#, fuzzy +msgid "" +"Director and Storage daemon passwords or names not the same.\n" +"For help, please see " +msgstr "Director und Storage daemon Passworte or Namen nicht gleich.\n" -#: src/cats/sql_get.c:216 +#: src/qt-console/tray-monitor/authenticate.cpp:136 #, c-format -msgid "Path record: %s not found.\n" -msgstr "Path record: %s nicht gefunden.\n" +msgid "bdird set configuration file to file\n" +" -d set debug level to \n" +" -dt print timestamp in debug output\n" +" -t test - read configuration and exit\n" +" -? print this message.\n" +"\n" +msgstr "" +"\n" +"Version: %s (%s)\n" +"\n" +"Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +" -c setze Konfigurationsdatei auf Datei\n" +" -dnn setze debug level auf nn\n" +" -f starte im Vordergrund (für debugging Zwecke)\n" +" -g groupid\n" +" -r starte jetzt\n" +" -s no signals\n" +" -t test - Konfiguration Lesen und beenden\n" +" -u userid\n" +" -v ausführliche Benutzer Meldungen\n" +" -? diese Meldung ausgeben.\n" +"\n" + +#: src/qt-console/tray-monitor/tray-monitor.cpp:210 #, c-format -msgid "No Volume for JobId %d found in Catalog.\n" -msgstr "Kein Volume für JobId %d in Catalog gefunden.\n" +msgid "" +"Error: %d Monitor resources defined in %s. You must define one and only one " +"Monitor resource.\n" +msgstr "" + +#: src/qt-console/tray-monitor/tray-monitor.cpp:242 +#, fuzzy, c-format +msgid "" +"No Client, Storage or Director resource defined in %s\n" +"Without that I don't how to get status from the File, Storage or Director " +"Daemon :-(\n" +msgstr "" +"Keine Director resource definiert in %s\n" +"Ohne dies weiss ich nicht wer ich bin :-(\n" -#: src/cats/sql_get.c:489 +#: src/qt-console/tray-monitor/tray-monitor.cpp:257 #, c-format -msgid "Pool id select failed: ERR=%s\n" -msgstr "Pool id select fehlgeschlagen: ERR=%s\n" +msgid "" +"Invalid refresh interval defined in %s\n" +"This value must be greater or equal to 1 second and less or equal to 10 " +"minutes (read value: %d).\n" +msgstr "" -#: src/cats/sql_get.c:526 +#: src/qt-console/tray-monitor/tray-monitor.cpp:325 #, c-format -msgid "Client id select failed: ERR=%s\n" -msgstr "Client id select fehlgeschlagen: ERR=%s\n" +msgid "Error, currentitem is not a Client or a Storage..\n" +msgstr "" -#: src/cats/sql_get.c:565 -#, fuzzy, c-format -msgid "More than one Pool! Num=%s\n" -msgstr "Mehr als ein Pool!: %s\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:363 +#, c-format +msgid "Connecting to Client %s:%d" +msgstr "" -#: src/cats/sql_get.c:628 -msgid "Pool record not found in Catalog.\n" -msgstr "Pool Eintrag in Catalog nicht gefunden.\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:368 +msgid "File daemon" +msgstr "File daemon" -#: src/cats/sql_get.c:691 +#: src/qt-console/tray-monitor/tray-monitor.cpp:373 #, fuzzy, c-format -msgid "Error got %s RestoreObjects but expected only one!\n" -msgstr "Fehler erhalten %s FileSets aber nur einen erwartet!\n" +msgid "Connecting to Storage %s:%d" +msgstr "Storage daemon" -#: src/cats/sql_get.c:696 -#, fuzzy, c-format -msgid "RestoreObject record \"%d\" not found.\n" -msgstr "FileSet Eintrag \"%s\" nicht gefunden\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:378 +msgid "Storage daemon" +msgstr "Storage daemon" -#: src/cats/sql_get.c:721 src/dird/ua_run.c:703 +#: src/qt-console/tray-monitor/tray-monitor.cpp:382 +#: src/qt-console/tray-monitor/tray-monitor.cpp:412 #, c-format -msgid "Decompression failed. Len wanted=%d got=%d. Object=%s\n" +msgid "Error, currentitem is not a Client, a Storage or a Director..\n" msgstr "" -#: src/cats/sql_get.c:739 -#, fuzzy -msgid "RestoreObject record not found in Catalog.\n" -msgstr "FileSet Eintrag in Catalog nicht gefunden.\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:387 +msgid "Cannot connect to daemon." +msgstr "" -#: src/cats/sql_get.c:775 +#: src/qt-console/tray-monitor/tray-monitor.cpp:396 #, c-format -msgid "More than one Client!: %s\n" -msgstr "Mehr als ein Client!: %s\n" +msgid "Authentication error : %s" +msgstr "" -#: src/cats/sql_get.c:792 src/cats/sql_get.c:796 -msgid "Client record not found in Catalog.\n" -msgstr "Client Eintrag nicht in Catalog gefunden\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:403 +msgid "Opened connection with Director daemon." +msgstr "" -#: src/cats/sql_get.c:821 -#, c-format -msgid "More than one Counter!: %d\n" -msgstr "Mehr als ein Counter!: %d\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:406 +msgid "Opened connection with File daemon." +msgstr "" + +#: src/qt-console/tray-monitor/tray-monitor.cpp:409 +msgid "Opened connection with Storage daemon." +msgstr "" + +#: src/qt-console/tray-monitor/tray-monitor.cpp:460 +msgid "Error : BNET_HARDEOF or BNET_ERROR" +msgstr "" + +#: src/qt-console/tray-monitor/tray-monitor.cpp:469 +msgid "Error : Connection closed." +msgstr "" -#: src/cats/sql_get.c:826 +#: src/qt-console/tray-monitor/tray_conf.cpp:160 #, c-format -msgid "error fetching Counter row: %s\n" -msgstr "Fehler beim Holen der Counter Zeile: %s\n" +msgid "No %s resource defined\n" +msgstr "Keine %s resource definiert\n" -#: src/cats/sql_get.c:846 +#: src/qt-console/tray-monitor/tray_conf.cpp:169 #, c-format -msgid "Counter record: %s not found in Catalog.\n" -msgstr "Counter Eintrag: %s in Catalog nicht gefunden.\n" +msgid "Monitor: name=%s FDtimeout=%s SDtimeout=%s\n" +msgstr "" -#: src/cats/sql_get.c:884 +#: src/qt-console/tray-monitor/tray_conf.cpp:175 #, c-format -msgid "Error got %s FileSets but expected only one!\n" -msgstr "Fehler erhalten %s FileSets aber nur einen erwartet!\n" +msgid "Director: name=%s address=%s FDport=%d\n" +msgstr "" -#: src/cats/sql_get.c:889 +#: src/qt-console/tray-monitor/tray_conf.cpp:179 #, c-format -msgid "FileSet record \"%s\" not found.\n" -msgstr "FileSet Eintrag \"%s\" nicht gefunden\n" +msgid "Client: name=%s address=%s FDport=%d\n" +msgstr "" -#: src/cats/sql_get.c:899 -msgid "FileSet record not found in Catalog.\n" -msgstr "FileSet Eintrag in Catalog nicht gefunden.\n" +#: src/qt-console/tray-monitor/tray_conf.cpp:183 +#, c-format +msgid "Storage: name=%s address=%s SDport=%d\n" +msgstr "" -#: src/cats/sql_get.c:998 +#: src/qt-console/tray-monitor/tray_conf.cpp:191 #, c-format -msgid "Media id select failed: ERR=%s\n" -msgstr "Media id select fehlgeschlagen: ERR=%s\n" +msgid "Unknown resource type %d in dump_resource.\n" +msgstr "Unbekannter resource type %d in dump_resource.\n" -#: src/cats/sql_get.c:1036 -#, fuzzy, c-format -msgid "query dbids failed: ERR=%s\n" -msgstr "Abfrage gescheitert: %s: ERR=%s\n" +#: src/qt-console/tray-monitor/tray_conf.cpp:249 +#, c-format +msgid "Unknown resource type %d in free_resource.\n" +msgstr "Unbekannter resource type %d in free_resource.\n" -#: src/cats/sql_get.c:1091 +#: src/qt-console/tray-monitor/tray_conf.cpp:286 #, c-format -msgid "More than one Volume!: %s\n" -msgstr "Mehr als ein Volume!: %s\n" +msgid "Too many items in %s resource\n" +msgstr "zu viele items in %s resource\n" -#: src/cats/sql_get.c:1150 -#, fuzzy, c-format -msgid "Media record with MediaId=%s not found.\n" -msgstr "Media Eintrag MediaId=%s nicht gefunden.\n" +#: src/qt-console/tray-monitor/tray_conf.cpp:306 +#: src/qt-console/tray-monitor/tray_conf.cpp:344 +#, c-format +msgid "Unknown resource type %d in save_resource.\n" +msgstr "Unbekannter resource type %d in save_resource.\n" -#: src/cats/sql_get.c:1153 -#, fuzzy, c-format -msgid "Media record for Volume name \"%s\" not found.\n" -msgstr "Media Eintrag für Volume \"%s\" nicht gefunden.\n" +#~ msgid "Query failed: %s: ERR=%s\n" +#~ msgstr "Abfrage gescheitert: %s: ERR=%s\n" -#: src/cats/sql_get.c:1160 -#, c-format -msgid "Media record for MediaId=%u not found in Catalog.\n" -msgstr "Media Eintrag für MediaId=%u in Catalog nicht gefunden.\n" +#~ msgid "A user name for MySQL must be supplied.\n" +#~ msgstr "Ein Benutzername für MySQL muss angegeben werden.\n" -#: src/cats/sql_get.c:1163 -#, fuzzy, c-format -msgid "Media record for Volume Name \"%s\" not found in Catalog.\n" -msgstr "Media Eintrag für Vol=%s in Catalog nicht gefunden.\n" +#~ msgid "Unable to initialize DB lock. ERR=%s\n" +#~ msgstr "Kann DB lock nicht initialisieren. ERR=%s\n" -#: src/cats/sql_get.c:1463 -#, fuzzy, c-format -msgid "More than one Snapshot!: %s\n" -msgstr "Mehr als ein Client!: %s\n" +#, fuzzy +#~ msgid "" +#~ "Unable to connect to MySQL server.\n" +#~ "Database=%s User=%s\n" +#~ "MySQL connect failed either server not running or your authorization is " +#~ "incorrect.\n" +#~ msgstr "" +#~ "Kann Verbindung zu MySQL Server nicht aufbauen. \n" +#~ "Datenbank=%s Benutzer=%s\n" +#~ "Der Datenbankserver läuft möglicherweise nicht oder das Passwort ist " +#~ "nicht korrekt.\n" -#: src/cats/sql_get.c:1492 src/cats/sql_get.c:1502 -#, fuzzy, c-format -msgid "Snapshot record with SnapshotId=%s not found.\n" -msgstr "Media Eintrag MediaId=%s nicht gefunden.\n" +#~ msgid "Attribute create error. %s" +#~ msgstr "Attribute create error. %s" -#: src/cats/sql_get.c:1495 src/cats/sql_get.c:1505 -#, fuzzy, c-format -msgid "Snapshot record for Snapshot name \"%s\" not found.\n" -msgstr "Media Eintrag für Volume \"%s\" nicht gefunden.\n" +#~ msgid "A user name for PostgreSQL must be supplied.\n" +#~ msgstr "Ein Benutzername für PostgreSQL muss angegeben werden.\n" -#: src/cats/sql_list.c:45 -#, c-format -msgid "Query failed: %s\n" -msgstr "Abfrage fehlgeschlagen: %s\n" +#~ msgid "error fetching row: %s\n" +#~ msgstr "Fehler beim holen von Zeile: %s\n" -#: src/cats/sql_list.c:314 -msgid "These JobIds have copies as follows:\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Unable to connect to PostgreSQL server. Database=%s User=%s\n" +#~ "Possible causes: SQL server not running; password incorrect; " +#~ "max_connections exceeded.\n" +#~ msgstr "" +#~ "Kann Verbindung zu PostgreSQL Server nicht aufbauen.\n" +#~ "Datenbank=%s Benutzer=%s\n" +#~ "Der Datenbankserver läuft möglicherweise nicht oder das Passwort ist " +#~ "nicht korrekt.\n" -#: src/cats/sql_list.c:316 -msgid "The catalog contains copies as follows:\n" -msgstr "" +#, fuzzy +#~ msgid "Fetch failed: ERR=%s\n" +#~ msgstr "pthread_create: ERR=%s\n" -#: src/cats/sqlite.c:192 -#, c-format -msgid "Database %s does not exist, please create it.\n" -msgstr "Datenbank %s existiert nicht, bitte erzeugen.\n" +#~ msgid "error fetching currval: %s\n" +#~ msgstr "Fehler beim Holen des aktuellen Wertes: %s\n" -#: src/cats/sqlite.c:214 -#, c-format -msgid "Unable to open Database=%s. ERR=%s\n" -msgstr "Kann Datenbank=%s.nicht öffen. ERR=%s\n" +#, fuzzy +#~ msgid "error starting batch mode: %s" +#~ msgstr "Fehler beim holen von Zeile: %s\n" -#: src/cats/sqlite.c:215 -msgid "unknown" -msgstr "unbekannt" +#, fuzzy +#~ msgid "error ending batch mode: %s" +#~ msgstr "Fehler beim holen von Zeile: %s\n" -#: src/console/authenticate.c:119 src/dird/authenticate.c:122 -msgid "" -"Authorization problem: Remote server did not advertise required TLS " -"support.\n" -msgstr "" -"Authorisationsproblem: Entfernter Server hat benötigte TLS Unterstützung " -"nicht angeboten.\n" +#, fuzzy +#~ msgid "error copying in batch mode: %s" +#~ msgstr "Fehler beim holen von Zeile: %s\n" -#: src/console/authenticate.c:126 src/dird/authenticate.c:129 -#: src/filed/authenticate.c:102 src/filed/authenticate.c:208 -#: src/stored/authenticate.c:94 src/stored/authenticate.c:187 -#: src/stored/authenticate.c:295 -msgid "Authorization problem: Remote server requires TLS.\n" -msgstr "Authorisationsproblem: Enfernter Server erfordert TLS.\n" +#~ msgid "" +#~ "query %s failed:\n" +#~ "%s\n" +#~ msgstr "" +#~ "Abfrage %s gescheitert:\n" +#~ "%s\n" -#: src/console/authenticate.c:135 -msgid "TLS negotiation failed\n" -msgstr "" +#~ msgid "" +#~ "insert %s failed:\n" +#~ "%s\n" +#~ msgstr "" +#~ "einfügen %s gescheitert:\n" +#~ "%s\n" -#: src/console/authenticate.c:149 -#: src/qt-console/tray-monitor/authenticate.cpp:85 -#, c-format -msgid "Bad response to Hello command: ERR=%s\n" -msgstr "" +#~ msgid "Insertion problem: affected_rows=%s\n" +#~ msgstr "Problem beim Einfügen: affected_rows=%s\n" -#: src/console/authenticate.c:156 -#: src/qt-console/tray-monitor/authenticate.cpp:92 -msgid "Director rejected Hello command\n" -msgstr "" +#~ msgid "" +#~ "update %s failed:\n" +#~ "%s\n" +#~ msgstr "" +#~ "Aktualisierung %s gescheitert:\n" +#~ "%s\n" -#: src/console/authenticate.c:174 #, fuzzy -msgid "" -"Director authorization problem.\n" -"Most likely the passwords do not agree.\n" -"If you are using TLS, there may have been a certificate validation error " -"during the TLS handshake.\n" -"For help, please see " -msgstr "" -"Kann mit File daemon on \"%s:%d\" nicht authentisieren. Mögliche Ursachen:\n" -"Passworte oder Namen nicht gleich oder\n" -"Maximum Concurrent Jobs überschritten auf dem FD oder\n" -"FD Netzwerk durcheinander (Daemon neustarten).\n" -"Für Hilfe bitte unter http://www.bacula.org/rel-manual/faq." -"html#AuthorizationErrors nachsehen.\n" +#~ msgid "Update failed: affected_rows=%s for %s\n" +#~ msgstr "Aktualisierungsproblem: affected_rows=%s\n" -#: src/console/bbconsjson.c:79 src/console/console.c:118 -#, c-format -msgid "" -"\n" -"%sVersion: " -msgstr "" +#~ msgid "" +#~ "delete %s failed:\n" +#~ "%s\n" +#~ msgstr "" +#~ "löschen von %s fehlgeschlagen:\n" +#~ "%s\n" -#: src/console/bbconsjson.c:152 src/dird/bdirjson.c:141 -#: src/filed/bfdjson.c:116 src/stored/bsdjson.c:126 -#, fuzzy, c-format -msgid "Please use valid -l argument: %s\n" -msgstr "FileSet: name=%s\n" - -#: src/console/bbconsjson.c:213 src/console/console.c:1157 -#: src/dird/bdirjson.c:235 src/dird/dird.c:283 src/dird/dird.c:311 -#: src/dird/dird.c:548 src/dird/dird.c:551 src/filed/bfdjson.c:199 -#: src/filed/filed.c:210 src/qt-console/main.cpp:161 src/stored/bsdjson.c:211 -#: src/stored/stored.c:236 -#, c-format -msgid "Please correct configuration file: %s\n" -msgstr "Bitte die Konfigurationsdatei korrigieren: %s\n" +#~ msgid "Path length is zero. File=%s\n" +#~ msgstr "Pfadlänge ist null. Datei=%s\n" -#: src/console/bbconsjson.c:430 src/console/bbconsjson.c:461 -#: src/console/console.c:1347 src/console/console.c:1377 -#: src/dird/bdirjson.c:1163 src/dird/bdirjson.c:1201 src/dird/bdirjson.c:1256 -#: src/dird/dird.c:688 src/dird/dird.c:906 src/dird/dird.c:961 -#: src/dird/dird.c:1168 src/filed/bfdjson.c:483 src/filed/bfdjson.c:526 -#: src/filed/filed.c:379 src/filed/filed.c:579 src/qt-console/main.cpp:218 -#: src/qt-console/main.cpp:248 src/stored/bsdjson.c:494 -#: src/stored/stored.c:362 -msgid "TLS required but not configured in Bacula.\n" -msgstr "TLS benötigt aber nicht konfiguriert in Bacula.\n" +#~ msgid "No results to list.\n" +#~ msgstr "Keine Ergebnisse zu \"list\" Kommando.\n" -#: src/console/bbconsjson.c:439 src/console/console.c:1355 -#: src/qt-console/main.cpp:226 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Director \"%s\" in %s. At least one CA certificate store is required.\n" -msgstr "" +#, fuzzy +#~ msgid "Could not init database batch connection\n" +#~ msgstr "Konnte Datenbank \"%s\" nicht öffen.\n" -#: src/console/bbconsjson.c:448 src/console/console.c:1364 -#: src/qt-console/main.cpp:235 -#, c-format -msgid "" -"No Director resource defined in %s\n" -"Without that I don't how to speak to the Director :-(\n" -msgstr "" +#, fuzzy +#~ msgid "Could not open database \"%s\": ERR=%s\n" +#~ msgstr "Konnte Datenbank \"%s\" nicht öffen.\n" -#: src/console/bbconsjson.c:468 src/console/console.c:1384 -#: src/qt-console/main.cpp:256 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Console \"%s\" in %s.\n" -msgstr "" +#~ msgid "Create DB Job record %s failed. ERR=%s\n" +#~ msgstr "Erzeugung von DB Job Eintrag %s fehlgeschlagen. ERR=%s\n" -#: src/console/console.c:170 -msgid "input from file" -msgstr "" +#~ msgid "Create JobMedia record %s failed: ERR=%s\n" +#~ msgstr "Erzeugung von JobMedia Eintrag %s fehlgeschlagen: ERR=%s\n" -#: src/console/console.c:171 -msgid "output to file" -msgstr "" +#~ msgid "Update Media record %s failed: ERR=%s\n" +#~ msgstr "Aktualisierung von Media Eintrag %s fehlgeschlagen: ERR=%s\n" -#: src/console/console.c:172 -msgid "quit" -msgstr "" +#~ msgid "pool record %s already exists\n" +#~ msgstr "pool Eintrag %s bereits vorhanden\n" -#: src/console/console.c:173 -msgid "output to file and terminal" -msgstr "" +#~ msgid "Create db Pool record %s failed: ERR=%s\n" +#~ msgstr "Erzeugung von db Pool Eintrag %s fehlgeschlagen: ERR=%s\n" -#: src/console/console.c:174 -msgid "sleep specified time" -msgstr "" +#~ msgid "Device record %s already exists\n" +#~ msgstr "Device Eintrag %s bereits vorhanden\n" -#: src/console/console.c:175 -msgid "print current time" -msgstr "" +#~ msgid "Create db Device record %s failed: ERR=%s\n" +#~ msgstr "Erzeugung von db Device Eintrag %s fehlgeschlagen: ERR=%s\n" -#: src/console/console.c:176 -msgid "print Console's version" -msgstr "" +#~ msgid "More than one Storage record!: %d\n" +#~ msgstr "Mehr als ein Storage Eintrag!: %d\n" -#: src/console/console.c:177 -msgid "echo command string" -msgstr "" +#~ msgid "error fetching Storage row: %s\n" +#~ msgstr "Fehler beim holen der Storage Zeile: %s\n" -#: src/console/console.c:178 -msgid "encode command string" -msgstr "" +#~ msgid "Create DB Storage record %s failed. ERR=%s\n" +#~ msgstr "Erzeugung des DB Storage Eintrags %s fehlgeschlagen. ERR=%s\n" -#: src/console/console.c:179 -msgid "execute an external command" -msgstr "" +#~ msgid "mediatype record %s already exists\n" +#~ msgstr "Medientyp Eintrag %s bereits vorhanden\n" -#: src/console/console.c:180 -msgid "exit = quit" -msgstr "" +#~ msgid "Create db mediatype record %s failed: ERR=%s\n" +#~ msgstr "Erzeuge db Medientyp Eintrag %s fehlgeschlagen: ERR=%s\n" -#: src/console/console.c:181 -msgid "send a file to the director" -msgstr "" +#~ msgid "Volume \"%s\" already exists.\n" +#~ msgstr "Volume \"%s\" bereits vorhanden.\n" -#: src/console/console.c:182 -msgid "zed_keys = use zed keys instead of bash keys" -msgstr "" +#~ msgid "Create DB Media record %s failed. ERR=%s\n" +#~ msgstr "Erzeugung DB Media Eintrag %s fehlgeschlagen. ERR=%s\n" -#: src/console/console.c:183 -msgid "help listing" -msgstr "" +#~ msgid "More than one Client!: %d\n" +#~ msgstr "Mehr als ein Client!: %d\n" -#: src/console/console.c:185 -msgid "set command separator" -msgstr "" +#~ msgid "error fetching Client row: %s\n" +#~ msgstr "Fehler beim holen der Client Zeile: %s\n" -#: src/console/console.c:219 -msgid ": is an invalid command\n" -msgstr "" +#~ msgid "Create DB Client record %s failed. ERR=%s\n" +#~ msgstr "Erzeugung des DB Client Eintrags %s fehlgeschlagen. ERR=%s\n" -#: src/console/console.c:714 -msgid "Illegal separator character.\n" -msgstr "" +#~ msgid "More than one Path!: %s for path: %s\n" +#~ msgstr "Mehr als ein Pfad!: %s für Pfad: %s\n" -#: src/console/console.c:747 -msgid "Command logic problem\n" -msgstr "" +#~ msgid "Create db Path record %s failed. ERR=%s\n" +#~ msgstr "Erzeugung des db Path Eintrags %s fehlgeschlagen. ERR=%s\n" -#: src/console/console.c:962 -#, fuzzy, c-format -msgid "Can't find %s in Director list\n" -msgstr "Kann Director resource %s nicht finden\n" +#~ msgid "Create DB Counters record %s failed. ERR=%s\n" +#~ msgstr "Erzeugung des DB Counters Eintrag %s fehlgeschlagen. ERR=%s\n" -#: src/console/console.c:970 -msgid "Available Directors:\n" -msgstr "" +#~ msgid "More than one FileSet!: %d\n" +#~ msgstr "Mehr als ein FileSet!: %d\n" -#: src/console/console.c:974 -#, c-format -msgid "%2d: %s at %s:%d\n" -msgstr "" +#~ msgid "error fetching FileSet row: ERR=%s\n" +#~ msgstr "Fehler beim holen der FileSet Zeile: ERR=%s\n" -#: src/console/console.c:978 -msgid "Select Director by entering a number: " -msgstr "" +#~ msgid "Create DB FileSet record %s failed. ERR=%s\n" +#~ msgstr "Erzeugung des DB FileSet Eintrags %s fehlgeschlagen. ERR=%s\n" -#: src/console/console.c:985 -#, c-format -msgid "%s is not a number. You must enter a number between 1 and %d\n" -msgstr "" +#~ msgid "Create db File record %s failed. ERR=%s" +#~ msgstr "Erzeugung des db File Eintrags %s fehlgeschlagen. ERR=%s" -#: src/console/console.c:992 -#, c-format -msgid "You must enter a number between 1 and %d\n" -msgstr "" +#~ msgid "Attempt to put non-attributes into catalog. Stream=%d\n" +#~ msgstr "Versuche \"non-attributes\" in catalog einzufügen. Stream=%d\n" -#: src/console/console.c:1153 src/dird/dird.c:279 src/filed/filed.c:205 -#: src/qt-console/main.cpp:157 src/stored/stored.c:232 -#: src/stored/test-dedup.c:836 src/stored/tune-dde.c:330 -msgid "Cryptography library initialization failed.\n" -msgstr "Initialisierung der Verschlüsselungsbibliothek fehlgeschlagen.\n" +#, fuzzy +#~ msgid "Create db Object record %s failed. ERR=%s" +#~ msgstr "Erzeugung des db File Eintrags %s fehlgeschlagen. ERR=%s" -#: src/console/console.c:1188 -#, c-format -msgid "Connecting to Director %s:%d\n" -msgstr "" +#~ msgid "No pool record %s exists\n" +#~ msgstr "Kein pool Eintrag %s vorhanden\n" -#: src/console/console.c:1205 src/qt-console/bcomm/dircomm.cpp:151 -#, c-format -msgid "Failed to initialize TLS context for Console \"%s\".\n" -msgstr "" +#~ msgid "Expecting one pool record, got %d\n" +#~ msgstr "Erwartete einen \"pool\" Eintrag, erhielt %d\n" -#: src/console/console.c:1225 src/qt-console/bcomm/dircomm.cpp:174 -#, c-format -msgid "Failed to initialize TLS context for Director \"%s\".\n" -msgstr "" +#~ msgid "Error fetching row %s\n" +#~ msgstr "Fehler beim Holen der Zeile %s\n" -#: src/console/console.c:1259 -msgid "Enter a period to cancel a command.\n" -msgstr "" +#~ msgid "" +#~ "Query error for start time request: ERR=%s\n" +#~ "CMD=%s\n" +#~ msgstr "" +#~ "Fehler bei Abfrage von Startzeit: ERR=%s\n" +#~ "CMD=%s\n" -#: src/console/console.c:1410 -msgid "Too many arguments on input command.\n" -msgstr "" +#~ msgid "No prior Full backup Job record found.\n" +#~ msgstr "Keinen vorherigen \"Full backup\" Job Eintrag gefunden.\n" -#: src/console/console.c:1414 -msgid "First argument to input command must be a filename.\n" -msgstr "" +#~ msgid "Unknown level=%d\n" +#~ msgstr "Unbekannter level=%d\n" -#: src/console/console.c:1420 -#, c-format -msgid "Cannot open file %s for input. ERR=%s\n" -msgstr "" - -#: src/console/console.c:1452 -msgid "Too many arguments on output/tee command.\n" -msgstr "" - -#: src/console/console.c:1469 -#, c-format -msgid "Cannot open file %s for output. ERR=%s\n" -msgstr "" - -#: src/console/console.c:1488 -msgid "Too many arguments. Enclose command in double quotes.\n" -msgstr "" - -#: src/console/console.c:1497 -#, fuzzy, c-format -msgid "Cannot popen(\"%s\", \"r\"): ERR=%s\n" -msgstr "Kann Ausdruck\"%s\"nicht auflösen: ERR=%s\n" - -#: src/console/console.c:1509 -#, fuzzy, c-format -msgid "@exec error: ERR=%s\n" -msgstr "Attribute create error. %s" - -#: src/console/console.c:1542 -msgid "The String to encode is too long\n" -msgstr "" - -#: src/console/console_conf.c:130 src/qt-console/bat_conf.cpp:131 -#, c-format -msgid "No record for %d %s\n" -msgstr "" - -#: src/console/console_conf.c:139 -#, c-format -msgid "Console: name=%s rcfile=%s histfile=%s\n" -msgstr "" - -#: src/console/console_conf.c:143 src/qt-console/bat_conf.cpp:140 -#, c-format -msgid "Director: name=%s address=%s DIRport=%d\n" -msgstr "" +#~ msgid "" +#~ "No Job record found: ERR=%s\n" +#~ "CMD=%s\n" +#~ msgstr "" +#~ "Kein \"Job\" Eintrag gefunden: ERR=%s\n" +#~ "CMD=%s\n" -#: src/console/console_conf.c:147 src/console/console_conf.c:227 -#: src/console/console_conf.c:268 src/console/console_conf.c:295 -#: src/filed/filed_conf.c:422 src/filed/filed_conf.c:486 -#: src/filed/filed_conf.c:516 src/qt-console/bat_conf.cpp:151 -#: src/qt-console/bat_conf.cpp:233 src/qt-console/bat_conf.cpp:279 -#: src/qt-console/bat_conf.cpp:309 src/stored/stored_conf.c:575 -#: src/stored/stored_conf.c:662 src/stored/stored_conf.c:697 -#, c-format -msgid "Unknown resource type %d\n" -msgstr "" +#~ msgid "Unknown Job level=%d\n" +#~ msgstr "Unbekannter Job level=%d\n" -#: src/console/console_conf.c:249 src/dird/dird_conf.c:1466 -#: src/dird/dird_conf.c:1481 src/filed/filed_conf.c:447 -#: src/qt-console/bat_conf.cpp:257 -#: src/qt-console/tray-monitor/tray_conf.cpp:274 -#, c-format -msgid "%s item is required in %s resource, but not found.\n" -msgstr "%s item wird in %s resource benötigt, wurde aber nicht gefunden.\n" +#~ msgid "No Job found for: %s.\n" +#~ msgstr "Kein Job gefunden für: %s.\n" -#: src/dird/admin.c:54 -#, c-format -msgid "Start Admin JobId %d, Job=%s\n" -msgstr "Starte Admin JobId %d, Job=%s\n" +#~ msgid "No Job found for: %s\n" +#~ msgstr "Keinen Job gefunden für: %s\n" -#: src/dird/admin.c:79 src/dird/backup.c:801 src/dird/mac.c:719 -#: src/dird/vbackup.c:362 -#, fuzzy, c-format -msgid "Error getting Job record for Job report: ERR=%s" -msgstr "Fehler beim Holen des job Eintrags für den job Bericht: %s" +#~ msgid "Request for Volume item %d greater than max %d or less than 1\n" +#~ msgstr "" +#~ "Anforderung von \"Volume item\" %d größer als Max %d oder weniger als 1\n" -#: src/dird/admin.c:87 -msgid "Admin OK" -msgstr "Admin OK" +#, fuzzy +#~ msgid "No Volume record found for item %d.\n" +#~ msgstr "Kein Volume Eintrag gefunden für item %d.\n" -#: src/dird/admin.c:91 -msgid "*** Admin Error ***" -msgstr "*** Admin Fehler ***" +#~ msgid "Error fetching row: %s\n" +#~ msgstr "Fehler beim holen der Zeile: %s\n" -#: src/dird/admin.c:95 -msgid "Admin Canceled" -msgstr "Admin abgebrochen" +#, fuzzy +#~ msgid "get_file_record want 1 got rows=%d PathId=%s Filename=%s\n" +#~ msgstr "get_file_record erwartet 1 erhalten rows=%d\n" -#: src/dird/admin.c:99 src/dird/backup.c:857 src/dird/restore.c:671 -#: src/dird/vbackup.c:412 -#, c-format -msgid "Inappropriate term code: %c\n" -msgstr "Unangebrachter Beendigungskode: %c\n" +#, fuzzy +#~ msgid "File record for PathId=%s Filename=%s not found.\n" +#~ msgstr "File Eintrag für PathId=%s FilenameId=%s nicht gefunden.\n" -#: src/dird/admin.c:107 src/lib/status.h:205 src/lib/status.h:216 -#: src/lib/status.h:230 src/lib/status.h:234 src/lib/status.h:238 -msgid "Bacula " -msgstr "Bacula " +#~ msgid "File record not found in Catalog.\n" +#~ msgstr "File Eintrag nicht im Catalog gefunden.\n" -#: src/dird/authenticate.c:78 src/dird/authenticate.c:79 -#: src/qt-console/tray-monitor/authenticate.cpp:120 -#, c-format -msgid "Error sending Hello to Storage daemon. ERR=%s\n" -msgstr "Fehler beim senden von \"Hello\" an Storage daemon. ERR=%s\n" +#~ msgid "Get DB path record %s found bad record: %s\n" +#~ msgstr "Get DB path record %s fehlerhaften Eintrag gefunden: %s\n" -#: src/dird/authenticate.c:108 -msgid "Director and Storage daemon passwords or names not the same.\n" -msgstr "Director und Storage daemon Passworte or Namen nicht gleich.\n" +#~ msgid "Path record: %s not found.\n" +#~ msgstr "Path record: %s nicht gefunden.\n" -#: src/dird/authenticate.c:110 -#, fuzzy, c-format -msgid "" -"Director unable to authenticate with Storage daemon at \"%s:%d\". Possible " -"causes:\n" -"Passwords or names not the same or\n" -"Maximum Concurrent Jobs exceeded on the SD or\n" -"SD networking messed up (restart daemon).\n" -"For help, please see: " -msgstr "" -"Director kann sich nicht an Storage daemon an \"%s:%d\" authentisieren. " -"Mögliche Ursachen:\n" -"Passworte oder Namen nicht gleich oder\n" -"Maximum Concurrent Jobs überschritten am SD oder\n" -"SD Netzwerk durcheinander (daemon neustarten).\n" -"Für Hilfe bitte unter http://www.bacula.org/rel-manual/faq." -"html#AuthorizationErrors nachsehen.\n" +#~ msgid "Path record: %s not found in Catalog.\n" +#~ msgstr "Path record: %s nicht in Catalog gefunden.\n" -#: src/dird/authenticate.c:138 -#, fuzzy, c-format -msgid "TLS negotiation failed with SD at \"%s:%d\"\n" -msgstr "TLS Aushandlung fehlgeschlagen mit SD an \"%s:%d\"\n" +#~ msgid "No Job found for JobId %s\n" +#~ msgstr "Kein Job für JobId %s gefunden\n" -#: src/dird/authenticate.c:150 -#, c-format -msgid "bdird get resource type \n" -" -n get resource \n" -" -l get only directives matching dirs (use with -r)\n" -" -D get only data\n" -" -R do not apply JobDefs to Job\n" -" -c set configuration file to file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -t test - read configuration and exit\n" -" -s output in show text format\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Version: %s (%s)\n" -"\n" -"Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c setze Konfigurationsdatei auf Datei\n" -" -dnn setze debug level auf nn\n" -" -f starte im Vordergrund (für debugging Zwecke)\n" -" -g groupid\n" -" -r starte jetzt\n" -" -s no signals\n" -" -t test - Konfiguration Lesen und beenden\n" -" -u userid\n" -" -v ausführliche Benutzer Meldungen\n" -" -? diese Meldung ausgeben.\n" -"\n" +#~ msgid "bdirdInChanger):\n" -" Volume(s) Storage(s) SD Device(s)\n" -"===========================================================================\n" -msgstr "" -"Der Job wird folgendes benötigen:\n" -" Volume(s) Storage(s) SD Device(s)\n" -"===========================================================================\n" +#~ msgid "Restart Incomplete Backup JobId %s, Job=%s\n" +#~ msgstr "Start Sicherung JobId %s, Job=%s\n" -#: src/dird/bsr.c:333 -msgid "No Volumes found to restore.\n" -msgstr "Keine Volumes zum Wiederherstellen gefunden.\n" +#~ msgid "Start Backup JobId %s, Job=%s\n" +#~ msgstr "Start Sicherung JobId %s, Job=%s\n" -#: src/dird/bsr.c:335 -msgid "" -"\n" -"Volumes marked with \"*\" are in the Autochanger.\n" -msgstr "" +#~ msgid "Unexpected Client Job message: %s\n" +#~ msgstr "Unerwartete Client Job Nachricht: %s\n" -#: src/dird/catreq.c:128 src/dird/catreq.c:382 -#, c-format -msgid "1990 Invalid Catalog Request: %s" -msgstr "1990 Ungültige Catalog Anfrage: %s" +#~ msgid "Network error with FD during %s: ERR=%s\n" +#~ msgstr "Netzwerkfehler mit FD bei %s: ERR=%s\n" -#: src/dird/catreq.c:129 -#, c-format -msgid "Invalid Catalog request; DB not open: %s" -msgstr "Ungültige Catalog Anfrage; DB nicht offen: %s" +#~ msgid "No Job status returned from FD.\n" +#~ msgstr "FD hat keinen Jobstatus zurückgegeben.\n" -#: src/dird/catreq.c:150 -#, c-format -msgid "Pool \"%s\" not found for SD find media request.\n" -msgstr "" +#, fuzzy +#~ msgid "Error getting Client record for Job report: ERR=%s" +#~ msgstr "Fehler beim holen des Datensatzes für Volume \"%s\": ERR=%s" -#: src/dird/catreq.c:159 -msgid "1901 No Media.\n" -msgstr "1901 Keine Medien.\n" +#~ msgid "Error getting Media record for Volume \"%s\": ERR=%s" +#~ msgstr "Fehler beim holen des Datensatzes für Volume \"%s\": ERR=%s" -#: src/dird/catreq.c:191 -msgid "not in Pool" -msgstr "nicht in Pool" +#~ msgid "Backup OK -- with warnings" +#~ msgstr "Sicherung OK -- mit Warnungen" -#: src/dird/catreq.c:193 -msgid "not correct MediaType" -msgstr "nicht korrekter Medientyp" +#~ msgid "Backup OK" +#~ msgstr "Sicherung OK" -#: src/dird/catreq.c:203 -msgid "is not Enabled" -msgstr "ist nicht aktiviert" +#~ msgid "*** Backup Error ***" +#~ msgstr "*** Sicherungsfehler ***" -#: src/dird/catreq.c:212 -#, fuzzy, c-format -msgid "1998 Volume \"%s\" catalog status is %s, %s.\n" -msgstr "1998 Volume \"%s\" status ist %s, %s.\n" +#~ msgid "Backup Canceled" +#~ msgstr "Sicherung Abgebrochen" -#: src/dird/catreq.c:217 -#, c-format -msgid "1997 Volume \"%s\" not in catalog.\n" -msgstr "1997 Volume \"%s\" Nicht in Catalog.\n" +#, fuzzy +#~ msgid "%s (%sB)" +#~ msgstr "%s -- keine Dateien zur Migration." -#: src/dird/catreq.c:244 -#, c-format -msgid "Unable to get Media record for Volume %s: ERR=%s\n" -msgstr "Konnte Media record für Volume %s nicht holen: ERR=%s\n" +#, fuzzy +#~ msgid "" +#~ "%s %s %s (%s):\n" +#~ " Build OS: %s %s %s\n" +#~ " JobId: %d\n" +#~ " Job: %s\n" +#~ " Backup Level: %s%s\n" +#~ " Client: \"%s\" %s\n" +#~ " FileSet: \"%s\" %s\n" +#~ " Pool: \"%s\" (From %s)\n" +#~ " Catalog: \"%s\" (From %s)\n" +#~ " Storage: \"%s\" (From %s)\n" +#~ " Scheduled time: %s\n" +#~ " Start time: %s\n" +#~ " End time: %s\n" +#~ " Elapsed time: %s\n" +#~ " Priority: %d\n" +#~ " FD Files Written: %s\n" +#~ " SD Files Written: %s\n" +#~ " FD Bytes Written: %s (%sB)\n" +#~ " SD Bytes Written: %s (%sB)\n" +#~ " Rate: %.1f KB/s\n" +#~ " Software Compression: %s\n" +#~ " Comm Line Compression: %s\n" +#~ "%s Snapshot/VSS: %s\n" +#~ " Encryption: %s\n" +#~ " Accurate: %s\n" +#~ " Volume name(s): %s\n" +#~ " Volume Session Id: %d\n" +#~ " Volume Session Time: %d\n" +#~ " Last Volume Bytes: %s\n" +#~ " Non-fatal FD errors: %d\n" +#~ " SD Errors: %d\n" +#~ " FD termination status: %s\n" +#~ " SD termination status: %s\n" +#~ " Termination: %s\n" +#~ "\n" +#~ msgstr "" +#~ "%s %s (%s): %s\n" +#~ " JobId: %d\n" +#~ " Job: %s\n" +#~ " Backup Level: %s%s\n" +#~ " Client: \"%s\" %s\n" +#~ " FileSet: \"%s\" %s\n" +#~ " Pool: \"%s\" (From %s)\n" +#~ " Storage: \"%s\" (From %s)\n" +#~ " Geplante Zeit: %s\n" +#~ " Startzeit: %s\n" +#~ " Endzeit: %s\n" +#~ " Verstrichene Zeit: %s\n" +#~ " Priorität: %d\n" +#~ " FD Dateien geschrieben: %s\n" +#~ " SD Dateien geschrieben: %s\n" +#~ " FD Bytes geschrieben: %s (%sB)\n" +#~ " SD Bytes geschrieben: %s (%sB)\n" +#~ " Geschwindigkeit: %.1f KB/s\n" +#~ " Software Kompression: %s\n" +#~ " VSS: %s\n" +#~ " Verschlüsselung: %s\n" +#~ " Volume Name(n): %s\n" +#~ " Volume Session Id: %d\n" +#~ " Volume Session Zeit: %d\n" +#~ " Letztes Volumen Bytes: %s (%sB)\n" +#~ " Nicht-fatale FD Fehler %d\n" +#~ " SD Fehler: %d\n" +#~ " FD Beendigungsstatus: %s\n" +#~ " SD Beendigungsstatus: %s\n" +#~ " Beendigungsstatus: %s\n" +#~ "\n" -#: src/dird/catreq.c:246 -#, c-format -msgid "1991 Catalog Request for vol=%s failed: %s" -msgstr "1991 Catalog Anfrage für vol=%s fehlgeschlagen: %s" +#~ msgid "" +#~ "Could not get Job Volume Parameters to update Bootstrap file. ERR=%s\n" +#~ msgstr "" +#~ "Konnte Job Volume Parameter nicht holen um die Bootstrap Datei zu " +#~ "aktualisieren. ERR=%s\n" -#: src/dird/catreq.c:273 -#, fuzzy, c-format -msgid "Attempt to set Volume Files from %u to %u for Volume \"%s\". Ignored.\n" -msgstr "" -"Volume Files bei %u werden auf %u für Volumen \"%s\" gesetzt. Dies ist nicht " -"Korrekt.\n" +#~ msgid "" +#~ "Could not open WriteBootstrap file:\n" +#~ "%s: ERR=%s\n" +#~ msgstr "" +#~ "Konnte WriteBootstrap nicht öffnen. Datei:\n" +#~ "%s: ERR=%s\n" -#: src/dird/catreq.c:332 -#, c-format -msgid "Catalog error updating Media record. %s" -msgstr "Catalog Fehler beim Aktualisieren des Media Eintrags. %s" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bdirjson [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -r get resource type \n" +#~ " -n get resource \n" +#~ " -l get only directives matching dirs (use with -r)\n" +#~ " -D get only data\n" +#~ " -R do not apply JobDefs to Job\n" +#~ " -c set configuration file to file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -t test - read configuration and exit\n" +#~ " -s output in show text format\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Version: %s (%s)\n" +#~ "\n" +#~ "Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c setze Konfigurationsdatei auf Datei\n" +#~ " -dnn setze debug level auf nn\n" +#~ " -f starte im Vordergrund (für debugging Zwecke)\n" +#~ " -g groupid\n" +#~ " -r starte jetzt\n" +#~ " -s no signals\n" +#~ " -t test - Konfiguration Lesen und beenden\n" +#~ " -u userid\n" +#~ " -v ausführliche Benutzer Meldungen\n" +#~ " -? diese Meldung ausgeben.\n" +#~ "\n" -#: src/dird/catreq.c:334 -msgid "1993 Update Media error\n" -msgstr "1993 Update Media Fehler\n" +#~ msgid "" +#~ "No Director resource defined in %s\n" +#~ "Without that I don't know who I am :-(\n" +#~ msgstr "" +#~ "Keine Director resource definiert in %s\n" +#~ "Ohne dies weiss ich nicht wer ich bin :-(\n" -#: src/dird/catreq.c:361 -#, c-format -msgid "Catalog error creating JobMedia record. %s" -msgstr "Catalog Fehler beim Erzeugen des JobMedia Eintrags. %s" +#~ msgid "No Messages resource defined in %s\n" +#~ msgstr "Keine Messages resource definiert in %s\n" -#: src/dird/catreq.c:363 -#, fuzzy -msgid "1992 Create JobMedia error\n" -msgstr "1991 Update JobMedia Fehler\n" +#~ msgid "Only one Director resource permitted in %s\n" +#~ msgstr "Nur eine Director resource erlaubt in %s\n" -#: src/dird/catreq.c:383 -#, c-format -msgid "Invalid Catalog request: %s" -msgstr "Ungültige Catalog Anfrage: %s" +#~ msgid "\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n" +#~ msgstr "" +#~ "\"TLS Certificate\" Datei nicht für Director definiert \"%s\" in %s.\n" -#: src/dird/catreq.c:470 -#, fuzzy, c-format -msgid "Attribute create error: ERR=%s" -msgstr "Attribute create error. %s" +#~ msgid "\"TLS Key\" file not defined for Director \"%s\" in %s.\n" +#~ msgstr "\"TLS Key\" Datei nicht für Director definiert \"%s\" in %s.\n" -#: src/dird/catreq.c:567 -#, fuzzy, c-format -msgid "Restore object create error. %s" -msgstr "Attribute create error. %s" +#~ msgid "" +#~ "Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined " +#~ "for Director \"%s\" in %s. At least one CA certificate store is required " +#~ "when using \"TLS Verify Peer\".\n" +#~ msgstr "" +#~ "Weder \"TLS CA Certificate\" noch \"TLS CA Certificate Dir\" sind für " +#~ "Director \"%s\" in %s definert. Mindestens ein CA certificate store wird " +#~ "benötigt wenn \"TLS Verify Peer\" eingesetzt wird.\n" -#: src/dird/catreq.c:574 -#, fuzzy, c-format -msgid "%s not same File=%d as attributes=%d\n" -msgstr "Erhielt %s aber nicht die gleiche Datei wie Attribute\n" +#~ msgid "\"TLS Certificate\" file not defined for Console \"%s\" in %s.\n" +#~ msgstr "" +#~ "\"TLS Certificate\" Datei nicht definiert für Console \"%s\" in %s.\n" -#: src/dird/catreq.c:601 -#, c-format -msgid "Catalog error updating file digest. Unsupported digest stream type: %d" -msgstr "" -"Catalog Fehler beim Aktualisieren des file digest. Nicht unterstützter " -"digest stream typ: %d" +#~ msgid "\"TLS Key\" file not defined for Console \"%s\" in %s.\n" +#~ msgstr "\"TLS Key\" Datei nicht definiert für Console \"%s\" in %s.\n" -#: src/dird/catreq.c:616 -#, fuzzy, c-format -msgid "attribute create error. %s" -msgstr "Attribute create error. %s" +#~ msgid "" +#~ "Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined " +#~ "for Console \"%s\" in %s. At least one CA certificate store is required " +#~ "when using \"TLS Verify Peer\".\n" +#~ msgstr "" +#~ "Weder \"TLS CA Certificate\" noch \"TLS CA Certificate Dir\" sind " +#~ "definiert fürConsole \"%s\" in %s. Mindestens ein CA certificate store " +#~ "wird benötigt beiEinsatz von \"TLS Verify Peer\".\n" -#: src/dird/catreq.c:622 -#, c-format -msgid "Catalog error updating file digest. %s" -msgstr "Catalog Fehler beim Aktualisieren des file digest. %s" +#~ msgid "Failed to initialize TLS context for File daemon \"%s\" in %s.\n" +#~ msgstr "" +#~ "Konnte TLS context für File daemon \"%s\" in %s nicht initialisieren.\n" -#: src/dird/catreq.c:645 -#, fuzzy, c-format -msgid "1994 Invalid Catalog Update: %s" -msgstr "1991 Ungültige Catalog Aktualisierung: %s" +#~ msgid "" +#~ "Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined " +#~ "for File daemon \"%s\" in %s.\n" +#~ msgstr "" +#~ "Weder \"TLS CA Certificate\" noch \"TLS CA Certificate Dir\" sind " +#~ "definiert für File daemon \"%s\" in %s.\n" -#: src/dird/catreq.c:646 -#, c-format -msgid "Invalid Catalog Update; DB not open: %s" -msgstr "Ungültige Catalog Aktualisierung; DB nicht geöffnet: %s" +#~ msgid "No Job records defined in %s\n" +#~ msgstr "Keine Job records definiert in %s\n" -#: src/dird/catreq.c:702 src/dird/catreq.c:717 -#, fuzzy, c-format -msgid "fread attr spool error. ERR=%s\n" -msgstr "Regex Übersetzungsfehler. ERR=%s\n" +#~ msgid "Hey something is wrong. p=0x%lu\n" +#~ msgstr "Hey etwas läuft schief. p=0x%lu\n" -#: src/dird/dir_plugins.c:170 src/filed/fd_plugins.c:1129 -#: src/stored/sd_plugins.c:221 -#, c-format -msgid "Loaded plugin: %s\n" -msgstr "" +#~ msgid "" +#~ "\"%s\" directive in Job \"%s\" resource is required, but not found.\n" +#~ msgstr "" +#~ "\"%s\" Directive in Job \"%s\" resource wird benötigt, wurde aber nicht " +#~ "gefunden.\n" -#: src/dird/dir_plugins.c:190 src/filed/fd_plugins.c:1150 -#: src/stored/sd_plugins.c:241 -#, c-format -msgid "Plugin magic wrong. Plugin=%s wanted=%s got=%s\n" -msgstr "" +#~ msgid "Too many items in Job resource\n" +#~ msgstr "zu viele items in Job resource\n" -#: src/dird/dir_plugins.c:198 src/filed/fd_plugins.c:1158 -#: src/stored/sd_plugins.c:249 -#, c-format -msgid "Plugin version incorrect. Plugin=%s wanted=%d got=%d\n" -msgstr "" +#~ msgid "No storage specified in Job \"%s\" nor in Pool.\n" +#~ msgstr "Weder storage noch Pool in Job \"%s\" definiert.\n" -#: src/dird/dir_plugins.c:207 src/filed/fd_plugins.c:1168 -#: src/stored/sd_plugins.c:258 -#, c-format -msgid "Plugin license incompatible. Plugin=%s license=%s\n" -msgstr "" +#~ msgid "Unable to get Job record. ERR=%s\n" +#~ msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" -#: src/dird/dir_plugins.c:215 src/filed/fd_plugins.c:1176 -#: src/stored/sd_plugins.c:266 -#, c-format -msgid "Plugin size incorrect. Plugin=%s wanted=%d got=%d\n" -msgstr "" +#~ msgid "Unable to get Job Volume Parameters. ERR=%s\n" +#~ msgstr "Konnte Job Volume Parameter nicht holen. ERR=%s\n" -#: src/dird/dird.c:121 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bacula-dir [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c set configuration file to file\n" -" -d [,] set debug level to , debug tags to \n" -" -dt print timestamp in debug output\n" -" -T set trace on\n" -" -f run in foreground (for debugging)\n" -" -g groupid\n" -" -m print kaboom output (for debugging)\n" -" -r run now\n" -" -s no signals\n" -" -t test - read configuration and exit\n" -" -u userid\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Version: %s (%s)\n" -"\n" -"Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c setze Konfigurationsdatei auf Datei\n" -" -dnn setze debug level auf nn\n" -" -f starte im Vordergrund (für debugging Zwecke)\n" -" -g groupid\n" -" -r starte jetzt\n" -" -s no signals\n" -" -t test - Konfiguration Lesen und beenden\n" -" -u userid\n" -" -v ausführliche Benutzer Meldungen\n" -" -? diese Meldung ausgeben.\n" -"\n" +#~ msgid "Unable to create bootstrap file %s. ERR=%s\n" +#~ msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" -#: src/dird/dird.c:502 #, fuzzy -msgid "Already doing a reload request, request ignored.\n" -msgstr "zu viele offene reload Anforderungen, Anforderung ignoriert.\n" +#~ msgid "No files found to read. No bootstrap file written.\n" +#~ msgstr "" +#~ "Keine Dateien für Wiederherstellung/Migration gefunden. Keine Bootstrap " +#~ "Datei geschrieben.\n" -#: src/dird/dird.c:526 -msgid "Too many open reload requests. Request ignored.\n" -msgstr "zu viele offene reload Anforderungen, Anforderung ignoriert.\n" +#~ msgid "Error writing bsr file.\n" +#~ msgstr "Fehler beim schreiben der bsr Datei.\n" -#: src/dird/dird.c:549 -msgid "Out of reload table entries. Giving up.\n" -msgstr "Keine reload table Einträge übrig. Gebe auf.\n" +#, fuzzy +#~ msgid "" +#~ "The Job will require the following (*=>InChanger):\n" +#~ " Volume(s) Storage(s) SD Device(s)\n" +#~ "===========================================================================\n" +#~ msgstr "" +#~ "Der Job wird folgendes benötigen:\n" +#~ " Volume(s) Storage(s) SD Device(s)\n" +#~ "===========================================================================\n" -#: src/dird/dird.c:552 -msgid "Resetting previous configuration.\n" -msgstr "Vorherige Konfiguration zurückgesetzt.\n" +#~ msgid "No Volumes found to restore.\n" +#~ msgstr "Keine Volumes zum Wiederherstellen gefunden.\n" -#: src/dird/dird.c:728 src/filed/filed.c:620 src/stored/stored.c:449 -#, c-format -msgid "Failed to initialize TLS context for Director \"%s\" in %s.\n" -msgstr "Konnte TLS context für Director nicht initialisieren \"%s\" in %s.\n" +#~ msgid "1990 Invalid Catalog Request: %s" +#~ msgstr "1990 Ungültige Catalog Anfrage: %s" -#: src/dird/dird.c:1044 src/dird/dird.c:1046 src/stored/bscan.c:287 -#: src/stored/bscan.c:294 -#, c-format -msgid "Could not open Catalog \"%s\", database \"%s\".\n" -msgstr "Konnte Catalog \"%s\", database \"%s\" nicht öffnen.\n" +#~ msgid "Invalid Catalog request; DB not open: %s" +#~ msgstr "Ungültige Catalog Anfrage; DB nicht offen: %s" -#: src/dird/dird.c:1049 src/stored/bscan.c:290 src/tools/cats_test.c:364 -#, c-format -msgid "%s" -msgstr "" +#~ msgid "1901 No Media.\n" +#~ msgstr "1901 Keine Medien.\n" -#: src/dird/dird.c:1149 -#, fuzzy, c-format -msgid "Could not create storage record for %s\n" -msgstr "Kann Storage resource %s nicht finden\n" +#~ msgid "not in Pool" +#~ msgstr "nicht in Pool" -#: src/dird/dird.c:1157 -#, fuzzy, c-format -msgid "Could not update storage record for %s\n" -msgstr "Kann Storage resource %s nicht finden\n" +#~ msgid "not correct MediaType" +#~ msgstr "nicht korrekter Medientyp" -#: src/dird/dird.c:1176 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Storage \"%s\" in %s.\n" -msgstr "" -"Weder \"TLS CA Certificate\" noch \"TLS CA Certificate Dir\" sind definiert " -"fürStorage \"%s\" in %s.\n" +#~ msgid "is not Enabled" +#~ msgstr "ist nicht aktiviert" -#: src/dird/dird.c:1192 src/stored/stored.c:402 -#, c-format -msgid "Failed to initialize TLS context for Storage \"%s\" in %s.\n" -msgstr "Konnte TLS context für Storage \"%s\" in %s nicht initialisieren.\n" +#, fuzzy +#~ msgid "1998 Volume \"%s\" catalog status is %s, %s.\n" +#~ msgstr "1998 Volume \"%s\" status ist %s, %s.\n" -#: src/dird/dird.c:1306 src/dird/mac_sql.c:548 src/stored/stored.c:505 -#, c-format -msgid "Could not compile regex pattern \"%s\" ERR=%s\n" -msgstr "Konnte regex pattern \"%s\" nicht kompilieren ERR=%s\n" +#~ msgid "1997 Volume \"%s\" not in catalog.\n" +#~ msgstr "1997 Volume \"%s\" Nicht in Catalog.\n" -#: src/dird/dird_conf.c:579 src/qt-console/tray-monitor/tray_conf.cpp:158 -#, c-format -msgid "No %s resource defined\n" -msgstr "Keine %s resource definiert\n" +#~ msgid "Unable to get Media record for Volume %s: ERR=%s\n" +#~ msgstr "Konnte Media record für Volume %s nicht holen: ERR=%s\n" -#: src/dird/dird_conf.c:588 -#, c-format -msgid "Director: name=%s MaxJobs=%d FDtimeout=%s SDtimeout=%s\n" -msgstr "Director: name=%s MaxJobs=%d FDtimeout=%s SDtimeout=%s\n" +#~ msgid "1991 Catalog Request for vol=%s failed: %s" +#~ msgstr "1991 Catalog Anfrage für vol=%s fehlgeschlagen: %s" -#: src/dird/dird_conf.c:593 -#, c-format -msgid " query_file=%s\n" -msgstr " query_file=%s\n" - -#: src/dird/dird_conf.c:596 src/dird/dird_conf.c:616 src/dird/dird_conf.c:641 -#: src/dird/dird_conf.c:733 src/dird/dird_conf.c:737 src/dird/dird_conf.c:741 -#: src/dird/dird_conf.c:774 src/dird/dird_conf.c:797 src/dird/dird_conf.c:813 -#: src/dird/dird_conf.c:826 src/dird/dird_conf.c:1069 -#: src/dird/dird_conf.c:1076 -msgid " --> " -msgstr " --> " - -#: src/dird/dird_conf.c:601 -#, c-format -msgid "Console: name=%s SSL=%d\n" -msgstr "Console: name=%s SSL=%d\n" +#, fuzzy +#~ msgid "" +#~ "Attempt to set Volume Files from %u to %u for Volume \"%s\". Ignored.\n" +#~ msgstr "" +#~ "Volume Files bei %u werden auf %u für Volumen \"%s\" gesetzt. Dies ist " +#~ "nicht Korrekt.\n" -#: src/dird/dird_conf.c:606 -#, c-format -msgid "Counter: name=%s min=%d max=%d cur=%d wrapcntr=%s\n" -msgstr "Counter: name=%s min=%d max=%d cur=%d wrapcntr=%s\n" +#~ msgid "Catalog error updating Media record. %s" +#~ msgstr "Catalog Fehler beim Aktualisieren des Media Eintrags. %s" -#: src/dird/dird_conf.c:611 -#, c-format -msgid "Counter: name=%s min=%d max=%d\n" -msgstr "Counter: name=%s min=%d max=%d\n" +#~ msgid "1993 Update Media error\n" +#~ msgstr "1993 Update Media Fehler\n" -#: src/dird/dird_conf.c:625 -#, fuzzy, c-format -msgid "Client: Name=%s Enabled=%d Address=%s FDport=%d MaxJobs=%u\n" -msgstr "Client: name=%s address=%s FDport=%d MaxJobs=%u\n" +#~ msgid "Catalog error creating JobMedia record. %s" +#~ msgstr "Catalog Fehler beim Erzeugen des JobMedia Eintrags. %s" -#: src/dird/dird_conf.c:629 -#, c-format -msgid " JobRetention=%s FileRetention=%s AutoPrune=%d\n" -msgstr " JobRetention=%s FileRetention=%s AutoPrune=%d\n" +#, fuzzy +#~ msgid "1992 Create JobMedia error\n" +#~ msgstr "1991 Update JobMedia Fehler\n" -#: src/dird/dird_conf.c:637 src/dird/dird_conf.c:726 -#, c-format -msgid " MaximumBandwidth=%lld\n" -msgstr "" +#~ msgid "Invalid Catalog request: %s" +#~ msgstr "Ungültige Catalog Anfrage: %s" -#: src/dird/dird_conf.c:649 -#, c-format -msgid "" -"Device: name=%s ok=%d num_writers=%d max_writers=%d\n" -" reserved=%d open=%d append=%d read=%d labeled=%d offline=%d autochgr=" -"%d\n" -" poolid=%s volname=%s MediaType=%s\n" -msgstr "" -"Device: name=%s ok=%d num_writers=%d max_writers=%d\n" -" reserved=%d open=%d append=%d read=%d labeled=%d offline=%d autochgr=" -"%d\n" -" poolid=%s volname=%s MediaType=%s\n" +#, fuzzy +#~ msgid "Attribute create error: ERR=%s" +#~ msgstr "Attribute create error. %s" -#: src/dird/dird_conf.c:664 -#, fuzzy, c-format -msgid "" -"%s: name=%s address=%s SDport=%d MaxJobs=%u\n" -" DeviceName=%s MediaType=%s StorageId=%s Autochanger=%d\n" -msgstr "" -"Storage: name=%s address=%s SDport=%d MaxJobs=%u\n" -" DeviceName=%s MediaType=%s StorageId=%s\n" +#, fuzzy +#~ msgid "Restore object create error. %s" +#~ msgstr "Attribute create error. %s" -#: src/dird/dird_conf.c:682 #, fuzzy -msgid " Parent --> " -msgstr " --> " +#~ msgid "%s not same File=%d as attributes=%d\n" +#~ msgstr "Erhielt %s aber nicht die gleiche Datei wie Attribute\n" + +#~ msgid "" +#~ "Catalog error updating file digest. Unsupported digest stream type: %d" +#~ msgstr "" +#~ "Catalog Fehler beim Aktualisieren des file digest. Nicht unterstützter " +#~ "digest stream typ: %d" -#: src/dird/dird_conf.c:687 #, fuzzy -msgid " Shared --> " -msgstr " --> " +#~ msgid "attribute create error. %s" +#~ msgstr "Attribute create error. %s" -#: src/dird/dird_conf.c:696 -#, fuzzy, c-format -msgid "" -"Catalog: name=%s address=%s DBport=%d db_name=%s\n" -" db_driver=%s db_user=%s MutliDBConn=%d\n" -msgstr "" -"Catalog: name=%s address=%s DBport=%d db_name=%s\n" -" db_user=%s MutliDBConn=%d\n" +#~ msgid "Catalog error updating file digest. %s" +#~ msgstr "Catalog Fehler beim Aktualisieren des file digest. %s" -#: src/dird/dird_conf.c:709 -#, c-format -msgid "%s: name=%s JobType=%d level=%s Priority=%d Enabled=%d\n" -msgstr "%s: name=%s JobType=%d level=%s Priority=%d Enabled=%d\n" +#, fuzzy +#~ msgid "1994 Invalid Catalog Update: %s" +#~ msgstr "1991 Ungültige Catalog Aktualisierung: %s" -#: src/dird/dird_conf.c:710 src/dird/ua_prune.c:603 src/dird/ua_run.c:1013 -#: src/dird/ua_select.c:292 src/dird/ua_select.c:315 src/dird/ua_select.c:356 -#: src/dird/ua_select.c:1453 -msgid "Job" -msgstr "Job" +#~ msgid "Invalid Catalog Update; DB not open: %s" +#~ msgstr "Ungültige Catalog Aktualisierung; DB nicht geöffnet: %s" -#: src/dird/dird_conf.c:710 -msgid "JobDefs" -msgstr "JobDefs" +#, fuzzy +#~ msgid "fread attr spool error. ERR=%s\n" +#~ msgstr "Regex Übersetzungsfehler. ERR=%s\n" -#: src/dird/dird_conf.c:714 -#, c-format -msgid "" -" MaxJobs=%u Resched=%d Times=%d Interval=%s Spool=%d WritePartAfterJob=" -"%d\n" -msgstr "" -" MaxJobs=%u Resched=%d Times=%d Interval=%s Spool=%d WritePartAfterJob=" -"%d\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bacula-dir [-f -s] [-c config_file] [-d debug_level] " +#~ "[config_file]\n" +#~ " -c set configuration file to file\n" +#~ " -d [,] set debug level to , debug tags to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -T set trace on\n" +#~ " -f run in foreground (for debugging)\n" +#~ " -g groupid\n" +#~ " -m print kaboom output (for debugging)\n" +#~ " -r run now\n" +#~ " -s no signals\n" +#~ " -t test - read configuration and exit\n" +#~ " -u userid\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Version: %s (%s)\n" +#~ "\n" +#~ "Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c setze Konfigurationsdatei auf Datei\n" +#~ " -dnn setze debug level auf nn\n" +#~ " -f starte im Vordergrund (für debugging Zwecke)\n" +#~ " -g groupid\n" +#~ " -r starte jetzt\n" +#~ " -s no signals\n" +#~ " -t test - Konfiguration Lesen und beenden\n" +#~ " -u userid\n" +#~ " -v ausführliche Benutzer Meldungen\n" +#~ " -? diese Meldung ausgeben.\n" +#~ "\n" -#: src/dird/dird_conf.c:720 -#, fuzzy, c-format -msgid " SpoolSize=%s\n" -msgstr " opcmd=%s\n" +#, fuzzy +#~ msgid "Already doing a reload request, request ignored.\n" +#~ msgstr "zu viele offene reload Anforderungen, Anforderung ignoriert.\n" -#: src/dird/dird_conf.c:723 -#, fuzzy, c-format -msgid " Accurate=%d\n" -msgstr " SelectionType=%d\n" +#~ msgid "Too many open reload requests. Request ignored.\n" +#~ msgstr "zu viele offene reload Anforderungen, Anforderung ignoriert.\n" -#: src/dird/dird_conf.c:730 -#, c-format -msgid " SelectionType=%d\n" -msgstr " SelectionType=%d\n" +#~ msgid "Out of reload table entries. Giving up.\n" +#~ msgstr "Keine reload table Einträge übrig. Gebe auf.\n" -#: src/dird/dird_conf.c:745 -#, c-format -msgid " --> Where=%s\n" -msgstr " --> Where=%s\n" +#~ msgid "Resetting previous configuration.\n" +#~ msgstr "Vorherige Konfiguration zurückgesetzt.\n" -#: src/dird/dird_conf.c:748 -#, fuzzy, c-format -msgid " --> RegexWhere=%s\n" -msgstr " --> Where=%s\n" +#~ msgid "Failed to initialize TLS context for Director \"%s\" in %s.\n" +#~ msgstr "" +#~ "Konnte TLS context für Director nicht initialisieren \"%s\" in %s.\n" -#: src/dird/dird_conf.c:751 -#, c-format -msgid " --> Bootstrap=%s\n" -msgstr " --> Bootstrap=%s\n" +#~ msgid "Could not open Catalog \"%s\", database \"%s\".\n" +#~ msgstr "Konnte Catalog \"%s\", database \"%s\" nicht öffnen.\n" -#: src/dird/dird_conf.c:754 -#, c-format -msgid " --> WriteBootstrap=%s\n" -msgstr " --> WriteBootstrap=%s\n" +#, fuzzy +#~ msgid "Could not create storage record for %s\n" +#~ msgstr "Kann Storage resource %s nicht finden\n" -#: src/dird/dird_conf.c:757 -#, fuzzy, c-format -msgid " --> PluginOptions=%s\n" -msgstr " --> Run=%s\n" +#, fuzzy +#~ msgid "Could not update storage record for %s\n" +#~ msgstr "Kann Storage resource %s nicht finden\n" -#: src/dird/dird_conf.c:760 -#, fuzzy, c-format -msgid " --> MaxRunTime=%u\n" -msgstr " --> RunWhen=%u\n" +#~ msgid "" +#~ "Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined " +#~ "for Storage \"%s\" in %s.\n" +#~ msgstr "" +#~ "Weder \"TLS CA Certificate\" noch \"TLS CA Certificate Dir\" sind " +#~ "definiert fürStorage \"%s\" in %s.\n" -#: src/dird/dird_conf.c:763 -#, fuzzy, c-format -msgid " --> MaxWaitTime=%u\n" -msgstr " --> RunWhen=%u\n" +#~ msgid "Failed to initialize TLS context for Storage \"%s\" in %s.\n" +#~ msgstr "Konnte TLS context für Storage \"%s\" in %s nicht initialisieren.\n" -#: src/dird/dird_conf.c:766 -#, fuzzy, c-format -msgid " --> MaxStartDelay=%u\n" -msgstr " --> Target=%s\n" +#~ msgid "Could not compile regex pattern \"%s\" ERR=%s\n" +#~ msgstr "Konnte regex pattern \"%s\" nicht kompilieren ERR=%s\n" -#: src/dird/dird_conf.c:769 -#, fuzzy, c-format -msgid " --> MaxRunSchedTime=%u\n" -msgstr " --> RunWhen=%u\n" +#~ msgid "Director: name=%s MaxJobs=%d FDtimeout=%s SDtimeout=%s\n" +#~ msgstr "Director: name=%s MaxJobs=%d FDtimeout=%s SDtimeout=%s\n" -#: src/dird/dird_conf.c:781 -#, fuzzy, c-format -msgid " --> Base %s\n" -msgstr " --> Target=%s\n" +#~ msgid " query_file=%s\n" +#~ msgstr " query_file=%s\n" -#: src/dird/dird_conf.c:787 src/lib/runscript.c:286 -msgid " --> RunScript\n" -msgstr " --> RunScript\n" +#~ msgid " --> " +#~ msgstr " --> " -#: src/dird/dird_conf.c:788 src/lib/runscript.c:287 -#, c-format -msgid " --> Command=%s\n" -msgstr " --> Command=%s\n" +#~ msgid "Console: name=%s SSL=%d\n" +#~ msgstr "Console: name=%s SSL=%d\n" -#: src/dird/dird_conf.c:789 src/lib/runscript.c:288 -#, c-format -msgid " --> Target=%s\n" -msgstr " --> Target=%s\n" +#~ msgid "Counter: name=%s min=%d max=%d cur=%d wrapcntr=%s\n" +#~ msgstr "Counter: name=%s min=%d max=%d cur=%d wrapcntr=%s\n" -#: src/dird/dird_conf.c:790 src/lib/runscript.c:289 -#, c-format -msgid " --> RunOnSuccess=%u\n" -msgstr " --> RunOnSuccess=%u\n" +#~ msgid "Counter: name=%s min=%d max=%d\n" +#~ msgstr "Counter: name=%s min=%d max=%d\n" -#: src/dird/dird_conf.c:791 src/lib/runscript.c:290 -#, c-format -msgid " --> RunOnFailure=%u\n" -msgstr " --> RunOnFailure=%u\n" +#, fuzzy +#~ msgid "Client: Name=%s Enabled=%d Address=%s FDport=%d MaxJobs=%u\n" +#~ msgstr "Client: name=%s address=%s FDport=%d MaxJobs=%u\n" -#: src/dird/dird_conf.c:792 src/lib/runscript.c:291 -#, fuzzy, c-format -msgid " --> FailJobOnError=%u\n" -msgstr " --> AbortJobOnError=%u\n" +#~ msgid " JobRetention=%s FileRetention=%s AutoPrune=%d\n" +#~ msgstr " JobRetention=%s FileRetention=%s AutoPrune=%d\n" -#: src/dird/dird_conf.c:793 src/lib/runscript.c:292 -#, c-format -msgid " --> RunWhen=%u\n" -msgstr " --> RunWhen=%u\n" +#~ msgid "" +#~ "Device: name=%s ok=%d num_writers=%d max_writers=%d\n" +#~ " reserved=%d open=%d append=%d read=%d labeled=%d offline=%d " +#~ "autochgr=%d\n" +#~ " poolid=%s volname=%s MediaType=%s\n" +#~ msgstr "" +#~ "Device: name=%s ok=%d num_writers=%d max_writers=%d\n" +#~ " reserved=%d open=%d append=%d read=%d labeled=%d offline=%d " +#~ "autochgr=%d\n" +#~ " poolid=%s volname=%s MediaType=%s\n" -#: src/dird/dird_conf.c:801 -msgid " --> FullBackup" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "%s: name=%s address=%s SDport=%d MaxJobs=%u\n" +#~ " DeviceName=%s MediaType=%s StorageId=%s Autochanger=%d\n" +#~ msgstr "" +#~ "Storage: name=%s address=%s SDport=%d MaxJobs=%u\n" +#~ " DeviceName=%s MediaType=%s StorageId=%s\n" -#: src/dird/dird_conf.c:805 -msgid " --> IncrementalBackup" -msgstr "" +#, fuzzy +#~ msgid " Parent --> " +#~ msgstr " --> " -#: src/dird/dird_conf.c:809 -msgid " --> DifferentialBackup" -msgstr "" +#, fuzzy +#~ msgid " Shared --> " +#~ msgstr " --> " -#: src/dird/dird_conf.c:819 -#, c-format -msgid " --> Run=%s\n" -msgstr " --> Run=%s\n" +#, fuzzy +#~ msgid "" +#~ "Catalog: name=%s address=%s DBport=%d db_name=%s\n" +#~ " db_driver=%s db_user=%s MutliDBConn=%d\n" +#~ msgstr "" +#~ "Catalog: name=%s address=%s DBport=%d db_name=%s\n" +#~ " db_user=%s MutliDBConn=%d\n" -#: src/dird/dird_conf.c:823 -#, c-format -msgid " --> SelectionPattern=%s\n" -msgstr " --> SelectionPattern=%s\n" +#~ msgid "%s: name=%s JobType=%d level=%s Priority=%d Enabled=%d\n" +#~ msgstr "%s: name=%s JobType=%d level=%s Priority=%d Enabled=%d\n" -#: src/dird/dird_conf.c:837 -#, c-format -msgid "FileSet: name=%s\n" -msgstr "FileSet: name=%s\n" +#~ msgid "Job" +#~ msgstr "Job" -#: src/dird/dird_conf.c:931 -#, fuzzy, c-format -msgid "Schedule: Name=%s Enabled=%d\n" -msgstr "Schedule: name=%s\n" +#~ msgid "JobDefs" +#~ msgstr "JobDefs" -#: src/dird/dird_conf.c:937 -#, c-format -msgid " --> Run Level=%s\n" -msgstr " --> Run Level=%s\n" +#~ msgid "" +#~ " MaxJobs=%u Resched=%d Times=%d Interval=%s Spool=%d " +#~ "WritePartAfterJob=%d\n" +#~ msgstr "" +#~ " MaxJobs=%u Resched=%d Times=%d Interval=%s Spool=%d " +#~ "WritePartAfterJob=%d\n" -#: src/dird/dird_conf.c:939 -#, fuzzy, c-format -msgid " MaxRunSchedTime=%u\n" -msgstr " --> RunWhen=%u\n" +#, fuzzy +#~ msgid " SpoolSize=%s\n" +#~ msgstr " opcmd=%s\n" -#: src/dird/dird_conf.c:942 -#, fuzzy, c-format -msgid " Priority=%u\n" -msgstr " woy=" +#, fuzzy +#~ msgid " Accurate=%d\n" +#~ msgstr " SelectionType=%d\n" -#: src/dird/dird_conf.c:944 -msgid " hour=" -msgstr " hour=" +#~ msgid " SelectionType=%d\n" +#~ msgstr " SelectionType=%d\n" -#: src/dird/dird_conf.c:953 -msgid " mday=" -msgstr " mday=" +#~ msgid " --> Where=%s\n" +#~ msgstr " --> Where=%s\n" -#: src/dird/dird_conf.c:962 -msgid " month=" -msgstr " month=" +#, fuzzy +#~ msgid " --> RegexWhere=%s\n" +#~ msgstr " --> Where=%s\n" -#: src/dird/dird_conf.c:971 -msgid " wday=" -msgstr " wday=" +#~ msgid " --> Bootstrap=%s\n" +#~ msgstr " --> Bootstrap=%s\n" -#: src/dird/dird_conf.c:980 -msgid " wom=" -msgstr " wom=" +#~ msgid " --> WriteBootstrap=%s\n" +#~ msgstr " --> WriteBootstrap=%s\n" -#: src/dird/dird_conf.c:989 -msgid " woy=" -msgstr " woy=" +#, fuzzy +#~ msgid " --> PluginOptions=%s\n" +#~ msgstr " --> Run=%s\n" -#: src/dird/dird_conf.c:998 -#, c-format -msgid " mins=%d\n" -msgstr " mins=%d\n" +#, fuzzy +#~ msgid " --> MaxRunTime=%u\n" +#~ msgstr " --> RunWhen=%u\n" -#: src/dird/dird_conf.c:1000 src/dird/dird_conf.c:1004 -#: src/dird/dird_conf.c:1008 -msgid " --> " -msgstr " --> " +#, fuzzy +#~ msgid " --> MaxWaitTime=%u\n" +#~ msgstr " --> RunWhen=%u\n" -#: src/dird/dird_conf.c:1017 -#, c-format -msgid "Schedule: name=%s\n" -msgstr "Schedule: name=%s\n" +#, fuzzy +#~ msgid " --> MaxStartDelay=%u\n" +#~ msgstr " --> Target=%s\n" -#: src/dird/dird_conf.c:1025 -#, c-format -msgid "Pool: name=%s PoolType=%s\n" -msgstr "Pool: name=%s PoolType=%s\n" +#, fuzzy +#~ msgid " --> MaxRunSchedTime=%u\n" +#~ msgstr " --> RunWhen=%u\n" -#: src/dird/dird_conf.c:1027 -#, c-format -msgid " use_cat=%d use_once=%d cat_files=%d\n" -msgstr " use_cat=%d use_once=%d cat_files=%d\n" +#, fuzzy +#~ msgid " --> Base %s\n" +#~ msgstr " --> Target=%s\n" -#: src/dird/dird_conf.c:1030 -#, c-format -msgid " max_vols=%d auto_prune=%d VolRetention=%s\n" -msgstr " max_vols=%d auto_prune=%d VolRetention=%s\n" +#~ msgid " --> RunScript\n" +#~ msgstr " --> RunScript\n" -#: src/dird/dird_conf.c:1033 -#, c-format -msgid " VolUse=%s recycle=%d LabelFormat=%s\n" -msgstr " VolUse=%s recycle=%d LabelFormat=%s\n" +#~ msgid " --> Command=%s\n" +#~ msgstr " --> Command=%s\n" -#: src/dird/dird_conf.c:1037 -#, c-format -msgid " CleaningPrefix=%s LabelType=%d\n" -msgstr " CleaningPrefix=%s LabelType=%d\n" +#~ msgid " --> Target=%s\n" +#~ msgstr " --> Target=%s\n" -#: src/dird/dird_conf.c:1039 -#, fuzzy, c-format -msgid " RecyleOldest=%d PurgeOldest=%d ActionOnPurge=%d\n" -msgstr " RecyleOldest=%d PurgeOldest=%d MaxVolJobs=%d MaxVolFiles=%d\n" +#~ msgid " --> RunOnSuccess=%u\n" +#~ msgstr " --> RunOnSuccess=%u\n" -#: src/dird/dird_conf.c:1043 -#, fuzzy, c-format -msgid " MaxVolJobs=%d MaxVolFiles=%d MaxVolBytes=%s\n" -msgstr " max_vols=%d auto_prune=%d VolRetention=%s\n" +#~ msgid " --> RunOnFailure=%u\n" +#~ msgstr " --> RunOnFailure=%u\n" -#: src/dird/dird_conf.c:1047 -#, c-format -msgid " MigTime=%s MigHiBytes=%s MigLoBytes=%s\n" -msgstr " MigTime=%s MigHiBytes=%s MigLoBytes=%s\n" +#, fuzzy +#~ msgid " --> FailJobOnError=%u\n" +#~ msgstr " --> AbortJobOnError=%u\n" -#: src/dird/dird_conf.c:1051 -#, fuzzy, c-format -msgid " JobRetention=%s FileRetention=%s\n" -msgstr " JobRetention=%s FileRetention=%s AutoPrune=%d\n" +#~ msgid " --> RunWhen=%u\n" +#~ msgstr " --> RunWhen=%u\n" -#: src/dird/dird_conf.c:1055 -#, fuzzy, c-format -msgid " NextPool=%s\n" -msgstr " opcmd=%s\n" +#~ msgid " --> Run=%s\n" +#~ msgstr " --> Run=%s\n" -#: src/dird/dird_conf.c:1058 -#, fuzzy, c-format -msgid " RecyclePool=%s\n" -msgstr " opcmd=%s\n" +#~ msgid " --> SelectionPattern=%s\n" +#~ msgstr " --> SelectionPattern=%s\n" -#: src/dird/dird_conf.c:1061 -#, fuzzy, c-format -msgid " ScratchPool=%s\n" -msgstr " opcmd=%s\n" +#~ msgid "FileSet: name=%s\n" +#~ msgstr "FileSet: name=%s\n" -#: src/dird/dird_conf.c:1064 -#, fuzzy, c-format -msgid " Catalog=%s\n" -msgstr " mailcmd=%s\n" +#, fuzzy +#~ msgid "Schedule: Name=%s Enabled=%d\n" +#~ msgstr "Schedule: name=%s\n" -#: src/dird/dird_conf.c:1084 -#, c-format -msgid "Messages: name=%s\n" -msgstr "Messages: name=%s\n" +#~ msgid " --> Run Level=%s\n" +#~ msgstr " --> Run Level=%s\n" -#: src/dird/dird_conf.c:1086 -#, c-format -msgid " mailcmd=%s\n" -msgstr " mailcmd=%s\n" +#, fuzzy +#~ msgid " MaxRunSchedTime=%u\n" +#~ msgstr " --> RunWhen=%u\n" -#: src/dird/dird_conf.c:1088 -#, c-format -msgid " opcmd=%s\n" -msgstr " opcmd=%s\n" +#, fuzzy +#~ msgid " Priority=%u\n" +#~ msgstr " woy=" -#: src/dird/dird_conf.c:1092 src/qt-console/tray-monitor/tray_conf.cpp:189 -#, c-format -msgid "Unknown resource type %d in dump_resource.\n" -msgstr "Unbekannter resource type %d in dump_resource.\n" +#~ msgid " hour=" +#~ msgstr " hour=" -#: src/dird/dird_conf.c:1437 src/qt-console/tray-monitor/tray_conf.cpp:247 -#, c-format -msgid "Unknown resource type %d in free_resource.\n" -msgstr "Unbekannter resource type %d in free_resource.\n" +#~ msgid " mday=" +#~ msgstr " mday=" -#: src/dird/dird_conf.c:1472 src/lib/parse_conf.c:259 -#: src/qt-console/tray-monitor/tray_conf.cpp:280 -#, c-format -msgid "Too many items in %s resource\n" -msgstr "zu viele items in %s resource\n" +#~ msgid " month=" +#~ msgstr " month=" -#: src/dird/dird_conf.c:1512 -#, c-format -msgid "Cannot find Pool resource %s\n" -msgstr "Kann Pool resource %s nicht finden\n" +#~ msgid " wday=" +#~ msgstr " wday=" -#: src/dird/dird_conf.c:1523 -#, c-format -msgid "Cannot find Console resource %s\n" -msgstr "Kann Console resource %s nicht finden\n" +#~ msgid " wom=" +#~ msgstr " wom=" -#: src/dird/dird_conf.c:1529 src/filed/filed_conf.c:467 -#: src/stored/stored_conf.c:628 -#, c-format -msgid "Cannot find Director resource %s\n" -msgstr "Kann Director resource %s nicht finden\n" +#~ msgid " woy=" +#~ msgstr " woy=" -#: src/dird/dird_conf.c:1538 src/stored/stored_conf.c:634 -#, c-format -msgid "Cannot find Storage resource %s\n" -msgstr "Kann Storage resource %s nicht finden\n" +#~ msgid " mins=%d\n" +#~ msgstr " mins=%d\n" -#: src/dird/dird_conf.c:1554 -#, c-format -msgid "Cannot find Job resource %s\n" -msgstr "Kann Job resource %s nicht finden\n" +#~ msgid " --> " +#~ msgstr " --> " -#: src/dird/dird_conf.c:1605 -#, c-format -msgid "Cannot find Counter resource %s\n" -msgstr "Kann Counter resource %s nicht finden\n" +#~ msgid "Schedule: name=%s\n" +#~ msgstr "Schedule: name=%s\n" -#: src/dird/dird_conf.c:1613 src/filed/filed_conf.c:474 -#, c-format -msgid "Cannot find Client resource %s\n" -msgstr "Kann Client resource %s nicht finden\n" +#~ msgid "Pool: name=%s PoolType=%s\n" +#~ msgstr "Pool: name=%s PoolType=%s\n" -#: src/dird/dird_conf.c:1626 -#, c-format -msgid "Cannot find Schedule resource %s\n" -msgstr "Kann Schedule resource %s nicht finden\n" +#~ msgid " use_cat=%d use_once=%d cat_files=%d\n" +#~ msgstr " use_cat=%d use_once=%d cat_files=%d\n" -#: src/dird/dird_conf.c:1631 src/dird/dird_conf.c:1697 -#: src/qt-console/tray-monitor/tray_conf.cpp:300 -#: src/qt-console/tray-monitor/tray_conf.cpp:338 -#, c-format -msgid "Unknown resource type %d in save_resource.\n" -msgstr "Unbekannter resource type %d in save_resource.\n" +#~ msgid " max_vols=%d auto_prune=%d VolRetention=%s\n" +#~ msgstr " max_vols=%d auto_prune=%d VolRetention=%s\n" -#: src/dird/dird_conf.c:1714 -#, fuzzy, c-format -msgid "Expected one of: %s, got: %s" -msgstr "Erwartet: %s, erhalten: %s" +#~ msgid " VolUse=%s recycle=%d LabelFormat=%s\n" +#~ msgstr " VolUse=%s recycle=%d LabelFormat=%s\n" -#: src/dird/dird_conf.c:1753 -#, fuzzy, c-format -msgid "Could not find Storage Resource %s referenced on line %d : %s\n" -msgstr "" -"Konnte config Resource %s , referenziert in Zeile %d : %s nicht finden\n" +#~ msgid " CleaningPrefix=%s LabelType=%d\n" +#~ msgstr " CleaningPrefix=%s LabelType=%d\n" -#: src/dird/dird_conf.c:1758 -#, fuzzy, c-format -msgid "" -"Attempt to redefine Storage resource \"%s\" referenced on line %d : %s\n" -msgstr "" -"Konnte config Resource %s , referenziert in Zeile %d : %s nicht finden\n" +#, fuzzy +#~ msgid " RecyleOldest=%d PurgeOldest=%d ActionOnPurge=%d\n" +#~ msgstr " RecyleOldest=%d PurgeOldest=%d MaxVolJobs=%d MaxVolFiles=%d\n" -#: src/dird/dird_conf.c:1833 -#, c-format -msgid "Expected a Migration Job Type keyword, got: %s" -msgstr " Migration Job Type Schlüsselwort erwartet, erhalten: %s" +#, fuzzy +#~ msgid " MaxVolJobs=%d MaxVolFiles=%d MaxVolBytes=%s\n" +#~ msgstr " max_vols=%d auto_prune=%d VolRetention=%s\n" -#: src/dird/dird_conf.c:1859 -#, c-format -msgid "Expected a Job Type keyword, got: %s" -msgstr "Job Type Schlüsselwort erwartet, erhalten: %s" +#~ msgid " MigTime=%s MigHiBytes=%s MigLoBytes=%s\n" +#~ msgstr " MigTime=%s MigHiBytes=%s MigLoBytes=%s\n" -#: src/dird/dird_conf.c:1883 -#, c-format -msgid "Expected a Job Level keyword, got: %s" -msgstr "Job Level Schlüsselwort erwartet, erhalten: %s" +#, fuzzy +#~ msgid " JobRetention=%s FileRetention=%s\n" +#~ msgstr " JobRetention=%s FileRetention=%s AutoPrune=%d\n" -#: src/dird/dird_conf.c:1903 -#, c-format -msgid "Expected a Restore replacement option, got: %s" -msgstr "Restore replacement Option erwartet, erhalten: %s" +#, fuzzy +#~ msgid " NextPool=%s\n" +#~ msgstr " opcmd=%s\n" -#: src/dird/dird_conf.c:1955 src/dird/dird_conf.c:2071 src/lib/ini.c:636 -#: src/lib/parse_conf.c:828 src/lib/parse_conf.c:844 -#, c-format -msgid "Expect %s, got: %s" -msgstr "Erwartet: %s, erhalten: %s" +#, fuzzy +#~ msgid " RecyclePool=%s\n" +#~ msgstr " opcmd=%s\n" -#: src/dird/dird_conf.c:1977 src/lib/parse_conf.c:537 -#, c-format -msgid "Could not find config Resource %s referenced on line %d : %s\n" -msgstr "" -"Konnte config Resource %s , referenziert in Zeile %d : %s nicht finden\n" +#, fuzzy +#~ msgid " ScratchPool=%s\n" +#~ msgstr " opcmd=%s\n" -#: src/dird/dird_conf.c:2111 src/dird/inc_conf.c:701 -#, c-format -msgid "Expecting open brace. Got %s" -msgstr "Geschweifte Klammer auf erwartet, erhalten: %s" +#, fuzzy +#~ msgid " Catalog=%s\n" +#~ msgstr " mailcmd=%s\n" -#: src/dird/dird_conf.c:2125 src/dird/inc_conf.c:370 src/dird/inc_conf.c:716 -#, c-format -msgid "Expecting keyword, got: %s\n" -msgstr "Schlüsselwort erwartet, erhalten:%s\n" +#~ msgid "Messages: name=%s\n" +#~ msgstr "Messages: name=%s\n" -#: src/dird/dird_conf.c:2131 src/dird/inc_conf.c:378 src/dird/inc_conf.c:722 -#: src/lib/parse_conf.c:1037 -#, c-format -msgid "expected an equals, got: %s" -msgstr "Erwartete ein \"ist gleich\", erhalten: %s" +#~ msgid " mailcmd=%s\n" +#~ msgstr " mailcmd=%s\n" -#: src/dird/dird_conf.c:2142 src/dird/inc_conf.c:388 src/dird/inc_conf.c:731 -#, c-format -msgid "Keyword %s not permitted in this resource" -msgstr "Schlüsselwort %s ist in dieser Ressource nicht erlaubt." +#~ msgid " opcmd=%s\n" +#~ msgstr " opcmd=%s\n" -#: src/dird/expand.c:244 -#, c-format -msgid "Count not update counter %s: ERR=%s\n" -msgstr "Konnte counter %s: nicht aktualisieren: ERR=%s\n" +#~ msgid "Cannot find Pool resource %s\n" +#~ msgstr "Kann Pool resource %s nicht finden\n" -#: src/dird/expand.c:416 -#, c-format -msgid "Cannot create var context: ERR=%s\n" -msgstr "Kann var context nicht erzeugen: ERR=%s\n" +#~ msgid "Cannot find Console resource %s\n" +#~ msgstr "Kann Console resource %s nicht finden\n" -#: src/dird/expand.c:421 -#, c-format -msgid "Cannot set var callback: ERR=%s\n" -msgstr "kann Variable callback nicht setzen: ERR=%s\n" +#~ msgid "Cannot find Director resource %s\n" +#~ msgstr "Kann Director resource %s nicht finden\n" -#: src/dird/expand.c:427 -#, c-format -msgid "Cannot set var operate: ERR=%s\n" -msgstr "kann Variable operate nicht setzen: ERR=%s\n" +#~ msgid "Cannot find Storage resource %s\n" +#~ msgstr "Kann Storage resource %s nicht finden\n" -#: src/dird/expand.c:433 src/dird/expand.c:448 -#, c-format -msgid "Cannot unescape string: ERR=%s\n" -msgstr "Cannot unescape string: ERR=%s\n" +#~ msgid "Cannot find Job resource %s\n" +#~ msgstr "Kann Job resource %s nicht finden\n" -#: src/dird/expand.c:441 -#, c-format -msgid "Cannot expand expression \"%s\": ERR=%s\n" -msgstr "Kann Ausdruck\"%s\"nicht auflösen: ERR=%s\n" +#~ msgid "Cannot find Counter resource %s\n" +#~ msgstr "Kann Counter resource %s nicht finden\n" -#: src/dird/expand.c:459 -#, fuzzy, c-format -msgid "Cannot destroy var context: ERR=%s\n" -msgstr "kann Variable context nicht zerstören: ERR=%s\n" +#~ msgid "Cannot find Client resource %s\n" +#~ msgstr "Kann Client resource %s nicht finden\n" -#: src/dird/fd_cmds.c:81 -msgid "File daemon not defined for current Job\n" -msgstr "" +#~ msgid "Cannot find Schedule resource %s\n" +#~ msgstr "Kann Schedule resource %s nicht finden\n" -#: src/dird/fd_cmds.c:98 -msgid "Client: " -msgstr "" +#, fuzzy +#~ msgid "Expected one of: %s, got: %s" +#~ msgstr "Erwartet: %s, erhalten: %s" -#: src/dird/fd_cmds.c:134 -#, c-format -msgid "File daemon \"%s\" rejected Job command: %s\n" -msgstr "File daemon \"%s\" hat Job Kommando abgewiesen: %s\n" +#, fuzzy +#~ msgid "Could not find Storage Resource %s referenced on line %d : %s\n" +#~ msgstr "" +#~ "Konnte config Resource %s , referenziert in Zeile %d : %s nicht finden\n" -#: src/dird/fd_cmds.c:147 -#, c-format -msgid "Error updating Client record. ERR=%s\n" -msgstr "Fehler beim Aktualisieren des Client Eintrags. ERR=%s\n" +#, fuzzy +#~ msgid "" +#~ "Attempt to redefine Storage resource \"%s\" referenced on line %d : %s\n" +#~ msgstr "" +#~ "Konnte config Resource %s , referenziert in Zeile %d : %s nicht finden\n" -#: src/dird/fd_cmds.c:152 -#, c-format -msgid "FD gave bad response to JobId command: %s\n" -msgstr "FD hat fehlerhafte Antwort auf JobId Kommando zurückgegeben: %s\n" +#~ msgid "Expected a Migration Job Type keyword, got: %s" +#~ msgstr " Migration Job Type Schlüsselwort erwartet, erhalten: %s" -#: src/dird/fd_cmds.c:181 src/dird/fd_cmds.c:269 -msgid ", since=" -msgstr ", seit=" +#~ msgid "Expected a Job Type keyword, got: %s" +#~ msgstr "Job Type Schlüsselwort erwartet, erhalten: %s" -#: src/dird/fd_cmds.c:246 -msgid "No prior or suitable Full backup found in catalog. Doing FULL backup.\n" -msgstr "" -"Kein vorheriges oder passendes Full backup in catalog gefunden. Führe FULL " -"backup durch.\n" +#~ msgid "Expected a Job Level keyword, got: %s" +#~ msgstr "Job Level Schlüsselwort erwartet, erhalten: %s" -#: src/dird/fd_cmds.c:247 src/dird/fd_cmds.c:253 src/dird/fd_cmds.c:262 -#, c-format -msgid " (upgraded from %s)" -msgstr " (erweitert von %s)" +#~ msgid "Expected a Restore replacement option, got: %s" +#~ msgstr "Restore replacement Option erwartet, erhalten: %s" -#: src/dird/fd_cmds.c:252 -#, fuzzy -msgid "" -"No prior or suitable Differential backup found in catalog. Doing " -"Differential backup.\n" -msgstr "" -"Kein vorheriges oder passendes Full backup in catalog gefunden. Führe FULL " -"backup durch.\n" +#~ msgid "Expect %s, got: %s" +#~ msgstr "Erwartet: %s, erhalten: %s" -#: src/dird/fd_cmds.c:260 -#, c-format -msgid "Prior failed job found in catalog. Upgrading to %s.\n" -msgstr "" -"Vorheriger fehlgeschlagener job in catalog gefunden. Erweitere auf %s.\n" +#~ msgid "Could not find config Resource %s referenced on line %d : %s\n" +#~ msgstr "" +#~ "Konnte config Resource %s , referenziert in Zeile %d : %s nicht finden\n" -#: src/dird/fd_cmds.c:338 -#, c-format -msgid "Unimplemented backup level %d %c\n" -msgstr "Nicht implementierter backup level %d %c\n" +#~ msgid "Expecting open brace. Got %s" +#~ msgstr "Geschweifte Klammer auf erwartet, erhalten: %s" -#: src/dird/fd_cmds.c:420 -msgid "" -"FD compression disabled for this Job because AllowCompress=No in Storage " -"resource.\n" -msgstr "" +#~ msgid "Expecting keyword, got: %s\n" +#~ msgstr "Schlüsselwort erwartet, erhalten:%s\n" -#: src/dird/fd_cmds.c:520 src/filed/job.c:1094 -#, c-format -msgid "Cannot run program: %s. ERR=%s\n" -msgstr "Kann Programm: %s nicht starten. ERR=%s\n" +#~ msgid "expected an equals, got: %s" +#~ msgstr "Erwartete ein \"ist gleich\", erhalten: %s" -#: src/dird/fd_cmds.c:532 src/dird/fd_cmds.c:558 src/dird/fd_cmds.c:572 -msgid ">filed: write error on socket\n" -msgstr ">filed: Schreibfehler auf socket\n" +#~ msgid "Keyword %s not permitted in this resource" +#~ msgstr "Schlüsselwort %s ist in dieser Ressource nicht erlaubt." -#: src/dird/fd_cmds.c:538 -#, c-format -msgid "Error running program: %s. ERR=%s\n" -msgstr "Fehler beim Start des Programms: %s. ERR=%s\n" +#~ msgid "Count not update counter %s: ERR=%s\n" +#~ msgstr "Konnte counter %s: nicht aktualisieren: ERR=%s\n" -#: src/dird/fd_cmds.c:547 -#, c-format -msgid "Cannot open included file: %s. ERR=%s\n" -msgstr "Kann inkludierte Datei nicht öffnen: %s. ERR=%s\n" +#~ msgid "Cannot create var context: ERR=%s\n" +#~ msgstr "Kann var context nicht erzeugen: ERR=%s\n" -#: src/dird/fd_cmds.c:720 -#, fuzzy, c-format -msgid "Client \"%s\" RunScript failed.\n" -msgstr "Pool Ressource \"%s\" nicht gefunden.\n" +#~ msgid "Cannot set var callback: ERR=%s\n" +#~ msgstr "kann Variable callback nicht setzen: ERR=%s\n" -#: src/dird/fd_cmds.c:743 -#, c-format -msgid "" -"Client \"%s\" may not be used to restore this job. Please upgrade your " -"client.\n" -msgstr "" +#~ msgid "Cannot set var operate: ERR=%s\n" +#~ msgstr "kann Variable operate nicht setzen: ERR=%s\n" -#: src/dird/fd_cmds.c:824 -#, fuzzy -msgid "RestoreObject failed.\n" -msgstr "Wiederherstellung läuft..." +#~ msgid "Cannot unescape string: ERR=%s\n" +#~ msgstr "Cannot unescape string: ERR=%s\n" -#: src/dird/fd_cmds.c:861 -#, fuzzy -msgid "ComponentInfo failed.\n" -msgstr "Job Einrichtung Fehlgeschlagen.\n" +#~ msgid "Cannot expand expression \"%s\": ERR=%s\n" +#~ msgstr "Kann Ausdruck\"%s\"nicht auflösen: ERR=%s\n" -#: src/dird/fd_cmds.c:906 -#, c-format -msgid "" -"filed: write error on socket\n" +#~ msgstr ">filed: Schreibfehler auf socket\n" -#: src/dird/inc_conf.c:536 -#, c-format -msgid "Expected a wild-card string, got: %s\n" -msgstr "wild-card Ausdruck erwartet, erhalten: %s\n" +#~ msgid "Error running program: %s. ERR=%s\n" +#~ msgstr "Fehler beim Start des Programms: %s. ERR=%s\n" -#: src/dird/inc_conf.c:571 -msgid "ExcludeDirContaining directive not permitted in Exclude.\n" -msgstr "" +#~ msgid "Cannot open included file: %s. ERR=%s\n" +#~ msgstr "Kann inkludierte Datei nicht öffnen: %s. ERR=%s\n" -#: src/dird/inc_conf.c:621 src/dird/inc_conf.c:664 -#, fuzzy, c-format -msgid "Backslash found. Use forward slashes or quote the string.: %s\n" -msgstr "" -"Backslash gefunden. Benutze forward slashes oder setze den String in " -"Anführungszeichen.: %s\n" +#, fuzzy +#~ msgid "Client \"%s\" RunScript failed.\n" +#~ msgstr "Pool Ressource \"%s\" nicht gefunden.\n" -#: src/dird/inc_conf.c:636 src/dird/inc_conf.c:679 -#, c-format -msgid "Expected a filename, got: %s" -msgstr "Dateiname erwartet, erhalten: %s" +#, fuzzy +#~ msgid "RestoreObject failed.\n" +#~ msgstr "Wiederherstellung läuft..." -#: src/dird/inc_conf.c:653 -msgid "Plugin directive not permitted in Exclude\n" -msgstr "" +#, fuzzy +#~ msgid "ComponentInfo failed.\n" +#~ msgstr "Job Einrichtung Fehlgeschlagen.\n" -#: src/dird/inc_conf.c:696 -msgid "Options section not permitted in Exclude\n" -msgstr "" +#~ msgid "" +#~ " Run=%s\n" -#: src/dird/run_conf.c:335 -#, c-format -msgid "Expected a keyword name, got: %s" -msgstr "" +#, fuzzy +#~ msgid "List Media failed: ERR=%s\n" +#~ msgstr "Media id select fehlgeschlagen: ERR=%s\n" -#: src/dird/run_conf.c:374 -msgid "Day number out of range (1-31)" -msgstr "" +#, fuzzy +#~ msgid "Invalid keyword found: %s\n" +#~ msgstr "Ungültige JobId gefunden.\n" -#: src/dird/run_conf.c:391 src/dird/run_conf.c:553 -msgid "Week number out of range (0-53)" -msgstr "" +#, fuzzy +#~ msgid "path name missing.\n" +#~ msgstr "FileSet: name=%s\n" -#: src/dird/run_conf.c:407 -#, c-format -msgid "Job type field: %s in run record not found" -msgstr "" +#, fuzzy +#~ msgid "Failed to send command to Client.\n" +#~ msgstr "Verbindung zu File daemon fehlgeschlagen.\n" -#: src/dird/run_conf.c:414 -#, c-format -msgid "Unexpected token: %d:%s" -msgstr "" +#, fuzzy +#~ msgid "Unable to get Job record for Job=%s\n" +#~ msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" -#: src/dird/run_conf.c:458 -msgid "Time must be preceded by keyword AT." -msgstr "" +#, fuzzy +#~ msgid "Unable to get last Job record for Job=%s\n" +#~ msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" -#: src/dird/run_conf.c:467 -msgid "Time logic error.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to get Client record for Client=%s\n" +#~ msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" -#: src/dird/run_conf.c:482 src/dird/run_conf.c:501 -msgid "Bad time specification." -msgstr "" +#, fuzzy +#~ msgid "Unable to get last Job record for Client=%s\n" +#~ msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" -#: src/dird/run_conf.c:522 -msgid "Range logic error.\n" -msgstr "" +#, fuzzy +#~ msgid "Unknown command: %s\n" +#~ msgstr "unbekannt" -#: src/dird/run_conf.c:531 -msgid "Bad day range specification." -msgstr "" +#, fuzzy +#~ msgid "query keyword not found.\n" +#~ msgstr "Path record: %s nicht gefunden.\n" -#: src/dird/run_conf.c:578 -msgid "Invalid month, week or position day range" -msgstr "" +#, fuzzy +#~ msgid "List MediaType failed: ERR=%s\n" +#~ msgstr "Media id select fehlgeschlagen: ERR=%s\n" -#: src/dird/run_conf.c:593 -msgid "Invalid month, weekday or position range" -msgstr "" +#, fuzzy +#~ msgid "List Location failed: ERR=%s\n" +#~ msgstr "Client id select fehlgeschlagen: ERR=%s\n" -#: src/dird/run_conf.c:652 -msgid "Unexpected run state\n" -msgstr "" +#, fuzzy +#~ msgid "Illegal character \"%c\" in a comment.\n" +#~ msgstr "Illegales Zeichen in \"Volume name\" \"%s\"\n" -#: src/dird/scheduler.c:101 -#, c-format -msgid "Job %s not found\n" -msgstr "" +#, fuzzy +#~ msgid "Comment too long.\n" +#~ msgstr "Job nicht gefunden: %s\n" -#: src/dird/scheduler.c:125 -msgid "Walk queue" -msgstr "" +#, fuzzy +#~ msgid "No Volumes found, or no barcodes.\n" +#~ msgstr "Keine Volumes zum Wiederherstellen gefunden.\n" -#: src/dird/scheduler.c:135 -msgid "Dequeued job" -msgstr "" +#, fuzzy +#~ msgid "Disabled Jobs:\n" +#~ msgstr "ist nicht aktiviert" -#: src/dird/scheduler.c:138 -msgid "Scheduler logic error\n" -msgstr "" +#, fuzzy +#~ msgid "Invalid jobid argument\n" +#~ msgstr "Ungültige JobId gefunden.\n" -#: src/dird/scheduler.c:179 -msgid "Run job" -msgstr "" +#, fuzzy +#~ msgid "Unknown ObjectType %s\n" +#~ msgstr "unbekannt" -#: src/dird/scheduler.c:216 -msgid "run override" -msgstr "" +#, fuzzy +#~ msgid "Could not find Pool for Job %s\n" +#~ msgstr "Konnte Datenbank \"%s\" nicht öffen.\n" -#: src/dird/scheduler.c:416 -msgid "Inserted job" -msgstr "" +#~ msgid "Pool %s not in database. %s" +#~ msgstr "Pool %s nicht in der Datenbank. %s" -#: src/dird/scheduler.c:424 -msgid "Appended job" -msgstr "" +#~ msgid "Pool %s created in database.\n" +#~ msgstr "Pool %s in der Datenbank angelegt.\n" -#: src/dird/scheduler.c:428 -msgid "Run queue" -msgstr "" +#, fuzzy +#~ msgid "Begin pruning Files.\n" +#~ msgstr "Beginn automatische Säuberung von Dateien.\n" -#: src/dird/snapshot.c:120 src/filed/job.c:2896 -#, c-format -msgid "Comm error with SD. bad response to %s. ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Begin pruning Jobs older than %s.\n" +#~ msgstr "Beginn automatische Säuberung von Aufträgen.\n" -#: src/dird/snapshot.c:123 -#, fuzzy, c-format -msgid "Bad response from SD to %s command. Wanted %s, got %s len=%ld\n" -msgstr "Schlechte Antwort auf %s Kommando: erwartet %s, erhalten %s\n" +#, fuzzy +#~ msgid "Can't update volume size in the catalog\n" +#~ msgstr "Neues Volume \"%s\" in catalog erzeugt.\n" -#: src/dird/snapshot.c:159 #, fuzzy -msgid "Snapshot not found\n" -msgstr "FileSet MD5 Prüfsumme nicht gefunden.\n" +#~ msgid "Unable to truncate volume \"%s\"\n" +#~ msgstr "Kann Konsole \"%s\" an %s:%s:%d nicht authentisieren.\n" -#: src/dird/snapshot.c:166 #, fuzzy -msgid "Client resource not found\n" -msgstr "Pool Ressource \"%s\" nicht gefunden.\n" +#~ msgid "No Volumes found to perform \"truncate\" command.\n" +#~ msgstr "Keine Volumes zum Wiederherstellen gefunden.\n" -#: src/dird/snapshot.c:174 src/dird/snapshot.c:221 src/dird/snapshot.c:314 -#: src/dird/ua_cmds.c:687 src/dird/ua_cmds.c:966 src/dird/ua_cmds.c:1417 -#: src/dird/ua_dotcmds.c:229 src/dird/ua_dotcmds.c:1111 -#: src/dird/ua_status.c:475 -#, c-format -msgid "Connecting to Client %s at %s:%d\n" -msgstr "" +#~ msgid "Bootstrap records written to %s\n" +#~ msgstr "Bootstrap Einträge geschrieben nach %s\n" -#: src/dird/snapshot.c:177 src/dird/snapshot.c:224 src/dird/snapshot.c:317 -#: src/dird/ua_cmds.c:690 src/dird/ua_cmds.c:969 src/dird/ua_cmds.c:1420 -#: src/dird/ua_dotcmds.c:233 src/dird/ua_dotcmds.c:1114 -msgid "Failed to connect to Client.\n" -msgstr "" +#~ msgid "" +#~ "\n" +#~ "First you select one or more JobIds that contain files\n" +#~ "to be restored. You will be presented several methods\n" +#~ "of specifying the JobIds. Then you will be allowed to\n" +#~ "select which files from those JobIds are to be restored.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Zuerst wählen Sie eine oder mehrere JobIds die Dateien enthalten\n" +#~ "die wiederhergestellt werden sollen. Es werden mehrere Methoden\n" +#~ "zur ermittlung der JobIds angezeigt. Dann können Sie auswählen, \n" +#~ "welche Dateien von diesen JobIds wiederhergestellt werden sollen.\n" +#~ "\n" -#: src/dird/snapshot.c:189 -#, c-format -msgid "Snapshot \"%s\" deleted from client %s\n" -msgstr "" +#, fuzzy +#~ msgid "Regex compile error: %s\n" +#~ msgstr "Regex Übersetzungsfehler. ERR=%s\n" -#: src/dird/snapshot.c:198 -#, c-format -msgid "Snapshot \"%s\" deleted from catalog\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to create component file %s. ERR=%s\n" +#~ msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" -#: src/dird/snapshot.c:292 -#, fuzzy, c-format -msgid "Snapshot \"%s\" on Client %s\n" -msgstr "Mehr als ein Client!: %s\n" +#, fuzzy +#~ msgid "Unable to fdopen component file %s. ERR=%s\n" +#~ msgstr "Kann Datenbank=%s.nicht öffen. ERR=%s\n" -#: src/dird/snapshot.c:478 -#, c-format -msgid "" -"Snapshot %s:\n" -" Volume: %s\n" -" Device: %s\n" -" CreateDate: %s\n" -" Type: %s\n" -" Status: %s\n" -" Error: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Error writing component file.\n" +#~ msgstr "Fehler beim schreiben der bsr Datei.\n" -#: src/dird/snapshot.c:489 src/dird/ua_status.c:1216 src/lib/status.h:123 -#: src/lib/util.c:265 src/lib/util.c:402 src/stored/btape.c:1519 -msgid "OK" -msgstr "" +#, fuzzy +#~ msgid "FileSet argument: %s\n" +#~ msgstr "FileSet: name=%s\n" -#: src/dird/snapshot.c:489 src/dird/ua_status.c:1207 src/lib/status.h:114 -#: src/lib/util.c:272 src/lib/util.c:410 src/lib/util.c:557 -msgid "Error" -msgstr "" +#, fuzzy +#~ msgid "NextPool \"%s\" not found.\n" +#~ msgstr "FileSet Eintrag \"%s\" nicht gefunden\n" -#: src/dird/snapshot.c:496 -msgid "Snapshot added in Catalog\n" -msgstr "" +#, fuzzy +#~ msgid "No authorization. NextPool \"%s\".\n" +#~ msgstr "Storage daemon" -#: src/dird/snapshot.c:502 #, fuzzy -msgid "No snapshot found\n" -msgstr "FileSet Eintrag \"%s\" nicht gefunden\n" +#~ msgid "Restore Client \"%s\" not found.\n" +#~ msgstr "Pool Ressource \"%s\" nicht gefunden.\n" -#: src/dird/snapshot.c:551 -msgid "Snapshot choice: \n" -msgstr "" +#, fuzzy +#~ msgid "No JobId specified.\n" +#~ msgstr "Kein storage angegeben.\n" -#: src/dird/snapshot.c:552 -msgid "List snapshots in Catalog" -msgstr "" +#, fuzzy +#~ msgid "Invalid or no Job name specified.\n" +#~ msgstr "Kein storage angegeben.\n" -#: src/dird/snapshot.c:553 -msgid "List snapshots on Client" -msgstr "" +#, fuzzy +#~ msgid "Could not get job record for selected JobId=%d. ERR=%s" +#~ msgstr "Konnte job record für JobId %s zum migrieren nicht holen. ERR=%s" -#: src/dird/snapshot.c:554 -msgid "Prune snapshots" -msgstr "" +#, fuzzy +#~ msgid "Plugin Restore Options\n" +#~ msgstr " --> Run=%s\n" -#: src/dird/snapshot.c:555 -msgid "Delete snapshot" -msgstr "" +#, fuzzy +#~ msgid "Plugins to configure:\n" +#~ msgstr "Pool Ressource \"%s\" nicht gefunden.\n" -#: src/dird/snapshot.c:556 -msgid "Update snapshot parameters" -msgstr "" +#, fuzzy +#~ msgid "Can't configure %32s\n" +#~ msgstr "Kann inkludierte Datei nicht öffnen: %s. ERR=%s\n" -#: src/dird/snapshot.c:557 -msgid "Update catalog with Client snapshots" -msgstr "" +#, fuzzy +#~ msgid "Restore Client" +#~ msgstr "Wiederherstellung läuft..." -#: src/dird/snapshot.c:558 src/dird/snapshot.c:723 src/dird/ua_update.c:622 -msgid "Done" -msgstr "" +#, fuzzy +#~ msgid "NextPool" +#~ msgstr " opcmd=%s\n" -#: src/dird/snapshot.c:560 -msgid "Select action to perform on Snapshot Engine" -msgstr "" +#, fuzzy +#~ msgid "File Relocation" +#~ msgstr "File daemon" -#: src/dird/snapshot.c:581 src/dird/snapshot.c:751 src/dird/ua_update.c:822 -msgid "Selection terminated.\n" -msgstr "" +#, fuzzy +#~ msgid "%s -> %s\n" +#~ msgstr " --> Run=%s\n" -#: src/dird/snapshot.c:608 -msgid "Enter a SnapshotId: " -msgstr "" +#, fuzzy +#~ msgid "Could not get job record for selected JobId. ERR=%s" +#~ msgstr "Konnte job record für JobId %s zum migrieren nicht holen. ERR=%s" -#: src/dird/snapshot.c:623 #, fuzzy -msgid "Unable to get Snapshot record.\n" -msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" +#~ msgid "User specified" +#~ msgstr "Kein storage angegeben.\n" -#: src/dird/snapshot.c:644 src/dird/ua_update.c:163 -#, c-format -msgid "Invalid retention period specified: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Where: %s\n" +#~ msgstr " opcmd=%s\n" -#: src/dird/snapshot.c:658 src/dird/ua_update.c:171 -#, c-format -msgid "New retention period is: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Run Migration job\n" +#~ msgstr "Konnte Migrationsjob nicht starten.\n" -#: src/dird/snapshot.c:681 -#, c-format -msgid "New Comment is: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Restore Client specified twice.\n" +#~ msgstr "Kein storage angegeben.\n" -#: src/dird/snapshot.c:720 src/dird/ua_run.c:1010 src/dird/ua_update.c:604 -msgid "Parameters to modify:\n" -msgstr "" +#, fuzzy +#~ msgid "Plugin Options not yet implemented.\n" +#~ msgstr "Kein storage angegeben.\n" -#: src/dird/snapshot.c:721 -msgid "Snapshot Retention Period" -msgstr "" +#, fuzzy +#~ msgid "Plugin Options specified twice.\n" +#~ msgstr "Kein storage angegeben.\n" -#: src/dird/snapshot.c:722 -msgid "Snapshot Comment" -msgstr "" +#, fuzzy +#~ msgid "Spool flag specified twice.\n" +#~ msgstr "Kein storage angegeben.\n" -#: src/dird/snapshot.c:724 src/dird/ua_run.c:862 src/dird/ua_run.c:1045 -#: src/dird/ua_run.c:1460 src/dird/ua_update.c:623 -msgid "Select parameter to modify" -msgstr "" +#, fuzzy +#~ msgid "Invalid spooldata flag.\n" +#~ msgstr "Ungültige JobId gefunden.\n" -#: src/dird/snapshot.c:732 -#, c-format -msgid "Updating Snapshot \"%s\" on \"%s\"\n" -msgstr "" +#, fuzzy +#~ msgid "IgnoreDuplicateCheck flag specified twice.\n" +#~ msgstr "Kein storage angegeben.\n" -#: src/dird/snapshot.c:736 src/dird/ua_update.c:654 -#, c-format -msgid "Current retention period is: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Invalid ignoreduplicatecheck flag.\n" +#~ msgstr "Ungültige JobId gefunden.\n" -#: src/dird/snapshot.c:738 -msgid "Enter Snapshot Retention period: " -msgstr "" +#, fuzzy +#~ msgid "Accurate flag specified twice.\n" +#~ msgstr "Kein storage angegeben.\n" -#: src/dird/snapshot.c:744 -#, c-format -msgid "Current comment is: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Invalid accurate flag.\n" +#~ msgstr "Ungültige JobId gefunden.\n" -#: src/dird/snapshot.c:745 -msgid "Enter Snapshot comment: " -msgstr "" +#, fuzzy +#~ msgid "Media Type specified twice.\n" +#~ msgstr "Kein storage angegeben.\n" -#: src/dird/ua_cmds.c:98 -msgid "Add media to a pool" -msgstr "" +#, fuzzy +#~ msgid "NextPool specified twice.\n" +#~ msgstr "Kein storage angegeben.\n" -#: src/dird/ua_cmds.c:99 -msgid "Autodisplay console messages" -msgstr "" +#, fuzzy +#~ msgid "The disabled Job resources are:\n" +#~ msgstr "Kann Job resource %s nicht finden\n" -#: src/dird/ua_cmds.c:100 -msgid "Automount after label" -msgstr "" +#, fuzzy +#~ msgid "The enabled Job resources are:\n" +#~ msgstr "Kann Job resource %s nicht finden\n" -#: src/dird/ua_cmds.c:101 -msgid "Cancel a job" -msgstr "" +#, fuzzy +#~ msgid "Select Client resource" +#~ msgstr "Pool Ressource" -#: src/dird/ua_cmds.c:102 #, fuzzy -msgid "Create DB Pool from resource" -msgstr "Pool Ressource" +#~ msgid "The defined Schedule resources are:\n" +#~ msgstr "Kann Schedule resource %s nicht finden\n" -#: src/dird/ua_cmds.c:103 -msgid "Delete volume, pool or job" -msgstr "" +#, fuzzy +#~ msgid "Schedule" +#~ msgstr "Schedule: name=%s\n" -#: src/dird/ua_cmds.c:104 -msgid "Disable a job, attributes batch process" -msgstr "" +#, fuzzy +#~ msgid "Select Schedule resource" +#~ msgstr "Kann Schedule resource %s nicht finden\n" -#: src/dird/ua_cmds.c:105 -msgid "Enable a job, attributes batch process" -msgstr "" +#, fuzzy +#~ msgid "No value given for \"jobid\".\n" +#~ msgstr "Keine volumes für JobId=%d gefunden\n" -#: src/dird/ua_cmds.c:106 -msgid "Performs FileSet estimate, listing gives full listing" -msgstr "" +#, fuzzy +#~ msgid "No value given for \"job\".\n" +#~ msgstr "Keine volumes für JobId=%d gefunden\n" -#: src/dird/ua_cmds.c:109 src/dird/ua_cmds.c:134 -msgid "Terminate Bconsole session" -msgstr "" +#, fuzzy +#~ msgid "No value given for \"ujobid\".\n" +#~ msgstr "Keine volumes für JobId=%d gefunden\n" -#: src/dird/ua_cmds.c:110 -msgid "Non-interactive gui mode" -msgstr "" +#, fuzzy +#~ msgid "Select Job(s):\n" +#~ msgstr "ist nicht aktiviert" -#: src/dird/ua_cmds.c:111 -msgid "Print help on specific command" -msgstr "" +#, fuzzy +#~ msgid "%s %sVersion: %s (%s) %s %s %s\n" +#~ msgstr "1000 OK: %s Version: %s (%s)\n" -#: src/dird/ua_cmds.c:117 -msgid "Label a tape" -msgstr "" +#, fuzzy +#~ msgid "No authorization for Storage \"%s\"\n" +#~ msgstr "Storage daemon" -#: src/dird/ua_cmds.c:118 -msgid "List objects from catalog" -msgstr "" +#, fuzzy +#~ msgid "Console connected %sat %s\n" +#~ msgstr "Console: name=%s SSL=%d\n" -#: src/dird/ua_cmds.c:122 -msgid "Full or long list like list command" -msgstr "" +#, fuzzy +#~ msgid "has terminated with warnings" +#~ msgstr "%s OK -- mit Warnungen" -#: src/dird/ua_cmds.c:125 -msgid "Display pending messages" -msgstr "" +#, fuzzy +#~ msgid "has terminated in incomplete state" +#~ msgstr "%s OK -- mit Warnungen" -#: src/dird/ua_cmds.c:126 -msgid "Print current memory usage" -msgstr "" +#, fuzzy +#~ msgid "is waiting on Storage \"%s\"" +#~ msgstr "Storage daemon" -#: src/dird/ua_cmds.c:127 #, fuzzy -msgid "Mount storage" -msgstr "Run storage override" +#~ msgid "is waiting for its start time (%s)" +#~ msgstr "Storage daemon" -#: src/dird/ua_cmds.c:130 -msgid "Prune expired records from catalog" -msgstr "" +#, fuzzy +#~ msgid "is waiting for a Shared Storage device" +#~ msgstr "Storage daemon" -#: src/dird/ua_cmds.c:133 #, fuzzy -msgid "Purge records from catalog" -msgstr "File Eintrag nicht im Catalog gefunden.\n" +#~ msgid "is in unknown state %c" +#~ msgstr "unbekannt" -#: src/dird/ua_cmds.c:135 -msgid "Query catalog" -msgstr "" +#, fuzzy +#~ msgid "is waiting for Client to connect to Storage daemon" +#~ msgstr "Verbindung zu Storage daemon fehlgeschlagen.\n" -#: src/dird/ua_cmds.c:136 -msgid "Manage Global Deduplication Engine" -msgstr "" +#, fuzzy +#~ msgid "%6d %-4s %-3s %10s %10s %-17s %s\n" +#~ msgstr "1000 OK: %s Version: %s (%s)\n" -#: src/dird/ua_cmds.c:138 #, fuzzy -msgid "Restore files" -msgstr "Wiederherstellung läuft..." +#~ msgid "Invalid command \"%s\". Enter \"done\" to exit.\n" +#~ msgstr "unbekannt" -#: src/dird/ua_cmds.c:143 -msgid "Relabel a tape" -msgstr "" +#, fuzzy +#~ msgid "Snapshot parameters" +#~ msgstr "unbekannt" -#: src/dird/ua_cmds.c:146 -msgid "Release storage" -msgstr "" +#, fuzzy +#~ msgid "Error updating media record ActionOnPurge: ERR=%s" +#~ msgstr "Fehler beim Aktualisieren des Client Eintrags. ERR=%s\n" -#: src/dird/ua_cmds.c:147 -msgid "Reload conf file" -msgstr "" +#, fuzzy +#~ msgid "Expect JobId keyword, not found.\n" +#~ msgstr "Job Type Schlüsselwort erwartet, erhalten: %s" -#: src/dird/ua_cmds.c:148 #, fuzzy -msgid "Run a job" -msgstr "Konnte Migrationsjob nicht starten.\n" +#~ msgid "Neither Client nor StartTime specified.\n" +#~ msgstr "Kein storage angegeben.\n" -#: src/dird/ua_cmds.c:153 #, fuzzy -msgid "Restart a job" -msgstr "Konnte Migrationsjob nicht starten.\n" +#~ msgid "Start Virtual Backup JobId %s, Job=%s\n" +#~ msgstr "Start Sicherung JobId %s, Job=%s\n" -#: src/dird/ua_cmds.c:157 #, fuzzy -msgid "Resume a job" -msgstr "Konnte Migrationsjob nicht starten.\n" +#~ msgid "No valid Jobs found from user selection.\n" +#~ msgstr "Kein Job gefunden für: %s.\n" -#: src/dird/ua_cmds.c:161 -msgid "Report status" -msgstr "" +#, fuzzy +#~ msgid "Using user supplied JobIds=%s\n" +#~ msgstr "Migration benutzt JobId=%s Job=%s\n" -#: src/dird/ua_cmds.c:167 #, fuzzy -msgid "Stop a job" -msgstr "Konnte Migrationsjob nicht starten.\n" +#~ msgid "No previous Jobs found.\n" +#~ msgstr "Keinen vorherigen Job zum migrieren gefunden.\n" -#: src/dird/ua_cmds.c:168 -msgid "Sets debug level" -msgstr "" +#, fuzzy +#~ msgid "Error getting Job record for previous Job: ERR=%s" +#~ msgstr "Fehler beim Holen des job Eintrags für den job Bericht: %s" -#: src/dird/ua_cmds.c:171 -msgid "Sets bandwidth" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "%s %s %s (%s):\n" +#~ " Build OS: %s %s %s\n" +#~ " JobId: %d\n" +#~ " Job: %s\n" +#~ " Backup Level: Virtual Full\n" +#~ " Client: \"%s\" %s\n" +#~ " FileSet: \"%s\" %s\n" +#~ " Pool: \"%s\" (From %s)\n" +#~ " Catalog: \"%s\" (From %s)\n" +#~ " Storage: \"%s\" (From %s)\n" +#~ " Scheduled time: %s\n" +#~ " Start time: %s\n" +#~ " End time: %s\n" +#~ " Elapsed time: %s\n" +#~ " Priority: %d\n" +#~ " SD Files Written: %s\n" +#~ " SD Bytes Written: %s (%sB)\n" +#~ " Rate: %.1f KB/s\n" +#~ " Volume name(s): %s\n" +#~ " Volume Session Id: %d\n" +#~ " Volume Session Time: %d\n" +#~ " Last Volume Bytes: %s (%sB)\n" +#~ " SD Errors: %d\n" +#~ " SD termination status: %s\n" +#~ " Termination: %s\n" +#~ "\n" +#~ msgstr "" +#~ "%s %s (%s): %s\n" +#~ " vorheriges Backup JobId:%s\n" +#~ " neues Backup JobId: %s\n" +#~ " Migration JobId: %s\n" +#~ " Migration Job: %s\n" +#~ " Backup Level: %s%s\n" +#~ " Client: %s\n" +#~ " FileSet: \"%s\" %s\n" +#~ " Lese Pool: \"%s\" (Von %s)\n" +#~ " Lese Storage: \"%s\" (Von %s)\n" +#~ " Schreib Pool: \"%s\" (Von %s)\n" +#~ " Schreib Storage: \"%s\" (Von %s)\n" +#~ " Start Zeit: %s\n" +#~ " End Zeit: %s\n" +#~ " Verstichene Zeit: %s\n" +#~ " Priorität: %d\n" +#~ " SD Dateien geschrieben: %s\n" +#~ " SD Bytes geschrieben: %s (%sB)\n" +#~ " Geschwindigkeit: %.1f KB/s\n" +#~ " Volume name(s): %s\n" +#~ " Volume Session Id: %d\n" +#~ " Volume Session Time: %d\n" +#~ " Last Volume Bytes: %s (%sB)\n" +#~ " SD Fehler: %d\n" +#~ " SD Beendigungsstatus : %s\n" +#~ " Beendigungsstatus: %s\n" +#~ "\n" -#: src/dird/ua_cmds.c:175 -msgid "Handle snapshots" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "%s %s %s (%s):\n" +#~ " Build OS: %s %s %s\n" +#~ " JobId: %d\n" +#~ " Job: %s\n" +#~ " FileSet: %s\n" +#~ " Verify Level: %s\n" +#~ " Client: %s\n" +#~ " Verify JobId: %d\n" +#~ " Verify Job: %s\n" +#~ " Start time: %s\n" +#~ " End time: %s\n" +#~ " Files Expected: %s\n" +#~ " Files Examined: %s\n" +#~ " Non-fatal FD errors: %d\n" +#~ " FD termination status: %s\n" +#~ " SD termination status: %s\n" +#~ " Termination: %s\n" +#~ "\n" +#~ msgstr "" +#~ "%s %s (%s): %s\n" +#~ " JobId: %d\n" +#~ " Job: %s\n" +#~ " Client: %s\n" +#~ " Start time: %s\n" +#~ " End time: %s\n" +#~ " Dateien erwartet: %s\n" +#~ " Dateien. wiederhergestellt: %s\n" +#~ " Bytes wiederhergestellt: %s\n" +#~ " Geschwindigkeit: %.1f KB/s\n" +#~ " FD Fehler: %d\n" +#~ " FD Beendigungsstatus: %s\n" +#~ " SD Beendigungsstatus: %s\n" +#~ " Beendigungsstatus: %s\n" +#~ "\n" -#: src/dird/ua_cmds.c:178 -msgid "Sets new client address -- if authorized" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "%s %s %s (%s):\n" +#~ " Build: %s %s %s\n" +#~ " JobId: %d\n" +#~ " Job: %s\n" +#~ " FileSet: %s\n" +#~ " Verify Level: %s\n" +#~ " Client: %s\n" +#~ " Verify JobId: %d\n" +#~ " Verify Job: %s\n" +#~ " Start time: %s\n" +#~ " End time: %s\n" +#~ " Files Examined: %s\n" +#~ " Non-fatal FD errors: %d\n" +#~ " FD termination status: %s\n" +#~ " Termination: %s\n" +#~ "\n" +#~ msgstr "" +#~ "%s %s (%s): %s\n" +#~ " JobId: %d\n" +#~ " Job: %s\n" +#~ " Client: %s\n" +#~ " Start time: %s\n" +#~ " End time: %s\n" +#~ " Dateien erwartet: %s\n" +#~ " Dateien. wiederhergestellt: %s\n" +#~ " Bytes wiederhergestellt: %s\n" +#~ " Geschwindigkeit: %.1f KB/s\n" +#~ " FD Fehler: %d\n" +#~ " FD Beendigungsstatus: %s\n" +#~ " SD Beendigungsstatus: %s\n" +#~ " Beendigungsstatus: %s\n" +#~ "\n" -#: src/dird/ua_cmds.c:179 #, fuzzy -msgid "Show resource records" -msgstr "Job Ressource" +#~ msgid "Cannot verify checksum for %s\n" +#~ msgstr "Kann Schedule resource %s nicht finden\n" -#: src/dird/ua_cmds.c:182 -msgid "Use SQL to query catalog" -msgstr "" +#, fuzzy +#~ msgid "aclx_get error on file \"%s\": ERR=%s\n" +#~ msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" -#: src/dird/ua_cmds.c:183 -msgid "Print current time" -msgstr "" +#, fuzzy +#~ msgid "Unknown acl type encountered on file \"%s\": %ld\n" +#~ msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" -#: src/dird/ua_cmds.c:184 -msgid "Turn on/off trace to file" -msgstr "" +#, fuzzy +#~ msgid "Failed to convert acl into text on file \"%s\"\n" +#~ msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" -#: src/dird/ua_cmds.c:185 -msgid "Truncate one or more Volumes" -msgstr "" +#, fuzzy +#~ msgid "aclx_scanStr error on file \"%s\": ERR=%s\n" +#~ msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" -#: src/dird/ua_cmds.c:186 -msgid "Unmount storage" -msgstr "" +#, fuzzy +#~ msgid "aclx_put error on file \"%s\": ERR=%s\n" +#~ msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" -#: src/dird/ua_cmds.c:189 -msgid "Umount - for old-time Unix guys, see unmount" -msgstr "" +#, fuzzy +#~ msgid "acl_get_file error on file \"%s\": ERR=%s\n" +#~ msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" -#: src/dird/ua_cmds.c:192 -msgid "Update volume, pool or stats" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "acl_delete_def_file error on file \"%s\": filesystem doesn't support " +#~ "ACLs\n" +#~ msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" -#: src/dird/ua_cmds.c:199 -msgid "Use catalog xxx" -msgstr "" +#, fuzzy +#~ msgid "acl_valid error on file \"%s\": ERR=%s\n" +#~ msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" -#: src/dird/ua_cmds.c:200 -msgid "Does variable expansion" -msgstr "" +#, fuzzy +#~ msgid "acl_set_file error on file \"%s\": filesystem doesn't support ACLs\n" +#~ msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" -#: src/dird/ua_cmds.c:201 -msgid "Print Director version" -msgstr "" +#, fuzzy +#~ msgid "pathconf error on file \"%s\": ERR=%s\n" +#~ msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" -#: src/dird/ua_cmds.c:202 -msgid "Wait until no jobs are running" -msgstr "" +#, fuzzy +#~ msgid "getacl error on file \"%s\": ERR=%s\n" +#~ msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" -#: src/dird/ua_cmds.c:244 src/dird/ua_dotcmds.c:160 -#, c-format -msgid "Can't use %s command in a runscript" -msgstr "" +#, fuzzy +#~ msgid "setacl error on file \"%s\": filesystem doesn't support ACLs\n" +#~ msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" -#: src/dird/ua_cmds.c:255 -#, c-format -msgid "%s: is an invalid command.\n" -msgstr "" +#, fuzzy +#~ msgid "acl_get error on file \"%s\": ERR=%s\n" +#~ msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" -#: src/dird/ua_cmds.c:296 -msgid "" -"You probably don't want to be using this command since it\n" -"creates database records without labeling the Volumes.\n" -"You probably want to use the \"label\" command.\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "acl_fromtext error on file \"%s\": ERR=%s\n" +#~ msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" -#: src/dird/ua_cmds.c:314 -#, c-format -msgid "Pool already has maximum volumes=%d\n" -msgstr "" +#, fuzzy +#~ msgid "acl_set error on file \"%s\": ERR=%s\n" +#~ msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" -#: src/dird/ua_cmds.c:315 -msgid "Enter new maximum (zero for unlimited): " -msgstr "" +#, fuzzy +#~ msgid "pioctl VIOCGETAL error on file \"%s\": ERR=%s\n" +#~ msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" -#: src/dird/ua_cmds.c:335 -#, c-format -msgid "Enter number of Volumes to create. 0=>fixed name. Max=%d: " -msgstr "" +#, fuzzy +#~ msgid "pioctl VIOCSETAL error on file \"%s\": ERR=%s\n" +#~ msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" -#: src/dird/ua_cmds.c:341 -#, c-format -msgid "The number must be between 0 and %d\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to stat file \"%s\": ERR=%s\n" +#~ msgstr "Kann Datenbank=%s.nicht öffen. ERR=%s\n" -#: src/dird/ua_cmds.c:349 -msgid "Enter Volume name: " -msgstr "" +#, fuzzy +#~ msgid " Could not access \"%s\": ERR=%s\n" +#~ msgstr "Konnte counter %s: nicht aktualisieren: ERR=%s\n" -#: src/dird/ua_cmds.c:353 -msgid "Enter base volume name: " -msgstr "" +#, fuzzy +#~ msgid " Could not follow link \"%s\": ERR=%s\n" +#~ msgstr "Konnte regex pattern \"%s\" nicht kompilieren ERR=%s\n" -#: src/dird/ua_cmds.c:362 src/dird/ua_label.c:652 -msgid "Volume name too long.\n" -msgstr "" +#, fuzzy +#~ msgid " Could not stat \"%s\": ERR=%s\n" +#~ msgstr "Kann bootstrap Datei nicht öffnen: %s: ERR=%s\n" -#: src/dird/ua_cmds.c:366 src/dird/ua_label.c:658 src/lib/edit.c:514 -msgid "Volume name must be at least one character long.\n" -msgstr "" +#, fuzzy +#~ msgid " Could not open directory \"%s\": ERR=%s\n" +#~ msgstr "Konnte regex pattern \"%s\" nicht kompilieren ERR=%s\n" -#: src/dird/ua_cmds.c:377 -msgid "Enter the starting number: " -msgstr "" +#, fuzzy +#~ msgid " Cannot open \"%s\": ERR=%s.\n" +#~ msgstr "Kann Ausdruck\"%s\"nicht auflösen: ERR=%s\n" -#: src/dird/ua_cmds.c:382 -msgid "Start number must be greater than zero.\n" -msgstr "" +#, fuzzy +#~ msgid "Too many errors. JobErrors=%d.\n" +#~ msgstr "zu viele items in Job resource\n" -#: src/dird/ua_cmds.c:393 -msgid "Enter slot (0 for none): " -msgstr "" +#, fuzzy +#~ msgid "Network send error to SD. Data=%s ERR=%s\n" +#~ msgstr "Netzwerkfehler mit FD bei %s: ERR=%s\n" -#: src/dird/ua_cmds.c:397 -msgid "InChanger? yes/no: " -msgstr "" +#, fuzzy +#~ msgid " Cannot open resource fork for \"%s\": ERR=%s.\n" +#~ msgstr "Kann Ausdruck\"%s\"nicht auflösen: ERR=%s\n" -#: src/dird/ua_cmds.c:425 -#, c-format -msgid "%d Volumes created in pool %s\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bfdjson [-c config_file] [-d debug_level]\n" +#~ " -r get resource type \n" +#~ " -n get resource \n" +#~ " -l get only directives matching dirs (use with -r)\n" +#~ " -D get only data\n" +#~ " -c use as configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print a timestamp in debug output\n" +#~ " -t test configuration file and exit\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Version: %s (%s)\n" +#~ "\n" +#~ "Usage: bacula-fd [-f -s] [-c config_datei] [-d debug_level]\n" +#~ " -c benutze als Konfigurationsdatei\n" +#~ " -dnn setze debug level auf nn\n" +#~ " -f starte in Vordergrund (für debugging)\n" +#~ " -g groupid\n" +#~ " -s no signals (für debugging)\n" +#~ " -t Konfigurationsdatei testen und beenden\n" +#~ " -u userid\n" +#~ " -v Ausführliche Benutzermeldungen\n" +#~ " -? diese Meldung ausgeben.\n" +#~ "\n" -#: src/dird/ua_cmds.c:441 src/dird/ua_cmds.c:1241 -msgid "Turn on or off? " -msgstr "" +#, fuzzy +#~ msgid "An error occurred while adding signer the stream.\n" +#~ msgstr "Fehler beim holen von Zeile: %s\n" -#: src/dird/ua_cmds.c:569 -#, c-format -msgid "" -"Can't set %s RecyclePool to %s, %s is not in database.\n" -"Try to update it with 'update pool=%s'\n" -msgstr "" +#, fuzzy +#~ msgid "Plugin save packet not found.\n" +#~ msgstr "Path record: %s nicht gefunden.\n" -#: src/dird/ua_cmds.c:587 -#, c-format -msgid "" -"Can't set %s ScratchPool to %s, %s is not in database.\n" -"Try to update it with 'update pool=%s'\n" -msgstr "" +#, fuzzy +#~ msgid "Plugin=%s not found.\n" +#~ msgstr "Pool Ressource \"%s\" nicht gefunden.\n" -#: src/dird/ua_cmds.c:654 -#, c-format -msgid "" -"Error: Pool %s already exists.\n" -"Use update to change it.\n" -msgstr "" +#, fuzzy +#~ msgid "Error while creating command string %s.\n" +#~ msgstr "Fehler beim schreiben der bsr Datei.\n" -#: src/dird/ua_cmds.c:665 -#, c-format -msgid "Pool %s created.\n" -msgstr "" +#, fuzzy +#~ msgid "Error while executing \"%s\" %s. %s %s\n" +#~ msgstr "Fehler beim schreiben der bsr Datei.\n" -#: src/dird/ua_cmds.c:696 -msgid "Failed to set bandwidth limit to Client.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to create snapshot record. ERR=%s\n" +#~ msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" -#: src/dird/ua_cmds.c:700 -#, c-format -msgid "2000 OK Limiting bandwidth to %lldkb/s %s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to create snapshot record, got %s\n" +#~ msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" -#: src/dird/ua_cmds.c:701 -msgid "on running and future jobs" -msgstr "" +#, fuzzy +#~ msgid "Unable to delete snapshot record. ERR=%s\n" +#~ msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" -#: src/dird/ua_cmds.c:725 -msgid "Set Bandwidth choice:\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to delete snapshot record, got %s\n" +#~ msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" -#: src/dird/ua_cmds.c:726 -msgid "Running Job" -msgstr "" +#, fuzzy +#~ msgid "Unable to get snapshot record. ERR=%s\n" +#~ msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" -#: src/dird/ua_cmds.c:727 -msgid "Running and future Jobs for a Client" -msgstr "" +#, fuzzy +#~ msgid "Unable to get snapshot record, got %s\n" +#~ msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" -#: src/dird/ua_cmds.c:728 -msgid "Choose where to limit the bandwidth" -msgstr "" +#, fuzzy +#~ msgid "Unable to parse command output\n" +#~ msgstr "Verbindung zu File daemon fehlgeschlagen.\n" -#: src/dird/ua_cmds.c:740 -msgid "Enter new bandwidth limit kb/s: " -msgstr "" +#, fuzzy +#~ msgid " Unable to delete snapshot of %s ERR=%s\n" +#~ msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" -#: src/dird/ua_cmds.c:777 src/dird/ua_cmds.c:840 src/dird/ua_cmds.c:862 -#: src/dird/ua_cmds.c:884 -msgid "Unauthorized command from this console.\n" -msgstr "" +#, fuzzy +#~ msgid " Create Snapshot for %s\n" +#~ msgstr "Erzeugung des DB Storage Eintrags %s fehlgeschlagen. ERR=%s\n" -#: src/dird/ua_cmds.c:784 src/dird/ua_cmds.c:1292 src/dird/ua_dotcmds.c:201 -#: src/dird/ua_run.c:343 -#, c-format -msgid "Client \"%s\" not found.\n" -msgstr "" +#, fuzzy +#~ msgid " Unable to create snapshot of %s ERR=%s\n" +#~ msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" -#: src/dird/ua_cmds.c:794 -#, c-format -msgid "Client \"%s\" address set to %s\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bacula-fd [-f -s] [-c config_file] [-d debug_level]\n" +#~ " -c use as configuration file\n" +#~ " -d [,] set debug level to , debug tags to \n" +#~ " -dt print a timestamp in debug output\n" +#~ " -f run in foreground (for debugging)\n" +#~ " -g groupid\n" +#~ " -k keep readall capabilities\n" +#~ " -m print kaboom output (for debugging)\n" +#~ " -s no signals (for debugging)\n" +#~ " -t test configuration file and exit\n" +#~ " -T set trace on\n" +#~ " -u userid\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Version: %s (%s)\n" +#~ "\n" +#~ "Usage: bacula-fd [-f -s] [-c config_datei] [-d debug_level]\n" +#~ " -c benutze als Konfigurationsdatei\n" +#~ " -dnn setze debug level auf nn\n" +#~ " -f starte in Vordergrund (für debugging)\n" +#~ " -g groupid\n" +#~ " -s no signals (für debugging)\n" +#~ " -t Konfigurationsdatei testen und beenden\n" +#~ " -u userid\n" +#~ " -v Ausführliche Benutzermeldungen\n" +#~ " -? diese Meldung ausgeben.\n" +#~ "\n" -#: src/dird/ua_cmds.c:813 -#, c-format -msgid "Job Attributes Insertion %sabled\n" -msgstr "" +#, fuzzy +#~ msgid "Disable Command \"%s\" not found.\n" +#~ msgstr "FileSet Eintrag \"%s\" nicht gefunden\n" -#: src/dird/ua_cmds.c:844 -#, c-format -msgid "Job \"%s\" %sabled\n" -msgstr "" +#, fuzzy +#~ msgid "Expected a Cipher Type keyword, got: %s" +#~ msgstr "Job Type Schlüsselwort erwartet, erhalten: %s" -#: src/dird/ua_cmds.c:866 -#, fuzzy, c-format -msgid "Client \"%s\" %sabled\n" -msgstr "Pool Ressource \"%s\" nicht gefunden.\n" +#, fuzzy +#~ msgid "Connection from unknown Director %s at %s rejected.\n" +#~ msgstr "unbekannt" -#: src/dird/ua_cmds.c:888 -#, fuzzy, c-format -msgid "Schedule \"%s\" %sabled\n" -msgstr "Schedule: name=%s\n" +#, fuzzy +#~ msgid "SD connect failed: Bad Hello command\n" +#~ msgstr "Job nicht gefunden: %s\n" -#: src/dird/ua_cmds.c:897 -msgid "" -"You must enter one of the following keywords: job, client, schedule, or " -"storage.\n" -msgstr "" +#, fuzzy +#~ msgid "SD connect failed: Job name not found: %s\n" +#~ msgstr "Job nicht gefunden: %s\n" -#: src/dird/ua_cmds.c:926 src/dird/ua_dotcmds.c:1086 src/dird/ua_status.c:411 -#, c-format -msgid "Connecting to Storage daemon %s at %s:%d\n" -msgstr "" +#, fuzzy +#~ msgid "SD \"%s\" tried to connect two times.\n" +#~ msgstr "Verbindung zu File daemon fehlgeschlagen.\n" -#: src/dird/ua_cmds.c:932 src/dird/ua_dotcmds.c:1092 -msgid "Connected to storage daemon\n" -msgstr "" +#, fuzzy +#~ msgid "Recv caps from SD failed. ERR=%s\n" +#~ msgstr "pthread_create: ERR=%s\n" -#: src/dird/ua_cmds.c:1103 -msgid "Enter new debug level: " -msgstr "" +#, fuzzy +#~ msgid "2001 Job \"%s\" marked to be %s.\n" +#~ msgstr "JobId %s, Job %s zum Abbruch markiert.\n" -#: src/dird/ua_cmds.c:1116 -#, c-format -msgid "Incorrect tags found on command line %s\n" -msgstr "" +#, fuzzy +#~ msgid "Bad RestoreObject command: %s\n" +#~ msgstr "Storage daemon hat \"Job command\": %s abgelehnt\n" -#: src/dird/ua_cmds.c:1199 src/dird/ua_dotcmds.c:1194 -msgid "Available daemons are: \n" -msgstr "" +#, fuzzy +#~ msgid "Failed connect from Storage daemon. SD bsock=NULL.\n" +#~ msgstr "Verbindung zu Storage daemon fehlgeschlagen.\n" -#: src/dird/ua_cmds.c:1200 src/dird/ua_dotcmds.c:1195 -msgid "Director" -msgstr "" +#, fuzzy +#~ msgid "Generate VSS snapshots. Driver=\"%s\"\n" +#~ msgstr "Erzeugung des DB Storage Eintrags %s fehlgeschlagen. ERR=%s\n" -#: src/dird/ua_cmds.c:1201 src/dird/ua_dotcmds.c:1196 src/dird/ua_run.c:1012 -#: src/dird/ua_select.c:189 -msgid "Storage" -msgstr "" +#, fuzzy +#~ msgid "VSS CreateSnapshots failed. ERR=%s\n" +#~ msgstr "Erzeugung des DB Storage Eintrags %s fehlgeschlagen. ERR=%s\n" -#: src/dird/ua_cmds.c:1202 src/dird/ua_dotcmds.c:1197 src/dird/ua_run.c:1018 -#: src/dird/ua_select.c:383 src/dird/ua_select.c:407 src/dird/ua_select.c:544 -msgid "Client" -msgstr "" +#, fuzzy +#~ msgid "VSS was not initialized properly. ERR=%s\n" +#~ msgstr "Kann DB lock nicht initialisieren. ERR=%s\n" -#: src/dird/ua_cmds.c:1203 -msgid "All" -msgstr "" +#, fuzzy +#~ msgid "Bad status %d %c returned from Storage Daemon.\n" +#~ msgstr "FD hat keinen Jobstatus zurückgegeben.\n" -#: src/dird/ua_cmds.c:1204 -msgid "Select daemon type to set debug level" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Bad response from SD to %s command. Wanted %s, got len=%ld msg=\"%s\"\n" +#~ msgstr "Schlechte Antwort auf %s Kommando: erwartet %s, erhalten %s\n" -#: src/dird/ua_cmds.c:1296 src/dird/ua_cmds.c:2119 src/dird/ua_dotcmds.c:205 -#: src/dird/ua_status.c:462 -#, c-format -msgid "No authorization for Client \"%s\"\n" -msgstr "" +#, fuzzy +#~ msgid "Could not set Finder Info on %s\n" +#~ msgstr "Konnte Datenbank \"%s\" nicht öffen.\n" -#: src/dird/ua_cmds.c:1301 src/dird/ua_dotcmds.c:210 -msgid "Client name missing.\n" -msgstr "" +#, fuzzy +#~ msgid "LZO init failed\n" +#~ msgstr "TLS Aushandlung gescheitert.\n" -#: src/dird/ua_cmds.c:1309 src/dird/ua_select.c:1471 src/dird/ua_select.c:1478 -#, c-format -msgid "Job \"%s\" not found.\n" -msgstr "" +#, fuzzy +#~ msgid "Could not create digest.\n" +#~ msgstr "Konnte Client Eintrag nicht anlegen. ERR=%s\n" -#: src/dird/ua_cmds.c:1313 src/dird/ua_cmds.c:1380 src/dird/ua_cmds.c:2141 -#, c-format -msgid "No authorization for Job \"%s\"\n" -msgstr "" +#, fuzzy +#~ msgid "Signer not found. Decryption failed.\n" +#~ msgstr "FileSet MD5 Prüfsumme nicht gefunden.\n" -#: src/dird/ua_cmds.c:1318 -msgid "Job name missing.\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "An error=%d occurred while decoding encrypted session data stream: ERR=" +#~ "%s\n" +#~ msgstr "Fehler beim holen von Zeile: %s\n" -#: src/dird/ua_cmds.c:1327 -#, fuzzy, c-format -msgid "Fileset \"%s\" not found.\n" -msgstr "FileSet Eintrag \"%s\" nicht gefunden\n" +#, fuzzy +#~ msgid "Cannot open resource fork for %s.\n" +#~ msgstr "Kann Ausdruck\"%s\"nicht auflösen: ERR=%s\n" -#: src/dird/ua_cmds.c:1331 -#, c-format -msgid "No authorization for FileSet \"%s\"\n" -msgstr "" +#, fuzzy +#~ msgid "Signature validation failed for file %s: ERR=%s\n" +#~ msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" -#: src/dird/ua_cmds.c:1336 #, fuzzy -msgid "Fileset name missing.\n" -msgstr "FileSet: name=%s\n" +#~ msgid "Digest one file failed for file: %s\n" +#~ msgstr "Mehr als ein Dateiname! %s für Datei: %s\n" -#: src/dird/ua_cmds.c:1347 src/dird/ua_run.c:1402 -#, fuzzy, c-format -msgid "Level \"%s\" not valid.\n" -msgstr "Pool Ressource \"%s\" nicht gefunden.\n" +#, fuzzy +#~ msgid "LZO uncompression error on file %s. ERR=%d\n" +#~ msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" -#: src/dird/ua_cmds.c:1351 -msgid "Level value missing.\n" -msgstr "" +#, fuzzy +#~ msgid "Write write error on %s: ERR=%s\n" +#~ msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" -#: src/dird/ua_cmds.c:1358 -msgid "Invalid value for accurate. It must be yes or no.\n" -msgstr "" +#, fuzzy +#~ msgid "%s %sVersion: %s (%s) %s %s %s %s\n" +#~ msgstr "1000 OK: %s Version: %s (%s)\n" -#: src/dird/ua_cmds.c:1363 #, fuzzy -msgid "Accurate value missing.\n" -msgstr "FileSet: name=%s\n" +#~ msgid "Director connected %sat: %s\n" +#~ msgstr "Verbindung zu File daemon fehlgeschlagen.\n" -#: src/dird/ua_cmds.c:1376 -msgid "No job specified.\n" -msgstr "" +#, fuzzy +#~ msgid " %s%s %s Job started: %s\n" +#~ msgstr "Clone JobId %d gestartet.\n" -#: src/dird/ua_cmds.c:1436 -msgid "Error sending include list.\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ " Files=%s Bytes=%s AveBytes/sec=%s LastBytes/sec=%s Errors=%d\n" +#~ " Bwlimit=%s ReadBytes=%s\n" +#~ msgstr " MigTime=%s MigHiBytes=%s MigLoBytes=%s\n" -#: src/dird/ua_cmds.c:1441 -msgid "Error sending exclude list.\n" -msgstr "" +#, fuzzy +#~ msgid " Files: Examined=%s Backed up=%s\n" +#~ msgstr "FileSet: name=%s\n" -#: src/dird/ua_cmds.c:1535 -msgid "" -"In general it is not a good idea to delete either a\n" -"Pool or a Volume since they may contain data.\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "WriteEncryptedFileRaw failure: ERR=%s\n" +#~ msgstr "Media id select fehlgeschlagen: ERR=%s\n" -#: src/dird/ua_cmds.c:1538 -msgid "Choose catalog item to delete" -msgstr "" +#, fuzzy +#~ msgid "llistea error on file \"%s\": ERR=%s\n" +#~ msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" -#: src/dird/ua_cmds.c:1552 -msgid "Nothing done.\n" -msgstr "" +#, fuzzy +#~ msgid "lgetea error on file \"%s\": ERR=%s\n" +#~ msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" -#: src/dird/ua_cmds.c:1580 -#, c-format -msgid "Are you sure you want to delete %d JobIds ? (yes/no): " -msgstr "" +#, fuzzy +#~ msgid "lsetea error on file \"%s\": ERR=%s\n" +#~ msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" -#: src/dird/ua_cmds.c:1590 -msgid "Enter JobId to delete: " -msgstr "" +#, fuzzy +#~ msgid "attr_list error on file \"%s\": ERR=%s\n" +#~ msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" -#: src/dird/ua_cmds.c:1608 -#, c-format -msgid "Jobid %s and associated records deleted from the catalog.\n" -msgstr "" +#, fuzzy +#~ msgid "Received illegal xattr named %s on file \"%s\"\n" +#~ msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" -#: src/dird/ua_cmds.c:1623 -#, c-format -msgid "" -"\n" -"This command will delete volume %s\n" -"and all Jobs saved on that volume from the Catalog\n" -msgstr "" +#, fuzzy +#~ msgid "attr_set error on file \"%s\": ERR=%s\n" +#~ msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" -#: src/dird/ua_cmds.c:1630 -#, c-format -msgid "Are you sure you want to delete Volume \"%s\"? (yes/no): " -msgstr "" +#, fuzzy +#~ msgid "llistxattr error on file \"%s\": ERR=%s\n" +#~ msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" -#: src/dird/ua_cmds.c:1643 -msgid "Can't list jobs on this volume\n" -msgstr "" +#, fuzzy +#~ msgid "lgetxattr error on file \"%s\": ERR=%s\n" +#~ msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" -#: src/dird/ua_cmds.c:1668 -#, c-format -msgid "Are you sure you want to delete Pool \"%s\"? (yes/no): " -msgstr "" +#, fuzzy +#~ msgid "lsetxattr error on file \"%s\": ERR=%s\n" +#~ msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" -#: src/dird/ua_cmds.c:1714 -#, c-format -msgid "Invalid device name. %s" -msgstr "" +#, fuzzy +#~ msgid "extattr_list_link error on file \"%s\": ERR=%s\n" +#~ msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" -#: src/dird/ua_cmds.c:1791 -#, c-format -msgid "Using Catalog name=%s DB=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Failed to convert %d into namespace on file \"%s\"\n" +#~ msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" -#: src/dird/ua_cmds.c:1859 -msgid "ERR: Can't open db\n" -msgstr "" +#, fuzzy +#~ msgid "extattr_get_link error on file \"%s\": ERR=%s\n" +#~ msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" -#: src/dird/ua_cmds.c:1906 -msgid "Wait on mount timed out\n" -msgstr "" +#, fuzzy +#~ msgid "Failed to split %s into namespace and name part on file \"%s\"\n" +#~ msgstr " Run=%s\n" +#, fuzzy +#~ msgid "Unable create proper proplist to restore xattrs on file \"%s\"\n" +#~ msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" -#: src/dird/ua_cmds.c:2005 -#, c-format -msgid "" -"\n" -"Can't find %s command.\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "setproplist error on file \"%s\": ERR=%s\n" +#~ msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" -#: src/dird/ua_cmds.c:2007 -msgid "" -"\n" -"When at a prompt, entering a period cancels the command.\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to get acl on xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" -#: src/dird/ua_cmds.c:2043 -#, c-format -msgid "%s Version: %s (%s) %s %s %s %s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to get acl text on xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" -#: src/dird/ua_cmds.c:2102 src/dird/ua_cmds.c:2129 src/dird/ua_cmds.c:2151 -#, c-format -msgid "No authorization for Catalog \"%s\"\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to get status on xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" -#: src/dird/ua_cmds.c:2187 src/dird/ua_select.c:242 -msgid "Could not find a Catalog resource\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to open xattr %s on \"%s\": ERR=%s\n" +#~ msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" -#: src/dird/ua_cmds.c:2208 -#, c-format -msgid "Could not open catalog database \"%s\".\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to read symlin %s on \"%s\": ERR=%s\n" +#~ msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" -#: src/dird/ua_cmds.c:2227 -#, c-format -msgid "Using Catalog \"%s\"\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to read content of xattr %s on file \"%s\"\n" +#~ msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" -#: src/dird/ua_dde.c:62 src/dird/ua_dotcmds.c:1594 -#, fuzzy, c-format -msgid "List Media failed: ERR=%s\n" -msgstr "Media id select fehlgeschlagen: ERR=%s\n" +#, fuzzy +#~ msgid "Unable to chdir to xattr space of file \"%s\": ERR=%s\n" +#~ msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" -#: src/dird/ua_dde.c:110 -msgid "Command line" -msgstr "" +#, fuzzy +#~ msgid "Unable to open file \"%s\": ERR=%s\n" +#~ msgstr "Kann Datenbank=%s.nicht öffen. ERR=%s\n" -#: src/dird/ua_dde.c:211 -#, fuzzy, c-format -msgid "Invalid keyword found: %s\n" -msgstr "Ungültige JobId gefunden.\n" +#, fuzzy +#~ msgid "Unable to open xattr space %s on file \"%s\": ERR=%s\n" +#~ msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" -#: src/dird/ua_dde.c:216 -msgid "Dedup Engine choice: \n" -msgstr "" +#, fuzzy +#~ msgid "Unable to chdir to xattr space on file \"%s\": ERR=%s\n" +#~ msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" -#: src/dird/ua_dde.c:217 -msgid "Vacuum data files" -msgstr "" +#, fuzzy +#~ msgid "Unable to list the xattr space on file \"%s\": ERR=%s\n" +#~ msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" -#: src/dird/ua_dde.c:218 -msgid "Cancel running vacuum" -msgstr "" +#, fuzzy +#~ msgid "Unable to convert acl from text on file \"%s\"\n" +#~ msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" -#: src/dird/ua_dde.c:219 -msgid "Display data files usage" -msgstr "" +#, fuzzy +#~ msgid "Unable to restore acl of xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" -#: src/dird/ua_dde.c:223 -msgid "Select action to perform on Dedup Engine" -msgstr "" +#, fuzzy +#~ msgid "Unable to open xattr space on file \"%s\": ERR=%s\n" +#~ msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" -#: src/dird/ua_dotcmds.c:180 -msgid ": is an invalid command.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to open xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" -#: src/dird/ua_dotcmds.c:219 #, fuzzy -msgid "path name missing.\n" -msgstr "FileSet: name=%s\n" +#~ msgid "Unable to chdir to xattr space %s on file \"%s\": ERR=%s\n" +#~ msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" -#: src/dird/ua_dotcmds.c:238 #, fuzzy -msgid "Failed to send command to Client.\n" -msgstr "Verbindung zu File daemon fehlgeschlagen.\n" +#~ msgid "Unable to mkfifo xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" -#: src/dird/ua_dotcmds.c:894 -#, fuzzy, c-format -msgid "Unable to get Job record for Job=%s\n" -msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" +#, fuzzy +#~ msgid "Unable to mknod xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" -#: src/dird/ua_dotcmds.c:909 -#, fuzzy, c-format -msgid "Unable to get last Job record for Job=%s\n" -msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" +#, fuzzy +#~ msgid "Unable to mkdir xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" -#: src/dird/ua_dotcmds.c:925 -#, fuzzy, c-format -msgid "Unable to get Client record for Client=%s\n" -msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" +#, fuzzy +#~ msgid "Unable to link xattr %s to %s on file \"%s\": ERR=%s\n" +#~ msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" -#: src/dird/ua_dotcmds.c:941 -#, fuzzy, c-format -msgid "Unable to get last Job record for Client=%s\n" -msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" +#, fuzzy +#~ msgid "Unable to restore data of xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" -#: src/dird/ua_dotcmds.c:952 src/dird/ua_restore.c:960 -#: src/dird/ua_restore.c:1003 src/dird/vbackup.c:142 -#, c-format -msgid "Unable to get Job record for JobId=%s: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to symlink xattr %s to %s on file \"%s\": ERR=%s\n" +#~ msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" -#: src/dird/ua_dotcmds.c:1156 src/dird/ua_dotcmds.c:1250 -#, fuzzy, c-format -msgid "Unknown command: %s\n" -msgstr "unbekannt" +#, fuzzy +#~ msgid "Unable to restore owner of xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" -#: src/dird/ua_dotcmds.c:1198 -msgid "Select daemon type to make die" -msgstr "" +#, fuzzy +#~ msgid "Unable to restore filetimes of xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" -#: src/dird/ua_dotcmds.c:1224 -msgid "The Director will generate a deadlock.\n" -msgstr "" +#, fuzzy +#~ msgid "Failed to restore extended attributes on file \"%s\"\n" +#~ msgstr " Run=%s\n" - -#: src/dird/ua_run.c:807 -msgid "*None, but required*" -msgstr "" - -#: src/dird/ua_run.c:827 -msgid "Use above plugin configuration? (yes/mod/no): " -msgstr "" - -#: src/dird/ua_run.c:845 src/dird/ua_run.c:1007 src/dird/ua_select.c:73 -msgid "mod" -msgstr "" - -#: src/dird/ua_run.c:869 -#, c-format -msgid "Please enter a value for %s: " -msgstr "" - -#: src/dird/ua_run.c:943 -msgid "No plugin to configure\n" -msgstr "" - -#: src/dird/ua_run.c:951 -#, fuzzy -msgid "Plugins to configure:\n" -msgstr "Pool Ressource \"%s\" nicht gefunden.\n" - -#: src/dird/ua_run.c:960 -msgid "Select plugin to configure" -msgstr "" - -#: src/dird/ua_run.c:976 -#, fuzzy, c-format -msgid "Can't configure %32s\n" -msgstr "Kann inkludierte Datei nicht öffnen: %s. ERR=%s\n" - -#: src/dird/ua_run.c:1011 -msgid "Level" -msgstr "" - -#: src/dird/ua_run.c:1016 -#, fuzzy -msgid "Restore Client" -msgstr "Wiederherstellung läuft..." - -#: src/dird/ua_run.c:1020 -msgid "When" -msgstr "" - -#: src/dird/ua_run.c:1021 -msgid "Priority" -msgstr "" - -#: src/dird/ua_run.c:1026 src/dird/ua_select.c:633 src/dird/ua_select.c:746 -#: src/dird/ua_update.c:615 -msgid "Pool" -msgstr "" - -#: src/dird/ua_run.c:1031 -#, fuzzy -msgid "NextPool" -msgstr " opcmd=%s\n" - -#: src/dird/ua_run.c:1033 -msgid "Verify Job" -msgstr "" - -#: src/dird/ua_run.c:1036 -msgid "Bootstrap" -msgstr "" - -#: src/dird/ua_run.c:1037 -msgid "Where" -msgstr "" - -#: src/dird/ua_run.c:1038 -#, fuzzy -msgid "File Relocation" -msgstr "File daemon" - -#: src/dird/ua_run.c:1039 -msgid "Replace" -msgstr "" - -#: src/dird/ua_run.c:1040 -msgid "JobId" -msgstr "" - -#: src/dird/ua_run.c:1043 -msgid "Plugin Options" -msgstr "" - -#: src/dird/ua_run.c:1086 -msgid "" -"Please enter desired start time as YYYY-MM-DD HH:MM:SS (return for now): " -msgstr "" - -#: src/dird/ua_run.c:1094 src/dird/ua_run.c:1311 -msgid "Invalid time, using current time.\n" -msgstr "" - -#: src/dird/ua_run.c:1101 -msgid "Enter new Priority: " -msgstr "" - -#: src/dird/ua_run.c:1105 -msgid "Priority must be a positive integer.\n" -msgstr "" - -#: src/dird/ua_run.c:1126 -msgid "Please enter the Bootstrap file name: " -msgstr "" - -#: src/dird/ua_run.c:1138 -#, c-format -msgid "Warning cannot open %s: ERR=%s\n" -msgstr "" - -#: src/dird/ua_run.c:1168 -msgid "Please enter the full path prefix for restore (/ for none): " -msgstr "" - -#: src/dird/ua_run.c:1190 -msgid "Replace:\n" -msgstr "" - -#: src/dird/ua_run.c:1194 -msgid "Select replace option" -msgstr "" - -#: src/dird/ua_run.c:1205 -msgid "" -"You must set the bootstrap file to NULL to be able to specify a JobId.\n" -msgstr "" - -#: src/dird/ua_run.c:1217 -msgid "Please Plugin Options string: " -msgstr "" - -#: src/dird/ua_run.c:1260 src/dird/ua_run.c:1265 -msgid "Command input" -msgstr "" - -#: src/dird/ua_run.c:1262 src/dird/ua_run.c:1267 src/dird/ua_run.c:1287 -msgid "User input" -msgstr "" - -#: src/dird/ua_run.c:1350 -#, c-format -msgid "Invalid replace option: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1449 -#, c-format -msgid "strip_prefix=%s add_prefix=%s add_suffix=%s\n" -msgstr "" - -#: src/dird/ua_run.c:1452 -msgid "This will replace your current Where value\n" -msgstr "" - -#: src/dird/ua_run.c:1453 -msgid "Strip prefix" -msgstr "" - -#: src/dird/ua_run.c:1454 -msgid "Add prefix" -msgstr "" - -#: src/dird/ua_run.c:1455 -msgid "Add file suffix" -msgstr "" - -#: src/dird/ua_run.c:1456 -msgid "Enter a regexp" -msgstr "" - -#: src/dird/ua_run.c:1457 -msgid "Test filename manipulation" -msgstr "" - -#: src/dird/ua_run.c:1458 -msgid "Use this ?" -msgstr "" - -#: src/dird/ua_run.c:1463 -msgid "Please enter the path prefix to strip: " -msgstr "" - -#: src/dird/ua_run.c:1471 -msgid "Please enter the path prefix to add (/ for none): " -msgstr "" - -#: src/dird/ua_run.c:1482 -msgid "Please enter the file suffix to add: " -msgstr "" - -#: src/dird/ua_run.c:1489 -msgid "Please enter a valid regexp (!from!to!): " -msgstr "" - -#: src/dird/ua_run.c:1502 -#, c-format -msgid "regexwhere=%s\n" -msgstr "" - -#: src/dird/ua_run.c:1508 -#, c-format -msgid "strip_prefix=%s add_prefix=%s add_suffix=%s result=%s\n" -msgstr "" - -#: src/dird/ua_run.c:1515 -msgid "Cannot use your regexp\n" -msgstr "" - -#: src/dird/ua_run.c:1518 -msgid "Enter a period (.) to stop this test\n" -msgstr "" - -#: src/dird/ua_run.c:1519 -msgid "Please enter filename to test: " -msgstr "" - -#: src/dird/ua_run.c:1521 -#, fuzzy, c-format -msgid "%s -> %s\n" -msgstr " --> Run=%s\n" - -#: src/dird/ua_run.c:1565 -msgid "Cannot use your regexp.\n" -msgstr "" - -#: src/dird/ua_run.c:1578 src/dird/ua_run.c:1608 -msgid "Levels:\n" -msgstr "" - -#: src/dird/ua_run.c:1580 src/lib/util.c:505 src/lib/util.c:551 -msgid "Full" -msgstr "" - -#: src/dird/ua_run.c:1581 src/lib/util.c:508 -msgid "Incremental" -msgstr "" - -#: src/dird/ua_run.c:1582 src/lib/util.c:511 -msgid "Differential" -msgstr "" - -#: src/dird/ua_run.c:1583 src/lib/util.c:514 -msgid "Since" -msgstr "" - -#: src/dird/ua_run.c:1584 -msgid "VirtualFull" -msgstr "" - -#: src/dird/ua_run.c:1585 src/dird/ua_run.c:1614 -msgid "Select level" -msgstr "" - -#: src/dird/ua_run.c:1609 -msgid "Initialize Catalog" -msgstr "" - -#: src/dird/ua_run.c:1610 src/lib/util.c:517 -msgid "Verify Catalog" -msgstr "" - -#: src/dird/ua_run.c:1611 src/lib/util.c:523 -msgid "Verify Volume to Catalog" -msgstr "" - -#: src/dird/ua_run.c:1612 src/lib/util.c:526 -msgid "Verify Disk to Catalog" -msgstr "" - -#: src/dird/ua_run.c:1613 -msgid "Verify Volume Data (not yet implemented)" -msgstr "" - -#: src/dird/ua_run.c:1634 -msgid "Level not appropriate for this Job. Cannot be changed.\n" -msgstr "" - -#: src/dird/ua_run.c:1665 -#, c-format -msgid "" -"Run Admin Job\n" -"JobName: %s\n" -"FileSet: %s\n" -"Client: %s\n" -"Storage: %s\n" -"When: %s\n" -"Priority: %d\n" -msgstr "" - -#: src/dird/ua_run.c:1723 -#, c-format -msgid "" -"Run Backup job\n" -"JobName: %s\n" -"Level: %s\n" -"Client: %s\n" -"FileSet: %s\n" -"Pool: %s (From %s)\n" -"%sStorage: %s (From %s)\n" -"When: %s\n" -"Priority: %d\n" -"%s%s%s" -msgstr "" - -#: src/dird/ua_run.c:1756 -#, fuzzy, c-format -msgid "Could not get job record for selected JobId. ERR=%s" -msgstr "Konnte job record für JobId %s zum migrieren nicht holen. ERR=%s" - -#: src/dird/ua_run.c:1795 -#, c-format -msgid "" -"Run Verify Job\n" -"JobName: %s\n" -"Level: %s\n" -"Client: %s\n" -"FileSet: %s\n" -"Pool: %s (From %s)\n" -"Storage: %s (From %s)\n" -"Verify Job: %s\n" -"Verify List: %s\n" -"When: %s\n" -"Priority: %d\n" -msgstr "" - -#: src/dird/ua_run.c:1824 -msgid "Please enter a JobId for restore: " -msgstr "" - -#: src/dird/ua_run.c:1863 src/dird/ua_run.c:1890 src/dird/ua_run.c:1921 -#: src/dird/ua_run.c:1948 src/dird/ua_run.c:1986 -#, fuzzy -msgid "User specified" -msgstr "Kein storage angegeben.\n" - -#: src/dird/ua_run.c:1865 -#, c-format -msgid "" -"Run Restore job\n" -"JobName: %s\n" -"Bootstrap: %s\n" -"RegexWhere: %s\n" -"Replace: %s\n" -"FileSet: %s\n" -"Backup Client: %s\n" -"Restore Client: %s\n" -"Storage: %s\n" -"When: %s\n" -"Catalog: %s\n" -"Priority: %d\n" -"Plugin Options: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1923 -#, c-format -msgid "" -"Run Restore job\n" -"JobName: %s\n" -"Bootstrap: %s\n" -"Where: %s\n" -"Replace: %s\n" -"FileSet: %s\n" -"Backup Client: %s\n" -"Restore Client: %s\n" -"Storage: %s\n" -"When: %s\n" -"Catalog: %s\n" -"Priority: %d\n" -"Plugin Options: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1955 -#, c-format -msgid "" -"Run Restore job\n" -"JobName: %s\n" -"Bootstrap: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1963 -#, c-format -msgid "RegexWhere: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1966 -#, fuzzy, c-format -msgid "Where: %s\n" -msgstr " opcmd=%s\n" - -#: src/dird/ua_run.c:1970 -#, c-format -msgid "" -"Replace: %s\n" -"Client: %s\n" -"Storage: %s\n" -"JobId: %s\n" -"When: %s\n" -"Catalog: %s\n" -"Priority: %d\n" -"Plugin Options: %s\n" -msgstr "" - -#: src/dird/ua_run.c:2028 -msgid "Run Copy job\n" -msgstr "" - -#: src/dird/ua_run.c:2030 -#, fuzzy -msgid "Run Migration job\n" -msgstr "Konnte Migrationsjob nicht starten.\n" - -#: src/dird/ua_run.c:2062 -#, c-format -msgid "Unknown Job Type=%d\n" -msgstr "" - -#: src/dird/ua_run.c:2136 -#, c-format -msgid "Value missing for keyword %s\n" -msgstr "" - -#: src/dird/ua_run.c:2146 -msgid "JobId specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2155 src/dird/ua_run.c:2295 -msgid "Client specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2163 -msgid "FileSet specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2171 -msgid "Level specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2180 -msgid "Storage specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2188 -msgid "RegexWhere or Where specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2193 -msgid "No authorization for \"regexwhere\" specification.\n" -msgstr "" - -#: src/dird/ua_run.c:2200 -msgid "Where or RegexWhere specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2205 -msgid "No authoriztion for \"where\" specification.\n" -msgstr "" - -#: src/dird/ua_run.c:2212 -msgid "Bootstrap specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2220 -msgid "Replace specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2228 -msgid "When specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2236 -msgid "Priority specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2241 -msgid "Priority must be positive nonzero setting it to 10.\n" -msgstr "" - -#: src/dird/ua_run.c:2251 -msgid "Verify Job specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2279 -msgid "Migration Job specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2287 -msgid "Pool specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2303 -#, fuzzy -msgid "Restore Client specified twice.\n" -msgstr "Kein storage angegeben.\n" - -#: src/dird/ua_run.c:2310 -#, fuzzy -msgid "Plugin Options not yet implemented.\n" -msgstr "Kein storage angegeben.\n" - -#: src/dird/ua_run.c:2313 -#, fuzzy -msgid "Plugin Options specified twice.\n" -msgstr "Kein storage angegeben.\n" - -#: src/dird/ua_run.c:2318 -msgid "No authoriztion for \"PluginOptions\" specification.\n" -msgstr "" - -#: src/dird/ua_run.c:2325 -#, fuzzy -msgid "Spool flag specified twice.\n" -msgstr "Kein storage angegeben.\n" - -#: src/dird/ua_run.c:2332 -#, fuzzy -msgid "Invalid spooldata flag.\n" -msgstr "Ungültige JobId gefunden.\n" - -#: src/dird/ua_run.c:2341 -#, fuzzy -msgid "IgnoreDuplicateCheck flag specified twice.\n" -msgstr "Kein storage angegeben.\n" - -#: src/dird/ua_run.c:2348 -#, fuzzy -msgid "Invalid ignoreduplicatecheck flag.\n" -msgstr "Ungültige JobId gefunden.\n" - -#: src/dird/ua_run.c:2353 -#, fuzzy -msgid "Accurate flag specified twice.\n" -msgstr "Kein storage angegeben.\n" - -#: src/dird/ua_run.c:2360 -#, fuzzy -msgid "Invalid accurate flag.\n" -msgstr "Ungültige JobId gefunden.\n" - -#: src/dird/ua_run.c:2365 -msgid "Job name specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2373 -#, fuzzy -msgid "Media Type specified twice.\n" -msgstr "Kein storage angegeben.\n" - -#: src/dird/ua_run.c:2381 -#, fuzzy -msgid "NextPool specified twice.\n" -msgstr "Kein storage angegeben.\n" - -#: src/dird/ua_run.c:2406 -#, c-format -msgid "Invalid keyword: %s\n" -msgstr "" - -#: src/dird/ua_run.c:2421 -#, c-format -msgid "Catalog \"%s\" not found\n" -msgstr "" - -#: src/dird/ua_run.c:2425 -#, c-format -msgid "No authorization. Catalog \"%s\".\n" -msgstr "" - -#: src/dird/ua_run.c:2459 -#, c-format -msgid "Verify Job \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_run.c:2469 -#, c-format -msgid "Migration Job \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_select.c:39 src/dird/ua_select.c:65 -#, c-format -msgid "The current %s retention period is: %s\n" -msgstr "" - -#: src/dird/ua_select.c:44 -msgid "Continue? (yes/no): " -msgstr "" - -#: src/dird/ua_select.c:70 -msgid "Continue? (yes/mod/no): " -msgstr "" - -#: src/dird/ua_select.c:74 -msgid "Enter new retention period: " -msgstr "" - -#: src/dird/ua_select.c:78 -msgid "Invalid period.\n" -msgstr "" - -#: src/dird/ua_select.c:177 -msgid "The defined Storage resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:189 -msgid "Select Storage resource" -msgstr "" - -#: src/dird/ua_select.c:245 -msgid "You must specify a \"use \" command before continuing.\n" -msgstr "" - -#: src/dird/ua_select.c:251 -msgid "The defined Catalog resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:259 -msgid "Catalog" -msgstr "" - -#: src/dird/ua_select.c:259 -msgid "Select Catalog resource" -msgstr "" - -#: src/dird/ua_select.c:278 -#, fuzzy -msgid "The disabled Job resources are:\n" -msgstr "Kann Job resource %s nicht finden\n" - -#: src/dird/ua_select.c:280 -#, fuzzy -msgid "The enabled Job resources are:\n" -msgstr "Kann Job resource %s nicht finden\n" - -#: src/dird/ua_select.c:292 src/dird/ua_select.c:315 -msgid "Select Job resource" -msgstr "" - -#: src/dird/ua_select.c:307 -msgid "The defined Job resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:334 -#, c-format -msgid "Error: Restore Job resource \"%s\" does not exist.\n" -msgstr "" - -#: src/dird/ua_select.c:348 -msgid "The defined Restore Job resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:356 -msgid "Select Restore Job" -msgstr "" - -#: src/dird/ua_select.c:372 src/dird/ua_select.c:399 -msgid "The defined Client resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:383 -#, fuzzy -msgid "Select Client resource" -msgstr "Pool Ressource" - -#: src/dird/ua_select.c:407 -msgid "Select Client (File daemon) resource" -msgstr "" - -#: src/dird/ua_select.c:434 -#, c-format -msgid "Error: Client resource %s does not exist.\n" -msgstr "" - -#: src/dird/ua_select.c:450 -#, fuzzy -msgid "The defined Schedule resources are:\n" -msgstr "Kann Schedule resource %s nicht finden\n" - -#: src/dird/ua_select.c:461 -#, fuzzy -msgid "Schedule" -msgstr "Schedule: name=%s\n" - -#: src/dird/ua_select.c:461 -#, fuzzy -msgid "Select Schedule resource" -msgstr "Kann Schedule resource %s nicht finden\n" - -#: src/dird/ua_select.c:487 -#, c-format -msgid "Could not find Client %s: ERR=%s" -msgstr "" - -#: src/dird/ua_select.c:497 src/dird/ua_select.c:551 -#, c-format -msgid "Could not find Client \"%s\": ERR=%s" -msgstr "" - -#: src/dird/ua_select.c:526 -#, c-format -msgid "Error obtaining client ids. ERR=%s\n" -msgstr "" - -#: src/dird/ua_select.c:530 -msgid "No clients defined. You must run a job before using this command.\n" -msgstr "" - -#: src/dird/ua_select.c:534 -msgid "Defined Clients:\n" -msgstr "" - -#: src/dird/ua_select.c:544 -msgid "Select the Client" -msgstr "" - -#: src/dird/ua_select.c:577 src/dird/ua_select.c:601 src/dird/ua_select.c:646 -#, c-format -msgid "Could not find Pool \"%s\": ERR=%s" -msgstr "" - -#: src/dird/ua_select.c:616 -msgid "No pools defined. Use the \"create\" command to create one.\n" -msgstr "" - -#: src/dird/ua_select.c:620 -msgid "Defined Pools:\n" -msgstr "" - -#: src/dird/ua_select.c:633 -msgid "Select the Pool" -msgstr "" - -#: src/dird/ua_select.c:671 -#, c-format -msgid "No access to Pool \"%s\"\n" -msgstr "" - -#: src/dird/ua_select.c:703 -msgid "Enter a Volume name or *MediaId: " -msgstr "" - -#: src/dird/ua_select.c:738 -msgid "The defined Pool resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:746 -msgid "Select Pool resource" -msgstr "" - -#: src/dird/ua_select.c:781 -msgid "Enter the JobId to select: " -msgstr "" - -#: src/dird/ua_select.c:819 -#, c-format -msgid "Could not find Job \"%s\": ERR=%s" -msgstr "" - -#: src/dird/ua_select.c:910 src/dird/ua_select.c:1006 -#, c-format -msgid "Automatically selected %s: %s\n" -msgstr "" - -#: src/dird/ua_select.c:921 src/dird/ua_select.c:1017 -#, c-format -msgid "" -"Your request has multiple choices for \"%s\". Selection is not possible in " -"batch mode.\n" -msgstr "" - -#: src/dird/ua_select.c:939 src/dird/ua_select.c:999 -#, c-format -msgid "Selection list for \"%s\" is empty!\n" -msgstr "" - -#: src/dird/ua_select.c:945 -#, c-format -msgid "Automatically selected: %s\n" -msgstr "" - -#: src/dird/ua_select.c:957 -msgid "Selection aborted, nothing done.\n" -msgstr "" - -#: src/dird/ua_select.c:962 src/dird/ua_select.c:1051 -#, c-format -msgid "Please enter a number between 1 and %d\n" -msgstr "" - -#: src/dird/ua_select.c:1105 -msgid "Storage name given twice.\n" -msgstr "" - -#: src/dird/ua_select.c:1122 -#, c-format -msgid "Expecting jobid=nn command, got: %s\n" -msgstr "" - -#: src/dird/ua_select.c:1126 -#, c-format -msgid "JobId %s is not running.\n" -msgstr "" - -#: src/dird/ua_select.c:1136 -#, c-format -msgid "Expecting job=xxx, got: %s.\n" -msgstr "" - -#: src/dird/ua_select.c:1140 -#, c-format -msgid "Job \"%s\" is not running.\n" -msgstr "" - -#: src/dird/ua_select.c:1148 -#, c-format -msgid "Expecting ujobid=xxx, got: %s.\n" -msgstr "" - -#: src/dird/ua_select.c:1169 -#, c-format -msgid "Storage resource \"%s\": not found\n" -msgstr "" - -#: src/dird/ua_select.c:1201 -msgid "Enter autochanger drive[0]: " -msgstr "" - -#: src/dird/ua_select.c:1222 -msgid "Enter autochanger slot: " -msgstr "" - -#: src/dird/ua_select.c:1252 -msgid "Media Types defined in conf file:\n" -msgstr "" - -#: src/dird/ua_select.c:1258 -msgid "Media Type" -msgstr "" - -#: src/dird/ua_select.c:1258 -msgid "Select the Media Type" -msgstr "" - -#: src/dird/ua_select.c:1296 src/filed/status.c:322 src/stored/status.c:915 -msgid "No Jobs running.\n" -msgstr "" - -#: src/dird/ua_select.c:1298 -msgid "None of your jobs are running.\n" -msgstr "" - -#: src/dird/ua_select.c:1326 -#, fuzzy -msgid "No value given for \"jobid\".\n" -msgstr "Keine volumes für JobId=%d gefunden\n" - -#: src/dird/ua_select.c:1338 -#, c-format -msgid "Unauthorized command from this console for JobId=%d.\n" -msgstr "" - -#: src/dird/ua_select.c:1342 -#, c-format -msgid "Warning Job JobId=%d is not running.\n" -msgstr "" - -#: src/dird/ua_select.c:1367 src/dird/ua_select.c:1462 -#, c-format -msgid "Confirm %s of %d Job%s (yes/no): " -msgstr "" - -#: src/dird/ua_select.c:1380 -#, fuzzy -msgid "No value given for \"job\".\n" -msgstr "Keine volumes für JobId=%d gefunden\n" - -#: src/dird/ua_select.c:1390 -#, c-format -msgid "Unauthorized command from this console for job=%s.\n" -msgstr "" - -#: src/dird/ua_select.c:1396 src/dird/ua_select.c:1421 -#, c-format -msgid "Warning Job %s is not running.\n" -msgstr "" - -#: src/dird/ua_select.c:1405 -#, fuzzy -msgid "No value given for \"ujobid\".\n" -msgstr "Keine volumes für JobId=%d gefunden\n" - -#: src/dird/ua_select.c:1415 -#, c-format -msgid "Unauthorized command from this console for ujobid=%s.\n" -msgstr "" - -#: src/dird/ua_select.c:1441 -#, fuzzy -msgid "Select Job(s):\n" -msgstr "ist nicht aktiviert" - -#: src/dird/ua_select.c:1447 -#, c-format -msgid "JobId=%s Job=%s" -msgstr "" - -#: src/dird/ua_select.c:1451 -#, c-format -msgid "Choose Job list to %s" -msgstr "" - -#: src/dird/ua_server.c:57 -#, c-format -msgid "Cannot create UA thread: %s\n" -msgstr "" - -#: src/dird/ua_server.c:147 -msgid "You have messages.\n" -msgstr "" - -#: src/dird/ua_status.c:171 -msgid "Status available for:\n" -msgstr "" - -#: src/dird/ua_status.c:178 -msgid "Select daemon type for status" -msgstr "" - -#: src/dird/ua_status.c:324 src/stored/status.c:499 -#, fuzzy, c-format -msgid "%s %sVersion: %s (%s) %s %s %s\n" -msgstr "1000 OK: %s Version: %s (%s)\n" - -#: src/dird/ua_status.c:328 -#, c-format -msgid "Daemon started %s, conf reloaded %s\n" -msgstr "" - -#: src/dird/ua_status.c:329 -#, c-format -msgid " Jobs: run=%d, running=%d mode=%d,%d\n" -msgstr "" - -#: src/dird/ua_status.c:331 src/filed/status.c:175 src/stored/status.c:509 -#, c-format -msgid " Heap: heap=%s smbytes=%s max_bytes=%s bufs=%s max_bufs=%s\n" -msgstr "" - -#: src/dird/ua_status.c:337 -#, c-format -msgid "" -" Res: njobs=%d nclients=%d nstores=%d npools=%d ncats=%d nfsets=%d nscheds=" -"%d\n" -msgstr "" - -#: src/dird/ua_status.c:394 -#, fuzzy, c-format -msgid "No authorization for Storage \"%s\"\n" -msgstr "Storage daemon" - -#: src/dird/ua_status.c:404 -msgid "Restricted Client or Job does not permit access to Storage daemons\n" -msgstr "" - -#: src/dird/ua_status.c:414 -#, c-format -msgid "" -"\n" -"Failed to connect to Storage daemon %s.\n" -"====\n" -msgstr "" - -#: src/dird/ua_status.c:429 -msgid "Must have three aguments\n" -msgstr "" - -#: src/dird/ua_status.c:478 -#, c-format -msgid "" -"Failed to connect to Client %s.\n" -"====\n" -msgstr "" - -#: src/dird/ua_status.c:483 -msgid "Connected to file daemon\n" -msgstr "" - -#: src/dird/ua_status.c:502 src/dird/ua_status.c:511 -msgid "" -"\n" -"Scheduled Jobs:\n" -msgstr "" - -#: src/dird/ua_status.c:503 -msgid "" -"Level Type Pri Scheduled Job Name Volume\n" -msgstr "" - -#: src/dird/ua_status.c:504 -msgid "===================================================================================\n" -msgstr "" - -#: src/dird/ua_status.c:512 -msgid "" -"Level Type Pri Scheduled Job Name Schedule\n" -msgstr "" - -#: src/dird/ua_status.c:513 -msgid "=====================================================================================\n" -msgstr "" - -#: src/dird/ua_status.c:570 src/dird/ua_status.c:753 -#, c-format -msgid "%-14s\t%-8s\t%3d\t%-18s\t%-18s\t%s\n" -msgstr "" - -#: src/dird/ua_status.c:591 src/dird/ua_status.c:757 -#, c-format -msgid "%-14s %-8s %3d %-18s %-18s %s\n" -msgstr "" - -#: src/dird/ua_status.c:627 -msgid "Ignoring invalid value for days. Max is 3000.\n" -msgstr "" - -#: src/dird/ua_status.c:638 -msgid "Ignoring invalid value for limit. Max is 2000.\n" -msgstr "" - -#: src/dird/ua_status.c:649 -msgid "Ignoring invalid time.\n" -msgstr "" - -#: src/dird/ua_status.c:772 src/dird/ua_status.c:877 -msgid "No Scheduled Jobs.\n" -msgstr "" - -#: src/dird/ua_status.c:824 -msgid "Ignoring invalid value for days. Max is 500.\n" -msgstr "" - -#: src/dird/ua_status.c:903 src/filed/status.c:228 src/stored/status.c:816 -msgid "" -"\n" -"Running Jobs:\n" -msgstr "" - -#: src/dird/ua_status.c:911 -#, fuzzy, c-format -msgid "Console connected %sat %s\n" -msgstr "Console: name=%s SSL=%d\n" - -#: src/dird/ua_status.c:912 src/filed/status.c:240 -msgid "using TLS " -msgstr "" - -#: src/dird/ua_status.c:922 -msgid "" -"No Jobs running.\n" -"====\n" -msgstr "" - -#: src/dird/ua_status.c:929 -msgid " JobId Type Level Files Bytes Name Status\n" -msgstr "" - -#: src/dird/ua_status.c:930 -msgid "======================================================================\n" -msgstr "" - -#: src/dird/ua_status.c:945 -msgid "is waiting execution" -msgstr "" - -#: src/dird/ua_status.c:948 -msgid "is running" -msgstr "" - -#: src/dird/ua_status.c:951 -msgid "is blocked" -msgstr "" - -#: src/dird/ua_status.c:954 -msgid "has terminated" -msgstr "" - -#: src/dird/ua_status.c:957 -#, fuzzy -msgid "has terminated with warnings" -msgstr "%s OK -- mit Warnungen" - -#: src/dird/ua_status.c:960 -#, fuzzy -msgid "has terminated in incomplete state" -msgstr "%s OK -- mit Warnungen" - -#: src/dird/ua_status.c:963 -msgid "has erred" -msgstr "" - -#: src/dird/ua_status.c:966 -msgid "has errors" -msgstr "" - -#: src/dird/ua_status.c:969 -msgid "has a fatal error" -msgstr "" - -#: src/dird/ua_status.c:972 -msgid "has verify differences" -msgstr "" - -#: src/dird/ua_status.c:975 -msgid "has been canceled" -msgstr "" - -#: src/dird/ua_status.c:980 -msgid "is waiting on Client" -msgstr "" - -#: src/dird/ua_status.c:982 -#, c-format -msgid "is waiting on Client %s" -msgstr "" - -#: src/dird/ua_status.c:990 src/dird/ua_status.c:992 -#, fuzzy, c-format -msgid "is waiting on Storage \"%s\"" -msgstr "Storage daemon" - -#: src/dird/ua_status.c:994 -msgid "is waiting on Storage" -msgstr "" - -#: src/dird/ua_status.c:1000 -msgid "is waiting on max Storage jobs" -msgstr "" - -#: src/dird/ua_status.c:1003 -msgid "is waiting on max Client jobs" -msgstr "" - -#: src/dird/ua_status.c:1006 -msgid "is waiting on max Job jobs" -msgstr "" - -#: src/dird/ua_status.c:1009 -msgid "is waiting on max total jobs" -msgstr "" - -#: src/dird/ua_status.c:1013 -#, fuzzy, c-format -msgid "is waiting for its start time (%s)" -msgstr "Storage daemon" - -#: src/dird/ua_status.c:1019 -msgid "is waiting for higher priority jobs to finish" -msgstr "" - -#: src/dird/ua_status.c:1022 -#, fuzzy -msgid "is waiting for a Shared Storage device" -msgstr "Storage daemon" - -#: src/dird/ua_status.c:1025 src/dird/ua_status.c:1076 src/lib/util.c:317 -msgid "SD committing Data" -msgstr "" - -#: src/dird/ua_status.c:1028 src/dird/ua_status.c:1079 src/lib/util.c:320 -msgid "SD despooling Data" -msgstr "" - -#: src/dird/ua_status.c:1031 src/dird/ua_status.c:1082 src/lib/util.c:323 -msgid "SD despooling Attributes" -msgstr "" - -#: src/dird/ua_status.c:1034 src/dird/ua_status.c:1085 src/lib/util.c:326 -msgid "Dir inserting Attributes" -msgstr "" - -#: src/dird/ua_status.c:1039 -#, fuzzy, c-format -msgid "is in unknown state %c" -msgstr "unbekannt" - -#: src/dird/ua_status.c:1053 -msgid "is waiting for a mount request" -msgstr "" - -#: src/dird/ua_status.c:1060 -msgid "is waiting for an appendable Volume" -msgstr "" - -#: src/dird/ua_status.c:1068 -#, fuzzy -msgid "is waiting for Client to connect to Storage daemon" -msgstr "Verbindung zu Storage daemon fehlgeschlagen.\n" - -#: src/dird/ua_status.c:1070 -#, c-format -msgid "is waiting for Client %s to connect to Storage %s" -msgstr "" - -#: src/dird/ua_status.c:1101 -#, c-format -msgid "%6d\t%-6s\t%-20s\t%s\t%s\n" -msgstr "" - -#: src/dird/ua_status.c:1133 -#, fuzzy, c-format -msgid "%6d %-4s %-3s %10s %10s %-17s %s\n" -msgstr "1000 OK: %s Version: %s (%s)\n" - -#: src/dird/ua_status.c:1161 -msgid "No Terminated Jobs.\n" -msgstr "" - -#: src/dird/ua_status.c:1167 src/lib/status.h:77 -msgid "" -"\n" -"Terminated Jobs:\n" -msgstr "" - -#: src/dird/ua_status.c:1168 src/lib/status.h:84 -msgid " JobId Level Files Bytes Status Finished Name \n" -msgstr "" - -#: src/dird/ua_status.c:1169 -msgid "====================================================================\n" -msgstr "" - -#: src/dird/ua_status.c:1203 src/lib/status.h:110 src/lib/util.c:256 -msgid "Created" -msgstr "" - -#: src/dird/ua_status.c:1210 src/lib/status.h:117 -msgid "Diffs" -msgstr "" - -#: src/dird/ua_status.c:1219 src/lib/status.h:126 src/lib/util.c:278 -#: src/lib/util.c:400 src/lib/util.c:406 -#, fuzzy -msgid "OK -- with warnings" -msgstr "%s OK -- mit Warnungen" - -#: src/dird/ua_status.c:1222 src/lib/status.h:129 -msgid "Incomplete" -msgstr "" - -#: src/dird/ua_status.c:1225 src/lib/status.h:132 -msgid "Other" -msgstr "" - -#: src/dird/ua_status.c:1229 src/lib/status.h:144 -#, c-format -msgid "%6d\t%-6s\t%8s\t%10s\t%-7s\t%-8s\t%s\n" -msgstr "" - -#: src/dird/ua_status.c:1255 src/lib/status.h:173 -#, c-format -msgid "%6d %-6s %8s %10s %-7s %-8s %s\n" -msgstr "" - -#: src/dird/ua_status.c:1265 -msgid "\n" -msgstr "" - -#: src/dird/ua_tree.c:63 -msgid "add dir/file to be restored recursively, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:64 -msgid "change current directory" -msgstr "" - -#: src/dird/ua_tree.c:65 -msgid "count marked files in and below the cd" -msgstr "" - -#: src/dird/ua_tree.c:66 -msgid "delete dir/file to be restored recursively in dir" -msgstr "" - -#: src/dird/ua_tree.c:67 src/dird/ua_tree.c:68 -msgid "long list current directory, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:69 -msgid "leave file selection mode" -msgstr "" - -#: src/dird/ua_tree.c:70 -msgid "estimate restore size" -msgstr "" - -#: src/dird/ua_tree.c:71 -msgid "same as done command" -msgstr "" - -#: src/dird/ua_tree.c:72 -msgid "find files, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:73 src/dird/ua_tree.c:86 src/dird/ua_tree.c:87 -msgid "print help" -msgstr "" - -#: src/dird/ua_tree.c:74 src/dird/ua_tree.c:75 -msgid "list current directory, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:76 -msgid "list subdir in current directory, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:77 -msgid "list the marked files in and below the cd" -msgstr "" - -#: src/dird/ua_tree.c:78 -msgid "list the marked files in" -msgstr "" - -#: src/dird/ua_tree.c:79 -msgid "mark dir/file to be restored recursively, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:80 -msgid "mark directory name to be restored (no files)" -msgstr "" - -#: src/dird/ua_tree.c:81 src/dird/ua_tree.c:82 -msgid "print current working directory" -msgstr "" - -#: src/dird/ua_tree.c:83 -msgid "unmark dir/file to be restored recursively in dir" -msgstr "" - -#: src/dird/ua_tree.c:84 -msgid "unmark directory name only no recursion" -msgstr "" - -#: src/dird/ua_tree.c:85 -msgid "quit and do not do restore" -msgstr "" - -#: src/dird/ua_tree.c:107 -msgid "" -"\n" -"You are now entering file selection mode where you add (mark) and\n" -"remove (unmark) files to be restored. No files are initially added, unless\n" -"you used the \"all\" keyword on the command line.\n" -"Enter \"done\" to leave this mode.\n" -"\n" -msgstr "" - -#: src/dird/ua_tree.c:118 src/dird/ua_tree.c:848 -#, c-format -msgid "cwd is: %s\n" -msgstr "" - -#: src/dird/ua_tree.c:127 src/dird/ua_tree.c:146 -#, fuzzy, c-format -msgid "Invalid command \"%s\". Enter \"done\" to exit.\n" -msgstr "unbekannt" - -#: src/dird/ua_tree.c:218 -#, c-format -msgid "" -"Something is wrong with the Delta sequence of %s, skiping new parts. Current " -"sequence is %d\n" -msgstr "" - -#: src/dird/ua_tree.c:390 src/dird/ua_tree.c:402 src/dird/ua_tree.c:419 -msgid "No files marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:404 -msgid "1 file marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:406 -#, c-format -msgid "%s files marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:434 -msgid "No directories marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:436 -msgid "1 directory marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:438 -#, c-format -msgid "%s directories marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:459 -#, c-format -msgid "%s total files/dirs. %s marked to be restored.\n" -msgstr "" - -#: src/dird/ua_tree.c:470 -msgid "No file specification given.\n" -msgstr "" - -#: src/dird/ua_tree.c:691 -#, c-format -msgid "Node %s has no children.\n" -msgstr "" - -#: src/dird/ua_tree.c:784 -#, c-format -msgid "%d total files; %d marked to be restored; %s bytes.\n" -msgstr "" - -#: src/dird/ua_tree.c:795 src/stored/btape.c:2948 -#, c-format -msgid "" -" Command Description\n" -" ======= ===========\n" -msgstr "" - -#: src/dird/ua_tree.c:818 -msgid "Too few or too many arguments. Try using double quotes.\n" -msgstr "" - -#: src/dird/ua_tree.c:831 -msgid "Invalid path given.\n" -msgstr "" - -#: src/dird/ua_tree.c:867 src/dird/ua_tree.c:879 -msgid "No files unmarked.\n" -msgstr "" - -#: src/dird/ua_tree.c:881 -msgid "1 file unmarked.\n" -msgstr "" - -#: src/dird/ua_tree.c:884 -#, c-format -msgid "%s files unmarked.\n" -msgstr "" - -#: src/dird/ua_tree.c:895 src/dird/ua_tree.c:912 -msgid "No directories unmarked.\n" -msgstr "" - -#: src/dird/ua_tree.c:914 -msgid "1 directory unmarked.\n" -msgstr "" - -#: src/dird/ua_tree.c:916 -#, c-format -msgid "%d directories unmarked.\n" -msgstr "" - -#: src/dird/ua_update.c:92 -msgid "Update choice:\n" -msgstr "" - -#: src/dird/ua_update.c:93 -msgid "Volume parameters" -msgstr "" - -#: src/dird/ua_update.c:94 -msgid "Pool from resource" -msgstr "" - -#: src/dird/ua_update.c:95 -msgid "Slots from autochanger" -msgstr "" - -#: src/dird/ua_update.c:96 -msgid "Long term statistics" -msgstr "" - -#: src/dird/ua_update.c:97 -#, fuzzy -msgid "Snapshot parameters" -msgstr "unbekannt" - -#: src/dird/ua_update.c:98 -msgid "item" -msgstr "" - -#: src/dird/ua_update.c:98 -msgid "Choose catalog item to update" -msgstr "" - -#: src/dird/ua_update.c:144 -#, c-format -msgid "Invalid VolStatus specified: %s\n" -msgstr "" - -#: src/dird/ua_update.c:153 -#, c-format -msgid "New Volume status is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:182 -#, c-format -msgid "Invalid use duration specified: %s\n" -msgstr "" - -#: src/dird/ua_update.c:190 -#, c-format -msgid "New use duration is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:204 -#, c-format -msgid "New max jobs is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:217 -#, c-format -msgid "New max files is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:228 -#, c-format -msgid "Invalid max. bytes specification: %s\n" -msgstr "" - -#: src/dird/ua_update.c:236 -#, c-format -msgid "New Max bytes is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:247 src/dird/ua_update.c:267 -msgid "Invalid value. It must be yes or no.\n" -msgstr "" - -#: src/dird/ua_update.c:255 -#, c-format -msgid "New Recycle flag is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:275 -#, c-format -msgid "New InChanger flag is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:293 -#, c-format -msgid "Invalid slot, it must be between 0 and MaxVols=%d\n" -msgstr "" - -#: src/dird/ua_update.c:303 src/dird/ua_update.c:727 -#, c-format -msgid "Error updating media record Slot: ERR=%s" -msgstr "" - -#: src/dird/ua_update.c:305 -#, c-format -msgid "New Slot is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:330 -#, c-format -msgid "New Pool is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:373 -#, c-format -msgid "New RecyclePool is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:393 -#, c-format -msgid "Error updating Volume record: ERR=%s" -msgstr "" - -#: src/dird/ua_update.c:395 -#, c-format -msgid "Volume defaults updated from \"%s\" Pool record.\n" -msgstr "" - -#: src/dird/ua_update.c:418 src/dird/ua_update.c:450 -#, c-format -msgid "Error updating Volume records: ERR=%s" -msgstr "" - -#: src/dird/ua_update.c:420 src/dird/ua_update.c:452 -#, c-format -msgid "All Volume defaults updated from \"%s\" Pool record.\n" -msgstr "" - -#: src/dird/ua_update.c:442 -#, c-format -msgid "Updating all pools, but skipped PoolId=%d. ERR=%s\n" -msgstr "" - -#: src/dird/ua_update.c:468 -#, c-format -msgid "Error updating media record Enabled: ERR=%s" -msgstr "" - -#: src/dird/ua_update.c:471 -#, c-format -msgid "New Enabled is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:486 -#, fuzzy, c-format -msgid "Error updating media record ActionOnPurge: ERR=%s" -msgstr "Fehler beim Aktualisieren des Client Eintrags. ERR=%s\n" - -#: src/dird/ua_update.c:489 -#, c-format -msgid "New ActionOnPurge is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:605 -msgid "Volume Status" -msgstr "" - -#: src/dird/ua_update.c:606 -msgid "Volume Retention Period" -msgstr "" - -#: src/dird/ua_update.c:607 -msgid "Volume Use Duration" -msgstr "" - -#: src/dird/ua_update.c:608 -msgid "Maximum Volume Jobs" -msgstr "" - -#: src/dird/ua_update.c:609 -msgid "Maximum Volume Files" -msgstr "" - -#: src/dird/ua_update.c:610 -msgid "Maximum Volume Bytes" -msgstr "" - -#: src/dird/ua_update.c:611 -msgid "Recycle Flag" -msgstr "" - -#: src/dird/ua_update.c:612 -msgid "Slot" -msgstr "" - -#: src/dird/ua_update.c:613 -msgid "InChanger Flag" -msgstr "" - -#: src/dird/ua_update.c:614 -msgid "Volume Files" -msgstr "" - -#: src/dird/ua_update.c:616 -msgid "Volume from Pool" -msgstr "" - -#: src/dird/ua_update.c:617 -msgid "All Volumes from Pool" -msgstr "" - -#: src/dird/ua_update.c:618 -msgid "All Volumes from all Pools" -msgstr "" - -#: src/dird/ua_update.c:619 -msgid "Enabled" -msgstr "" - -#: src/dird/ua_update.c:620 -msgid "RecyclePool" -msgstr "" - -#: src/dird/ua_update.c:621 -msgid "Action On Purge" -msgstr "" - -#: src/dird/ua_update.c:631 -#, c-format -msgid "Updating Volume \"%s\"\n" -msgstr "" - -#: src/dird/ua_update.c:636 -#, c-format -msgid "Current Volume status is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:637 -msgid "Possible Values are:\n" -msgstr "" - -#: src/dird/ua_update.c:648 -msgid "Choose new Volume Status" -msgstr "" - -#: src/dird/ua_update.c:656 -msgid "Enter Volume Retention period: " -msgstr "" - -#: src/dird/ua_update.c:663 -#, c-format -msgid "Current use duration is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:665 -msgid "Enter Volume Use Duration: " -msgstr "" - -#: src/dird/ua_update.c:672 -#, c-format -msgid "Current max jobs is: %u\n" -msgstr "" - -#: src/dird/ua_update.c:673 -msgid "Enter new Maximum Jobs: " -msgstr "" - -#: src/dird/ua_update.c:680 -#, c-format -msgid "Current max files is: %u\n" -msgstr "" - -#: src/dird/ua_update.c:681 -msgid "Enter new Maximum Files: " -msgstr "" - -#: src/dird/ua_update.c:688 -#, c-format -msgid "Current value is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:689 -msgid "Enter new Maximum Bytes: " -msgstr "" - -#: src/dird/ua_update.c:697 -#, c-format -msgid "Current recycle flag is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:699 -msgid "Enter new Recycle status: " -msgstr "" - -#: src/dird/ua_update.c:706 -#, c-format -msgid "Current Slot is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:707 -msgid "Enter new Slot: " -msgstr "" - -#: src/dird/ua_update.c:714 -#, c-format -msgid "Current InChanger flag is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:715 -#, c-format -msgid "Set InChanger flag for Volume \"%s\": yes/no: " -msgstr "" - -#: src/dird/ua_update.c:729 -#, c-format -msgid "New InChanger flag is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:736 -msgid "" -"Warning changing Volume Files can result\n" -"in loss of data on your Volume\n" -"\n" -msgstr "" - -#: src/dird/ua_update.c:738 -#, c-format -msgid "Current Volume Files is: %u\n" -msgstr "" - -#: src/dird/ua_update.c:739 -msgid "Enter new number of Files for Volume: " -msgstr "" - -#: src/dird/ua_update.c:744 -msgid "Normally, you should only increase Volume Files by one!\n" -msgstr "" - -#: src/dird/ua_update.c:745 -msgid "Increase Volume Files? (yes/no): " -msgstr "" - -#: src/dird/ua_update.c:755 -#, c-format -msgid "New Volume Files is: %u\n" -msgstr "" - -#: src/dird/ua_update.c:767 -#, c-format -msgid "Current Pool is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:768 -msgid "Enter new Pool name: " -msgstr "" - -#: src/dird/ua_update.c:789 -#, c-format -msgid "Current Enabled is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:790 -msgid "Enter new Enabled: " -msgstr "" - -#: src/dird/ua_update.c:800 -#, c-format -msgid "Current RecyclePool is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:802 -msgid "No current RecyclePool\n" -msgstr "" - -#: src/dird/ua_update.c:812 -#, c-format -msgid "Current ActionOnPurge is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:814 -msgid "Enter new ActionOnPurge (one of: Truncate, None): " -msgstr "" - -#: src/dird/ua_update.c:842 -#, c-format -msgid "Updating %i job(s).\n" -msgstr "" - -#: src/dird/ua_update.c:874 -#, c-format -msgid "db_update_pool_record returned %d. ERR=%s\n" -msgstr "" - -#: src/dird/ua_update.c:881 -msgid "Pool DB record updated from resource.\n" -msgstr "" - -#: src/dird/ua_update.c:908 -#, fuzzy -msgid "Expect JobId keyword, not found.\n" -msgstr "Job Type Schlüsselwort erwartet, erhalten: %s" - -#: src/dird/ua_update.c:933 -#, fuzzy -msgid "Neither Client nor StartTime specified.\n" -msgstr "Kein storage angegeben.\n" - -#: src/dird/vbackup.c:122 -#, fuzzy, c-format -msgid "Start Virtual Backup JobId %s, Job=%s\n" -msgstr "Start Sicherung JobId %s, Job=%s\n" - -#: src/dird/vbackup.c:126 -msgid "" -"This Job is not an Accurate backup so is not equivalent to a Full backup.\n" -msgstr "" - -#: src/dird/vbackup.c:172 -#, fuzzy -msgid "No valid Jobs found from user selection.\n" -msgstr "Kein Job gefunden für: %s.\n" - -#: src/dird/vbackup.c:176 -#, fuzzy, c-format -msgid "Using user supplied JobIds=%s\n" -msgstr "Migration benutzt JobId=%s Job=%s\n" - -#: src/dird/vbackup.c:195 -msgid "No previous Full found in list, using Differential level\n" -msgstr "" - -#: src/dird/vbackup.c:200 -msgid "No previous Full found in list, using Incremental level\n" -msgstr "" - -#: src/dird/vbackup.c:213 -#, fuzzy -msgid "No previous Jobs found.\n" -msgstr "Keinen vorherigen Job zum migrieren gefunden.\n" - -#: src/dird/vbackup.c:236 -#, fuzzy, c-format -msgid "Error getting Job record for previous Job: ERR=%s" -msgstr "Fehler beim Holen des job Eintrags für den job Bericht: %s" - -#: src/dird/vbackup.c:449 -#, fuzzy, c-format -msgid "" -"%s %s %s (%s):\n" -" Build OS: %s %s %s\n" -" JobId: %d\n" -" Job: %s\n" -" Backup Level: Virtual Full\n" -" Client: \"%s\" %s\n" -" FileSet: \"%s\" %s\n" -" Pool: \"%s\" (From %s)\n" -" Catalog: \"%s\" (From %s)\n" -" Storage: \"%s\" (From %s)\n" -" Scheduled time: %s\n" -" Start time: %s\n" -" End time: %s\n" -" Elapsed time: %s\n" -" Priority: %d\n" -" SD Files Written: %s\n" -" SD Bytes Written: %s (%sB)\n" -" Rate: %.1f KB/s\n" -" Volume name(s): %s\n" -" Volume Session Id: %d\n" -" Volume Session Time: %d\n" -" Last Volume Bytes: %s (%sB)\n" -" SD Errors: %d\n" -" SD termination status: %s\n" -" Termination: %s\n" -"\n" -msgstr "" -"%s %s (%s): %s\n" -" vorheriges Backup JobId:%s\n" -" neues Backup JobId: %s\n" -" Migration JobId: %s\n" -" Migration Job: %s\n" -" Backup Level: %s%s\n" -" Client: %s\n" -" FileSet: \"%s\" %s\n" -" Lese Pool: \"%s\" (Von %s)\n" -" Lese Storage: \"%s\" (Von %s)\n" -" Schreib Pool: \"%s\" (Von %s)\n" -" Schreib Storage: \"%s\" (Von %s)\n" -" Start Zeit: %s\n" -" End Zeit: %s\n" -" Verstichene Zeit: %s\n" -" Priorität: %d\n" -" SD Dateien geschrieben: %s\n" -" SD Bytes geschrieben: %s (%sB)\n" -" Geschwindigkeit: %.1f KB/s\n" -" Volume name(s): %s\n" -" Volume Session Id: %d\n" -" Volume Session Time: %d\n" -" Last Volume Bytes: %s (%sB)\n" -" SD Fehler: %d\n" -" SD Beendigungsstatus : %s\n" -" Beendigungsstatus: %s\n" -"\n" - -#: src/dird/verify.c:72 src/dird/verify.c:319 -#, c-format -msgid "Unimplemented Verify level %d(%c)\n" -msgstr "" - -#: src/dird/verify.c:136 -msgid "" -"Unable to find JobId of previous InitCatalog Job.\n" -"Please run a Verify with Level=InitCatalog before\n" -"running the current Job.\n" -msgstr "" - -#: src/dird/verify.c:141 -msgid "Unable to find JobId of previous Job for this client.\n" -msgstr "" - -#: src/dird/verify.c:158 -#, c-format -msgid "Could not get job record for previous Job. ERR=%s" -msgstr "" - -#: src/dird/verify.c:164 -#, c-format -msgid "Last Job %d did not terminate normally. JobStatus=%c\n" -msgstr "" - -#: src/dird/verify.c:168 -#, c-format -msgid "Verifying against JobId=%d Job=%s\n" -msgstr "" - -#: src/dird/verify.c:207 -#, c-format -msgid "Start Verify JobId=%s Level=%s Job=%s\n" -msgstr "" - -#: src/dird/verify.c:306 -msgid "Deprecated feature ... use bootstrap.\n" -msgstr "" - -#: src/dird/verify.c:373 -#, c-format -msgid "Unimplemented verify level %d\n" -msgstr "" - -#: src/dird/verify.c:422 -msgid "Verify OK" -msgstr "" - -#: src/dird/verify.c:426 -msgid "*** Verify Error ***" -msgstr "" - -#: src/dird/verify.c:430 -msgid "Verify warnings" -msgstr "" - -#: src/dird/verify.c:433 -msgid "Verify Canceled" -msgstr "" - -#: src/dird/verify.c:436 -msgid "Verify Differences" -msgstr "" - -#: src/dird/verify.c:441 -#, c-format -msgid "Inappropriate term code: %d %c\n" -msgstr "" - -#: src/dird/verify.c:455 -#, fuzzy, c-format -msgid "" -"%s %s %s (%s):\n" -" Build OS: %s %s %s\n" -" JobId: %d\n" -" Job: %s\n" -" FileSet: %s\n" -" Verify Level: %s\n" -" Client: %s\n" -" Verify JobId: %d\n" -" Verify Job: %s\n" -" Start time: %s\n" -" End time: %s\n" -" Files Expected: %s\n" -" Files Examined: %s\n" -" Non-fatal FD errors: %d\n" -" FD termination status: %s\n" -" SD termination status: %s\n" -" Termination: %s\n" -"\n" -msgstr "" -"%s %s (%s): %s\n" -" JobId: %d\n" -" Job: %s\n" -" Client: %s\n" -" Start time: %s\n" -" End time: %s\n" -" Dateien erwartet: %s\n" -" Dateien. wiederhergestellt: %s\n" -" Bytes wiederhergestellt: %s\n" -" Geschwindigkeit: %.1f KB/s\n" -" FD Fehler: %d\n" -" FD Beendigungsstatus: %s\n" -" SD Beendigungsstatus: %s\n" -" Beendigungsstatus: %s\n" -"\n" - -#: src/dird/verify.c:490 -#, fuzzy, c-format -msgid "" -"%s %s %s (%s):\n" -" Build: %s %s %s\n" -" JobId: %d\n" -" Job: %s\n" -" FileSet: %s\n" -" Verify Level: %s\n" -" Client: %s\n" -" Verify JobId: %d\n" -" Verify Job: %s\n" -" Start time: %s\n" -" End time: %s\n" -" Files Examined: %s\n" -" Non-fatal FD errors: %d\n" -" FD termination status: %s\n" -" Termination: %s\n" -"\n" -msgstr "" -"%s %s (%s): %s\n" -" JobId: %d\n" -" Job: %s\n" -" Client: %s\n" -" Start time: %s\n" -" End time: %s\n" -" Dateien erwartet: %s\n" -" Dateien. wiederhergestellt: %s\n" -" Bytes wiederhergestellt: %s\n" -" Geschwindigkeit: %.1f KB/s\n" -" FD Fehler: %d\n" -" FD Beendigungsstatus: %s\n" -" SD Beendigungsstatus: %s\n" -" Beendigungsstatus: %s\n" -"\n" - -#: src/dird/verify.c:569 -#, c-format -msgid "" -"birdSD.\n" -msgstr "" - -#: src/filed/backup.c:176 -msgid "The heartbeat didn't start in time.\n" -msgstr "" - -#: src/filed/backup.c:190 -#, c-format -msgid "Had %ld acl errors while doing backup\n" -msgstr "" - -#: src/filed/backup.c:196 -#, c-format -msgid "Had %ld xattr errors while doing backup\n" -msgstr "" - -#: src/filed/backup.c:323 -#, c-format -msgid " Recursion turned off. Will not descend from %s into %s\n" -msgstr "" - -#: src/filed/backup.c:330 -#, c-format -msgid " %s is a different filesystem. Will not descend from %s into it.\n" -msgstr "" - -#: src/filed/backup.c:336 -#, c-format -msgid " Disallowed filesystem. Will not descend from %s into %s\n" -msgstr "" - -#: src/filed/backup.c:341 -#, c-format -msgid " Disallowed drive type. Will not descend into %s\n" -msgstr "" - -#: src/filed/backup.c:352 -#, c-format -msgid " Socket file skipped: %s\n" -msgstr "" - -#: src/filed/backup.c:365 -#, fuzzy, c-format -msgid " Could not access \"%s\": ERR=%s\n" -msgstr "Konnte counter %s: nicht aktualisieren: ERR=%s\n" - -#: src/filed/backup.c:372 -#, fuzzy, c-format -msgid " Could not follow link \"%s\": ERR=%s\n" -msgstr "Konnte regex pattern \"%s\" nicht kompilieren ERR=%s\n" - -#: src/filed/backup.c:379 -#, fuzzy, c-format -msgid " Could not stat \"%s\": ERR=%s\n" -msgstr "Kann bootstrap Datei nicht öffnen: %s: ERR=%s\n" - -#: src/filed/backup.c:386 src/filed/verify.c:130 -#, c-format -msgid " Unchanged file skipped: %s\n" -msgstr "" - -#: src/filed/backup.c:389 -#, c-format -msgid " Archive file not saved: %s\n" -msgstr "" - -#: src/filed/backup.c:393 -#, fuzzy, c-format -msgid " Could not open directory \"%s\": ERR=%s\n" -msgstr "Konnte regex pattern \"%s\" nicht kompilieren ERR=%s\n" - -#: src/filed/backup.c:402 -#, c-format -msgid " Unknown file type %d; not saved: %s\n" -msgstr "" - -#: src/filed/backup.c:511 -#, fuzzy, c-format -msgid " Cannot open \"%s\": ERR=%s.\n" -msgstr "Kann Ausdruck\"%s\"nicht auflösen: ERR=%s\n" - -#: src/filed/backup.c:690 src/filed/restore.c:1449 -msgid "Windows Encrypted data not supported on this OS.\n" -msgstr "" - -#: src/filed/backup.c:717 -#, c-format -msgid "Read error on file %s. ERR=%s\n" -msgstr "" - -#: src/filed/backup.c:720 -#, fuzzy, c-format -msgid "Too many errors. JobErrors=%d.\n" -msgstr "zu viele items in Job resource\n" - -#: src/filed/backup.c:730 -msgid "Encryption padding error\n" -msgstr "" - -#: src/filed/backup.c:873 src/filed/backup.c:889 -msgid "Encryption error\n" -msgstr "" - -#: src/filed/backup.c:910 -msgid "main thread is stopping because heartbeat thread stopped\n" -msgstr "" - -#: src/filed/backup.c:967 -msgid "Invalid file flags, no supported data stream type.\n" -msgstr "" - -#: src/filed/backup.c:1007 -#, fuzzy, c-format -msgid "Network send error to SD. Data=%s ERR=%s\n" -msgstr "Netzwerkfehler mit FD bei %s: ERR=%s\n" - -#: src/filed/backup.c:1148 -#, c-format -msgid "Compression deflateParams error: %d\n" -msgstr "" - -#: src/filed/backup.c:1201 -#, fuzzy, c-format -msgid " Cannot open resource fork for \"%s\": ERR=%s.\n" -msgstr "Kann Ausdruck\"%s\"nicht auflösen: ERR=%s\n" - -#: src/filed/backup.c:1259 -#, c-format -msgid "Compression deflate error: %d\n" -msgstr "" - -#: src/filed/backup.c:1266 -#, c-format -msgid "Compression deflateReset error: %d\n" -msgstr "" - -#: src/filed/backup.c:1308 -#, c-format -msgid "Compression LZO error: %d\n" -msgstr "" - -#: src/filed/backup.c:1518 -#, c-format -msgid "VSS Writer (BackupComplete): %s\n" -msgstr "" - -#: src/filed/bfdjson.c:68 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bfdjson [-c config_file] [-d debug_level]\n" -" -r get resource type \n" -" -n get resource \n" -" -l get only directives matching dirs (use with -r)\n" -" -D get only data\n" -" -c use as configuration file\n" -" -d set debug level to \n" -" -dt print a timestamp in debug output\n" -" -t test configuration file and exit\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Version: %s (%s)\n" -"\n" -"Usage: bacula-fd [-f -s] [-c config_datei] [-d debug_level]\n" -" -c benutze als Konfigurationsdatei\n" -" -dnn setze debug level auf nn\n" -" -f starte in Vordergrund (für debugging)\n" -" -g groupid\n" -" -s no signals (für debugging)\n" -" -t Konfigurationsdatei testen und beenden\n" -" -u userid\n" -" -v Ausführliche Benutzermeldungen\n" -" -? diese Meldung ausgeben.\n" -"\n" - -#: src/filed/bfdjson.c:463 src/filed/filed.c:328 -#, c-format -msgid "" -"No File daemon resource defined in %s\n" -"Without that I don't know who I am :-(\n" -msgstr "" - -#: src/filed/bfdjson.c:468 src/filed/filed.c:333 -#, c-format -msgid "Only one Client resource permitted in %s\n" -msgstr "" - -#: src/filed/bfdjson.c:492 src/filed/filed.c:388 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"File daemon in %s.\n" -msgstr "" - -#: src/filed/bfdjson.c:504 src/filed/filed.c:423 -#, c-format -msgid "" -"\"PKI Key Pair\" must be defined for File daemon \"%s\" in %s if either " -"\"PKI Sign\" or \"PKI Encrypt\" are enabled.\n" -msgstr "" - -#: src/filed/bfdjson.c:517 src/filed/filed.c:538 -#, c-format -msgid "No Director resource defined in %s\n" -msgstr "" - -#: src/filed/crypto.c:37 -msgid "Encrypting sparse or offset data not supported.\n" -msgstr "" - -#: src/filed/crypto.c:44 -msgid "Failed to initialize encryption context.\n" -msgstr "" - -#: src/filed/crypto.c:117 -#, c-format -msgid "%s signature digest initialization failed\n" -msgstr "" - -#: src/filed/crypto.c:147 -msgid "Unsupported cipher on this system.\n" -msgstr "" - -#: src/filed/crypto.c:153 src/filed/crypto.c:162 -msgid "An error occurred while encrypting the stream.\n" -msgstr "" - -#: src/filed/crypto.c:225 -msgid "Failed to allocate memory for crypto signature.\n" -msgstr "" - -#: src/filed/crypto.c:230 -#, fuzzy -msgid "An error occurred while adding signer the stream.\n" -msgstr "Fehler beim holen von Zeile: %s\n" - -#: src/filed/crypto.c:236 src/filed/crypto.c:251 -msgid "An error occurred while signing the stream.\n" -msgstr "" - -#: src/filed/crypto.c:275 -msgid "An error occurred finalizing signing the stream.\n" -msgstr "" - -#: src/filed/dedupfiled.c:88 -#, c-format -msgid "Quarantine, got ACK for unknown block #%08x\n" -msgstr "" - -#: src/filed/dedupfiled.c:100 -#, c-format -msgid "Quarantine, got request for unknown block #%08x\n" -msgstr "" - -#: src/filed/dedupfiled.c:130 -#, c-format -msgid "Quarantine, got unexpected command %d len=%d \"%s\" \n" -msgstr "" - -#: src/filed/dedupfiled.c:332 -#, c-format -msgid "DEDUP SD didn't found #%08x, use zeroes instead\n" -msgstr "" - -#: src/filed/dedupfiled.c:338 -#, c-format -msgid "DEDUP got a BNET_CMD_UNK_HASH but don't know the hash #%08x.\n" -msgstr "" - -#: src/filed/dedupfiled.c:368 -#, c-format -msgid "DEDUP got a BNET_CMD_STO_BLOCK but don't know the hash #%08x.\n" -msgstr "" - -#: src/filed/fd_plugins.c:546 src/filed/fd_plugins.c:690 -#, c-format -msgid "Command plugin \"%s\": no type in startBackupFile packet.\n" -msgstr "" - -#: src/filed/fd_plugins.c:559 -#, c-format -msgid "Command plugin \"%s\": no object_name in startBackupFile packet.\n" -msgstr "" - -#: src/filed/fd_plugins.c:572 src/filed/fd_plugins.c:697 -#, c-format -msgid "Command plugin \"%s\": no fname in startBackupFile packet.\n" -msgstr "" - -#: src/filed/fd_plugins.c:771 -#, fuzzy -msgid "Plugin save packet not found.\n" -msgstr "Path record: %s nicht gefunden.\n" - -#: src/filed/fd_plugins.c:906 -#, fuzzy, c-format -msgid "Plugin=%s not found.\n" -msgstr "Pool Ressource \"%s\" nicht gefunden.\n" - -#: src/filed/fd_plugins.c:973 -#, c-format -msgid "Plugin createFile call failed. Stat=%d file=%s\n" -msgstr "" - -#: src/filed/fd_plugins.c:978 -#, c-format -msgid "Plugin createFile call failed. Returned CF_ERROR file=%s\n" -msgstr "" - -#: src/filed/fd_plugins.c:1008 src/findlib/create_file.c:220 -#, c-format -msgid "Could not create %s: ERR=%s\n" -msgstr "" - -#: src/filed/fd_plugins.c:1875 -msgid "Command plugin: no fname in baculaCheckChanges packet.\n" -msgstr "" - -#: src/filed/fd_snapshot.c:939 -#, fuzzy, c-format -msgid "Error while creating command string %s.\n" -msgstr "Fehler beim schreiben der bsr Datei.\n" - -#: src/filed/fd_snapshot.c:959 -#, fuzzy, c-format -msgid "Error while executing \"%s\" %s. %s %s\n" -msgstr "Fehler beim schreiben der bsr Datei.\n" - -#: src/filed/fd_snapshot.c:970 -msgid "Unable to parse snapshot command output\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1104 -#, fuzzy, c-format -msgid "Unable to create snapshot record. ERR=%s\n" -msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" - -#: src/filed/fd_snapshot.c:1108 -#, fuzzy, c-format -msgid "Unable to create snapshot record, got %s\n" -msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" - -#: src/filed/fd_snapshot.c:1125 -#, fuzzy, c-format -msgid "Unable to delete snapshot record. ERR=%s\n" -msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" - -#: src/filed/fd_snapshot.c:1129 -#, fuzzy, c-format -msgid "Unable to delete snapshot record, got %s\n" -msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" - -#: src/filed/fd_snapshot.c:1153 -#, fuzzy, c-format -msgid "Unable to get snapshot record. ERR=%s\n" -msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" - -#: src/filed/fd_snapshot.c:1157 -#, fuzzy, c-format -msgid "Unable to get snapshot record, got %s\n" -msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" - -#: src/filed/fd_snapshot.c:1162 -#, fuzzy -msgid "Unable to parse command output\n" -msgstr "Verbindung zu File daemon fehlgeschlagen.\n" - -#: src/filed/fd_snapshot.c:1342 -msgid "Un-Quiescing applications\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1354 -msgid "Quiescing applications\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1391 -#, c-format -msgid " Delete Snapshot for %s\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1394 -#, fuzzy, c-format -msgid " Unable to delete snapshot of %s ERR=%s\n" -msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" - -#: src/filed/fd_snapshot.c:1430 -#, fuzzy, c-format -msgid " Create Snapshot for %s\n" -msgstr "Erzeugung des DB Storage Eintrags %s fehlgeschlagen. ERR=%s\n" - -#: src/filed/fd_snapshot.c:1438 -#, fuzzy, c-format -msgid " Unable to create snapshot of %s ERR=%s\n" -msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" - -#: src/filed/filed.c:52 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bacula-fd [-f -s] [-c config_file] [-d debug_level]\n" -" -c use as configuration file\n" -" -d [,] set debug level to , debug tags to \n" -" -dt print a timestamp in debug output\n" -" -f run in foreground (for debugging)\n" -" -g groupid\n" -" -k keep readall capabilities\n" -" -m print kaboom output (for debugging)\n" -" -s no signals (for debugging)\n" -" -t test configuration file and exit\n" -" -T set trace on\n" -" -u userid\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Version: %s (%s)\n" -"\n" -"Usage: bacula-fd [-f -s] [-c config_datei] [-d debug_level]\n" -" -c benutze als Konfigurationsdatei\n" -" -dnn setze debug level auf nn\n" -" -f starte in Vordergrund (für debugging)\n" -" -g groupid\n" -" -s no signals (für debugging)\n" -" -t Konfigurationsdatei testen und beenden\n" -" -u userid\n" -" -v Ausführliche Benutzermeldungen\n" -" -? diese Meldung ausgeben.\n" -"\n" - -#: src/filed/filed.c:185 -msgid "-k option has no meaning without -u option.\n" -msgstr "" - -#: src/filed/filed.c:361 src/filed/filed.c:560 -#, fuzzy, c-format -msgid "Disable Command \"%s\" not found.\n" -msgstr "FileSet Eintrag \"%s\" nicht gefunden\n" - -#: src/filed/filed.c:412 -msgid "PKI encryption/signing enabled but not compiled into Bacula.\n" -msgstr "" - -#: src/filed/filed.c:435 src/filed/filed.c:466 src/filed/filed.c:516 -msgid "Failed to allocate a new keypair object.\n" -msgstr "" - -#: src/filed/filed.c:439 -#, c-format -msgid "Failed to load public certificate for File daemon \"%s\" in %s.\n" -msgstr "" - -#: src/filed/filed.c:445 -#, c-format -msgid "Failed to load private key for File daemon \"%s\" in %s.\n" -msgstr "" - -#: src/filed/filed.c:475 -#, c-format -msgid "Failed to load private key from file %s for File daemon \"%s\" in %s.\n" -msgstr "" - -#: src/filed/filed.c:482 -#, c-format -msgid "" -"Failed to load trusted signer certificate from file %s for File daemon \"%s" -"\" in %s.\n" -msgstr "" - -#: src/filed/filed.c:522 -#, c-format -msgid "" -"Failed to load master key certificate from file %s for File daemon \"%s\" in " -"%s.\n" -msgstr "" - -#: src/filed/filed_conf.c:200 src/filed/filed_conf.c:224 -#, fuzzy, c-format -msgid "Expected a Cipher Type keyword, got: %s" -msgstr "Job Type Schlüsselwort erwartet, erhalten: %s" - -#: src/filed/hello.c:79 src/stored/hello.c:102 -#, c-format -msgid "Bad Hello command from Director at %s. Len=%d.\n" -msgstr "" - -#: src/filed/hello.c:93 src/stored/hello.c:116 -#, c-format -msgid "Bad Hello command from Director at %s: %s\n" -msgstr "" - -#: src/filed/hello.c:111 -#, fuzzy, c-format -msgid "Connection from unknown Director %s at %s rejected.\n" -msgstr "unbekannt" - -#: src/filed/hello.c:145 -#, fuzzy -msgid "SD connect failed: Bad Hello command\n" -msgstr "Job nicht gefunden: %s\n" - -#: src/filed/hello.c:153 -#, fuzzy, c-format -msgid "SD connect failed: Job name not found: %s\n" -msgstr "Job nicht gefunden: %s\n" - -#: src/filed/hello.c:164 -#, fuzzy, c-format -msgid "SD \"%s\" tried to connect two times.\n" -msgstr "Verbindung zu File daemon fehlgeschlagen.\n" - -#: src/filed/hello.c:269 src/filed/hello.c:271 src/stored/hello.c:500 -#: src/stored/hello.c:502 -#, fuzzy, c-format -msgid "Recv caps from SD failed. ERR=%s\n" -msgstr "pthread_create: ERR=%s\n" - -#: src/filed/hello.c:277 src/stored/hello.c:508 -#, c-format -msgid "Bad caps from SD: %s.\n" -msgstr "" - -#: src/filed/hello.c:278 src/stored/hello.c:509 -#, c-format -msgid "Bad caps from SD: %s\n" -msgstr "" - -#: src/filed/job.c:322 -#, c-format -msgid "Command: \"%s\" is disabled.\n" -msgstr "" - -#: src/filed/job.c:491 -#, c-format -msgid "Bad command from %s. Len=%d.\n" -msgstr "" - -#: src/filed/job.c:552 -msgid "2902 Error scanning cancel command.\n" -msgstr "" - -#: src/filed/job.c:556 src/filed/job.c:595 -#, c-format -msgid "2901 Job %s not found.\n" -msgstr "" - -#: src/filed/job.c:566 -#, fuzzy, c-format -msgid "2001 Job \"%s\" marked to be %s.\n" -msgstr "JobId %s, Job %s zum Abbruch markiert.\n" - -#: src/filed/job.c:589 -#, c-format -msgid "2991 Bad setbandwidth command: %s\n" -msgstr "" - -#: src/filed/job.c:645 -#, c-format -msgid "2991 Bad setdebug command: %s\n" -msgstr "" - -#: src/filed/job.c:695 -#, c-format -msgid "Bad estimate command: %s" -msgstr "" - -#: src/filed/job.c:696 -msgid "2992 Bad estimate command.\n" -msgstr "" - -#: src/filed/job.c:719 -#, c-format -msgid "Bad Job Command: %s" -msgstr "" - -#: src/filed/job.c:759 -#, c-format -msgid "Bad RunBeforeJob command: %s\n" -msgstr "" - -#: src/filed/job.c:760 src/filed/job.c:779 -msgid "2905 Bad RunBeforeJob command.\n" -msgstr "" - -#: src/filed/job.c:790 -msgid "2905 Bad RunBeforeNow command.\n" -msgstr "" - -#: src/filed/job.c:809 -#, c-format -msgid "Bad RunAfter command: %s\n" -msgstr "" - -#: src/filed/job.c:810 -msgid "2905 Bad RunAfterJob command.\n" -msgstr "" - -#: src/filed/job.c:846 -#, c-format -msgid "Bad RunScript command: %s\n" -msgstr "" - -#: src/filed/job.c:847 -msgid "2905 Bad RunScript command.\n" -msgstr "" - -#: src/filed/job.c:902 -#, fuzzy, c-format -msgid "Bad RestoreObject command: %s\n" -msgstr "Storage daemon hat \"Job command\": %s abgelehnt\n" - -#: src/filed/job.c:967 -msgid "2909 Bad RestoreObject command.\n" -msgstr "" - -#: src/filed/job.c:1064 -#, c-format -msgid "Plugin Directory not defined. Cannot use plugin: \"%s\"\n" -msgstr "" - -#: src/filed/job.c:1106 -#, c-format -msgid "Error running program: %s. stat=%d: ERR=%s\n" -msgstr "" - -#: src/filed/job.c:1117 -#, c-format -msgid "Cannot open FileSet input file: %s. ERR=%s\n" -msgstr "" - -#: src/filed/job.c:1271 -#, c-format -msgid "REGEX %s compile error. ERR=%s\n" -msgstr "" - -#: src/filed/job.c:1422 -#, c-format -msgid "Invalid FileSet command: %s\n" -msgstr "" - -#: src/filed/job.c:1708 src/findlib/match.c:205 src/tools/testfind.c:640 -#, c-format -msgid "Unknown include/exclude option: %c\n" -msgstr "" - -#: src/filed/job.c:1862 -#, c-format -msgid "" -"DIR and FD clocks differ by %lld seconds, FD automatically compensating.\n" -msgstr "" - -#: src/filed/job.c:1871 -#, c-format -msgid "Unknown backup level: %s\n" -msgstr "" - -#: src/filed/job.c:1884 -#, c-format -msgid "Bad level command: %s\n" -msgstr "" - -#: src/filed/job.c:1906 -#, c-format -msgid "Bad session command: %s" -msgstr "" - -#: src/filed/job.c:1965 src/stored/dircmd.c:348 -#, c-format -msgid "Bad storage command: %s" -msgstr "" - -#: src/filed/job.c:1993 src/stored/dircmd.c:370 -#, c-format -msgid "Failed to connect to Storage daemon: %s:%d\n" -msgstr "" - -#: src/filed/job.c:2034 -#, fuzzy -msgid "Failed connect from Storage daemon. SD bsock=NULL.\n" -msgstr "Verbindung zu Storage daemon fehlgeschlagen.\n" - -#: src/filed/job.c:2282 -msgid "ACL support not configured for your machine.\n" -msgstr "" - -#: src/filed/job.c:2286 -msgid "XATTR support not configured for your machine.\n" -msgstr "" - -#: src/filed/job.c:2295 -msgid "Cannot contact Storage daemon\n" -msgstr "" - -#: src/filed/job.c:2314 -#, c-format -msgid "Bad response to append open: %s\n" -msgstr "" - -#: src/filed/job.c:2319 -msgid "Bad response from stored to open command\n" -msgstr "" - -#: src/filed/job.c:2350 -#, fuzzy, c-format -msgid "Generate VSS snapshots. Driver=\"%s\"\n" -msgstr "Erzeugung des DB Storage Eintrags %s fehlgeschlagen. ERR=%s\n" - -#: src/filed/job.c:2355 -#, fuzzy, c-format -msgid "VSS CreateSnapshots failed. ERR=%s\n" -msgstr "Erzeugung des DB Storage Eintrags %s fehlgeschlagen. ERR=%s\n" - -#: src/filed/job.c:2361 -#, c-format -msgid "VSS Writer (PrepareForBackup): %s\n" -msgstr "" - -#: src/filed/job.c:2366 -msgid "No drive letters found for generating VSS snapshots.\n" -msgstr "" - -#: src/filed/job.c:2370 -#, fuzzy, c-format -msgid "VSS was not initialized properly. ERR=%s\n" -msgstr "Kann DB lock nicht initialisieren. ERR=%s\n" - -#: src/filed/job.c:2428 -msgid "Append Close with SD failed.\n" -msgstr "" - -#: src/filed/job.c:2433 -#, fuzzy, c-format -msgid "Bad status %d %c returned from Storage Daemon.\n" -msgstr "FD hat keinen Jobstatus zurückgegeben.\n" - -#: src/filed/job.c:2463 -#, c-format -msgid "2994 Bad verify command: %s\n" -msgstr "" - -#: src/filed/job.c:2478 src/filed/job.c:2519 -#, c-format -msgid "2994 Bad verify level: %s\n" -msgstr "" - -#: src/filed/job.c:2624 -#, c-format -msgid "Bad replace command. CMD=%s\n" -msgstr "" - -#: src/filed/job.c:2650 -#, c-format -msgid "Bad where regexp. where=%s\n" -msgstr "" - -#: src/filed/job.c:2686 -#, c-format -msgid "VSS was not initialized properly. VSS support is disabled. ERR=%s\n" -msgstr "" - -#: src/filed/job.c:2731 -#, c-format -msgid "VSS Writer (RestoreComplete): %s\n" -msgstr "" - -#: src/filed/job.c:2786 -msgid "Improper calling sequence.\n" -msgstr "" - -#: src/filed/job.c:2806 -#, c-format -msgid "Bad response to SD read open: %s\n" -msgstr "" - -#: src/filed/job.c:2811 -msgid "Bad response from stored to read open command\n" -msgstr "" - -#: src/filed/job.c:2900 -#, fuzzy, c-format -msgid "Bad response from SD to %s command. Wanted %s, got len=%ld msg=\"%s\"\n" -msgstr "Schlechte Antwort auf %s Kommando: erwartet %s, erhalten %s\n" - -#: src/filed/restore.c:99 -#, c-format -msgid "Size of data or stream of %s not correct. Original %s, restored %s.\n" -msgstr "" - -#: src/filed/restore.c:119 -#, c-format -msgid "Invalid length of Finder Info (got %d, not 32)\n" -msgstr "" - -#: src/filed/restore.c:124 -#, fuzzy, c-format -msgid "Could not set Finder Info on %s\n" -msgstr "Konnte Datenbank \"%s\" nicht öffen.\n" - -#: src/filed/restore.c:312 src/filed/restore.c:995 src/stored/bextract.c:696 -#, c-format -msgid "Unknown stream=%d ignored. This shouldn't happen!\n" -msgstr "" - -#: src/filed/restore.c:410 -#, fuzzy -msgid "LZO init failed\n" -msgstr "TLS Aushandlung gescheitert.\n" - -#: src/filed/restore.c:472 src/filed/verify_vol.c:95 -#, c-format -msgid "Record header scan error: %s\n" -msgstr "" - -#: src/filed/restore.c:482 src/filed/verify_vol.c:105 -#, c-format -msgid "Data record error. ERR=%s\n" -msgstr "" - -#: src/filed/restore.c:486 src/filed/verify_vol.c:109 -#, c-format -msgid "Actual data size %d not same as header %d\n" -msgstr "" - -#: src/filed/restore.c:548 src/stored/bextract.c:436 -#, c-format -msgid "%s stream not supported on this Client.\n" -msgstr "" - -#: src/filed/restore.c:629 -msgid "Unexpected cryptographic session data stream.\n" -msgstr "" - -#: src/filed/restore.c:637 -msgid "" -"No private decryption keys have been defined to decrypt encrypted backup " -"data.\n" -msgstr "" - -#: src/filed/restore.c:648 -#, fuzzy -msgid "Could not create digest.\n" -msgstr "Konnte Client Eintrag nicht anlegen. ERR=%s\n" - -#: src/filed/restore.c:662 -msgid "Missing private key required to decrypt encrypted backup data.\n" -msgstr "" - -#: src/filed/restore.c:665 -msgid "Decrypt of the session key failed.\n" -msgstr "" - -#: src/filed/restore.c:668 -#, fuzzy -msgid "Signer not found. Decryption failed.\n" -msgstr "FileSet MD5 Prüfsumme nicht gefunden.\n" - -#: src/filed/restore.c:671 -msgid "Unsupported digest algorithm. Decrypt failed.\n" -msgstr "" - -#: src/filed/restore.c:674 -msgid "Unsupported encryption algorithm. Decrypt failed.\n" -msgstr "" - -#: src/filed/restore.c:678 -#, fuzzy, c-format -msgid "" -"An error=%d occurred while decoding encrypted session data stream: ERR=%s\n" -msgstr "Fehler beim holen von Zeile: %s\n" - -#: src/filed/restore.c:747 src/filed/restore.c:795 -#, c-format -msgid "Missing encryption session data stream for %s\n" -msgstr "" - -#: src/filed/restore.c:755 src/filed/restore.c:802 -#, c-format -msgid "Failed to initialize decryption context for %s\n" -msgstr "" - -#: src/filed/restore.c:814 -#, fuzzy, c-format -msgid "Cannot open resource fork for %s.\n" -msgstr "Kann Ausdruck\"%s\"nicht auflösen: ERR=%s\n" - -#: src/filed/restore.c:956 -msgid "Unexpected cryptographic signature data stream.\n" -msgstr "" - -#: src/filed/restore.c:962 -#, c-format -msgid "Failed to decode message signature for %s\n" -msgstr "" - -#: src/filed/restore.c:1033 -#, c-format -msgid "Encountered %ld acl errors while doing restore\n" -msgstr "" - -#: src/filed/restore.c:1037 -#, c-format -msgid "Encountered %ld xattr errors while doing restore\n" -msgstr "" - -#: src/filed/restore.c:1041 -#, c-format -msgid "" -"%d non-supported data streams and %d non-supported attrib streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1045 -#, c-format -msgid "%d non-supported resource fork streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1048 -#, c-format -msgid "%d non-supported Finder Info streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1051 -#, c-format -msgid "%d non-supported acl streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1054 -#, c-format -msgid "%d non-supported crypto streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1057 -#, c-format -msgid "%d non-supported xattr streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1136 src/lib/util.c:488 -msgid "None" -msgstr "" - -#: src/filed/restore.c:1140 -msgid "Zlib errno" -msgstr "" - -#: src/filed/restore.c:1142 -msgid "Zlib stream error" -msgstr "" - -#: src/filed/restore.c:1144 -msgid "Zlib data error" -msgstr "" - -#: src/filed/restore.c:1146 -msgid "Zlib memory error" -msgstr "" - -#: src/filed/restore.c:1148 -msgid "Zlib buffer error" -msgstr "" - -#: src/filed/restore.c:1150 -msgid "Zlib version error" -msgstr "" - -#: src/filed/restore.c:1152 src/lib/util.c:832 src/lib/util.c:842 -#: src/lib/util.c:853 src/lib/util.c:860 src/lib/util.c:867 src/lib/util.c:881 -#: src/lib/util.c:891 src/lib/util.c:904 src/lib/util.c:915 -msgid "*none*" -msgstr "" - -#: src/filed/restore.c:1189 -#, c-format -msgid "Missing cryptographic signature for %s\n" -msgstr "" - -#: src/filed/restore.c:1219 src/filed/restore.c:1243 -#, fuzzy, c-format -msgid "Signature validation failed for file %s: ERR=%s\n" -msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" - -#: src/filed/restore.c:1233 -#, fuzzy, c-format -msgid "Digest one file failed for file: %s\n" -msgstr "Mehr als ein Dateiname! %s für Datei: %s\n" - -#: src/filed/restore.c:1264 -#, c-format -msgid "Signature validation failed for %s: %s\n" -msgstr "" - -#: src/filed/restore.c:1290 src/stored/bextract.c:531 -#: src/stored/bextract.c:596 -#, c-format -msgid "Seek to %s error on %s: ERR=%s\n" -msgstr "" - -#: src/filed/restore.c:1331 -#, c-format -msgid "Compressed header version error. Got=0x%x want=0x%x\n" -msgstr "" - -#: src/filed/restore.c:1336 src/stored/bextract.c:625 -#, c-format -msgid "Compressed header size error. comp_len=%d, msglen=%d\n" -msgstr "" - -#: src/filed/restore.c:1359 -#, fuzzy, c-format -msgid "LZO uncompression error on file %s. ERR=%d\n" -msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" - -#: src/filed/restore.c:1369 src/stored/bextract.c:660 -#, c-format -msgid "Compression algorithm 0x%x found, but not supported!\n" -msgstr "" - -#: src/filed/restore.c:1394 -#, c-format -msgid "Uncompression error on file %s. ERR=%s\n" -msgstr "" - -#: src/filed/restore.c:1403 src/stored/bextract.c:564 -msgid "GZIP data stream found, but GZIP not configured!\n" -msgstr "" - -#: src/filed/restore.c:1431 -#, c-format -msgid "Write error in Win32 Block Decomposition on %s: %s\n" -msgstr "" - -#: src/filed/restore.c:1439 src/filed/restore.c:1454 -#, fuzzy, c-format -msgid "Write write error on %s: ERR=%s\n" -msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" - -#: src/filed/restore.c:1482 -#, c-format -msgid "Wrong write size error at %lld block=%d wanted=%d wrote=%d\n" -msgstr "" - -#: src/filed/restore.c:1486 -#, c-format -msgid "" -"Write write error at %lld block=%d write_len=%d lerror=%d on %s: ERR=%s\n" -msgstr "" - -#: src/filed/restore.c:1543 -msgid "Decryption error\n" -msgstr "" - -#: src/filed/restore.c:1627 -msgid "Logic error: output file should be open\n" -msgstr "" - -#: src/filed/restore.c:1663 -msgid "Logic error: output file should not be open\n" -msgstr "" - -#: src/filed/restore.c:1694 -#, c-format -msgid "Decryption error. buf_len=%d decrypt_len=%d on file %s\n" -msgstr "" - -#: src/filed/status.c:115 -#, fuzzy, c-format -msgid "%s %sVersion: %s (%s) %s %s %s %s\n" -msgstr "1000 OK: %s Version: %s (%s)\n" - -#: src/filed/status.c:120 -#, c-format -msgid "Daemon started %s. Jobs: run=%d running=%d.\n" -msgstr "" - -#: src/filed/status.c:182 -#, c-format -msgid "" -" Sizes: boffset_t=%d size_t=%d debug=%s trace=%d mode=%d,%d bwlimit=%skB/s\n" -msgstr "" - -#: src/filed/status.c:239 -#, fuzzy, c-format -msgid "Director connected %sat: %s\n" -msgstr "Verbindung zu File daemon fehlgeschlagen.\n" - -#: src/filed/status.c:243 -#, c-format -msgid "JobId %d Job %s is running.\n" -msgstr "" - -#: src/filed/status.c:246 -#, fuzzy, c-format -msgid " %s%s %s Job started: %s\n" -msgstr "Clone JobId %d gestartet.\n" - -#: src/filed/status.c:274 -#, fuzzy, c-format -msgid "" -" Files=%s Bytes=%s AveBytes/sec=%s LastBytes/sec=%s Errors=%d\n" -" Bwlimit=%s ReadBytes=%s\n" -msgstr " MigTime=%s MigHiBytes=%s MigLoBytes=%s\n" - -#: src/filed/status.c:285 -#, c-format -msgid " Files: Restored=%s Expected=%s Completed=%d%%\n" -msgstr "" - -#: src/filed/status.c:290 -#, fuzzy, c-format -msgid " Files: Examined=%s Backed up=%s\n" -msgstr "FileSet: name=%s\n" - -#: src/filed/status.c:303 -#, c-format -msgid " Processing file: %s\n" -msgstr "" - -#: src/filed/status.c:315 -msgid " SDSocket closed.\n" -msgstr "" - -#: src/filed/status.c:325 -msgid "====\n" -msgstr "" - -#: src/filed/status.c:458 src/filed/status.c:492 -#, c-format -msgid "Bad .status command: %s\n" -msgstr "" - -#: src/filed/status.c:459 -msgid "2900 Bad .status command, missing argument.\n" -msgstr "" - -#: src/filed/status.c:493 -msgid "2900 Bad .status command, wrong argument.\n" -msgstr "" - -#: src/filed/verify.c:40 -#, c-format -msgid "Cannot malloc %d network read buffer\n" -msgstr "" - -#: src/filed/verify.c:110 -#, c-format -msgid " Could not access %s: ERR=%s\n" -msgstr "" - -#: src/filed/verify.c:117 -#, c-format -msgid " Could not follow link %s: ERR=%s\n" -msgstr "" - -#: src/filed/verify.c:124 -#, c-format -msgid " Could not stat %s: ERR=%s\n" -msgstr "" - -#: src/filed/verify.c:133 -#, c-format -msgid " Archive file skipped: %s\n" -msgstr "" - -#: src/filed/verify.c:136 -#, c-format -msgid " Recursion turned off. Directory skipped: %s\n" -msgstr "" - -#: src/filed/verify.c:140 -#, c-format -msgid " File system change prohibited. Directory skipped: %s\n" -msgstr "" - -#: src/filed/verify.c:148 -#, c-format -msgid " Could not open directory %s: ERR=%s\n" -msgstr "" - -#: src/filed/verify.c:153 -#, c-format -msgid " Unknown file type %d: %s\n" -msgstr "" - -#: src/filed/verify.c:197 src/filed/verify_vol.c:205 -#, c-format -msgid "Network error in send to Director: ERR=%s\n" -msgstr "" - -#: src/filed/verify.c:291 -#, c-format -msgid " Cannot open %s: ERR=%s.\n" -msgstr "" - -#: src/filed/verify.c:305 -#, c-format -msgid " Cannot open resource fork for %s: ERR=%s.\n" -msgstr "" - -#: src/filed/verify.c:367 -#, c-format -msgid "Error reading file %s: ERR=%s\n" -msgstr "" - -#: src/filed/verify_vol.c:52 -msgid "Storage command not issued before Verify.\n" -msgstr "" - -#: src/filed/verify_vol.c:142 -#, c-format -msgid "Error scanning record header: %s\n" -msgstr "" - -#: src/filed/win_efs.c:106 -#, c-format -msgid "Restore data %ld bytes too long for Microsoft buffer %ld bytes.\n" -msgstr "" - -#: src/filed/win_efs.c:192 -#, c-format -msgid "Restore data %ld bytes too long for Microsoft buffer %lld bytes.\n" -msgstr "" - -#: src/filed/win_efs.c:227 -#, fuzzy, c-format -msgid "WriteEncryptedFileRaw failure: ERR=%s\n" -msgstr "Media id select fehlgeschlagen: ERR=%s\n" - -#: src/filed/xattr.c:235 -#, c-format -msgid "Illegal xattr stream, no XATTR_MAGIC on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:249 -#, c-format -msgid "Illegal xattr stream, xattr name length <= 0 on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:371 src/filed/xattr.c:407 -#, fuzzy, c-format -msgid "llistea error on file \"%s\": ERR=%s\n" -msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" - -#: src/filed/xattr.c:457 src/filed/xattr.c:511 -#, fuzzy, c-format -msgid "lgetea error on file \"%s\": ERR=%s\n" -msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" - -#: src/filed/xattr.c:547 src/filed/xattr.c:869 src/filed/xattr.c:1344 -#: src/filed/xattr.c:1812 src/filed/xattr.c:2169 src/filed/xattr.c:2961 -#, c-format -msgid "Xattr stream on file \"%s\" exceeds maximum size of %d bytes\n" -msgstr "" - -#: src/filed/xattr.c:567 src/filed/xattr.c:895 src/filed/xattr.c:1364 -#: src/filed/xattr.c:1842 src/filed/xattr.c:2186 -#, c-format -msgid "Failed to serialize extended attributes on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:634 -#, fuzzy, c-format -msgid "lsetea error on file \"%s\": ERR=%s\n" -msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" - -#: src/filed/xattr.c:722 src/filed/xattr.c:760 src/filed/xattr.c:824 -#: src/filed/xattr.c:836 -#, fuzzy, c-format -msgid "attr_list error on file \"%s\": ERR=%s\n" -msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" - -#: src/filed/xattr.c:960 -#, fuzzy, c-format -msgid "Received illegal xattr named %s on file \"%s\"\n" -msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" - -#: src/filed/xattr.c:993 src/filed/xattr.c:1003 -#, fuzzy, c-format -msgid "attr_set error on file \"%s\": ERR=%s\n" -msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" - -#: src/filed/xattr.c:1153 src/filed/xattr.c:1188 -#, fuzzy, c-format -msgid "llistxattr error on file \"%s\": ERR=%s\n" -msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" - -#: src/filed/xattr.c:1256 src/filed/xattr.c:1308 -#, fuzzy, c-format -msgid "lgetxattr error on file \"%s\": ERR=%s\n" -msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" - -#: src/filed/xattr.c:1427 -#, fuzzy, c-format -msgid "lsetxattr error on file \"%s\": ERR=%s\n" -msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" - -#: src/filed/xattr.c:1585 src/filed/xattr.c:1620 -#, fuzzy, c-format -msgid "extattr_list_link error on file \"%s\": ERR=%s\n" -msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" - -#: src/filed/xattr.c:1640 -#, fuzzy, c-format -msgid "Failed to convert %d into namespace on file \"%s\"\n" -msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" - -#: src/filed/xattr.c:1720 src/filed/xattr.c:1775 -#, fuzzy, c-format -msgid "extattr_get_link error on file \"%s\": ERR=%s\n" -msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" - -#: src/filed/xattr.c:1899 -#, fuzzy, c-format -msgid "Failed to split %s into namespace and name part on file \"%s\"\n" -msgstr " %s: ERR=%s\n" -msgstr "" - -#: src/findlib/create_file.c:322 src/findlib/create_file.c:335 -#, c-format -msgid "Could not restore file flags for file %s: ERR=%s\n" -msgstr "" - -#: src/findlib/create_file.c:326 src/findlib/create_file.c:343 -#, c-format -msgid "Could not hard link %s -> %s: ERR=%s\n" -msgstr "" - -#: src/findlib/create_file.c:339 -#, c-format -msgid "Could not reset file flags for file %s: ERR=%s\n" -msgstr "" - -#: src/findlib/create_file.c:395 -#, c-format -msgid "Original file %s have been deleted: type=%d\n" -msgstr "" - -#: src/findlib/create_file.c:407 -#, c-format -msgid "Original file %s not saved: type=%d\n" -msgstr "" - -#: src/findlib/create_file.c:410 -#, c-format -msgid "Unknown file type %d; not restored: %s\n" -msgstr "" - -#: src/findlib/create_file.c:455 -#, c-format -msgid "Zero length filename: %s\n" -msgstr "" - -#: src/findlib/enable_priv.c:81 -msgid "AdjustTokenPrivileges set " -msgstr "" - -#: src/findlib/find.c:185 -#, fuzzy, c-format -msgid "Plugin: \"%s\" not found.\n" -msgstr "Pool Ressource \"%s\" nicht gefunden.\n" - -#: src/findlib/find_one.c:223 -#, c-format -msgid " NODUMP flag set - will not process %s\n" -msgstr "" - -#: src/findlib/find_one.c:244 -#, fuzzy, c-format -msgid "Cannot stat file %s: ERR=%s\n" -msgstr "Kann bootstrap Datei nicht öffnen: %s: ERR=%s\n" - -#: src/findlib/find_one.c:249 -#, c-format -msgid "%s mtime changed during backup.\n" -msgstr "" - -#: src/findlib/find_one.c:256 -#, c-format -msgid "%s ctime changed during backup.\n" -msgstr "" - -#: src/findlib/find_one.c:263 -#, c-format -msgid "%s size of %lld changed during backup to %lld.n" -msgstr "" - -#: src/findlib/find_one.c:391 -#, c-format -msgid "Top level directory \"%s\" has unlisted fstype \"%s\"\n" -msgstr "" - -#: src/findlib/find_one.c:406 -#, c-format -msgid "Top level directory \"%s\" has an unlisted drive type \"%s\"\n" -msgstr "" - -#: src/findlib/mkpath.c:137 src/stored/dedupengine.c:250 -#, c-format -msgid "Cannot create directory %s: ERR=%s\n" -msgstr "" - -#: src/findlib/mkpath.c:141 src/findlib/mkpath.c:217 -#: src/stored/dedupengine.c:254 -#, c-format -msgid "%s exists but is not a directory.\n" -msgstr "" - -#: src/findlib/mkpath.c:153 -#, c-format -msgid "Security problem!! We created directory %s, but it is a link.\n" -msgstr "" - -#: src/findlib/mkpath.c:179 -#, c-format -msgid "Cannot change owner and/or group of %s: ERR=%s\n" -msgstr "" - -#: src/findlib/mkpath.c:184 -#, c-format -msgid "Cannot change permissions of %s: ERR=%s\n" -msgstr "" - -#: src/findlib/mkpath.c:254 -#, c-format -msgid "%c: is not a valid drive.\n" -msgstr "" - -#: src/findlib/mkpath.c:298 -msgid "Too many subdirectories. Some permissions not reset.\n" -msgstr "" - -#: src/findlib/savecwd.c:49 -#, fuzzy, c-format -msgid "Cannot open current directory: ERR=%s\n" -msgstr "Kann inkludierte Datei nicht öffnen: %s. ERR=%s\n" - -#: src/findlib/savecwd.c:60 -#, fuzzy, c-format -msgid "Cannot get current directory: ERR=%s\n" -msgstr "kann Variable operate nicht setzen: ERR=%s\n" - -#: src/findlib/savecwd.c:84 src/findlib/savecwd.c:95 -#, fuzzy, c-format -msgid "Cannot reset current directory: ERR=%s\n" -msgstr "kann Variable operate nicht setzen: ERR=%s\n" - -#: src/lib/address_conf.c:51 -#, c-format -msgid "Only ipv4 and ipv6 are supported (%d)\n" -msgstr "" - -#: src/lib/address_conf.c:55 -#, c-format -msgid "Only ipv4 is supported (%d)\n" -msgstr "" - -#: src/lib/address_conf.c:178 -#, c-format -msgid "You tried to assign a ipv6 address to an ipv4(%d)\n" -msgstr "" - -#: src/lib/address_conf.c:187 -#, c-format -msgid "You tried to assign an ipv4 address to an ipv6(%d)\n" -msgstr "" - -#: src/lib/address_conf.c:270 -#, c-format -msgid "Can't add default IPv4 address (%s)\n" -msgstr "" - -#: src/lib/address_conf.c:301 -msgid "" -"Old style addresses cannot be mixed with new style. Try removing Port=nnn." -msgstr "" - -#: src/lib/address_conf.c:323 -#, fuzzy, c-format -msgid "Cannot resolve service(%s)" -msgstr "Kann Console resource %s nicht finden\n" - -#: src/lib/address_conf.c:333 -#, c-format -msgid "Cannot resolve hostname(%s) %s" -msgstr "" - -#: src/lib/address_conf.c:441 src/lib/address_conf.c:474 -#, fuzzy, c-format -msgid "Expected a block to begin with { but got: %s" -msgstr "wild-card Ausdruck erwartet, erhalten: %s\n" - -#: src/lib/address_conf.c:446 -msgid "Empty addr block is not allowed" -msgstr "" - -#: src/lib/address_conf.c:450 -#, fuzzy, c-format -msgid "Expected a string but got: %s" -msgstr "regulären Ausdruck erwartet, erhalten: %s\n" - -#: src/lib/address_conf.c:461 -#, fuzzy, c-format -msgid "Expected a string [ip|ipv4|ipv6] but got: %s" -msgstr "regulären Ausdruck erwartet, erhalten: %s\n" - -#: src/lib/address_conf.c:465 -#, fuzzy, c-format -msgid "Expected a string [ip|ipv4] but got: %s" -msgstr "regulären Ausdruck erwartet, erhalten: %s\n" - -#: src/lib/address_conf.c:470 -#, fuzzy, c-format -msgid "Expected an equal = but got: %s" -msgstr "Erwartete ein \"ist gleich\", erhalten: %s" - -#: src/lib/address_conf.c:481 -#, fuzzy, c-format -msgid "Expected an identifier [addr|port] but got: %s" -msgstr "Dateiname erwartet, erhalten: %s" - -#: src/lib/address_conf.c:486 -msgid "Only one port per address block" -msgstr "" - -#: src/lib/address_conf.c:492 -msgid "Only one addr per address block" -msgstr "" - -#: src/lib/address_conf.c:496 -#, fuzzy, c-format -msgid "Expected a identifier [addr|port] but got: %s" -msgstr "Dateiname erwartet, erhalten: %s" - -#: src/lib/address_conf.c:500 -#, c-format -msgid "Expected a equal =, got: %s" -msgstr "" - -#: src/lib/address_conf.c:508 -#, fuzzy, c-format -msgid "Expected a number or a string but got: %s" -msgstr "regulären Ausdruck erwartet, erhalten: %s\n" - -#: src/lib/address_conf.c:514 -#, fuzzy, c-format -msgid "Expected an IP number or a hostname but got: %s" -msgstr "Dateiname erwartet, erhalten: %s" - -#: src/lib/address_conf.c:520 -msgid "State machine missmatch" -msgstr "" - -#: src/lib/address_conf.c:526 -#, fuzzy, c-format -msgid "Expected a end of block with } but got: %s" -msgstr "Erwartet: %s, erhalten: %s" - -#: src/lib/address_conf.c:532 -#, c-format -msgid "Cannot add hostname(%s) and port(%s) to addrlist (%s)" -msgstr "" - -#: src/lib/address_conf.c:538 -#, fuzzy, c-format -msgid "Expected an end of block with } but got: %s" -msgstr "Erwartet: %s, erhalten: %s" - -#: src/lib/address_conf.c:547 -#, c-format -msgid "Expected an IP number or a hostname, got: %s" -msgstr "" - -#: src/lib/address_conf.c:552 src/lib/address_conf.c:566 -#, c-format -msgid "Cannot add port (%s) to (%s)" -msgstr "" - -#: src/lib/address_conf.c:561 -#, c-format -msgid "Expected a port number or string, got: %s" -msgstr "" - -#: src/lib/attr.c:70 -#, c-format -msgid "Error scanning attributes: %s\n" -msgstr "" - -#: src/lib/berrno.c:52 -msgid "Child exited normally." -msgstr "" - -#: src/lib/berrno.c:59 -msgid "Unknown error during program execvp" -msgstr "" - -#: src/lib/berrno.c:62 -#, c-format -msgid "Child exited with code %d" -msgstr "" - -#: src/lib/berrno.c:70 -#, c-format -msgid "Child died from signal %d: %s" -msgstr "" - -#: src/lib/berrno.c:76 -msgid "Invalid errno. No error message possible." -msgstr "" - -#: src/lib/bget_msg.c:90 -msgid "Status OK\n" -msgstr "" - -#: src/lib/bget_msg.c:94 -#, fuzzy, c-format -msgid "bget_msg: unknown signal %d\n" -msgstr "unbekannt" - -#: src/lib/bnet.c:130 -#, fuzzy, c-format -msgid "Attr spool write error. wrote=%d wanted=%d bytes. ERR=%s\n" -msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" - -#: src/lib/bnet.c:215 src/lib/bnet.c:256 -msgid "TLS connection initialization failed.\n" -msgstr "" - -#: src/lib/bnet.c:223 -msgid "TLS Negotiation failed.\n" -msgstr "" - -#: src/lib/bnet.c:229 src/lib/bnet.c:271 -msgid "" -"TLS certificate verification failed. Peer certificate did not match a " -"required commonName\n" -msgstr "" - -#: src/lib/bnet.c:280 -#, c-format -msgid "" -"TLS host certificate verification failed. Host name \"%s\" did not match " -"presented certificate\n" -msgstr "" - -#: src/lib/bnet.c:297 -msgid "TLS enabled but not configured.\n" -msgstr "" - -#: src/lib/bnet.c:303 -msgid "TLS enable but not configured.\n" -msgstr "" - -#: src/lib/bnet.c:400 -msgid "No problem." -msgstr "" - -#: src/lib/bnet.c:403 -msgid "Authoritative answer for host not found." -msgstr "" - -#: src/lib/bnet.c:406 -msgid "Non-authoritative for host not found, or ServerFail." -msgstr "" - -#: src/lib/bnet.c:409 -msgid "Non-recoverable errors, FORMERR, REFUSED, or NOTIMP." -msgstr "" - -#: src/lib/bnet.c:412 -msgid "Valid name, no data record of resquested type." -msgstr "" - -#: src/lib/bnet.c:415 -msgid "Unknown error." -msgstr "" - -#: src/lib/bnet.c:557 -#, c-format -msgid "Unknown sig %d" -msgstr "" - -#: src/lib/bnet_server.c:99 -#, c-format -msgid "Cannot open stream socket. ERR=%s. Current %s All %s\n" -msgstr "" - -#: src/lib/bnet_server.c:112 -#, c-format -msgid "Cannot set SO_REUSEADDR on socket: %s\n" -msgstr "" - -#: src/lib/bnet_server.c:121 -#, c-format -msgid "Cannot bind port %d: ERR=%s: Retrying ...\n" -msgstr "" - -#: src/lib/bnet_server.c:129 src/lib/bnet_server.c:137 -#, c-format -msgid "Cannot bind port %d: ERR=%s.\n" -msgstr "" - -#: src/lib/bnet_server.c:144 -#, fuzzy -msgid "No addr/port found to listen on.\n" -msgstr "Keine JobIds zum migrieren gefunden.\n" - -#: src/lib/bnet_server.c:150 -#, c-format -msgid "Could not init client queue: ERR=%s\n" -msgstr "" - -#: src/lib/bnet_server.c:169 -#, c-format -msgid "Error in select: %s\n" -msgstr "" - -#: src/lib/bnet_server.c:192 -#, c-format -msgid "Connection from %s:%d refused by hosts.access\n" -msgstr "" - -#: src/lib/bnet_server.c:208 src/lib/bsock.c:363 src/lib/bsock.c:402 -#, c-format -msgid "Cannot set SO_KEEPALIVE on socket: %s\n" -msgstr "" - -#: src/lib/bnet_server.c:220 -msgid "Could not create client BSOCK.\n" -msgstr "" - -#: src/lib/bnet_server.c:227 -#, c-format -msgid "Could not add job to client queue: ERR=%s\n" -msgstr "" - -#: src/lib/bnet_server.c:244 -#, c-format -msgid "Could not destroy client queue: ERR=%s\n" -msgstr "" - -#: src/lib/bpipe.c:373 src/lib/bpipe.c:456 -msgid "Program killed by Bacula (timeout)\n" -msgstr "" - -#: src/lib/bsock.c:221 -#, fuzzy, c-format -msgid "" -"Could not connect to %s on %s:%d. ERR=%s\n" -"Retrying ...\n" -msgstr "Konnte FileSet \"%s\" Eintrag nicht erzeugen. ERR=%s\n" - -#: src/lib/bsock.c:227 -#, fuzzy, c-format -msgid "Unable to connect to %s on %s:%d. ERR=%s\n" -msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" - -#: src/lib/bsock.c:303 -#, fuzzy, c-format -msgid "gethostbyname() for host \"%s\" failed: ERR=%s\n" -msgstr "Erzeugung des db Filename Eintrags %s fehlgeschlagen. ERR=%s\n" - -#: src/lib/bsock.c:334 src/lib/bsock.c:336 -#, fuzzy, c-format -msgid "Socket open error. proto=%d port=%d. ERR=%s\n" -msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" - -#: src/lib/bsock.c:349 src/lib/bsock.c:351 -#, fuzzy, c-format -msgid "Source address bind error. proto=%d. ERR=%s\n" -msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" - -#: src/lib/bsock.c:371 -#, c-format -msgid "Cannot set TCP_KEEPIDLE on socket: %s\n" -msgstr "" - -#: src/lib/bsock.c:438 -#, fuzzy, c-format -msgid "Could not init bsock read mutex. ERR=%s\n" -msgstr "Konnte job queue nicht initialiseren: ERR=%s\n" - -#: src/lib/bsock.c:444 -#, fuzzy, c-format -msgid "Could not init bsock write mutex. ERR=%s\n" -msgstr "Konnte job queue nicht initialiseren: ERR=%s\n" - -#: src/lib/bsock.c:594 -msgid "Socket is closed\n" -msgstr "" - -#: src/lib/bsock.c:600 -#, c-format -msgid "Socket has errors=%d on call to %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:607 -#, c-format -msgid "Socket is terminated=%d on call to %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:616 -#, c-format -msgid "Socket has insane msglen=%d on call to %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:626 -#, c-format -msgid "Flowcontrol failure on %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:711 -#, fuzzy, c-format -msgid "Write error sending %d bytes to %s:%s:%d: ERR=%s\n" -msgstr "" -"Fehler beim senden des Kommandos Hello an File daemon auf \"%s:%d\". ERR=%s\n" - -#: src/lib/bsock.c:717 -#, c-format -msgid "Wrote %d bytes to %s:%s:%d, but only %d accepted.\n" -msgstr "" - -#: src/lib/bsock.c:818 src/lib/bsock.c:846 src/lib/bsock.c:920 -#: src/lib/bsock.c:963 -#, c-format -msgid "Read expected %d got %d from %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:879 -#, c-format -msgid "Packet size=%d too big from \"%s:%s:%d. Terminating connection.\n" -msgstr "" - -#: src/lib/bsock.c:909 -#, fuzzy, c-format -msgid "Read error from %s:%s:%d: ERR=%s\n" -msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" - -#: src/lib/bsock.c:1041 -#, fuzzy, c-format -msgid "fread attr spool error. Wanted=%d got=%d bytes. ERR=%s\n" -msgstr "Regex Übersetzungsfehler. ERR=%s\n" - -#: src/lib/bsock.c:1059 -#, fuzzy -msgid "fread attr spool I/O error.\n" -msgstr "Regex Übersetzungsfehler. ERR=%s\n" - -#: src/lib/bsock.c:1120 -msgid "Could not malloc BSOCK data buffer\n" -msgstr "" - -#: src/lib/bsock.c:1138 src/lib/bsock.c:1157 -#, c-format -msgid "sockopt error: %s\n" -msgstr "" - -#: src/lib/bsock.c:1144 src/lib/bsock.c:1163 -#, c-format -msgid "Warning network buffer = %d bytes not max size.\n" -msgstr "" - -#: src/lib/bsock.c:1183 src/lib/bsock.c:1217 -#, fuzzy, c-format -msgid "fcntl F_GETFL error. ERR=%s\n" -msgstr "Regex Übersetzungsfehler. ERR=%s\n" - -#: src/lib/bsock.c:1189 src/lib/bsock.c:1223 src/lib/bsock.c:1255 -#, fuzzy, c-format -msgid "fcntl F_SETFL error. ERR=%s\n" -msgstr "Regex Übersetzungsfehler. ERR=%s\n" - -#: src/lib/bsock.c:1470 -#, fuzzy, c-format -msgid "Director authorization error at \"%s:%d\"\n" -msgstr "Authorisationsproblem: FD an \"%s:%d\" erfordert TLS.\n" - -#: src/lib/bsock.c:1477 -#, fuzzy, c-format -msgid "" -"Authorization error: Remote server at \"%s:%d\" did not advertise required " -"TLS support.\n" -msgstr "" -"Authorisationsproblem: Entfernter Server hat benötigte TLS Unterstützung " -"nicht angeboten.\n" - -#: src/lib/bsock.c:1485 -#, fuzzy, c-format -msgid "" -"Authorization error with Director at \"%s:%d\": Remote server requires TLS.\n" -msgstr "Authorisationsproblem: Enfernter Server erfordert TLS.\n" - -#: src/lib/bsock.c:1497 src/qt-console/bcomm/dircomm_auth.cpp:134 -#, fuzzy, c-format -msgid "TLS negotiation failed with Director at \"%s:%d\"\n" -msgstr "TLS Aushandlung fehlgeschlagen mit SD an \"%s:%d\"\n" - -#: src/lib/bsock.c:1507 -#, c-format -msgid "" -"Bad errmsg to Hello command: ERR=%s\n" -"The Director at \"%s:%d\" may not be running.\n" -msgstr "" - -#: src/lib/bsock.c:1516 src/qt-console/bcomm/dircomm_auth.cpp:155 -#, fuzzy, c-format -msgid "Director at \"%s:%d\" rejected Hello command\n" -msgstr "File daemon auf \"%s:%d\" hat Hello Kommando abgelehnt\n" - -#: src/lib/bsock.c:1526 -#, fuzzy, c-format -msgid "" -"Authorization error with Director at \"%s:%d\"\n" -"Most likely the passwords do not agree.\n" -"If you are using TLS, there may have been a certificate validation error " -"during the TLS handshake.\n" -"For help, please see: " -msgstr "" -"Kann mit File daemon on \"%s:%d\" nicht authentisieren. Mögliche Ursachen:\n" -"Passworte oder Namen nicht gleich oder\n" -"Maximum Concurrent Jobs überschritten auf dem FD oder\n" -"FD Netzwerk durcheinander (Daemon neustarten).\n" -"Für Hilfe bitte unter http://www.bacula.org/rel-manual/faq." -"html#AuthorizationErrors nachsehen.\n" - -#: src/lib/bsys.c:142 -#, fuzzy, c-format -msgid "safe_unlink could not compile regex pattern \"%s\" ERR=%s\n" -msgstr "Konnte regex pattern \"%s\" nicht kompilieren ERR=%s\n" - -#: src/lib/bsys.c:342 src/lib/bsys.c:359 src/lib/bsys.c:383 src/lib/bsys.c:396 -#, c-format -msgid "Out of memory: ERR=%s\n" -msgstr "" - -#: src/lib/bsys.c:438 -msgid "Buffer overflow.\n" -msgstr "" - -#: src/lib/bsys.c:504 -msgid "Bad errno" -msgstr "" - -#: src/lib/bsys.c:519 -#, c-format -msgid "Memset for %d bytes at %s:%d\n" -msgstr "" - -#: src/lib/bsys.c:568 -#, fuzzy, c-format -msgid "Cannot open %s file. %s ERR=%s\n" -msgstr "Kann bootstrap Datei nicht öffnen: %s: ERR=%s\n" - -#: src/lib/bsys.c:585 src/lib/bsys.c:621 -#, c-format -msgid "" -"%s is already running. pid=%d\n" -"Check file %s\n" -msgstr "" - -#: src/lib/bsys.c:601 -#, fuzzy, c-format -msgid "Could not open %s file. %s ERR=%s\n" -msgstr "Kann bootstrap Datei nicht öffnen: %s: ERR=%s\n" - -#: src/lib/bsys.c:624 -#, fuzzy, c-format -msgid "Cannot lock %s file. %s ERR=%s\n" -msgstr "Kann bootstrap Datei nicht öffnen: %s: ERR=%s\n" - -#: src/lib/bsys.c:637 -#, fuzzy, c-format -msgid "Cannot not open %s file. %s ERR=%s\n" -msgstr "Kann bootstrap Datei nicht öffnen: %s: ERR=%s\n" - -#: src/lib/bsys.c:769 -#, c-format -msgid "Could not create state file. %s ERR=%s\n" -msgstr "" - -#: src/lib/bsys.c:788 -#, c-format -msgid "Write final hdr error: ERR=%s\n" -msgstr "" - -#: src/lib/btimers.c:254 -msgid "stop_btimer called with NULL btimer_id\n" -msgstr "" - -#: src/lib/cram-md5.c:106 src/lib/cram-md5.c:138 -msgid "1999 Authorization failed.\n" -msgstr "" - -#: src/lib/crypto.c:428 -msgid "Unable to open certificate file" -msgstr "" - -#: src/lib/crypto.c:435 -msgid "Unable to read certificate from file" -msgstr "" - -#: src/lib/crypto.c:441 -msgid "Unable to extract public key from certificate" -msgstr "" - -#: src/lib/crypto.c:448 -msgid "" -"Provided certificate does not include the required subjectKeyIdentifier " -"extension." -msgstr "" - -#: src/lib/crypto.c:455 -#, c-format -msgid "Unsupported key type provided: %d\n" -msgstr "" - -#: src/lib/crypto.c:492 src/lib/crypto.c:540 -msgid "Unable to open private key file" -msgstr "" - -#: src/lib/crypto.c:522 src/lib/crypto.c:556 -msgid "Unable to read private key from file" -msgstr "" - -#: src/lib/crypto.c:615 -#, c-format -msgid "Unsupported digest type: %d\n" -msgstr "" - -#: src/lib/crypto.c:629 -msgid "OpenSSL digest initialization failed" -msgstr "" - -#: src/lib/crypto.c:643 -msgid "OpenSSL digest update failed" -msgstr "" - -#: src/lib/crypto.c:661 -msgid "OpenSSL digest finalize failed" -msgstr "" - -#: src/lib/crypto.c:759 -msgid "OpenSSL digest_new failed" -msgstr "" - -#: src/lib/crypto.c:765 -msgid "OpenSSL sign get digest failed" -msgstr "" - -#: src/lib/crypto.c:804 src/lib/crypto.c:808 -msgid "OpenSSL digest Verify final failed" -msgstr "" - -#: src/lib/crypto.c:813 -#, fuzzy -msgid "No signers found for crypto verify.\n" -msgstr "Keine %ss zum Migrieren gefunden.\n" - -#: src/lib/crypto.c:874 -msgid "Signature creation failed" -msgstr "" - -#: src/lib/crypto.c:952 -msgid "Signature decoding failed" -msgstr "" - -#: src/lib/crypto.c:1029 -msgid "Unsupported cipher type specified\n" -msgstr "" - -#: src/lib/crypto.c:1178 -msgid "CryptoData decoding failed" -msgstr "" - -#: src/lib/crypto.c:1222 -msgid "Failure decrypting the session key" -msgstr "" - -#: src/lib/crypto.c:1273 -#, c-format -msgid "Unsupported contentEncryptionAlgorithm: %d\n" -msgstr "" - -#: src/lib/crypto.c:1283 src/lib/crypto.c:1289 -msgid "OpenSSL cipher context initialization failed" -msgstr "" - -#: src/lib/crypto.c:1296 -msgid "Encryption session provided an invalid symmetric key" -msgstr "" - -#: src/lib/crypto.c:1302 -msgid "Encryption session provided an invalid IV" -msgstr "" - -#: src/lib/crypto.c:1308 -msgid "OpenSSL cipher context key/IV initialization failed" -msgstr "" - -#: src/lib/crypto.c:1407 -#, c-format -msgid "Unsupported digest type=%d specified\n" -msgstr "" - -#: src/lib/crypto.c:1427 -#, c-format -msgid "SHA1Update() returned an error: %d\n" -msgstr "" - -#: src/lib/crypto.c:1566 -#, fuzzy -msgid "No error" -msgstr "unbekannt" - -#: src/lib/crypto.c:1568 -#, fuzzy -msgid "Signer not found" -msgstr "FileSet MD5 Prüfsumme nicht gefunden.\n" - -#: src/lib/crypto.c:1570 -msgid "Recipient not found" -msgstr "" - -#: src/lib/crypto.c:1572 -msgid "Unsupported digest algorithm" -msgstr "" - -#: src/lib/crypto.c:1574 -msgid "Unsupported encryption algorithm" -msgstr "" - -#: src/lib/crypto.c:1576 -msgid "Signature is invalid" -msgstr "" - -#: src/lib/crypto.c:1578 -msgid "Decryption error" -msgstr "" - -#: src/lib/crypto.c:1581 -msgid "Internal error" -msgstr "" - -#: src/lib/crypto.c:1583 -#, fuzzy -msgid "Unknown error" -msgstr "unbekannt" - -#: src/lib/daemon.c:51 -#, fuzzy, c-format -msgid "Cannot fork to become daemon: ERR=%s\n" -msgstr "Kann var context nicht erzeugen: ERR=%s\n" - -#: src/lib/devlock.c:319 -msgid "writeunlock called too many times.\n" -msgstr "" - -#: src/lib/devlock.c:324 -msgid "writeunlock by non-owner.\n" -msgstr "" - -#: src/lib/devlock.c:490 src/lib/rwlock.c:427 -#, c-format -msgid "Thread %d found unchanged elements %d times\n" -msgstr "" - -#: src/lib/devlock.c:558 src/lib/rwlock.c:494 -#, c-format -msgid "%02d: interval %d, writes %d, reads %d\n" -msgstr "" - -#: src/lib/devlock.c:568 src/lib/rwlock.c:504 -#, c-format -msgid "data %02d: value %d, %d writes\n" -msgstr "" - -#: src/lib/devlock.c:573 src/lib/rwlock.c:509 -#, c-format -msgid "Total: %d thread writes, %d data writes\n" -msgstr "" - -#: src/lib/devlock.c:645 src/lib/rwlock.c:581 -msgid "Try write lock" -msgstr "" - -#: src/lib/devlock.c:651 src/lib/rwlock.c:587 -msgid "Try read lock" -msgstr "" - -#: src/lib/devlock.c:705 src/lib/rwlock.c:640 -msgid "Create thread" -msgstr "" - -#: src/lib/devlock.c:715 src/lib/rwlock.c:650 -msgid "Join thread" -msgstr "" - -#: src/lib/devlock.c:717 src/lib/rwlock.c:652 -#, c-format -msgid "%02d: interval %d, updates %d, r_collisions %d, w_collisions %d\n" -msgstr "" - -#: src/lib/devlock.c:729 src/lib/rwlock.c:664 -#, c-format -msgid "data %02d: value %d, %d updates\n" -msgstr "" - -#: src/lib/edit.c:491 -msgid "Empty name not allowed.\n" -msgstr "" - -#: src/lib/edit.c:501 -#, c-format -msgid "Illegal character \"%c\" in name.\n" -msgstr "" - -#: src/lib/edit.c:508 -msgid "Name too long.\n" -msgstr "" - -#: src/lib/ini.c:97 src/lib/ini.c:109 -#, c-format -msgid "" -"Config file error: %s\n" -" : Line %d, col %d of file %s\n" -"%s\n" -msgstr "" - -#: src/lib/ini.c:367 src/lib/ini.c:414 -#, fuzzy, c-format -msgid "Cannot open config file %s: %s\n" -msgstr "Kann inkludierte Datei nicht öffnen: %s. ERR=%s\n" - -#: src/lib/ini.c:382 -#, fuzzy -msgid "Cannot open lex\n" -msgstr "Kann inkludierte Datei nicht öffnen: %s. ERR=%s\n" - -#: src/lib/jcr.c:221 src/lib/util.c:438 -msgid "Backup" -msgstr "" - -#: src/lib/jcr.c:223 -msgid "Verifying" -msgstr "" - -#: src/lib/jcr.c:225 -#, fuzzy -msgid "Restoring" -msgstr "Wiederherstellung läuft..." - -#: src/lib/jcr.c:227 -msgid "Archiving" -msgstr "" - -#: src/lib/jcr.c:229 -msgid "Copying" -msgstr "" - -#: src/lib/jcr.c:231 -msgid "Migration" -msgstr "" - -#: src/lib/jcr.c:233 -msgid "Scanning" -msgstr "" - -#: src/lib/jcr.c:235 -#, fuzzy -msgid "Unknown operation" -msgstr "unbekannt" - -#: src/lib/jcr.c:244 -#, fuzzy -msgid "backup" -msgstr "Sicherung OK" - -#: src/lib/jcr.c:246 -msgid "verified" -msgstr "" - -#: src/lib/jcr.c:246 -msgid "verify" -msgstr "" - -#: src/lib/jcr.c:248 -#, fuzzy -msgid "restored" -msgstr "Job Ressource" - -#: src/lib/jcr.c:248 -#, fuzzy -msgid "restore" -msgstr "Job Ressource" - -#: src/lib/jcr.c:250 -msgid "archived" -msgstr "" - -#: src/lib/jcr.c:250 -msgid "archive" -msgstr "" - -#: src/lib/jcr.c:252 -msgid "copied" -msgstr "" - -#: src/lib/jcr.c:252 -msgid "copy" -msgstr "" - -#: src/lib/jcr.c:254 -msgid "migrated" -msgstr "" - -#: src/lib/jcr.c:254 -msgid "migrate" -msgstr "" - -#: src/lib/jcr.c:256 -msgid "scanned" -msgstr "" - -#: src/lib/jcr.c:256 -msgid "scan" -msgstr "" - -#: src/lib/jcr.c:258 -#, fuzzy -msgid "unknown action" -msgstr "unbekannt" - -#: src/lib/jcr.c:310 src/lib/lockmgr.c:305 src/lib/lockmgr.c:780 -#: src/lib/lockmgr.c:808 -#, fuzzy, c-format -msgid "pthread key create failed: ERR=%s\n" -msgstr "pthread_create: ERR=%s\n" - -#: src/lib/jcr.c:331 -#, fuzzy, c-format -msgid "pthread_once failed. ERR=%s\n" -msgstr "pthread_cond_wait: ERR=%s\n" - -#: src/lib/jcr.c:340 -#, fuzzy, c-format -msgid "Could not init msg_queue mutex. ERR=%s\n" -msgstr "Konnte job queue nicht initialiseren: ERR=%s\n" - -#: src/lib/jcr.c:397 -msgid "NULL jcr.\n" -msgstr "" - -#: src/lib/jcr.c:606 -#, fuzzy, c-format -msgid "pthread_setspecific failed: ERR=%s\n" -msgstr "Media id select fehlgeschlagen: ERR=%s\n" - -#: src/lib/jcr.c:1097 -#, c-format -msgid "" -"Watchdog sending kill after %d secs to thread stalled reading Storage " -"daemon.\n" -msgstr "" - -#: src/lib/jcr.c:1109 -#, c-format -msgid "" -"Watchdog sending kill after %d secs to thread stalled reading File daemon.\n" -msgstr "" - -#: src/lib/jcr.c:1121 -#, c-format -msgid "" -"Watchdog sending kill after %d secs to thread stalled reading Director.\n" -msgstr "" - -#: src/lib/lex.c:81 -#, c-format -msgid "Problem probably begins at line %d.\n" -msgstr "" - -#: src/lib/lex.c:86 -#, c-format -msgid "" -"Config error: %s\n" -" : line %d, col %d of file %s\n" -"%s\n" -"%s" -msgstr "" - -#: src/lib/lex.c:90 -#, c-format -msgid "Config error: %s\n" -msgstr "" - -#: src/lib/lex.c:119 -msgid "Close of NULL file\n" -msgstr "" - -#: src/lib/lex.c:273 src/lib/xml.c:149 -msgid "" -"get_char: called after EOF. You may have a open double quote without the " -"closing double quote.\n" -msgstr "" - -#: src/lib/lex.c:333 src/lib/xml.c:192 src/lib/xml.c:205 -#, c-format -msgid "Config token too long, file: %s, line %d, begins at line %d\n" -msgstr "" - -#: src/lib/lex.c:357 -msgid "none" -msgstr "" - -#: src/lib/lex.c:358 -msgid "comment" -msgstr "" - -#: src/lib/lex.c:359 -msgid "number" -msgstr "" - -#: src/lib/lex.c:360 -msgid "ip_addr" -msgstr "" - -#: src/lib/lex.c:361 -msgid "identifier" -msgstr "" - -#: src/lib/lex.c:362 -msgid "string" -msgstr "" - -#: src/lib/lex.c:363 -msgid "quoted_string" -msgstr "" - -#: src/lib/lex.c:364 -msgid "include" -msgstr "" - -#: src/lib/lex.c:365 -msgid "include_quoted_string" -msgstr "" - -#: src/lib/lex.c:366 -msgid "UTF-8 Byte Order Mark" -msgstr "" - -#: src/lib/lex.c:367 -msgid "UTF-16le Byte Order Mark" -msgstr "" - -#: src/lib/lex.c:405 src/lib/lex.c:411 src/lib/lex.c:422 src/lib/lex.c:428 -#, c-format -msgid "expected a positive integer number, got: %s" -msgstr "" - -#: src/lib/lex.c:544 src/lib/xml.c:344 -msgid "" -"This config file appears to be in an unsupported Unicode format (UTF-16be). " -"Please resave as UTF-8\n" -msgstr "" - -#: src/lib/lex.c:690 src/lib/lex.c:718 -#, c-format -msgid "Cannot open included config file %s: %s\n" -msgstr "" - -#: src/lib/lex.c:777 src/lib/lex.c:834 -#, c-format -msgid "expected an integer or a range, got %s: %s" -msgstr "" - -#: src/lib/lex.c:791 src/lib/lex.c:799 src/lib/lex.c:810 src/lib/lex.c:818 -#, c-format -msgid "expected an integer number, got %s: %s" -msgstr "" - -#: src/lib/lex.c:848 -#, c-format -msgid "expected a name, got %s: %s" -msgstr "" - -#: src/lib/lex.c:852 -#, c-format -msgid "name %s length %d too long, max is %d\n" -msgstr "" - -#: src/lib/lex.c:860 -#, c-format -msgid "expected a string, got %s: %s" -msgstr "" - -#: src/lib/lockmgr.c:54 -#, c-format -msgid "ASSERT failed at %s:%i: %s\n" -msgstr "" - -#: src/lib/lockmgr.c:59 -#, c-format -msgid "ASSERT failed at %s:%i: %s \n" -msgstr "" - -#: src/lib/lockmgr.c:65 -#, c-format -msgid "ASSERT failed at %s:%i: %s (%s)\n" -msgstr "" - -#: src/lib/lockmgr.c:96 -#, fuzzy, c-format -msgid "Mutex lock failure. ERR=%s\n" -msgstr "pthread_cond_wait: ERR=%s\n" - -#: src/lib/lockmgr.c:106 -#, fuzzy, c-format -msgid "Mutex unlock failure. ERR=%s\n" -msgstr "pthread_cond_wait: ERR=%s\n" - -#: src/lib/lockmgr.c:792 -#, fuzzy, c-format -msgid "pthread_create failed: ERR=%s\n" -msgstr "pthread_create: ERR=%s\n" - -#: src/lib/mem_pool.c:103 -#, c-format -msgid "MemPool index %d larger than max %d\n" -msgstr "" - -#: src/lib/mem_pool.c:121 src/lib/mem_pool.c:141 src/lib/mem_pool.c:177 -#: src/lib/mem_pool.c:250 src/lib/mem_pool.c:270 src/lib/mem_pool.c:305 -#: src/lib/mem_pool.c:616 -#, c-format -msgid "Out of memory requesting %d bytes\n" -msgstr "" - -#: src/lib/mem_pool.c:158 -msgid "obuf is NULL\n" -msgstr "" - -#: src/lib/message.c:418 src/lib/message.c:428 -#, c-format -msgid "Could not open console message file %s: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:433 -#, c-format -msgid "Could not get con mutex: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:538 -msgid "Bacula Message" -msgstr "" - -#: src/lib/message.c:542 -#, c-format -msgid "open mail pipe %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:633 -msgid "open mail pipe failed.\n" -msgstr "" - -#: src/lib/message.c:646 -#, c-format -msgid "close error: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:657 -#, c-format -msgid "Mail prog: %s" -msgstr "" - -#: src/lib/message.c:666 -#, c-format -msgid "" -"Mail program terminated in error.\n" -"CMD=%s\n" -"ERR=%s\n" -msgstr "" - -#: src/lib/message.c:773 -#, c-format -msgid "fopen %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:895 src/lib/message.c:898 -msgid "Msg delivery error: Unable to store data in database.\n" -msgstr "" - -#: src/lib/message.c:950 -#, c-format -msgid "" -"Msg delivery error: Operator mail program terminated in error.\n" -"CMD=%s\n" -"ERR=%s\n" -msgstr "" - -#: src/lib/message.c:971 -#, fuzzy, c-format -msgid "Msg delivery error: fopen %s failed: ERR=%s\n" -msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" - -#: src/lib/message.c:1318 -#, c-format -msgid "%s: ABORTING due to ERROR in %s:%d\n" -msgstr "" - -#: src/lib/message.c:1322 -#, c-format -msgid "%s: ERROR TERMINATION at %s:%d\n" -msgstr "" - -#: src/lib/message.c:1327 -#, c-format -msgid "%s: Fatal Error because: " -msgstr "" - -#: src/lib/message.c:1329 -#, c-format -msgid "%s: Fatal Error at %s:%d because:\n" -msgstr "" - -#: src/lib/message.c:1333 -#, c-format -msgid "%s: ERROR: " -msgstr "" - -#: src/lib/message.c:1335 -#, c-format -msgid "%s: ERROR in %s:%d " -msgstr "" - -#: src/lib/message.c:1338 -#, c-format -msgid "%s: Warning: " -msgstr "" - -#: src/lib/message.c:1341 -#, c-format -msgid "%s: Security violation: " -msgstr "" - -#: src/lib/message.c:1430 -#, c-format -msgid "%s ABORTING due to ERROR\n" -msgstr "" - -#: src/lib/message.c:1433 -#, c-format -msgid "%s ERROR TERMINATION\n" -msgstr "" - -#: src/lib/message.c:1436 -#, c-format -msgid "%s JobId %u: Fatal error: " -msgstr "" - -#: src/lib/message.c:1445 -#, c-format -msgid "%s JobId %u: Error: " -msgstr "" - -#: src/lib/message.c:1451 -#, c-format -msgid "%s JobId %u: Warning: " -msgstr "" - -#: src/lib/message.c:1457 -#, c-format -msgid "%s JobId %u: Security violation: " -msgstr "" - -#: src/lib/message.c:1732 -msgid "Debug lock information" -msgstr "" - -#: src/lib/message.c:1733 -msgid "Debug network information" -msgstr "" - -#: src/lib/message.c:1734 -msgid "Debug plugin information" -msgstr "" - -#: src/lib/message.c:1735 -msgid "Debug volume information" -msgstr "" - -#: src/lib/message.c:1736 -msgid "Debug SQL queries" -msgstr "" - -#: src/lib/message.c:1737 -msgid "Debug BVFS queries" -msgstr "" - -#: src/lib/message.c:1738 -msgid "Debug memory allocation" -msgstr "" - -#: src/lib/message.c:1739 -msgid "Debug scheduler information" -msgstr "" - -#: src/lib/message.c:1740 -msgid "Debug protocol information" -msgstr "" - -#: src/lib/message.c:1741 -msgid "Debug dedup information" -msgstr "" - -#: src/lib/message.c:1742 -msgid "Debug snapshots" -msgstr "" - -#: src/lib/message.c:1743 -msgid "Debug dedup engine" -msgstr "" - -#: src/lib/message.c:1744 -msgid "ASX personal's debugging" -msgstr "" - -#: src/lib/message.c:1745 -msgid "Debug all information" -msgstr "" - -#: src/lib/openssl.c:113 src/lib/openssl.c:172 src/stored/dev.c:385 -#: src/stored/dev.c:443 -#, c-format -msgid "Unable to init mutex: ERR=%s\n" -msgstr "" - -#: src/lib/openssl.c:134 src/lib/openssl.c:205 -#, c-format -msgid "Unable to destroy mutex: ERR=%s\n" -msgstr "" - -#: src/lib/openssl.c:273 -#, c-format -msgid "Unable to init OpenSSL threading: ERR=%s\n" -msgstr "" - -#: src/lib/openssl.c:286 -msgid "Failed to seed OpenSSL PRNG\n" -msgstr "" - -#: src/lib/openssl.c:312 -msgid "Failed to save OpenSSL PRNG\n" -msgstr "" - -#: src/lib/parse_conf.c:164 -msgid "***UNKNOWN***" -msgstr "" - -#: src/lib/parse_conf.c:208 -#, c-format -msgid "Attempt to define second %s resource named \"%s\" is not permitted.\n" -msgstr "" -"Der Versuch der Definition einer zweiten %s resource mit dem Namen \"%s\" " -"ist nicht erlaubt.\n" - -#: src/lib/parse_conf.c:214 -#, fuzzy, c-format -msgid "Inserted res: %s index=%d\n" -msgstr "Inserting %s res: %s index=%d pass=%d\n" - -#: src/lib/parse_conf.c:328 src/lib/parse_conf.c:349 -#, c-format -msgid "expected an =, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:358 -#, c-format -msgid "Unknown item code: %d\n" -msgstr "" - -#: src/lib/parse_conf.c:398 -#, c-format -msgid "message type: %s not found" -msgstr "" - -#: src/lib/parse_conf.c:437 -#, c-format -msgid "Attempt to redefine name \"%s\" to \"%s\"." -msgstr "" - -#: src/lib/parse_conf.c:542 -#, c-format -msgid "Attempt to redefine resource \"%s\" referenced on line %d : %s\n" -msgstr "" - -#: src/lib/parse_conf.c:578 -#, c-format -msgid "Too many %s directives. Max. is %d. line %d: %s\n" -msgstr "" - -#: src/lib/parse_conf.c:589 -#, c-format -msgid "Could not find config Resource \"%s\" referenced on line %d : %s\n" -msgstr "" - -#: src/lib/parse_conf.c:657 -#, c-format -msgid "Missing config Resource \"%s\" referenced on line %d : %s\n" -msgstr "" - -#: src/lib/parse_conf.c:732 -#, c-format -msgid "expected a size number, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:737 -#, fuzzy, c-format -msgid "expected a speed number, got: %s" -msgstr "Dateiname erwartet, erhalten: %s" - -#: src/lib/parse_conf.c:748 -#, fuzzy, c-format -msgid "expected a %s, got: %s" -msgstr "Erwartete ein \"ist gleich\", erhalten: %s" - -#: src/lib/parse_conf.c:749 -msgid "size" -msgstr "" - -#: src/lib/parse_conf.c:749 -msgid "speed" -msgstr "" - -#: src/lib/parse_conf.c:870 -#, c-format -msgid "Expected a Tape Label keyword, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:939 -#, c-format -msgid "Unable to initialize resource lock. ERR=%s\n" -msgstr "" - -#: src/lib/parse_conf.c:947 -msgid "Config filename too long.\n" -msgstr "" - -#: src/lib/parse_conf.c:971 -#, c-format -msgid "Cannot open config file \"%s\": %s\n" -msgstr "" - -#: src/lib/parse_conf.c:989 -msgid "" -"Currently we cannot handle UTF-16 source files. Please convert the conf file " -"to UTF-8\n" -msgstr "" - -#: src/lib/parse_conf.c:993 -#, c-format -msgid "Expected a Resource name identifier, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:1009 -#, c-format -msgid "expected resource name, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:1020 -#, c-format -msgid "not in resource definition: %s" -msgstr "" - -#: src/lib/parse_conf.c:1051 -#, c-format -msgid "" -"Keyword \"%s\" not permitted in this resource.\n" -"Perhaps you left the trailing brace off of the previous resource." -msgstr "" - -#: src/lib/parse_conf.c:1062 -msgid "Name not specified for resource" -msgstr "" - -#: src/lib/parse_conf.c:1072 -#, c-format -msgid "unexpected token %d %s in resource definition" -msgstr "" - -#: src/lib/parse_conf.c:1078 -#, c-format -msgid "Unknown parser state %d\n" -msgstr "" - -#: src/lib/parse_conf.c:1083 -msgid "End of conf file reached with unclosed resource." -msgstr "" - -#: src/lib/plugins.c:106 -#, fuzzy, c-format -msgid "Failed to open Plugin directory %s: ERR=%s\n" -msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" - -#: src/lib/plugins.c:123 -#, c-format -msgid "Failed to find any plugins in %s\n" -msgstr "" - -#: src/lib/plugins.c:157 -#, fuzzy, c-format -msgid "dlopen plugin %s failed: ERR=%s\n" -msgstr "Client id select fehlgeschlagen: ERR=%s\n" - -#: src/lib/plugins.c:168 -#, c-format -msgid "Lookup of loadPlugin in plugin %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/plugins.c:177 -#, c-format -msgid "Lookup of unloadPlugin in plugin %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:57 -#, c-format -msgid "Could not find userid=%s: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:63 -#, c-format -msgid "Could not find password entry. ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:76 -#, c-format -msgid "Could not find group=%s: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:84 -#, c-format -msgid "Could not initgroups for group=%s, userid=%s: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:87 -#, c-format -msgid "Could not initgroups for userid=%s: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:94 -#, c-format -msgid "Could not set group=%s: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:104 -#, fuzzy, c-format -msgid "prctl failed: ERR=%s\n" -msgstr "pthread_create: ERR=%s\n" - -#: src/lib/priv.c:108 -#, fuzzy, c-format -msgid "setreuid failed: ERR=%s\n" -msgstr "Abfrage gescheitert: %s: ERR=%s\n" - -#: src/lib/priv.c:112 -#, fuzzy, c-format -msgid "cap_from_text failed: ERR=%s\n" -msgstr "pthread_create: ERR=%s\n" - -#: src/lib/priv.c:116 -#, fuzzy, c-format -msgid "cap_set_proc failed: ERR=%s\n" -msgstr "Media id select fehlgeschlagen: ERR=%s\n" - -#: src/lib/priv.c:120 -msgid "Keep readall caps not implemented this OS or missing libraries.\n" -msgstr "" - -#: src/lib/priv.c:124 -#, c-format -msgid "Could not set specified userid: %s\n" -msgstr "" - -#: src/lib/pythonlib.c:105 -msgid "Could not initialize Python\n" -msgstr "" - -#: src/lib/pythonlib.c:110 -#, c-format -msgid "Could not Run Python string %s\n" -msgstr "" - -#: src/lib/pythonlib.c:122 -msgid "Could not initialize Python Job type.\n" -msgstr "" - -#: src/lib/pythonlib.c:127 -#, c-format -msgid "Could not import Python script %s/%s. Python disabled.\n" -msgstr "" - -#: src/lib/pythonlib.c:229 -msgid "Could not create Python Job Object.\n" -msgstr "" - -#: src/lib/pythonlib.c:242 src/lib/pythonlib.c:266 -#, c-format -msgid "Python function \"%s\" not found.\n" -msgstr "" - -#: src/lib/pythonlib.c:281 -#, c-format -msgid "Unknown Python daemon event %s\n" -msgstr "" - -#: src/lib/pythonlib.c:306 -#, c-format -msgid "Unable to initialize the Python lock. ERR=%s\n" -msgstr "" - -#: src/lib/res.c:54 -#, c-format -msgid "rwl_writelock failure at %s:%d: ERR=%s\n" -msgstr "" - -#: src/lib/res.c:64 -#, c-format -msgid "rwl_writeunlock failure at %s:%d:. ERR=%s\n" -msgstr "" - -#: src/lib/runscript.c:225 -#, c-format -msgid "%s: run %s \"%s\"\n" -msgstr "" - -#: src/lib/runscript.c:234 -#, c-format -msgid "Runscript: %s could not execute. ERR=%s\n" -msgstr "" - -#: src/lib/runscript.c:243 -#, c-format -msgid "%s: %s\n" -msgstr "" - -#: src/lib/runscript.c:248 -#, c-format -msgid "Runscript: %s returned non-zero status=%d. ERR=%s\n" -msgstr "" - -#: src/lib/rwlock.c:291 -msgid "rwl_writeunlock called too many times.\n" -msgstr "" - -#: src/lib/rwlock.c:296 -msgid "rwl_writeunlock by non-owner.\n" -msgstr "" - -#: src/lib/sellist.c:58 -msgid "Negative numbers not permitted.\n" -msgstr "" - -#: src/lib/sellist.c:84 -msgid "User cancel requested.\n" -msgstr "" - -#: src/lib/sellist.c:107 -msgid "Selection items must be be greater than zero.\n" -msgstr "" - -#: src/lib/signal.c:57 -msgid "Invalid signal number" -msgstr "" - -#: src/lib/signal.c:147 src/lib/signal.c:149 -#, c-format -msgid "Bacula interrupted by signal %d: %s\n" -msgstr "" - -#: src/lib/signal.c:165 -#, c-format -msgid "Kaboom! %s, %s got signal %d - %s at %s. Attempting traceback.\n" -msgstr "" - -#: src/lib/signal.c:167 -#, c-format -msgid "Kaboom! exepath=%s\n" -msgstr "" - -#: src/lib/signal.c:208 -#, c-format -msgid "Fork error: ERR=%s\n" -msgstr "" - -#: src/lib/signal.c:216 -#, c-format -msgid "Calling: %s %s %s %s\n" -msgstr "" - -#: src/lib/signal.c:220 -#, c-format -msgid "execv: %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/signal.c:242 -#, c-format -msgid "It looks like the traceback worked...\n" -msgstr "" - -#: src/lib/signal.c:244 -#, c-format -msgid "The btraceback call returned %d\n" -msgstr "" - -#: src/lib/signal.c:304 -#, c-format -msgid "BA_NSIG too small (%d) should be (%d)\n" -msgstr "" - -#: src/lib/signal.c:310 -msgid "UNKNOWN SIGNAL" -msgstr "" - -#: src/lib/signal.c:311 -msgid "Hangup" -msgstr "" - -#: src/lib/signal.c:312 -msgid "Interrupt" -msgstr "" - -#: src/lib/signal.c:313 -msgid "Quit" -msgstr "" - -#: src/lib/signal.c:314 -msgid "Illegal instruction" -msgstr "" - -#: src/lib/signal.c:315 -msgid "Trace/Breakpoint trap" -msgstr "" - -#: src/lib/signal.c:316 -msgid "Abort" -msgstr "" - -#: src/lib/signal.c:318 -msgid "EMT instruction (Emulation Trap)" -msgstr "" - -#: src/lib/signal.c:321 -msgid "IOT trap" -msgstr "" - -#: src/lib/signal.c:323 -msgid "BUS error" -msgstr "" - -#: src/lib/signal.c:324 -msgid "Floating-point exception" -msgstr "" - -#: src/lib/signal.c:325 -msgid "Kill, unblockable" -msgstr "" - -#: src/lib/signal.c:326 -msgid "User-defined signal 1" -msgstr "" - -#: src/lib/signal.c:327 -msgid "Segmentation violation" -msgstr "" - -#: src/lib/signal.c:328 -msgid "User-defined signal 2" -msgstr "" - -#: src/lib/signal.c:329 -msgid "Broken pipe" -msgstr "" - -#: src/lib/signal.c:330 -msgid "Alarm clock" -msgstr "" - -#: src/lib/signal.c:331 -msgid "Termination" -msgstr "" - -#: src/lib/signal.c:333 -msgid "Stack fault" -msgstr "" - -#: src/lib/signal.c:335 -msgid "Child status has changed" -msgstr "" - -#: src/lib/signal.c:336 -msgid "Continue" -msgstr "" - -#: src/lib/signal.c:337 -msgid "Stop, unblockable" -msgstr "" - -#: src/lib/signal.c:338 -msgid "Keyboard stop" -msgstr "" - -#: src/lib/signal.c:339 -msgid "Background read from tty" -msgstr "" - -#: src/lib/signal.c:340 -msgid "Background write to tty" -msgstr "" - -#: src/lib/signal.c:341 -msgid "Urgent condition on socket" -msgstr "" - -#: src/lib/signal.c:342 -msgid "CPU limit exceeded" -msgstr "" - -#: src/lib/signal.c:343 -msgid "File size limit exceeded" -msgstr "" - -#: src/lib/signal.c:344 -msgid "Virtual alarm clock" -msgstr "" - -#: src/lib/signal.c:345 -msgid "Profiling alarm clock" -msgstr "" - -#: src/lib/signal.c:346 -msgid "Window size change" -msgstr "" - -#: src/lib/signal.c:347 -msgid "I/O now possible" -msgstr "" - -#: src/lib/signal.c:349 -msgid "Power failure restart" -msgstr "" - -#: src/lib/signal.c:352 -msgid "No runnable lwp" -msgstr "" - -#: src/lib/signal.c:355 -msgid "SIGLWP special signal used by thread library" -msgstr "" - -#: src/lib/signal.c:358 -msgid "Checkpoint Freeze" -msgstr "" - -#: src/lib/signal.c:361 -msgid "Checkpoint Thaw" -msgstr "" - -#: src/lib/signal.c:364 -msgid "Thread Cancellation" -msgstr "" - -#: src/lib/signal.c:367 -msgid "Resource Lost (e.g. record-lock lost)" -msgstr "" - -#: src/lib/smartall.c:134 src/lib/smartall.c:247 src/lib/smartall.c:262 -msgid "Out of memory\n" -msgstr "" - -#: src/lib/smartall.c:139 -msgid "Too much memory used." -msgstr "" - -#: src/lib/smartall.c:171 -#, c-format -msgid "Attempt to free NULL called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:185 -#, c-format -msgid "in-use bit not set: double free from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:193 -#, c-format -msgid "qp->qnext->qprev != qp called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:197 -#, c-format -msgid "qp->qprev->qnext != qp called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:206 -#, c-format -msgid "Overrun buffer: len=%d addr=%p allocated: %s:%d called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:284 -#, c-format -msgid "sm_realloc size: %d\n" -msgstr "" - -#: src/lib/smartall.c:322 -#, c-format -msgid "sm_realloc %d at %p from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:382 -#, c-format -msgid "" -"\n" -"Orphaned buffers exist. Dump terminated following\n" -" discovery of bad links in chain of orphaned buffers.\n" -" Buffer address with bad links: %p\n" -msgstr "" - -#: src/lib/smartall.c:427 -#, c-format -msgid "Damaged buffer found. Called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:460 -#, c-format -msgid "" -"\n" -"Damaged buffers found at %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:463 -msgid " discovery of bad prev link.\n" -msgstr "" - -#: src/lib/smartall.c:466 -msgid " discovery of bad next link.\n" -msgstr "" - -#: src/lib/smartall.c:469 -msgid " discovery of data overrun.\n" -msgstr "" - -#: src/lib/smartall.c:472 -msgid " NULL pointer.\n" -msgstr "" - -#: src/lib/smartall.c:478 -#, c-format -msgid " Buffer address: %p\n" -msgstr "" - -#: src/lib/smartall.c:485 -#, c-format -msgid "Damaged buffer: %6u bytes allocated at line %d of %s %s\n" -msgstr "" - -#: src/lib/status.h:86 -msgid "===================================================================\n" -msgstr "" - -#: src/lib/tls.c:81 -#, c-format -msgid "" -"Error with certificate at depth: %d, issuer = %s, subject = %s, ERR=%d:%s\n" -msgstr "" - -#: src/lib/tls.c:118 -msgid "Error initializing SSL context" -msgstr "" - -#: src/lib/tls.c:139 -msgid "Error loading certificate verification stores" -msgstr "" - -#: src/lib/tls.c:144 -msgid "" -"Either a certificate file or a directory must be specified as a verification " -"store\n" -msgstr "" - -#: src/lib/tls.c:155 -msgid "Error loading certificate file" -msgstr "" - -#: src/lib/tls.c:163 -msgid "Error loading private key" -msgstr "" - -#: src/lib/tls.c:171 -msgid "Unable to open DH parameters file" -msgstr "" - -#: src/lib/tls.c:177 -msgid "Unable to load DH parameters from specified file" -msgstr "" - -#: src/lib/tls.c:181 -msgid "Failed to set TLS Diffie-Hellman parameters" -msgstr "" - -#: src/lib/tls.c:191 -msgid "Error setting cipher list, no valid ciphers available\n" -msgstr "" - -#: src/lib/tls.c:250 -msgid "Peer failed to present a TLS certificate\n" -msgstr "" - -#: src/lib/tls.c:296 src/lib/tls.c:297 -#, c-format -msgid "Peer %s failed to present a TLS certificate\n" -msgstr "" - -#: src/lib/tls.c:429 -msgid "Error creating file descriptor-based BIO" -msgstr "" - -#: src/lib/tls.c:440 -msgid "Error creating new SSL object" -msgstr "" - -#: src/lib/tls.c:509 src/lib/tls.c:532 -msgid "Connect failure" -msgstr "" - -#: src/lib/tls.c:612 src/lib/tls.c:616 -msgid "TLS shutdown failure." -msgstr "" - -#: src/lib/tls.c:677 src/lib/tls.c:703 -msgid "TLS read/write failure." -msgstr "" - -#: src/lib/util.c:259 -msgid "Running" -msgstr "" - -#: src/lib/util.c:262 -msgid "Blocked" -msgstr "" - -#: src/lib/util.c:268 -msgid "Incomplete job" -msgstr "" - -#: src/lib/util.c:275 -msgid "Non-fatal error" -msgstr "" - -#: src/lib/util.c:281 src/lib/util.c:416 -msgid "Canceled" -msgstr "" - -#: src/lib/util.c:284 -msgid "Verify differences" -msgstr "" - -#: src/lib/util.c:287 -msgid "Waiting on FD" -msgstr "" - -#: src/lib/util.c:290 -msgid "Wait on SD" -msgstr "" - -#: src/lib/util.c:293 -msgid "Wait for new Volume" -msgstr "" - -#: src/lib/util.c:296 -msgid "Waiting for mount" -msgstr "" - -#: src/lib/util.c:299 -msgid "Waiting for Storage resource" -msgstr "" - -#: src/lib/util.c:302 -msgid "Waiting for Job resource" -msgstr "" - -#: src/lib/util.c:305 -msgid "Waiting for Client resource" -msgstr "" - -#: src/lib/util.c:308 -msgid "Waiting on Max Jobs" -msgstr "" - -#: src/lib/util.c:311 -msgid "Waiting for Start Time" -msgstr "" - -#: src/lib/util.c:314 -msgid "Waiting on Priority" -msgstr "" - -#: src/lib/util.c:333 -#, c-format -msgid "Unknown Job termination status=%d" -msgstr "" - -#: src/lib/util.c:349 -msgid "Completed successfully" -msgstr "" - -#: src/lib/util.c:352 -#, fuzzy -msgid "Completed with warnings" -msgstr "%s OK -- mit Warnungen" - -#: src/lib/util.c:355 -msgid "Terminated with errors" -msgstr "" - -#: src/lib/util.c:358 -#, fuzzy -msgid "Fatal error" -msgstr "unbekannt" - -#: src/lib/util.c:361 -msgid "Created, not yet running" -msgstr "" - -#: src/lib/util.c:364 -msgid "Canceled by user" -msgstr "" - -#: src/lib/util.c:367 -msgid "Verify found differences" -msgstr "" - -#: src/lib/util.c:370 -#, fuzzy -msgid "Waiting for File daemon" -msgstr "File daemon" - -#: src/lib/util.c:373 -#, fuzzy -msgid "Waiting for Storage daemon" -msgstr "Storage daemon" - -#: src/lib/util.c:376 -msgid "Waiting for higher priority jobs" -msgstr "" - -#: src/lib/util.c:379 -msgid "Batch inserting file records" -msgstr "" - -#: src/lib/util.c:413 -msgid "Fatal Error" -msgstr "" - -#: src/lib/util.c:419 -msgid "Differences" -msgstr "" - -#: src/lib/util.c:422 -msgid "Unknown term code" -msgstr "" - -#: src/lib/util.c:441 -#, fuzzy -msgid "Migrated Job" -msgstr "Konnte Migrationsjob nicht starten.\n" - -#: src/lib/util.c:444 -msgid "Verify" -msgstr "" - -#: src/lib/util.c:447 -msgid "Restore" -msgstr "" - -#: src/lib/util.c:450 -msgid "Console" -msgstr "" - -#: src/lib/util.c:453 -msgid "System or Console" -msgstr "" - -#: src/lib/util.c:456 -msgid "Admin" -msgstr "" - -#: src/lib/util.c:459 src/lib/util.c:549 -msgid "Archive" -msgstr "" - -#: src/lib/util.c:462 -msgid "Job Copy" -msgstr "" - -#: src/lib/util.c:465 -msgid "Copy" -msgstr "" - -#: src/lib/util.c:468 -msgid "Migrate" -msgstr "" - -#: src/lib/util.c:471 -msgid "Scan" -msgstr "" - -#: src/lib/util.c:475 -msgid "Unknown Type" -msgstr "" - -#: src/lib/util.c:485 -msgid "Truncate" -msgstr "" - -#: src/lib/util.c:502 -msgid "Base" -msgstr "" - -#: src/lib/util.c:520 -msgid "Verify Init Catalog" -msgstr "" - -#: src/lib/util.c:529 -msgid "Verify Data" -msgstr "" - -#: src/lib/util.c:532 -msgid "Virtual Full" -msgstr "" - -#: src/lib/util.c:538 -msgid "Unknown Job Level" -msgstr "" - -#: src/lib/util.c:548 -msgid "Append" -msgstr "" - -#: src/lib/util.c:550 -#, fuzzy -msgid "Disabled" -msgstr "ist nicht aktiviert" - -#: src/lib/util.c:552 -msgid "Used" -msgstr "" - -#: src/lib/util.c:553 -msgid "Cleaning" -msgstr "" - -#: src/lib/util.c:554 -msgid "Purged" -msgstr "" - -#: src/lib/util.c:555 -msgid "Recycle" -msgstr "" - -#: src/lib/util.c:556 -msgid "Read-Only" -msgstr "" - -#: src/lib/util.c:568 -msgid "Invalid volume status" -msgstr "" - -#: src/lib/util.c:956 -msgid "Working directory not defined. Cannot continue.\n" -msgstr "" - -#: src/lib/util.c:959 -#, c-format -msgid "Working Directory: \"%s\" not found. Cannot continue.\n" -msgstr "" - -#: src/lib/util.c:963 -#, c-format -msgid "Working Directory: \"%s\" is not a directory. Cannot continue.\n" -msgstr "" - -#: src/lib/var.c:2659 -msgid "everything ok" -msgstr "" - -#: src/lib/var.c:2660 -msgid "incomplete named character" -msgstr "" - -#: src/lib/var.c:2661 -msgid "incomplete hexadecimal value" -msgstr "" - -#: src/lib/var.c:2662 -msgid "invalid hexadecimal value" -msgstr "" - -#: src/lib/var.c:2663 -msgid "octal value too large" -msgstr "" - -#: src/lib/var.c:2664 -msgid "invalid octal value" -msgstr "" - -#: src/lib/var.c:2665 -msgid "incomplete octal value" -msgstr "" - -#: src/lib/var.c:2666 -msgid "incomplete grouped hexadecimal value" -msgstr "" - -#: src/lib/var.c:2667 -msgid "incorrect character class specification" -msgstr "" - -#: src/lib/var.c:2668 -msgid "invalid expansion configuration" -msgstr "" - -#: src/lib/var.c:2669 -msgid "out of memory" -msgstr "" - -#: src/lib/var.c:2670 -msgid "incomplete variable specification" -msgstr "" - -#: src/lib/var.c:2671 -msgid "undefined variable" -msgstr "" - -#: src/lib/var.c:2672 -msgid "input is neither text nor variable" -msgstr "" - -#: src/lib/var.c:2673 -#, fuzzy -msgid "unknown command character in variable" -msgstr "unbekannt" - -#: src/lib/var.c:2674 -msgid "malformatted search and replace operation" -msgstr "" - -#: src/lib/var.c:2675 -#, fuzzy -msgid "unknown flag in search and replace operation" -msgstr "unbekannt" - -#: src/lib/var.c:2676 -msgid "invalid regex in search and replace operation" -msgstr "" - -#: src/lib/var.c:2677 -msgid "missing parameter in command" -msgstr "" - -#: src/lib/var.c:2678 -msgid "empty search string in search and replace operation" -msgstr "" - -#: src/lib/var.c:2679 -msgid "start offset missing in cut operation" -msgstr "" - -#: src/lib/var.c:2680 -#, fuzzy -msgid "offsets in cut operation delimited by unknown character" -msgstr "unbekannt" - -#: src/lib/var.c:2681 -msgid "range out of bounds in cut operation" -msgstr "" - -#: src/lib/var.c:2682 -msgid "offset out of bounds in cut operation" -msgstr "" - -#: src/lib/var.c:2683 -msgid "logic error in cut operation" -msgstr "" - -#: src/lib/var.c:2684 -msgid "malformatted transpose operation" -msgstr "" - -#: src/lib/var.c:2685 -msgid "source and target class mismatch in transpose operation" -msgstr "" - -#: src/lib/var.c:2686 -msgid "empty character class in transpose operation" -msgstr "" - -#: src/lib/var.c:2687 -msgid "incorrect character class in transpose operation" -msgstr "" - -#: src/lib/var.c:2688 -msgid "malformatted padding operation" -msgstr "" - -#: src/lib/var.c:2689 -msgid "width parameter missing in padding operation" -msgstr "" - -#: src/lib/var.c:2690 -msgid "fill string missing in padding operation" -msgstr "" - -#: src/lib/var.c:2691 -#, fuzzy -msgid "unknown quoted pair in search and replace operation" -msgstr "unbekannt" - -#: src/lib/var.c:2692 -msgid "sub-matching reference out of range" -msgstr "" - -#: src/lib/var.c:2693 -msgid "invalid argument" -msgstr "" - -#: src/lib/var.c:2694 -msgid "incomplete quoted pair" -msgstr "" - -#: src/lib/var.c:2695 -msgid "lookup function does not support variable arrays" -msgstr "" - -#: src/lib/var.c:2696 -msgid "index of array variable contains an invalid character" -msgstr "" - -#: src/lib/var.c:2697 -msgid "index of array variable is incomplete" -msgstr "" - -#: src/lib/var.c:2698 -msgid "bracket expression in array variable's index not closed" -msgstr "" - -#: src/lib/var.c:2699 -msgid "division by zero error in index specification" -msgstr "" - -#: src/lib/var.c:2700 -msgid "unterminated loop construct" -msgstr "" - -#: src/lib/var.c:2701 -msgid "invalid character in loop limits" -msgstr "" - -#: src/lib/var.c:2702 -msgid "malformed operation argument list" -msgstr "" - -#: src/lib/var.c:2703 -msgid "undefined operation" -msgstr "" - -#: src/lib/var.c:2704 -msgid "formatting failure" -msgstr "" - -#: src/lib/var.c:2713 -#, fuzzy -msgid "unknown error" -msgstr "unbekannt" - -#: src/lib/watchdog.c:85 -#, c-format -msgid "Unable to initialize watchdog lock. ERR=%s\n" -msgstr "" - -#: src/lib/watchdog.c:182 -msgid "BUG! register_watchdog called before start_watchdog\n" -msgstr "" - -#: src/lib/watchdog.c:185 -#, c-format -msgid "BUG! Watchdog %p has NULL callback\n" -msgstr "" - -#: src/lib/watchdog.c:188 -#, c-format -msgid "BUG! Watchdog %p has zero interval\n" -msgstr "" - -#: src/lib/watchdog.c:208 -msgid "BUG! unregister_watchdog_unlocked called before start_watchdog\n" -msgstr "" - -#: src/lib/watchdog.c:328 -#, c-format -msgid "rwl_writelock failure. ERR=%s\n" -msgstr "" - -#: src/lib/watchdog.c:343 -#, c-format -msgid "rwl_writeunlock failure. ERR=%s\n" -msgstr "" - -#: src/lib/xml.c:407 -msgid "Malformed XML expecting start of tag.\n" -msgstr "" - -#: src/lib/xml.c:460 -msgid "Bad file start bytes (utf8 bom).\n" -msgstr "" - -#: src/lib/xml.c:472 -msgid "Bad file start bytes (utf16 bom).\n" -msgstr "" - -#: src/plugins/fd/delta-fd.c:1359 -#, fuzzy, c-format -msgid "Can't use replace=ifnewer with Delta plugin on %s\n" -msgstr "Cannot unescape string: ERR=%s\n" - -#: src/plugins/fd/delta-fd.c:1366 -#, fuzzy, c-format -msgid "Can't use replace=ifolder with Delta plugin on %s\n" -msgstr "Cannot unescape string: ERR=%s\n" - -#: src/plugins/fd/delta-fd.c:1376 -#, c-format -msgid "" -"Can't restore %s, file already exists. Delta plugin doesn't support " -"replace=never option\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:698 src/plugins/fd/mysql-fd.c:1178 -#: src/plugins/fd/postgresql-fd.c:731 -#, fuzzy, c-format -msgid "Can't run command %s. ERR=%s\n" -msgstr "Kann Programm: %s nicht starten. ERR=%s\n" - -#: src/plugins/fd/hvplugin.c:844 -#, fuzzy, c-format -msgid "Can't create working directory %s. ERR=%s\n" -msgstr "Kann inkludierte Datei nicht öffnen: %s. ERR=%s\n" - -#: src/plugins/fd/hvplugin.c:864 -#, fuzzy, c-format -msgid "Can't delete working directory %s. ERR=%s\n" -msgstr "Kann inkludierte Datei nicht öffnen: %s. ERR=%s\n" - -#: src/plugins/fd/hvplugin.c:1007 src/plugins/fd/mysql-fd.c:1496 -#, c-format -msgid "Unknown parameter or missing argument for %s.\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:1046 -#, fuzzy, c-format -msgid "Unknown parameter for %s. Expecting block or file\n" -msgstr "unbekannt" - -#: src/plugins/fd/hvplugin.c:1051 src/plugins/fd/mysql-fd.c:1573 -#: src/plugins/fd/postgresql-fd.c:1035 -#, fuzzy, c-format -msgid "Unknown parameter %s.\n" -msgstr "unbekannt" - -#: src/plugins/fd/hvplugin.c:1217 src/plugins/fd/hvplugin.c:1231 -#: src/plugins/fd/hvplugin.c:1261 src/plugins/fd/mysql-fd.c:2813 -#: src/plugins/fd/mysql-fd.c:2841 src/plugins/fd/mysql-fd.c:3171 -#: src/plugins/fd/postgresql-fd.c:2198 src/plugins/fd/postgresql-fd.c:2220 -#: src/plugins/fd/postgresql-fd.c:2478 -msgid "Can't analyse plugin command line\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:1221 -#, fuzzy -msgid "Unable to access guest volume\n" -msgstr "Kann Konsole \"%s\" an %s:%s:%d nicht authentisieren.\n" - -#: src/plugins/fd/hvplugin.c:1238 -msgid "The hvplugin plugin doesn't support regexwhere parameter.\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:1271 -msgid "" -"The hvplugin plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=hvplugin command in the\n" -"Include {} block.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:824 -#, c-format -msgid "Found MASTER_LOG position %s:%lld for \"%s\"\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:868 -#, c-format -msgid "Unable to get MySQL version %s, might cause errors\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:961 -#, c-format -msgid "Can't reach MySQL server to get database list. ERR=%d\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1069 -#, c-format -msgid "Can't reach MySQL server to get database config. ERR=%d\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1267 src/plugins/fd/mysql-fd.c:1290 -#: src/plugins/fd/mysql-fd.c:1302 src/plugins/fd/mysql-fd.c:1356 -#: src/plugins/fd/mysql-fd.c:1669 src/plugins/fd/postgresql-fd.c:1167 -#, fuzzy, c-format -msgid "Unable to create temporary file %s. ERR=%s\n" -msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:1527 -#, c-format -msgid "Invalid argument for %s. Expecting tar or xbstream\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1531 -msgid "" -"bin_format=tar is incompatible with Incremental backup. Using xbstream " -"instead\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1547 -#, fuzzy, c-format -msgid "Can't use mode=%s in MySQL plugin\n" -msgstr "Cannot unescape string: ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:1584 -msgid "Unable to detect where my.cnf is located. Use config_file=" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1679 src/plugins/fd/postgresql-fd.c:1177 -#, fuzzy, c-format -msgid "Unable to fdopen file %s. ERR=%s\n" -msgstr "Kann Datenbank=%s.nicht öffen. ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:1774 -msgid "log_bin mysqld parameter is not suitable for Incremental backup.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1776 -msgid "Generating Full dump instead...\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2039 -#, fuzzy, c-format -msgid " Dumping database \"%s\"\n" -msgstr "Konnte Datenbank \"%s\" nicht öffen.\n" - -#: src/plugins/fd/mysql-fd.c:2181 -#, fuzzy -msgid "Unable to detect the MySQL data_directory on this system.\n" -msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:2188 -#, c-format -msgid "Configuration of log_bin=%s is not suitable for PITR backup.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2217 -#, fuzzy, c-format -msgid "Unable to determine the last binlog %s\n" -msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:2269 -#, fuzzy -msgid "Can't get server configuration.\n" -msgstr "Vorherige Konfiguration zurückgesetzt.\n" - -#: src/plugins/fd/mysql-fd.c:2290 -#, fuzzy -msgid "Unable to get the BINLOG list.\n" -msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:2375 -#, c-format -msgid "" -"Unable to read %s. ERR=%s\n" -"Check permissions and/or use config_file parameter.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2418 -#, fuzzy, c-format -msgid "Unable to determine the last LSN for %s (Previous job is %s)\n" -msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:2426 -#, c-format -msgid "Will use LSN=%s for the current backup\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2461 -#, fuzzy -msgid "Unable to detect datadir from MySQL\n" -msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:2507 -#, fuzzy -msgid "Unable to get last LSN from the backup\n" -msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:2512 -#, c-format -msgid "The current LSN is %s\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2866 -msgid "" -"The MySQL plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=mysql command in the\n" -"Include {} block.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3250 src/plugins/fd/postgresql-fd.c:2698 -msgid "replace=ifnewer/ifolder are not supported, switching to replace=never\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3294 src/plugins/fd/postgresql-fd.c:2739 -#: src/plugins/fd/postgresql-fd.c:2802 -#, c-format -msgid "" -"Database \"%s\" already exists, can't replace it when using replace=never\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3310 -#, fuzzy, c-format -msgid "Restoring target database \"%s\"\n" -msgstr "Konnte Datenbank \"%s\" nicht öffen.\n" - -#: src/plugins/fd/mysql-fd.c:3327 src/plugins/fd/postgresql-fd.c:2771 -msgid "Re-creating roles, may produce errors if roles already exist\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3335 -#, fuzzy, c-format -msgid "Creating target database \"%s\"\n" -msgstr "Konnte Datenbank \"%s\" nicht öffen.\n" - -#: src/plugins/fd/mysql-fd.c:3346 -#, fuzzy, c-format -msgid "Database \"%s\" already exists. Skipping creation.\n" -msgstr "Datenbank %s existiert nicht, bitte erzeugen.\n" - -#: src/plugins/fd/mysql-fd.c:3351 -msgid "" -"To restore all databases from a single dump file, use replace=always restore " -"option." -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3355 -msgid "" -"To restore all databases from a single dump file, use where=/ restore option." -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3358 -msgid "Restoring all databases from all-databases.sql file\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3379 -msgid "" -"bin-log should be restored separately as files using where=/a/directory and " -"applied using mysqlbinlog program and MASTER_LOG position found in the " -"restore log.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3381 -#, c-format -msgid "Skipping \"%s\".\n" -msgstr "" - -#: src/plugins/fd/ndmp-fd.c:1081 -msgid "" -"Unable to get where= argument for the restore.\n" -"Using regexwhere is unsupported with the ndmp plugin.\n" -msgstr "" - -#: src/plugins/fd/ndmp-fd.c:1105 -#, fuzzy, c-format -msgid "Unable to parse or to use plugin options, %s\n" -msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" - -#: src/plugins/fd/ndmp-fd.c:1116 -msgid "" -"The ndmp plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=ndmp command in the\n" -"Include {} block.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:608 -#, c-format -msgid "Can't reach PostgreSQL server to get database list. ERR=%d\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:662 -#, c-format -msgid "Can't reach PostgreSQL server to get database config. ERR=%d\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:982 -#, c-format -msgid "Unknown parameter or bad argument for %s.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1002 -#, fuzzy, c-format -msgid "Can't use mode=%s in postgresql plugin\n" -msgstr "Cannot unescape string: ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:1011 -#, fuzzy, c-format -msgid "Can't use service=%s in postgresql plugin ERR=%s\n" -msgstr "Cannot unescape string: ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:1030 -#, c-format -msgid "Bad compress=%s parameter expect 0-9.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1272 -#, fuzzy -msgid "Can't get cluster configuration.\n" -msgstr "Vorherige Konfiguration zurückgesetzt.\n" - -#: src/plugins/fd/postgresql-fd.c:1283 -msgid "Can't stop the current backup\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1289 src/plugins/fd/postgresql-fd.c:1297 -#, fuzzy -msgid "Can't determine the last WAL file\n" -msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:1312 src/plugins/fd/postgresql-fd.c:1919 -#, fuzzy -msgid "Can't determine WAL directory\n" -msgstr "Kann inkludierte Datei nicht öffnen: %s. ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:1319 -#, fuzzy, c-format -msgid "Can't open WAL directory %s. ERR=%s\n" -msgstr "Kann inkludierte Datei nicht öffnen: %s. ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:1861 -msgid "Your PostgreSQL version is too old for PITR mode\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1866 -#, fuzzy -msgid "Unable to detect the PostgreSQL data_directory on this system.\n" -msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:1873 -#, fuzzy, c-format -msgid "Unable to find data_directory=%s on this system. ERR=%s\n" -msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:1882 -msgid "Configuration wal_level=minimal is not suitable for PITR backup.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1892 -msgid "Configuration archive_command is not suitable for PITR backup.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1994 -#, fuzzy -msgid "Unable to start the PITR backup on this system.\n" -msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:2000 -#, fuzzy -msgid "Unable to determine the first WAL file on this system.\n" -msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:2015 -#, fuzzy, c-format -msgid "Unable to analyse tablespaces %s on this system. ERR=%s\n" -msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:2065 -#, fuzzy, c-format -msgid "Unable to analyse data_directory %s on this system. ERR=%s\n" -msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:2245 -msgid "" -"The postgresql plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=postgresql command in the\n" -"Include {} block.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:2490 -msgid "" -"You need to set PrefixLinks=Yes in your Restore job definition, or you will " -"need to fix all symlinks yourself." -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:2544 -#, c-format -msgid "Creating %s to help you starting the recovery.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:2549 -#, fuzzy, c-format -msgid "Can't create the %s file for recovery. ERR=%s\n" -msgstr "Konnte FileSet \"%s\" Eintrag nicht erzeugen. ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:2758 -msgid "" -"The destination database already exists,it might generate some harmless " -"error messages." -msgstr "" - -#: src/plugins/sd/shstore-sd.c:179 -#, fuzzy, c-format -msgid "3612 JobId=%u waiting because device %s is reserved by: %s.\n" -msgstr "unbekannt" - -#: src/plugins/sd/shstore-sd.c:435 -#, c-format -msgid "" -"3998 Bad return from storage \"%s\" command: ERR=%s.\n" -"Results=%s\n" -msgstr "" - -#: src/qt-console/bat_conf.cpp:144 -#, c-format -msgid "Console: name=%s\n" -msgstr "" - -#: src/qt-console/bat_conf.cpp:147 -#: src/qt-console/tray-monitor/tray_conf.cpp:185 -#, c-format -msgid "ConsoleFont: name=%s font face=%s\n" -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:86 -#, c-format -msgid "Already connected\"%s\".\n" -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:97 -#: src/qt-console/tray-monitor/tray-monitor.cpp:351 -#, c-format -msgid "Connecting to Director %s:%d" -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:99 -#, c-format -msgid "" -"Connecting to Director %s:%d\n" -"\n" -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:196 -#: src/qt-console/tray-monitor/tray-monitor.cpp:356 -msgid "Director daemon" -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:234 -msgid "Initializing ..." -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:250 src/qt-console/console/console.cpp:131 -msgid "Connected" -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:374 -msgid "Command completed ..." -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:381 src/qt-console/console/console.cpp:368 -msgid "Processing command ..." -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:388 -msgid "At main prompt waiting for input ..." -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:395 src/qt-console/bcomm/dircomm.cpp:405 -msgid "At prompt waiting for input ..." -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:413 -msgid "Command failed." -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:485 -msgid "Director disconnected." -msgstr "" - -#: src/qt-console/bcomm/dircomm_auth.cpp:108 -#, fuzzy, c-format -msgid "Director authorization problem at \"%s:%d\"\n" -msgstr "Authorisationsproblem: FD an \"%s:%d\" erfordert TLS.\n" - -#: src/qt-console/bcomm/dircomm_auth.cpp:115 -#, fuzzy, c-format -msgid "" -"Authorization problem: Remote server at \"%s:%d\" did not advertise required " -"TLS support.\n" -msgstr "" -"Authorisationsproblem: Entfernter Server hat benötigte TLS Unterstützung " -"nicht angeboten.\n" - -#: src/qt-console/bcomm/dircomm_auth.cpp:123 -#, fuzzy, c-format -msgid "" -"Authorization problem with Director at \"%s:%d\": Remote server requires " -"TLS.\n" -msgstr "Authorisationsproblem: Enfernter Server erfordert TLS.\n" - -#: src/qt-console/bcomm/dircomm_auth.cpp:146 -#, c-format -msgid "" -"Bad response to Hello command: ERR=%s\n" -"The Director at \"%s:%d\" is probably not running.\n" -msgstr "" - -#: src/qt-console/bcomm/dircomm_auth.cpp:174 -#, fuzzy, c-format -msgid "" -"Authorization problem with Director at \"%s:%d\"\n" -"Most likely the passwords do not agree.\n" -"If you are using TLS, there may have been a certificate validation error " -"during the TLS handshake.\n" -"For help, please see " -msgstr "" -"Kann mit File daemon on \"%s:%d\" nicht authentisieren. Mögliche Ursachen:\n" -"Passworte oder Namen nicht gleich oder\n" -"Maximum Concurrent Jobs überschritten auf dem FD oder\n" -"FD Netzwerk durcheinander (Daemon neustarten).\n" -"Für Hilfe bitte unter http://www.bacula.org/rel-manual/faq." -"html#AuthorizationErrors nachsehen.\n" - -#: src/qt-console/main.cpp:185 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s) %s %s %s\n" -"\n" -"Usage: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" -" -c set configuration file to file\n" -" -dnn set debug level to nn\n" -" -s no signals\n" -" -t test - read configuration and exit\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Version: %s (%s)\n" -"\n" -"Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c setze Konfigurationsdatei auf Datei\n" -" -dnn setze debug level auf nn\n" -" -f starte im Vordergrund (für debugging Zwecke)\n" -" -g groupid\n" -" -r starte jetzt\n" -" -s no signals\n" -" -t test - Konfiguration Lesen und beenden\n" -" -u userid\n" -" -v ausführliche Benutzer Meldungen\n" -" -? diese Meldung ausgeben.\n" -"\n" - -#: src/qt-console/tray-monitor/authenticate.cpp:76 -#, fuzzy -msgid "" -"Director authorization problem.\n" -"Most likely the passwords do not agree.\n" -"For help, please see " -msgstr "" -"Kann mit File daemon on \"%s:%d\" nicht authentisieren. Mögliche Ursachen:\n" -"Passworte oder Namen nicht gleich oder\n" -"Maximum Concurrent Jobs überschritten auf dem FD oder\n" -"FD Netzwerk durcheinander (Daemon neustarten).\n" -"Für Hilfe bitte unter http://www.bacula.org/rel-manual/faq." -"html#AuthorizationErrors nachsehen.\n" - -#: src/qt-console/tray-monitor/authenticate.cpp:126 -#, fuzzy -msgid "" -"Director and Storage daemon passwords or names not the same.\n" -"For help, please see " -msgstr "Director und Storage daemon Passworte or Namen nicht gleich.\n" - -#: src/qt-console/tray-monitor/authenticate.cpp:133 -#, c-format -msgid "bdird set configuration file to file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -t test - read configuration and exit\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Version: %s (%s)\n" -"\n" -"Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c setze Konfigurationsdatei auf Datei\n" -" -dnn setze debug level auf nn\n" -" -f starte im Vordergrund (für debugging Zwecke)\n" -" -g groupid\n" -" -r starte jetzt\n" -" -s no signals\n" -" -t test - Konfiguration Lesen und beenden\n" -" -u userid\n" -" -v ausführliche Benutzer Meldungen\n" -" -? diese Meldung ausgeben.\n" -"\n" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:208 -#, c-format -msgid "" -"Error: %d Monitor resources defined in %s. You must define one and only one " -"Monitor resource.\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:240 -#, fuzzy, c-format -msgid "" -"No Client, Storage or Director resource defined in %s\n" -"Without that I don't how to get status from the File, Storage or Director " -"Daemon :-(\n" -msgstr "" -"Keine Director resource definiert in %s\n" -"Ohne dies weiss ich nicht wer ich bin :-(\n" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:255 -#, c-format -msgid "" -"Invalid refresh interval defined in %s\n" -"This value must be greater or equal to 1 second and less or equal to 10 " -"minutes (read value: %d).\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:323 -#, c-format -msgid "Error, currentitem is not a Client or a Storage..\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:361 -#, c-format -msgid "Connecting to Client %s:%d" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:366 -msgid "File daemon" -msgstr "File daemon" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:371 -#, fuzzy, c-format -msgid "Connecting to Storage %s:%d" -msgstr "Storage daemon" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:380 -#: src/qt-console/tray-monitor/tray-monitor.cpp:410 -#, c-format -msgid "Error, currentitem is not a Client, a Storage or a Director..\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:385 -msgid "Cannot connect to daemon." -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:394 -#, c-format -msgid "Authentication error : %s" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:401 -msgid "Opened connection with Director daemon." -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:404 -msgid "Opened connection with File daemon." -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:407 -msgid "Opened connection with Storage daemon." -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:458 -msgid "Error : BNET_HARDEOF or BNET_ERROR" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:467 -msgid "Error : Connection closed." -msgstr "" - -#: src/qt-console/tray-monitor/tray_conf.cpp:167 -#, c-format -msgid "Monitor: name=%s FDtimeout=%s SDtimeout=%s\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray_conf.cpp:173 -#, c-format -msgid "Director: name=%s address=%s FDport=%d\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray_conf.cpp:177 -#, c-format -msgid "Client: name=%s address=%s FDport=%d\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray_conf.cpp:181 -#, c-format -msgid "Storage: name=%s address=%s SDport=%d\n" -msgstr "" - -#: src/stored/acquire.c:62 -#, c-format -msgid "Acquire read: num_writers=%d not zero. Job %d canceled.\n" -msgstr "" - -#: src/stored/acquire.c:71 -#, fuzzy, c-format -msgid "No volumes specified for reading. Job %s canceled.\n" -msgstr "Weder storage noch Pool in Job \"%s\" definiert.\n" - -#: src/stored/acquire.c:80 -#, c-format -msgid "Logic error: no next volume to read. Numvol=%d Curvol=%d\n" -msgstr "" - -#: src/stored/acquire.c:87 src/stored/acquire.c:164 src/stored/acquire.c:439 -#: src/stored/stored.c:614 -msgid "generate_plugin_event(bsdEventDeviceOpen) Failed\n" -msgstr "" - -#: src/stored/acquire.c:111 -#, c-format -msgid "" -"Changing read device. Want Media Type=\"%s\" have=\"%s\"\n" -" %s device=%s\n" -msgstr "" - -#: src/stored/acquire.c:159 -#, c-format -msgid "Media Type change. New read %s device %s chosen.\n" -msgstr "" - -#: src/stored/acquire.c:176 -#, c-format -msgid "No suitable device found to read Volume \"%s\"\n" -msgstr "" - -#: src/stored/acquire.c:215 -#, c-format -msgid "Job %s canceled.\n" -msgstr "" - -#: src/stored/acquire.c:233 -#, fuzzy, c-format -msgid "Read open %s device %s Volume \"%s\" failed: ERR=%s\n" -msgstr "Erzeugung von db Device Eintrag %s fehlgeschlagen: ERR=%s\n" - -#: src/stored/acquire.c:326 -#, c-format -msgid "Too many errors trying to mount %s device %s for reading.\n" -msgstr "" - -#: src/stored/acquire.c:334 -#, c-format -msgid "Ready to read from volume \"%s\" on %s device %s.\n" -msgstr "" - -#: src/stored/acquire.c:424 -#, fuzzy, c-format -msgid "Could not ready %s device %s for append.\n" -msgstr "Konnte FileSet \"%s\" Eintrag nicht erzeugen. ERR=%s\n" - -#: src/stored/acquire.c:520 src/stored/block_util.c:669 -#: src/stored/block_util.c:742 src/stored/block_util.c:772 -#: src/stored/spool.c:277 -#, c-format -msgid "Could not create JobMedia record for Volume=\"%s\" Job=%s\n" -msgstr "" - -#: src/stored/acquire.c:575 -#, c-format -msgid "Alert: %s" -msgstr "" - -#: src/stored/acquire.c:583 -#, c-format -msgid "3997 Bad alert command: %s: ERR=%s.\n" -msgstr "" - -#: src/stored/aligned_dev.c:44 src/stored/dev.c:122 src/stored/stored.c:583 -#, c-format -msgid "Could not initialize %s\n" -msgstr "" - -#: src/stored/aligned_dev.c:132 src/stored/dev.c:667 -#, fuzzy, c-format -msgid "Error closing device %s. ERR=%s.\n" -msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" - -#: src/stored/aligned_dev.c:432 src/stored/dvd.c:102 -msgid "No FreeSpace command defined.\n" -msgstr "" - -#: src/stored/aligned_dev.c:465 src/stored/dvd.c:136 -#, c-format -msgid "Cannot run free space command. Results=%s ERR=%s\n" -msgstr "" - -#: src/stored/aligned_read.c:199 -#, c-format -msgid "Record not properly reconstructed. Remainder wanted=%d got=%d\n" -msgstr "" - -#: src/stored/aligned_read.c:249 src/stored/record_read.c:177 -#, c-format -msgid "Sanity check failed. maxlen=%d datalen=%d. Block discarded.\n" -msgstr "" - -#: src/stored/ansi_label.c:82 -#, c-format -msgid "Read error on device %s in ANSI label. ERR=%s\n" -msgstr "" - -#: src/stored/ansi_label.c:92 -msgid "Insane! End of tape while reading ANSI label.\n" -msgstr "" - -#: src/stored/ansi_label.c:118 -msgid "No VOL1 label while reading ANSI/IBM label.\n" -msgstr "" - -#: src/stored/ansi_label.c:141 -#, c-format -msgid "Wanted ANSI Volume \"%s\" got \"%s\"\n" -msgstr "" - -#: src/stored/ansi_label.c:152 -msgid "No HDR1 label while reading ANSI label.\n" -msgstr "" - -#: src/stored/ansi_label.c:158 -#, c-format -msgid "ANSI/IBM Volume \"%s\" does not belong to Bacula.\n" -msgstr "" - -#: src/stored/ansi_label.c:170 -msgid "No HDR2 label while reading ANSI/IBM label.\n" -msgstr "" - -#: src/stored/ansi_label.c:185 -msgid "Unknown or bad ANSI/IBM label record.\n" -msgstr "" - -#: src/stored/ansi_label.c:193 -msgid "Too many records in while reading ANSI/IBM label.\n" -msgstr "" - -#: src/stored/ansi_label.c:293 -#, c-format -msgid "ANSI Volume label name \"%s\" longer than 6 chars.\n" -msgstr "" - -#: src/stored/ansi_label.c:319 -#, c-format -msgid "Could not write ANSI VOL1 label. Wanted size=%d got=%d ERR=%s\n" -msgstr "" - -#: src/stored/ansi_label.c:357 src/stored/ansi_label.c:386 -#, c-format -msgid "Could not write ANSI HDR1 label. ERR=%s\n" -msgstr "" - -#: src/stored/ansi_label.c:362 src/stored/ansi_label.c:393 -msgid "Could not write ANSI HDR1 label.\n" -msgstr "" - -#: src/stored/ansi_label.c:398 -#, c-format -msgid "Error writing EOF to tape. ERR=%s" -msgstr "" - -#: src/stored/ansi_label.c:403 -msgid "write_ansi_ibm_label called for non-ANSI/IBM type\n" -msgstr "" - -#: src/stored/append.c:77 -msgid "DCR is NULL!!!\n" -msgstr "" - -#: src/stored/append.c:83 -msgid "DEVICE is NULL!!!\n" -msgstr "" - -#: src/stored/append.c:94 -msgid "Unable to set network buffer size.\n" -msgstr "" - -#: src/stored/append.c:108 src/stored/append.c:118 src/stored/append.c:132 -#: src/stored/askdir.c:378 src/stored/askdir.c:379 -msgid "NULL Volume name. This shouldn't happen!!!\n" -msgstr "" - -#: src/stored/append.c:124 src/stored/btape.c:2231 -#, c-format -msgid "Write session label failed. ERR=%s\n" -msgstr "" - -#: src/stored/append.c:138 -#, c-format -msgid "Network send error to FD. ERR=%s\n" -msgstr "" - -#: src/stored/append.c:195 -#, fuzzy, c-format -msgid "Error reading data header from FD. n=%d msglen=%d ERR=%s\n" -msgstr "Fehler beim Lesen der catalog DB Steuerdatei. ERR=%s\n" - -#: src/stored/append.c:206 -#, c-format -msgid "Malformed data header from FD: %s\n" -msgstr "" - -#: src/stored/append.c:228 -#, c-format -msgid "FI=%d from FD not positive or last_FI=%d\n" -msgstr "" - -#: src/stored/append.c:353 -#, fuzzy, c-format -msgid "Network error reading from FD. ERR=%s\n" -msgstr "Netzwerkfehler mit FD bei %s: ERR=%s\n" - -#: src/stored/append.c:373 -#, fuzzy, c-format -msgid "DDE commit failed. ERR=%s\n" -msgstr "pthread_create: ERR=%s\n" - -#: src/stored/append.c:404 src/stored/append.c:431 src/stored/spool.c:266 -#: src/stored/vbackup.c:120 src/stored/vbackup.c:130 src/stored/vbackup.c:300 -#, c-format -msgid "Fatal append error on device %s: ERR=%s\n" -msgstr "" - -#: src/stored/append.c:406 src/stored/vbackup.c:122 -msgid "Set ok=FALSE after write_block_to_device.\n" -msgstr "" - -#: src/stored/append.c:418 src/stored/btape.c:2350 -#, fuzzy, c-format -msgid "Error writing end session label. ERR=%s\n" -msgstr "Fehler beim Aktualisieren der DB Media Datei. ERR=%s\n" - -#: src/stored/append.c:433 src/stored/vbackup.c:132 -#, fuzzy -msgid "Set ok=FALSE after write_final_block_to_device.\n" -msgstr "Fehler beim schreiben der bsr Datei.\n" - -#: src/stored/append.c:458 src/stored/read.c:110 src/stored/vbackup.c:155 -#, c-format -msgid "Elapsed time=%02d:%02d:%02d, Transfer rate=%s Bytes/second\n" -msgstr "" - -#: src/stored/append.c:495 -#, c-format -msgid "Error updating file attributes. ERR=%s\n" -msgstr "" - -#: src/stored/askdir.c:174 -msgid "Network error on bnet_recv in req_vol_info.\n" -msgstr "" - -#: src/stored/askdir.c:198 -#, c-format -msgid "Error getting Volume info: %s" -msgstr "" - -#: src/stored/askdir.c:433 -#, c-format -msgid "Didn't get vol info vol=%s: ERR=%s" -msgstr "" - -#: src/stored/askdir.c:531 -#, c-format -msgid "Error creating JobMedia record: ERR=%s\n" -msgstr "" - -#: src/stored/askdir.c:538 -#, c-format -msgid "Error creating JobMedia record: %s\n" -msgstr "" - -#: src/stored/askdir.c:630 -#, c-format -msgid "Job %s canceled while waiting for mount on Storage Device \"%s\".\n" -msgstr "" - -#: src/stored/askdir.c:643 -#, c-format -msgid "" -"Job %s is waiting. Cannot find any appendable volumes.\n" -"Please use the \"label\" command to create a new Volume for:\n" -" Storage: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" - -#: src/stored/askdir.c:668 src/stored/askdir.c:780 -#, c-format -msgid "Max time exceeded waiting to mount Storage Device %s for Job %s\n" -msgstr "" - -#: src/stored/askdir.c:679 -msgid "pthread error in mount_next_volume.\n" -msgstr "" - -#: src/stored/askdir.c:714 -msgid "Cannot request another volume: no volume name given.\n" -msgstr "" - -#: src/stored/askdir.c:720 -msgid "The current operation doesn't support mount request\n" -msgstr "" - -#: src/stored/askdir.c:727 -#, c-format -msgid "Job %s canceled while waiting for mount on Storage Device %s.\n" -msgstr "" - -#: src/stored/askdir.c:745 -#, c-format -msgid "" -"%sPlease mount append Volume \"%s\" or label a new one for:\n" -" Job: %s\n" -" Storage: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" - -#: src/stored/askdir.c:751 -#, c-format -msgid "" -"%sPlease mount read Volume \"%s\" for:\n" -" Job: %s\n" -" Storage: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" - -#: src/stored/askdir.c:758 -msgid "" -"\n" -"\n" -"WARNING: device is full! Please add more disk space then ...\n" -"\n" -msgstr "" - -#: src/stored/askdir.c:791 -msgid "pthread error in mount_volume\n" -msgstr "" - -#: src/stored/authenticate.c:77 -msgid "" -"Incorrect password given by Director.\n" -"For help, please see: " -msgstr "" - -#: src/stored/authenticate.c:103 -#, fuzzy, c-format -msgid "TLS negotiation failed with DIR at \"%s:%d\"\n" -msgstr "TLS Aushandlung fehlgeschlagen mit SD an \"%s:%d\"\n" - -#: src/stored/authenticate.c:121 -#, c-format -msgid "Unable to authenticate Director at %s.\n" -msgstr "" - -#: src/stored/authenticate.c:169 src/stored/authenticate.c:209 -#, c-format -msgid "" -"Incorrect authorization key from File daemon at %s rejected.\n" -"For help, please see: " -msgstr "" - -#: src/stored/authenticate.c:196 -#, fuzzy, c-format -msgid "TLS negotiation failed with FD at \"%s:%d\"\n" -msgstr "TLS Aushandlung fehlgeschlagen mit FD an \"%s:%d\".\n" - -#: src/stored/authenticate.c:277 -msgid "" -"Authorization key rejected by Storage daemon.\n" -"Please see " -msgstr "" - -#: src/stored/autochanger.c:67 -#, c-format -msgid "No Changer Name given for device %s. Cannot continue.\n" -msgstr "" - -#: src/stored/autochanger.c:73 -#, c-format -msgid "No Changer Command given for device %s. Cannot continue.\n" -msgstr "" - -#: src/stored/autochanger.c:142 -#, c-format -msgid "No slot defined in catalog (slot=%d) for Volume \"%s\" on %s.\n" -msgstr "" - -#: src/stored/autochanger.c:144 -msgid "Cartridge change or \"update slots\" may be required.\n" -msgstr "" - -#: src/stored/autochanger.c:150 -#, c-format -msgid "No \"Changer Device\" for %s. Manual load of Volume may be required.\n" -msgstr "" - -#: src/stored/autochanger.c:157 -#, c-format -msgid "No \"Changer Command\" for %s. Manual load of Volume may be requird.\n" -msgstr "" - -#: src/stored/autochanger.c:191 -#, c-format -msgid "3304 Issuing autochanger \"load slot %d, drive %d\" command.\n" -msgstr "" - -#: src/stored/autochanger.c:199 -#, c-format -msgid "3305 Autochanger \"load slot %d, drive %d\", status is OK.\n" -msgstr "" - -#: src/stored/autochanger.c:212 -#, c-format -msgid "" -"3992 Bad autochanger \"load slot %d, drive %d\": ERR=%s.\n" -"Results=%s\n" -msgstr "" - -#: src/stored/autochanger.c:275 -#, c-format -msgid "3301 Issuing autochanger \"loaded? drive %d\" command.\n" -msgstr "" - -#: src/stored/autochanger.c:287 -#, c-format -msgid "3302 Autochanger \"loaded? drive %d\", result is Slot %d.\n" -msgstr "" - -#: src/stored/autochanger.c:294 -#, c-format -msgid "3302 Autochanger \"loaded? drive %d\", result: nothing loaded.\n" -msgstr "" - -#: src/stored/autochanger.c:306 -#, c-format -msgid "" -"3991 Bad autochanger \"loaded? drive %d\" command: ERR=%s.\n" -"Results=%s\n" -msgstr "" - -#: src/stored/autochanger.c:326 -#, fuzzy, c-format -msgid "Lock failure on autochanger. ERR=%s\n" -msgstr "pthread_cond_wait: ERR=%s\n" - -#: src/stored/autochanger.c:340 -#, fuzzy, c-format -msgid "Unlock failure on autochanger. ERR=%s\n" -msgstr "pthread_cond_wait: ERR=%s\n" - -#: src/stored/autochanger.c:387 src/stored/autochanger.c:553 -#, c-format -msgid "3307 Issuing autochanger \"unload slot %d, drive %d\" command.\n" -msgstr "" - -#: src/stored/autochanger.c:400 -#, c-format -msgid "" -"3995 Bad autochanger \"unload slot %d, drive %d\": ERR=%s\n" -"Results=%s\n" -msgstr "" - -#: src/stored/autochanger.c:503 -#, c-format -msgid "Volume \"%s\" wanted on %s is in use by device %s\n" -msgstr "" - -#: src/stored/autochanger.c:570 -#, c-format -msgid "3997 Bad autochanger \"unload slot %d, drive %d\": ERR=%s.\n" -msgstr "" - -#: src/stored/autochanger.c:613 -#, c-format -msgid "3993 Device %s not an autochanger device.\n" -msgstr "" - -#: src/stored/autochanger.c:640 -#, c-format -msgid "3306 Issuing autochanger \"%s\" command.\n" -msgstr "" - -#: src/stored/autochanger.c:643 -msgid "3996 Open bpipe failed.\n" -msgstr "" - -#: src/stored/autochanger.c:670 -#, c-format -msgid "Autochanger error: ERR=%s\n" -msgstr "" - -#: src/stored/bcopy.c:62 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bcopy [-d debug_level] \n" -" -b bootstrap specify a bootstrap file\n" -" -c specify a Storage configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -i specify input Volume names (separated by |)\n" -" -o specify output Volume names (separated by |)\n" -" -p proceed inspite of errors\n" -" -v verbose\n" -" -w specify working directory (default /tmp)\n" -" -? print this message\n" -"\n" -msgstr "" -"\n" -"Version: %s (%s)\n" -"\n" -"Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c setze Konfigurationsdatei auf Datei\n" -" -dnn setze debug level auf nn\n" -" -f starte im Vordergrund (für debugging Zwecke)\n" -" -g groupid\n" -" -r starte jetzt\n" -" -s no signals\n" -" -t test - Konfiguration Lesen und beenden\n" -" -u userid\n" -" -v ausführliche Benutzer Meldungen\n" -" -? diese Meldung ausgeben.\n" -"\n" - -#: src/stored/bcopy.c:149 src/stored/bextract.c:206 src/stored/bscan.c:236 -#: src/tools/bbatch.c:176 src/tools/bvfs_test.c:189 src/tools/cats_test.c:308 -msgid "Wrong number of arguments: \n" -msgstr "" - -#: src/stored/bcopy.c:193 src/stored/btape.c:468 src/stored/device.c:338 -#, c-format -msgid "dev open failed: %s\n" -msgstr "" - -#: src/stored/bcopy.c:208 -msgid "Write of last block failed.\n" -msgstr "" - -#: src/stored/bcopy.c:212 -#, c-format -msgid "%u Jobs copied. %u records copied.\n" -msgstr "" - -#: src/stored/bcopy.c:229 src/stored/bscan.c:419 -#, c-format -msgid "Record: SessId=%u SessTim=%u FileIndex=%d Stream=%d len=%u\n" -msgstr "" - -#: src/stored/bcopy.c:245 -msgid "Volume is prelabeled. This volume cannot be copied.\n" -msgstr "" - -#: src/stored/bcopy.c:248 -msgid "Volume label not copied.\n" -msgstr "" - -#: src/stored/bcopy.c:254 -msgid "Copy skipped. Record does not match BSR filter.\n" -msgstr "" - -#: src/stored/bcopy.c:271 src/stored/bcopy.c:279 src/stored/bcopy.c:307 -#: src/stored/btape.c:2755 -#, c-format -msgid "Cannot fixup device error. %s\n" -msgstr "" - -#: src/stored/bcopy.c:285 -msgid "EOM label not copied.\n" -msgstr "" - -#: src/stored/bcopy.c:288 -msgid "EOT label not copied.\n" -msgstr "" - -#: src/stored/bcopy.c:321 src/stored/bls.c:439 src/stored/read_records.c:392 -msgid "Fresh Volume Label" -msgstr "" - -#: src/stored/bcopy.c:324 src/stored/bls.c:442 src/stored/read_records.c:395 -msgid "Volume Label" -msgstr "" - -#: src/stored/bcopy.c:328 src/stored/bls.c:446 src/stored/label.c:1332 -msgid "Begin Job Session" -msgstr "" - -#: src/stored/bcopy.c:332 src/stored/bls.c:451 src/stored/label.c:1335 -msgid "End Job Session" -msgstr "" - -#: src/stored/bcopy.c:337 src/stored/bls.c:455 -msgid "End of Medium" -msgstr "" - -#: src/stored/bcopy.c:340 src/stored/bls.c:467 src/stored/label.c:1344 -msgid "Unknown" -msgstr "" - -#: src/stored/bcopy.c:346 src/stored/bls.c:474 src/stored/read_records.c:413 -#, c-format -msgid "%s Record: VolSessionId=%d VolSessionTime=%d JobId=%d DataLen=%d\n" -msgstr "" - -#: src/stored/bcopy.c:364 src/stored/bextract.c:721 src/stored/bls.c:493 -#: src/stored/bscan.c:1359 src/stored/btape.c:3049 -#, c-format -msgid "Mount Volume \"%s\" on device %s and press return when ready: " -msgstr "" - -#: src/stored/bextract.c:80 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bextract \n" -" -b specify a bootstrap file\n" -" -c specify a Storage configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -T send debug traces to trace file\n" -" -e exclude list\n" -" -i include list\n" -" -p proceed inspite of I/O errors\n" -" -t read data from volume, do not write anything\n" -" -v verbose\n" -" -V specify Volume names (separated by |)\n" -" -? print this message\n" -"\n" -msgstr "" -"\n" -"Version: %s (%s)\n" -"\n" -"Usage: bacula-fd [-f -s] [-c config_datei] [-d debug_level]\n" -" -c benutze als Konfigurationsdatei\n" -" -dnn setze debug level auf nn\n" -" -f starte in Vordergrund (für debugging)\n" -" -g groupid\n" -" -s no signals (für debugging)\n" -" -t Konfigurationsdatei testen und beenden\n" -" -u userid\n" -" -v Ausführliche Benutzermeldungen\n" -" -? diese Meldung ausgeben.\n" -"\n" - -#: src/stored/bextract.c:156 src/stored/bls.c:143 -#, c-format -msgid "Could not open exclude file: %s, ERR=%s\n" -msgstr "" - -#: src/stored/bextract.c:171 src/stored/bls.c:158 -#, c-format -msgid "Could not open include file: %s, ERR=%s\n" -msgstr "" - -#: src/stored/bextract.c:231 -#, c-format -msgid "%d Program Name and/or Program Data Stream records ignored.\n" -msgstr "" - -#: src/stored/bextract.c:235 -#, c-format -msgid "%d Win32 data or Win32 gzip data stream records. Ignored.\n" -msgstr "" - -#: src/stored/bextract.c:263 -#, c-format -msgid "Cannot stat %s. It must exist. ERR=%s\n" -msgstr "" - -#: src/stored/bextract.c:267 -#, c-format -msgid "%s must be a directory.\n" -msgstr "" - -#: src/stored/bextract.c:296 -#, c-format -msgid "%u files restored.\n" -msgstr "" - -#: src/stored/bextract.c:298 -#, c-format -msgid "Found %s error%s\n" -msgstr "" - -#: src/stored/bextract.c:309 src/stored/bextract.c:315 -#, c-format -msgid "Write error on %s: %s\n" -msgstr "" - -#: src/stored/bextract.c:346 src/stored/read.c:163 src/stored/read.c:290 -#: src/stored/vbackup.c:265 -msgid "Cannot do rehydration, device is not dedup aware\n" -msgstr "" - -#: src/stored/bextract.c:354 -#, c-format -msgid "" -"Got rehydration error at file=%d record=%s fname=%s volsessionid=%d " -"volsessiontime=%d Msg=%s" -msgstr "" - -#: src/stored/bextract.c:388 src/stored/bextract.c:426 src/stored/bls.c:400 -#: src/stored/bscan.c:679 -msgid "Cannot continue.\n" -msgstr "" - -#: src/stored/bextract.c:419 src/stored/bextract.c:691 -msgid "Logic error output file should be open but is not.\n" -msgstr "" - -#: src/stored/bextract.c:446 -#, c-format -msgid "%s was deleted.\n" -msgstr "" - -#: src/stored/bextract.c:495 -#, c-format -msgid "Seek error on %s: %s\n" -msgstr "" - -#: src/stored/bextract.c:550 -#, c-format -msgid "Uncompression error. ERR=%d\n" -msgstr "" - -#: src/stored/bextract.c:619 -#, c-format -msgid "Compressed header version error. version=0x%x\n" -msgstr "" - -#: src/stored/bextract.c:648 -#, fuzzy, c-format -msgid "LZO uncompression error. ERR=%d\n" -msgstr "Regex Übersetzungsfehler. ERR=%s\n" - -#: src/stored/bextract.c:682 -msgid "Got Program Name or Data Stream. Ignored.\n" -msgstr "" - -#: src/stored/block.c:100 -#, fuzzy -msgid "Error writing final JobMedia record to catalog.\n" -msgstr "Fehler beim schreiben der bsr Datei.\n" - -#: src/stored/block.c:148 -#, c-format -msgid "Cannot write block. Device at EOM. dev=%s\n" -msgstr "" - -#: src/stored/block.c:153 -#, c-format -msgid "Attempt to write on read-only Volume. dev=%s\n" -msgstr "" - -#: src/stored/block.c:159 -#, c-format -msgid "Attempt to write on closed device=%s\n" -msgstr "" - -#: src/stored/block.c:198 -#, c-format -msgid "Unable to write EOF. ERR=%s\n" -msgstr "" - -#: src/stored/block.c:234 src/stored/block.c:292 -msgid "Write block header zeroed.\n" -msgstr "" - -#: src/stored/block.c:284 -#, c-format -msgid "Block checksum changed during write: before=%ud after=%ud\n" -msgstr "" - -#: src/stored/block.c:311 -#, c-format -msgid "Write error at %u:%u on device %s. ERR=%s.\n" -msgstr "" - -#: src/stored/block.c:321 -#, c-format -msgid "" -"Out of freespace caused End of Volume \"%s\" at %u:%u on device %s. Write of " -"%u bytes got %d.\n" -msgstr "" - -#: src/stored/block.c:326 -#, c-format -msgid "End of Volume \"%s\" at %u:%u on device %s. Write of %u bytes got %d.\n" -msgstr "" - -#: src/stored/block.c:456 -#, fuzzy -msgid "Job failed or canceled.\n" -msgstr "%s Abgebrochen" - -#: src/stored/block.c:462 -msgid "Attempt to read past end of tape or file.\n" -msgstr "" - -#: src/stored/block.c:470 -#, c-format -msgid "Attempt to read closed device: fd=%d at file:blk %u:%u on device %s\n" -msgstr "" - -#: src/stored/block.c:483 -#, c-format -msgid "Block buffer size looping problem on device %s\n" -msgstr "" - -#: src/stored/block.c:498 -#, c-format -msgid "Unable to open device part=%d %s: ERR=%s\n" -msgstr "" - -#: src/stored/block.c:534 -#, fuzzy, c-format -msgid "The Volume=%s on device=%s appears to be unlabeled.\n" -msgstr "Neues Volume \"%s\" in catalog erzeugt.\n" - -#: src/stored/block.c:537 -#, c-format -msgid "Read error on fd=%d at file:blk %u:%u on device %s. ERR=%s.\n" -msgstr "" - -#: src/stored/block.c:548 -#, c-format -msgid "The %sVolume=%s on device=%s appears to be unlabeled.\n" -msgstr "" - -#: src/stored/block.c:551 -#, c-format -msgid "Read zero %sbytes Vol=%s at %lld on device %s.\n" -msgstr "" - -#: src/stored/block.c:585 -#, c-format -msgid "" -"Volume data error at %u:%u! Very short block of %d bytes on device %s " -"discarded.\n" -msgstr "" - -#: src/stored/block.c:613 -#, c-format -msgid "Block length %u is greater than buffer %u. Attempting recovery.\n" -msgstr "" - -#: src/stored/block.c:633 -#, c-format -msgid "Setting block buffer size to %u bytes.\n" -msgstr "" - -#: src/stored/block.c:648 -#, c-format -msgid "" -"Volume data error at %u:%u! Short block of %d bytes on device %s discarded.\n" -msgstr "" - -#: src/stored/block_util.c:93 -#, c-format -msgid "" -"Dump block %s %p: adata=%d size=%d BlkNum=%d\n" -" Hdrcksum=%x cksum=%x\n" -msgstr "" - -#: src/stored/block_util.c:118 -#, c-format -msgid " Rec: VId=%u VT=%u FI=%s Strm=%s len=%d reclen=%d\n" -msgstr "" - -#: src/stored/block_util.c:203 -#, c-format -msgid "%d block read errors not printed.\n" -msgstr "" - -#: src/stored/block_util.c:341 -#, c-format -msgid "" -"Volume data error at %lld!\n" -"Adata block checksum mismatch in block=%u len=%d: calc=%x blk=%x\n" -msgstr "" - -#: src/stored/block_util.c:376 src/stored/block_util.c:394 -#: src/stored/block_util.c:404 -#, c-format -msgid "" -"Volume data error at %u:%u! Wanted ID: \"%s\", got \"%s\". Buffer " -"discarded.\n" -msgstr "" - -#: src/stored/block_util.c:419 -#, c-format -msgid "" -"Volume data error at %u:%u! Block length %u is insane (too large), probably " -"due to a bad archive.\n" -msgstr "" - -#: src/stored/block_util.c:446 -#, c-format -msgid "" -"Volume data error at %u:%u!\n" -"Block checksum mismatch in block=%u len=%d: calc=%x blk=%x\n" -msgstr "" - -#: src/stored/block_util.c:542 -#, fuzzy, c-format -msgid "" -"User defined maximum volume size %s will be exceeded on device %s.\n" -" Marking Volume \"%s\" as Full.\n" -msgstr "\"Max Volume bytes\"erreicht. Markiere Volume \"%s\" als Voll.\n" - -#: src/stored/block_util.c:579 src/stored/block_util.c:585 -#, c-format -msgid "Backspace file at EOT failed. ERR=%s\n" -msgstr "" - -#: src/stored/block_util.c:592 -#, c-format -msgid "Backspace record at EOT failed. ERR=%s\n" -msgstr "" - -#: src/stored/block_util.c:609 -#, c-format -msgid "Re-read last block at EOT failed. ERR=%s" -msgstr "" - -#: src/stored/block_util.c:619 -#, c-format -msgid "" -"Re-read of last block: block numbers differ by more than one.\n" -"Probable tape misconfiguration and data loss. Read block=%u Want block=%u.\n" -msgstr "" - -#: src/stored/block_util.c:624 -#, c-format -msgid "" -"Re-read of last block OK, but block numbers differ. Read block=%u Want block=" -"%u.\n" -msgstr "" - -#: src/stored/block_util.c:628 -msgid "Re-read of last block succeeded.\n" -msgstr "" - -#: src/stored/block_util.c:677 -#, c-format -msgid "" -"Error writing final EOF to tape. This Volume may not be readable.\n" -"%s" -msgstr "" - -#: src/stored/block_util.c:695 -#, fuzzy -msgid "Error sending Volume info to Director.\n" -msgstr "Keine Volumes zum Wiederherstellen gefunden.\n" - -#: src/stored/block_util.c:815 -#, c-format -msgid "" -"Error while writing, current part number is less than the total number of " -"parts (%d/%d, device=%s)\n" -msgstr "" - -#: src/stored/block_util.c:823 -#, c-format -msgid "Unable to open device next part %s: ERR=%s\n" -msgstr "" - -#: src/stored/block_util.c:843 -#, c-format -msgid "" -"End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, " -"free_space_errno=%d, errmsg=%s).\n" -msgstr "" - -#: src/stored/block_util.c:856 -#, c-format -msgid "" -"End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, " -"free_space_errno=%d).\n" -msgstr "" - -#: src/stored/bls.c:68 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bls [options] \n" -" -b specify a bootstrap file\n" -" -c specify a Storage configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -e exclude list\n" -" -i include list\n" -" -j list jobs\n" -" -k list blocks\n" -" (no j or k option) list saved files\n" -" -L dump label\n" -" -p proceed inspite of errors\n" -" -v be verbose\n" -" -V specify Volume names (separated by |)\n" -" -E Check records to detect errors\n" -" -? print this message\n" -"\n" -msgstr "" -"\n" -"Version: %s (%s)\n" -"\n" -"Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c setze Konfigurationsdatei auf Datei\n" -" -dnn setze debug level auf nn\n" -" -f starte im Vordergrund (für debugging Zwecke)\n" -" -g groupid\n" -" -r starte jetzt\n" -" -s no signals\n" -" -t test - Konfiguration Lesen und beenden\n" -" -u userid\n" -" -v ausführliche Benutzer Meldungen\n" -" -? diese Meldung ausgeben.\n" -"\n" - -#: src/stored/bls.c:205 -msgid "No archive name specified\n" -msgstr "" - -#: src/stored/bls.c:244 -#, c-format -msgid "" -"\n" -"Warning, this Volume is a continuation of Volume %s\n" -msgstr "" - -#: src/stored/bls.c:291 -#, c-format -msgid "Got EOM at file %u on device %s, Volume \"%s\"\n" -msgstr "" - -#: src/stored/bls.c:302 -#, c-format -msgid "Mounted Volume \"%s\".\n" -msgstr "" - -#: src/stored/bls.c:304 -#, c-format -msgid "End of file %u on device %s, Volume \"%s\"\n" -msgstr "" - -#: src/stored/bls.c:329 -#, c-format -msgid "" -"File:blk=%u:%u blk_num=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=" -"%s rlen=%d\n" -msgstr "" - -#: src/stored/bls.c:338 -#, c-format -msgid "Block: %d size=%d\n" -msgstr "" - -#: src/stored/bls.c:402 -msgid "Attrib unpack error!\n" -msgstr "" - -#: src/stored/bls.c:413 -#, c-format -msgid "FileIndex=%d VolSessionId=%d VolSessionTime=%d Stream=%d DataLen=%d\n" -msgstr "" - -#: src/stored/bls.c:458 -msgid "End of Physical Medium" -msgstr "" - -#: src/stored/bls.c:461 -msgid "Start of object" -msgstr "" - -#: src/stored/bls.c:464 -msgid "End of object" -msgstr "" - -#: src/stored/bscan.c:105 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bscan [ options ] \n" -" -b bootstrap specify a bootstrap file\n" -" -c specify configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -m update media info in database\n" -" -D specify the driver database name (default NULL)\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database password (default none)\n" -" -h specify database host (default NULL)\n" -" -t specify database port (default 0)\n" -" -p proceed inspite of I/O errors\n" -" -r list records\n" -" -s synchronize or store in database\n" -" -S show scan progress periodically\n" -" -v verbose\n" -" -V specify Volume names (separated by |)\n" -" -w specify working directory (default from conf file)\n" -" -? print this message\n" -"\n" -msgstr "" -"\n" -"Version: %s (%s)\n" -"\n" -"Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c setze Konfigurationsdatei auf Datei\n" -" -dnn setze debug level auf nn\n" -" -f starte im Vordergrund (für debugging Zwecke)\n" -" -g groupid\n" -" -r starte jetzt\n" -" -s no signals\n" -" -t test - Konfiguration Lesen und beenden\n" -" -u userid\n" -" -v ausführliche Benutzer Meldungen\n" -" -? diese Meldung ausgeben.\n" -"\n" - -#: src/stored/bscan.c:254 src/stored/bsdjson.c:481 src/stored/stored.c:349 -#, c-format -msgid "No Working Directory defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bscan.c:262 -#, c-format -msgid "Working Directory: %s not found. Cannot continue.\n" -msgstr "" - -#: src/stored/bscan.c:266 -#, c-format -msgid "Working Directory: %s is not a directory. Cannot continue.\n" -msgstr "" - -#: src/stored/bscan.c:280 src/stored/bscan.c:363 -#, c-format -msgid "First Volume Size = %s\n" -msgstr "" - -#: src/stored/bscan.c:299 src/tools/bbatch.c:243 src/tools/bvfs_test.c:212 -#, c-format -msgid "Using Database: %s, User: %s\n" -msgstr "" - -#: src/stored/bscan.c:334 -#, c-format -msgid "Create JobMedia for Job %s\n" -msgstr "" - -#: src/stored/bscan.c:344 -#, c-format -msgid "Could not create JobMedia record for Volume=%s Job=%s\n" -msgstr "" - -#: src/stored/bscan.c:411 -#, c-format -msgid "done: %d%%\n" -msgstr "" - -#: src/stored/bscan.c:435 -msgid "Volume is prelabeled. This tape cannot be scanned.\n" -msgstr "" - -#: src/stored/bscan.c:447 -#, c-format -msgid "Pool record for %s found in DB.\n" -msgstr "" - -#: src/stored/bscan.c:451 -#, c-format -msgid "VOL_LABEL: Pool record not found for Pool: %s\n" -msgstr "" - -#: src/stored/bscan.c:457 -#, c-format -msgid "VOL_LABEL: PoolType mismatch. DB=%s Vol=%s\n" -msgstr "" - -#: src/stored/bscan.c:461 -#, c-format -msgid "Pool type \"%s\" is OK.\n" -msgstr "" - -#: src/stored/bscan.c:471 -#, c-format -msgid "Media record for %s found in DB.\n" -msgstr "" - -#: src/stored/bscan.c:478 -#, c-format -msgid "VOL_LABEL: Media record not found for Volume: %s\n" -msgstr "" - -#: src/stored/bscan.c:485 -#, c-format -msgid "VOL_LABEL: MediaType mismatch. DB=%s Vol=%s\n" -msgstr "" - -#: src/stored/bscan.c:489 -#, c-format -msgid "Media type \"%s\" is OK.\n" -msgstr "" - -#: src/stored/bscan.c:499 -#, c-format -msgid "VOL_LABEL: OK for Volume: %s\n" -msgstr "" - -#: src/stored/bscan.c:506 -#, c-format -msgid "%d \"errors\" ignored before first Start of Session record.\n" -msgstr "" - -#: src/stored/bscan.c:517 -#, c-format -msgid "SOS_LABEL: Found Job record for JobId: %d\n" -msgstr "" - -#: src/stored/bscan.c:522 -#, c-format -msgid "SOS_LABEL: Job record not found for JobId: %d\n" -msgstr "" - -#: src/stored/bscan.c:562 -#, c-format -msgid "SOS_LABEL: VolSessId mismatch for JobId=%u. DB=%d Vol=%d\n" -msgstr "" - -#: src/stored/bscan.c:568 -#, c-format -msgid "SOS_LABEL: VolSessTime mismatch for JobId=%u. DB=%d Vol=%d\n" -msgstr "" - -#: src/stored/bscan.c:574 -#, c-format -msgid "SOS_LABEL: PoolId mismatch for JobId=%u. DB=%d Vol=%d\n" -msgstr "" - -#: src/stored/bscan.c:592 src/stored/bscan.c:1146 -#, c-format -msgid "Could not find SessId=%d SessTime=%d for EOS record.\n" -msgstr "" - -#: src/stored/bscan.c:638 -#, c-format -msgid "Could not update job record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:649 -#, c-format -msgid "End of all Volumes. VolFiles=%u VolBlocks=%u VolBytes=%s\n" -msgstr "" - -#: src/stored/bscan.c:661 -#, c-format -msgid "Could not find Job for SessId=%d SessTime=%d record.\n" -msgstr "" - -#: src/stored/bscan.c:692 -#, c-format -msgid "%s file records. At file:blk=%s:%s bytes=%s\n" -msgstr "" - -#: src/stored/bscan.c:757 -#, c-format -msgid "Got MD5 record: %s\n" -msgstr "" - -#: src/stored/bscan.c:765 -#, c-format -msgid "Got SHA1 record: %s\n" -msgstr "" - -#: src/stored/bscan.c:773 -#, c-format -msgid "Got SHA256 record: %s\n" -msgstr "" - -#: src/stored/bscan.c:781 -#, c-format -msgid "Got SHA512 record: %s\n" -msgstr "" - -#: src/stored/bscan.c:789 src/stored/bscan.c:796 -msgid "Got signed digest record\n" -msgstr "" - -#: src/stored/bscan.c:802 -#, c-format -msgid "Got Prog Names Stream: %s\n" -msgstr "" - -#: src/stored/bscan.c:808 -msgid "Got Prog Data Stream record.\n" -msgstr "" - -#: src/stored/bscan.c:853 -#, c-format -msgid "Unknown stream type!!! stream=%d len=%i\n" -msgstr "" - -#: src/stored/bscan.c:915 -#, c-format -msgid "Could not create File Attributes record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:921 -#, c-format -msgid "Created File record: %s\n" -msgstr "" - -#: src/stored/bscan.c:966 -#, c-format -msgid "Could not create media record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:970 src/stored/bscan.c:991 -#, c-format -msgid "Could not update media record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:974 -#, c-format -msgid "Created Media record for Volume: %s\n" -msgstr "" - -#: src/stored/bscan.c:995 -#, c-format -msgid "Updated Media record at end of Volume: %s\n" -msgstr "" - -#: src/stored/bscan.c:1012 -#, c-format -msgid "Could not create pool record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1016 -#, c-format -msgid "Created Pool record for Pool: %s\n" -msgstr "" - -#: src/stored/bscan.c:1035 -#, fuzzy, c-format -msgid "Could not get Client record. ERR=%s\n" -msgstr "Konnte Client Eintrag nicht anlegen. ERR=%s\n" - -#: src/stored/bscan.c:1045 -#, c-format -msgid "Created Client record for Client: %s\n" -msgstr "" - -#: src/stored/bscan.c:1062 -#, c-format -msgid "Fileset \"%s\" already exists.\n" -msgstr "" - -#: src/stored/bscan.c:1066 -#, c-format -msgid "Could not create FileSet record \"%s\". ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1071 -#, c-format -msgid "Created FileSet record \"%s\"\n" -msgstr "" - -#: src/stored/bscan.c:1118 -#, c-format -msgid "Could not create JobId record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1124 -#, c-format -msgid "Could not update job start record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1127 -#, c-format -msgid "Created new JobId=%u record for original JobId=%u\n" -msgstr "" - -#: src/stored/bscan.c:1180 -#, c-format -msgid "Could not update JobId=%u record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1185 -#, c-format -msgid "Updated Job termination record for JobId=%u Level=%s TermStat=%c\n" -msgstr "" - -#: src/stored/bscan.c:1210 -#, c-format -msgid "Job Termination code: %d" -msgstr "" - -#: src/stored/bscan.c:1215 -#, c-format -msgid "" -"%s\n" -"JobId: %d\n" -"Job: %s\n" -"FileSet: %s\n" -"Backup Level: %s\n" -"Client: %s\n" -"Start time: %s\n" -"End time: %s\n" -"Files Written: %s\n" -"Bytes Written: %s\n" -"Volume Session Id: %d\n" -"Volume Session Time: %d\n" -"Last Volume Bytes: %s\n" -"Termination: %s\n" -"\n" -msgstr "" - -#: src/stored/bscan.c:1273 -#, c-format -msgid "Could not create JobMedia record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1277 -#, c-format -msgid "Created JobMedia record JobId %d, MediaId %d\n" -msgstr "" - -#: src/stored/bscan.c:1293 -#, c-format -msgid "Could not find SessId=%d SessTime=%d for MD5/SHA1 record.\n" -msgstr "" - -#: src/stored/bscan.c:1307 -#, c-format -msgid "Could not add MD5/SHA1 to File record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1312 -msgid "Updated MD5/SHA1 record\n" -msgstr "" - -#: src/stored/bsdjson.c:74 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bsdjson [options] [-c config_file] [config_file]\n" -" -r get resource type \n" -" -n get resource \n" -" -l get only directives matching dirs (use with -r)\n" -" -D get only data\n" -" -c use as configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -t test - read config and exit\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Version: %s (%s)\n" -"\n" -"Usage: bacula-fd [-f -s] [-c config_datei] [-d debug_level]\n" -" -c benutze als Konfigurationsdatei\n" -" -dnn setze debug level auf nn\n" -" -f starte in Vordergrund (für debugging)\n" -" -g groupid\n" -" -s no signals (für debugging)\n" -" -t Konfigurationsdatei testen und beenden\n" -" -u userid\n" -" -v Ausführliche Benutzermeldungen\n" -" -? diese Meldung ausgeben.\n" -"\n" - -#: src/stored/bsdjson.c:450 src/stored/butil.c:78 src/stored/stored.c:318 -#, c-format -msgid "No Storage resource defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bsdjson.c:456 src/stored/stored.c:324 -#, c-format -msgid "Only one Storage resource permitted in %s\n" -msgstr "" - -#: src/stored/bsdjson.c:461 src/stored/stored.c:329 -#, c-format -msgid "No Director resource defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bsdjson.c:466 src/stored/stored.c:334 -#, c-format -msgid "No Device resource defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bsdjson.c:474 src/stored/stored.c:342 -#, c-format -msgid "No Messages resource defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bsdjson.c:503 src/stored/stored.c:371 -#, c-format -msgid "\"TLS Certificate\" file not defined for Storage \"%s\" in %s.\n" -msgstr "" - -#: src/stored/bsdjson.c:509 src/stored/stored.c:377 -#, c-format -msgid "\"TLS Key\" file not defined for Storage \"%s\" in %s.\n" -msgstr "" - -#: src/stored/bsdjson.c:515 src/stored/stored.c:383 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Storage \"%s\" in %s. At least one CA certificate store is required when " -"using \"TLS Verify Peer\".\n" -msgstr "" - -#: src/stored/btape.c:165 src/stored/stored.c:132 -#, c-format -msgid "Tape block size (%d) not multiple of system size (%d)\n" -msgstr "" - -#: src/stored/btape.c:169 src/stored/stored.c:136 -#, c-format -msgid "Tape block size (%d) is not a power of 2\n" -msgstr "" - -#: src/stored/btape.c:172 -#, c-format -msgid "" -"\n" -"\n" -"!!!! Warning large disk addressing disabled. boffset_t=%d should be 8 or " -"more !!!!!\n" -"\n" -"\n" -msgstr "" - -#: src/stored/btape.c:179 -#, c-format -msgid "32 bit printf/scanf problem. i=%d x32=%u y32=%u\n" -msgstr "" - -#: src/stored/btape.c:188 -msgid "64 bit printf/scanf problem. i=%d x64=%" -msgstr "" - -#: src/stored/btape.c:193 -#, c-format -msgid "Tape block granularity is %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:269 -msgid "No archive name specified.\n" -msgstr "" - -#: src/stored/btape.c:273 -msgid "Improper number of arguments specified.\n" -msgstr "" - -#: src/stored/btape.c:287 -msgid "btape does not work with DVD storage.\n" -msgstr "" - -#: src/stored/btape.c:292 -msgid "btape only works with tape storage.\n" -msgstr "" - -#: src/stored/btape.c:378 -#, c-format -msgid "Total Volume bytes=%sB. Total Write rate = %sB/s\n" -msgstr "" - -#: src/stored/btape.c:404 -#, c-format -msgid "Volume bytes=%sB. Write rate = %sB/s\n" -msgstr "" - -#: src/stored/btape.c:472 -#, c-format -msgid "open device %s: OK\n" -msgstr "" - -#: src/stored/btape.c:495 -msgid "Enter Volume Name: " -msgstr "" - -#: src/stored/btape.c:502 -#, c-format -msgid "Device open failed. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:507 -#, c-format -msgid "Wrote Volume label for volume \"%s\".\n" -msgstr "" - -#: src/stored/btape.c:521 -msgid "Volume has no label.\n" -msgstr "" - -#: src/stored/btape.c:524 -msgid "Volume label read correctly.\n" -msgstr "" - -#: src/stored/btape.c:527 -#, c-format -msgid "I/O error on device: ERR=%s" -msgstr "" - -#: src/stored/btape.c:530 -#, fuzzy, c-format -msgid "Volume type error: ERR=%s\n" -msgstr "Attribute create error. %s" - -#: src/stored/btape.c:533 -msgid "Volume name error\n" -msgstr "" - -#: src/stored/btape.c:536 -#, c-format -msgid "Error creating label. ERR=%s" -msgstr "" - -#: src/stored/btape.c:539 -msgid "Volume version error.\n" -msgstr "" - -#: src/stored/btape.c:542 -msgid "Bad Volume label type.\n" -msgstr "" - -#: src/stored/btape.c:545 -msgid "Unknown error.\n" -msgstr "" - -#: src/stored/btape.c:563 -#, c-format -msgid "Bad status from load. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:565 -#, c-format -msgid "Loaded %s\n" -msgstr "" - -#: src/stored/btape.c:574 src/stored/btape.c:1137 src/stored/btape.c:1210 -#: src/stored/btape.c:1289 src/stored/btape.c:1559 -#, c-format -msgid "Bad status from rewind. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:577 src/stored/btape.c:1567 -#, c-format -msgid "Rewound %s\n" -msgstr "" - -#: src/stored/btape.c:603 src/stored/btape.c:1571 -#, c-format -msgid "Bad status from weof. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:607 -#, c-format -msgid "Wrote 1 EOF to %s\n" -msgstr "" - -#: src/stored/btape.c:610 -#, c-format -msgid "Wrote %d EOFs to %s\n" -msgstr "" - -#: src/stored/btape.c:628 -msgid "Moved to end of medium.\n" -msgstr "" - -#: src/stored/btape.c:655 -#, c-format -msgid "Bad status from bsf. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:657 -#, c-format -msgid "Backspaced %d file%s.\n" -msgstr "" - -#: src/stored/btape.c:674 -#, c-format -msgid "Bad status from bsr. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:676 -#, c-format -msgid "Backspaced %d record%s.\n" -msgstr "" - -#: src/stored/btape.c:686 src/stored/status.c:626 -#, c-format -msgid "Configured device capabilities:\n" -msgstr "" - -#: src/stored/btape.c:704 -#, c-format -msgid "Device status:\n" -msgstr "" - -#: src/stored/btape.c:718 src/stored/status.c:682 -#, c-format -msgid "Device parameters:\n" -msgstr "" - -#: src/stored/btape.c:723 -#, c-format -msgid "Status:\n" -msgstr "" - -#: src/stored/btape.c:738 -msgid "" -"Test writing larger and larger records.\n" -"This is a torture test for records.\n" -"I am going to write\n" -"larger and larger records. It will stop when the record size\n" -"plus the header exceeds the block size (by default about 64K)\n" -msgstr "" - -#: src/stored/btape.c:744 -msgid "Do you want to continue? (y/n): " -msgstr "" - -#: src/stored/btape.c:746 src/stored/btape.c:2196 -msgid "Command aborted.\n" -msgstr "" - -#: src/stored/btape.c:763 -#, c-format -msgid "Block %d i=%d\n" -msgstr "" - -#: src/stored/btape.c:790 -msgid "Skipping read backwards test because BSR turned off.\n" -msgstr "" - -#: src/stored/btape.c:794 -msgid "" -"\n" -"=== Write, backup, and re-read test ===\n" -"\n" -"I'm going to write three records and an EOF\n" -"then backup over the EOF and re-read the last record.\n" -"Bacula does this after writing the last block on the\n" -"tape to verify that the block was written correctly.\n" -"\n" -"This is not an *essential* feature ...\n" -"\n" -msgstr "" - -#: src/stored/btape.c:807 src/stored/btape.c:818 src/stored/btape.c:829 -#: src/stored/btape.c:1147 src/stored/btape.c:1163 src/stored/btape.c:1903 -#: src/stored/btape.c:2822 -msgid "Error writing record to block.\n" -msgstr "" - -#: src/stored/btape.c:811 src/stored/btape.c:822 src/stored/btape.c:833 -#: src/stored/btape.c:1151 src/stored/btape.c:1167 src/stored/btape.c:1907 -#: src/stored/btape.c:2826 -msgid "Error writing block to device.\n" -msgstr "" - -#: src/stored/btape.c:814 -#, c-format -msgid "Wrote first record of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:825 -#, c-format -msgid "Wrote second record of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:836 -#, c-format -msgid "Wrote third record of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:843 src/stored/btape.c:848 -#, c-format -msgid "Backspace file failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:852 -msgid "Backspaced over EOF OK.\n" -msgstr "" - -#: src/stored/btape.c:854 -#, c-format -msgid "Backspace record failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:857 -msgid "Backspace record OK.\n" -msgstr "" - -#: src/stored/btape.c:859 src/stored/btape.c:865 -#, c-format -msgid "Read block failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:870 -msgid "Bad data in record. Test failed!\n" -msgstr "" - -#: src/stored/btape.c:874 -msgid "" -"\n" -"Block re-read correct. Test succeeded!\n" -msgstr "" - -#: src/stored/btape.c:875 -msgid "" -"=== End Write, backup, and re-read test ===\n" -"\n" -msgstr "" - -#: src/stored/btape.c:882 -msgid "" -"This is not terribly serious since Bacula only uses\n" -"this function to verify the last block written to the\n" -"tape. Bacula will skip the last block verification\n" -"if you add:\n" -"\n" -"Backward Space Record = No\n" -"\n" -"to your Storage daemon's Device resource definition.\n" -msgstr "" - -#: src/stored/btape.c:904 -#, c-format -msgid "Begin writing %i files of %sB with raw blocks of %u bytes.\n" -msgstr "" - -#: src/stored/btape.c:925 src/stored/btape.c:2878 -#, c-format -msgid "Write failed at block %u. stat=%d ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:959 -#, c-format -msgid "Begin writing %i files of %sB with blocks of %u bytes.\n" -msgstr "" - -#: src/stored/btape.c:968 -#, fuzzy -msgid "" -"\n" -"Error writing record to block.\n" -msgstr "Fehler beim schreiben der bsr Datei.\n" - -#: src/stored/btape.c:972 -#, fuzzy -msgid "" -"\n" -"Error writing block to device.\n" -msgstr "Fehler beim schreiben der bsr Datei.\n" - -#: src/stored/btape.c:1027 -msgid "The file_size is too big, stop this test with Ctrl-c.\n" -msgstr "" - -#: src/stored/btape.c:1055 -msgid "Test with zero data, should give the maximum throughput.\n" -msgstr "" - -#: src/stored/btape.c:1067 src/stored/btape.c:1093 -msgid "Test with random data, should give the minimum throughput.\n" -msgstr "" - -#: src/stored/btape.c:1082 -msgid "Test with zero data and bacula block structure.\n" -msgstr "" - -#: src/stored/btape.c:1123 -#, c-format -msgid "" -"\n" -"=== Write, rewind, and re-read test ===\n" -"\n" -"I'm going to write %d records and an EOF\n" -"then write %d records and an EOF, then rewind,\n" -"and re-read the data to verify that it is correct.\n" -"\n" -"This is an *essential* feature ...\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1155 src/stored/btape.c:1171 -#, c-format -msgid "Wrote %d blocks of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:1213 src/stored/btape.c:1292 -msgid "Rewind OK.\n" -msgstr "" - -#: src/stored/btape.c:1225 src/stored/btape.c:1343 -msgid "Got EOF on tape.\n" -msgstr "" - -#: src/stored/btape.c:1230 -#, c-format -msgid "Read block %d failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1236 -#, c-format -msgid "Read record failed. Block %d! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1242 src/stored/btape.c:1373 -#, c-format -msgid "Bad data in record. Expected %d, got %d at byte %d. Test failed!\n" -msgstr "" - -#: src/stored/btape.c:1249 -#, c-format -msgid "%d blocks re-read correctly.\n" -msgstr "" - -#: src/stored/btape.c:1252 src/stored/btape.c:1380 -msgid "" -"=== Test Succeeded. End Write, rewind, and re-read test ===\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1280 -msgid "Block position test\n" -msgstr "" - -#: src/stored/btape.c:1335 -#, c-format -msgid "Reposition to file:block %d:%d\n" -msgstr "" - -#: src/stored/btape.c:1337 -msgid "Reposition error.\n" -msgstr "" - -#: src/stored/btape.c:1349 -#, c-format -msgid "" -"Read block %d failed! file=%d blk=%d. ERR=%s\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1351 -msgid "" -"This may be because the tape drive block size is not\n" -" set to variable blocking as normally used by Bacula.\n" -" Please see the Tape Testing chapter in the manual and \n" -" look for using mt with defblksize and setoptions\n" -"If your tape drive block size is correct, then perhaps\n" -" your SCSI driver is *really* stupid and does not\n" -" correctly report the file:block after a FSF. In this\n" -" case try setting:\n" -" Fast Forward Space File = no\n" -" in your Device resource.\n" -msgstr "" - -#: src/stored/btape.c:1367 -#, c-format -msgid "Read record failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1378 -#, c-format -msgid "Block %d re-read correctly.\n" -msgstr "" - -#: src/stored/btape.c:1399 -msgid "" -"\n" -"\n" -"=== Append files test ===\n" -"\n" -"This test is essential to Bacula.\n" -"\n" -"I'm going to write one record in file 0,\n" -" two records in file 1,\n" -" and three records in file 2\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1423 -msgid "Now moving to end of medium.\n" -msgstr "" - -#: src/stored/btape.c:1425 src/stored/btape.c:1654 -#, c-format -msgid "We should be in file 3. I am at file %d. %s\n" -msgstr "" - -#: src/stored/btape.c:1426 src/stored/btape.c:1444 src/stored/btape.c:1643 -#: src/stored/btape.c:1655 src/stored/btape.c:1668 src/stored/btape.c:1685 -msgid "This is correct!" -msgstr "" - -#: src/stored/btape.c:1426 src/stored/btape.c:1444 src/stored/btape.c:1643 -#: src/stored/btape.c:1655 src/stored/btape.c:1668 src/stored/btape.c:1685 -msgid "This is NOT correct!!!!" -msgstr "" - -#: src/stored/btape.c:1432 -msgid "" -"\n" -"Now the important part, I am going to attempt to append to the tape.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1439 -msgid "" -"Done appending, there should be no I/O errors\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1440 -msgid "Doing Bacula scan of blocks:\n" -msgstr "" - -#: src/stored/btape.c:1442 -msgid "End scanning the tape.\n" -msgstr "" - -#: src/stored/btape.c:1443 src/stored/btape.c:1667 -#, c-format -msgid "We should be in file 4. I am at file %d. %s\n" -msgstr "" - -#: src/stored/btape.c:1468 -msgid "" -"\n" -"Autochanger enabled, but no name or no command device specified.\n" -msgstr "" - -#: src/stored/btape.c:1472 -msgid "" -"\n" -"Ah, I see you have an autochanger configured.\n" -"To test the autochanger you must have a blank tape\n" -" that I can write on in Slot 1.\n" -msgstr "" - -#: src/stored/btape.c:1475 -msgid "" -"\n" -"Do you wish to continue with the Autochanger test? (y/n): " -msgstr "" - -#: src/stored/btape.c:1482 -msgid "" -"\n" -"\n" -"=== Autochanger test ===\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1491 -msgid "3301 Issuing autochanger \"loaded\" command.\n" -msgstr "" - -#: src/stored/btape.c:1500 -#, c-format -msgid "3991 Bad autochanger command: %s\n" -msgstr "" - -#: src/stored/btape.c:1501 -#, c-format -msgid "3991 result=\"%s\": ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1505 -#, c-format -msgid "Slot %d loaded. I am going to unload it.\n" -msgstr "" - -#: src/stored/btape.c:1507 -msgid "Nothing loaded in the drive. OK.\n" -msgstr "" - -#: src/stored/btape.c:1514 -#, c-format -msgid "3302 Issuing autochanger \"unload %d %d\" command.\n" -msgstr "" - -#: src/stored/btape.c:1519 -#, c-format -msgid "unload status=%s %d\n" -msgstr "" - -#: src/stored/btape.c:1519 -msgid "Bad" -msgstr "" - -#: src/stored/btape.c:1522 -#, c-format -msgid "3992 Bad autochanger command: %s\n" -msgstr "" - -#: src/stored/btape.c:1523 -#, c-format -msgid "3992 result=\"%s\": ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1533 -#, c-format -msgid "3303 Issuing autochanger \"load %d %d\" command.\n" -msgstr "" - -#: src/stored/btape.c:1541 -#, c-format -msgid "3303 Autochanger \"load %d %d\" status is OK.\n" -msgstr "" - -#: src/stored/btape.c:1545 -#, c-format -msgid "3993 Bad autochanger command: %s\n" -msgstr "" - -#: src/stored/btape.c:1546 -#, c-format -msgid "3993 result=\"%s\": ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1561 -msgid "" -"\n" -"The test failed, probably because you need to put\n" -"a longer sleep time in the mtx-script in the load) case.\n" -"Adding a 30 second sleep and trying again ...\n" -msgstr "" - -#: src/stored/btape.c:1574 -#, c-format -msgid "Wrote EOF to %s\n" -msgstr "" - -#: src/stored/btape.c:1578 -#, c-format -msgid "" -"\n" -"The test worked this time. Please add:\n" -"\n" -" sleep %d\n" -"\n" -"to your mtx-changer script in the load) case.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1583 -msgid "" -"\n" -"The test autochanger worked!!\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1594 -msgid "You must correct this error or the Autochanger will not work.\n" -msgstr "" - -#: src/stored/btape.c:1612 -msgid "" -"\n" -"\n" -"=== Forward space files test ===\n" -"\n" -"This test is essential to Bacula.\n" -"\n" -"I'm going to write five files then test forward spacing\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1637 -msgid "Now forward spacing 1 file.\n" -msgstr "" - -#: src/stored/btape.c:1639 src/stored/btape.c:1651 src/stored/btape.c:1664 -#: src/stored/btape.c:1682 src/stored/btape.c:1858 -#, c-format -msgid "Bad status from fsr. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1642 -#, c-format -msgid "We should be in file 1. I am at file %d. %s\n" -msgstr "" - -#: src/stored/btape.c:1649 -msgid "Now forward spacing 2 files.\n" -msgstr "" - -#: src/stored/btape.c:1662 -msgid "Now forward spacing 4 files.\n" -msgstr "" - -#: src/stored/btape.c:1674 -msgid "" -"The test worked this time. Please add:\n" -"\n" -" Fast Forward Space File = no\n" -"\n" -"to your Device resource for this drive.\n" -msgstr "" - -#: src/stored/btape.c:1680 -msgid "Now forward spacing 1 more file.\n" -msgstr "" - -#: src/stored/btape.c:1684 -#, c-format -msgid "We should be in file 5. I am at file %d. %s\n" -msgstr "" - -#: src/stored/btape.c:1689 -msgid "" -"\n" -"=== End Forward space files test ===\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1693 -msgid "" -"\n" -"The forward space file test failed.\n" -msgstr "" - -#: src/stored/btape.c:1695 -msgid "" -"You have Fast Forward Space File enabled.\n" -"I am turning it off then retrying the test.\n" -msgstr "" - -#: src/stored/btape.c:1701 -msgid "" -"You must correct this error or Bacula will not work.\n" -"Some systems, e.g. OpenBSD, require you to set\n" -" Use MTIOCGET= no\n" -"in your device resource. Use with caution.\n" -msgstr "" - -#: src/stored/btape.c:1735 -msgid "" -"\n" -"Append test failed. Attempting again.\n" -"Setting \"Hardware End of Medium = no\n" -" and \"Fast Forward Space File = no\n" -"and retrying append test.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1743 -msgid "" -"\n" -"\n" -"It looks like the test worked this time, please add:\n" -"\n" -" Hardware End of Medium = No\n" -"\n" -" Fast Forward Space File = No\n" -"to your Device resource in the Storage conf file.\n" -msgstr "" - -#: src/stored/btape.c:1750 -msgid "" -"\n" -"\n" -"That appears *NOT* to have corrected the problem.\n" -msgstr "" - -#: src/stored/btape.c:1755 -msgid "" -"\n" -"\n" -"It looks like the append failed. Attempting again.\n" -"Setting \"BSF at EOM = yes\" and retrying append test.\n" -msgstr "" - -#: src/stored/btape.c:1760 -msgid "" -"\n" -"\n" -"It looks like the test worked this time, please add:\n" -"\n" -" Hardware End of Medium = No\n" -" Fast Forward Space File = No\n" -" BSF at EOM = yes\n" -"\n" -"to your Device resource in the Storage conf file.\n" -msgstr "" - -#: src/stored/btape.c:1771 -msgid "" -"\n" -"Append test failed.\n" -"\n" -"\n" -"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" -"Unable to correct the problem. You MUST fix this\n" -"problem before Bacula can use your tape drive correctly\n" -"\n" -"Perhaps running Bacula in fixed block mode will work.\n" -"Do so by setting:\n" -"\n" -"Minimum Block Size = nnn\n" -"Maximum Block Size = nnn\n" -"\n" -"in your Storage daemon's Device definition.\n" -"nnn must match your tape driver's block size, which\n" -"can be determined by reading your tape manufacturers\n" -"information, and the information on your kernel dirver.\n" -"Fixed block sizes, however, are not normally an ideal solution.\n" -"\n" -"Some systems, e.g. OpenBSD, require you to set\n" -" Use MTIOCGET= no\n" -"in your device resource. Use with caution.\n" -msgstr "" - -#: src/stored/btape.c:1793 -msgid "" -"\n" -"The above Bacula scan should have output identical to what follows.\n" -"Please double check it ...\n" -"=== Sample correct output ===\n" -"1 block of 64448 bytes in file 1\n" -"End of File mark.\n" -"2 blocks of 64448 bytes in file 2\n" -"End of File mark.\n" -"3 blocks of 64448 bytes in file 3\n" -"End of File mark.\n" -"1 block of 64448 bytes in file 4\n" -"End of File mark.\n" -"Total files=4, blocks=7, bytes = 451,136\n" -"=== End sample correct output ===\n" -"\n" -"If the above scan output is not identical to the\n" -"sample output, you MUST correct the problem\n" -"or Bacula will not be able to write multiple Jobs to \n" -"the tape.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1836 -#, c-format -msgid "Bad status from fsf. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1840 -msgid "Forward spaced 1 file.\n" -msgstr "" - -#: src/stored/btape.c:1843 -#, c-format -msgid "Forward spaced %d files.\n" -msgstr "" - -#: src/stored/btape.c:1862 -msgid "Forward spaced 1 record.\n" -msgstr "" - -#: src/stored/btape.c:1865 -#, c-format -msgid "Forward spaced %d records.\n" -msgstr "" - -#: src/stored/btape.c:1910 -#, c-format -msgid "Wrote one record of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:1912 -msgid "Wrote block to device.\n" -msgstr "" - -#: src/stored/btape.c:1926 -msgid "Enter length to read: " -msgstr "" - -#: src/stored/btape.c:1931 -msgid "Bad length entered, using default of 1024 bytes.\n" -msgstr "" - -#: src/stored/btape.c:1940 -#, c-format -msgid "Read of %d bytes gives stat=%d. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1963 src/stored/btape.c:2012 -#, c-format -msgid "End of tape\n" -msgstr "" - -#: src/stored/btape.c:1968 -#, c-format -msgid "Starting scan at file %u\n" -msgstr "" - -#: src/stored/btape.c:1973 src/stored/tape_dev.c:614 -#, c-format -msgid "read error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/btape.c:1975 -#, c-format -msgid "Bad status from read %d. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1978 src/stored/btape.c:1992 src/stored/btape.c:2056 -#: src/stored/btape.c:2068 src/stored/btape.c:2081 src/stored/btape.c:2097 -#, c-format -msgid "1 block of %d bytes in file %d\n" -msgstr "" - -#: src/stored/btape.c:1981 src/stored/btape.c:1995 src/stored/btape.c:2059 -#: src/stored/btape.c:2071 src/stored/btape.c:2084 src/stored/btape.c:2100 -#, c-format -msgid "%d blocks of %d bytes in file %d\n" -msgstr "" - -#: src/stored/btape.c:2003 src/stored/btape.c:2075 -#, c-format -msgid "End of File mark.\n" -msgstr "" - -#: src/stored/btape.c:2024 src/stored/btape.c:2128 -#, c-format -msgid "Total files=%d, blocks=%d, bytes = %s\n" -msgstr "" - -#: src/stored/btape.c:2088 -#, c-format -msgid "Short block read.\n" -msgstr "" - -#: src/stored/btape.c:2091 -#, c-format -msgid "Error reading block. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2115 -#, c-format -msgid "" -"Block=%u file,blk=%u,%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%s " -"rlen=%d\n" -msgstr "" - -#: src/stored/btape.c:2137 -#, c-format -msgid "Device status: %u. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2169 -#, c-format -msgid "" -"\n" -"This command simulates Bacula writing to a tape.\n" -"It requires either one or two blank tapes, which it\n" -"will label and write.\n" -"\n" -"If you have an autochanger configured, it will use\n" -"the tapes that are in slots 1 and 2, otherwise, you will\n" -"be prompted to insert the tapes when necessary.\n" -"\n" -"It will print a status approximately\n" -"every 322 MB, and write an EOF every %s. If you have\n" -"selected the simple test option, after writing the first tape\n" -"it will rewind it and re-read the last block written.\n" -"\n" -"If you have selected the multiple tape test, when the first tape\n" -"fills, it will ask for a second, and after writing a few more \n" -"blocks, it will stop. Then it will begin re-reading the\n" -"two tapes.\n" -"\n" -"This may take a long time -- hours! ...\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2187 -msgid "" -"Do you want to run the simplified test (s) with one tape\n" -"or the complete multiple tape (m) test: (s/m) " -msgstr "" - -#: src/stored/btape.c:2190 -msgid "Simple test (single tape) selected.\n" -msgstr "" - -#: src/stored/btape.c:2193 -msgid "Multiple tape test selected.\n" -msgstr "" - -#: src/stored/btape.c:2235 -msgid "Wrote Start of Session label.\n" -msgstr "" - -#: src/stored/btape.c:2254 -#, c-format -msgid "%s Begin writing Bacula records to tape ...\n" -msgstr "" - -#: src/stored/btape.c:2256 -#, c-format -msgid "%s Begin writing Bacula records to first tape ...\n" -msgstr "" - -#: src/stored/btape.c:2282 -#, fuzzy -msgid "Flush block failed.\n" -msgstr "Job Einrichtung Fehlgeschlagen.\n" - -#: src/stored/btape.c:2296 -#, c-format -msgid "Wrote block=%u, file,blk=%u,%u VolBytes=%s rate=%sB/s\n" -msgstr "" - -#: src/stored/btape.c:2307 -#, c-format -msgid "%s Flush block, write EOF\n" -msgstr "" - -#: src/stored/btape.c:2316 -msgid "Wrote 1000 blocks on second tape. Done.\n" -msgstr "" - -#: src/stored/btape.c:2321 -msgid "Not OK\n" -msgstr "" - -#: src/stored/btape.c:2345 -#, fuzzy -msgid "Job canceled.\n" -msgstr "%s Abgebrochen" - -#: src/stored/btape.c:2356 -msgid "Set ok=false after write_block_to_device.\n" -msgstr "" - -#: src/stored/btape.c:2360 -msgid "Wrote End of Session label.\n" -msgstr "" - -#: src/stored/btape.c:2384 -#, c-format -msgid "Wrote state file last_block_num1=%d last_block_num2=%d\n" -msgstr "" - -#: src/stored/btape.c:2388 -#, c-format -msgid "Could not create state file: %s ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2399 -#, c-format -msgid "" -"\n" -"\n" -"%s Done filling tape at %d:%d. Now beginning re-read of tape ...\n" -msgstr "" - -#: src/stored/btape.c:2402 -#, c-format -msgid "" -"\n" -"\n" -"%s Done filling tapes at %d:%d. Now beginning re-read of first tape ...\n" -msgstr "" - -#: src/stored/btape.c:2408 -msgid "do_unfill failed.\n" -msgstr "" - -#: src/stored/btape.c:2413 -#, c-format -msgid "%s: Error during test.\n" -msgstr "" - -#: src/stored/btape.c:2448 -msgid "" -"\n" -"The state file level has changed. You must redo\n" -"the fill command.\n" -msgstr "" - -#: src/stored/btape.c:2455 -#, c-format -msgid "" -"\n" -"Could not find the state file: %s ERR=%s\n" -"You must redo the fill command.\n" -msgstr "" - -#: src/stored/btape.c:2521 -msgid "Mount first tape. Press enter when ready: " -msgstr "" - -#: src/stored/btape.c:2538 -msgid "Rewinding.\n" -msgstr "" - -#: src/stored/btape.c:2543 -#, c-format -msgid "Reading the first 10000 records from %u:%u.\n" -msgstr "" - -#: src/stored/btape.c:2547 src/stored/btape.c:2616 -#, c-format -msgid "Reposition from %u:%u to %u:%u\n" -msgstr "" - -#: src/stored/btape.c:2550 src/stored/btape.c:2603 src/stored/btape.c:2619 -#, c-format -msgid "Reposition error. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2553 -#, c-format -msgid "Reading block %u.\n" -msgstr "" - -#: src/stored/btape.c:2555 src/stored/btape.c:2608 src/stored/btape.c:2624 -#, c-format -msgid "Error reading block: ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2560 -msgid "" -"\n" -"The last block on the tape matches. Test succeeded.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2563 -msgid "" -"\n" -"The last block of the first tape matches.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2587 -msgid "Mount second tape. Press enter when ready: " -msgstr "" - -#: src/stored/btape.c:2601 -#, c-format -msgid "Reposition from %u:%u to 0:1\n" -msgstr "" - -#: src/stored/btape.c:2606 src/stored/btape.c:2622 -#, c-format -msgid "Reading block %d.\n" -msgstr "" - -#: src/stored/btape.c:2612 -msgid "" -"\n" -"The first block on the second tape matches.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2628 -msgid "" -"\n" -"The last block on the second tape matches. Test succeeded.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2646 -#, c-format -msgid "10000 records read now at %d:%d\n" -msgstr "" - -#: src/stored/btape.c:2672 src/stored/btape.c:2683 src/stored/btape.c:2728 -msgid "Last block written" -msgstr "" - -#: src/stored/btape.c:2674 src/stored/btape.c:2684 -msgid "Block read back" -msgstr "" - -#: src/stored/btape.c:2675 -#, c-format -msgid "" -"\n" -"\n" -"The blocks differ at byte %u\n" -msgstr "" - -#: src/stored/btape.c:2676 -msgid "" -"\n" -"\n" -"!!!! The last block written and the block\n" -"that was read back differ. The test FAILED !!!!\n" -"This must be corrected before you use Bacula\n" -"to write multi-tape Volumes.!!!!\n" -msgstr "" - -#: src/stored/btape.c:2712 -#, c-format -msgid "Last block at: %u:%u this_dev_block_num=%d\n" -msgstr "" - -#: src/stored/btape.c:2726 -#, c-format -msgid "Block not written: FileIndex=%u blk_block=%u Size=%u\n" -msgstr "" - -#: src/stored/btape.c:2730 -msgid "Block not written" -msgstr "" - -#: src/stored/btape.c:2745 -#, c-format -msgid "End of tape %d:%d. Volume Bytes=%s. Write rate = %sB/s\n" -msgstr "" - -#: src/stored/btape.c:2796 -msgid "Test writing blocks of 64512 bytes to tape.\n" -msgstr "" - -#: src/stored/btape.c:2798 -msgid "How many blocks do you want to write? (1000): " -msgstr "" - -#: src/stored/btape.c:2815 -#, c-format -msgid "Begin writing %d Bacula blocks to tape ...\n" -msgstr "" - -#: src/stored/btape.c:2858 -#, c-format -msgid "Begin writing raw blocks of %u bytes.\n" -msgstr "" - -#: src/stored/btape.c:2889 -msgid "test autochanger" -msgstr "" - -#: src/stored/btape.c:2890 -msgid "backspace file" -msgstr "" - -#: src/stored/btape.c:2891 -msgid "backspace record" -msgstr "" - -#: src/stored/btape.c:2892 -msgid "list device capabilities" -msgstr "" - -#: src/stored/btape.c:2893 -msgid "clear tape errors" -msgstr "" - -#: src/stored/btape.c:2894 -msgid "go to end of Bacula data for append" -msgstr "" - -#: src/stored/btape.c:2895 -msgid "go to the physical end of medium" -msgstr "" - -#: src/stored/btape.c:2896 -msgid "fill tape, write onto second volume" -msgstr "" - -#: src/stored/btape.c:2897 -msgid "read filled tape" -msgstr "" - -#: src/stored/btape.c:2898 -msgid "forward space a file" -msgstr "" - -#: src/stored/btape.c:2899 -msgid "forward space a record" -msgstr "" - -#: src/stored/btape.c:2900 -msgid "print this command" -msgstr "" - -#: src/stored/btape.c:2901 -msgid "write a Bacula label to the tape" -msgstr "" - -#: src/stored/btape.c:2902 -msgid "load a tape" -msgstr "" - -#: src/stored/btape.c:2903 -msgid "quit btape" -msgstr "" - -#: src/stored/btape.c:2904 -msgid "use write() to fill tape" -msgstr "" - -#: src/stored/btape.c:2905 -msgid "read and print the Bacula tape label" -msgstr "" - -#: src/stored/btape.c:2906 -msgid "test record handling functions" -msgstr "" - -#: src/stored/btape.c:2907 -msgid "rewind the tape" -msgstr "" - -#: src/stored/btape.c:2908 -msgid "read() tape block by block to EOT and report" -msgstr "" - -#: src/stored/btape.c:2909 -msgid "Bacula read block by block to EOT and report" -msgstr "" - -#: src/stored/btape.c:2910 -msgid "" -"[file_size=n(GB)|nb_file=3|skip_zero|skip_random|skip_raw|skip_block] report " -"drive speed" -msgstr "" - -#: src/stored/btape.c:2911 -msgid "print tape status" -msgstr "" - -#: src/stored/btape.c:2912 -msgid "General test Bacula tape functions" -msgstr "" - -#: src/stored/btape.c:2913 -msgid "write an EOF on the tape" -msgstr "" - -#: src/stored/btape.c:2914 -msgid "write a single Bacula block" -msgstr "" - -#: src/stored/btape.c:2915 -msgid "read a single record" -msgstr "" - -#: src/stored/btape.c:2916 -msgid "read a single Bacula block" -msgstr "" - -#: src/stored/btape.c:2917 -msgid "quick fill command" -msgstr "" - -#: src/stored/btape.c:2938 -#, c-format -msgid "\"%s\" is an invalid command\n" -msgstr "" - -#: src/stored/btape.c:2947 -#, c-format -msgid "Interactive commands:\n" -msgstr "" - -#: src/stored/btape.c:2958 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: btape \n" -" -b specify bootstrap file\n" -" -c set configuration file to file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -p proceed inspite of I/O errors\n" -" -s turn off signals\n" -" -v be verbose\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Version: %s (%s)\n" -"\n" -"Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c setze Konfigurationsdatei auf Datei\n" -" -dnn setze debug level auf nn\n" -" -f starte im Vordergrund (für debugging Zwecke)\n" -" -g groupid\n" -" -r starte jetzt\n" -" -s no signals\n" -" -t test - Konfiguration Lesen und beenden\n" -" -u userid\n" -" -v ausführliche Benutzer Meldungen\n" -" -? diese Meldung ausgeben.\n" -"\n" - -#: src/stored/btape.c:3046 -#, c-format -msgid "Mount second Volume on device %s and press return when ready: " -msgstr "" - -#: src/stored/btape.c:3074 -#, c-format -msgid "Mount blank Volume on device %s and press return when ready: " -msgstr "" - -#: src/stored/btape.c:3094 -#, c-format -msgid "End of Volume \"%s\" %d records.\n" -msgstr "" - -#: src/stored/btape.c:3108 -#, c-format -msgid "Read block=%u, VolBytes=%s rate=%sB/s\n" -msgstr "" - -#: src/stored/btape.c:3121 -#, c-format -msgid "Cannot open Dev=%s, Vol=%s\n" -msgstr "" - -#: src/stored/butil.c:48 -msgid "Nohdr," -msgstr "" - -#: src/stored/butil.c:51 -msgid "partial," -msgstr "" - -#: src/stored/butil.c:54 -msgid "empty," -msgstr "" - -#: src/stored/butil.c:57 -msgid "Nomatch," -msgstr "" - -#: src/stored/butil.c:60 -msgid "cont," -msgstr "" - -#: src/stored/butil.c:150 -msgid "Volume name or names is too long. Please use a .bsr file.\n" -msgstr "" - -#: src/stored/butil.c:170 -#, c-format -msgid "Cannot find device \"%s\" in config file %s.\n" -msgstr "" - -#: src/stored/butil.c:177 -#, c-format -msgid "Cannot init device %s\n" -msgstr "" - -#: src/stored/butil.c:203 -#, c-format -msgid "Cannot open %s\n" -msgstr "" - -#: src/stored/butil.c:290 -#, c-format -msgid "Could not find device \"%s\" in config file %s.\n" -msgstr "" - -#: src/stored/butil.c:295 -#, c-format -msgid "Using device: \"%s\" for writing.\n" -msgstr "" - -#: src/stored/butil.c:297 -#, c-format -msgid "Using device: \"%s\" for reading.\n" -msgstr "" - -#: src/stored/butil.c:313 -msgid "Unexpected End of Data\n" -msgstr "" - -#: src/stored/butil.c:315 -msgid "Unexpected End of Tape\n" -msgstr "" - -#: src/stored/butil.c:317 -msgid "Unexpected End of File\n" -msgstr "" - -#: src/stored/butil.c:319 -msgid "Tape Door is Open\n" -msgstr "" - -#: src/stored/butil.c:321 -msgid "Unexpected Tape is Off-line\n" -msgstr "" - -#: src/stored/dde_status.c:149 -msgid "Dedupengine status:\n" -msgstr "" - -#: src/stored/dde_status.c:159 -#, c-format -msgid "" -" DDE: hash_count=%llu ref_count=%llu ref_size=%sB\n" -" ref_ratio=%.2f size_ratio=%.2f dde_errors=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:167 -#, c-format -msgid "" -" Config: bnum=%lld bmin=%lld bmax=%lld mlock_strategy=%ld mlocked=%lldMB " -"mlock_max=%lldMB\n" -msgstr "" - -#: src/stored/dde_status.c:173 -#, c-format -msgid " Addr: bad_addr=%llu bad_bucket=%llu wrong=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:178 -#, c-format -msgid "" -" Containers: chunk_allocated=%llu chunk_used=%llu\n" -" disk_space_allocated=%sB disk_space_used=%sB containers_errors=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:199 -#, c-format -msgid "" -" Vacuum: last_run=\"%s\" duration=%llus ref_count=%llu ref_size=%sB\n" -" vacuum_errors=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:205 -#, c-format -msgid " Stats: read_chunk=%llu query_hash=%llu new_hash=%llu calc_hash=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:213 -#, c-format -msgid " acc_container_cnt[%d]:%s %14llu\n" -msgstr "" - -#: src/stored/dde_status.c:226 -#, c-format -msgid " [%d]%s filesize=%sB/%sB usage=%llu/%llu/%llu %3llu%% %s\n" -msgstr "" - -#: src/stored/dde_status.c:239 -#, c-format -msgid " [%d]%s filesize=%sB/%sB usage=%llu/%llu/%llu %3llu%%\n" -msgstr "" - -#: src/stored/dde_vacuum.c:84 -#, c-format -msgid "" -"Skipping volume \"%s\" from vacuum process, the volume is only created in " -"the catalog.\n" -msgstr "" - -#: src/stored/dde_vacuum.c:91 -#, c-format -msgid "" -"Error: Volume \"%s\" (status %s) not found in %s. All volumes should be " -"available for a Vacuum. ERR=%s\n" -msgstr "" - -#: src/stored/dedupengine.c:384 -msgid "Initializing DDE." -msgstr "" - -#: src/stored/dedupengine.c:392 -msgid "DedupDirectory directive in Storage resource missing." -msgstr "" - -#: src/stored/dedupengine.c:399 -#, fuzzy, c-format -msgid "Cannot create DedupDirectory: %s" -msgstr "kann Variable operate nicht setzen: ERR=%s\n" - -#: src/stored/dedupengine.c:405 -#, fuzzy, c-format -msgid "Cannot create DedupIndexDirectory: %s" -msgstr "kann Variable operate nicht setzen: ERR=%s\n" - -#: src/stored/dedupengine.c:414 src/stored/dedupengine.c:421 -#, fuzzy, c-format -msgid "Cannot create recovery directory: %s" -msgstr "kann Variable operate nicht setzen: ERR=%s\n" - -#: src/stored/dedupengine.c:428 -#, fuzzy, c-format -msgid "Cannot delete temporary recovery directory: %s" -msgstr "kann Variable operate nicht setzen: ERR=%s\n" - -#: src/stored/dedupengine.c:1246 -#, c-format -msgid "bucket version (%ld) is posterior to the software (%ld)\n" -msgstr "" - -#: src/stored/dedupengine.c:1772 -#, c-format -msgid "" -"The Deduplication Engine filesystem \"%s\" is full (only %sB free). Running " -"jobs will be stopped and marked as Incomplete. Extend the storage space and " -"run the vacuum procedure\n" -msgstr "" - -#: src/stored/dedupengine.c:1782 -#, c-format -msgid "" -"The Deduplication Engine filesystem \"%s\" is nearly full (%sB free). Please " -"run the vacuum procedure\n" -msgstr "" - -#: src/stored/dedupengine.c:1965 -msgid "Header not found in DDE index\n" -msgstr "" - -#: src/stored/dedupengine.c:1971 -msgid "DDE index bad magic in header\n" -msgstr "" - -#: src/stored/dedupengine.c:1976 -#, c-format -msgid "" -"Cannot open DDE because the version (%ld) is posterior to the software " -"(%ld)\n" -msgstr "" - -#: src/stored/dedupengine.c:1996 -#, c-format -msgid "Cannot open DDE, unknown hash ID: %ld\n" -msgstr "" - -#: src/stored/dedupstored.c:99 -#, c-format -msgid "Transport thread error: joining thread (%d)\n" -msgstr "" - -#: src/stored/dedupstored.c:208 -#, fuzzy, c-format -msgid "Socket error or stop during rehydration. ERR=%d\n" -msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" - -#: src/stored/dedupstored.c:226 -#, fuzzy, c-format -msgid "Unexpected message from FD, n=%d msglen=%d msg=%s\n" -msgstr "Fehler beim Lesen der catalog DB Steuerdatei. ERR=%s\n" - -#: src/stored/dedupstored.c:415 -#, c-format -msgid "BAD HASH: computed=#%08x expected=#%08x size=%d\n" -msgstr "" - -#: src/stored/dedupstored.c:521 -#, c-format -msgid "GOT chunk #%08x, now do a CANCEL\n" -msgstr "" - -#: src/stored/dedupstored.c:528 -#, c-format -msgid "Received unexpected chunk #%08x\n" -msgstr "" - -#: src/stored/dedupstored.c:535 -#, c-format -msgid "Cannot lz4decode received chunk #%08x\n" -msgstr "" - -#: src/stored/dedupstored.c:541 -#, c-format -msgid "Received chunk #%08x with the wrong size %d (expected %ld) \n" -msgstr "" - -#: src/stored/dedupstored.c:550 -#, c-format -msgid "Received a chunk with a bad hash #%08x (expected #%08x) size=%d\n" -msgstr "" - -#: src/stored/dedupstored.c:585 -msgid "Ignore dedup flow control protocol error\n" -msgstr "" - -#: src/stored/dedupstored.c:599 -#, c-format -msgid "Ignore unknown inter-daemon command: %ld\n" -msgstr "" - -#: src/stored/dedupstored.c:678 -msgid "Got Dedup data but dedupengine is not started\n" -msgstr "" - -#: src/stored/dedupstored.c:718 -#, fuzzy -msgid "Error sending chunk request to client\n" -msgstr "Fehler beim senden von \"Hello\" an Storage daemon. ERR=%s\n" - -#: src/stored/dev.c:146 -#, c-format -msgid "Unable to stat device %s: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:164 -#, fuzzy, c-format -msgid "" -"%s is an unknown device type. Must be tape or directory\n" -" or have RequiresMount=yes for DVD. st_mode=%x\n" -msgstr "unbekannt\n" - -#: src/stored/dev.c:177 -msgid "DVD support is now deprecated.\n" -msgstr "" - -#: src/stored/dev.c:180 -msgid "Aligned device not supported. Please use \"DeviceType = File\"\n" -msgstr "" - -#: src/stored/dev.c:183 -msgid "Deduplication device not supported. Please use \"DeviceType = File\"\n" -msgstr "" - -#: src/stored/dev.c:212 -msgid "Deduplication device not properly configured.\n" -msgstr "" - -#: src/stored/dev.c:303 -#, c-format -msgid "Using default block size %u on dedup device %s\n" -msgstr "" - -#: src/stored/dev.c:341 -#, c-format -msgid "Unable to stat mount point %s: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:346 -msgid "" -"Mount and unmount commands must defined for a device which requires mount.\n" -msgstr "" - -#: src/stored/dev.c:362 -#, c-format -msgid "Min block size > max on device %s\n" -msgstr "" - -#: src/stored/dev.c:366 -#, c-format -msgid "Block size %u on device %s is too large, using default %u\n" -msgstr "" - -#: src/stored/dev.c:371 -#, c-format -msgid "Max block size %u not multiple of device %s block size=%d.\n" -msgstr "" - -#: src/stored/dev.c:375 -#, c-format -msgid "Max Vol Size < 8 * Max Block Size for device %s\n" -msgstr "" - -#: src/stored/dev.c:391 src/stored/dev.c:397 -#, c-format -msgid "Unable to init cond variable: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:403 -#, fuzzy, c-format -msgid "Unable to init spool mutex: ERR=%s\n" -msgstr "Kann DB lock nicht initialisieren. ERR=%s\n" - -#: src/stored/dev.c:409 -#, fuzzy, c-format -msgid "Unable to init acquire mutex: ERR=%s\n" -msgstr "Kann DB lock nicht initialisieren. ERR=%s\n" - -#: src/stored/dev.c:415 -#, fuzzy, c-format -msgid "Unable to init read acquire mutex: ERR=%s\n" -msgstr "Kann DB lock nicht initialisieren. ERR=%s\n" - -#: src/stored/dev.c:421 -#, fuzzy, c-format -msgid "Unable to init adata mutex: ERR=%s\n" -msgstr "Kann DB lock nicht initialisieren. ERR=%s\n" - -#: src/stored/dev.c:427 -#, fuzzy, c-format -msgid "Unable to init volcat mutex: ERR=%s\n" -msgstr "Kann DB lock nicht initialisieren. ERR=%s\n" - -#: src/stored/dev.c:433 -#, fuzzy, c-format -msgid "Unable to init dcrs mutex: ERR=%s\n" -msgstr "Kann DB lock nicht initialisieren. ERR=%s\n" - -#: src/stored/dev.c:523 -msgid "Illegal mode given to open dev.\n" -msgstr "" - -#: src/stored/dev.c:575 -msgid "Bad device call. Device not open\n" -msgstr "" - -#: src/stored/dev.c:587 -#, c-format -msgid "Seek error: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:588 src/stored/file_dev.c:78 src/stored/file_dev.c:105 -#: src/stored/tape_dev.c:294 -#, c-format -msgid "lseek error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/device.c:126 -#, c-format -msgid "End of medium on Volume \"%s\" Bytes=%s Blocks=%s at %s.\n" -msgstr "" - -#: src/stored/device.c:157 -#, c-format -msgid "New volume \"%s\" mounted on device %s at %s.\n" -msgstr "" - -#: src/stored/device.c:169 -#, c-format -msgid "write_block_to_device Volume label failed. ERR=%s" -msgstr "" - -#: src/stored/device.c:201 -#, c-format -msgid "write_block_to_device overflow block failed. ERR=%s" -msgstr "" - -#: src/stored/device.c:206 -#, c-format -msgid "Catastrophic error. Cannot write overflow block to device %s. ERR=%s" -msgstr "" - -#: src/stored/device.c:367 src/stored/tape_dev.c:161 -#, c-format -msgid "Unable to open device %s: ERR=%s\n" -msgstr "" - -#: src/stored/device.c:369 -#, c-format -msgid "Unable to open archive %s: ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:164 -#, c-format -msgid "Connection request from %s failed.\n" -msgstr "" - -#: src/stored/dircmd.c:202 -msgid "Unable to authenticate Director\n" -msgstr "" - -#: src/stored/dircmd.c:296 -#, fuzzy, c-format -msgid "Bad client command: %s" -msgstr "Storage daemon hat \"Job command\": %s abgelehnt\n" - -#: src/stored/dircmd.c:306 -#, fuzzy -msgid "Client daemon" -msgstr "File daemon" - -#: src/stored/dircmd.c:309 -#, fuzzy, c-format -msgid "Failed to connect to Client daemon: %s:%d\n" -msgstr "Verbindung zu File daemon fehlgeschlagen.\n" - -#: src/stored/dircmd.c:387 -msgid "In storage_cmd port==0, no prior Storage connection.\n" -msgstr "" - -#: src/stored/dircmd.c:439 -#, c-format -msgid "3991 Bad setdebug command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:484 -msgid "3000 Deduplication vacuum marked to be canceled.\n" -msgstr "" - -#: src/stored/dircmd.c:486 -msgid "3900 No deduplication vacuum process found.\n" -msgstr "" - -#: src/stored/dircmd.c:490 -msgid "3903 Error scanning cancel command.\n" -msgstr "" - -#: src/stored/dircmd.c:494 -#, c-format -msgid "3904 Job %s not found.\n" -msgstr "" - -#: src/stored/dircmd.c:523 -#, fuzzy, c-format -msgid "3000 JobId=%ld Job=\"%s\" marked to be %s.\n" -msgstr "JobId %s, Job %s zum Abbruch markiert.\n" - -#: src/stored/dircmd.c:602 src/stored/dircmd.c:1003 src/stored/dircmd.c:1163 -#: src/stored/dircmd.c:1274 src/stored/dircmd.c:1396 src/stored/dircmd.c:1438 -#, c-format -msgid "3999 Device \"%s\" not found or could not be opened.\n" -msgstr "" - -#: src/stored/dircmd.c:607 -#, c-format -msgid "3903 Error scanning label command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:659 -#, fuzzy, c-format -msgid "3910 Unable to open device \"%s\": ERR=%s\n" -msgstr "Kann Datenbank=%s.nicht öffen. ERR=%s\n" - -#: src/stored/dircmd.c:676 -#, c-format -msgid "3920 Cannot label Volume because it is already labeled: \"%s\"\n" -msgstr "" - -#: src/stored/dircmd.c:683 -msgid "3921 Wrong volume mounted.\n" -msgstr "" - -#: src/stored/dircmd.c:687 -msgid "3922 Cannot relabel an ANSI/IBM labeled Volume.\n" -msgstr "" - -#: src/stored/dircmd.c:695 -#, c-format -msgid "3912 Failed to label Volume: ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:711 -#, fuzzy, c-format -msgid "3915 Failed to label Volume: ERR=%s\n" -msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" - -#: src/stored/dircmd.c:714 -#, c-format -msgid "3914 Failed to label Volume (no media): ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:717 -#, c-format -msgid "3913 Cannot label Volume. Unknown status %d from read_volume_label()\n" -msgstr "" - -#: src/stored/dircmd.c:755 -#, c-format -msgid "3001 Mounted Volume: %s\n" -msgstr "" - -#: src/stored/dircmd.c:759 src/stored/dircmd.c:1474 -#, c-format -msgid "" -"3902 Cannot mount Volume on Storage Device \"%s\" because:\n" -"%s" -msgstr "" - -#: src/stored/dircmd.c:790 src/stored/reserve.c:648 -#, c-format -msgid "" -"\n" -" Device \"%s\" requested by DIR could not be opened or does not exist.\n" -msgstr "" - -#: src/stored/dircmd.c:812 src/stored/reserve.c:644 -#, c-format -msgid "" -"\n" -" Device \"%s\" in changer \"%s\" requested by DIR could not be opened or " -"does not exist.\n" -msgstr "" - -#: src/stored/dircmd.c:876 -#, fuzzy -msgid "Specified slot ignored. " -msgstr "SQL fehlgeschlagen ERR=%s\n" - -#: src/stored/dircmd.c:896 src/stored/dircmd.c:959 -#, fuzzy, c-format -msgid "3901 Unable to open device \"%s\": ERR=%s\n" -msgstr "Kann Datenbank=%s.nicht öffen. ERR=%s\n" - -#: src/stored/dircmd.c:917 src/stored/dircmd.c:947 -#, c-format -msgid "3001 Device \"%s\" is mounted with Volume \"%s\"\n" -msgstr "" - -#: src/stored/dircmd.c:920 src/stored/dircmd.c:950 src/stored/dircmd.c:969 -#, c-format -msgid "" -"3905 Device \"%s\" open but no Bacula volume is mounted.\n" -"If this is not a blank tape, try unmounting and remounting the Volume.\n" -msgstr "" - -#: src/stored/dircmd.c:931 -#, c-format -msgid "3001 Device \"%s\" is doing acquire.\n" -msgstr "" - -#: src/stored/dircmd.c:936 src/stored/dircmd.c:1134 -#, c-format -msgid "3903 Device \"%s\" is being labeled.\n" -msgstr "" - -#: src/stored/dircmd.c:966 -#, c-format -msgid "3001 Device \"%s\" is already mounted with Volume \"%s\"\n" -msgstr "" - -#: src/stored/dircmd.c:979 -#, c-format -msgid "3002 Device \"%s\" is mounted.\n" -msgstr "" - -#: src/stored/dircmd.c:981 src/stored/dircmd.c:1103 src/stored/dircmd.c:1122 -#: src/stored/dircmd.c:1154 -#, c-format -msgid "3907 %s" -msgstr "" - -#: src/stored/dircmd.c:984 -#, c-format -msgid "3906 File device \"%s\" is always mounted.\n" -msgstr "" - -#: src/stored/dircmd.c:993 -#, fuzzy, c-format -msgid "3930 Device \"%s\" is being released.\n" -msgstr "unbekannt" - -#: src/stored/dircmd.c:997 -#, fuzzy, c-format -msgid "3905 Unknown wait state %d\n" -msgstr "unbekannt" - -#: src/stored/dircmd.c:1007 -#, c-format -msgid "3909 Error scanning mount command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1032 -#, fuzzy, c-format -msgid "3002 Device \"%s\" enabled.\n" -msgstr "Pool Ressource \"%s\" nicht gefunden.\n" - -#: src/stored/dircmd.c:1039 -#, c-format -msgid "3907 Error scanning \"enable\" command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1064 -#, fuzzy, c-format -msgid "3002 Device \"%s\" disabled.\n" -msgstr "Pool Ressource \"%s\" nicht gefunden.\n" - -#: src/stored/dircmd.c:1071 -#, c-format -msgid "3907 Error scanning \"disable\" command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1100 src/stored/dircmd.c:1156 -#, fuzzy, c-format -msgid "3002 Device \"%s\" unmounted.\n" -msgstr "Pool Ressource \"%s\" nicht gefunden.\n" - -#: src/stored/dircmd.c:1107 -#, fuzzy, c-format -msgid "3901 Device \"%s\" is already unmounted.\n" -msgstr "unbekannt" - -#: src/stored/dircmd.c:1125 -#, fuzzy, c-format -msgid "3001 Device \"%s\" unmounted.\n" -msgstr "Pool Ressource \"%s\" nicht gefunden.\n" - -#: src/stored/dircmd.c:1130 -#, c-format -msgid "3902 Device \"%s\" is busy in acquire.\n" -msgstr "" - -#: src/stored/dircmd.c:1168 -#, c-format -msgid "3907 Error scanning unmount command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1196 -msgid "3916 Error scanning action_on_purge command\n" -msgstr "" - -#: src/stored/dircmd.c:1239 -#, fuzzy, c-format -msgid "3921 Device \"%s\" already released.\n" -msgstr "Device Eintrag %s bereits vorhanden\n" - -#: src/stored/dircmd.c:1246 -#, c-format -msgid "3922 Device \"%s\" waiting for sysop.\n" -msgstr "" - -#: src/stored/dircmd.c:1252 -#, c-format -msgid "3922 Device \"%s\" waiting for mount.\n" -msgstr "" - -#: src/stored/dircmd.c:1256 -#, fuzzy, c-format -msgid "3923 Device \"%s\" is busy in acquire.\n" -msgstr "unbekannt" - -#: src/stored/dircmd.c:1260 -#, c-format -msgid "3914 Device \"%s\" is being labeled.\n" -msgstr "" - -#: src/stored/dircmd.c:1268 -#, c-format -msgid "3022 Device \"%s\" released.\n" -msgstr "" - -#: src/stored/dircmd.c:1279 -#, c-format -msgid "3927 Error scanning release command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1308 -#, c-format -msgid "Could not create bootstrap file %s: ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:1321 -msgid "Error parsing bootstrap file.\n" -msgstr "" - -#: src/stored/dircmd.c:1383 -#, fuzzy, c-format -msgid "3998 Device \"%s\" is not an autochanger.\n" -msgstr "unbekannt" - -#: src/stored/dircmd.c:1400 -#, c-format -msgid "3909 Error scanning autochanger drives/list/slots command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1442 -#, c-format -msgid "3909 Error scanning readlabel command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1470 -#, c-format -msgid "3001 Volume=%s Slot=%d\n" -msgstr "" - -#: src/stored/dircmd.c:1502 -#, c-format -msgid "3931 Device \"%s\" is BLOCKED. user unmounted.\n" -msgstr "" - -#: src/stored/dircmd.c:1506 -#, c-format -msgid "" -"3932 Device \"%s\" is BLOCKED. user unmounted during wait for media/mount.\n" -msgstr "" - -#: src/stored/dircmd.c:1510 -#, c-format -msgid "3933 Device \"%s\" is BLOCKED waiting for media.\n" -msgstr "" - -#: src/stored/dircmd.c:1514 -#, c-format -msgid "3934 Device \"%s\" is being initialized.\n" -msgstr "" - -#: src/stored/dircmd.c:1518 -#, fuzzy, c-format -msgid "3935 Device \"%s\" is blocked labeling a Volume.\n" -msgstr "unbekannt" - -#: src/stored/dircmd.c:1522 -#, fuzzy, c-format -msgid "3935 Device \"%s\" is blocked for unknown reason.\n" -msgstr "unbekannt" - -#: src/stored/dircmd.c:1527 -#, fuzzy, c-format -msgid "3936 Device \"%s\" is busy reading.\n" -msgstr "unbekannt" - -#: src/stored/dircmd.c:1530 -#, c-format -msgid "3937 Device \"%s\" is busy with writers=%d reserved=%d.\n" -msgstr "" - -#: src/stored/dircmd.c:1550 -#, c-format -msgid "" -"3999 Device \"%s\" requested by DIR could not be locked for shared storage.\n" -msgstr "" - -#: src/stored/dvd.c:252 -#, c-format -msgid "Error writing part %d to the DVD: ERR=%s\n" -msgstr "" - -#: src/stored/dvd.c:254 -#, c-format -msgid "Error while writing current part to the DVD: %s" -msgstr "" - -#: src/stored/dvd.c:264 -#, c-format -msgid "Part %d (%lld bytes) written to DVD.\n" -msgstr "" - -#: src/stored/dvd.c:281 -#, c-format -msgid "Remaining free space %s on %s\n" -msgstr "" - -#: src/stored/dvd.c:347 -#, c-format -msgid "Next Volume part already exists on DVD. Cannot continue: %s\n" -msgstr "" - -#: src/stored/dvd.c:552 -#, c-format -msgid "" -"Error writing. Current part less than total number of parts (%d/%d, device=" -"%s)\n" -msgstr "" - -#: src/stored/dvd.c:559 -#, c-format -msgid "Unable to write last on %s: ERR=%s\n" -msgstr "" - -#: src/stored/fd_cmds.c:209 -#, fuzzy, c-format -msgid "Command error with FD, hanging up. ERR=%s\n" -msgstr "Netzwerkfehler mit FD bei %s: ERR=%s\n" - -#: src/stored/fd_cmds.c:212 -msgid "Command error with FD, hanging up.\n" -msgstr "" - -#: src/stored/fd_cmds.c:223 -#, fuzzy, c-format -msgid "FD command not found: %s\n" -msgstr "Job nicht gefunden: %s\n" - -#: src/stored/fd_cmds.c:254 -msgid "Attempt to append on non-open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:266 src/stored/fd_cmds.c:309 -msgid "Attempt to close non-open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:284 -msgid "Attempt to open already open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:338 -msgid "Attempt to read on non-open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:356 -msgid "Attempt to open an already open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:372 -#, fuzzy -msgid "Cannot open session, received bad parameters.\n" -msgstr "Kann Ausdruck\"%s\"nicht auflösen: ERR=%s\n" - -#: src/stored/file_dev.c:95 src/stored/tape_dev.c:859 -msgid "Bad call to reposition. Device not open\n" -msgstr "" - -#: src/stored/file_dev.c:157 -#, c-format -msgid "Could not open file device %s. No Volume name given.\n" -msgstr "" - -#: src/stored/file_dev.c:183 -#, fuzzy, c-format -msgid "Could not open(%s,%s,0640): ERR=%s\n" -msgstr "Kann bootstrap Datei nicht öffnen: %s: ERR=%s\n" - -#: src/stored/file_dev.c:202 -#, fuzzy, c-format -msgid "Could not open aligned volume: %s, ERR=%s\n" -msgstr "Kann bootstrap Datei nicht öffnen: %s: ERR=%s\n" - -#: src/stored/file_dev.c:255 -#, c-format -msgid "Unable to truncate device %s. ERR=%s\n" -msgstr "" - -#: src/stored/file_dev.c:272 -#, fuzzy, c-format -msgid "Unable to stat device %s. ERR=%s\n" -msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" - -#: src/stored/file_dev.c:289 -#, c-format -msgid "Device %s doesn't support ftruncate(). Recreating file %s.\n" -msgstr "" - -#: src/stored/file_dev.c:301 -#, fuzzy, c-format -msgid "Could not reopen: %s, ERR=%s\n" -msgstr "Kann bootstrap Datei nicht öffnen: %s: ERR=%s\n" - -#: src/stored/file_dev.c:379 src/stored/tape_dev.c:1024 -#, c-format -msgid "Device %s cannot be %smounted. ERR=%s\n" -msgstr "" - -#: src/stored/hello.c:138 -#, fuzzy, c-format -msgid "" -"Connection from unknown Director %s at %s rejected.\n" -"Please see " -msgstr "unbekannt" - -#: src/stored/hello.c:165 -#, c-format -msgid "Invalid connection from %s. Len=%d\n" -msgstr "" - -#: src/stored/hello.c:179 -#, fuzzy, c-format -msgid "Invalid Hello from %s. Len=%d\n" -msgstr "UA Hello von %s:%s:%d ist ungültig. Len=%d\n" - -#: src/stored/hello.c:184 -#, fuzzy, c-format -msgid "Client connect failed: Job name not found: %s\n" -msgstr "Job nicht gefunden: %s\n" - -#: src/stored/hello.c:193 -#, c-format -msgid "" -"A Client \"%s\" tried to authenticate for Job %s, but the Job is already " -"authenticated with \"%s\".\n" -msgstr "" - -#: src/stored/hello.c:227 -#, c-format -msgid "" -"A Client \"%s\" tried to authenticate for Job %s, but the job is already " -"authenticated.\n" -msgstr "" - -#: src/stored/hello.c:234 src/stored/job.c:197 -msgid "Unable to authenticate File daemon\n" -msgstr "" - -#: src/stored/hello.c:292 -msgid "Client socket not open. Could not connect to Client.\n" -msgstr "" - -#: src/stored/hello.c:308 src/stored/hello.c:310 -#, fuzzy, c-format -msgid "Recv request to Client failed. ERR=%s\n" -msgstr "Erzeugung des DB Client Eintrags %s fehlgeschlagen. ERR=%s\n" - -#: src/stored/hello.c:315 src/stored/hello.c:316 -#, c-format -msgid "Bad Hello from Client: %s.\n" -msgstr "" - -#: src/stored/hello.c:442 src/stored/hello.c:444 -#, fuzzy, c-format -msgid "Send caps to Client failed. ERR=%s\n" -msgstr "Erzeugung des DB Client Eintrags %s fehlgeschlagen. ERR=%s\n" - -#: src/stored/hello.c:457 src/stored/hello.c:459 -#, fuzzy, c-format -msgid "Recv caps from Client failed. ERR=%s\n" -msgstr "Erzeugung des DB Client Eintrags %s fehlgeschlagen. ERR=%s\n" - -#: src/stored/hello.c:463 -#, c-format -msgid "Recv bad caps from Client: %s.\n" -msgstr "" - -#: src/stored/hello.c:464 -#, c-format -msgid "Recv bad caps from Client %s\n" -msgstr "" - -#: src/stored/job.c:353 -msgid "In free_jcr(), but still attached to device!!!!\n" -msgstr "" - -#: src/stored/label.c:90 -#, fuzzy, c-format -msgid "Couldn't rewind %s device %s: ERR=%s\n" -msgstr "Kann bootstrap Datei nicht öffnen: %s: ERR=%s\n" - -#: src/stored/label.c:108 src/stored/label.c:204 -#, c-format -msgid "Wrong Volume mounted on %s device %s: Wanted %s have %s\n" -msgstr "" - -#: src/stored/label.c:111 src/stored/label.c:192 -#, c-format -msgid "Too many tries: %s" -msgstr "" - -#: src/stored/label.c:128 -#, c-format -msgid "" -"Requested Volume \"%s\" on %s device %s is not a Bacula labeled Volume, " -"because: ERR=%s" -msgstr "" - -#: src/stored/label.c:133 -msgid "Could not read Volume label from block.\n" -msgstr "" - -#: src/stored/label.c:136 -#, c-format -msgid "Could not unserialize Volume label: ERR=%s\n" -msgstr "" - -#: src/stored/label.c:144 -#, c-format -msgid "Volume Header Id bad: %s\n" -msgstr "" - -#: src/stored/label.c:177 -#, c-format -msgid "Volume on %s device %s has wrong Bacula version. Wanted %d got %d\n" -msgstr "" - -#: src/stored/label.c:188 -#, c-format -msgid "Volume on %s device %s has bad Bacula label type: %x\n" -msgstr "" - -#: src/stored/label.c:225 -#, fuzzy, c-format -msgid "Got Aligned or File type Volume %s on Dedup device %s. Wanted File.\n" -msgstr "Neues Volume \"%s\" in catalog erzeugt.\n" - -#: src/stored/label.c:235 -#, fuzzy, c-format -msgid "Got Aligned or Dedup type Volume %s on File device %s. Wanted File.\n" -msgstr "Neues Volume \"%s\" in catalog erzeugt.\n" - -#: src/stored/label.c:245 -#, fuzzy, c-format -msgid "" -"Got File or Dedup type Volume %s on Aligned device %s. Wanted Aligned.\n" -msgstr "Neues Volume \"%s\" in catalog erzeugt.\n" - -#: src/stored/label.c:274 src/stored/label.c:467 src/stored/mount.c:502 -#, fuzzy, c-format -msgid "Could not reserve volume %s on %s device %s\n" -msgstr "Konnte FileSet \"%s\" Eintrag nicht erzeugen. ERR=%s\n" - -#: src/stored/label.c:364 -#, c-format -msgid "Cannot write Volume label to block for %s device %s\n" -msgstr "" - -#: src/stored/label.c:431 src/stored/label.c:587 -#, fuzzy, c-format -msgid "Open %s device %s Volume \"%s\" failed: ERR=%s\n" -msgstr "Erzeugung von db Device Eintrag %s fehlgeschlagen: ERR=%s\n" - -#: src/stored/label.c:601 -#, fuzzy, c-format -msgid "Rewind error on %s device %s: ERR=%s\n" -msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" - -#: src/stored/label.c:609 -#, fuzzy, c-format -msgid "Truncate error on %s device %s: ERR=%s\n" -msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" - -#: src/stored/label.c:616 -#, fuzzy, c-format -msgid "Failed to re-open DVD after truncate on %s device %s: ERR=%s\n" -msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" - -#: src/stored/label.c:661 -#, fuzzy, c-format -msgid "Unable to write %s device %s: ERR=%s\n" -msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" - -#: src/stored/label.c:695 -#, c-format -msgid "Recycled volume \"%s\" on %s device %s, all previous data lost.\n" -msgstr "" - -#: src/stored/label.c:698 -#, c-format -msgid "Wrote label to prelabeled Volume \"%s\" on %s device %s\n" -msgstr "" - -#: src/stored/label.c:940 -#, c-format -msgid "Bad Volume session label request=%d\n" -msgstr "" - -#: src/stored/label.c:1004 -#, c-format -msgid "Expecting Volume Label, got FI=%s Stream=%s len=%d\n" -msgstr "" - -#: src/stored/label.c:1144 -#, c-format -msgid "Unknown %d" -msgstr "" - -#: src/stored/label.c:1148 -#, c-format -msgid "" -"\n" -"Volume Label:\n" -"Adata : %d\n" -"Id : %sVerNo : %d\n" -"VolName : %s\n" -"PrevVolName : %s\n" -"VolFile : %d\n" -"LabelType : %s\n" -"LabelSize : %d\n" -"PoolName : %s\n" -"MediaType : %s\n" -"PoolType : %s\n" -"HostName : %s\n" -msgstr "" - -#: src/stored/label.c:1172 -#, c-format -msgid "Date label written: %s\n" -msgstr "" - -#: src/stored/label.c:1178 -#, c-format -msgid "Date label written: %04d-%02d-%02d at %02d:%02d\n" -msgstr "" - -#: src/stored/label.c:1198 -#, c-format -msgid "" -"\n" -"%s Record:\n" -"JobId : %d\n" -"VerNum : %d\n" -"PoolName : %s\n" -"PoolType : %s\n" -"JobName : %s\n" -"ClientName : %s\n" -msgstr "" - -#: src/stored/label.c:1211 -#, c-format -msgid "" -"Job (unique name) : %s\n" -"FileSet : %s\n" -"JobType : %c\n" -"JobLevel : %c\n" -msgstr "" - -#: src/stored/label.c:1220 -#, c-format -msgid "" -"JobFiles : %s\n" -"JobBytes : %s\n" -"StartBlock : %s\n" -"EndBlock : %s\n" -"StartFile : %s\n" -"EndFile : %s\n" -"JobErrors : %s\n" -"JobStatus : %c\n" -msgstr "" - -#: src/stored/label.c:1241 -#, c-format -msgid "Date written : %s\n" -msgstr "" - -#: src/stored/label.c:1246 -#, c-format -msgid "Date written : %04d-%02d-%02d at %02d:%02d\n" -msgstr "" - -#: src/stored/label.c:1258 -msgid "***** ERROR ****** : Found error with the JobId\n" -msgstr "" - -#: src/stored/label.c:1278 -msgid "***** ERROR ****** : Found error with the JobLevel\n" -msgstr "" - -#: src/stored/label.c:1298 -msgid "***** ERROR ****** : Found error with the JobType\n" -msgstr "" - -#: src/stored/label.c:1305 -#, c-format -msgid "***** ERROR ****** : Found error with the Job name %s\n" -msgstr "" - -#: src/stored/label.c:1326 -msgid "Fresh Volume" -msgstr "" - -#: src/stored/label.c:1329 -msgid "Volume" -msgstr "" - -#: src/stored/label.c:1338 src/stored/read_records.c:406 -msgid "End of Media" -msgstr "" - -#: src/stored/label.c:1341 -msgid "End of Tape" -msgstr "" - -#: src/stored/label.c:1360 src/stored/label.c:1368 src/stored/label.c:1407 -#, c-format -msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d DataLen=%d\n" -msgstr "" - -#: src/stored/label.c:1365 -msgid "Bacula \"End of Tape\" label found.\n" -msgstr "" - -#: src/stored/label.c:1380 src/stored/label.c:1392 -#, c-format -msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d\n" -msgstr "" - -#: src/stored/label.c:1382 -#, c-format -msgid " Job=%s Date=%s Level=%c Type=%c\n" -msgstr "" - -#: src/stored/label.c:1394 -#, c-format -msgid " Date=%s Level=%c Type=%c Files=%s Bytes=%s Errors=%d Status=%c\n" -msgstr "" - -#: src/stored/lock.c:266 src/stored/lock.c:299 -#, fuzzy, c-format -msgid "pthread_cond_wait failure. ERR=%s\n" -msgstr "pthread_cond_wait: ERR=%s\n" - -#: src/stored/lock.c:608 -#, fuzzy -msgid "unknown blocked code" -msgstr "unbekannt" - -#: src/stored/mount.c:89 -#, c-format -msgid "Too many errors trying to mount %s device %s.\n" -msgstr "" - -#: src/stored/mount.c:97 -#, c-format -msgid "Job %d canceled.\n" -msgstr "" - -#: src/stored/mount.c:218 -#, fuzzy, c-format -msgid "Open of %s device %s Volume \"%s\" failed: ERR=%s\n" -msgstr "Erzeugung von db Device Eintrag %s fehlgeschlagen: ERR=%s\n" - -#: src/stored/mount.c:296 -#, c-format -msgid "Volume \"%s\" previously written, moving to end of data.\n" -msgstr "" - -#: src/stored/mount.c:302 -#, fuzzy, c-format -msgid "Unable to position to end of data on %s device %s: ERR=%s\n" -msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" - -#: src/stored/mount.c:446 src/stored/mount.c:835 -#, fuzzy, c-format -msgid "Volume \"%s\" not loaded on %s device %s.\n" -msgstr "1997 Volume \"%s\" Nicht in Catalog.\n" - -#: src/stored/mount.c:482 -#, c-format -msgid "" -"Director wanted Volume \"%s\".\n" -" Current Volume \"%s\" not acceptable because:\n" -" %s" -msgstr "" - -#: src/stored/mount.c:660 -#, c-format -msgid "Ready to append to end of Volume \"%s\" part=%d size=%s\n" -msgstr "" - -#: src/stored/mount.c:664 -#, c-format -msgid "" -"Bacula cannot write on DVD Volume \"%s\" because: The sizes do not match! " -"Volume=%s Catalog=%s\n" -msgstr "" - -#: src/stored/mount.c:678 -#, c-format -msgid "Ready to append to end of Volume \"%s\" at file=%d.\n" -msgstr "" - -#: src/stored/mount.c:681 -#, c-format -msgid "" -"For Volume \"%s\":\n" -"The number of files mismatch! Volume=%u Catalog=%u\n" -"Correcting Catalog\n" -msgstr "" - -#: src/stored/mount.c:688 src/stored/mount.c:747 -#, fuzzy -msgid "Error updating Catalog\n" -msgstr "Fehler beim holen von Zeile: %s\n" - -#: src/stored/mount.c:693 -#, c-format -msgid "" -"Bacula cannot write on tape Volume \"%s\" because:\n" -"The number of files mismatch! Volume=%u Catalog=%u\n" -msgstr "" - -#: src/stored/mount.c:717 -#, c-format -msgid "Ready to append to end of Volumes \"%s\" ameta size=%s adata size=%s\n" -msgstr "" - -#: src/stored/mount.c:722 -#, c-format -msgid "Ready to append to end of Volume \"%s\" size=%s\n" -msgstr "" - -#: src/stored/mount.c:729 -#, c-format -msgid "" -"For Volume \"%s\":\n" -" The sizes do not match! Metadata Volume=%s Catalog=%s\n" -" Correcting Catalog\n" -msgstr "" - -#: src/stored/mount.c:736 -#, c-format -msgid "" -"For aligned Volume \"%s\":\n" -" Aligned sizes do not match! Aligned Volume=%s Catalog=%s\n" -" Correcting Catalog\n" -msgstr "" - -#: src/stored/mount.c:752 -#, c-format -msgid "" -"Bacula cannot write on disk Volume \"%s\" because: The sizes do not match! " -"Volume=%s Catalog=%s\n" -msgstr "" - -#: src/stored/mount.c:818 -#, fuzzy, c-format -msgid "Labeled new Volume \"%s\" on %s device %s.\n" -msgstr "Neues Volume \"%s\" in catalog erzeugt.\n" - -#: src/stored/mount.c:829 -#, fuzzy, c-format -msgid "%s device %s not configured to autolabel Volumes.\n" -msgstr "TLS benötigt aber nicht konfiguriert in Bacula.\n" - -#: src/stored/mount.c:853 -#, c-format -msgid "Marking Volume \"%s\" in Error in Catalog.\n" -msgstr "" - -#: src/stored/mount.c:870 -#, c-format -msgid "" -"Autochanger Volume \"%s\" not found in slot %d.\n" -" Setting InChanger to zero in catalog.\n" -msgstr "" - -#: src/stored/mount.c:889 -msgid "Hey!!!!! WroteVol non-zero !!!!!\n" -msgstr "" - -#: src/stored/mount.c:939 -#, c-format -msgid "" -"Invalid tape position on volume \"%s\" on device %s. Expected %d, got %d\n" -msgstr "" - -#: src/stored/mount.c:980 -#, c-format -msgid "Cannot open %s Dev=%s, Vol=%s for reading.\n" -msgstr "" - -#: src/stored/os.c:126 -#, c-format -msgid "Unable to set eotmodel on device %s: ERR=%s\n" -msgstr "" - -#: src/stored/os.c:180 -msgid " Bacula status:" -msgstr "" - -#: src/stored/os.c:181 src/stored/os.c:264 src/stored/os.c:266 -#, c-format -msgid " file=%d block=%d\n" -msgstr "" - -#: src/stored/os.c:185 src/stored/tape_dev.c:345 -#, c-format -msgid "ioctl MTIOCGET error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/os.c:189 -msgid " Device status:" -msgstr "" - -#: src/stored/os.c:365 -#, fuzzy, c-format -msgid "unknown func code %d" -msgstr "unbekannt" - -#: src/stored/os.c:371 -#, c-format -msgid "I/O function \"%s\" not supported on this device.\n" -msgstr "" - -#: src/stored/parse_bsr.c:116 -#, c-format -msgid "Cannot open bootstrap file %s: %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:220 -#, c-format -msgid "Device \"%s\" in bsr at inappropriate place.\n" -msgstr "" - -#: src/stored/parse_bsr.c:283 -#, fuzzy, c-format -msgid "REGEX '%s' compile error. ERR=%s\n" -msgstr "Regex Übersetzungsfehler. ERR=%s\n" - -#: src/stored/parse_bsr.c:326 -msgid "JobType not yet implemented\n" -msgstr "" - -#: src/stored/parse_bsr.c:334 -msgid "JobLevel not yet implemented\n" -msgstr "" - -#: src/stored/parse_bsr.c:379 -#, c-format -msgid "MediaType %s in bsr at inappropriate place.\n" -msgstr "" - -#: src/stored/parse_bsr.c:684 -#, c-format -msgid "Slot %d in bsr at inappropriate place.\n" -msgstr "" - -#: src/stored/parse_bsr.c:708 -#, c-format -msgid "VolFile : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:716 -#, c-format -msgid "VolBlock : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:724 -#, c-format -msgid "VolAddr : %llu-%llu\n" -msgstr "" - -#: src/stored/parse_bsr.c:733 -#, c-format -msgid "FileIndex : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:735 -#, c-format -msgid "FileIndex : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:745 -#, c-format -msgid "JobId : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:747 -#, c-format -msgid "JobId : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:757 -#, c-format -msgid "SessId : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:759 -#, c-format -msgid "SessId : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:768 -#, c-format -msgid "VolumeName : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:769 -#, c-format -msgid " MediaType : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:770 -#, c-format -msgid " Device : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:771 -#, c-format -msgid " Slot : %d\n" -msgstr "" - -#: src/stored/parse_bsr.c:780 -#, c-format -msgid "Client : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:788 -#, c-format -msgid "Job : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:796 -#, c-format -msgid "SessTime : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:807 -msgid "BSR is NULL\n" -msgstr "" - -#: src/stored/parse_bsr.c:811 -#, c-format -msgid "Next : 0x%x\n" -msgstr "" - -#: src/stored/parse_bsr.c:812 -#, c-format -msgid "Root bsr : 0x%x\n" -msgstr "" - -#: src/stored/parse_bsr.c:824 -#, c-format -msgid "count : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:825 -#, c-format -msgid "found : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:828 -#, c-format -msgid "done : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:829 -#, c-format -msgid "positioning : %d\n" -msgstr "" - -#: src/stored/parse_bsr.c:830 -#, c-format -msgid "fast_reject : %d\n" -msgstr "" - -#: src/stored/parse_bsr.c:1054 src/stored/parse_bsr.c:1058 -#, c-format -msgid "" -"Bootstrap file error: %s\n" -" : Line %d, col %d of file %s\n" -"%s\n" -msgstr "" - -#: src/stored/read.c:56 -msgid "No Volume names found for restore.\n" -msgstr "" - -#: src/stored/read.c:201 src/stored/read.c:360 -#, c-format -msgid ">filed: Error Hdr=%s\n" -msgstr "" - -#: src/stored/read.c:202 -#, fuzzy, c-format -msgid "Error sending header to Client. ERR=%s\n" -msgstr "Fehler beim senden von \"Hello\" an Storage daemon. ERR=%s\n" - -#: src/stored/read.c:248 src/stored/read.c:376 -#, c-format -msgid "Error sending to FD. ERR=%s\n" -msgstr "" - -#: src/stored/read.c:249 -#, fuzzy, c-format -msgid "Error sending data to Client. ERR=%s\n" -msgstr "Fehler beim senden von \"Hello\" an Storage daemon. ERR=%s\n" - -#: src/stored/read.c:332 src/stored/read.c:361 src/stored/read.c:377 -#, c-format -msgid "Error sending to File daemon. ERR=%s\n" -msgstr "" - -#: src/stored/read_records.c:79 -#, c-format -msgid "End of Volume at file %u on device %s, Volume \"%s\"\n" -msgstr "" - -#: src/stored/read_records.c:83 -msgid "End of all volumes.\n" -msgstr "" - -#: src/stored/read_records.c:133 -msgid "Did fsr in attemp to skip bad record.\n" -msgstr "" - -#: src/stored/read_records.c:375 -#, c-format -msgid "Forward spacing Volume \"%s\" to file:block %u:%u.\n" -msgstr "" - -#: src/stored/read_records.c:399 -msgid "Begin Session" -msgstr "" - -#: src/stored/read_records.c:403 -msgid "End Session" -msgstr "" - -#: src/stored/read_records.c:409 -#, c-format -msgid "Unknown code %d\n" -msgstr "" - -#: src/stored/record_util.c:62 -#, fuzzy, c-format -msgid "unknown: %d" -msgstr "unbekannt" - -#: src/stored/reserve.c:65 -#, c-format -msgid "Unable to initialize reservation lock. ERR=%s\n" -msgstr "" - -#: src/stored/reserve.c:145 -#, c-format -msgid "Hey! num_writers=%d!!!!\n" -msgstr "" - -#: src/stored/reserve.c:260 -msgid "3939 Could not get dcr\n" -msgstr "" - -#: src/stored/reserve.c:369 -#, fuzzy, c-format -msgid "Device reservation failed for JobId=%d: %s\n" -msgstr "Mehr als ein Dateiname! %s für Datei: %s\n" - -#: src/stored/reserve.c:378 -#, c-format -msgid "Failed command: %s\n" -msgstr "" - -#: src/stored/reserve.c:654 -#, c-format -msgid "" -"\n" -" Device \"%s\" requested by DIR is disabled.\n" -msgstr "" - -#: src/stored/reserve.c:669 -#, c-format -msgid "3926 Could not get dcr for device: %s\n" -msgstr "" - -#: src/stored/reserve.c:809 -#, fuzzy, c-format -msgid "3603 JobId=%u %s device %s is busy reading.\n" -msgstr "unbekannt" - -#: src/stored/reserve.c:818 -#, c-format -msgid "3604 JobId=%u %s device %s is BLOCKED due to user unmount.\n" -msgstr "" - -#: src/stored/reserve.c:866 -#, c-format -msgid "3601 JobId=%u %s device %s is BLOCKED due to user unmount.\n" -msgstr "" - -#: src/stored/reserve.c:874 -#, fuzzy, c-format -msgid "" -"3602 JobId=%u %s device %s is busy (already reading/writing). read=%d, " -"writers=%d reserved=%d\n" -msgstr "unbekannt" - -#: src/stored/reserve.c:913 -#, fuzzy, c-format -msgid "3609 JobId=%u Max concurrent jobs=%d exceeded on %s device %s.\n" -msgstr "JobId %s, Job %s zum Abbruch markiert.\n" - -#: src/stored/reserve.c:931 -#, c-format -msgid "" -"3610 JobId=%u Aligned volume max bytes does not allow concurrency on drive " -"%s.\n" -msgstr "" - -#: src/stored/reserve.c:941 -#, fuzzy, c-format -msgid "3611 JobId=%u Volume max jobs=%d exceeded on %s device %s.\n" -msgstr "JobId %s, Job %s zum Abbruch markiert.\n" - -#: src/stored/reserve.c:966 -#, c-format -msgid "" -"3608 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" nreserve=%d on %s " -"device %s.\n" -msgstr "" - -#: src/stored/reserve.c:1018 -#, c-format -msgid "3605 JobId=%u wants free drive but %s device %s is busy.\n" -msgstr "" - -#: src/stored/reserve.c:1027 -#, c-format -msgid "3606 JobId=%u prefers mounted drives, but %s device %s has no Volume.\n" -msgstr "" - -#: src/stored/reserve.c:1049 -#, c-format -msgid "3607 JobId=%u wants Vol=\"%s\" drive has Vol=\"%s\" on %s device %s.\n" -msgstr "" - -#: src/stored/reserve.c:1104 -#, c-format -msgid "Logic error!!!! JobId=%u Should not get here.\n" -msgstr "" - -#: src/stored/reserve.c:1105 -#, c-format -msgid "3910 JobId=%u Logic error!!!! %s device %s Should not get here.\n" -msgstr "" - -#: src/stored/reserve.c:1108 -msgid "Logic error!!!! Should not get here.\n" -msgstr "" - -#: src/stored/reserve.c:1111 -#, fuzzy, c-format -msgid "3911 JobId=%u failed reserve %s device %s.\n" -msgstr "JobId %s, Job %s zum Abbruch markiert.\n" - -#: src/stored/spool.c:72 -msgid "Spooling statistics:\n" -msgstr "" - -#: src/stored/spool.c:75 -#, c-format -msgid "" -"Data spooling: %u active jobs, %s bytes; %u total jobs, %s max bytes/job.\n" -msgstr "" - -#: src/stored/spool.c:83 -#, c-format -msgid "Attr spooling: %u active jobs, %s bytes; %u total jobs, %s max bytes.\n" -msgstr "" - -#: src/stored/spool.c:104 -msgid "Spooling data ...\n" -msgstr "" - -#: src/stored/spool.c:130 -#, c-format -msgid "Bad return from despool WroteVol=%d\n" -msgstr "" - -#: src/stored/spool.c:163 -#, c-format -msgid "Open data spool file %s failed: ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:191 -msgid "Despooling zero bytes. Your disk is probably FULL!\n" -msgstr "" - -#: src/stored/spool.c:200 -#, c-format -msgid "Committing spooled data to Volume \"%s\". Despooling %s bytes ...\n" -msgstr "" - -#: src/stored/spool.c:205 -#, c-format -msgid "Writing spooled data to Volume. Despooling %s bytes ...\n" -msgstr "" - -#: src/stored/spool.c:295 -#, c-format -msgid "" -"Despooling elapsed time = %02d:%02d:%02d, Transfer rate = %s Bytes/second\n" -msgstr "" - -#: src/stored/spool.c:304 src/stored/spool.c:505 src/stored/spool.c:551 -#, c-format -msgid "Ftruncate spool file failed: ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:363 -#, c-format -msgid "Spool header read error. ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:366 -#, c-format -msgid "Spool read error. Wanted %u bytes, got %d\n" -msgstr "" - -#: src/stored/spool.c:367 -#, c-format -msgid "Spool header read error. Wanted %u bytes, got %d\n" -msgstr "" - -#: src/stored/spool.c:374 src/stored/spool.c:375 -#, c-format -msgid "Spool block too big. Max %u bytes, got %u\n" -msgstr "" - -#: src/stored/spool.c:381 src/stored/spool.c:382 -#, c-format -msgid "Spool data read error. Wanted %u bytes, got %d\n" -msgstr "" - -#: src/stored/spool.c:436 -#, c-format -msgid "" -"User specified Job spool size reached: JobSpoolSize=%s MaxJobSpoolSize=%s\n" -msgstr "" - -#: src/stored/spool.c:441 -#, c-format -msgid "" -"User specified Device spool size reached: DevSpoolSize=%s MaxDevSpoolSize=" -"%s\n" -msgstr "" - -#: src/stored/spool.c:448 -msgid "Bad return from despool in write_block.\n" -msgstr "" - -#: src/stored/spool.c:456 -msgid "Spooling data again ...\n" -msgstr "" - -#: src/stored/spool.c:488 -#, c-format -msgid "Error writing header to spool file. ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:493 -#, c-format -msgid "" -"Error writing header to spool file. Disk probably full. Attempting recovery. " -"Wanted to write=%d got=%d\n" -msgstr "" - -#: src/stored/spool.c:511 src/stored/spool.c:557 -msgid "Fatal despooling error." -msgstr "" - -#: src/stored/spool.c:519 -msgid "Retrying after header spooling error failed.\n" -msgstr "" - -#: src/stored/spool.c:535 -#, c-format -msgid "Error writing data to spool file. ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:568 -msgid "Retrying after data spooling error failed.\n" -msgstr "" - -#: src/stored/spool.c:655 -#, fuzzy -msgid "Network error on BlastAttributes.\n" -msgstr " use as configuration file\n" -" -d [,] set debug level to , debug tags to \n" -" -dt print timestamp in debug output\n" -" -f run in foreground (for debugging)\n" -" -g set groupid to group\n" -" -m print kaboom output (for debugging)\n" -" -p proceed despite I/O errors\n" -" -s no signals (for debugging)\n" -" -t test - read config and exit\n" -" -u userid to \n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Version: %s (%s)\n" -"\n" -"Usage: bacula-fd [-f -s] [-c config_datei] [-d debug_level]\n" -" -c benutze als Konfigurationsdatei\n" -" -dnn setze debug level auf nn\n" -" -f starte in Vordergrund (für debugging)\n" -" -g groupid\n" -" -s no signals (für debugging)\n" -" -t Konfigurationsdatei testen und beenden\n" -" -u userid\n" -" -v Ausführliche Benutzermeldungen\n" -" -? diese Meldung ausgeben.\n" -"\n" - -#: src/stored/stored.c:273 -msgid "Volume Session Time is ZERO!\n" -msgstr "" - -#: src/stored/stored.c:282 -#, c-format -msgid "Unable to create thread. ERR=%s\n" -msgstr "" - -#: src/stored/stored.c:592 -#, fuzzy, c-format -msgid "Unable to stat ControlDevice %s: ERR=%s\n" -msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" - -#: src/stored/stored.c:598 -msgid "No plugin directory configured for SAN shared storage\n" -msgstr "" - -#: src/stored/stored.c:619 -#, c-format -msgid "Could not open device %s\n" -msgstr "" - -#: src/stored/stored.c:637 -#, c-format -msgid "Could not mount device %s\n" -msgstr "" - -#: src/stored/stored_conf.c:237 -#, c-format -msgid "Expected a Device Type keyword, got: %s" -msgstr "" - -#: src/stored/stored_conf.c:251 -#, c-format -msgid "" -"Maximum Block Size configured value %u is greater than allowed maximum: %u" -msgstr "" - -#: src/stored/stored_conf.c:264 -#, c-format -msgid "Warning: no \"%s\" resource (%d) defined.\n" -msgstr "" - -#: src/stored/stored_conf.c:267 -#, c-format -msgid "dump_resource type=%d\n" -msgstr "" - -#: src/stored/stored_conf.c:391 -#, fuzzy, c-format -msgid "Warning: unknown resource type %d\n" -msgstr "unbekannt" - -#: src/stored/stored_conf.c:601 -#, c-format -msgid "\"%s\" item is required in \"%s\" resource, but not found.\n" -msgstr "" - -#: src/stored/stored_conf.c:607 -#, c-format -msgid "Too many items in \"%s\" resource\n" -msgstr "" - -#: src/stored/stored_conf.c:641 -#, c-format -msgid "Cannot find AutoChanger resource %s\n" -msgstr "" - -#: src/stored/stored_conf.c:657 -#, fuzzy, c-format -msgid "Unable to init lock: ERR=%s\n" -msgstr "Kann DB lock nicht initialisieren. ERR=%s\n" - -#: src/stored/tape_dev.c:227 -#, c-format -msgid "No tape loaded or drive offline on %s.\n" -msgstr "" - -#: src/stored/tape_dev.c:237 -#, c-format -msgid "Rewind error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:262 -#, c-format -msgid "Bad call to eod. Device %s not open\n" -msgstr "" - -#: src/stored/tape_dev.c:334 -#, c-format -msgid "ioctl MTEOM error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:429 -msgid "Bad call to load_dev. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:440 src/stored/tape_dev.c:453 -#, c-format -msgid "ioctl MTLOAD error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:484 -#, c-format -msgid "ioctl MTOFFL error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:525 -msgid "Bad call to fsf. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:536 src/stored/tape_dev.c:663 -#, c-format -msgid "Device %s at End of Tape.\n" -msgstr "" - -#: src/stored/tape_dev.c:567 src/stored/tape_dev.c:643 -#, c-format -msgid "ioctl MTFSF error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:692 -msgid "Bad call to bsf. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:698 -#, c-format -msgid "Device %s cannot BSF because it is not a tape.\n" -msgstr "" - -#: src/stored/tape_dev.c:715 -#, c-format -msgid "ioctl MTBSF error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:734 -msgid "Bad call to fsr. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:744 -#, c-format -msgid "ioctl MTFSR not permitted on %s.\n" -msgstr "" - -#: src/stored/tape_dev.c:772 -#, c-format -msgid "ioctl MTFSR %d error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:790 -msgid "Bad call to bsr_dev. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:800 -#, c-format -msgid "ioctl MTBSR not permitted on %s.\n" -msgstr "" - -#: src/stored/tape_dev.c:814 -#, c-format -msgid "ioctl MTBSR error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:920 -msgid "Bad call to weof_dev. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:930 -msgid "Attempt to WEOF on non-appendable Volume\n" -msgstr "" - -#: src/stored/tape_dev.c:948 -#, c-format -msgid "ioctl MTWEOF error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/vbackup.c:68 -msgid "Read and write devices not properly initialized.\n" -msgstr "" - -#: src/stored/vbackup.c:74 -#, c-format -msgid "No Volume names found for %s.\n" -msgstr "" - -#: src/stored/vol_mgr.c:81 -#, fuzzy, c-format -msgid "Unable to initialize volume list lock. ERR=%s\n" -msgstr "Kann DB lock nicht initialisieren. ERR=%s\n" - -#: src/stored/vol_mgr.c:371 -#, fuzzy, c-format -msgid "Could not reserve volume \"%s\", because job canceled.\n" -msgstr "Konnte FileSet \"%s\" Eintrag nicht erzeugen. ERR=%s\n" - -#: src/stored/vol_mgr.c:382 -#, fuzzy, c-format -msgid "Could not reserve volume \"%s\" for append, because it will be read.\n" -msgstr "Konnte FileSet \"%s\" Eintrag nicht erzeugen. ERR=%s\n" - -#: src/stored/vol_mgr.c:415 -#, c-format -msgid "Cannot free Volume \"%s\", because it is reserved by someone else.\n" -msgstr "" - -#: src/stored/vol_mgr.c:516 -#, c-format -msgid "Volume %s is busy swapping from %s to %s\n" -msgstr "" - -#: src/stored/vol_mgr.c:519 src/stored/vol_mgr.c:526 -#, fuzzy, c-format -msgid "Volume %s is busy swapping.\n" -msgstr "unbekannt" - -#: src/stored/vol_mgr.c:523 -#, fuzzy, c-format -msgid "%s device %s is busy.\n" -msgstr "unbekannt" - -#: src/stored/wait.c:122 -#, c-format -msgid "pthread timedwait error. ERR=%s\n" -msgstr "" - -#: src/stored/wait.c:228 -#, fuzzy, c-format -msgid "JobId=%s, Job %s waiting to reserve a device.\n" -msgstr "JobId %s, Job %s zum Abbruch markiert.\n" - -#: src/stored/wait.c:274 -#, fuzzy, c-format -msgid "JobId=%s, Job %s waiting device %s.\n" -msgstr "JobId %s, Job %s zum Abbruch markiert.\n" - -#: src/tools/bbatch.c:65 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"Example : bbatch -w /path/to/workdir -h localhost -f dat1 -f dat -f datx\n" -" will start 3 thread and load dat1, dat and datx in your catalog\n" -"See bbatch.c to generate datafile\n" -"\n" -"Usage: bbatch [ options ] -w working/dir -f datafile\n" -" -b with batch mode\n" -" -B without batch mode\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database host (default NULL)\n" -" -w specify working directory\n" -" -r call restore code with given jobids\n" -" -v verbose\n" -" -f specify data file\n" -" -? print this message\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "Can't determine WAL directory\n" +#~ msgstr "Kann inkludierte Datei nicht öffnen: %s. ERR=%s\n" -#: src/tools/bbatch.c:187 src/tools/bbatch.c:236 src/tools/bvfs_test.c:203 -msgid "Could not init Bacula database\n" -msgstr "" +#, fuzzy +#~ msgid "Can't open WAL directory %s. ERR=%s\n" +#~ msgstr "Kann inkludierte Datei nicht öffnen: %s. ERR=%s\n" -#: src/tools/bbatch.c:197 -#, c-format -msgid "Computing file list for jobid=%s files=%lld secs=%d\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to detect the PostgreSQL data_directory on this system.\n" +#~ msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" -#: src/tools/bbatch.c:301 -#, fuzzy, c-format -msgid "Error opening datafile %s\n" -msgstr "Fehler beim holen von Zeile: %s\n" +#, fuzzy +#~ msgid "Unable to find data_directory=%s on this system. ERR=%s\n" +#~ msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" -#: src/tools/bbatch.c:311 #, fuzzy -msgid "Error while inserting file\n" -msgstr "Fehler beim schreiben der bsr Datei.\n" +#~ msgid "Unable to start the PITR backup on this system.\n" +#~ msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" -#: src/tools/bregex.c:142 src/tools/bregtest.c:126 src/tools/bwild.c:111 -#, c-format -msgid "Could not open data file: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to determine the first WAL file on this system.\n" +#~ msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" -#: src/tools/bsmtp.c:119 -#, c-format -msgid "Fatal malformed reply from %s: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to analyse tablespaces %s on this system. ERR=%s\n" +#~ msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" -#: src/tools/bsmtp.c:127 -#, c-format -msgid "Fatal fgets error: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to analyse data_directory %s on this system. ERR=%s\n" +#~ msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" -#: src/tools/bsmtp.c:163 -#, fuzzy, c-format -msgid "" -"\n" -"Usage: %s [-f from] [-h mailhost] [-s subject] [-c copy] [recipient ...]\n" -" -4 forces bsmtp to use IPv4 addresses only.\n" -" -6 forces bsmtp to use IPv6 addresses only.\n" -" -8 set charset to UTF-8\n" -" -a use any ip protocol for address resolution\n" -" -c set the Cc: field\n" -" -d set debug level to \n" -" -dt print a timestamp in debug output\n" -" -f set the From: field\n" -" -h use mailhost:port as the SMTP server\n" -" -s set the Subject: field\n" -" -r set the Reply-To: field\n" -" -l set the maximum number of lines to send (default: " -"unlimited)\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Version: %s (%s)\n" -"\n" -"Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c setze Konfigurationsdatei auf Datei\n" -" -dnn setze debug level auf nn\n" -" -f starte im Vordergrund (für debugging Zwecke)\n" -" -g groupid\n" -" -r starte jetzt\n" -" -s no signals\n" -" -t test - Konfiguration Lesen und beenden\n" -" -u userid\n" -" -v ausführliche Benutzer Meldungen\n" -" -? diese Meldung ausgeben.\n" -"\n" +#, fuzzy +#~ msgid "Can't create the %s file for recovery. ERR=%s\n" +#~ msgstr "Konnte FileSet \"%s\" Eintrag nicht erzeugen. ERR=%s\n" -#: src/tools/bsmtp.c:350 -msgid "Fatal error: no recipient given.\n" -msgstr "" +#, fuzzy +#~ msgid "3612 JobId=%u waiting because device %s is reserved by: %s.\n" +#~ msgstr "unbekannt" -#: src/tools/bsmtp.c:378 -#, c-format -msgid "Fatal gethostname error: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "No volumes specified for reading. Job %s canceled.\n" +#~ msgstr "Weder storage noch Pool in Job \"%s\" definiert.\n" -#: src/tools/bsmtp.c:389 -#, fuzzy, c-format -msgid "Fatal getaddrinfo for myself failed \"%s\": ERR=%s\n" -msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" +#, fuzzy +#~ msgid "Read open %s device %s Volume \"%s\" failed: ERR=%s\n" +#~ msgstr "Erzeugung von db Device Eintrag %s fehlgeschlagen: ERR=%s\n" -#: src/tools/bsmtp.c:397 -#, c-format -msgid "Fatal gethostbyname for myself failed \"%s\": ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Could not ready %s device %s for append.\n" +#~ msgstr "Konnte FileSet \"%s\" Eintrag nicht erzeugen. ERR=%s\n" -#: src/tools/bsmtp.c:457 src/tools/bsmtp.c:492 -#, fuzzy, c-format -msgid "Error unknown mail host \"%s\": ERR=%s\n" -msgstr "unbekannt" +#, fuzzy +#~ msgid "Error closing device %s. ERR=%s.\n" +#~ msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" -#: src/tools/bsmtp.c:460 src/tools/bsmtp.c:495 -msgid "Retrying connection using \"localhost\".\n" -msgstr "" +#, fuzzy +#~ msgid "Error reading data header from FD. n=%d msglen=%d ERR=%s\n" +#~ msgstr "Fehler beim Lesen der catalog DB Steuerdatei. ERR=%s\n" -#: src/tools/bsmtp.c:485 -#, fuzzy, c-format -msgid "Failed to connect to mailhost %s\n" -msgstr "Verbindung zu File daemon fehlgeschlagen.\n" +#, fuzzy +#~ msgid "Network error reading from FD. ERR=%s\n" +#~ msgstr "Netzwerkfehler mit FD bei %s: ERR=%s\n" -#: src/tools/bsmtp.c:503 -#, c-format -msgid "Fatal error: Unknown address family for smtp host: %d\n" -msgstr "" +#, fuzzy +#~ msgid "DDE commit failed. ERR=%s\n" +#~ msgstr "pthread_create: ERR=%s\n" -#: src/tools/bsmtp.c:512 src/tools/bsmtp.c:517 -#, c-format -msgid "Fatal socket error: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Error writing end session label. ERR=%s\n" +#~ msgstr "Fehler beim Aktualisieren der DB Media Datei. ERR=%s\n" -#: src/tools/bsmtp.c:522 -#, c-format -msgid "Fatal connect error to %s: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Set ok=FALSE after write_final_block_to_device.\n" +#~ msgstr "Fehler beim schreiben der bsr Datei.\n" -#: src/tools/bsmtp.c:531 -#, c-format -msgid "Fatal _open_osfhandle error: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "TLS negotiation failed with DIR at \"%s:%d\"\n" +#~ msgstr "TLS Aushandlung fehlgeschlagen mit SD an \"%s:%d\"\n" -#: src/tools/bsmtp.c:538 src/tools/bsmtp.c:542 src/tools/bsmtp.c:551 -#: src/tools/bsmtp.c:555 -#, c-format -msgid "Fatal fdopen error: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "TLS negotiation failed with FD at \"%s:%d\"\n" +#~ msgstr "TLS Aushandlung fehlgeschlagen mit FD an \"%s:%d\".\n" -#: src/tools/bsmtp.c:547 -#, c-format -msgid "Fatal dup error: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Lock failure on autochanger. ERR=%s\n" +#~ msgstr "pthread_cond_wait: ERR=%s\n" -#: src/tools/bsnapshot.c:47 -#, c-format -msgid "" -"ERROR %s\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "Unlock failure on autochanger. ERR=%s\n" +#~ msgstr "pthread_cond_wait: ERR=%s\n" -#: src/tools/bsnapshot.c:51 -#, c-format -msgid "" -"Bacula Systems SA(R) %s (%s)\n" -"\n" -"Usage: bsnapshot\n" -" -d level Set debug level\n" -" -v Verbose\n" -" -s Use sudo\n" -" -o logfile send debug to logfile\n" -" -V volume volume\n" -" -T type volume type\n" -" -t check compatibility\n" -" -c specify configuration file\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bcopy [-d debug_level] \n" +#~ " -b bootstrap specify a bootstrap file\n" +#~ " -c specify a Storage configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -i specify input Volume names (separated by |)\n" +#~ " -o specify output Volume names (separated by |)\n" +#~ " -p proceed inspite of errors\n" +#~ " -v verbose\n" +#~ " -w specify working directory (default /tmp)\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Version: %s (%s)\n" +#~ "\n" +#~ "Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c setze Konfigurationsdatei auf Datei\n" +#~ " -dnn setze debug level auf nn\n" +#~ " -f starte im Vordergrund (für debugging Zwecke)\n" +#~ " -g groupid\n" +#~ " -r starte jetzt\n" +#~ " -s no signals\n" +#~ " -t test - Konfiguration Lesen und beenden\n" +#~ " -u userid\n" +#~ " -v ausführliche Benutzer Meldungen\n" +#~ " -? diese Meldung ausgeben.\n" +#~ "\n" -#: src/tools/bsnapshot.c:1876 -msgid "Unable to open -p argument for reading" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bextract \n" +#~ " -b specify a bootstrap file\n" +#~ " -c specify a Storage configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -T send debug traces to trace file\n" +#~ " -e exclude list\n" +#~ " -i include list\n" +#~ " -p proceed inspite of I/O errors\n" +#~ " -t read data from volume, do not write anything\n" +#~ " -v verbose\n" +#~ " -V specify Volume names (separated by |)\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Version: %s (%s)\n" +#~ "\n" +#~ "Usage: bacula-fd [-f -s] [-c config_datei] [-d debug_level]\n" +#~ " -c benutze als Konfigurationsdatei\n" +#~ " -dnn setze debug level auf nn\n" +#~ " -f starte in Vordergrund (für debugging)\n" +#~ " -g groupid\n" +#~ " -s no signals (für debugging)\n" +#~ " -t Konfigurationsdatei testen und beenden\n" +#~ " -u userid\n" +#~ " -v Ausführliche Benutzermeldungen\n" +#~ " -? diese Meldung ausgeben.\n" +#~ "\n" -#: src/tools/bvfs_test.c:44 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database host (default NULL)\n" -" -w specify working directory\n" -" -j specify jobids\n" -" -p specify path\n" -" -f specify file\n" -" -l maximum tuple to fetch\n" -" -T truncate cache table before starting\n" -" -v verbose\n" -" -? print this message\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "LZO uncompression error. ERR=%d\n" +#~ msgstr "Regex Übersetzungsfehler. ERR=%s\n" -#: src/tools/cats_test.c:47 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database host (default NULL)\n" -" -w specify working directory\n" -" -p specify path\n" -" -f specify file\n" -" -l maximum tuple to fetch\n" -" -q print only errors\n" -" -v verbose\n" -" -? print this message\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "Error writing final JobMedia record to catalog.\n" +#~ msgstr "Fehler beim schreiben der bsr Datei.\n" -#: src/tools/cats_test.c:363 -#, fuzzy, c-format -msgid "Could not open, database \"%s\".\n" -msgstr "Konnte Datenbank \"%s\" nicht öffen.\n" +#, fuzzy +#~ msgid "Job failed or canceled.\n" +#~ msgstr "%s Abgebrochen" -#: src/tools/dbcheck.c:178 -msgid "" -"Warning skipping the additional parameters for working directory/dbname/user/" -"password/host.\n" -msgstr "" +#, fuzzy +#~ msgid "The Volume=%s on device=%s appears to be unlabeled.\n" +#~ msgstr "Neues Volume \"%s\" in catalog erzeugt.\n" -#: src/tools/dbcheck.c:196 -#, c-format -msgid "Error can not find the Catalog name[%s] in the given config file [%s]\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "User defined maximum volume size %s will be exceeded on device %s.\n" +#~ " Marking Volume \"%s\" as Full.\n" +#~ msgstr "\"Max Volume bytes\"erreicht. Markiere Volume \"%s\" als Voll.\n" -#: src/tools/dbcheck.c:198 -#, c-format -msgid "Error there is no Catalog section in the given config file [%s]\n" -msgstr "" +#, fuzzy +#~ msgid "Error sending Volume info to Director.\n" +#~ msgstr "Keine Volumes zum Wiederherstellen gefunden.\n" -#: src/tools/dbcheck.c:207 -msgid "Error no Director resource defined.\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bls [options] \n" +#~ " -b specify a bootstrap file\n" +#~ " -c specify a Storage configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -e exclude list\n" +#~ " -i include list\n" +#~ " -j list jobs\n" +#~ " -k list blocks\n" +#~ " (no j or k option) list saved files\n" +#~ " -L dump label\n" +#~ " -p proceed inspite of errors\n" +#~ " -v be verbose\n" +#~ " -V specify Volume names (separated by |)\n" +#~ " -E Check records to detect errors\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Version: %s (%s)\n" +#~ "\n" +#~ "Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c setze Konfigurationsdatei auf Datei\n" +#~ " -dnn setze debug level auf nn\n" +#~ " -f starte im Vordergrund (für debugging Zwecke)\n" +#~ " -g groupid\n" +#~ " -r starte jetzt\n" +#~ " -s no signals\n" +#~ " -t test - Konfiguration Lesen und beenden\n" +#~ " -u userid\n" +#~ " -v ausführliche Benutzer Meldungen\n" +#~ " -? diese Meldung ausgeben.\n" +#~ "\n" -#: src/tools/dbcheck.c:231 -msgid "Wrong number of arguments.\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bscan [ options ] \n" +#~ " -b bootstrap specify a bootstrap file\n" +#~ " -c specify configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -m update media info in database\n" +#~ " -D specify the driver database name (default NULL)\n" +#~ " -n specify the database name (default bacula)\n" +#~ " -u specify database user name (default bacula)\n" +#~ " -P specify database password (default none)\n" +#~ " -h specify database host (default NULL)\n" +#~ " -t specify database port (default 0)\n" +#~ " -p proceed inspite of I/O errors\n" +#~ " -r list records\n" +#~ " -s synchronize or store in database\n" +#~ " -S show scan progress periodically\n" +#~ " -v verbose\n" +#~ " -V specify Volume names (separated by |)\n" +#~ " -w specify working directory (default from conf " +#~ "file)\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Version: %s (%s)\n" +#~ "\n" +#~ "Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c setze Konfigurationsdatei auf Datei\n" +#~ " -dnn setze debug level auf nn\n" +#~ " -f starte im Vordergrund (für debugging Zwecke)\n" +#~ " -g groupid\n" +#~ " -r starte jetzt\n" +#~ " -s no signals\n" +#~ " -t test - Konfiguration Lesen und beenden\n" +#~ " -u userid\n" +#~ " -v ausführliche Benutzer Meldungen\n" +#~ " -? diese Meldung ausgeben.\n" +#~ "\n" -#: src/tools/dbcheck.c:236 -msgid "Working directory not supplied.\n" -msgstr "" +#, fuzzy +#~ msgid "Could not get Client record. ERR=%s\n" +#~ msgstr "Konnte Client Eintrag nicht anlegen. ERR=%s\n" -#: src/tools/dbcheck.c:272 -msgid "Database port must be a numeric value.\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bsdjson [options] [-c config_file] [config_file]\n" +#~ " -r get resource type \n" +#~ " -n get resource \n" +#~ " -l get only directives matching dirs (use with -r)\n" +#~ " -D get only data\n" +#~ " -c use as configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -t test - read config and exit\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Version: %s (%s)\n" +#~ "\n" +#~ "Usage: bacula-fd [-f -s] [-c config_datei] [-d debug_level]\n" +#~ " -c benutze als Konfigurationsdatei\n" +#~ " -dnn setze debug level auf nn\n" +#~ " -f starte in Vordergrund (für debugging)\n" +#~ " -g groupid\n" +#~ " -s no signals (für debugging)\n" +#~ " -t Konfigurationsdatei testen und beenden\n" +#~ " -u userid\n" +#~ " -v Ausführliche Benutzermeldungen\n" +#~ " -? diese Meldung ausgeben.\n" +#~ "\n" -#: src/tools/dbcheck.c:275 -msgid "Database port must be a int value.\n" -msgstr "" +#, fuzzy +#~ msgid "Volume type error: ERR=%s\n" +#~ msgstr "Attribute create error. %s" -#: src/tools/dbcheck.c:346 -#, c-format -msgid "Hello, this is the database check/correct program.\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Error writing record to block.\n" +#~ msgstr "Fehler beim schreiben der bsr Datei.\n" -#: src/tools/dbcheck.c:348 -#, c-format -msgid "Modify database is on." -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Error writing block to device.\n" +#~ msgstr "Fehler beim schreiben der bsr Datei.\n" -#: src/tools/dbcheck.c:350 -#, c-format -msgid "Modify database is off." -msgstr "" +#, fuzzy +#~ msgid "Flush block failed.\n" +#~ msgstr "Job Einrichtung Fehlgeschlagen.\n" -#: src/tools/dbcheck.c:352 src/tools/dbcheck.c:407 -#, c-format -msgid " Verbose is on.\n" -msgstr "" +#, fuzzy +#~ msgid "Job canceled.\n" +#~ msgstr "%s Abgebrochen" -#: src/tools/dbcheck.c:354 src/tools/dbcheck.c:409 -#, c-format -msgid " Verbose is off.\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: btape \n" +#~ " -b specify bootstrap file\n" +#~ " -c set configuration file to file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -p proceed inspite of I/O errors\n" +#~ " -s turn off signals\n" +#~ " -v be verbose\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Version: %s (%s)\n" +#~ "\n" +#~ "Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c setze Konfigurationsdatei auf Datei\n" +#~ " -dnn setze debug level auf nn\n" +#~ " -f starte im Vordergrund (für debugging Zwecke)\n" +#~ " -g groupid\n" +#~ " -r starte jetzt\n" +#~ " -s no signals\n" +#~ " -t test - Konfiguration Lesen und beenden\n" +#~ " -u userid\n" +#~ " -v ausführliche Benutzer Meldungen\n" +#~ " -? diese Meldung ausgeben.\n" +#~ "\n" -#: src/tools/dbcheck.c:356 -#, c-format -msgid "Please select the function you want to perform.\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot create DedupDirectory: %s" +#~ msgstr "kann Variable operate nicht setzen: ERR=%s\n" -#: src/tools/dbcheck.c:360 -#, c-format -msgid "" -"\n" -" 1) Toggle modify database flag\n" -" 2) Toggle verbose flag\n" -" 3) Repair bad Path records\n" -" 4) Eliminate duplicate Path records\n" -" 5) Eliminate orphaned Jobmedia records\n" -" 6) Eliminate orphaned File records\n" -" 7) Eliminate orphaned Path records\n" -" 8) Eliminate orphaned FileSet records\n" -" 9) Eliminate orphaned Client records\n" -" 10) Eliminate orphaned Job records\n" -" 11) Eliminate all Admin records\n" -" 12) Eliminate all Restore records\n" -" 13) All (3-12)\n" -" 14) Quit\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot create DedupIndexDirectory: %s" +#~ msgstr "kann Variable operate nicht setzen: ERR=%s\n" -#: src/tools/dbcheck.c:376 -#, c-format -msgid "" -"\n" -" 1) Toggle modify database flag\n" -" 2) Toggle verbose flag\n" -" 3) Check for bad Path records\n" -" 4) Check for duplicate Path records\n" -" 5) Check for orphaned Jobmedia records\n" -" 6) Check for orphaned File records\n" -" 7) Check for orphaned Path records\n" -" 8) Check for orphaned FileSet records\n" -" 9) Check for orphaned Client records\n" -" 10) Check for orphaned Job records\n" -" 11) Check for all Admin records\n" -" 12) Check for all Restore records\n" -" 13) All (3-12)\n" -" 14) Quit\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot create recovery directory: %s" +#~ msgstr "kann Variable operate nicht setzen: ERR=%s\n" -#: src/tools/dbcheck.c:393 -msgid "Select function number: " -msgstr "" +#, fuzzy +#~ msgid "Cannot delete temporary recovery directory: %s" +#~ msgstr "kann Variable operate nicht setzen: ERR=%s\n" -#: src/tools/dbcheck.c:400 -#, c-format -msgid "Database will be modified.\n" -msgstr "" +#, fuzzy +#~ msgid "Socket error or stop during rehydration. ERR=%d\n" +#~ msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" -#: src/tools/dbcheck.c:402 -#, c-format -msgid "Database will NOT be modified.\n" -msgstr "" +#, fuzzy +#~ msgid "Unexpected message from FD, n=%d msglen=%d msg=%s\n" +#~ msgstr "Fehler beim Lesen der catalog DB Steuerdatei. ERR=%s\n" -#: src/tools/dbcheck.c:481 -#, c-format -msgid "JobId=%s Name=\"%s\" StartTime=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Error sending chunk request to client\n" +#~ msgstr "Fehler beim senden von \"Hello\" an Storage daemon. ERR=%s\n" -#: src/tools/dbcheck.c:488 -#, c-format -msgid "Orphaned JobMediaId=%s JobId=%s Volume=\"%s\"\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "%s is an unknown device type. Must be tape or directory\n" +#~ " or have RequiresMount=yes for DVD. st_mode=%x\n" +#~ msgstr "unbekannt\n" -#: src/tools/dbcheck.c:495 -#, c-format -msgid "Orphaned FileId=%s JobId=%s Volume=\"%s\"\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to init spool mutex: ERR=%s\n" +#~ msgstr "Kann DB lock nicht initialisieren. ERR=%s\n" -#: src/tools/dbcheck.c:502 -#, c-format -msgid "Orphaned FileSetId=%s FileSet=\"%s\" MD5=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to init acquire mutex: ERR=%s\n" +#~ msgstr "Kann DB lock nicht initialisieren. ERR=%s\n" -#: src/tools/dbcheck.c:509 -#, c-format -msgid "Orphaned ClientId=%s Name=\"%s\"\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to init read acquire mutex: ERR=%s\n" +#~ msgstr "Kann DB lock nicht initialisieren. ERR=%s\n" -#: src/tools/dbcheck.c:562 -#, c-format -msgid "Deleting: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to init adata mutex: ERR=%s\n" +#~ msgstr "Kann DB lock nicht initialisieren. ERR=%s\n" -#: src/tools/dbcheck.c:634 -#, c-format -msgid "Checking for duplicate Path entries.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to init volcat mutex: ERR=%s\n" +#~ msgstr "Kann DB lock nicht initialisieren. ERR=%s\n" -#: src/tools/dbcheck.c:645 -#, c-format -msgid "Found %d duplicate Path records.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to init dcrs mutex: ERR=%s\n" +#~ msgstr "Kann DB lock nicht initialisieren. ERR=%s\n" -#: src/tools/dbcheck.c:646 src/tools/dbcheck.c:708 src/tools/dbcheck.c:754 -#: src/tools/dbcheck.c:822 src/tools/dbcheck.c:864 src/tools/dbcheck.c:906 -#: src/tools/dbcheck.c:948 src/tools/dbcheck.c:985 src/tools/dbcheck.c:1018 -#: src/tools/dbcheck.c:1052 -msgid "Print them? (yes/no): " -msgstr "" +#, fuzzy +#~ msgid "Bad client command: %s" +#~ msgstr "Storage daemon hat \"Job command\": %s abgelehnt\n" -#: src/tools/dbcheck.c:669 -#, c-format -msgid "Found %d for: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Client daemon" +#~ msgstr "File daemon" -#: src/tools/dbcheck.c:699 -#, c-format -msgid "Checking for orphaned JobMedia entries.\n" -msgstr "" +#, fuzzy +#~ msgid "Failed to connect to Client daemon: %s:%d\n" +#~ msgstr "Verbindung zu File daemon fehlgeschlagen.\n" -#: src/tools/dbcheck.c:707 -#, c-format -msgid "Found %d orphaned JobMedia records.\n" -msgstr "" +#, fuzzy +#~ msgid "3000 JobId=%ld Job=\"%s\" marked to be %s.\n" +#~ msgstr "JobId %s, Job %s zum Abbruch markiert.\n" -#: src/tools/dbcheck.c:725 -#, c-format -msgid "Deleting %d orphaned JobMedia records.\n" -msgstr "" +#, fuzzy +#~ msgid "3910 Unable to open device \"%s\": ERR=%s\n" +#~ msgstr "Kann Datenbank=%s.nicht öffen. ERR=%s\n" -#: src/tools/dbcheck.c:742 -#, c-format -msgid "Checking for orphaned File entries. This may take some time!\n" -msgstr "" +#, fuzzy +#~ msgid "3915 Failed to label Volume: ERR=%s\n" +#~ msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" -#: src/tools/dbcheck.c:753 -#, c-format -msgid "Found %d orphaned File records.\n" -msgstr "" +#, fuzzy +#~ msgid "Specified slot ignored. " +#~ msgstr "SQL fehlgeschlagen ERR=%s\n" -#: src/tools/dbcheck.c:770 -#, c-format -msgid "Deleting %d orphaned File records.\n" -msgstr "" +#, fuzzy +#~ msgid "3901 Unable to open device \"%s\": ERR=%s\n" +#~ msgstr "Kann Datenbank=%s.nicht öffen. ERR=%s\n" -#: src/tools/dbcheck.c:789 -#, c-format -msgid "Pruning orphaned Path entries isn't possible when using BVFS.\n" -msgstr "" +#, fuzzy +#~ msgid "3930 Device \"%s\" is being released.\n" +#~ msgstr "unbekannt" -#: src/tools/dbcheck.c:798 -msgid "Create temporary index? (yes/no): " -msgstr "" +#, fuzzy +#~ msgid "3905 Unknown wait state %d\n" +#~ msgstr "unbekannt" -#: src/tools/dbcheck.c:810 -#, c-format -msgid "Checking for orphaned Path entries. This may take some time!\n" -msgstr "" +#, fuzzy +#~ msgid "3002 Device \"%s\" enabled.\n" +#~ msgstr "Pool Ressource \"%s\" nicht gefunden.\n" -#: src/tools/dbcheck.c:821 -#, c-format -msgid "Found %d orphaned Path records.\n" -msgstr "" +#, fuzzy +#~ msgid "3002 Device \"%s\" disabled.\n" +#~ msgstr "Pool Ressource \"%s\" nicht gefunden.\n" -#: src/tools/dbcheck.c:834 -#, c-format -msgid "Deleting %d orphaned Path records.\n" -msgstr "" +#, fuzzy +#~ msgid "3002 Device \"%s\" unmounted.\n" +#~ msgstr "Pool Ressource \"%s\" nicht gefunden.\n" -#: src/tools/dbcheck.c:853 -#, c-format -msgid "Checking for orphaned FileSet entries. This takes some time!\n" -msgstr "" +#, fuzzy +#~ msgid "3901 Device \"%s\" is already unmounted.\n" +#~ msgstr "unbekannt" -#: src/tools/dbcheck.c:863 -#, c-format -msgid "Found %d orphaned FileSet records.\n" -msgstr "" +#, fuzzy +#~ msgid "3001 Device \"%s\" unmounted.\n" +#~ msgstr "Pool Ressource \"%s\" nicht gefunden.\n" -#: src/tools/dbcheck.c:878 -#, c-format -msgid "Deleting %d orphaned FileSet records.\n" -msgstr "" +#, fuzzy +#~ msgid "3921 Device \"%s\" already released.\n" +#~ msgstr "Device Eintrag %s bereits vorhanden\n" -#: src/tools/dbcheck.c:887 -#, c-format -msgid "Checking for orphaned Client entries.\n" -msgstr "" +#, fuzzy +#~ msgid "3923 Device \"%s\" is busy in acquire.\n" +#~ msgstr "unbekannt" -#: src/tools/dbcheck.c:905 -#, c-format -msgid "Found %d orphaned Client records.\n" -msgstr "" +#, fuzzy +#~ msgid "3998 Device \"%s\" is not an autochanger.\n" +#~ msgstr "unbekannt" -#: src/tools/dbcheck.c:920 -#, c-format -msgid "Deleting %d orphaned Client records.\n" -msgstr "" +#, fuzzy +#~ msgid "3935 Device \"%s\" is blocked labeling a Volume.\n" +#~ msgstr "unbekannt" -#: src/tools/dbcheck.c:929 -#, c-format -msgid "Checking for orphaned Job entries.\n" -msgstr "" +#, fuzzy +#~ msgid "3935 Device \"%s\" is blocked for unknown reason.\n" +#~ msgstr "unbekannt" -#: src/tools/dbcheck.c:947 -#, c-format -msgid "Found %d orphaned Job records.\n" -msgstr "" +#, fuzzy +#~ msgid "3936 Device \"%s\" is busy reading.\n" +#~ msgstr "unbekannt" -#: src/tools/dbcheck.c:962 -#, c-format -msgid "Deleting %d orphaned Job records.\n" -msgstr "" +#, fuzzy +#~ msgid "Command error with FD, hanging up. ERR=%s\n" +#~ msgstr "Netzwerkfehler mit FD bei %s: ERR=%s\n" -#: src/tools/dbcheck.c:964 -#, c-format -msgid "Deleting JobMedia records of orphaned Job records.\n" -msgstr "" +#, fuzzy +#~ msgid "FD command not found: %s\n" +#~ msgstr "Job nicht gefunden: %s\n" -#: src/tools/dbcheck.c:966 -#, c-format -msgid "Deleting Log records of orphaned Job records.\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot open session, received bad parameters.\n" +#~ msgstr "Kann Ausdruck\"%s\"nicht auflösen: ERR=%s\n" -#: src/tools/dbcheck.c:975 -#, c-format -msgid "Checking for Admin Job entries.\n" -msgstr "" +#, fuzzy +#~ msgid "Could not open(%s,%s,0640): ERR=%s\n" +#~ msgstr "Kann bootstrap Datei nicht öffnen: %s: ERR=%s\n" -#: src/tools/dbcheck.c:984 -#, c-format -msgid "Found %d Admin Job records.\n" -msgstr "" +#, fuzzy +#~ msgid "Could not open aligned volume: %s, ERR=%s\n" +#~ msgstr "Kann bootstrap Datei nicht öffnen: %s: ERR=%s\n" -#: src/tools/dbcheck.c:999 -#, c-format -msgid "Deleting %d Admin Job records.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to stat device %s. ERR=%s\n" +#~ msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" -#: src/tools/dbcheck.c:1008 -#, c-format -msgid "Checking for Restore Job entries.\n" -msgstr "" +#, fuzzy +#~ msgid "Could not reopen: %s, ERR=%s\n" +#~ msgstr "Kann bootstrap Datei nicht öffnen: %s: ERR=%s\n" -#: src/tools/dbcheck.c:1017 -#, c-format -msgid "Found %d Restore Job records.\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Connection from unknown Director %s at %s rejected.\n" +#~ "Please see " +#~ msgstr "unbekannt" -#: src/tools/dbcheck.c:1032 -#, c-format -msgid "Deleting %d Restore Job records.\n" -msgstr "" +#, fuzzy +#~ msgid "Invalid Hello from %s. Len=%d\n" +#~ msgstr "UA Hello von %s:%s:%d ist ungültig. Len=%d\n" -#: src/tools/dbcheck.c:1042 -#, c-format -msgid "Checking for Paths without a trailing slash\n" -msgstr "" +#, fuzzy +#~ msgid "Client connect failed: Job name not found: %s\n" +#~ msgstr "Job nicht gefunden: %s\n" -#: src/tools/dbcheck.c:1051 -#, c-format -msgid "Found %d bad Path records.\n" -msgstr "" +#, fuzzy +#~ msgid "Recv request to Client failed. ERR=%s\n" +#~ msgstr "Erzeugung des DB Client Eintrags %s fehlgeschlagen. ERR=%s\n" -#: src/tools/dbcheck.c:1068 -#, c-format -msgid "Reparing %d bad Filename records.\n" -msgstr "" +#, fuzzy +#~ msgid "Send caps to Client failed. ERR=%s\n" +#~ msgstr "Erzeugung des DB Client Eintrags %s fehlgeschlagen. ERR=%s\n" -#: src/tools/dbcheck.c:1214 -#, c-format -msgid "" -"Ok. Index over the %s column already exists and dbcheck will work faster.\n" -msgstr "" +#, fuzzy +#~ msgid "Recv caps from Client failed. ERR=%s\n" +#~ msgstr "Erzeugung des DB Client Eintrags %s fehlgeschlagen. ERR=%s\n" -#: src/tools/dbcheck.c:1217 -#, c-format -msgid "" -"Note. Index over the %s column not found, that can greatly slow down " -"dbcheck.\n" -msgstr "" +#, fuzzy +#~ msgid "Couldn't rewind %s device %s: ERR=%s\n" +#~ msgstr "Kann bootstrap Datei nicht öffnen: %s: ERR=%s\n" -#: src/tools/dbcheck.c:1232 -#, c-format -msgid "Create temporary index... This may take some time!\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Got Aligned or File type Volume %s on Dedup device %s. Wanted File.\n" +#~ msgstr "Neues Volume \"%s\" in catalog erzeugt.\n" -#: src/tools/dbcheck.c:1240 -#, c-format -msgid "Temporary index created.\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Got Aligned or Dedup type Volume %s on File device %s. Wanted File.\n" +#~ msgstr "Neues Volume \"%s\" in catalog erzeugt.\n" -#: src/tools/dbcheck.c:1255 -#, c-format -msgid "Drop temporary index.\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Got File or Dedup type Volume %s on Aligned device %s. Wanted Aligned.\n" +#~ msgstr "Neues Volume \"%s\" in catalog erzeugt.\n" -#: src/tools/dbcheck.c:1265 -#, c-format -msgid "Temporary index %s deleted.\n" -msgstr "" +#, fuzzy +#~ msgid "Could not reserve volume %s on %s device %s\n" +#~ msgstr "Konnte FileSet \"%s\" Eintrag nicht erzeugen. ERR=%s\n" -#: src/tools/drivetype.c:29 -#, c-format -msgid "" -"\n" -"Usage: drivetype [-v] path ...\n" -"\n" -" Print the drive type a given file/directory is on.\n" -" The following options are supported:\n" -"\n" -" -l print local fixed hard drive\n" -" -a display information on all drives\n" -" -v print both path and file system type.\n" -" -? print this message.\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "Open %s device %s Volume \"%s\" failed: ERR=%s\n" +#~ msgstr "Erzeugung von db Device Eintrag %s fehlgeschlagen: ERR=%s\n" -#: src/tools/drivetype.c:60 -#, fuzzy, c-format -msgid "%s: unknown\n" -msgstr "unbekannt" +#, fuzzy +#~ msgid "Rewind error on %s device %s: ERR=%s\n" +#~ msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" -#: src/tools/fstype.c:29 -#, c-format -msgid "" -"\n" -"Usage: fstype [-v] path ...\n" -"\n" -" Print the file system type for each file/directory argument given.\n" -" The following options are supported:\n" -"\n" -" -l print all file system types in mtab.\n" -" -m print full entries in mtab.\n" -" -v print both path and file system type of each argument.\n" -" -? print this message.\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "Truncate error on %s device %s: ERR=%s\n" +#~ msgstr "Socket Fehler auf %s Kommando: ERR=%s\n" -#: src/tools/fstype.c:163 -#, fuzzy, c-format -msgid "%s: unknown file system type\n" -msgstr "unbekannt" +#, fuzzy +#~ msgid "Failed to re-open DVD after truncate on %s device %s: ERR=%s\n" +#~ msgstr "Kann Catalog DB Steuerdatei nicht öffnen %s: ERR=%s\n" -#: src/tools/testfind.c:57 -#, c-format -msgid "" -"\n" -"Usage: testfind [-d debug_level] [-] [pattern1 ...]\n" -" -a print extended attributes (Win32 debug)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -c specify config file containing FileSet resources\n" -" -f specify which FileSet to use\n" -" -? print this message.\n" -"\n" -"Patterns are used for file inclusion -- normally directories.\n" -"Debug level >= 1 prints each file found.\n" -"Debug level >= 10 prints path/file for catalog.\n" -"Errors are always printed.\n" -"Files/paths truncated is the number of files/paths with len > 255.\n" -"Truncation is only in the catalog.\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to write %s device %s: ERR=%s\n" +#~ msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" -#: src/tools/testfind.c:223 -#, c-format -msgid "" -"\n" -"Total files : %d\n" -"Max file length: %d\n" -"Max path length: %d\n" -"Files truncated: %d\n" -"Paths truncated: %d\n" -"Hard links : %d\n" -msgstr "" +#, fuzzy +#~ msgid "pthread_cond_wait failure. ERR=%s\n" +#~ msgstr "pthread_cond_wait: ERR=%s\n" -#: src/tools/testfind.c:264 -#, c-format -msgid "Reg: %s\n" -msgstr "" +#, fuzzy +#~ msgid "unknown blocked code" +#~ msgstr "unbekannt" -#: src/tools/testfind.c:286 -msgid "\t[will not descend: recursion turned off]" -msgstr "" +#, fuzzy +#~ msgid "Open of %s device %s Volume \"%s\" failed: ERR=%s\n" +#~ msgstr "Erzeugung von db Device Eintrag %s fehlgeschlagen: ERR=%s\n" -#: src/tools/testfind.c:288 -msgid "\t[will not descend: file system change not allowed]" -msgstr "" +#, fuzzy +#~ msgid "Unable to position to end of data on %s device %s: ERR=%s\n" +#~ msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" -#: src/tools/testfind.c:290 -msgid "\t[will not descend: disallowed file system]" -msgstr "" +#, fuzzy +#~ msgid "Volume \"%s\" not loaded on %s device %s.\n" +#~ msgstr "1997 Volume \"%s\" Nicht in Catalog.\n" -#: src/tools/testfind.c:292 -msgid "\t[will not descend: disallowed drive type]" -msgstr "" +#, fuzzy +#~ msgid "Error updating Catalog\n" +#~ msgstr "Fehler beim holen von Zeile: %s\n" -#: src/tools/testfind.c:308 src/tools/testls.c:203 -#, c-format -msgid "Err: Could not access %s: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Labeled new Volume \"%s\" on %s device %s.\n" +#~ msgstr "Neues Volume \"%s\" in catalog erzeugt.\n" -#: src/tools/testfind.c:311 src/tools/testls.c:206 -#, c-format -msgid "Err: Could not follow ff->link %s: %s\n" -msgstr "" +#, fuzzy +#~ msgid "%s device %s not configured to autolabel Volumes.\n" +#~ msgstr "TLS benötigt aber nicht konfiguriert in Bacula.\n" -#: src/tools/testfind.c:314 src/tools/testls.c:209 -#, c-format -msgid "Err: Could not stat %s: %s\n" -msgstr "" +#, fuzzy +#~ msgid "unknown func code %d" +#~ msgstr "unbekannt" -#: src/tools/testfind.c:317 src/tools/testls.c:212 -#, c-format -msgid "Skip: File not saved. No change. %s\n" -msgstr "" +#, fuzzy +#~ msgid "REGEX '%s' compile error. ERR=%s\n" +#~ msgstr "Regex Übersetzungsfehler. ERR=%s\n" -#: src/tools/testfind.c:320 src/tools/testls.c:215 -#, c-format -msgid "Err: Attempt to backup archive. Not saved. %s\n" -msgstr "" +#, fuzzy +#~ msgid "Error sending header to Client. ERR=%s\n" +#~ msgstr "Fehler beim senden von \"Hello\" an Storage daemon. ERR=%s\n" -#: src/tools/testfind.c:323 src/tools/testls.c:224 -#, c-format -msgid "Err: Could not open directory %s: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Error sending data to Client. ERR=%s\n" +#~ msgstr "Fehler beim senden von \"Hello\" an Storage daemon. ERR=%s\n" -#: src/tools/testfind.c:326 src/tools/testls.c:227 -#, c-format -msgid "Err: Unknown file ff->type %d: %s\n" -msgstr "" +#, fuzzy +#~ msgid "unknown: %d" +#~ msgstr "unbekannt" -#: src/tools/testfind.c:376 -#, c-format -msgid "===== Filename truncated to 255 chars: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Device reservation failed for JobId=%d: %s\n" +#~ msgstr "Mehr als ein Dateiname! %s für Datei: %s\n" -#: src/tools/testfind.c:393 -#, c-format -msgid "========== Path name truncated to 255 chars: %s\n" -msgstr "" +#, fuzzy +#~ msgid "3603 JobId=%u %s device %s is busy reading.\n" +#~ msgstr "unbekannt" -#: src/tools/testfind.c:402 -#, c-format -msgid "========== Path length is zero. File=%s\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "3602 JobId=%u %s device %s is busy (already reading/writing). read=%d, " +#~ "writers=%d reserved=%d\n" +#~ msgstr "unbekannt" -#: src/tools/testfind.c:405 -#, c-format -msgid "Path: %s\n" -msgstr "" +#, fuzzy +#~ msgid "3609 JobId=%u Max concurrent jobs=%d exceeded on %s device %s.\n" +#~ msgstr "JobId %s, Job %s zum Abbruch markiert.\n" -#: src/tools/testls.c:47 -#, c-format -msgid "" -"\n" -"Usage: testls [-d debug_level] [-] [pattern1 ...]\n" -" -a print extended attributes (Win32 debug)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -e specify file of exclude patterns\n" -" -i specify file of include patterns\n" -" -q quiet, don't print filenames (debug)\n" -" - read pattern(s) from stdin\n" -" -? print this message.\n" -"\n" -"Patterns are file inclusion -- normally directories.\n" -"Debug level >= 1 prints each file found.\n" -"Debug level >= 10 prints path/file for catalog.\n" -"Errors always printed.\n" -"Files/paths truncated is number with len > 255.\n" -"Truncation is only in catalog.\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "3611 JobId=%u Volume max jobs=%d exceeded on %s device %s.\n" +#~ msgstr "JobId %s, Job %s zum Abbruch markiert.\n" -#: src/tools/testls.c:143 -#, c-format -msgid "Could not open include file: %s\n" -msgstr "" +#, fuzzy +#~ msgid "3911 JobId=%u failed reserve %s device %s.\n" +#~ msgstr "JobId %s, Job %s zum Abbruch markiert.\n" -#: src/tools/testls.c:156 -#, c-format -msgid "Could not open exclude file: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Network error on BlastAttributes.\n" +#~ msgstr " use as configuration file\n" +#~ " -d [,] set debug level to , debug tags to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -f run in foreground (for debugging)\n" +#~ " -g set groupid to group\n" +#~ " -m print kaboom output (for debugging)\n" +#~ " -p proceed despite I/O errors\n" +#~ " -s no signals (for debugging)\n" +#~ " -t test - read config and exit\n" +#~ " -u userid to \n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Version: %s (%s)\n" +#~ "\n" +#~ "Usage: bacula-fd [-f -s] [-c config_datei] [-d debug_level]\n" +#~ " -c benutze als Konfigurationsdatei\n" +#~ " -dnn setze debug level auf nn\n" +#~ " -f starte in Vordergrund (für debugging)\n" +#~ " -g groupid\n" +#~ " -s no signals (für debugging)\n" +#~ " -t Konfigurationsdatei testen und beenden\n" +#~ " -u userid\n" +#~ " -v Ausführliche Benutzermeldungen\n" +#~ " -? diese Meldung ausgeben.\n" +#~ "\n" -#: src/win32/libwin32/service.cpp:97 -msgid "Failure contacting the Service Handler" -msgstr "" +#, fuzzy +#~ msgid "Unable to stat ControlDevice %s: ERR=%s\n" +#~ msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" -#: src/win32/libwin32/service.cpp:108 -msgid "Service start report failed" -msgstr "" +#, fuzzy +#~ msgid "Warning: unknown resource type %d\n" +#~ msgstr "unbekannt" -#: src/win32/libwin32/service.cpp:161 -msgid "StartServiceCtrlDispatcher failed." -msgstr "" +#, fuzzy +#~ msgid "Unable to init lock: ERR=%s\n" +#~ msgstr "Kann DB lock nicht initialisieren. ERR=%s\n" -#: src/win32/libwin32/service.cpp:168 -msgid "KERNEL32.DLL not found: Bacula service not started" -msgstr "" +#, fuzzy +#~ msgid "Unable to initialize volume list lock. ERR=%s\n" +#~ msgstr "Kann DB lock nicht initialisieren. ERR=%s\n" -#: src/win32/libwin32/service.cpp:178 #, fuzzy -msgid "Registry service not found: Bacula service not started" -msgstr "Pool Ressource \"%s\" nicht gefunden.\n" +#~ msgid "Could not reserve volume \"%s\", because job canceled.\n" +#~ msgstr "Konnte FileSet \"%s\" Eintrag nicht erzeugen. ERR=%s\n" -#: src/win32/libwin32/service.cpp:180 #, fuzzy -msgid "Registry service entry point not found" -msgstr "Pool Ressource \"%s\" nicht gefunden.\n" +#~ msgid "" +#~ "Could not reserve volume \"%s\" for append, because it will be read.\n" +#~ msgstr "Konnte FileSet \"%s\" Eintrag nicht erzeugen. ERR=%s\n" -#: src/win32/libwin32/service.cpp:201 -msgid "Report Service failure" -msgstr "" +#, fuzzy +#~ msgid "Volume %s is busy swapping.\n" +#~ msgstr "unbekannt" -#: src/win32/libwin32/service.cpp:232 #, fuzzy -msgid "Unable to install the service" -msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" +#~ msgid "%s device %s is busy.\n" +#~ msgstr "unbekannt" -#: src/win32/libwin32/service.cpp:240 #, fuzzy -msgid "Service command length too long" -msgstr "Job nicht gefunden: %s\n" +#~ msgid "JobId=%s, Job %s waiting to reserve a device.\n" +#~ msgstr "JobId %s, Job %s zum Abbruch markiert.\n" -#: src/win32/libwin32/service.cpp:241 -msgid "Service command length too long. Service not registered." -msgstr "" +#, fuzzy +#~ msgid "JobId=%s, Job %s waiting device %s.\n" +#~ msgstr "JobId %s, Job %s zum Abbruch markiert.\n" -#: src/win32/libwin32/service.cpp:254 -msgid "" -"The Service Control Manager could not be contacted - the service was not " -"installed" -msgstr "" +#, fuzzy +#~ msgid "Error opening datafile %s\n" +#~ msgstr "Fehler beim holen von Zeile: %s\n" -#: src/win32/libwin32/service.cpp:277 src/win32/libwin32/service.cpp:306 -#: src/win32/libwin32/service.cpp:352 src/win32/libwin32/service.cpp:359 -#: src/win32/libwin32/service.cpp:363 -msgid "The Bacula service: " -msgstr "" +#, fuzzy +#~ msgid "Error while inserting file\n" +#~ msgstr "Fehler beim schreiben der bsr Datei.\n" -#: src/win32/libwin32/service.cpp:284 -msgid "" -"Provides file backup and restore services. Bacula -- the network backup " -"solution." -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Usage: %s [-f from] [-h mailhost] [-s subject] [-c copy] [recipient ...]\n" +#~ " -4 forces bsmtp to use IPv4 addresses only.\n" +#~ " -6 forces bsmtp to use IPv6 addresses only.\n" +#~ " -8 set charset to UTF-8\n" +#~ " -a use any ip protocol for address resolution\n" +#~ " -c set the Cc: field\n" +#~ " -d set debug level to \n" +#~ " -dt print a timestamp in debug output\n" +#~ " -f set the From: field\n" +#~ " -h use mailhost:port as the SMTP server\n" +#~ " -s set the Subject: field\n" +#~ " -r set the Reply-To: field\n" +#~ " -l set the maximum number of lines to send (default: " +#~ "unlimited)\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Version: %s (%s)\n" +#~ "\n" +#~ "Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c setze Konfigurationsdatei auf Datei\n" +#~ " -dnn setze debug level auf nn\n" +#~ " -f starte im Vordergrund (für debugging Zwecke)\n" +#~ " -g groupid\n" +#~ " -r starte jetzt\n" +#~ " -s no signals\n" +#~ " -t test - Konfiguration Lesen und beenden\n" +#~ " -u userid\n" +#~ " -v ausführliche Benutzer Meldungen\n" +#~ " -? diese Meldung ausgeben.\n" +#~ "\n" -#: src/win32/libwin32/service.cpp:295 -msgid "Cannot write System Registry for " -msgstr "" +#, fuzzy +#~ msgid "Fatal getaddrinfo for myself failed \"%s\": ERR=%s\n" +#~ msgstr "Catalog Fehler beim Aktualisieren von volume \"%s\". ERR=%s" -#: src/win32/libwin32/service.cpp:296 -msgid "" -"The System Registry could not be updated - the Bacula service was not " -"installed" -msgstr "" +#, fuzzy +#~ msgid "Error unknown mail host \"%s\": ERR=%s\n" +#~ msgstr "unbekannt" -#: src/win32/libwin32/service.cpp:305 -msgid "Cannot add Bacula key to System Registry" -msgstr "" +#, fuzzy +#~ msgid "Failed to connect to mailhost %s\n" +#~ msgstr "Verbindung zu File daemon fehlgeschlagen.\n" -#: src/win32/libwin32/service.cpp:316 -msgid "The " -msgstr "" +#, fuzzy +#~ msgid "Could not open, database \"%s\".\n" +#~ msgstr "Konnte Datenbank \"%s\" nicht öffen.\n" -#: src/win32/libwin32/service.cpp:370 -msgid "An existing Bacula service: " -msgstr "" +#, fuzzy +#~ msgid "%s: unknown\n" +#~ msgstr "unbekannt" -#: src/win32/libwin32/service.cpp:378 -msgid "" -"The service Manager could not be contacted - the Bacula service was not " -"removed" -msgstr "" +#, fuzzy +#~ msgid "%s: unknown file system type\n" +#~ msgstr "unbekannt" -#: src/win32/libwin32/service.cpp:391 -msgid "" -"Could not find registry entry.\n" -"Service probably not registerd - the Bacula service was not removed" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "Bacula ERROR: " +#~ msgstr "Bacula " -#: src/win32/libwin32/service.cpp:398 #, fuzzy -msgid "Could not delete Registry key for " -msgstr "Kann Storage resource %s nicht finden\n" +#~ msgid "Unable to resolve parent path for %ls\n" +#~ msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" -#: src/win32/libwin32/service.cpp:408 -msgid "Bacula could not be contacted, probably not running" -msgstr "" +#, fuzzy +#~ msgid "Unable to parse user supplied restore configuration\n" +#~ msgstr "Konnte Job Eintrag nicht holen. ERR=%s\n" -#: src/win32/libwin32/service.cpp:415 -msgid "The Bacula service has been removed" -msgstr "" +#, fuzzy +#~ msgid "Registry service not found: Bacula service not started" +#~ msgstr "Pool Ressource \"%s\" nicht gefunden.\n" -#: src/win32/libwin32/service.cpp:456 -msgid "SetServiceStatus failed" -msgstr "" +#, fuzzy +#~ msgid "Registry service entry point not found" +#~ msgstr "Pool Ressource \"%s\" nicht gefunden.\n" -#: src/win32/libwin32/service.cpp:482 -#, c-format -msgid "" -"\n" -"\n" -"%s error: %ld at %s:%d" -msgstr "" +#, fuzzy +#~ msgid "Unable to install the service" +#~ msgstr "Konnte bootstrap Datei %s nicht erzeugen. ERR=%s\n" -#: src/win32/libwin32/service.cpp:558 -#, c-format -msgid "Locked by: %s, duration: %ld seconds\n" -msgstr "" +#, fuzzy +#~ msgid "Service command length too long" +#~ msgstr "Job nicht gefunden: %s\n" -#: src/win32/libwin32/service.cpp:562 -#, c-format -msgid "No longer locked\n" -msgstr "" +#, fuzzy +#~ msgid "Could not delete Registry key for " +#~ msgstr "Kann Storage resource %s nicht finden\n" -#: src/win32/libwin32/service.cpp:566 #, fuzzy -msgid "Could not lock database" -msgstr "Konnte Datenbank \"%s\" nicht öffen.\n" +#~ msgid "Could not lock database" +#~ msgstr "Konnte Datenbank \"%s\" nicht öffen.\n" #~ msgid "Expected an fstype string, got: %s\n" #~ msgstr "fstype Ausdruck erwartet, erhalten: %s\n" diff --git a/bacula/po/es.po b/bacula/po/es.po index e02cdb3b40..24dae7fdec 100644 --- a/bacula/po/es.po +++ b/bacula/po/es.po @@ -1,17 +1,17 @@ # Spanish translations for branch package # Traducciones al español para el paquete branch. # Copyright (C) 2000-2015 Kern Sibbald -# License: BSD 2-Clause +# License: BSD 2-Clause; see file LICENSE-FOSS # msgid "" msgstr "" "Project-Id-Version: Bacula 3.0.2\n" "Report-Msgid-Bugs-To: bacula-devel@lists.sourceforge.net\n" -"POT-Creation-Date: 2015-05-21 11:42+0200\n" +"POT-Creation-Date: 2015-08-09 15:05+0200\n" "PO-Revision-Date: 2009-12-01 16:04-0300\n" "Last-Translator: Victor Hugo dos Santos \n" "Language-Team: Bacula Spanish Team \n" -"Language: \n" +"Language: Spanish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,20664 +19,14613 @@ msgstr "" "X-Poedit-Language: Spanish\n" "X-Poedit-SourceCharset: utf-8\n" -#: examples/nagios/check_bacula/check_bacula.c:57 -#, c-format -msgid "" -"Copyright (C) 2005 Christian Masopust\n" -"Written by Christian Masopust (2005)\n" -"\n" -"Version: " -msgstr "" - -#: src/baconfig.h:61 src/baconfig.h:62 src/baconfig.h:67 src/baconfig.h:68 -#: src/baconfig.h:79 src/baconfig.h:80 +#: src/baconfig.h:64 src/baconfig.h:65 src/baconfig.h:70 src/baconfig.h:71 +#: src/baconfig.h:82 src/baconfig.h:83 #, c-format msgid "Failed ASSERT: %s\n" msgstr "Fallo ASSERT: %s\n" -#: src/baconfig.h:88 src/dird/ua_dotcmds.c:1675 src/dird/ua_dotcmds.c:1683 -#: src/dird/ua_run.c:810 src/dird/ua_run.c:1863 src/dird/ua_run.c:1890 -#: src/dird/ua_run.c:1921 src/dird/ua_run.c:1948 src/dird/ua_run.c:1986 -#: src/dird/ua_select.c:622 src/dird/ua_select.c:642 src/dird/ua_update.c:364 +#: src/baconfig.h:91 msgid "*None*" msgstr "*Ninguno*" -#: src/cats/cats.c:132 src/cats/mysql.c:408 src/cats/postgresql.c:529 -#: src/cats/postgresql.c:579 src/cats/sqlite.c:478 -#, c-format -msgid "Query failed: %s: ERR=%s\n" -msgstr "Consulta fallida: %s: ERR=%s\n" - -#: src/cats/cats_null.c:30 -msgid "Please replace this null libbaccats library with a proper one.\n" -msgstr "" - -#: src/cats/mysql.c:91 -msgid "A user name for MySQL must be supplied.\n" -msgstr "Un nombre de usuario para MySQL debe de ser suministrado.\n" - -#: src/cats/mysql.c:178 src/cats/postgresql.c:232 src/cats/sqlite.c:177 -#, c-format -msgid "Unable to initialize DB lock. ERR=%s\n" -msgstr "No se puede inicializar el bloqueo de la BD. ERR=%s\n" - -#: src/cats/mysql.c:221 -#, c-format +#: src/lib/status.h:78 msgid "" -"Unable to connect to MySQL server.\n" -"Database=%s User=%s\n" -"MySQL connect failed either server not running or your authorization is " -"incorrect.\n" +"\n" +"Terminated Jobs:\n" msgstr "" -"No se puede conectar al servidor MySQL.\n" -"Base de Datos=%s Usuario=%s\n" +"\n" +"Jobs No Terminados:\n" -#: src/cats/mysql.c:385 src/cats/postgresql.c:476 src/cats/sqlite.c:402 -#: src/dird/fd_cmds.c:926 src/dird/fd_cmds.c:987 -#, c-format -msgid "Attribute create error. %s" -msgstr "error al crear Atributo.%s" +#: src/lib/status.h:85 +msgid " JobId Level Files Bytes Status Finished Name \n" +msgstr "JobId Nivel Archivos Bytes Estado Finalizado Nombre \n" -#: src/cats/postgresql.c:103 -msgid "A user name for PostgreSQL must be supplied.\n" -msgstr "Un nombre de usuario para PostgreSQL debe de ser suministrado.\n" +#: src/lib/status.h:87 +msgid "===================================================================\n" +msgstr "===================================================================\n" -#: src/cats/postgresql.c:187 src/cats/sql.c:336 src/cats/sql.c:343 -#: src/cats/sql_create.c:550 src/cats/sql_get.c:199 src/cats/sql_get.c:570 -#: src/cats/sql_get.c:780 src/cats/sql_get.c:1096 src/cats/sql_get.c:1468 -#, c-format -msgid "error fetching row: %s\n" -msgstr "error al obtener la fila:%s\n" +#: src/lib/status.h:107 +msgid "Created" +msgstr "Creado" -#: src/cats/postgresql.c:203 -#, c-format -msgid "Encoding error for database \"%s\". Wanted SQL_ASCII, got %s\n" -msgstr "" -"Error de codificación de la base de datos \"%s\". Busco SQL_ASCII, obtuvo " -"%s\n" +#: src/lib/status.h:111 +msgid "Error" +msgstr "Error" -#: src/cats/postgresql.c:268 -#, fuzzy, c-format -msgid "" -"Unable to connect to PostgreSQL server. Database=%s User=%s\n" -"Possible causes: SQL server not running; password incorrect; max_connections " -"exceeded.\n" -msgstr "" -"No se puede conectar al servidor PostgreSQL.\n" -"Base de datos=%s Usuario=%s\n" -", probablemente no funciona o tu contraseña es incorrecta.\n" +#: src/lib/status.h:114 +msgid "Diffs" +msgstr "Diferencias" -#: src/cats/postgresql.c:372 -msgid "PQescapeStringConn returned non-zero.\n" -msgstr "PQescapeStringConn devuelto no-cero.\n" +#: src/lib/status.h:117 +msgid "Cancel" +msgstr "Cancelar" -#: src/cats/postgresql.c:390 -#, fuzzy -msgid "PQescapeByteaConn returned NULL.\n" -msgstr "PQescapeStringConn devuelto no-cero.\n" +#: src/lib/status.h:120 +msgid "OK" +msgstr "OK" -#: src/cats/postgresql.c:421 -#, fuzzy -msgid "PQunescapeByteaConn returned NULL.\n" -msgstr "PQescapeStringConn devuelto no-cero.\n" +#: src/lib/status.h:123 +msgid "OK -- with warnings" +msgstr "OK - con advertencias" -#: src/cats/postgresql.c:536 -#, fuzzy, c-format -msgid "Fetch failed: ERR=%s\n" -msgstr "prctl fallido: ERR=%s\n" +#: src/lib/status.h:126 +msgid "Incomplete" +msgstr "" -#: src/cats/postgresql.c:839 -#, c-format -msgid "error fetching currval: %s\n" -msgstr "error al obtener el valor: %s\n" +#: src/lib/status.h:129 +msgid "Other" +msgstr "Otros" -#: src/cats/postgresql.c:1030 +#: src/lib/status.h:141 #, c-format -msgid "error starting batch mode: %s" -msgstr "Error iniciando modo batch: %s" +msgid "%6d\t%-6s\t%8s\t%10s\t%-7s\t%-8s\t%s\n" +msgstr "%6d\t%-6s\t%8s\t%10s\t%-7s\t%-8s\t%s\n" -#: src/cats/postgresql.c:1059 src/cats/postgresql.c:1066 +#: src/lib/status.h:149 #, c-format -msgid "error ending batch mode: %s" -msgstr "Error finalizando modo batch: %s" +msgid "%6d %-6s %8s %10s %-7s %-8s %s\n" +msgstr "%6d %-6s %8s %10s %-7s %-8s %s\n" -#: src/cats/postgresql.c:1115 -#, c-format -msgid "error copying in batch mode: %s" -msgstr "Error copiando en modo batch: %s" +#: src/lib/status.h:178 src/lib/status.h:189 src/lib/status.h:203 +#: src/lib/status.h:207 src/lib/status.h:211 +msgid "Bacula " +msgstr "Bacula" -#: src/cats/sql.c:185 +#: src/qt-console/bat_conf.cpp:133 #, c-format -msgid "" -"Potential performance problem:\n" -"max_connections=%d set for %s database \"%s\" should be larger than " -"Director's MaxConcurrentJobs=%d\n" -msgstr "" +msgid "No record for %d %s\n" +msgstr "Ningún registro para %d %s\n" -#: src/cats/sql.c:229 +#: src/qt-console/bat_conf.cpp:142 #, c-format -msgid "" -"query %s failed:\n" -"%s\n" -msgstr "" -"consulta %s fallida:\n" -"%s\n" +msgid "Director: name=%s address=%s DIRport=%d\n" +msgstr "Director: nombre=%s dirección=%s DIRport=%d\n" -#: src/cats/sql.c:250 +#: src/qt-console/bat_conf.cpp:146 #, c-format -msgid "" -"insert %s failed:\n" -"%s\n" -msgstr "" -"Inserción %s fallida:\n" -"%s\n" +msgid "Console: name=%s\n" +msgstr "Console: nombre=%s\n" -#: src/cats/sql.c:262 +#: src/qt-console/bat_conf.cpp:149 +#: src/qt-console/tray-monitor/tray_conf.cpp:187 #, c-format -msgid "Insertion problem: affected_rows=%s\n" -msgstr "Problemas con la inserción: filas afectadas=%s\n" +msgid "ConsoleFont: name=%s font face=%s\n" +msgstr "ConsoleFont: nombre=%s font face=%s\n" -#: src/cats/sql.c:280 +#: src/qt-console/bat_conf.cpp:153 src/qt-console/bat_conf.cpp:234 +#: src/qt-console/bat_conf.cpp:284 src/qt-console/bat_conf.cpp:314 #, c-format -msgid "" -"update %s failed:\n" -"%s\n" -msgstr "" -"Actualizar %s fallida:\n" -"%s\n" +msgid "Unknown resource type %d\n" +msgstr "Tipo de recurso desconocido %d\n" -#: src/cats/sql.c:290 +#: src/qt-console/bat_conf.cpp:262 +#: src/qt-console/tray-monitor/tray_conf.cpp:280 #, c-format -msgid "Update failed: affected_rows=%s for %s\n" -msgstr "Actualización fallida: celdas afectadas =%s por %s\n" +msgid "%s item is required in %s resource, but not found.\n" +msgstr "Ítem %s es necesario en recurso %s, pero no se encuentra.\n" -#: src/cats/sql.c:310 +#: src/qt-console/bat_conf.cpp:331 +#: src/qt-console/tray-monitor/tray_conf.cpp:364 #, c-format -msgid "" -"delete %s failed:\n" -"%s\n" +msgid "Attempt to define second %s resource named \"%s\" is not permitted.\n" msgstr "" -"Borrado %s fallido:\n" -"%s\n" +"Segundo intento de definir recurso %s llamado \"%s\" no está permitido.\n" -#: src/cats/sql.c:396 +#: src/qt-console/bcomm/dircomm.cpp:89 #, c-format -msgid "Path length is zero. File=%s\n" -msgstr "La longitud de la ruta es nula. Archivo=%s\n" - -#: src/cats/sql.c:610 -msgid "No results to list.\n" -msgstr "No hay resultados para listar.\n" - -#: src/cats/sql.c:751 -#, fuzzy -msgid "Could not init database batch connection\n" -msgstr "No se pudo iniciar base de datos de Bacula\n" +msgid "Already connected\"%s\".\n" +msgstr "Ya conectado\"%s\".\n" -#: src/cats/sql.c:757 +#: src/qt-console/bcomm/dircomm.cpp:100 +#: src/qt-console/tray-monitor/tray-monitor.cpp:353 #, c-format -msgid "Could not open database \"%s\": ERR=%s\n" -msgstr "No se pudo abrir la base de datos \"%s\": ERR=%s\n" +msgid "Connecting to Director %s:%d" +msgstr "Conectando con Director %s:%d" -#: src/cats/sql.c:857 +#: src/qt-console/bcomm/dircomm.cpp:102 +#, c-format msgid "" -"Your database is no longer functional. This is most likely due to\n" -"the fact that your Bacula Enterprise Edition period has expired.\n" -"You can continue testing by re-initializing the catalog database orcontact " -"Bacula Systems to order a subscription.\n" +"Connecting to Director %s:%d\n" +"\n" msgstr "" +"Conectando con Director %s:%d\n" +"\n" -#: src/cats/sql_create.c:82 +#: src/qt-console/bcomm/dircomm.cpp:154 #, c-format -msgid "Create DB Job record %s failed. ERR=%s\n" -msgstr "Creación de registro de Job %s en BD fallido. ERR=%s\n" +msgid "Failed to initialize TLS context for Console \"%s\".\n" +msgstr "Fallo al inicializar el contexto TLS para la consola \"%s\".\n" -#: src/cats/sql_create.c:125 +#: src/qt-console/bcomm/dircomm.cpp:177 #, c-format -msgid "Create JobMedia record %s failed: ERR=%s\n" -msgstr "Creación de registro de JobMedia %s fallido. ERR=%s\n" +msgid "Failed to initialize TLS context for Director \"%s\".\n" +msgstr "Fallo al inicializar el contexto TLS para el Director \"%s\".\n" -#: src/cats/sql_create.c:134 -#, c-format -msgid "Update Media record %s failed: ERR=%s\n" -msgstr "Actualización del registro de Media %s fallido: ERR=%s\n" +#: src/qt-console/bcomm/dircomm.cpp:199 +#: src/qt-console/tray-monitor/tray-monitor.cpp:358 +msgid "Director daemon" +msgstr "Servicio Director" -#: src/cats/sql_create.c:164 -#, c-format -msgid "pool record %s already exists\n" -msgstr "registro del pool %s ya existe\n" +#: src/qt-console/bcomm/dircomm.cpp:237 +msgid "Initializing ..." +msgstr "Inicializando ..." -#: src/cats/sql_create.c:196 -#, c-format -msgid "Create db Pool record %s failed: ERR=%s\n" -msgstr "Creación del registro BD Pool %s fallido: ERR=%s\n" +#: src/qt-console/bcomm/dircomm.cpp:253 src/qt-console/console/console.cpp:134 +msgid "Connected" +msgstr "Conectado" -#: src/cats/sql_create.c:225 -#, c-format -msgid "Device record %s already exists\n" -msgstr "Registro de Dispositivo %s ya existe\n" +#: src/qt-console/bcomm/dircomm.cpp:377 +msgid "Command completed ..." +msgstr "Comando completado ..." -#: src/cats/sql_create.c:241 -#, c-format -msgid "Create db Device record %s failed: ERR=%s\n" -msgstr "Creación del registro de BD Device %s fallido: ERR=%s\n" +#: src/qt-console/bcomm/dircomm.cpp:384 src/qt-console/console/console.cpp:371 +msgid "Processing command ..." +msgstr "Procesando comando ..." -#: src/cats/sql_create.c:274 -#, c-format -msgid "More than one Storage record!: %d\n" -msgstr "Mas de un registro de almacenamiento!: %d\n" +#: src/qt-console/bcomm/dircomm.cpp:391 +msgid "At main prompt waiting for input ..." +msgstr "En prompt principal esperando por una entrada..." -#: src/cats/sql_create.c:279 -#, c-format -msgid "error fetching Storage row: %s\n" -msgstr "error obteniendo fila del Almacenamiento:%s\n" +#: src/qt-console/bcomm/dircomm.cpp:398 src/qt-console/bcomm/dircomm.cpp:408 +msgid "At prompt waiting for input ..." +msgstr "En prompt esperando por una entrada..." -#: src/cats/sql_create.c:299 -#, c-format -msgid "Create DB Storage record %s failed. ERR=%s\n" -msgstr "Creación del registro BD Almacenamiento %s fallido. ERR=%s\n" +#: src/qt-console/bcomm/dircomm.cpp:416 +msgid "Command failed." +msgstr "Comando fallido." -#: src/cats/sql_create.c:330 -#, c-format -msgid "mediatype record %s already exists\n" -msgstr "registro de tipo de media %s ya existe\n" +#: src/qt-console/bcomm/dircomm.cpp:488 +msgid "Director disconnected." +msgstr "Director desconectado." -#: src/cats/sql_create.c:346 +#: src/qt-console/bcomm/dircomm_auth.cpp:111 #, c-format -msgid "Create db mediatype record %s failed: ERR=%s\n" -msgstr "Fallo al crear la db_mediatype_record %s: ERR=%s\n" +msgid "Director authorization problem at \"%s:%d\"\n" +msgstr "Problema de autorización de Director en \"%s:%d\"\n" -#: src/cats/sql_create.c:384 +#: src/qt-console/bcomm/dircomm_auth.cpp:118 #, c-format -msgid "Volume \"%s\" already exists.\n" -msgstr "Volumen \"%s\" ya existe.\n" +msgid "" +"Authorization problem: Remote server at \"%s:%d\" did not advertise required " +"TLS support.\n" +msgstr "" +"Problema de autorización: El servidor remoto en \"%s:%d\" no anuncio soporte " +"TLS requiere.\n" -#: src/cats/sql_create.c:429 +#: src/qt-console/bcomm/dircomm_auth.cpp:126 #, c-format -msgid "Create DB Media record %s failed. ERR=%s\n" -msgstr "Creación del registro BD Almacenamiento %s fallido. ERR=%s\n" +msgid "" +"Authorization problem with Director at \"%s:%d\": Remote server requires " +"TLS.\n" +msgstr "" +"Problema de autorización con el Director en \"%s:%d\": El servidor remoto " +"requiere TLS.\n" -#: src/cats/sql_create.c:478 +#: src/qt-console/bcomm/dircomm_auth.cpp:137 #, c-format -msgid "More than one Client!: %d\n" -msgstr "Mas de un cliente!: %d\n" +msgid "TLS negotiation failed with Director at \"%s:%d\"\n" +msgstr "Fallo negociación TLS no con el Director en \"%s:%d\"\n" -#: src/cats/sql_create.c:483 +#: src/qt-console/bcomm/dircomm_auth.cpp:149 #, c-format -msgid "error fetching Client row: %s\n" -msgstr "error al obtener la fila Cliente:%s\n" +msgid "" +"Bad response to Hello command: ERR=%s\n" +"The Director at \"%s:%d\" is probably not running.\n" +msgstr "" +"Mala respuesta al comando Hello: ERR=%s\n" +"El director en \"%s:%d\" probablemente no esta corriendo.\n" -#: src/cats/sql_create.c:510 +#: src/qt-console/bcomm/dircomm_auth.cpp:158 #, c-format -msgid "Create DB Client record %s failed. ERR=%s\n" -msgstr "Creación del registro BD Cliente %s fallido. ERR=%s\n" +msgid "Director at \"%s:%d\" rejected Hello command\n" +msgstr "Director en \"%s:%d\" rechazó comando Hello\n" -#: src/cats/sql_create.c:543 src/cats/sql_get.c:192 -#, c-format -msgid "More than one Path!: %s for path: %s\n" -msgstr "Mas de un Path!: %s para path: %s\n" +#: src/qt-console/bcomm/dircomm_auth.cpp:173 +#, fuzzy, c-format +msgid "" +"Authorization problem with Director at \"%s:%d\"\n" +"Most likely the passwords do not agree.\n" +"If you are using TLS, there may have been a certificate validation error " +"during the TLS handshake.\n" +"For help, please see " +msgstr "" +"Problema de autorización con el Director en \"%s:%d\"\n" +"Lo mas probable es que las contraseñas no están de acuerdo.\n" +"Si está usando TLS, puede haber habido un error de validación de " +"certificados durante la negociación TLS.\n" +" Por favor vea http://www.bacula.org/en/rel-manual/" +"Bacula_Freque_Asked_Questi.html#SECTION003760000000000000000 para ayuda.\n" -#: src/cats/sql_create.c:576 -#, c-format -msgid "Create db Path record %s failed. ERR=%s\n" -msgstr "Creación del registro Path db %s fallido. ERR=%s\n" +#: src/qt-console/main.cpp:159 +msgid "Cryptography library initialization failed.\n" +msgstr "Inicialización de la librería de criptografía ha fallado.\n" -#: src/cats/sql_create.c:621 +#: src/qt-console/main.cpp:163 #, c-format -msgid "Create DB Counters record %s failed. ERR=%s\n" -msgstr "Creación del registro BD Contadores %s fallido. ERR=%s\n" +msgid "Please correct configuration file: %s\n" +msgstr "Por favor, corrija el archivo de configuración: %s\n" -#: src/cats/sql_create.c:657 -#, c-format -msgid "More than one FileSet!: %d\n" -msgstr "Más de un FileSet!: %d\n" +#: src/qt-console/main.cpp:187 +#, fuzzy, c-format +msgid "" +"\n" +"Version: %s (%s) %s %s %s\n" +"\n" +"Usage: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" +" -c set configuration file to file\n" +" -dnn set debug level to nn\n" +" -s no signals\n" +" -t test - read configuration and exit\n" +" -? print this message.\n" +"\n" +msgstr "" +"\n" +"Versión: %s (%s) %s %s %s\n" +"\n" +"Utilice: bat [-s] [-c archivo_de_configuración] [-d nivel_depuración " +"[archivo_de_configuración]\n" +" -c establecer archivo de configuración para el archivo\n" +" -dnn establecer el nivel de depuración a nn\n" +" -s no hay señales\n" +" -t prueba - leer la configuración y salir\n" +" -? imprimir este mensaje.\n" +"\n" -#: src/cats/sql_create.c:662 -#, c-format -msgid "error fetching FileSet row: ERR=%s\n" -msgstr "error al obtener la fila FileSet: ERR=%s\n" +#: src/qt-console/main.cpp:220 src/qt-console/main.cpp:250 +msgid "TLS required but not configured in Bacula.\n" +msgstr "Se requiere TLS pero no está configurado en Bacula.\n" -#: src/cats/sql_create.c:692 +#: src/qt-console/main.cpp:228 #, c-format -msgid "Create DB FileSet record %s failed. ERR=%s\n" -msgstr "Creación del registro BD FileSet %s fallido. ERR=%s\n" +msgid "" +"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " +"Director \"%s\" in %s. At least one CA certificate store is required.\n" +msgstr "" +"Ni \"Certificado TLS CA\" o \"Directorio de Certificado TLS CA\" están " +"definidos para Director \"%s\" en %s. Por lo menos un almacén de " +"Certificados CA es necesario.\n" -#: src/cats/sql_create.c:930 +#: src/qt-console/main.cpp:237 #, c-format -msgid "Create db File record %s failed. ERR=%s" -msgstr "Creación del registro File db %s fallido. ERR=%s" +msgid "" +"No Director resource defined in %s\n" +"Without that I don't how to speak to the Director :-(\n" +msgstr "" +"Recurso Director no definido en %s\n" +"Sin eso no sé cómo hablar con el Director :-(\n" -#: src/cats/sql_create.c:953 +#: src/qt-console/main.cpp:258 #, c-format -msgid "Attempt to put non-attributes into catalog. Stream=%d\n" -msgstr "Intento de poner non-atributos en el catálogo. Stream=%d\n" - -#: src/cats/sql_create.c:969 -msgid "Cannot Copy/Migrate job using BaseJob.\n" +msgid "" +"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " +"Console \"%s\" in %s.\n" msgstr "" +"Ni \"Certificado TLS CA\" o \"Directorio de Certificado TLS CA\" están " +"definidos para Console \"%s\" en %s.\n" -#: src/cats/sql_create.c:1069 src/cats/sql_get.c:1196 -msgid "ERR=JobIds are empty\n" -msgstr "ERR=JobIds están vacíos\n" - -#: src/cats/sql_create.c:1122 -#, fuzzy, c-format -msgid "Create db Object record %s failed. ERR=%s" -msgstr "Creación del registro File db %s fallido. ERR=%s" +#: src/qt-console/tray-monitor/authenticate.cpp:79 +#, fuzzy +msgid "" +"Director authorization problem.\n" +"Most likely the passwords do not agree.\n" +"For help, please see " +msgstr "" +"Director problema de autorización.\n" +"Lo mas probable es que las contraseñas no están de acuerdo.\n" +"Por favor vea http://www.bacula.org/en/rel-manual/Bacula_Freque_Asked_Questi." +"html#SECTION003760000000000000000 para ayuda.\n" -#: src/cats/sql_delete.c:60 +#: src/qt-console/tray-monitor/authenticate.cpp:88 #, c-format -msgid "No pool record %s exists\n" -msgstr "Registro de pool %s inexistente\n" +msgid "Bad response to Hello command: ERR=%s\n" +msgstr "mala respuesta al comando Hello: ERR=%s\n" -#: src/cats/sql_delete.c:65 -#, c-format -msgid "Expecting one pool record, got %d\n" -msgstr "Esperando un registro pool, tiene %d\n" +#: src/qt-console/tray-monitor/authenticate.cpp:95 +msgid "Director rejected Hello command\n" +msgstr "Director rechazo comando Hello\n" -#: src/cats/sql_delete.c:71 +#: src/qt-console/tray-monitor/authenticate.cpp:123 #, c-format -msgid "Error fetching row %s\n" -msgstr "Error obteniendo fila %s\n" +msgid "Error sending Hello to Storage daemon. ERR=%s\n" +msgstr "Error enviando Hello al servicio de Almacenamiento. ERR=%s\n" -#: src/cats/sql_find.c:84 src/cats/sql_find.c:113 src/cats/sql_find.c:167 -#, c-format +#: src/qt-console/tray-monitor/authenticate.cpp:129 +#, fuzzy msgid "" -"Query error for start time request: ERR=%s\n" -"CMD=%s\n" -msgstr "" -"Error de consulta al solicitar tiempo inicial: ERR=%s\n" -"CMD=%s\n" - -#: src/cats/sql_find.c:90 src/cats/sql_find.c:173 -msgid "No prior Full backup Job record found.\n" -msgstr "No encontrado registro anterior de Job de respaldo completo.\n" +"Director and Storage daemon passwords or names not the same.\n" +"For help, please see " +msgstr "Nombres o contraseñas en el Director o Storage no son las mismas.\n" -#: src/cats/sql_find.c:102 +#: src/qt-console/tray-monitor/authenticate.cpp:136 #, c-format -msgid "Unknown level=%d\n" -msgstr "Nivel desconocido=%d\n" +msgid "bdird set configuration file to file\n" +" -d set debug level to \n" +" -dt print timestamp in debug output\n" +" -t test - read configuration and exit\n" +" -? print this message.\n" +"\n" +msgstr "" +"Escrito por Nicolas Boichat (2004)\n" +"\n" +"Versión: %s (%s) %s %s %s\n" +"\n" +"Utilice: tray-monitor [-c archivo_configuración] [-d nivel_depuración]\n" +" -c establece archivo de configuración para archivo\n" +" -d establece nivel de depuración para \n" +" -dt imprime timestamp en salida de depuración\n" +" -t prueba - leer configuración y salir\n" +" -? imprimir este mensaje.\n" +"\n" -#: src/cats/sql_get.c:203 +#: src/qt-console/tray-monitor/tray-monitor.cpp:210 #, c-format -msgid "Get DB path record %s found bad record: %s\n" -msgstr "Obtener registro ruta %s de BD encontró malo registro: %s\n" +msgid "" +"Error: %d Monitor resources defined in %s. You must define one and only one " +"Monitor resource.\n" +msgstr "" +"Error: %d Monitor de recursos definidos en %s. Usted debe definir un único " +"monitor de recursos.\n" -#: src/cats/sql_get.c:216 +#: src/qt-console/tray-monitor/tray-monitor.cpp:242 #, c-format -msgid "Path record: %s not found.\n" -msgstr "Registro Path: %s no encontrado.\n" +msgid "" +"No Client, Storage or Director resource defined in %s\n" +"Without that I don't how to get status from the File, Storage or Director " +"Daemon :-(\n" +msgstr "" +"Ningún recurso Cliente, Storage o Director definido en %s\n" +"Sin esto, Yo no se como obtener el estado de los demonios File, Storage o " +"Director :-(\n" -#: src/cats/sql_get.c:220 +#: src/qt-console/tray-monitor/tray-monitor.cpp:257 #, c-format -msgid "Path record: %s not found in Catalog.\n" -msgstr "Registro Path: %s no encontrado en el Catalogo.\n" +msgid "" +"Invalid refresh interval defined in %s\n" +"This value must be greater or equal to 1 second and less or equal to 10 " +"minutes (read value: %d).\n" +msgstr "" +"Invalido intervalo de actualización definido en %s\n" +"Este valor debe ser mayor o igual a 1 segundo y menor o igual a 10 minutos " +"(leer el valor:% d).\n" -#: src/cats/sql_get.c:259 +#: src/qt-console/tray-monitor/tray-monitor.cpp:325 #, c-format -msgid "No Job found for JobId %s\n" -msgstr "No se encontró un job para el JobId %s\n" +msgid "Error, currentitem is not a Client or a Storage..\n" +msgstr "Error, CurrentItem no es un Cliente o un Storage ...\n" -#: src/cats/sql_get.c:330 src/cats/sql_get.c:385 +#: src/qt-console/tray-monitor/tray-monitor.cpp:363 #, c-format -msgid "No volumes found for JobId=%d\n" -msgstr "Volúmenes no encontrados para JobId=%d\n" +msgid "Connecting to Client %s:%d" +msgstr "Conectando con Cliente %s:%d" -#: src/cats/sql_get.c:336 src/cats/sql_get.c:396 -#, c-format -msgid "Error fetching row %d: ERR=%s\n" -msgstr "Error obteniendo fila %d: ERR=%s\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:368 +msgid "File daemon" +msgstr "demonio File" -#: src/cats/sql_get.c:350 +#: src/qt-console/tray-monitor/tray-monitor.cpp:373 #, c-format -msgid "No Volume for JobId %d found in Catalog.\n" -msgstr "Volúmenes para JobId=%d no encontrado en el Catalogo.\n" +msgid "Connecting to Storage %s:%d" +msgstr "Conectando con Storage %s:%d" -#: src/cats/sql_get.c:489 -#, c-format -msgid "Pool id select failed: ERR=%s\n" -msgstr "Fallo al selecciona id del Pool: ERR=%s\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:378 +msgid "Storage daemon" +msgstr "Demonio Storage" -#: src/cats/sql_get.c:526 +#: src/qt-console/tray-monitor/tray-monitor.cpp:382 +#: src/qt-console/tray-monitor/tray-monitor.cpp:412 #, c-format -msgid "Client id select failed: ERR=%s\n" -msgstr "Fallo al seleccionar ID del Cliente: ERR=%s\n" - -#: src/cats/sql_get.c:565 -#, fuzzy, c-format -msgid "More than one Pool! Num=%s\n" -msgstr "Mas de un Poll!: %s\n" +msgid "Error, currentitem is not a Client, a Storage or a Director..\n" +msgstr "Error, currentitem no es un cliente, un Storage o un Director..\n" -#: src/cats/sql_get.c:628 -msgid "Pool record not found in Catalog.\n" -msgstr "Registro del Pool no encontrado en Catalogo.\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:387 +msgid "Cannot connect to daemon." +msgstr "No se puede conectar al demonio" -#: src/cats/sql_get.c:691 -#, fuzzy, c-format -msgid "Error got %s RestoreObjects but expected only one!\n" -msgstr "Error al obtener %s FileSets pero se esperaba sólo uno!\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:396 +#, c-format +msgid "Authentication error : %s" +msgstr "Error de autenticación : %s" -#: src/cats/sql_get.c:696 -#, fuzzy, c-format -msgid "RestoreObject record \"%d\" not found.\n" -msgstr "Registro FileSet \"%s\" no encontrado.\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:403 +msgid "Opened connection with Director daemon." +msgstr "Conexión abierta con demonio Director." -#: src/cats/sql_get.c:721 src/dird/ua_run.c:703 -#, c-format -msgid "Decompression failed. Len wanted=%d got=%d. Object=%s\n" -msgstr "" +#: src/qt-console/tray-monitor/tray-monitor.cpp:406 +msgid "Opened connection with File daemon." +msgstr "Conexión abierta con demonio File." -#: src/cats/sql_get.c:739 -#, fuzzy -msgid "RestoreObject record not found in Catalog.\n" -msgstr "Registro FileSet no encontrado en Catalogo.\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:409 +msgid "Opened connection with Storage daemon." +msgstr "Conexión abierta con demonio Storage." -#: src/cats/sql_get.c:775 -#, c-format -msgid "More than one Client!: %s\n" -msgstr "Mas de un Cliente!: %s\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:460 +msgid "Error : BNET_HARDEOF or BNET_ERROR" +msgstr "Error: BNET_HARDEOF o BNET_ERROR" -#: src/cats/sql_get.c:792 src/cats/sql_get.c:796 -msgid "Client record not found in Catalog.\n" -msgstr "Registro de cliente no encontrado en catalogo.\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:469 +msgid "Error : Connection closed." +msgstr "Error : Conexión cerrada." -#: src/cats/sql_get.c:821 +#: src/qt-console/tray-monitor/tray_conf.cpp:160 #, c-format -msgid "More than one Counter!: %d\n" -msgstr "Mas de un Contador!: %d\n" +msgid "No %s resource defined\n" +msgstr "Recurso %s no definido\n" -#: src/cats/sql_get.c:826 +#: src/qt-console/tray-monitor/tray_conf.cpp:169 #, c-format -msgid "error fetching Counter row: %s\n" -msgstr "error al obtener fila Contador: %s\n" +msgid "Monitor: name=%s FDtimeout=%s SDtimeout=%s\n" +msgstr "Monitor: nombre=%s FDtimeout=%s SDtimeout=%s\n" -#: src/cats/sql_get.c:846 +#: src/qt-console/tray-monitor/tray_conf.cpp:175 #, c-format -msgid "Counter record: %s not found in Catalog.\n" -msgstr "registro Contador: %s no encontrado en Catalogo.\n" +msgid "Director: name=%s address=%s FDport=%d\n" +msgstr "Director: nombre=%s dirección=%s FDport=%d\n" -#: src/cats/sql_get.c:884 +#: src/qt-console/tray-monitor/tray_conf.cpp:179 #, c-format -msgid "Error got %s FileSets but expected only one!\n" -msgstr "Error al obtener %s FileSets pero se esperaba sólo uno!\n" +msgid "Client: name=%s address=%s FDport=%d\n" +msgstr "Cliente: nombre=%s dirección=%s FDport=%d\n" -#: src/cats/sql_get.c:889 +#: src/qt-console/tray-monitor/tray_conf.cpp:183 #, c-format -msgid "FileSet record \"%s\" not found.\n" -msgstr "Registro FileSet \"%s\" no encontrado.\n" - -#: src/cats/sql_get.c:899 -msgid "FileSet record not found in Catalog.\n" -msgstr "Registro FileSet no encontrado en Catalogo.\n" +msgid "Storage: name=%s address=%s SDport=%d\n" +msgstr "Storage: nombre=%s dirección=%s SDport=%d\n" -#: src/cats/sql_get.c:998 +#: src/qt-console/tray-monitor/tray_conf.cpp:191 #, c-format -msgid "Media id select failed: ERR=%s\n" -msgstr "Fallo al seleccionar ID del Medio: ERR=%s\n" +msgid "Unknown resource type %d in dump_resource.\n" +msgstr "Tipo de recurso desconocido %d en dump_resource.\n" -#: src/cats/sql_get.c:1036 +#: src/qt-console/tray-monitor/tray_conf.cpp:249 #, c-format -msgid "query dbids failed: ERR=%s\n" -msgstr "Consulta fallida a dbids: ERR=%s\n" +msgid "Unknown resource type %d in free_resource.\n" +msgstr "Tipo de recurso desconocido %d en free_resource.\n" -#: src/cats/sql_get.c:1091 +#: src/qt-console/tray-monitor/tray_conf.cpp:286 #, c-format -msgid "More than one Volume!: %s\n" -msgstr "Mas de un Volumen!: %s\n" - -#: src/cats/sql_get.c:1150 -#, fuzzy, c-format -msgid "Media record with MediaId=%s not found.\n" -msgstr "Registro Media MediaID=%s no encontrado.\n" - -#: src/cats/sql_get.c:1153 -#, fuzzy, c-format -msgid "Media record for Volume name \"%s\" not found.\n" -msgstr "Registro Media para Volumen \"%s\" no encontrado.\n" +msgid "Too many items in %s resource\n" +msgstr "Demasiados ítem en recurso %s\n" -#: src/cats/sql_get.c:1160 +#: src/qt-console/tray-monitor/tray_conf.cpp:306 +#: src/qt-console/tray-monitor/tray_conf.cpp:344 #, c-format -msgid "Media record for MediaId=%u not found in Catalog.\n" -msgstr "Registro Media para MediaId=%u no encontrado en el Catalogo.\n" +msgid "Unknown resource type %d in save_resource.\n" +msgstr "Tipo de recurso desconocido %d en save_resource.\n" -#: src/cats/sql_get.c:1163 -#, fuzzy, c-format -msgid "Media record for Volume Name \"%s\" not found in Catalog.\n" -msgstr "Registro Media para Volumen=%s no encontrado en el Catalogo.\n" +#~ msgid "Query failed: %s: ERR=%s\n" +#~ msgstr "Consulta fallida: %s: ERR=%s\n" -#: src/cats/sql_get.c:1463 -#, fuzzy, c-format -msgid "More than one Snapshot!: %s\n" -msgstr "Mas de un Cliente!: %s\n" +#~ msgid "A user name for MySQL must be supplied.\n" +#~ msgstr "Un nombre de usuario para MySQL debe de ser suministrado.\n" -#: src/cats/sql_get.c:1492 src/cats/sql_get.c:1502 -#, fuzzy, c-format -msgid "Snapshot record with SnapshotId=%s not found.\n" -msgstr "Registro Media MediaID=%s no encontrado.\n" +#~ msgid "Unable to initialize DB lock. ERR=%s\n" +#~ msgstr "No se puede inicializar el bloqueo de la BD. ERR=%s\n" -#: src/cats/sql_get.c:1495 src/cats/sql_get.c:1505 -#, fuzzy, c-format -msgid "Snapshot record for Snapshot name \"%s\" not found.\n" -msgstr "Registro Media para Volumen \"%s\" no encontrado.\n" +#~ msgid "" +#~ "Unable to connect to MySQL server.\n" +#~ "Database=%s User=%s\n" +#~ "MySQL connect failed either server not running or your authorization is " +#~ "incorrect.\n" +#~ msgstr "" +#~ "No se puede conectar al servidor MySQL.\n" +#~ "Base de Datos=%s Usuario=%s\n" -#: src/cats/sql_list.c:45 -#, c-format -msgid "Query failed: %s\n" -msgstr "Consulta fallida: %s\n" +#~ msgid "Attribute create error. %s" +#~ msgstr "error al crear Atributo.%s" -#: src/cats/sql_list.c:314 -msgid "These JobIds have copies as follows:\n" -msgstr "Estos JobIds tienen copias de la siguiente manera:\n" +#~ msgid "A user name for PostgreSQL must be supplied.\n" +#~ msgstr "Un nombre de usuario para PostgreSQL debe de ser suministrado.\n" -#: src/cats/sql_list.c:316 -msgid "The catalog contains copies as follows:\n" -msgstr "El catálogo contiene copias de la siguiente manera:\n" +#~ msgid "error fetching row: %s\n" +#~ msgstr "error al obtener la fila:%s\n" -#: src/cats/sqlite.c:192 -#, c-format -msgid "Database %s does not exist, please create it.\n" -msgstr "No existe base de datos %s, por favor crearla.\n" +#~ msgid "Encoding error for database \"%s\". Wanted SQL_ASCII, got %s\n" +#~ msgstr "" +#~ "Error de codificación de la base de datos \"%s\". Busco SQL_ASCII, obtuvo " +#~ "%s\n" -#: src/cats/sqlite.c:214 -#, c-format -msgid "Unable to open Database=%s. ERR=%s\n" -msgstr "No se puede abrir la base de datos=%s. ERR=%s\n" +#, fuzzy +#~ msgid "" +#~ "Unable to connect to PostgreSQL server. Database=%s User=%s\n" +#~ "Possible causes: SQL server not running; password incorrect; " +#~ "max_connections exceeded.\n" +#~ msgstr "" +#~ "No se puede conectar al servidor PostgreSQL.\n" +#~ "Base de datos=%s Usuario=%s\n" +#~ ", probablemente no funciona o tu contraseña es incorrecta.\n" -#: src/cats/sqlite.c:215 -msgid "unknown" -msgstr "desconocido" +#~ msgid "PQescapeStringConn returned non-zero.\n" +#~ msgstr "PQescapeStringConn devuelto no-cero.\n" -#: src/console/authenticate.c:119 src/dird/authenticate.c:122 -msgid "" -"Authorization problem: Remote server did not advertise required TLS " -"support.\n" -msgstr "" -"Problema de Autorización: El servidor remoto no anuncio soporte TLS " -"requerido.\n" - -#: src/console/authenticate.c:126 src/dird/authenticate.c:129 -#: src/filed/authenticate.c:102 src/filed/authenticate.c:208 -#: src/stored/authenticate.c:94 src/stored/authenticate.c:187 -#: src/stored/authenticate.c:295 -msgid "Authorization problem: Remote server requires TLS.\n" -msgstr "Problema de autorización. Servidor remoto requiere TLS.\n" - -#: src/console/authenticate.c:135 -msgid "TLS negotiation failed\n" -msgstr "Negociación TLS fallida\n" - -#: src/console/authenticate.c:149 -#: src/qt-console/tray-monitor/authenticate.cpp:85 -#, c-format -msgid "Bad response to Hello command: ERR=%s\n" -msgstr "mala respuesta al comando Hello: ERR=%s\n" +#, fuzzy +#~ msgid "PQescapeByteaConn returned NULL.\n" +#~ msgstr "PQescapeStringConn devuelto no-cero.\n" -#: src/console/authenticate.c:156 -#: src/qt-console/tray-monitor/authenticate.cpp:92 -msgid "Director rejected Hello command\n" -msgstr "Director rechazo comando Hello\n" +#, fuzzy +#~ msgid "PQunescapeByteaConn returned NULL.\n" +#~ msgstr "PQescapeStringConn devuelto no-cero.\n" -#: src/console/authenticate.c:174 #, fuzzy -msgid "" -"Director authorization problem.\n" -"Most likely the passwords do not agree.\n" -"If you are using TLS, there may have been a certificate validation error " -"during the TLS handshake.\n" -"For help, please see " -msgstr "" -"Problema de Autorización de Director.\n" -"El más probable es que las contraseñas no están de acuerdo.\n" -"Si usted esta utilizando TLS, puede haber habido un error de validación de " -"certificado durante el apretón de manos TLS.\n" -"Por favor, consulte http://www.bacula.org/en/rel-manual/" -"Bacula_Freque_Asked_Questi.html#SECTION003760000000000000000 para ayuda.\n" +#~ msgid "Fetch failed: ERR=%s\n" +#~ msgstr "prctl fallido: ERR=%s\n" -#: src/console/bbconsjson.c:79 src/console/console.c:118 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: " -msgstr "" -"\n" -"Versión: " +#~ msgid "error fetching currval: %s\n" +#~ msgstr "error al obtener el valor: %s\n" -#: src/console/bbconsjson.c:152 src/dird/bdirjson.c:141 -#: src/filed/bfdjson.c:116 src/stored/bsdjson.c:126 -#, fuzzy, c-format -msgid "Please use valid -l argument: %s\n" -msgstr "FileSet: nombre=%s\n" - -#: src/console/bbconsjson.c:213 src/console/console.c:1157 -#: src/dird/bdirjson.c:235 src/dird/dird.c:283 src/dird/dird.c:311 -#: src/dird/dird.c:548 src/dird/dird.c:551 src/filed/bfdjson.c:199 -#: src/filed/filed.c:210 src/qt-console/main.cpp:161 src/stored/bsdjson.c:211 -#: src/stored/stored.c:236 -#, c-format -msgid "Please correct configuration file: %s\n" -msgstr "Por favor, corrija el archivo de configuración: %s\n" +#~ msgid "error starting batch mode: %s" +#~ msgstr "Error iniciando modo batch: %s" -#: src/console/bbconsjson.c:430 src/console/bbconsjson.c:461 -#: src/console/console.c:1347 src/console/console.c:1377 -#: src/dird/bdirjson.c:1163 src/dird/bdirjson.c:1201 src/dird/bdirjson.c:1256 -#: src/dird/dird.c:688 src/dird/dird.c:906 src/dird/dird.c:961 -#: src/dird/dird.c:1168 src/filed/bfdjson.c:483 src/filed/bfdjson.c:526 -#: src/filed/filed.c:379 src/filed/filed.c:579 src/qt-console/main.cpp:218 -#: src/qt-console/main.cpp:248 src/stored/bsdjson.c:494 -#: src/stored/stored.c:362 -msgid "TLS required but not configured in Bacula.\n" -msgstr "Se requiere TLS pero no está configurado en Bacula.\n" +#~ msgid "error ending batch mode: %s" +#~ msgstr "Error finalizando modo batch: %s" -#: src/console/bbconsjson.c:439 src/console/console.c:1355 -#: src/qt-console/main.cpp:226 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Director \"%s\" in %s. At least one CA certificate store is required.\n" -msgstr "" -"Ni \"Certificado TLS CA\" o \"Directorio de Certificado TLS CA\" están " -"definidos para Director \"%s\" en %s. Por lo menos un almacén de " -"Certificados CA es necesario.\n" +#~ msgid "error copying in batch mode: %s" +#~ msgstr "Error copiando en modo batch: %s" -#: src/console/bbconsjson.c:448 src/console/console.c:1364 -#: src/qt-console/main.cpp:235 -#, c-format -msgid "" -"No Director resource defined in %s\n" -"Without that I don't how to speak to the Director :-(\n" -msgstr "" -"Recurso Director no definido en %s\n" -"Sin eso no sé cómo hablar con el Director :-(\n" +#~ msgid "" +#~ "query %s failed:\n" +#~ "%s\n" +#~ msgstr "" +#~ "consulta %s fallida:\n" +#~ "%s\n" -#: src/console/bbconsjson.c:468 src/console/console.c:1384 -#: src/qt-console/main.cpp:256 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Console \"%s\" in %s.\n" -msgstr "" -"Ni \"Certificado TLS CA\" o \"Directorio de Certificado TLS CA\" están " -"definidos para Console \"%s\" en %s.\n" +#~ msgid "" +#~ "insert %s failed:\n" +#~ "%s\n" +#~ msgstr "" +#~ "Inserción %s fallida:\n" +#~ "%s\n" -#: src/console/console.c:170 -msgid "input from file" -msgstr "entrada desde archivo" +#~ msgid "Insertion problem: affected_rows=%s\n" +#~ msgstr "Problemas con la inserción: filas afectadas=%s\n" -#: src/console/console.c:171 -msgid "output to file" -msgstr "salida a archivo" +#~ msgid "" +#~ "update %s failed:\n" +#~ "%s\n" +#~ msgstr "" +#~ "Actualizar %s fallida:\n" +#~ "%s\n" -#: src/console/console.c:172 -msgid "quit" -msgstr "salir" +#~ msgid "Update failed: affected_rows=%s for %s\n" +#~ msgstr "Actualización fallida: celdas afectadas =%s por %s\n" -#: src/console/console.c:173 -msgid "output to file and terminal" -msgstr "salida a archivo y pantalla" +#~ msgid "" +#~ "delete %s failed:\n" +#~ "%s\n" +#~ msgstr "" +#~ "Borrado %s fallido:\n" +#~ "%s\n" -#: src/console/console.c:174 -msgid "sleep specified time" -msgstr "tiempo de espera especificado" +#~ msgid "Path length is zero. File=%s\n" +#~ msgstr "La longitud de la ruta es nula. Archivo=%s\n" -#: src/console/console.c:175 -msgid "print current time" -msgstr "imprimir hora actual" +#~ msgid "No results to list.\n" +#~ msgstr "No hay resultados para listar.\n" -#: src/console/console.c:176 -msgid "print Console's version" -msgstr "imprimir la versión de la Consola" +#, fuzzy +#~ msgid "Could not init database batch connection\n" +#~ msgstr "No se pudo iniciar base de datos de Bacula\n" -#: src/console/console.c:177 -msgid "echo command string" -msgstr "cadena de comando echo" +#~ msgid "Could not open database \"%s\": ERR=%s\n" +#~ msgstr "No se pudo abrir la base de datos \"%s\": ERR=%s\n" -#: src/console/console.c:178 -#, fuzzy -msgid "encode command string" -msgstr "cadena de comando echo" +#~ msgid "Create DB Job record %s failed. ERR=%s\n" +#~ msgstr "Creación de registro de Job %s en BD fallido. ERR=%s\n" -#: src/console/console.c:179 -msgid "execute an external command" -msgstr "ejecutar un comando externo" +#~ msgid "Create JobMedia record %s failed: ERR=%s\n" +#~ msgstr "Creación de registro de JobMedia %s fallido. ERR=%s\n" -#: src/console/console.c:180 -msgid "exit = quit" -msgstr "exit = salir" +#~ msgid "Update Media record %s failed: ERR=%s\n" +#~ msgstr "Actualización del registro de Media %s fallido: ERR=%s\n" -#: src/console/console.c:181 -#, fuzzy -msgid "send a file to the director" -msgstr "Reconectar al director" +#~ msgid "pool record %s already exists\n" +#~ msgstr "registro del pool %s ya existe\n" -#: src/console/console.c:182 -msgid "zed_keys = use zed keys instead of bash keys" -msgstr "zed_keys = usar las teclas zed en lugar de teclas bash" +#~ msgid "Create db Pool record %s failed: ERR=%s\n" +#~ msgstr "Creación del registro BD Pool %s fallido: ERR=%s\n" -#: src/console/console.c:183 -msgid "help listing" -msgstr "listado de ayuda" +#~ msgid "Device record %s already exists\n" +#~ msgstr "Registro de Dispositivo %s ya existe\n" -#: src/console/console.c:185 -msgid "set command separator" -msgstr "configurar separador de comandos" +#~ msgid "Create db Device record %s failed: ERR=%s\n" +#~ msgstr "Creación del registro de BD Device %s fallido: ERR=%s\n" -#: src/console/console.c:219 -msgid ": is an invalid command\n" -msgstr ": es un comando invalido\n" +#~ msgid "More than one Storage record!: %d\n" +#~ msgstr "Mas de un registro de almacenamiento!: %d\n" -#: src/console/console.c:714 -msgid "Illegal separator character.\n" -msgstr "Ilegal carácter de separación.\n" +#~ msgid "error fetching Storage row: %s\n" +#~ msgstr "error obteniendo fila del Almacenamiento:%s\n" -#: src/console/console.c:747 -msgid "Command logic problem\n" -msgstr "Problema lógico de comando\n" +#~ msgid "Create DB Storage record %s failed. ERR=%s\n" +#~ msgstr "Creación del registro BD Almacenamiento %s fallido. ERR=%s\n" -#: src/console/console.c:962 -#, fuzzy, c-format -msgid "Can't find %s in Director list\n" -msgstr "No se puede encontrar el recurso Director %s\n" +#~ msgid "mediatype record %s already exists\n" +#~ msgstr "registro de tipo de media %s ya existe\n" -#: src/console/console.c:970 -msgid "Available Directors:\n" -msgstr "Directors disponibles:\n" +#~ msgid "Create db mediatype record %s failed: ERR=%s\n" +#~ msgstr "Fallo al crear la db_mediatype_record %s: ERR=%s\n" -#: src/console/console.c:974 -#, c-format -msgid "%2d: %s at %s:%d\n" -msgstr "%2d: %s en %s:%d\n" +#~ msgid "Volume \"%s\" already exists.\n" +#~ msgstr "Volumen \"%s\" ya existe.\n" -#: src/console/console.c:978 -msgid "Select Director by entering a number: " -msgstr "Seleccione Director introduciendo un numero:" +#~ msgid "Create DB Media record %s failed. ERR=%s\n" +#~ msgstr "Creación del registro BD Almacenamiento %s fallido. ERR=%s\n" -#: src/console/console.c:985 -#, c-format -msgid "%s is not a number. You must enter a number between 1 and %d\n" -msgstr "%s no es un número. Debe introducir un número entre 1 y %d\n" +#~ msgid "More than one Client!: %d\n" +#~ msgstr "Mas de un cliente!: %d\n" -#: src/console/console.c:992 -#, c-format -msgid "You must enter a number between 1 and %d\n" -msgstr "Debe de introducir un numero entre 1 y %d\n" +#~ msgid "error fetching Client row: %s\n" +#~ msgstr "error al obtener la fila Cliente:%s\n" -#: src/console/console.c:1153 src/dird/dird.c:279 src/filed/filed.c:205 -#: src/qt-console/main.cpp:157 src/stored/stored.c:232 -#: src/stored/test-dedup.c:836 src/stored/tune-dde.c:330 -msgid "Cryptography library initialization failed.\n" -msgstr "Inicialización de la librería de criptografía ha fallado.\n" +#~ msgid "Create DB Client record %s failed. ERR=%s\n" +#~ msgstr "Creación del registro BD Cliente %s fallido. ERR=%s\n" -#: src/console/console.c:1188 -#, c-format -msgid "Connecting to Director %s:%d\n" -msgstr "Conectando al Director %s:%d\n" +#~ msgid "More than one Path!: %s for path: %s\n" +#~ msgstr "Mas de un Path!: %s para path: %s\n" -#: src/console/console.c:1205 src/qt-console/bcomm/dircomm.cpp:151 -#, c-format -msgid "Failed to initialize TLS context for Console \"%s\".\n" -msgstr "Fallo al inicializar el contexto TLS para la consola \"%s\".\n" +#~ msgid "Create db Path record %s failed. ERR=%s\n" +#~ msgstr "Creación del registro Path db %s fallido. ERR=%s\n" -#: src/console/console.c:1225 src/qt-console/bcomm/dircomm.cpp:174 -#, c-format -msgid "Failed to initialize TLS context for Director \"%s\".\n" -msgstr "Fallo al inicializar el contexto TLS para el Director \"%s\".\n" +#~ msgid "Create DB Counters record %s failed. ERR=%s\n" +#~ msgstr "Creación del registro BD Contadores %s fallido. ERR=%s\n" -#: src/console/console.c:1259 -msgid "Enter a period to cancel a command.\n" -msgstr "Introduzca un período para cancelar un comando.\n" +#~ msgid "More than one FileSet!: %d\n" +#~ msgstr "Más de un FileSet!: %d\n" -#: src/console/console.c:1410 -msgid "Too many arguments on input command.\n" -msgstr "Demasiados argumentos en comando de entrada.\n" +#~ msgid "error fetching FileSet row: ERR=%s\n" +#~ msgstr "error al obtener la fila FileSet: ERR=%s\n" -#: src/console/console.c:1414 -msgid "First argument to input command must be a filename.\n" -msgstr "" -"Primer argumento para comandos de entrada debe ser un nombre de archivo.\n" +#~ msgid "Create DB FileSet record %s failed. ERR=%s\n" +#~ msgstr "Creación del registro BD FileSet %s fallido. ERR=%s\n" -#: src/console/console.c:1420 -#, c-format -msgid "Cannot open file %s for input. ERR=%s\n" -msgstr "No se puede abrir el archivo %s para entrada. ERR=%s\n" +#~ msgid "Create db File record %s failed. ERR=%s" +#~ msgstr "Creación del registro File db %s fallido. ERR=%s" -#: src/console/console.c:1452 -msgid "Too many arguments on output/tee command.\n" -msgstr "Demasiados argumentos en la salida del comando output/tee.\n" +#~ msgid "Attempt to put non-attributes into catalog. Stream=%d\n" +#~ msgstr "Intento de poner non-atributos en el catálogo. Stream=%d\n" -#: src/console/console.c:1469 -#, c-format -msgid "Cannot open file %s for output. ERR=%s\n" -msgstr "No se puede abrir el archivo %s para salida. ERR=%s\n" +#~ msgid "ERR=JobIds are empty\n" +#~ msgstr "ERR=JobIds están vacíos\n" -#: src/console/console.c:1488 -msgid "Too many arguments. Enclose command in double quotes.\n" -msgstr "Demasiados argumentos. Incluya comando entre comillas dobles.\n" +#, fuzzy +#~ msgid "Create db Object record %s failed. ERR=%s" +#~ msgstr "Creación del registro File db %s fallido. ERR=%s" -#: src/console/console.c:1497 -#, c-format -msgid "Cannot popen(\"%s\", \"r\"): ERR=%s\n" -msgstr "No puede popen(\"%s\", \"r\"): ERR=%s\n" +#~ msgid "No pool record %s exists\n" +#~ msgstr "Registro de pool %s inexistente\n" -#: src/console/console.c:1509 -#, fuzzy, c-format -msgid "@exec error: ERR=%s\n" -msgstr "Seek error: ERR=%s\n" +#~ msgid "Expecting one pool record, got %d\n" +#~ msgstr "Esperando un registro pool, tiene %d\n" -#: src/console/console.c:1542 -msgid "The String to encode is too long\n" -msgstr "" +#~ msgid "Error fetching row %s\n" +#~ msgstr "Error obteniendo fila %s\n" -#: src/console/console_conf.c:130 src/qt-console/bat_conf.cpp:131 -#, c-format -msgid "No record for %d %s\n" -msgstr "Ningún registro para %d %s\n" +#~ msgid "" +#~ "Query error for start time request: ERR=%s\n" +#~ "CMD=%s\n" +#~ msgstr "" +#~ "Error de consulta al solicitar tiempo inicial: ERR=%s\n" +#~ "CMD=%s\n" -#: src/console/console_conf.c:139 -#, c-format -msgid "Console: name=%s rcfile=%s histfile=%s\n" -msgstr "Console: nombre=%s rcfile=%s histfile=%s\n" +#~ msgid "No prior Full backup Job record found.\n" +#~ msgstr "No encontrado registro anterior de Job de respaldo completo.\n" -#: src/console/console_conf.c:143 src/qt-console/bat_conf.cpp:140 -#, c-format -msgid "Director: name=%s address=%s DIRport=%d\n" -msgstr "Director: nombre=%s dirección=%s DIRport=%d\n" +#~ msgid "Unknown level=%d\n" +#~ msgstr "Nivel desconocido=%d\n" -#: src/console/console_conf.c:147 src/console/console_conf.c:227 -#: src/console/console_conf.c:268 src/console/console_conf.c:295 -#: src/filed/filed_conf.c:422 src/filed/filed_conf.c:486 -#: src/filed/filed_conf.c:516 src/qt-console/bat_conf.cpp:151 -#: src/qt-console/bat_conf.cpp:233 src/qt-console/bat_conf.cpp:279 -#: src/qt-console/bat_conf.cpp:309 src/stored/stored_conf.c:575 -#: src/stored/stored_conf.c:662 src/stored/stored_conf.c:697 -#, c-format -msgid "Unknown resource type %d\n" -msgstr "Tipo de recurso desconocido %d\n" +#~ msgid "" +#~ "No Job record found: ERR=%s\n" +#~ "CMD=%s\n" +#~ msgstr "" +#~ "No se encuentra el registro de trabajo: ERR=%s\n" +#~ " CMD=%s\n" -#: src/console/console_conf.c:249 src/dird/dird_conf.c:1466 -#: src/dird/dird_conf.c:1481 src/filed/filed_conf.c:447 -#: src/qt-console/bat_conf.cpp:257 -#: src/qt-console/tray-monitor/tray_conf.cpp:274 -#, c-format -msgid "%s item is required in %s resource, but not found.\n" -msgstr "Ítem %s es necesario en recurso %s, pero no se encuentra.\n" +#~ msgid "Unknown Job level=%d\n" +#~ msgstr "Nivel del Job desconocido=%d\n" -#: src/dird/admin.c:54 -#, c-format -msgid "Start Admin JobId %d, Job=%s\n" -msgstr "Inicio Admin JobId %d, Job=%s\n" +#~ msgid "No Job found for: %s.\n" +#~ msgstr "No se encontró ningún Job para: %s.\n" -#: src/dird/admin.c:79 src/dird/backup.c:801 src/dird/mac.c:719 -#: src/dird/vbackup.c:362 -#, c-format -msgid "Error getting Job record for Job report: ERR=%s" -msgstr "Error al obtener el registro del Job para reporte de trabajo: ERR=%s" +#~ msgid "No Job found for: %s\n" +#~ msgstr "Job no encontrado para:%s\n" -#: src/dird/admin.c:87 -msgid "Admin OK" -msgstr "Administración Ok" +#~ msgid "Request for Volume item %d greater than max %d or less than 1\n" +#~ msgstr "Solicitud de ítem Volumen %d mayor que el máximo %d o menor que 1\n" -#: src/dird/admin.c:91 -msgid "*** Admin Error ***" -msgstr "***Administración Error***" +#~ msgid "No Volume record found for item %d.\n" +#~ msgstr "Registro de ítem Volumen no encontrado %d.\n" -#: src/dird/admin.c:95 -msgid "Admin Canceled" -msgstr "Administración Cancelada" +#~ msgid "Error fetching row: %s\n" +#~ msgstr "Error obteniendo fila: %s\n" -#: src/dird/admin.c:99 src/dird/backup.c:857 src/dird/restore.c:671 -#: src/dird/vbackup.c:412 -#, c-format -msgid "Inappropriate term code: %c\n" -msgstr "Inadecuado código de terminación: %c\n" +#, fuzzy +#~ msgid "get_file_record want 1 got rows=%d PathId=%s Filename=%s\n" +#~ msgstr "get_file_record falta 1 obtuvo filas=%d\n" -#: src/dird/admin.c:107 src/lib/status.h:205 src/lib/status.h:216 -#: src/lib/status.h:230 src/lib/status.h:234 src/lib/status.h:238 -msgid "Bacula " -msgstr "Bacula" +#, fuzzy +#~ msgid "File record for PathId=%s Filename=%s not found.\n" +#~ msgstr "Registro File para PathID=%s FilenameID=%s no encontrado.\n" -#: src/dird/authenticate.c:78 src/dird/authenticate.c:79 -#: src/qt-console/tray-monitor/authenticate.cpp:120 -#, c-format -msgid "Error sending Hello to Storage daemon. ERR=%s\n" -msgstr "Error enviando Hello al servicio de Almacenamiento. ERR=%s\n" +#~ msgid "File record not found in Catalog.\n" +#~ msgstr "Registro File no se encuentra en Catalogo.\n" -#: src/dird/authenticate.c:108 -msgid "Director and Storage daemon passwords or names not the same.\n" -msgstr "Nombres o contraseñas en el Director o Storage no son las mismas.\n" +#~ msgid "Get DB path record %s found bad record: %s\n" +#~ msgstr "Obtener registro ruta %s de BD encontró malo registro: %s\n" -#: src/dird/authenticate.c:110 -#, fuzzy, c-format -msgid "" -"Director unable to authenticate with Storage daemon at \"%s:%d\". Possible " -"causes:\n" -"Passwords or names not the same or\n" -"Maximum Concurrent Jobs exceeded on the SD or\n" -"SD networking messed up (restart daemon).\n" -"For help, please see: " -msgstr "" -"Director no se puede autenticar con el demonio Storage en \"%s:%d\". " -"Posibles causas:\n" -"Contraseñas o nombres no son los mismos o\n" -"el Máximo de Concurrentes Jobs ha superado en el SD o\n" -"red SD desordenada (reiniciar demonio).\n" -"Por favor, consulte http://www.bacula.org/en/rel-manual/" -"Bacula_Freque_Asked_Questi.html#SECTION003760000000000000000 por ayuda.\n" - -#: src/dird/authenticate.c:138 -#, c-format -msgid "TLS negotiation failed with SD at \"%s:%d\"\n" -msgstr "Negociación TLS fallida con SD en \"%s:%d\"\n" +#~ msgid "Path record: %s not found.\n" +#~ msgstr "Registro Path: %s no encontrado.\n" -#: src/dird/authenticate.c:150 -#, c-format -msgid "bdird get resource type \n" -" -n get resource \n" -" -l get only directives matching dirs (use with -r)\n" -" -D get only data\n" -" -R do not apply JobDefs to Job\n" -" -c set configuration file to file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -t test - read configuration and exit\n" -" -s output in show text format\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Versión: %s (%s)\n" -"\n" -"Utilice: dird [-f -s] [-c archivo_configuración] [-d nivel_depuración] " -"[archivo_configuración]\n" -" -c establecer archivo de configuración para archivo \n" -" -d establecer el nivel de depuración para \n" -" -dt imprimir timestamp en salida de depuración\n" -" -f ejecutar en primer plano (para depuración)\n" -" -g groupid\n" -" -m imprimir salida kaboom para depuración)\n" -" -r ejecutar ahora\n" -" -s sin señales\n" -" -t prueba - leer la configuración y salir\n" -" -u userid\n" -" -v mensajes de usuario detallados\n" -" -? imprimir este mensaje.\n" -"\n" +#~ msgid "output to file and terminal" +#~ msgstr "salida a archivo y pantalla" -#: src/dird/bdirjson.c:1141 src/dird/dird.c:666 -#, c-format -msgid "" -"No Director resource defined in %s\n" -"Without that I don't know who I am :-(\n" -msgstr "" -"Recurso Director no definido en %s\n" -"Sin eso no sé quién soy :-(\n" +#~ msgid "sleep specified time" +#~ msgstr "tiempo de espera especificado" -#: src/dird/bdirjson.c:1149 src/dird/dird.c:674 src/filed/bfdjson.c:476 -#: src/filed/filed.c:341 -#, c-format -msgid "No Messages resource defined in %s\n" -msgstr "Recursos de Mensajes no definidos en %s\n" +#~ msgid "print current time" +#~ msgstr "imprimir hora actual" -#: src/dird/bdirjson.c:1154 src/dird/dird.c:679 -#, c-format -msgid "Only one Director resource permitted in %s\n" -msgstr "Sólo un recurso Director permitido en %s\n" +#~ msgid "print Console's version" +#~ msgstr "imprimir la versión de la Consola" -#: src/dird/bdirjson.c:1171 src/dird/dird.c:696 src/filed/bfdjson.c:536 -#: src/filed/filed.c:589 src/stored/bsdjson.c:533 src/stored/stored.c:418 -#, c-format -msgid "\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n" -msgstr "\"Certificado TLS\" archivo no definido para director \"%s\" en %s.\n" +#~ msgid "echo command string" +#~ msgstr "cadena de comando echo" -#: src/dird/bdirjson.c:1177 src/dird/dird.c:702 src/filed/bfdjson.c:542 -#: src/filed/filed.c:595 src/stored/bsdjson.c:539 src/stored/stored.c:424 -#, c-format -msgid "\"TLS Key\" file not defined for Director \"%s\" in %s.\n" -msgstr "\"Clave TLS\" archivo no definido para director \"%s\" en %s.\n" +#, fuzzy +#~ msgid "encode command string" +#~ msgstr "cadena de comando echo" -#: src/dird/bdirjson.c:1184 src/dird/dird.c:709 src/filed/bfdjson.c:548 -#: src/filed/filed.c:601 src/stored/bsdjson.c:545 src/stored/stored.c:430 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Director \"%s\" in %s. At least one CA certificate store is required when " -"using \"TLS Verify Peer\".\n" -msgstr "" -"Ninguno \"TLS CA Certificate\" o \"TLS CA Certificate Dir\" esta definido " -"para Director \"%s\" en %s. Al menos un almacén de certificado CA es " -"requerido cuando se utiliza \"TLS Verify Peer\".\n" +#~ msgid "execute an external command" +#~ msgstr "ejecutar un comando externo" -#: src/dird/bdirjson.c:1210 src/dird/dird.c:915 -#, c-format -msgid "\"TLS Certificate\" file not defined for Console \"%s\" in %s.\n" -msgstr "" -"Archivo de \"Certificado TLS\" no definido para Console \"%s\" en %s.\n" +#~ msgid "exit = quit" +#~ msgstr "exit = salir" -#: src/dird/bdirjson.c:1216 src/dird/dird.c:921 -#, c-format -msgid "\"TLS Key\" file not defined for Console \"%s\" in %s.\n" -msgstr "Archivo de \"Llave TLS\" no definido para Console \"%s\" en %s.\n" +#, fuzzy +#~ msgid "send a file to the director" +#~ msgstr "Reconectar al director" -#: src/dird/bdirjson.c:1223 src/dird/dird.c:928 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Console \"%s\" in %s. At least one CA certificate store is required when " -"using \"TLS Verify Peer\".\n" -msgstr "" -"Ninguno \"TLS CA Certificate\" o \"TLS CA Certificate Dir\" esta definido " -"para Console \"%s\" en %s. Al menos un almacén de certificado CA es " -"requerido cuando se utiliza \"TLS Verify Peer\".\n" +#~ msgid "zed_keys = use zed keys instead of bash keys" +#~ msgstr "zed_keys = usar las teclas zed en lugar de teclas bash" -#: src/dird/bdirjson.c:1240 src/dird/dird.c:945 src/dird/dird.c:985 -#: src/filed/filed.c:404 -#, c-format -msgid "Failed to initialize TLS context for File daemon \"%s\" in %s.\n" -msgstr "Fallo al inicializar contexto TLS para demonio File \"%s\" en %s.\n" +#~ msgid "help listing" +#~ msgstr "listado de ayuda" -#: src/dird/bdirjson.c:1263 src/dird/dird.c:968 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"File daemon \"%s\" in %s.\n" -msgstr "" -"Ninguno \"TLS CA Certificate\" o \"TLS CA Certificate Dir\" esta definido " -"para demonio File \"%s\" en %s.\n" +#~ msgid "set command separator" +#~ msgstr "configurar separador de comandos" -#: src/dird/bdirjson.c:1272 src/dird/dird.c:736 -#, c-format -msgid "No Job records defined in %s\n" -msgstr "Registros de Job no definidos en %s\n" +#~ msgid ": is an invalid command\n" +#~ msgstr ": es un comando invalido\n" -#: src/dird/bdirjson.c:1339 src/dird/bdirjson.c:1352 src/dird/dird.c:805 -#: src/dird/dird.c:818 -#, c-format -msgid "Hey something is wrong. p=0x%lu\n" -msgstr "Oye, algo está mal. p=0x%lu\n" +#~ msgid "Illegal separator character.\n" +#~ msgstr "Ilegal carácter de separación.\n" -#: src/dird/bdirjson.c:1413 src/dird/dird.c:880 -#, c-format -msgid "\"%s\" directive in Job \"%s\" resource is required, but not found.\n" -msgstr "" -"Directiva \"%s\" en recurso Job \"%s\" es requerida, pero no se encuentra.\n" +#~ msgid "Command logic problem\n" +#~ msgstr "Problema lógico de comando\n" -#: src/dird/bdirjson.c:1420 src/dird/dird.c:887 -msgid "Too many items in Job resource\n" -msgstr "Demasiados elementos en el recurso Job\n" +#, fuzzy +#~ msgid "Can't find %s in Director list\n" +#~ msgstr "No se puede encontrar el recurso Director %s\n" -#: src/dird/bdirjson.c:1424 src/dird/dird.c:891 -#, c-format -msgid "No storage specified in Job \"%s\" nor in Pool.\n" -msgstr "Ningún storage especificada en Job \"%s\" ni en Pool.\n" +#~ msgid "Available Directors:\n" +#~ msgstr "Directors disponibles:\n" -#: src/dird/bsr.c:190 -#, c-format -msgid "Unable to get Job record. ERR=%s\n" -msgstr "No se pudo obtener registro de Job. ERR=%s\n" +#~ msgid "%2d: %s at %s:%d\n" +#~ msgstr "%2d: %s en %s:%d\n" -#: src/dird/bsr.c:201 -#, c-format -msgid "Unable to get Job Volume Parameters. ERR=%s\n" -msgstr "No se pudo obtener Parámetros de Volumen de Job. ERR=%s\n" +#~ msgid "Select Director by entering a number: " +#~ msgstr "Seleccione Director introduciendo un numero:" -#: src/dird/bsr.c:249 -#, c-format -msgid "Unable to create bootstrap file %s. ERR=%s\n" -msgstr "No se puede crear el archivo bootstrap %s. ERR=%s\n" +#~ msgid "%s is not a number. You must enter a number between 1 and %d\n" +#~ msgstr "%s no es un número. Debe introducir un número entre 1 y %d\n" -#: src/dird/bsr.c:258 -msgid "No files found to read. No bootstrap file written.\n" -msgstr "" -"Ninguno archivo encontrado para leer. Ninguno archivo bootstrap escrito.\n" +#~ msgid "You must enter a number between 1 and %d\n" +#~ msgstr "Debe de introducir un numero entre 1 y %d\n" -#: src/dird/bsr.c:262 -msgid "Error writing bsr file.\n" -msgstr "Error escribiendo archivo bsr.\n" +#~ msgid "Connecting to Director %s:%d\n" +#~ msgstr "Conectando al Director %s:%d\n" -#: src/dird/bsr.c:313 -#, fuzzy -msgid "" -"The Job will require the following (*=>InChanger):\n" -" Volume(s) Storage(s) SD Device(s)\n" -"===========================================================================\n" -msgstr "" -"El job irá requerir los siguientes\n" -" Storage(s) Dispositivo(s) SD Volumen(es)\n" -"===========================================================================\n" +#~ msgid "Enter a period to cancel a command.\n" +#~ msgstr "Introduzca un período para cancelar un comando.\n" -#: src/dird/bsr.c:333 -msgid "No Volumes found to restore.\n" -msgstr "Volúmenes no encontrados para restaurar.\n" +#~ msgid "Too many arguments on input command.\n" +#~ msgstr "Demasiados argumentos en comando de entrada.\n" -#: src/dird/bsr.c:335 -#, fuzzy -msgid "" -"\n" -"Volumes marked with \"*\" are in the Autochanger.\n" -msgstr "" -"\n" -"Volúmenes marcados con \"*\" están en línea.\n" +#~ msgid "First argument to input command must be a filename.\n" +#~ msgstr "" +#~ "Primer argumento para comandos de entrada debe ser un nombre de archivo.\n" -#: src/dird/catreq.c:128 src/dird/catreq.c:382 -#, c-format -msgid "1990 Invalid Catalog Request: %s" -msgstr "1990 Solicitud de Catalogo no válido: %s" +#~ msgid "Cannot open file %s for input. ERR=%s\n" +#~ msgstr "No se puede abrir el archivo %s para entrada. ERR=%s\n" -#: src/dird/catreq.c:129 -#, c-format -msgid "Invalid Catalog request; DB not open: %s" -msgstr "Solicitud de Catalogo no válido; BD no abierta: %s" +#~ msgid "Too many arguments on output/tee command.\n" +#~ msgstr "Demasiados argumentos en la salida del comando output/tee.\n" -#: src/dird/catreq.c:150 -#, fuzzy, c-format -msgid "Pool \"%s\" not found for SD find media request.\n" -msgstr "Pool \"%s\" no encontrado, utilizando cualquier pool.\n" +#~ msgid "Cannot open file %s for output. ERR=%s\n" +#~ msgstr "No se puede abrir el archivo %s para salida. ERR=%s\n" -#: src/dird/catreq.c:159 -msgid "1901 No Media.\n" -msgstr "1901 Ninguna Media.\n" +#~ msgid "Too many arguments. Enclose command in double quotes.\n" +#~ msgstr "Demasiados argumentos. Incluya comando entre comillas dobles.\n" -#: src/dird/catreq.c:191 -msgid "not in Pool" -msgstr "no está¡ en Pool" +#~ msgid "Cannot popen(\"%s\", \"r\"): ERR=%s\n" +#~ msgstr "No puede popen(\"%s\", \"r\"): ERR=%s\n" -#: src/dird/catreq.c:193 -msgid "not correct MediaType" -msgstr "Tipo de Medio incorrecto" +#, fuzzy +#~ msgid "@exec error: ERR=%s\n" +#~ msgstr "Seek error: ERR=%s\n" -#: src/dird/catreq.c:203 -msgid "is not Enabled" -msgstr "no está¡ Habilitado" +#~ msgid "Console: name=%s rcfile=%s histfile=%s\n" +#~ msgstr "Console: nombre=%s rcfile=%s histfile=%s\n" -#: src/dird/catreq.c:212 -#, fuzzy, c-format -msgid "1998 Volume \"%s\" catalog status is %s, %s.\n" -msgstr "1998 Volumen \"%s\" en estado %s, %s.\n" +#~ msgid "Start Admin JobId %d, Job=%s\n" +#~ msgstr "Inicio Admin JobId %d, Job=%s\n" -#: src/dird/catreq.c:217 -#, c-format -msgid "1997 Volume \"%s\" not in catalog.\n" -msgstr "1197 Volumen \"%s\" no está¡ en catálogo.\n" +#~ msgid "Error getting Job record for Job report: ERR=%s" +#~ msgstr "" +#~ "Error al obtener el registro del Job para reporte de trabajo: ERR=%s" -#: src/dird/catreq.c:244 -#, c-format -msgid "Unable to get Media record for Volume %s: ERR=%s\n" -msgstr "No es posible obtener registro Media para el Volumen %s: ERR=%s\n" +#~ msgid "Admin OK" +#~ msgstr "Administración Ok" -#: src/dird/catreq.c:246 -#, c-format -msgid "1991 Catalog Request for vol=%s failed: %s" -msgstr "1991 Solicitud de Catalogo para vol=%s fallida:%s" +#~ msgid "*** Admin Error ***" +#~ msgstr "***Administración Error***" -#: src/dird/catreq.c:273 -#, fuzzy, c-format -msgid "Attempt to set Volume Files from %u to %u for Volume \"%s\". Ignored.\n" -msgstr "" -"Archivos de Volumen en %u se establece en %u para Volumen \"%s\". Esto es " -"incorrecto.\n" +#~ msgid "Admin Canceled" +#~ msgstr "Administración Cancelada" -#: src/dird/catreq.c:332 -#, c-format -msgid "Catalog error updating Media record. %s" -msgstr "Error de catalogo actualizando registro Media. %s" +#~ msgid "Inappropriate term code: %c\n" +#~ msgstr "Inadecuado código de terminación: %c\n" -#: src/dird/catreq.c:334 -msgid "1993 Update Media error\n" -msgstr "1993 Error de actualización de Media\n" +#~ msgid "Director and Storage daemon passwords or names not the same.\n" +#~ msgstr "Nombres o contraseñas en el Director o Storage no son las mismas.\n" -#: src/dird/catreq.c:361 -#, c-format -msgid "Catalog error creating JobMedia record. %s" -msgstr "Error de Catalogo al crear registro JobMedia. %s" +#, fuzzy +#~ msgid "" +#~ "Director unable to authenticate with Storage daemon at \"%s:%d\". " +#~ "Possible causes:\n" +#~ "Passwords or names not the same or\n" +#~ "Maximum Concurrent Jobs exceeded on the SD or\n" +#~ "SD networking messed up (restart daemon).\n" +#~ "For help, please see: " +#~ msgstr "" +#~ "Director no se puede autenticar con el demonio Storage en \"%s:%d\". " +#~ "Posibles causas:\n" +#~ "Contraseñas o nombres no son los mismos o\n" +#~ "el Máximo de Concurrentes Jobs ha superado en el SD o\n" +#~ "red SD desordenada (reiniciar demonio).\n" +#~ "Por favor, consulte http://www.bacula.org/en/rel-manual/" +#~ "Bacula_Freque_Asked_Questi.html#SECTION003760000000000000000 por ayuda.\n" -#: src/dird/catreq.c:363 -msgid "1992 Create JobMedia error\n" -msgstr "1992 Error al crear JobMedia\n" +#~ msgid "TLS negotiation failed with SD at \"%s:%d\"\n" +#~ msgstr "Negociación TLS fallida con SD en \"%s:%d\"\n" -#: src/dird/catreq.c:383 -#, c-format -msgid "Invalid Catalog request: %s" -msgstr "Invalida petición de Catalogo: %s" +#~ msgid "bdird set configuration file to file\n" -" -d [,] set debug level to , debug tags to \n" -" -dt print timestamp in debug output\n" -" -T set trace on\n" -" -f run in foreground (for debugging)\n" -" -g groupid\n" -" -m print kaboom output (for debugging)\n" -" -r run now\n" -" -s no signals\n" -" -t test - read configuration and exit\n" -" -u userid\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Versión: %s (%s)\n" -"\n" -"Utilice: dird [-f -s] [-c archivo_configuración] [-d nivel_depuración] " -"[archivo_configuración]\n" -" -c establecer archivo de configuración para archivo \n" -" -d establecer el nivel de depuración para \n" -" -dt imprimir timestamp en salida de depuración\n" -" -f ejecutar en primer plano (para depuración)\n" -" -g groupid\n" -" -m imprimir salida kaboom para depuración)\n" -" -r ejecutar ahora\n" -" -s sin señales\n" -" -t prueba - leer la configuración y salir\n" -" -u userid\n" -" -v mensajes de usuario detallados\n" -" -? imprimir este mensaje.\n" -"\n" +#~ msgid "Unable to authenticate console \"%s\" at %s:%s:%d.\n" +#~ msgstr "No se puede autenticar la consola \"%s\" en %s:%s:%d.\n" -#: src/dird/dird.c:502 #, fuzzy -msgid "Already doing a reload request, request ignored.\n" -msgstr "Demasiadas solicitudes de recarga abiertas. Solicitud ignorada.\n" +#~ msgid "1000 OK: %d %s %sVersion: %s (%s)\n" +#~ msgstr "1000 OK: %s Versión: %s(%s)\n" -#: src/dird/dird.c:526 -msgid "Too many open reload requests. Request ignored.\n" -msgstr "Demasiadas solicitudes de recarga abiertas. Solicitud ignorada.\n" +#~ msgid "" +#~ "End auto prune.\n" +#~ "\n" +#~ msgstr "" +#~ "Fin auto podar(prune).\n" +#~ "\n" -#: src/dird/dird.c:549 -msgid "Out of reload table entries. Giving up.\n" -msgstr "Fuera de entradas de las tablas recargadas. Abandonando.\n" +#~ msgid "Pool resource" +#~ msgstr "Recurso pool" -#: src/dird/dird.c:552 -msgid "Resetting previous configuration.\n" -msgstr "Restablecimiento de la configuración anterior.\n" +#~ msgid "No Storage specification found in Job or Pool.\n" +#~ msgstr "No se encuentran en la especificación del Storage en Job or Pool.\n" -#: src/dird/dird.c:728 src/filed/filed.c:620 src/stored/stored.c:449 -#, c-format -msgid "Failed to initialize TLS context for Director \"%s\" in %s.\n" -msgstr "Fallo al inicializar contexto TLS para Director \"%s\" en %s.\n" +#, fuzzy +#~ msgid "Using BaseJobId(s): %s\n" +#~ msgstr "%s utilizando JobId=%s Job=%s\n" -#: src/dird/dird.c:1044 src/dird/dird.c:1046 src/stored/bscan.c:287 -#: src/stored/bscan.c:294 -#, c-format -msgid "Could not open Catalog \"%s\", database \"%s\".\n" -msgstr "No se pudo abrir Catálogo \"%s\", base de datos \"%s\".\n" +#~ msgid "Cannot find previous jobids.\n" +#~ msgstr "No se puede encontrar jobids anteriores.\n" -#: src/dird/dird.c:1049 src/stored/bscan.c:290 src/tools/cats_test.c:364 -#, c-format -msgid "%s" -msgstr "%s" +#, fuzzy +#~ msgid "Sending Accurate information to the FD.\n" +#~ msgstr "Enviando información precisa.\n" -#: src/dird/dird.c:1149 -#, fuzzy, c-format -msgid "Could not create storage record for %s\n" -msgstr "No es posible crear el registro Pool. ERR=%s\n" +#, fuzzy +#~ msgid "Restart Incomplete Backup JobId %s, Job=%s\n" +#~ msgstr "Iniciar Respaldo JobId %s, Job=%s\n" -#: src/dird/dird.c:1157 -#, fuzzy, c-format -msgid "Could not update storage record for %s\n" -msgstr "No se pudo actualizar el registro de trabajo. ERR=%s\n" +#~ msgid "Start Backup JobId %s, Job=%s\n" +#~ msgstr "Iniciar Respaldo JobId %s, Job=%s\n" -#: src/dird/dird.c:1176 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Storage \"%s\" in %s.\n" -msgstr "" -"Ninguno \"TLS CA Certificate\" o \"TLS CA Certificate Dir\" esta definido " -"para Storage \"%s\" en %s.\n" +#~ msgid "Unexpected Client Job message: %s\n" +#~ msgstr "Inesperado Cliente Job mensaje: %s\n" -#: src/dird/dird.c:1192 src/stored/stored.c:402 -#, c-format -msgid "Failed to initialize TLS context for Storage \"%s\" in %s.\n" -msgstr "Fallo al inicializar contexto TLS para Storage \"%s\" en %s.\n" +#~ msgid "Network error with FD during %s: ERR=%s\n" +#~ msgstr "Error de red con FD durante %s: ERR=%s\n" -#: src/dird/dird.c:1306 src/dird/mac_sql.c:548 src/stored/stored.c:505 -#, c-format -msgid "Could not compile regex pattern \"%s\" ERR=%s\n" -msgstr "No se ha podido compilar patrón regex \"%s\" ERR=%s\n" +#~ msgid "No Job status returned from FD.\n" +#~ msgstr "Estado de Job no retornado desde FD.\n" -#: src/dird/dird_conf.c:579 src/qt-console/tray-monitor/tray_conf.cpp:158 -#, c-format -msgid "No %s resource defined\n" -msgstr "Recurso %s no definido\n" +#~ msgid "Error getting Client record for Job report: ERR=%s" +#~ msgstr "Error al obtener registro de Clientes para reporte de Job: ERR=%s" -#: src/dird/dird_conf.c:588 -#, c-format -msgid "Director: name=%s MaxJobs=%d FDtimeout=%s SDtimeout=%s\n" -msgstr "Director: nombre=%s MaxJobs=%d FDtimeout=%s SDtimeout=%s\n" +#~ msgid "Error getting Media record for Volume \"%s\": ERR=%s" +#~ msgstr "Error al obtener registro de Media para Volumen \"%s\": ERR=%s" -#: src/dird/dird_conf.c:593 -#, c-format -msgid " query_file=%s\n" -msgstr "query_file=%s\n" - -#: src/dird/dird_conf.c:596 src/dird/dird_conf.c:616 src/dird/dird_conf.c:641 -#: src/dird/dird_conf.c:733 src/dird/dird_conf.c:737 src/dird/dird_conf.c:741 -#: src/dird/dird_conf.c:774 src/dird/dird_conf.c:797 src/dird/dird_conf.c:813 -#: src/dird/dird_conf.c:826 src/dird/dird_conf.c:1069 -#: src/dird/dird_conf.c:1076 -msgid " --> " -msgstr "--> " - -#: src/dird/dird_conf.c:601 -#, c-format -msgid "Console: name=%s SSL=%d\n" -msgstr "Console: nombre=%s SSL=%d\n" +#~ msgid "Backup OK -- with warnings" +#~ msgstr "Respaldo OK -- con advertencias" -#: src/dird/dird_conf.c:606 -#, c-format -msgid "Counter: name=%s min=%d max=%d cur=%d wrapcntr=%s\n" -msgstr "Counter: nombre=%s mínimo=%d máximo=%d cur=%d wrapcntr=%s\n" +#~ msgid "Backup OK" +#~ msgstr "Respaldo OK" -#: src/dird/dird_conf.c:611 -#, c-format -msgid "Counter: name=%s min=%d max=%d\n" -msgstr "Counter: nombre=%s mínimo=%d máximo=%d\n" +#~ msgid "*** Backup Error ***" +#~ msgstr "***Error en Respaldo ***" -#: src/dird/dird_conf.c:625 -#, fuzzy, c-format -msgid "Client: Name=%s Enabled=%d Address=%s FDport=%d MaxJobs=%u\n" -msgstr "Cliente: nombre=%s dirección=%s FDport=%d MaxJobs=%u\n" +#~ msgid "Backup Canceled" +#~ msgstr "Respaldo Cancelado" -#: src/dird/dird_conf.c:629 -#, c-format -msgid " JobRetention=%s FileRetention=%s AutoPrune=%d\n" -msgstr "JobRetention=%s FileRetention=%s AutoPrune=%d\n" +#, fuzzy +#~ msgid "" +#~ "%s %s %s (%s):\n" +#~ " Build OS: %s %s %s\n" +#~ " JobId: %d\n" +#~ " Job: %s\n" +#~ " Backup Level: %s%s\n" +#~ " Client: \"%s\" %s\n" +#~ " FileSet: \"%s\" %s\n" +#~ " Pool: \"%s\" (From %s)\n" +#~ " Catalog: \"%s\" (From %s)\n" +#~ " Storage: \"%s\" (From %s)\n" +#~ " Scheduled time: %s\n" +#~ " Start time: %s\n" +#~ " End time: %s\n" +#~ " Elapsed time: %s\n" +#~ " Priority: %d\n" +#~ " FD Files Written: %s\n" +#~ " SD Files Written: %s\n" +#~ " FD Bytes Written: %s (%sB)\n" +#~ " SD Bytes Written: %s (%sB)\n" +#~ " Rate: %.1f KB/s\n" +#~ " Software Compression: %s\n" +#~ " Comm Line Compression: %s\n" +#~ "%s Snapshot/VSS: %s\n" +#~ " Encryption: %s\n" +#~ " Accurate: %s\n" +#~ " Volume name(s): %s\n" +#~ " Volume Session Id: %d\n" +#~ " Volume Session Time: %d\n" +#~ " Last Volume Bytes: %s\n" +#~ " Non-fatal FD errors: %d\n" +#~ " SD Errors: %d\n" +#~ " FD termination status: %s\n" +#~ " SD termination status: %s\n" +#~ " Termination: %s\n" +#~ "\n" +#~ msgstr "" +#~ "%s %s %s (%s): %s\n" +#~ " Build OS: %s %s %s\n" +#~ " JobId: %d\n" +#~ " Job: %s\n" +#~ " Nivel de Respaldo: %s%s\n" +#~ " Cliente: \"%s\" %s\n" +#~ " FileSet: \"%s\" %s\n" +#~ " Pool: \"%s\" (Desde %s)\n" +#~ " Catalogo: \"%s\" (Desde %s)\n" +#~ " Storage: \"%s\" (Desde %s)\n" +#~ " Hora programada: %s\n" +#~ " Hora de inicio: %s\n" +#~ " Hora de finalización: %s\n" +#~ " Tiempo transcurrido: %s\n" +#~ " Prioridad: %d\n" +#~ " FD Archivos Escritos: %s\n" +#~ " SD Archivos Escritos: %s\n" +#~ " FD Bytes Escritos: %s (%sB)\n" +#~ " SD Bytes Escritos: %s (%sB)\n" +#~ " Tasa: %.1f KB/s\n" +#~ " Software Compresión: %s\n" +#~ " VSS: %s\n" +#~ " Cifrado: %s\n" +#~ " Accurate: %s\n" +#~ " Nombre del Volumen(es): %s\n" +#~ " Id de Sesión del Volumen: %d\n" +#~ " Tiempo de Sesión del Volumen: %d\n" +#~ " Ultimo Volumen Bytes: %s (%sB)\n" +#~ " No-fatal FD errores: %d\n" +#~ " SD Errores: %d\n" +#~ " Estado de terminación FD: %s\n" +#~ " Estado de terminación SD: %s\n" +#~ " Terminación: %s\n" +#~ "\n" -#: src/dird/dird_conf.c:637 src/dird/dird_conf.c:726 -#, c-format -msgid " MaximumBandwidth=%lld\n" -msgstr "" +#~ msgid "yes" +#~ msgstr "si" -#: src/dird/dird_conf.c:649 -#, c-format -msgid "" -"Device: name=%s ok=%d num_writers=%d max_writers=%d\n" -" reserved=%d open=%d append=%d read=%d labeled=%d offline=%d autochgr=" -"%d\n" -" poolid=%s volname=%s MediaType=%s\n" -msgstr "" -"Device: nombre=%s ok=%d num_writers=%d max_writers=%d\n" -" reservado=%d abierto=%d append=%d leer=%d etiquetado=%d offline=%d autochgr=" -"%d\n" -" poolid=%s volname=%s MediaType=%s\n" +#~ msgid "no" +#~ msgstr "no" -#: src/dird/dird_conf.c:664 -#, fuzzy, c-format -msgid "" -"%s: name=%s address=%s SDport=%d MaxJobs=%u\n" -" DeviceName=%s MediaType=%s StorageId=%s Autochanger=%d\n" -msgstr "" -"Storage: nombre=%s dirección=%s SDport=%d MaxJobs=%u\n" -" DeviceName=%s MediaType=%s StorageId=%s\n" +#~ msgid "" +#~ "Could not get Job Volume Parameters to update Bootstrap file. ERR=%s\n" +#~ msgstr "" +#~ "No es posible obtener los parámetros de Job Volumen para actualizar el " +#~ "archivo Bootstrap. ERR=%s\n" -#: src/dird/dird_conf.c:682 -#, fuzzy -msgid " Parent --> " -msgstr "--> " +#~ msgid "" +#~ "Could not open WriteBootstrap file:\n" +#~ "%s: ERR=%s\n" +#~ msgstr "" +#~ "No se pudo abrir el archivo WriteBootstrap:\n" +#~ "%s: ERR=%s\n" -#: src/dird/dird_conf.c:687 #, fuzzy -msgid " Shared --> " -msgstr "--> " +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bdirjson [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -r get resource type \n" +#~ " -n get resource \n" +#~ " -l get only directives matching dirs (use with -r)\n" +#~ " -D get only data\n" +#~ " -R do not apply JobDefs to Job\n" +#~ " -c set configuration file to file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -t test - read configuration and exit\n" +#~ " -s output in show text format\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Versión: %s (%s)\n" +#~ "\n" +#~ "Utilice: dird [-f -s] [-c archivo_configuración] [-d nivel_depuración] " +#~ "[archivo_configuración]\n" +#~ " -c establecer archivo de configuración para archivo \n" +#~ " -d establecer el nivel de depuración para \n" +#~ " -dt imprimir timestamp en salida de depuración\n" +#~ " -f ejecutar en primer plano (para depuración)\n" +#~ " -g groupid\n" +#~ " -m imprimir salida kaboom para depuración)\n" +#~ " -r ejecutar ahora\n" +#~ " -s sin señales\n" +#~ " -t prueba - leer la configuración y salir\n" +#~ " -u userid\n" +#~ " -v mensajes de usuario detallados\n" +#~ " -? imprimir este mensaje.\n" +#~ "\n" -#: src/dird/dird_conf.c:696 -#, c-format -msgid "" -"Catalog: name=%s address=%s DBport=%d db_name=%s\n" -" db_driver=%s db_user=%s MutliDBConn=%d\n" -msgstr "" -"Catálogo: nombre=%s dirección=%s DBport=%d db_nombre=%s\n" -" db_driver=%s db_user=%s MutliDBConn=%d\n" +#~ msgid "" +#~ "No Director resource defined in %s\n" +#~ "Without that I don't know who I am :-(\n" +#~ msgstr "" +#~ "Recurso Director no definido en %s\n" +#~ "Sin eso no sé quién soy :-(\n" -#: src/dird/dird_conf.c:709 -#, c-format -msgid "%s: name=%s JobType=%d level=%s Priority=%d Enabled=%d\n" -msgstr "%s: nombre=%s JobType=%d nivel=%s Prioridad=%d Activo=%d\n" +#~ msgid "No Messages resource defined in %s\n" +#~ msgstr "Recursos de Mensajes no definidos en %s\n" -#: src/dird/dird_conf.c:710 src/dird/ua_prune.c:603 src/dird/ua_run.c:1013 -#: src/dird/ua_select.c:292 src/dird/ua_select.c:315 src/dird/ua_select.c:356 -#: src/dird/ua_select.c:1453 -msgid "Job" -msgstr "Job" +#~ msgid "Only one Director resource permitted in %s\n" +#~ msgstr "Sólo un recurso Director permitido en %s\n" -#: src/dird/dird_conf.c:710 -msgid "JobDefs" -msgstr "JobDefs" +#~ msgid "\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n" +#~ msgstr "" +#~ "\"Certificado TLS\" archivo no definido para director \"%s\" en %s.\n" -#: src/dird/dird_conf.c:714 -#, c-format -msgid "" -" MaxJobs=%u Resched=%d Times=%d Interval=%s Spool=%d WritePartAfterJob=" -"%d\n" -msgstr "" -"MaxJobs=%u Resched=%d Times=%d Intervalo=%s Spool=%d WritePartAfterJob=%d\n" +#~ msgid "\"TLS Key\" file not defined for Director \"%s\" in %s.\n" +#~ msgstr "\"Clave TLS\" archivo no definido para director \"%s\" en %s.\n" -#: src/dird/dird_conf.c:720 -#, c-format -msgid " SpoolSize=%s\n" -msgstr "SpoolSize=%s\n" +#~ msgid "" +#~ "Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined " +#~ "for Director \"%s\" in %s. At least one CA certificate store is required " +#~ "when using \"TLS Verify Peer\".\n" +#~ msgstr "" +#~ "Ninguno \"TLS CA Certificate\" o \"TLS CA Certificate Dir\" esta definido " +#~ "para Director \"%s\" en %s. Al menos un almacén de certificado CA es " +#~ "requerido cuando se utiliza \"TLS Verify Peer\".\n" -#: src/dird/dird_conf.c:723 -#, c-format -msgid " Accurate=%d\n" -msgstr "Preciso=%d\n" +#~ msgid "\"TLS Certificate\" file not defined for Console \"%s\" in %s.\n" +#~ msgstr "" +#~ "Archivo de \"Certificado TLS\" no definido para Console \"%s\" en %s.\n" -#: src/dird/dird_conf.c:730 -#, c-format -msgid " SelectionType=%d\n" -msgstr "SelectionType=%d\n" +#~ msgid "\"TLS Key\" file not defined for Console \"%s\" in %s.\n" +#~ msgstr "Archivo de \"Llave TLS\" no definido para Console \"%s\" en %s.\n" -#: src/dird/dird_conf.c:745 -#, c-format -msgid " --> Where=%s\n" -msgstr "--> Donde=%s\n" +#~ msgid "" +#~ "Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined " +#~ "for Console \"%s\" in %s. At least one CA certificate store is required " +#~ "when using \"TLS Verify Peer\".\n" +#~ msgstr "" +#~ "Ninguno \"TLS CA Certificate\" o \"TLS CA Certificate Dir\" esta definido " +#~ "para Console \"%s\" en %s. Al menos un almacén de certificado CA es " +#~ "requerido cuando se utiliza \"TLS Verify Peer\".\n" -#: src/dird/dird_conf.c:748 -#, c-format -msgid " --> RegexWhere=%s\n" -msgstr "--> RegexDonde=%s\n" +#~ msgid "Failed to initialize TLS context for File daemon \"%s\" in %s.\n" +#~ msgstr "Fallo al inicializar contexto TLS para demonio File \"%s\" en %s.\n" -#: src/dird/dird_conf.c:751 -#, c-format -msgid " --> Bootstrap=%s\n" -msgstr "--> Bootstrap=%s\n" +#~ msgid "" +#~ "Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined " +#~ "for File daemon \"%s\" in %s.\n" +#~ msgstr "" +#~ "Ninguno \"TLS CA Certificate\" o \"TLS CA Certificate Dir\" esta definido " +#~ "para demonio File \"%s\" en %s.\n" -#: src/dird/dird_conf.c:754 -#, c-format -msgid " --> WriteBootstrap=%s\n" -msgstr "--> WriteBootstrap=%s\n" +#~ msgid "No Job records defined in %s\n" +#~ msgstr "Registros de Job no definidos en %s\n" -#: src/dird/dird_conf.c:757 -#, c-format -msgid " --> PluginOptions=%s\n" -msgstr "--> PluginOptions=%s\n" +#~ msgid "Hey something is wrong. p=0x%lu\n" +#~ msgstr "Oye, algo está mal. p=0x%lu\n" -#: src/dird/dird_conf.c:760 -#, c-format -msgid " --> MaxRunTime=%u\n" -msgstr "--> MaxRunTime=%u\n" +#~ msgid "" +#~ "\"%s\" directive in Job \"%s\" resource is required, but not found.\n" +#~ msgstr "" +#~ "Directiva \"%s\" en recurso Job \"%s\" es requerida, pero no se " +#~ "encuentra.\n" -#: src/dird/dird_conf.c:763 -#, c-format -msgid " --> MaxWaitTime=%u\n" -msgstr "--> MaxWaitTime=%u\n" +#~ msgid "Too many items in Job resource\n" +#~ msgstr "Demasiados elementos en el recurso Job\n" -#: src/dird/dird_conf.c:766 -#, c-format -msgid " --> MaxStartDelay=%u\n" -msgstr "--> MaxStartDelay=%u\n" +#~ msgid "No storage specified in Job \"%s\" nor in Pool.\n" +#~ msgstr "Ningún storage especificada en Job \"%s\" ni en Pool.\n" -#: src/dird/dird_conf.c:769 -#, fuzzy, c-format -msgid " --> MaxRunSchedTime=%u\n" -msgstr "--> MaxRunTime=%u\n" +#~ msgid "Unable to get Job record. ERR=%s\n" +#~ msgstr "No se pudo obtener registro de Job. ERR=%s\n" -#: src/dird/dird_conf.c:781 -#, fuzzy, c-format -msgid " --> Base %s\n" -msgstr "--> Objetivo=%s\n" +#~ msgid "Unable to get Job Volume Parameters. ERR=%s\n" +#~ msgstr "No se pudo obtener Parámetros de Volumen de Job. ERR=%s\n" -#: src/dird/dird_conf.c:787 src/lib/runscript.c:286 -msgid " --> RunScript\n" -msgstr "--> EjecutarScript\n" +#~ msgid "Unable to create bootstrap file %s. ERR=%s\n" +#~ msgstr "No se puede crear el archivo bootstrap %s. ERR=%s\n" -#: src/dird/dird_conf.c:788 src/lib/runscript.c:287 -#, c-format -msgid " --> Command=%s\n" -msgstr "--> Comando=%s\n" +#~ msgid "No files found to read. No bootstrap file written.\n" +#~ msgstr "" +#~ "Ninguno archivo encontrado para leer. Ninguno archivo bootstrap escrito.\n" -#: src/dird/dird_conf.c:789 src/lib/runscript.c:288 -#, c-format -msgid " --> Target=%s\n" -msgstr "--> Objetivo=%s\n" +#~ msgid "Error writing bsr file.\n" +#~ msgstr "Error escribiendo archivo bsr.\n" -#: src/dird/dird_conf.c:790 src/lib/runscript.c:289 -#, c-format -msgid " --> RunOnSuccess=%u\n" -msgstr "--> RunOnSuccess=%u\n" +#, fuzzy +#~ msgid "" +#~ "The Job will require the following (*=>InChanger):\n" +#~ " Volume(s) Storage(s) SD Device(s)\n" +#~ "===========================================================================\n" +#~ msgstr "" +#~ "El job irá requerir los siguientes\n" +#~ " Storage(s) Dispositivo(s) SD Volumen(es)\n" +#~ "===========================================================================\n" -#: src/dird/dird_conf.c:791 src/lib/runscript.c:290 -#, c-format -msgid " --> RunOnFailure=%u\n" -msgstr "--> RunOnFailure=%u\n" +#~ msgid "No Volumes found to restore.\n" +#~ msgstr "Volúmenes no encontrados para restaurar.\n" -#: src/dird/dird_conf.c:792 src/lib/runscript.c:291 -#, c-format -msgid " --> FailJobOnError=%u\n" -msgstr "--> FailJobOnError=%u\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Volumes marked with \"*\" are in the Autochanger.\n" +#~ msgstr "" +#~ "\n" +#~ "Volúmenes marcados con \"*\" están en línea.\n" -#: src/dird/dird_conf.c:793 src/lib/runscript.c:292 -#, c-format -msgid " --> RunWhen=%u\n" -msgstr "--> EjecutarCuando=%u\n" +#~ msgid "1990 Invalid Catalog Request: %s" +#~ msgstr "1990 Solicitud de Catalogo no válido: %s" -#: src/dird/dird_conf.c:801 -msgid " --> FullBackup" -msgstr "" +#~ msgid "Invalid Catalog request; DB not open: %s" +#~ msgstr "Solicitud de Catalogo no válido; BD no abierta: %s" -#: src/dird/dird_conf.c:805 #, fuzzy -msgid " --> IncrementalBackup" -msgstr "Incremental" +#~ msgid "Pool \"%s\" not found for SD find media request.\n" +#~ msgstr "Pool \"%s\" no encontrado, utilizando cualquier pool.\n" -#: src/dird/dird_conf.c:809 -#, fuzzy -msgid " --> DifferentialBackup" -msgstr "Diferencial" +#~ msgid "1901 No Media.\n" +#~ msgstr "1901 Ninguna Media.\n" -#: src/dird/dird_conf.c:819 -#, c-format -msgid " --> Run=%s\n" -msgstr "--> Ejecutar=%s\n" +#~ msgid "not in Pool" +#~ msgstr "no está¡ en Pool" -#: src/dird/dird_conf.c:823 -#, c-format -msgid " --> SelectionPattern=%s\n" -msgstr "--> SeleccionPatron=%s\n" +#~ msgid "not correct MediaType" +#~ msgstr "Tipo de Medio incorrecto" -#: src/dird/dird_conf.c:837 -#, c-format -msgid "FileSet: name=%s\n" -msgstr "FileSet: nombre=%s\n" +#~ msgid "is not Enabled" +#~ msgstr "no está¡ Habilitado" -#: src/dird/dird_conf.c:931 -#, fuzzy, c-format -msgid "Schedule: Name=%s Enabled=%d\n" -msgstr "Schedule: nombre=%s\n" +#, fuzzy +#~ msgid "1998 Volume \"%s\" catalog status is %s, %s.\n" +#~ msgstr "1998 Volumen \"%s\" en estado %s, %s.\n" -#: src/dird/dird_conf.c:937 -#, c-format -msgid " --> Run Level=%s\n" -msgstr "--> Ejecutar Nivel=%s\n" +#~ msgid "1997 Volume \"%s\" not in catalog.\n" +#~ msgstr "1197 Volumen \"%s\" no está¡ en catálogo.\n" -#: src/dird/dird_conf.c:939 -#, fuzzy, c-format -msgid " MaxRunSchedTime=%u\n" -msgstr "--> MaxRunTime=%u\n" +#~ msgid "Unable to get Media record for Volume %s: ERR=%s\n" +#~ msgstr "No es posible obtener registro Media para el Volumen %s: ERR=%s\n" -#: src/dird/dird_conf.c:942 -#, fuzzy, c-format -msgid " Priority=%u\n" -msgstr "woy=" +#~ msgid "1991 Catalog Request for vol=%s failed: %s" +#~ msgstr "1991 Solicitud de Catalogo para vol=%s fallida:%s" -#: src/dird/dird_conf.c:944 -msgid " hour=" -msgstr "hora=" +#, fuzzy +#~ msgid "" +#~ "Attempt to set Volume Files from %u to %u for Volume \"%s\". Ignored.\n" +#~ msgstr "" +#~ "Archivos de Volumen en %u se establece en %u para Volumen \"%s\". Esto es " +#~ "incorrecto.\n" -#: src/dird/dird_conf.c:953 -msgid " mday=" -msgstr "mdia=" +#~ msgid "Catalog error updating Media record. %s" +#~ msgstr "Error de catalogo actualizando registro Media. %s" -#: src/dird/dird_conf.c:962 -msgid " month=" -msgstr "mes=" +#~ msgid "1993 Update Media error\n" +#~ msgstr "1993 Error de actualización de Media\n" -#: src/dird/dird_conf.c:971 -msgid " wday=" -msgstr "wdia=" +#~ msgid "Catalog error creating JobMedia record. %s" +#~ msgstr "Error de Catalogo al crear registro JobMedia. %s" -#: src/dird/dird_conf.c:980 -msgid " wom=" -msgstr "wom=" +#~ msgid "1992 Create JobMedia error\n" +#~ msgstr "1992 Error al crear JobMedia\n" -#: src/dird/dird_conf.c:989 -msgid " woy=" -msgstr "woy=" +#~ msgid "Invalid Catalog request: %s" +#~ msgstr "Invalida petición de Catalogo: %s" -#: src/dird/dird_conf.c:998 -#, c-format -msgid " mins=%d\n" -msgstr "mins=%d\n" +#, fuzzy +#~ msgid "Attribute create error: ERR=%s" +#~ msgstr "error al crear Atributo.%s" -#: src/dird/dird_conf.c:1000 src/dird/dird_conf.c:1004 -#: src/dird/dird_conf.c:1008 -msgid " --> " -msgstr "--> " +#, fuzzy +#~ msgid "Restore object create error. %s" +#~ msgstr "error al crear Atributo.%s" -#: src/dird/dird_conf.c:1017 -#, c-format -msgid "Schedule: name=%s\n" -msgstr "Schedule: nombre=%s\n" +#, fuzzy +#~ msgid "%s not same File=%d as attributes=%d\n" +#~ msgstr "Obtuvo %s, pero no igual que los atributos de File\n" -#: src/dird/dird_conf.c:1025 -#, c-format -msgid "Pool: name=%s PoolType=%s\n" -msgstr "Pool: nombre=%s PoolType=%s\n" +#~ msgid "" +#~ "Catalog error updating file digest. Unsupported digest stream type: %d" +#~ msgstr "" +#~ "Error al actualizar el resumen de archivo de catálogo. Incompatible " +#~ "resumen de tipo de flujo: %d" -#: src/dird/dird_conf.c:1027 -#, c-format -msgid " use_cat=%d use_once=%d cat_files=%d\n" -msgstr "use_cat=%d use_once=%d cat_files=%d\n" +#, fuzzy +#~ msgid "attribute create error. %s" +#~ msgstr "error al crear Atributo.%s" -#: src/dird/dird_conf.c:1030 -#, c-format -msgid " max_vols=%d auto_prune=%d VolRetention=%s\n" -msgstr "max_vols=%d auto_prune=%d VolRetention=%s\n" +#~ msgid "Catalog error updating file digest. %s" +#~ msgstr "Error de catalogo actualizando archivo de resumen. %s" -#: src/dird/dird_conf.c:1033 -#, c-format -msgid " VolUse=%s recycle=%d LabelFormat=%s\n" -msgstr "VolUse=%s recycle=%d LabelFormat=%s\n" +#~ msgid "1994 Invalid Catalog Update: %s" +#~ msgstr "1994 Invalido Catálogo de Actualizaciones: %s" -#: src/dird/dird_conf.c:1037 -#, c-format -msgid " CleaningPrefix=%s LabelType=%d\n" -msgstr "CleaningPrefix=%s LabelType=%d\n" +#~ msgid "Invalid Catalog Update; DB not open: %s" +#~ msgstr "Actualización de Catalogo Inválida; La Base de Datos no se abre: %s" -#: src/dird/dird_conf.c:1039 -#, c-format -msgid " RecyleOldest=%d PurgeOldest=%d ActionOnPurge=%d\n" -msgstr "RecyleOldest=%d PurgeOldest=%d ActionOnPurge=%d\n" +#~ msgid "fread attr spool error. ERR=%s\n" +#~ msgstr "Error fread attr spool. ERR=%s\n" -#: src/dird/dird_conf.c:1043 -#, c-format -msgid " MaxVolJobs=%d MaxVolFiles=%d MaxVolBytes=%s\n" -msgstr "MaxVolJobs=%d MaxVolFiles=%d MaxVolBytes=%s\n" +#~ msgid "Loaded plugin: %s\n" +#~ msgstr "Cargado el plugin: %s\n" -#: src/dird/dird_conf.c:1047 -#, c-format -msgid " MigTime=%s MigHiBytes=%s MigLoBytes=%s\n" -msgstr "MigTime=%s MigHiBytes=%s MigLoBytes=%s\n" +#~ msgid "Plugin magic wrong. Plugin=%s wanted=%s got=%s\n" +#~ msgstr "Incorrecto plugin mágico. Plugin=%s esperaba=%s obtuvo=%s\n" -#: src/dird/dird_conf.c:1051 -#, fuzzy, c-format -msgid " JobRetention=%s FileRetention=%s\n" -msgstr "JobRetention=%s FileRetention=%s AutoPrune=%d\n" +#~ msgid "Plugin version incorrect. Plugin=%s wanted=%d got=%d\n" +#~ msgstr "Plugin versión incorrecta. Plugin=%s quería=%d obtuvo=%d\n" -#: src/dird/dird_conf.c:1055 -#, c-format -msgid " NextPool=%s\n" -msgstr "NextPool=%s\n" +#~ msgid "Plugin license incompatible. Plugin=%s license=%s\n" +#~ msgstr "Plugin licencia incompatible. Plugin=%s licencia=%s\n" -#: src/dird/dird_conf.c:1058 -#, c-format -msgid " RecyclePool=%s\n" -msgstr "RecyclePool=%s\n" +#, fuzzy +#~ msgid "Plugin size incorrect. Plugin=%s wanted=%d got=%d\n" +#~ msgstr "Plugin versión incorrecta. Plugin=%s quería=%d obtuvo=%d\n" -#: src/dird/dird_conf.c:1061 -#, c-format -msgid " ScratchPool=%s\n" -msgstr "ScratchPool=%s\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bacula-dir [-f -s] [-c config_file] [-d debug_level] " +#~ "[config_file]\n" +#~ " -c set configuration file to file\n" +#~ " -d [,] set debug level to , debug tags to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -T set trace on\n" +#~ " -f run in foreground (for debugging)\n" +#~ " -g groupid\n" +#~ " -m print kaboom output (for debugging)\n" +#~ " -r run now\n" +#~ " -s no signals\n" +#~ " -t test - read configuration and exit\n" +#~ " -u userid\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Versión: %s (%s)\n" +#~ "\n" +#~ "Utilice: dird [-f -s] [-c archivo_configuración] [-d nivel_depuración] " +#~ "[archivo_configuración]\n" +#~ " -c establecer archivo de configuración para archivo \n" +#~ " -d establecer el nivel de depuración para \n" +#~ " -dt imprimir timestamp en salida de depuración\n" +#~ " -f ejecutar en primer plano (para depuración)\n" +#~ " -g groupid\n" +#~ " -m imprimir salida kaboom para depuración)\n" +#~ " -r ejecutar ahora\n" +#~ " -s sin señales\n" +#~ " -t prueba - leer la configuración y salir\n" +#~ " -u userid\n" +#~ " -v mensajes de usuario detallados\n" +#~ " -? imprimir este mensaje.\n" +#~ "\n" -#: src/dird/dird_conf.c:1064 -#, c-format -msgid " Catalog=%s\n" -msgstr "Catálogo=%s\n" +#, fuzzy +#~ msgid "Already doing a reload request, request ignored.\n" +#~ msgstr "Demasiadas solicitudes de recarga abiertas. Solicitud ignorada.\n" -#: src/dird/dird_conf.c:1084 -#, c-format -msgid "Messages: name=%s\n" -msgstr "Mensajes: nombre=%s\n" +#~ msgid "Too many open reload requests. Request ignored.\n" +#~ msgstr "Demasiadas solicitudes de recarga abiertas. Solicitud ignorada.\n" -#: src/dird/dird_conf.c:1086 -#, c-format -msgid " mailcmd=%s\n" -msgstr "mailcmd=%s\n" +#~ msgid "Out of reload table entries. Giving up.\n" +#~ msgstr "Fuera de entradas de las tablas recargadas. Abandonando.\n" -#: src/dird/dird_conf.c:1088 -#, c-format -msgid " opcmd=%s\n" -msgstr "opcmd=%s\n" +#~ msgid "Resetting previous configuration.\n" +#~ msgstr "Restablecimiento de la configuración anterior.\n" -#: src/dird/dird_conf.c:1092 src/qt-console/tray-monitor/tray_conf.cpp:189 -#, c-format -msgid "Unknown resource type %d in dump_resource.\n" -msgstr "Tipo de recurso desconocido %d en dump_resource.\n" +#~ msgid "Failed to initialize TLS context for Director \"%s\" in %s.\n" +#~ msgstr "Fallo al inicializar contexto TLS para Director \"%s\" en %s.\n" -#: src/dird/dird_conf.c:1437 src/qt-console/tray-monitor/tray_conf.cpp:247 -#, c-format -msgid "Unknown resource type %d in free_resource.\n" -msgstr "Tipo de recurso desconocido %d en free_resource.\n" +#~ msgid "Could not open Catalog \"%s\", database \"%s\".\n" +#~ msgstr "No se pudo abrir Catálogo \"%s\", base de datos \"%s\".\n" -#: src/dird/dird_conf.c:1472 src/lib/parse_conf.c:259 -#: src/qt-console/tray-monitor/tray_conf.cpp:280 -#, c-format -msgid "Too many items in %s resource\n" -msgstr "Demasiados ítem en recurso %s\n" +#~ msgid "%s" +#~ msgstr "%s" -#: src/dird/dird_conf.c:1512 -#, c-format -msgid "Cannot find Pool resource %s\n" -msgstr "No se puede encontrar el recurso Pool %s\n" +#, fuzzy +#~ msgid "Could not create storage record for %s\n" +#~ msgstr "No es posible crear el registro Pool. ERR=%s\n" -#: src/dird/dird_conf.c:1523 -#, c-format -msgid "Cannot find Console resource %s\n" -msgstr "No se puede encontrar el recurso Console %s\n" +#, fuzzy +#~ msgid "Could not update storage record for %s\n" +#~ msgstr "No se pudo actualizar el registro de trabajo. ERR=%s\n" -#: src/dird/dird_conf.c:1529 src/filed/filed_conf.c:467 -#: src/stored/stored_conf.c:628 -#, c-format -msgid "Cannot find Director resource %s\n" -msgstr "No se puede encontrar el recurso Director %s\n" +#~ msgid "" +#~ "Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined " +#~ "for Storage \"%s\" in %s.\n" +#~ msgstr "" +#~ "Ninguno \"TLS CA Certificate\" o \"TLS CA Certificate Dir\" esta definido " +#~ "para Storage \"%s\" en %s.\n" -#: src/dird/dird_conf.c:1538 src/stored/stored_conf.c:634 -#, c-format -msgid "Cannot find Storage resource %s\n" -msgstr "No se puede encontrar el recurso Storage %s\n" +#~ msgid "Failed to initialize TLS context for Storage \"%s\" in %s.\n" +#~ msgstr "Fallo al inicializar contexto TLS para Storage \"%s\" en %s.\n" -#: src/dird/dird_conf.c:1554 -#, c-format -msgid "Cannot find Job resource %s\n" -msgstr "No se puede encontrar el recurso Job %s\n" +#~ msgid "Could not compile regex pattern \"%s\" ERR=%s\n" +#~ msgstr "No se ha podido compilar patrón regex \"%s\" ERR=%s\n" -#: src/dird/dird_conf.c:1605 -#, c-format -msgid "Cannot find Counter resource %s\n" -msgstr "No se puede encontrar el recurso Counter %s\n" +#~ msgid "Director: name=%s MaxJobs=%d FDtimeout=%s SDtimeout=%s\n" +#~ msgstr "Director: nombre=%s MaxJobs=%d FDtimeout=%s SDtimeout=%s\n" -#: src/dird/dird_conf.c:1613 src/filed/filed_conf.c:474 -#, c-format -msgid "Cannot find Client resource %s\n" -msgstr "No se puede encontrar el recurso Cliente %s\n" +#~ msgid " query_file=%s\n" +#~ msgstr "query_file=%s\n" -#: src/dird/dird_conf.c:1626 -#, c-format -msgid "Cannot find Schedule resource %s\n" -msgstr "No se puede encontrar el recurso Schedule %s\n" +#~ msgid " --> " +#~ msgstr "--> " -#: src/dird/dird_conf.c:1631 src/dird/dird_conf.c:1697 -#: src/qt-console/tray-monitor/tray_conf.cpp:300 -#: src/qt-console/tray-monitor/tray_conf.cpp:338 -#, c-format -msgid "Unknown resource type %d in save_resource.\n" -msgstr "Tipo de recurso desconocido %d en save_resource.\n" +#~ msgid "Console: name=%s SSL=%d\n" +#~ msgstr "Console: nombre=%s SSL=%d\n" -#: src/dird/dird_conf.c:1714 -#, c-format -msgid "Expected one of: %s, got: %s" -msgstr "Esperaba uno de: %s, obtuvo: %s" +#~ msgid "Counter: name=%s min=%d max=%d cur=%d wrapcntr=%s\n" +#~ msgstr "Counter: nombre=%s mínimo=%d máximo=%d cur=%d wrapcntr=%s\n" -#: src/dird/dird_conf.c:1753 -#, fuzzy, c-format -msgid "Could not find Storage Resource %s referenced on line %d : %s\n" -msgstr "" -"No se pudo encontrar Recursos de configuración %s referenciado en la línea " -"%d: %s\n" +#~ msgid "Counter: name=%s min=%d max=%d\n" +#~ msgstr "Counter: nombre=%s mínimo=%d máximo=%d\n" -#: src/dird/dird_conf.c:1758 -#, fuzzy, c-format -msgid "" -"Attempt to redefine Storage resource \"%s\" referenced on line %d : %s\n" -msgstr "Intento de redefinir recurso \"%s\" referenciado en la línea %d: %s\n" +#, fuzzy +#~ msgid "Client: Name=%s Enabled=%d Address=%s FDport=%d MaxJobs=%u\n" +#~ msgstr "Cliente: nombre=%s dirección=%s FDport=%d MaxJobs=%u\n" -#: src/dird/dird_conf.c:1833 -#, c-format -msgid "Expected a Migration Job Type keyword, got: %s" -msgstr "Espera una palabra clave Tipo Job de Migración, obtuvo: %s" +#~ msgid " JobRetention=%s FileRetention=%s AutoPrune=%d\n" +#~ msgstr "JobRetention=%s FileRetention=%s AutoPrune=%d\n" -#: src/dird/dird_conf.c:1859 -#, c-format -msgid "Expected a Job Type keyword, got: %s" -msgstr "Esperaba una palabra clave Tipo Job, obtuvo: %s" +#~ msgid "" +#~ "Device: name=%s ok=%d num_writers=%d max_writers=%d\n" +#~ " reserved=%d open=%d append=%d read=%d labeled=%d offline=%d " +#~ "autochgr=%d\n" +#~ " poolid=%s volname=%s MediaType=%s\n" +#~ msgstr "" +#~ "Device: nombre=%s ok=%d num_writers=%d max_writers=%d\n" +#~ " reservado=%d abierto=%d append=%d leer=%d etiquetado=%d offline=%d " +#~ "autochgr=%d\n" +#~ " poolid=%s volname=%s MediaType=%s\n" -#: src/dird/dird_conf.c:1883 -#, c-format -msgid "Expected a Job Level keyword, got: %s" -msgstr "Esperaba una palabra clave Tipo Level, obtuvo: %s" +#, fuzzy +#~ msgid "" +#~ "%s: name=%s address=%s SDport=%d MaxJobs=%u\n" +#~ " DeviceName=%s MediaType=%s StorageId=%s Autochanger=%d\n" +#~ msgstr "" +#~ "Storage: nombre=%s dirección=%s SDport=%d MaxJobs=%u\n" +#~ " DeviceName=%s MediaType=%s StorageId=%s\n" -#: src/dird/dird_conf.c:1903 -#, c-format -msgid "Expected a Restore replacement option, got: %s" -msgstr "Esperaba una opción de reemplazo de Restauración, obtuvo: %s" +#, fuzzy +#~ msgid " Parent --> " +#~ msgstr "--> " -#: src/dird/dird_conf.c:1955 src/dird/dird_conf.c:2071 src/lib/ini.c:636 -#: src/lib/parse_conf.c:828 src/lib/parse_conf.c:844 -#, c-format -msgid "Expect %s, got: %s" -msgstr "Esperaba %s, obtuvo: %s" +#, fuzzy +#~ msgid " Shared --> " +#~ msgstr "--> " -#: src/dird/dird_conf.c:1977 src/lib/parse_conf.c:537 -#, c-format -msgid "Could not find config Resource %s referenced on line %d : %s\n" -msgstr "" -"No se pudo encontrar Recursos de configuración %s referenciado en la línea " -"%d: %s\n" +#~ msgid "" +#~ "Catalog: name=%s address=%s DBport=%d db_name=%s\n" +#~ " db_driver=%s db_user=%s MutliDBConn=%d\n" +#~ msgstr "" +#~ "Catálogo: nombre=%s dirección=%s DBport=%d db_nombre=%s\n" +#~ " db_driver=%s db_user=%s MutliDBConn=%d\n" -#: src/dird/dird_conf.c:2111 src/dird/inc_conf.c:701 -#, c-format -msgid "Expecting open brace. Got %s" -msgstr "Esperando abrir paréntesis. Obtuvo %s" +#~ msgid "%s: name=%s JobType=%d level=%s Priority=%d Enabled=%d\n" +#~ msgstr "%s: nombre=%s JobType=%d nivel=%s Prioridad=%d Activo=%d\n" -#: src/dird/dird_conf.c:2125 src/dird/inc_conf.c:370 src/dird/inc_conf.c:716 -#, c-format -msgid "Expecting keyword, got: %s\n" -msgstr "Esperando palabra clave, obtuvo: %s\n" +#~ msgid "Job" +#~ msgstr "Job" -#: src/dird/dird_conf.c:2131 src/dird/inc_conf.c:378 src/dird/inc_conf.c:722 -#: src/lib/parse_conf.c:1037 -#, c-format -msgid "expected an equals, got: %s" -msgstr "esperaba una igual, obtuvo: %s" +#~ msgid "JobDefs" +#~ msgstr "JobDefs" -#: src/dird/dird_conf.c:2142 src/dird/inc_conf.c:388 src/dird/inc_conf.c:731 -#, c-format -msgid "Keyword %s not permitted in this resource" -msgstr "Palabra clave %s no esta permitido en este recurso" +#~ msgid "" +#~ " MaxJobs=%u Resched=%d Times=%d Interval=%s Spool=%d " +#~ "WritePartAfterJob=%d\n" +#~ msgstr "" +#~ "MaxJobs=%u Resched=%d Times=%d Intervalo=%s Spool=%d WritePartAfterJob=" +#~ "%d\n" -#: src/dird/expand.c:244 -#, c-format -msgid "Count not update counter %s: ERR=%s\n" -msgstr "Conteo no actualizo contador %s: ERR=%s\n" +#~ msgid " SpoolSize=%s\n" +#~ msgstr "SpoolSize=%s\n" -#: src/dird/expand.c:416 -#, c-format -msgid "Cannot create var context: ERR=%s\n" -msgstr "No se puede crear contexto var: ERR=%s\n" +#~ msgid " Accurate=%d\n" +#~ msgstr "Preciso=%d\n" -#: src/dird/expand.c:421 -#, c-format -msgid "Cannot set var callback: ERR=%s\n" -msgstr "No se puede establecer llamada var: ERR=%s\n" +#~ msgid " SelectionType=%d\n" +#~ msgstr "SelectionType=%d\n" -#: src/dird/expand.c:427 -#, c-format -msgid "Cannot set var operate: ERR=%s\n" -msgstr "No se puede establecer variable operar: ERR=%s\n" +#~ msgid " --> Where=%s\n" +#~ msgstr "--> Donde=%s\n" -#: src/dird/expand.c:433 src/dird/expand.c:448 -#, c-format -msgid "Cannot unescape string: ERR=%s\n" -msgstr "No se puede unescapar cadena: ERR=%s\n" +#~ msgid " --> RegexWhere=%s\n" +#~ msgstr "--> RegexDonde=%s\n" -#: src/dird/expand.c:441 -#, c-format -msgid "Cannot expand expression \"%s\": ERR=%s\n" -msgstr "No se puede ampliar la expresión \"%s\": ERR=%s\n" +#~ msgid " --> Bootstrap=%s\n" +#~ msgstr "--> Bootstrap=%s\n" -#: src/dird/expand.c:459 -#, c-format -msgid "Cannot destroy var context: ERR=%s\n" -msgstr "No se puede destruir variable contexto: ERR=%s\n" +#~ msgid " --> WriteBootstrap=%s\n" +#~ msgstr "--> WriteBootstrap=%s\n" -#: src/dird/fd_cmds.c:81 -msgid "File daemon not defined for current Job\n" -msgstr "" +#~ msgid " --> PluginOptions=%s\n" +#~ msgstr "--> PluginOptions=%s\n" -#: src/dird/fd_cmds.c:98 -msgid "Client: " -msgstr "Cliente:" +#~ msgid " --> MaxRunTime=%u\n" +#~ msgstr "--> MaxRunTime=%u\n" -#: src/dird/fd_cmds.c:134 -#, c-format -msgid "File daemon \"%s\" rejected Job command: %s\n" -msgstr "Demonio File \"%s\" rechazó comando Job: %s\n" +#~ msgid " --> MaxWaitTime=%u\n" +#~ msgstr "--> MaxWaitTime=%u\n" -#: src/dird/fd_cmds.c:147 -#, c-format -msgid "Error updating Client record. ERR=%s\n" -msgstr "Error al actualizar el registro Cliente:ERR=%s\n" +#~ msgid " --> MaxStartDelay=%u\n" +#~ msgstr "--> MaxStartDelay=%u\n" -#: src/dird/fd_cmds.c:152 -#, c-format -msgid "FD gave bad response to JobId command: %s\n" -msgstr "FD dio mala respuesta al comando jobId: %s\n" +#, fuzzy +#~ msgid " --> MaxRunSchedTime=%u\n" +#~ msgstr "--> MaxRunTime=%u\n" -#: src/dird/fd_cmds.c:181 src/dird/fd_cmds.c:269 -msgid ", since=" -msgstr ", desde=" +#, fuzzy +#~ msgid " --> Base %s\n" +#~ msgstr "--> Objetivo=%s\n" -#: src/dird/fd_cmds.c:246 -msgid "No prior or suitable Full backup found in catalog. Doing FULL backup.\n" -msgstr "" -"Ninguna copia de seguridad Completa anterior encontrada en el catálogo. " -"Haciendo copia de seguridad COMPLETA.\n" +#~ msgid " --> RunScript\n" +#~ msgstr "--> EjecutarScript\n" -#: src/dird/fd_cmds.c:247 src/dird/fd_cmds.c:253 src/dird/fd_cmds.c:262 -#, c-format -msgid " (upgraded from %s)" -msgstr "(actualizar desde %s)" +#~ msgid " --> Command=%s\n" +#~ msgstr "--> Comando=%s\n" -#: src/dird/fd_cmds.c:252 -msgid "" -"No prior or suitable Differential backup found in catalog. Doing " -"Differential backup.\n" -msgstr "" -"Ninguna copia de seguridad Diferencial previa o adecuada encontrada en el " -"catálogo. Haciendo copia de seguridad Diferencial.\n" +#~ msgid " --> Target=%s\n" +#~ msgstr "--> Objetivo=%s\n" -#: src/dird/fd_cmds.c:260 -#, c-format -msgid "Prior failed job found in catalog. Upgrading to %s.\n" -msgstr "" -"Trabajo anterior fallido encontrado en el catálogo. Actualizando a %s.\n" +#~ msgid " --> RunOnSuccess=%u\n" +#~ msgstr "--> RunOnSuccess=%u\n" -#: src/dird/fd_cmds.c:338 -#, c-format -msgid "Unimplemented backup level %d %c\n" -msgstr "Nivel %d %c de respaldo no implementado\n" +#~ msgid " --> RunOnFailure=%u\n" +#~ msgstr "--> RunOnFailure=%u\n" -#: src/dird/fd_cmds.c:420 -msgid "" -"FD compression disabled for this Job because AllowCompress=No in Storage " -"resource.\n" -msgstr "" +#~ msgid " --> FailJobOnError=%u\n" +#~ msgstr "--> FailJobOnError=%u\n" -#: src/dird/fd_cmds.c:520 src/filed/job.c:1094 -#, c-format -msgid "Cannot run program: %s. ERR=%s\n" -msgstr "No se puede ejecutar el programa: %s. ERR=%s\n" +#~ msgid " --> RunWhen=%u\n" +#~ msgstr "--> EjecutarCuando=%u\n" -#: src/dird/fd_cmds.c:532 src/dird/fd_cmds.c:558 src/dird/fd_cmds.c:572 -msgid ">filed: write error on socket\n" -msgstr ">filed: error de escritura en socket\n" +#, fuzzy +#~ msgid " --> IncrementalBackup" +#~ msgstr "Incremental" -#: src/dird/fd_cmds.c:538 -#, c-format -msgid "Error running program: %s. ERR=%s\n" -msgstr "Error ejecutando el programa: %s. ERR=%s\n" +#, fuzzy +#~ msgid " --> DifferentialBackup" +#~ msgstr "Diferencial" -#: src/dird/fd_cmds.c:547 -#, c-format -msgid "Cannot open included file: %s. ERR=%s\n" -msgstr "No se puede abrir el archivo incluido: %s. ERR=%s\n" +#~ msgid " --> Run=%s\n" +#~ msgstr "--> Ejecutar=%s\n" -#: src/dird/fd_cmds.c:720 -#, c-format -msgid "Client \"%s\" RunScript failed.\n" -msgstr "Cliente \"%s\" RunScript fallido.\n" +#~ msgid " --> SelectionPattern=%s\n" +#~ msgstr "--> SeleccionPatron=%s\n" -#: src/dird/fd_cmds.c:743 -#, c-format -msgid "" -"Client \"%s\" may not be used to restore this job. Please upgrade your " -"client.\n" -msgstr "" +#~ msgid "FileSet: name=%s\n" +#~ msgstr "FileSet: nombre=%s\n" -#: src/dird/fd_cmds.c:824 #, fuzzy -msgid "RestoreObject failed.\n" -msgstr "Restaurar Archivos" +#~ msgid "Schedule: Name=%s Enabled=%d\n" +#~ msgstr "Schedule: nombre=%s\n" + +#~ msgid " --> Run Level=%s\n" +#~ msgstr "--> Ejecutar Nivel=%s\n" -#: src/dird/fd_cmds.c:861 #, fuzzy -msgid "ComponentInfo failed.\n" -msgstr "Comando fallido." +#~ msgid " MaxRunSchedTime=%u\n" +#~ msgstr "--> MaxRunTime=%u\n" -#: src/dird/fd_cmds.c:906 -#, c-format -msgid "" -" " +#~ msgstr "--> " -#: src/dird/inc_conf.c:342 -msgid "Old style Include/Exclude not supported\n" -msgstr "Antiguo estilo Incluir/Excluir no soportado\n" +#~ msgid "Schedule: name=%s\n" +#~ msgstr "Schedule: nombre=%s\n" -#: src/dird/inc_conf.c:441 -#, c-format -msgid "Regex compile error. ERR=%s\n" -msgstr "Error al compilar Regex. ERR=%s\n" +#~ msgid "Pool: name=%s PoolType=%s\n" +#~ msgstr "Pool: nombre=%s PoolType=%s\n" -#: src/dird/inc_conf.c:462 -#, c-format -msgid "Expected a regex string, got: %s\n" -msgstr "Se esperaba una expresión regular, se obtuvo: %s\n" +#~ msgid " use_cat=%d use_once=%d cat_files=%d\n" +#~ msgstr "use_cat=%d use_once=%d cat_files=%d\n" -#: src/dird/inc_conf.c:536 -#, c-format -msgid "Expected a wild-card string, got: %s\n" -msgstr "Esperada una cadena comodín, obtuvo: %s\n" +#~ msgid " max_vols=%d auto_prune=%d VolRetention=%s\n" +#~ msgstr "max_vols=%d auto_prune=%d VolRetention=%s\n" -#: src/dird/inc_conf.c:571 -msgid "ExcludeDirContaining directive not permitted in Exclude.\n" -msgstr "Directiva ExcludeDirContaining no permitida en Excluir(Exclude).\n" +#~ msgid " VolUse=%s recycle=%d LabelFormat=%s\n" +#~ msgstr "VolUse=%s recycle=%d LabelFormat=%s\n" -#: src/dird/inc_conf.c:621 src/dird/inc_conf.c:664 -#, c-format -msgid "Backslash found. Use forward slashes or quote the string.: %s\n" -msgstr "" -"Barra invertida encontrada. Utilice barras inclinadas o cite la cadena.: %s\n" +#~ msgid " CleaningPrefix=%s LabelType=%d\n" +#~ msgstr "CleaningPrefix=%s LabelType=%d\n" -#: src/dird/inc_conf.c:636 src/dird/inc_conf.c:679 -#, c-format -msgid "Expected a filename, got: %s" -msgstr "Se esperaba un nombre de archivo, se obtuvo: %s" +#~ msgid " RecyleOldest=%d PurgeOldest=%d ActionOnPurge=%d\n" +#~ msgstr "RecyleOldest=%d PurgeOldest=%d ActionOnPurge=%d\n" -#: src/dird/inc_conf.c:653 -msgid "Plugin directive not permitted in Exclude\n" -msgstr "Directiva Plugin no permitida en Exclude\n" +#~ msgid " MaxVolJobs=%d MaxVolFiles=%d MaxVolBytes=%s\n" +#~ msgstr "MaxVolJobs=%d MaxVolFiles=%d MaxVolBytes=%s\n" -#: src/dird/inc_conf.c:696 -msgid "Options section not permitted in Exclude\n" -msgstr "Sección Options no permitida en Exclude\n" +#~ msgid " MigTime=%s MigHiBytes=%s MigLoBytes=%s\n" +#~ msgstr "MigTime=%s MigHiBytes=%s MigLoBytes=%s\n" -#: src/dird/inc_conf.c:763 -#, c-format -msgid "Expected a FileSet keyword, got: %s" -msgstr "Esperaba una palabra clave FileSet, obtuvo: %s" +#, fuzzy +#~ msgid " JobRetention=%s FileRetention=%s\n" +#~ msgstr "JobRetention=%s FileRetention=%s AutoPrune=%d\n" -#: src/dird/job.c:51 -#, c-format -msgid "Could not init job queue: ERR=%s\n" -msgstr "No se pudo iniciar la cola de trabajos: ERR=%s\n" +#~ msgid " NextPool=%s\n" +#~ msgstr "NextPool=%s\n" -#: src/dird/job.c:83 src/dird/job.c:398 -#, c-format -msgid "Could not add job queue: ERR=%s\n" -msgstr "No se ha podido añadir la cola de trabajo: ERR=%s\n" +#~ msgid " RecyclePool=%s\n" +#~ msgstr "RecyclePool=%s\n" -#: src/dird/job.c:110 src/dird/job.c:282 src/dird/jobq.c:209 -#: src/filed/job.c:286 src/stored/dircmd.c:189 src/stored/stored.c:575 -#, c-format -msgid "Unable to init job cond variable: ERR=%s\n" -msgstr "No se puede iniciar job cond varibale: ERR=%s\n" +#~ msgid " ScratchPool=%s\n" +#~ msgstr "ScratchPool=%s\n" -#: src/dird/job.c:130 src/dird/job.c:301 src/dird/ua_output.c:879 -#: src/tools/cats_test.c:362 -#, c-format -msgid "Could not open database \"%s\".\n" -msgstr "No se puede abrir la base de datos \"%s\".\n" - -#: src/dird/job.c:157 src/dird/job.c:161 src/dird/job.c:167 src/dird/job.c:316 -#: src/dird/job.c:320 src/dird/ua_cmds.c:923 src/dird/ua_cmds.c:1705 -#: src/dird/ua_dotcmds.c:1083 src/dird/ua_status.c:408 -msgid "unknown source" -msgstr "fuente desconocida" - -#: src/dird/job.c:197 src/dird/job.c:574 src/dird/job.c:576 src/dird/job.c:794 -#: src/dird/job.c:796 src/dird/job.c:1500 src/dird/job.c:1542 -#: src/dird/job.c:1553 -msgid "Job resource" -msgstr "Recurso Job" - -#: src/dird/job.c:244 src/dird/job.c:376 src/dird/job.c:512 -#, c-format -msgid "Unimplemented job type: %d\n" -msgstr "Tipo de Job no implementado: %d\n" +#~ msgid " Catalog=%s\n" +#~ msgstr "Catálogo=%s\n" -#: src/dird/job.c:436 -msgid "Job canceled because max start delay time exceeded.\n" -msgstr "Job cancelado porque el tiempo máximo de espera ha excedido.\n" +#~ msgid "Messages: name=%s\n" +#~ msgstr "Mensajes: nombre=%s\n" -#: src/dird/job.c:441 -#, fuzzy -msgid "Job canceled because max run sched time exceeded.\n" -msgstr "" -"Job cancelado porque el tiempo de ejecución máximo programado se ha " -"superado.\n" +#~ msgid " mailcmd=%s\n" +#~ msgstr "mailcmd=%s\n" -#: src/dird/job.c:554 -msgid "Failed to connect to File daemon.\n" -msgstr "Error al conectar con demonio File.\n" +#~ msgid " opcmd=%s\n" +#~ msgstr "opcmd=%s\n" -#: src/dird/job.c:589 -#, fuzzy -msgid "Failed to select Storage daemon.\n" -msgstr "Error al conectar con demonio Storage.\n" +#~ msgid "Cannot find Pool resource %s\n" +#~ msgstr "No se puede encontrar el recurso Pool %s\n" -#: src/dird/job.c:594 src/dird/msgchan.c:70 src/dird/ua_cmds.c:929 -#: src/dird/ua_cmds.c:1730 src/dird/ua_dotcmds.c:1089 -msgid "Failed to connect to Storage daemon.\n" -msgstr "Error al conectar con demonio Storage.\n" +#~ msgid "Cannot find Console resource %s\n" +#~ msgstr "No se puede encontrar el recurso Console %s\n" -#: src/dird/job.c:646 -#, fuzzy, c-format -msgid "Client resource \"%s\" does not exist.\n" -msgstr "Error: Recurso Cliente %s no existe.\n" +#~ msgid "Cannot find Director resource %s\n" +#~ msgstr "No se puede encontrar el recurso Director %s\n" -#: src/dird/job.c:697 -#, fuzzy -msgid "canceled" -msgstr "Cancelado" +#~ msgid "Cannot find Storage resource %s\n" +#~ msgstr "No se puede encontrar el recurso Storage %s\n" -#: src/dird/job.c:701 -msgid "stopped" -msgstr "" +#~ msgid "Cannot find Job resource %s\n" +#~ msgstr "No se puede encontrar el recurso Job %s\n" -#: src/dird/job.c:717 -#, fuzzy, c-format -msgid "JobId %s, Job %s marked to be %s.\n" -msgstr "JobId %s, Job %s marcado para ser cancelado.\n" +#~ msgid "Cannot find Counter resource %s\n" +#~ msgstr "No se puede encontrar el recurso Counter %s\n" + +#~ msgid "Cannot find Client resource %s\n" +#~ msgstr "No se puede encontrar el recurso Cliente %s\n" -#: src/dird/job.c:856 -msgid "Max wait time exceeded. Job canceled.\n" -msgstr "Máximo tiempo de espera excedido. Job cancelado.\n" +#~ msgid "Cannot find Schedule resource %s\n" +#~ msgstr "No se puede encontrar el recurso Schedule %s\n" -#: src/dird/job.c:861 -msgid "Max run time exceeded. Job canceled.\n" -msgstr "Máximo tiempo de ejecución excedido. Job cancelado.\n" +#~ msgid "Expected one of: %s, got: %s" +#~ msgstr "Esperaba uno de: %s, obtuvo: %s" -#: src/dird/job.c:866 #, fuzzy -msgid "Max run sched time exceeded. Job canceled.\n" -msgstr "Máximo tiempo de ejecución excedido. Job cancelado.\n" +#~ msgid "Could not find Storage Resource %s referenced on line %d : %s\n" +#~ msgstr "" +#~ "No se pudo encontrar Recursos de configuración %s referenciado en la " +#~ "línea %d: %s\n" -#: src/dird/job.c:988 -#, fuzzy, c-format -msgid "Cannot create pool \"%s\" in database. ERR=%s" -msgstr "Poll \"%s\" no en base de datos. ERR=%s" +#, fuzzy +#~ msgid "" +#~ "Attempt to redefine Storage resource \"%s\" referenced on line %d : %s\n" +#~ msgstr "" +#~ "Intento de redefinir recurso \"%s\" referenciado en la línea %d: %s\n" -#: src/dird/job.c:992 -#, c-format -msgid "Created database record for Pool \"%s\".\n" -msgstr "Creado registro base de datos para Pool \"%s\".\n" +#~ msgid "Expected a Migration Job Type keyword, got: %s" +#~ msgstr "Espera una palabra clave Tipo Job de Migración, obtuvo: %s" -#: src/dird/job.c:1066 src/dird/job.c:1102 -#, c-format -msgid "JobId %d already running. Duplicate job not allowed.\n" -msgstr "JobId %d ya esta en ejecución. No se permite job duplicados.\n" +#~ msgid "Expected a Job Type keyword, got: %s" +#~ msgstr "Esperaba una palabra clave Tipo Job, obtuvo: %s" -#: src/dird/job.c:1092 -#, c-format -msgid "Cancelling duplicate JobId=%d.\n" -msgstr "Cancelando duplicado JobId=%d.\n" +#~ msgid "Expected a Job Level keyword, got: %s" +#~ msgstr "Esperaba una palabra clave Tipo Level, obtuvo: %s" -#: src/dird/job.c:1128 src/dird/job.c:1129 src/dird/job.c:1130 -#, fuzzy -msgid "Run NextPool override" -msgstr "Anular Ejecutar Pool" +#~ msgid "Expected a Restore replacement option, got: %s" +#~ msgstr "Esperaba una opción de reemplazo de Restauración, obtuvo: %s" -#: src/dird/job.c:1134 src/dird/job.c:1135 src/dird/job.c:1136 -#: src/dird/job.c:1557 -#, fuzzy -msgid "Job's NextPool resource" -msgstr "Recurso Job Pool's NextPool " +#~ msgid "Expect %s, got: %s" +#~ msgstr "Esperaba %s, obtuvo: %s" -#: src/dird/job.c:1144 src/dird/job.c:1145 src/dird/job.c:1561 -msgid "Job Pool's NextPool resource" -msgstr "Recurso Job Pool's NextPool " +#~ msgid "Could not find config Resource %s referenced on line %d : %s\n" +#~ msgstr "" +#~ "No se pudo encontrar Recursos de configuración %s referenciado en la " +#~ "línea %d: %s\n" -#: src/dird/job.c:1146 -#, fuzzy -msgid "Pool's NextPool resource" -msgstr "Recurso Job Pool's NextPool " +#~ msgid "Expecting open brace. Got %s" +#~ msgstr "Esperando abrir paréntesis. Obtuvo %s" -#: src/dird/job.c:1177 -#, fuzzy -msgid "Run Pool override" -msgstr "Anular Ejecutar Pool" +#~ msgid "Expecting keyword, got: %s\n" +#~ msgstr "Esperando palabra clave, obtuvo: %s\n" -#: src/dird/job.c:1188 -msgid "Run FullPool override" -msgstr "Anular Ejecutar FullPool " +#~ msgid "expected an equals, got: %s" +#~ msgstr "esperaba una igual, obtuvo: %s" -#: src/dird/job.c:1190 -msgid "Job FullPool override" -msgstr "Anular Job FullPool" +#~ msgid "Keyword %s not permitted in this resource" +#~ msgstr "Palabra clave %s no esta permitido en este recurso" -#: src/dird/job.c:1199 -msgid "Run IncPool override" -msgstr "Anular Ejecutar IncPoll" +#~ msgid "Count not update counter %s: ERR=%s\n" +#~ msgstr "Conteo no actualizo contador %s: ERR=%s\n" -#: src/dird/job.c:1201 -msgid "Job IncPool override" -msgstr "Anular Job IncPoll" +#~ msgid "Cannot create var context: ERR=%s\n" +#~ msgstr "No se puede crear contexto var: ERR=%s\n" -#: src/dird/job.c:1210 -msgid "Run DiffPool override" -msgstr "Anular Ejecutar DiffPool" +#~ msgid "Cannot set var callback: ERR=%s\n" +#~ msgstr "No se puede establecer llamada var: ERR=%s\n" -#: src/dird/job.c:1212 -msgid "Job DiffPool override" -msgstr "Anular Job DiffPool" +#~ msgid "Cannot set var operate: ERR=%s\n" +#~ msgstr "No se puede establecer variable operar: ERR=%s\n" -#: src/dird/job.c:1233 -#, fuzzy -msgid "No Client specified.\n" -msgstr "Cliente especificado dos veces.\n" +#~ msgid "Cannot unescape string: ERR=%s\n" +#~ msgstr "No se puede unescapar cadena: ERR=%s\n" -#: src/dird/job.c:1246 src/stored/bscan.c:1041 -#, c-format -msgid "Could not create Client record. ERR=%s\n" -msgstr "No es posible crear el registro de clientes. ERR=%s\n" +#~ msgid "Cannot expand expression \"%s\": ERR=%s\n" +#~ msgstr "No se puede ampliar la expresión \"%s\": ERR=%s\n" -#: src/dird/job.c:1283 -msgid "FileSet MD5 digest not found.\n" -msgstr "FileSet MD5 digest no encontrado.\n" +#~ msgid "Cannot destroy var context: ERR=%s\n" +#~ msgstr "No se puede destruir variable contexto: ERR=%s\n" -#: src/dird/job.c:1288 -#, c-format -msgid "Could not create FileSet \"%s\" record. ERR=%s\n" -msgstr "No es posible crear el registro FileSet \"%s\". ERR=%s\n" +#~ msgid "Client: " +#~ msgstr "Cliente:" -#: src/dird/job.c:1330 -#, c-format -msgid "Error updating job record. %s" -msgstr "Error actualizando registro job. %s" +#~ msgid "File daemon \"%s\" rejected Job command: %s\n" +#~ msgstr "Demonio File \"%s\" rechazó comando Job: %s\n" -#: src/dird/job.c:1487 -msgid "Run pool override" -msgstr "Anular Ejecutar Pool" +#~ msgid "Error updating Client record. ERR=%s\n" +#~ msgstr "Error al actualizar el registro Cliente:ERR=%s\n" -#: src/dird/job.c:1492 -msgid "Run storage override" -msgstr "Anular Ejecutar Storage" +#~ msgid "FD gave bad response to JobId command: %s\n" +#~ msgstr "FD dio mala respuesta al comando jobId: %s\n" -#: src/dird/job.c:1571 -msgid "Client resource" -msgstr "Recurso de cliente" +#~ msgid ", since=" +#~ msgstr ", desde=" -#: src/dird/job.c:1627 src/dird/ua_run.c:429 -msgid "No storage specified.\n" -msgstr "Almacenamiento no especificado.\n" +#~ msgid "" +#~ "No prior or suitable Full backup found in catalog. Doing FULL backup.\n" +#~ msgstr "" +#~ "Ninguna copia de seguridad Completa anterior encontrada en el catálogo. " +#~ "Haciendo copia de seguridad COMPLETA.\n" -#: src/dird/job.c:1788 -#, c-format -msgid "Could not start clone job: \"%s\".\n" -msgstr "No se pudo iniciar el job de clonación: \"%s\".\n" +#~ msgid " (upgraded from %s)" +#~ msgstr "(actualizar desde %s)" -#: src/dird/job.c:1791 -#, c-format -msgid "Clone JobId %d started.\n" -msgstr "Clonar JobId %d iniciado.\n" +#~ msgid "" +#~ "No prior or suitable Differential backup found in catalog. Doing " +#~ "Differential backup.\n" +#~ msgstr "" +#~ "Ninguna copia de seguridad Diferencial previa o adecuada encontrada en el " +#~ "catálogo. Haciendo copia de seguridad Diferencial.\n" -#: src/dird/jobq.c:63 -#, c-format -msgid "pthread_attr_init: ERR=%s\n" -msgstr "pthread_attr_init: ERR=%s\n" +#~ msgid "Prior failed job found in catalog. Upgrading to %s.\n" +#~ msgstr "" +#~ "Trabajo anterior fallido encontrado en el catálogo. Actualizando a %s.\n" -#: src/dird/jobq.c:72 -#, c-format -msgid "pthread_mutex_init: ERR=%s\n" -msgstr "pthread_mutex_init: ERR=%s\n" +#~ msgid "Unimplemented backup level %d %c\n" +#~ msgstr "Nivel %d %c de respaldo no implementado\n" -#: src/dird/jobq.c:78 -#, c-format -msgid "pthread_cond_init: ERR=%s\n" -msgstr "pthread_cond_init: ERR=%s\n" +#~ msgid "Cannot run program: %s. ERR=%s\n" +#~ msgstr "No se puede ejecutar el programa: %s. ERR=%s\n" -#: src/dird/jobq.c:120 -#, c-format -msgid "pthread_cond_broadcast: ERR=%s\n" -msgstr "pthread_cond_broadcast: ERR=%s\n" +#~ msgid ">filed: write error on socket\n" +#~ msgstr ">filed: error de escritura en socket\n" -#: src/dird/jobq.c:128 -#, c-format -msgid "pthread_cond_wait: ERR=%s\n" -msgstr "pthread_cond_wait: ERR=%s\n" +#~ msgid "Error running program: %s. ERR=%s\n" +#~ msgstr "Error ejecutando el programa: %s. ERR=%s\n" -#: src/dird/jobq.c:169 -#, c-format -msgid "Job %s waiting %d seconds for scheduled start time.\n" -msgstr "Job %s esperando %d segundos para la hora de inicio programada.\n" +#~ msgid "Cannot open included file: %s. ERR=%s\n" +#~ msgstr "No se puede abrir el archivo incluido: %s. ERR=%s\n" -#: src/dird/jobq.c:231 -#, c-format -msgid "pthread_thread_create: ERR=%s\n" -msgstr "pthread_thread_create: ERR=%s\n" +#~ msgid "Client \"%s\" RunScript failed.\n" +#~ msgstr "Cliente \"%s\" RunScript fallido.\n" -#: src/dird/jobq.c:341 -#, c-format -msgid "pthread_cond_signal: ERR=%s\n" -msgstr "pthread_cond_signal: ERR=%s\n" +#, fuzzy +#~ msgid "RestoreObject failed.\n" +#~ msgstr "Restaurar Archivos" -#: src/dird/jobq.c:352 -#, c-format -msgid "pthread_create: ERR=%s\n" -msgstr "pthread_create: ERR=%s\n" +#, fuzzy +#~ msgid "ComponentInfo failed.\n" +#~ msgstr "Comando fallido." -#: src/dird/jobq.c:640 -#, c-format -msgid "Rescheduled Job %s at %s to re-run in %d seconds (%s).\n" -msgstr "Job %s en %s reprogramado para volver a ejecutar en %d segundos(%s).\n" +#~ msgid "" +#~ "fixed name. Max=%d: " -msgstr "" -"Introduzca el número de volúmenes para crear. 0=>nombre fijo. Máximo=%d:" +#~ msgid "Add media to a pool" +#~ msgstr "Añadir medios a un pool" -#: src/dird/ua_cmds.c:341 -#, c-format -msgid "The number must be between 0 and %d\n" -msgstr "El número debe estar comprendido entre 0 y %d\n" +#~ msgid "Autodisplay console messages" +#~ msgstr "Autodisplay mensajes de la consola" -#: src/dird/ua_cmds.c:349 -msgid "Enter Volume name: " -msgstr "Introduzca nombre de Volumen:" +#~ msgid "Automount after label" +#~ msgstr "Auto-montar después de etiquetar" -#: src/dird/ua_cmds.c:353 -msgid "Enter base volume name: " -msgstr "Introduzca nombre de Volumen base:" +#~ msgid "Cancel a job" +#~ msgstr "Cancelar un Job" -#: src/dird/ua_cmds.c:362 src/dird/ua_label.c:652 -msgid "Volume name too long.\n" -msgstr "Nombre de Volumen demasiado largo.\n" +#~ msgid "Create DB Pool from resource" +#~ msgstr "Crear Pool BD desde recurso" -#: src/dird/ua_cmds.c:366 src/dird/ua_label.c:658 src/lib/edit.c:514 -msgid "Volume name must be at least one character long.\n" -msgstr "Nombre de volumen debe ser de al menos un carácter de largo.\n" +#~ msgid "Delete volume, pool or job" +#~ msgstr "Eliminar volumen, pool o job" -#: src/dird/ua_cmds.c:377 -msgid "Enter the starting number: " -msgstr "Introduzca el número inicial:" +#~ msgid "Performs FileSet estimate, listing gives full listing" +#~ msgstr "Realiza estimación FileSet, listando lista completa" -#: src/dird/ua_cmds.c:382 -msgid "Start number must be greater than zero.\n" -msgstr "Número de inicio debe ser mayor que cero.\n" +#~ msgid "Terminate Bconsole session" +#~ msgstr "Terminar la sesión bconsole" -#: src/dird/ua_cmds.c:393 -msgid "Enter slot (0 for none): " -msgstr "Introduzca ranura (0 para ninguno):" +#~ msgid "Non-interactive gui mode" +#~ msgstr "Modo gui no-interactivo" -#: src/dird/ua_cmds.c:397 -msgid "InChanger? yes/no: " -msgstr "InChanger? si/no: " +#~ msgid "Print help on specific command" +#~ msgstr "Imprimir ayuda en comandos específicos" -#: src/dird/ua_cmds.c:425 -#, c-format -msgid "%d Volumes created in pool %s\n" -msgstr "%d Volúmenes creados en el pool %s\n" +#~ msgid "Label a tape" +#~ msgstr "Etiquetar una cinta" -#: src/dird/ua_cmds.c:441 src/dird/ua_cmds.c:1241 -msgid "Turn on or off? " -msgstr "Encender o apagar?" +#~ msgid "List objects from catalog" +#~ msgstr "Listar objetos del catálogo" -#: src/dird/ua_cmds.c:569 -#, c-format -msgid "" -"Can't set %s RecyclePool to %s, %s is not in database.\n" -"Try to update it with 'update pool=%s'\n" -msgstr "" -"No se puede establecer %s RecyclePool para %s, %s no está¡ en la base de " -"datos.\n" -"Intente actualizarlo con 'update pool=%s'\n" +#~ msgid "Full or long list like list command" +#~ msgstr "Completo o lista larga como la lista de comando" -#: src/dird/ua_cmds.c:587 -#, c-format -msgid "" -"Can't set %s ScratchPool to %s, %s is not in database.\n" -"Try to update it with 'update pool=%s'\n" -msgstr "" -"No se puede establecer %s ScratchPool para %s, %s no está en la base de " -"datos.\n" -"Intente actualizarlo con 'update pool=%s'\n" +#~ msgid "Display pending messages" +#~ msgstr "Mostrar mensajes pendientes" -#: src/dird/ua_cmds.c:654 -#, c-format -msgid "" -"Error: Pool %s already exists.\n" -"Use update to change it.\n" -msgstr "" -"Error: Pool %s ya existe.\n" -"Use update para cambiarlo.\n" +#~ msgid "Print current memory usage" +#~ msgstr "Imprimir uso de la memoria actual" -#: src/dird/ua_cmds.c:665 -#, c-format -msgid "Pool %s created.\n" -msgstr "Pool %s creado.\n" +#~ msgid "Mount storage" +#~ msgstr "Montar Storage" -#: src/dird/ua_cmds.c:696 -#, fuzzy -msgid "Failed to set bandwidth limit to Client.\n" -msgstr "Fallo al conectar con el cliente.\n" +#~ msgid "Prune expired records from catalog" +#~ msgstr "Prunar registros expirados del catálogo" -#: src/dird/ua_cmds.c:700 -#, c-format -msgid "2000 OK Limiting bandwidth to %lldkb/s %s\n" -msgstr "" +#~ msgid "Purge records from catalog" +#~ msgstr "Purgar registros del catálogo" -#: src/dird/ua_cmds.c:701 -msgid "on running and future jobs" -msgstr "" +#~ msgid "Query catalog" +#~ msgstr "Consulta de catálogo " -#: src/dird/ua_cmds.c:725 -msgid "Set Bandwidth choice:\n" -msgstr "" +#~ msgid "Restore files" +#~ msgstr "Restaurar Archivos" + +#~ msgid "Relabel a tape" +#~ msgstr "Reetiquetar una cinta" + +#~ msgid "Release storage" +#~ msgstr "Liberar Storage" + +#~ msgid "Reload conf file" +#~ msgstr "Recargar archivo de configuración" + +#~ msgid "Run a job" +#~ msgstr "Ejecutar un Job" -#: src/dird/ua_cmds.c:726 #, fuzzy -msgid "Running Job" -msgstr "" -"\n" -"Jobs Ejecutando:\n" +#~ msgid "Restart a job" +#~ msgstr "Ejecutando Job de restauración" -#: src/dird/ua_cmds.c:727 -msgid "Running and future Jobs for a Client" -msgstr "" +#, fuzzy +#~ msgid "Resume a job" +#~ msgstr "Ejecutar un Job" -#: src/dird/ua_cmds.c:728 -msgid "Choose where to limit the bandwidth" -msgstr "" +#~ msgid "Report status" +#~ msgstr "Informe de estado" -#: src/dird/ua_cmds.c:740 #, fuzzy -msgid "Enter new bandwidth limit kb/s: " -msgstr "Introduzca nuevo Máximo de Trabajos" +#~ msgid "Stop a job" +#~ msgstr "Ningún ultimo trabajo." -#: src/dird/ua_cmds.c:777 src/dird/ua_cmds.c:840 src/dird/ua_cmds.c:862 -#: src/dird/ua_cmds.c:884 -msgid "Unauthorized command from this console.\n" -msgstr "Comando no autorizado desde esta consola.\n" +#~ msgid "Sets debug level" +#~ msgstr "Establecer el nivel de depuración" -#: src/dird/ua_cmds.c:784 src/dird/ua_cmds.c:1292 src/dird/ua_dotcmds.c:201 -#: src/dird/ua_run.c:343 -#, c-format -msgid "Client \"%s\" not found.\n" -msgstr "Cliente \"%s\" no encontrado.\n" +#~ msgid "Sets new client address -- if authorized" +#~ msgstr "Establecer nueva dirección del cliente - si esta autorizado" -#: src/dird/ua_cmds.c:794 -#, c-format -msgid "Client \"%s\" address set to %s\n" -msgstr "Cliente \"%s\" dirección configurada para %s\n" +#~ msgid "Show resource records" +#~ msgstr "Mostrar los registros de recursos" -#: src/dird/ua_cmds.c:813 -#, c-format -msgid "Job Attributes Insertion %sabled\n" -msgstr "" +#~ msgid "Use SQL to query catalog" +#~ msgstr "usar SQL para consultar el catálogo" -#: src/dird/ua_cmds.c:844 -#, c-format -msgid "Job \"%s\" %sabled\n" -msgstr "Job \"%s\" %sabled\n" +#~ msgid "Print current time" +#~ msgstr "Imprimir hora actual" -#: src/dird/ua_cmds.c:866 -#, fuzzy, c-format -msgid "Client \"%s\" %sabled\n" -msgstr "Job \"%s\" %sabled\n" +#~ msgid "Turn on/off trace to file" +#~ msgstr "Activar/desactivar archivo de traza" -#: src/dird/ua_cmds.c:888 -#, fuzzy, c-format -msgid "Schedule \"%s\" %sabled\n" -msgstr "Job \"%s\" %sabled\n" +#, fuzzy +#~ msgid "Truncate one or more Volumes" +#~ msgstr "Creado Registro Media para Volumen: %s\n" -#: src/dird/ua_cmds.c:897 -msgid "" -"You must enter one of the following keywords: job, client, schedule, or " -"storage.\n" -msgstr "" +#~ msgid "Unmount storage" +#~ msgstr "Desmonte almacenamiento" -#: src/dird/ua_cmds.c:926 src/dird/ua_dotcmds.c:1086 src/dird/ua_status.c:411 -#, c-format -msgid "Connecting to Storage daemon %s at %s:%d\n" -msgstr "Conectando al demonio Storage %s en %s:%d\n" +#~ msgid "Umount - for old-time Unix guys, see unmount" +#~ msgstr "Umount - para los viejos tiempos tipos de Unix, véase unmount" -#: src/dird/ua_cmds.c:932 src/dird/ua_dotcmds.c:1092 -msgid "Connected to storage daemon\n" -msgstr "Conectado al demonio Storage\n" +#~ msgid "Update volume, pool or stats" +#~ msgstr "Actualizar volumen, pool o stats" -#: src/dird/ua_cmds.c:1103 -msgid "Enter new debug level: " -msgstr "Introduzca el nuevo nivel de depuración:" +#~ msgid "Use catalog xxx" +#~ msgstr "Usar catálogo xxx" -#: src/dird/ua_cmds.c:1116 -#, fuzzy, c-format -msgid "Incorrect tags found on command line %s\n" -msgstr "No se puede usar comando %s en un runscript" +#~ msgid "Does variable expansion" +#~ msgstr "es la variable de expansión" -#: src/dird/ua_cmds.c:1199 src/dird/ua_dotcmds.c:1194 -msgid "Available daemons are: \n" -msgstr "Demonios disponible son: \n" +#~ msgid "Print Director version" +#~ msgstr "Imprimir la versión del Director" -#: src/dird/ua_cmds.c:1200 src/dird/ua_dotcmds.c:1195 -msgid "Director" -msgstr "Director" +#~ msgid "Wait until no jobs are running" +#~ msgstr "Esperar hasta que no se estén ejecutando jobs" -#: src/dird/ua_cmds.c:1201 src/dird/ua_dotcmds.c:1196 src/dird/ua_run.c:1012 -#: src/dird/ua_select.c:189 -msgid "Storage" -msgstr "Storage" +#~ msgid "Can't use %s command in a runscript" +#~ msgstr "No se puede usar comando %s en un runscript" -#: src/dird/ua_cmds.c:1202 src/dird/ua_dotcmds.c:1197 src/dird/ua_run.c:1018 -#: src/dird/ua_select.c:383 src/dird/ua_select.c:407 src/dird/ua_select.c:544 -msgid "Client" -msgstr "Client" +#~ msgid "%s: is an invalid command.\n" +#~ msgstr "%s: es un comando invalido.\n" -#: src/dird/ua_cmds.c:1203 -msgid "All" -msgstr "All" +#~ msgid "" +#~ "You probably don't want to be using this command since it\n" +#~ "creates database records without labeling the Volumes.\n" +#~ "You probably want to use the \"label\" command.\n" +#~ "\n" +#~ msgstr "" +#~ "Usted probablemente no quiere usar este comando, ya que el\n" +#~ "crea registros en la base de datos sin etiquetar los volúmenes.\n" +#~ "Usted probablemente desea utilizar el comando \"label\".\n" +#~ "\n" -#: src/dird/ua_cmds.c:1204 -msgid "Select daemon type to set debug level" -msgstr "Seleccione el tipo de Demonio para establecer el nivel de depuración" +#~ msgid "Pool already has maximum volumes=%d\n" +#~ msgstr "Pool ya tiene volúmenes máximo=%d\n" -#: src/dird/ua_cmds.c:1296 src/dird/ua_cmds.c:2119 src/dird/ua_dotcmds.c:205 -#: src/dird/ua_status.c:462 -#, c-format -msgid "No authorization for Client \"%s\"\n" -msgstr "No autorización para Cliente \"%s\"\n" +#~ msgid "Enter new maximum (zero for unlimited): " +#~ msgstr "Introduzca nuevo máximo (cero para un número ilimitado):" -#: src/dird/ua_cmds.c:1301 src/dird/ua_dotcmds.c:210 -msgid "Client name missing.\n" -msgstr "Falta el nombre del cliente.\n" +#~ msgid "Enter number of Volumes to create. 0=>fixed name. Max=%d: " +#~ msgstr "" +#~ "Introduzca el número de volúmenes para crear. 0=>nombre fijo. Máximo=%d:" -#: src/dird/ua_cmds.c:1309 src/dird/ua_select.c:1471 src/dird/ua_select.c:1478 -#, c-format -msgid "Job \"%s\" not found.\n" -msgstr "Job \"%s\" no encontrado.\n" +#~ msgid "The number must be between 0 and %d\n" +#~ msgstr "El número debe estar comprendido entre 0 y %d\n" -#: src/dird/ua_cmds.c:1313 src/dird/ua_cmds.c:1380 src/dird/ua_cmds.c:2141 -#, c-format -msgid "No authorization for Job \"%s\"\n" -msgstr "No autorización para Job \"%s\"\n" +#~ msgid "Enter Volume name: " +#~ msgstr "Introduzca nombre de Volumen:" -#: src/dird/ua_cmds.c:1318 -msgid "Job name missing.\n" -msgstr "Falta el nombre del Job.\n" +#~ msgid "Enter base volume name: " +#~ msgstr "Introduzca nombre de Volumen base:" -#: src/dird/ua_cmds.c:1327 -#, c-format -msgid "Fileset \"%s\" not found.\n" -msgstr "FileSet \"%s\" no encontrado.\n" +#~ msgid "Volume name too long.\n" +#~ msgstr "Nombre de Volumen demasiado largo.\n" -#: src/dird/ua_cmds.c:1331 -#, c-format -msgid "No authorization for FileSet \"%s\"\n" -msgstr "No autorización para FileSet \"%s\"\n" +#~ msgid "Volume name must be at least one character long.\n" +#~ msgstr "Nombre de volumen debe ser de al menos un carácter de largo.\n" -#: src/dird/ua_cmds.c:1336 -msgid "Fileset name missing.\n" -msgstr "Falta Nombre del Fileset.\n" +#~ msgid "Enter the starting number: " +#~ msgstr "Introduzca el número inicial:" -#: src/dird/ua_cmds.c:1347 src/dird/ua_run.c:1402 -#, c-format -msgid "Level \"%s\" not valid.\n" -msgstr "Nivel \"%s\" no es válido.\n" +#~ msgid "Start number must be greater than zero.\n" +#~ msgstr "Número de inicio debe ser mayor que cero.\n" + +#~ msgid "Enter slot (0 for none): " +#~ msgstr "Introduzca ranura (0 para ninguno):" + +#~ msgid "InChanger? yes/no: " +#~ msgstr "InChanger? si/no: " + +#~ msgid "%d Volumes created in pool %s\n" +#~ msgstr "%d Volúmenes creados en el pool %s\n" + +#~ msgid "Turn on or off? " +#~ msgstr "Encender o apagar?" + +#~ msgid "" +#~ "Can't set %s RecyclePool to %s, %s is not in database.\n" +#~ "Try to update it with 'update pool=%s'\n" +#~ msgstr "" +#~ "No se puede establecer %s RecyclePool para %s, %s no está¡ en la base de " +#~ "datos.\n" +#~ "Intente actualizarlo con 'update pool=%s'\n" + +#~ msgid "" +#~ "Can't set %s ScratchPool to %s, %s is not in database.\n" +#~ "Try to update it with 'update pool=%s'\n" +#~ msgstr "" +#~ "No se puede establecer %s ScratchPool para %s, %s no está en la base de " +#~ "datos.\n" +#~ "Intente actualizarlo con 'update pool=%s'\n" -#: src/dird/ua_cmds.c:1351 -msgid "Level value missing.\n" -msgstr "Valor del nivel ausente.\n" +#~ msgid "" +#~ "Error: Pool %s already exists.\n" +#~ "Use update to change it.\n" +#~ msgstr "" +#~ "Error: Pool %s ya existe.\n" +#~ "Use update para cambiarlo.\n" -#: src/dird/ua_cmds.c:1358 -msgid "Invalid value for accurate. It must be yes or no.\n" -msgstr "Valor no válido para exacto. Debe ser sí o no.\n" +#~ msgid "Pool %s created.\n" +#~ msgstr "Pool %s creado.\n" -#: src/dird/ua_cmds.c:1363 #, fuzzy -msgid "Accurate value missing.\n" -msgstr "Valor del nivel ausente.\n" +#~ msgid "Failed to set bandwidth limit to Client.\n" +#~ msgstr "Fallo al conectar con el cliente.\n" -#: src/dird/ua_cmds.c:1376 -msgid "No job specified.\n" -msgstr "Job no especificado.\n" +#, fuzzy +#~ msgid "Running Job" +#~ msgstr "" +#~ "\n" +#~ "Jobs Ejecutando:\n" -#: src/dird/ua_cmds.c:1436 -msgid "Error sending include list.\n" -msgstr "Error al enviar lista incluir.\n" +#, fuzzy +#~ msgid "Enter new bandwidth limit kb/s: " +#~ msgstr "Introduzca nuevo Máximo de Trabajos" -#: src/dird/ua_cmds.c:1441 -msgid "Error sending exclude list.\n" -msgstr "Error al enviar lista excluir.\n" +#~ msgid "Unauthorized command from this console.\n" +#~ msgstr "Comando no autorizado desde esta consola.\n" -#: src/dird/ua_cmds.c:1535 -msgid "" -"In general it is not a good idea to delete either a\n" -"Pool or a Volume since they may contain data.\n" -"\n" -msgstr "" -"En general, esto no es una buena idea para eliminar un\n" -"Pool o un Volumen ya que pueden contener datos.\n" -"\n" +#~ msgid "Client \"%s\" not found.\n" +#~ msgstr "Cliente \"%s\" no encontrado.\n" -#: src/dird/ua_cmds.c:1538 -msgid "Choose catalog item to delete" -msgstr "Seleccione el ítem del catalogo para eliminar" +#~ msgid "Client \"%s\" address set to %s\n" +#~ msgstr "Cliente \"%s\" dirección configurada para %s\n" -#: src/dird/ua_cmds.c:1552 -msgid "Nothing done.\n" -msgstr "Nada hecho.\n" +#~ msgid "Job \"%s\" %sabled\n" +#~ msgstr "Job \"%s\" %sabled\n" -#: src/dird/ua_cmds.c:1580 -#, fuzzy, c-format -msgid "Are you sure you want to delete %d JobIds ? (yes/no): " -msgstr "¿Esta usted seguro de que desea eliminar el Pool \"%s\"? (si/no):" +#, fuzzy +#~ msgid "Client \"%s\" %sabled\n" +#~ msgstr "Job \"%s\" %sabled\n" -#: src/dird/ua_cmds.c:1590 -msgid "Enter JobId to delete: " -msgstr "Introduzca jobId para eliminar:" +#, fuzzy +#~ msgid "Schedule \"%s\" %sabled\n" +#~ msgstr "Job \"%s\" %sabled\n" -#: src/dird/ua_cmds.c:1608 -#, fuzzy, c-format -msgid "Jobid %s and associated records deleted from the catalog.\n" -msgstr "Job %s y los registros asociados eliminados del catálogo.\n" +#~ msgid "Connecting to Storage daemon %s at %s:%d\n" +#~ msgstr "Conectando al demonio Storage %s en %s:%d\n" -#: src/dird/ua_cmds.c:1623 -#, c-format -msgid "" -"\n" -"This command will delete volume %s\n" -"and all Jobs saved on that volume from the Catalog\n" -msgstr "" -"\n" -"Este comando eliminara los volúmenes %s\n" -"y todos los Jobs guardados en este volumen desde el Catalogo\n" +#~ msgid "Connected to storage daemon\n" +#~ msgstr "Conectado al demonio Storage\n" -#: src/dird/ua_cmds.c:1630 -#, c-format -msgid "Are you sure you want to delete Volume \"%s\"? (yes/no): " -msgstr "¿Estas usted seguro de que desea eliminar el Volumen \"%s\"? (si/no):" +#~ msgid "Enter new debug level: " +#~ msgstr "Introduzca el nuevo nivel de depuración:" -#: src/dird/ua_cmds.c:1643 -msgid "Can't list jobs on this volume\n" -msgstr "" +#, fuzzy +#~ msgid "Incorrect tags found on command line %s\n" +#~ msgstr "No se puede usar comando %s en un runscript" -#: src/dird/ua_cmds.c:1668 -#, c-format -msgid "Are you sure you want to delete Pool \"%s\"? (yes/no): " -msgstr "¿Esta usted seguro de que desea eliminar el Pool \"%s\"? (si/no):" +#~ msgid "Available daemons are: \n" +#~ msgstr "Demonios disponible son: \n" -#: src/dird/ua_cmds.c:1714 -#, fuzzy, c-format -msgid "Invalid device name. %s" -msgstr "Opción replace no valida: %s\n" +#~ msgid "Director" +#~ msgstr "Director" -#: src/dird/ua_cmds.c:1791 -#, c-format -msgid "Using Catalog name=%s DB=%s\n" -msgstr "Utilizando Catalogo nombre=%s BD=%s\n" +#~ msgid "Storage" +#~ msgstr "Storage" -#: src/dird/ua_cmds.c:1859 -msgid "ERR: Can't open db\n" -msgstr "ERR: No se puede abrir db\n" +#~ msgid "Client" +#~ msgstr "Client" -#: src/dird/ua_cmds.c:1906 -msgid "Wait on mount timed out\n" -msgstr "Tiempo agotado en esperar mount \n" +#~ msgid "All" +#~ msgstr "All" -#: src/dird/ua_cmds.c:1916 -msgid "ERR: Job was not found\n" -msgstr "ERR: Job no se ha encontrado\n" +#~ msgid "Select daemon type to set debug level" +#~ msgstr "" +#~ "Seleccione el tipo de Demonio para establecer el nivel de depuración" -#: src/dird/ua_cmds.c:1992 -msgid "" -" Command Description\n" -" ======= ===========\n" -msgstr "" -"Comando Descripción\n" -" ======== ==============\n" +#~ msgid "No authorization for Client \"%s\"\n" +#~ msgstr "No autorización para Cliente \"%s\"\n" -#: src/dird/ua_cmds.c:1996 -#, c-format -msgid "" -" %-13s %s\n" -"\n" -"Arguments:\n" -"\t%s\n" -msgstr "" -"%-13s %s\n" -"\n" -"Argumentos:\n" -"\t%s\n" +#~ msgid "Client name missing.\n" +#~ msgstr "Falta el nombre del cliente.\n" -#: src/dird/ua_cmds.c:2001 -#, c-format -msgid " %-13s %s\n" -msgstr " %-13s %s\n" +#~ msgid "Job \"%s\" not found.\n" +#~ msgstr "Job \"%s\" no encontrado.\n" -#: src/dird/ua_cmds.c:2005 -#, c-format -msgid "" -"\n" -"Can't find %s command.\n" -"\n" -msgstr "" -"\n" -"No se puede encontrar comando %s. \n" -"\n" +#~ msgid "No authorization for Job \"%s\"\n" +#~ msgstr "No autorización para Job \"%s\"\n" -#: src/dird/ua_cmds.c:2007 -msgid "" -"\n" -"When at a prompt, entering a period cancels the command.\n" -"\n" -msgstr "" -"\n" -"Cuando en un prompt, entrando un período cancela el comando.\n" -"\n" +#~ msgid "Job name missing.\n" +#~ msgstr "Falta el nombre del Job.\n" -#: src/dird/ua_cmds.c:2043 -#, c-format -msgid "%s Version: %s (%s) %s %s %s %s\n" -msgstr "%s Versión: %s (%s) %s %s %s %s\n" +#~ msgid "Fileset \"%s\" not found.\n" +#~ msgstr "FileSet \"%s\" no encontrado.\n" -#: src/dird/ua_cmds.c:2102 src/dird/ua_cmds.c:2129 src/dird/ua_cmds.c:2151 -#, c-format -msgid "No authorization for Catalog \"%s\"\n" -msgstr "No autorización para Catalogo \"%s\"\n" +#~ msgid "No authorization for FileSet \"%s\"\n" +#~ msgstr "No autorización para FileSet \"%s\"\n" -#: src/dird/ua_cmds.c:2187 src/dird/ua_select.c:242 -msgid "Could not find a Catalog resource\n" -msgstr "No pudo encontrar un Catalogo de recursos\n" +#~ msgid "Fileset name missing.\n" +#~ msgstr "Falta Nombre del Fileset.\n" -#: src/dird/ua_cmds.c:2208 -#, c-format -msgid "Could not open catalog database \"%s\".\n" -msgstr "No se pudo abrir la base de datos de catálogo \"%s\".\n" +#~ msgid "Level \"%s\" not valid.\n" +#~ msgstr "Nivel \"%s\" no es válido.\n" -#: src/dird/ua_cmds.c:2227 -#, c-format -msgid "Using Catalog \"%s\"\n" -msgstr "Usando Catalogo \"%s\"\n" +#~ msgid "Level value missing.\n" +#~ msgstr "Valor del nivel ausente.\n" -#: src/dird/ua_dde.c:62 src/dird/ua_dotcmds.c:1594 -#, c-format -msgid "List Media failed: ERR=%s\n" -msgstr "Fallo al listar Media: ERR=%s\n" +#~ msgid "Invalid value for accurate. It must be yes or no.\n" +#~ msgstr "Valor no válido para exacto. Debe ser sí o no.\n" -#: src/dird/ua_dde.c:110 #, fuzzy -msgid "Command line" -msgstr "línea de comandos" +#~ msgid "Accurate value missing.\n" +#~ msgstr "Valor del nivel ausente.\n" -#: src/dird/ua_dde.c:211 -#, fuzzy, c-format -msgid "Invalid keyword found: %s\n" -msgstr "Palabra clave inválida: %s\n" +#~ msgid "No job specified.\n" +#~ msgstr "Job no especificado.\n" -#: src/dird/ua_dde.c:216 -msgid "Dedup Engine choice: \n" -msgstr "" +#~ msgid "Error sending include list.\n" +#~ msgstr "Error al enviar lista incluir.\n" -#: src/dird/ua_dde.c:217 -msgid "Vacuum data files" -msgstr "" +#~ msgid "Error sending exclude list.\n" +#~ msgstr "Error al enviar lista excluir.\n" -#: src/dird/ua_dde.c:218 -msgid "Cancel running vacuum" -msgstr "" +#~ msgid "" +#~ "In general it is not a good idea to delete either a\n" +#~ "Pool or a Volume since they may contain data.\n" +#~ "\n" +#~ msgstr "" +#~ "En general, esto no es una buena idea para eliminar un\n" +#~ "Pool o un Volumen ya que pueden contener datos.\n" +#~ "\n" -#: src/dird/ua_dde.c:219 -#, fuzzy -msgid "Display data files usage" -msgstr "Mostrar mensajes pendientes" +#~ msgid "Choose catalog item to delete" +#~ msgstr "Seleccione el ítem del catalogo para eliminar" + +#~ msgid "Nothing done.\n" +#~ msgstr "Nada hecho.\n" -#: src/dird/ua_dde.c:223 #, fuzzy -msgid "Select action to perform on Dedup Engine" -msgstr "Seleccione tipo de demonio para matar" +#~ msgid "Are you sure you want to delete %d JobIds ? (yes/no): " +#~ msgstr "¿Esta usted seguro de que desea eliminar el Pool \"%s\"? (si/no):" -#: src/dird/ua_dotcmds.c:180 -msgid ": is an invalid command.\n" -msgstr ": es un comando inválido.\n" +#~ msgid "Enter JobId to delete: " +#~ msgstr "Introduzca jobId para eliminar:" -#: src/dird/ua_dotcmds.c:219 #, fuzzy -msgid "path name missing.\n" -msgstr "Falta el nombre del Job.\n" +#~ msgid "Jobid %s and associated records deleted from the catalog.\n" +#~ msgstr "Job %s y los registros asociados eliminados del catálogo.\n" + +#~ msgid "" +#~ "\n" +#~ "This command will delete volume %s\n" +#~ "and all Jobs saved on that volume from the Catalog\n" +#~ msgstr "" +#~ "\n" +#~ "Este comando eliminara los volúmenes %s\n" +#~ "y todos los Jobs guardados en este volumen desde el Catalogo\n" + +#~ msgid "Are you sure you want to delete Volume \"%s\"? (yes/no): " +#~ msgstr "" +#~ "¿Estas usted seguro de que desea eliminar el Volumen \"%s\"? (si/no):" + +#~ msgid "Are you sure you want to delete Pool \"%s\"? (yes/no): " +#~ msgstr "¿Esta usted seguro de que desea eliminar el Pool \"%s\"? (si/no):" -#: src/dird/ua_dotcmds.c:238 #, fuzzy -msgid "Failed to send command to Client.\n" -msgstr "Fallo al conectar con el cliente.\n" +#~ msgid "Invalid device name. %s" +#~ msgstr "Opción replace no valida: %s\n" -#: src/dird/ua_dotcmds.c:894 -#, fuzzy, c-format -msgid "Unable to get Job record for Job=%s\n" -msgstr "No se puede obtener el registro Job para JobId=%s: ERR=%s\n" +#~ msgid "Using Catalog name=%s DB=%s\n" +#~ msgstr "Utilizando Catalogo nombre=%s BD=%s\n" -#: src/dird/ua_dotcmds.c:909 -#, fuzzy, c-format -msgid "Unable to get last Job record for Job=%s\n" -msgstr "No se puede obtener el registro Job para JobId=%s: ERR=%s\n" +#~ msgid "ERR: Can't open db\n" +#~ msgstr "ERR: No se puede abrir db\n" -#: src/dird/ua_dotcmds.c:925 -#, fuzzy, c-format -msgid "Unable to get Client record for Client=%s\n" -msgstr "Creado registro Cliente para Cliente: %s\n" +#~ msgid "Wait on mount timed out\n" +#~ msgstr "Tiempo agotado en esperar mount \n" -#: src/dird/ua_dotcmds.c:941 -#, fuzzy, c-format -msgid "Unable to get last Job record for Client=%s\n" -msgstr "No se puede obtener el registro Job para JobId=%s: ERR=%s\n" +#~ msgid "ERR: Job was not found\n" +#~ msgstr "ERR: Job no se ha encontrado\n" -#: src/dird/ua_dotcmds.c:952 src/dird/ua_restore.c:960 -#: src/dird/ua_restore.c:1003 src/dird/vbackup.c:142 -#, c-format -msgid "Unable to get Job record for JobId=%s: ERR=%s\n" -msgstr "No se puede obtener el registro Job para JobId=%s: ERR=%s\n" +#~ msgid "" +#~ " Command Description\n" +#~ " ======= ===========\n" +#~ msgstr "" +#~ "Comando Descripción\n" +#~ " ======== ==============\n" -#: src/dird/ua_dotcmds.c:1156 src/dird/ua_dotcmds.c:1250 -#, fuzzy, c-format -msgid "Unknown command: %s\n" -msgstr "Comando desconocido." +#~ msgid "" +#~ " %-13s %s\n" +#~ "\n" +#~ "Arguments:\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%-13s %s\n" +#~ "\n" +#~ "Argumentos:\n" +#~ "\t%s\n" -#: src/dird/ua_dotcmds.c:1198 -msgid "Select daemon type to make die" -msgstr "Seleccione tipo de demonio para matar" +#~ msgid " %-13s %s\n" +#~ msgstr " %-13s %s\n" -#: src/dird/ua_dotcmds.c:1224 -#, fuzzy -msgid "The Director will generate a deadlock.\n" -msgstr "El Director tendrá una violación de segmento.\n" +#~ msgid "" +#~ "\n" +#~ "Can't find %s command.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "No se puede encontrar comando %s. \n" +#~ "\n" -#: src/dird/ua_dotcmds.c:1228 -msgid "The Director will segment fault.\n" -msgstr "El Director tendrá una violación de segmento.\n" +#~ msgid "" +#~ "\n" +#~ "When at a prompt, entering a period cancels the command.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Cuando en un prompt, entrando un período cancela el comando.\n" +#~ "\n" -#: src/dird/ua_dotcmds.c:1509 -msgid "Access to specified Client or FileSet not allowed.\n" -msgstr "El acceso a determinado Cliente o FileSet no permitido.\n" +#~ msgid "%s Version: %s (%s) %s %s %s %s\n" +#~ msgstr "%s Versión: %s (%s) %s %s %s %s\n" -#: src/dird/ua_dotcmds.c:1514 src/dird/ua_dotcmds.c:1558 -#: src/dird/ua_restore.c:1121 src/dird/ua_restore.c:1149 -#: src/dird/ua_restore.c:1170 -#, c-format -msgid "Query failed: %s. ERR=%s\n" -msgstr "Consulta fallida: %s. ERR=%s\n" +#~ msgid "No authorization for Catalog \"%s\"\n" +#~ msgstr "No autorización para Catalogo \"%s\"\n" -#: src/dird/ua_dotcmds.c:1553 -msgid "query keyword not found.\n" -msgstr "consulta de palabra clave no encontrada.\n" +#~ msgid "Could not find a Catalog resource\n" +#~ msgstr "No pudo encontrar un Catalogo de recursos\n" -#: src/dird/ua_dotcmds.c:1580 -#, c-format -msgid "List MediaType failed: ERR=%s\n" -msgstr "Fallo al listar MediaType: ERR=%s\n" +#~ msgid "Could not open catalog database \"%s\".\n" +#~ msgstr "No se pudo abrir la base de datos de catálogo \"%s\".\n" -#: src/dird/ua_dotcmds.c:1608 -#, c-format -msgid "List Location failed: ERR=%s\n" -msgstr "Fallo al listar Ubicación: ERR=%s\n" +#~ msgid "Using Catalog \"%s\"\n" +#~ msgstr "Usando Catalogo \"%s\"\n" -#: src/dird/ua_input.c:114 -msgid "Enter slot" -msgstr "Introduzca ranura" +#~ msgid "List Media failed: ERR=%s\n" +#~ msgstr "Fallo al listar Media: ERR=%s\n" -#: src/dird/ua_input.c:118 src/dird/ua_input.c:124 -#, c-format -msgid "Expected a positive integer, got: %s\n" -msgstr "Esperaba un número entero positivo, obtuvo: %s\n" +#, fuzzy +#~ msgid "Command line" +#~ msgstr "línea de comandos" -#: src/dird/ua_input.c:181 -msgid "Invalid response. You must answer yes or no.\n" -msgstr "Respuesta no válida. Usted tiene que contestar sí o no.\n" +#, fuzzy +#~ msgid "Invalid keyword found: %s\n" +#~ msgstr "Palabra clave inválida: %s\n" -#: src/dird/ua_input.c:204 -msgid "Invalid Enabled value, it must be yes, no, archived, 0, 1, or 2\n" -msgstr "Inválido valor Habilitado, debe ser sí, no, archivado, 0, 1 o 2\n" +#, fuzzy +#~ msgid "Display data files usage" +#~ msgstr "Mostrar mensajes pendientes" -#: src/dird/ua_input.c:231 -#, fuzzy, c-format -msgid "Illegal character \"%c\" in a comment.\n" -msgstr "Carácter ilegal \"%c\" en el nombre.\n" +#~ msgid ": is an invalid command.\n" +#~ msgstr ": es un comando inválido.\n" -#: src/dird/ua_input.c:238 #, fuzzy -msgid "Comment too long.\n" -msgstr "Nombre demasiado largo.\n" +#~ msgid "path name missing.\n" +#~ msgstr "Falta el nombre del Job.\n" -#: src/dird/ua_input.c:244 #, fuzzy -msgid "Comment must be at least one character long.\n" -msgstr "Nombre de volumen debe ser de al menos un carácter de largo.\n" +#~ msgid "Failed to send command to Client.\n" +#~ msgstr "Fallo al conectar con el cliente.\n" -#: src/dird/ua_label.c:93 -msgid "Negative numbers not permitted\n" -msgstr "Números negativos no permitidos.\n" +#, fuzzy +#~ msgid "Unable to get Job record for Job=%s\n" +#~ msgstr "No se puede obtener el registro Job para JobId=%s: ERR=%s\n" -#: src/dird/ua_label.c:99 src/lib/sellist.c:65 -msgid "Range end is not integer.\n" -msgstr "Rango final no es entero.\n" +#, fuzzy +#~ msgid "Unable to get last Job record for Job=%s\n" +#~ msgstr "No se puede obtener el registro Job para JobId=%s: ERR=%s\n" -#: src/dird/ua_label.c:104 src/lib/sellist.c:70 -msgid "Range start is not an integer.\n" -msgstr "Rango inicial no es entero.\n" +#, fuzzy +#~ msgid "Unable to get Client record for Client=%s\n" +#~ msgstr "Creado registro Cliente para Cliente: %s\n" -#: src/dird/ua_label.c:110 src/lib/sellist.c:77 -msgid "Range end not bigger than start.\n" -msgstr "Rango final no más grande que inicial.\n" +#, fuzzy +#~ msgid "Unable to get last Job record for Client=%s\n" +#~ msgstr "No se puede obtener el registro Job para JobId=%s: ERR=%s\n" -#: src/dird/ua_label.c:116 src/lib/sellist.c:95 -msgid "Input value is not an integer.\n" -msgstr "Valor de entrada no es un entero.\n" +#~ msgid "Unable to get Job record for JobId=%s: ERR=%s\n" +#~ msgstr "No se puede obtener el registro Job para JobId=%s: ERR=%s\n" -#: src/dird/ua_label.c:122 -msgid "Values must be be greater than zero.\n" -msgstr "Los valores deben ser ser mayor que cero.\n" +#, fuzzy +#~ msgid "Unknown command: %s\n" +#~ msgstr "Comando desconocido." -#: src/dird/ua_label.c:126 -msgid "Slot too large.\n" -msgstr "Ranura demasiado grande.\n" +#~ msgid "Select daemon type to make die" +#~ msgstr "Seleccione tipo de demonio para matar" -#: src/dird/ua_label.c:178 src/dird/ua_label.c:356 src/dird/ua_label.c:1191 -#: src/dird/ua_run.c:417 -msgid "command line" -msgstr "línea de comandos" +#, fuzzy +#~ msgid "The Director will generate a deadlock.\n" +#~ msgstr "El Director tendrá una violación de segmento.\n" -#: src/dird/ua_label.c:196 src/dird/ua_label.c:520 src/dird/ua_label.c:1198 -msgid "No slots in changer to scan.\n" -msgstr "No hay ranuras en cambiador para analizar.\n" +#~ msgid "The Director will segment fault.\n" +#~ msgstr "El Director tendrá una violación de segmento.\n" -#: src/dird/ua_label.c:208 src/dird/ua_label.c:531 -msgid "No Volumes found to label, or no barcodes.\n" -msgstr "No encontraron volúmenes para etiquetar, o sin códigos de barras.\n" +#~ msgid "Access to specified Client or FileSet not allowed.\n" +#~ msgstr "El acceso a determinado Cliente o FileSet no permitido.\n" -#: src/dird/ua_label.c:218 src/dird/ua_label.c:1219 -#, c-format -msgid "Slot %d greater than max %d ignored.\n" -msgstr "Ranura %d mayor que el máximo %d ignorado.\n" +#~ msgid "Query failed: %s. ERR=%s\n" +#~ msgstr "Consulta fallida: %s. ERR=%s\n" -#: src/dird/ua_label.c:256 -#, c-format -msgid "No VolName for Slot=%d InChanger set to zero.\n" -msgstr "Ninguno VolName para Ranura=%d InChanger establecido en cero.\n" +#~ msgid "query keyword not found.\n" +#~ msgstr "consulta de palabra clave no encontrada.\n" -#: src/dird/ua_label.c:277 -#, c-format -msgid "Catalog record for Volume \"%s\" updated to reference slot %d.\n" -msgstr "" -"Registro de catálogo para Volumen \"%s\" actualizado para referenciar ranura " -"%d.\n" +#~ msgid "List MediaType failed: ERR=%s\n" +#~ msgstr "Fallo al listar MediaType: ERR=%s\n" -#: src/dird/ua_label.c:281 -#, c-format -msgid "Catalog record for Volume \"%s\" is up to date.\n" -msgstr "Registro de catálogo para Volumen \"%s\" esta actualizado.\n" +#~ msgid "List Location failed: ERR=%s\n" +#~ msgstr "Fallo al listar Ubicación: ERR=%s\n" -#: src/dird/ua_label.c:287 -#, c-format -msgid "Volume \"%s\" not found in catalog. Slot=%d InChanger set to zero.\n" -msgstr "" -"Volumen \"%s\" no se encuentra en el catálogo. Ranura=%d InChanger " -"configurado para cero.\n" +#~ msgid "Enter slot" +#~ msgstr "Introduzca ranura" -#: src/dird/ua_label.c:385 -#, c-format -msgid "" -"Volume \"%s\" has VolStatus %s. It must be Purged or Recycled before " -"relabeling.\n" -msgstr "" -"Volumen \"%s\" hay VolStatus %s. Debe ser purgado o reciclado antes de " -"volver a etiquetar.\n" +#~ msgid "Expected a positive integer, got: %s\n" +#~ msgstr "Esperaba un número entero positivo, obtuvo: %s\n" -#: src/dird/ua_label.c:401 -msgid "Enter new Volume name: " -msgstr "Introduzca el nuevo nombre de Volumen:" +#~ msgid "Invalid response. You must answer yes or no.\n" +#~ msgstr "Respuesta no válida. Usted tiene que contestar sí o no.\n" -#: src/dird/ua_label.c:414 -#, c-format -msgid "Media record for new Volume \"%s\" already exists.\n" -msgstr "Registro de Medios para nuevo volumen \"%s\" ya existe.\n" +#~ msgid "Invalid Enabled value, it must be yes, no, archived, 0, 1, or 2\n" +#~ msgstr "Inválido valor Habilitado, debe ser sí, no, archivado, 0, 1 o 2\n" -#: src/dird/ua_label.c:432 -msgid "Enter slot (0 or Enter for none): " -msgstr "Introduzca ranura (0 o Enter para ninguno):" +#, fuzzy +#~ msgid "Illegal character \"%c\" in a comment.\n" +#~ msgstr "Carácter ilegal \"%c\" en el nombre.\n" -#: src/dird/ua_label.c:460 -#, c-format -msgid "Delete of Volume \"%s\" failed. ERR=%s" -msgstr "Fallo al eliminar el Volumen \"%s\". ERR=%s" +#, fuzzy +#~ msgid "Comment too long.\n" +#~ msgstr "Nombre demasiado largo.\n" -#: src/dird/ua_label.c:463 -#, c-format -msgid "Old volume \"%s\" deleted from catalog.\n" -msgstr "Antiguo volumen \"%s\" borrado del catalogo.\n" +#, fuzzy +#~ msgid "Comment must be at least one character long.\n" +#~ msgstr "Nombre de volumen debe ser de al menos un carácter de largo.\n" -#: src/dird/ua_label.c:474 -#, c-format -msgid "Requesting to mount %s ...\n" -msgstr "Solicitando para montar %s ...\n" +#~ msgid "Negative numbers not permitted\n" +#~ msgstr "Números negativos no permitidos.\n" -#: src/dird/ua_label.c:496 -msgid "Do not forget to mount the drive!!!\n" -msgstr "No se olvide de montar la unidad!!!\n" +#~ msgid "Range end is not integer.\n" +#~ msgstr "Rango final no es entero.\n" -#: src/dird/ua_label.c:536 -msgid "" -"The following Volumes will be labeled:\n" -"Slot Volume\n" -"==============\n" -msgstr "" -"Los siguientes volúmenes serán etiquetados:\n" -"Ranura Volumen\n" -"==============\n" +#~ msgid "Range start is not an integer.\n" +#~ msgstr "Rango inicial no es entero.\n" -#: src/dird/ua_label.c:545 -msgid "Do you want to label these Volumes? (yes|no): " -msgstr "¿Quieres etiquetar estos volúmenes? (sí | no):" +#~ msgid "Range end not bigger than start.\n" +#~ msgstr "Rango final no más grande que inicial.\n" -#: src/dird/ua_label.c:565 -#, c-format -msgid "Media record for Slot %d Volume \"%s\" already exists.\n" -msgstr "Registro de Medios para ranura %d Volumen \"%s\" ya existe.\n" +#~ msgid "Input value is not an integer.\n" +#~ msgstr "Valor de entrada no es un entero.\n" -#: src/dird/ua_label.c:571 -#, c-format -msgid "Error setting InChanger: ERR=%s" -msgstr "Error al configurar InChanger: ERR =% s" +#~ msgid "Values must be be greater than zero.\n" +#~ msgstr "Los valores deben ser ser mayor que cero.\n" -#: src/dird/ua_label.c:594 -#, c-format -msgid "Maximum pool Volumes=%d reached.\n" -msgstr "Máximo pool Volúmenes=%d alcanzado.\n" +#~ msgid "Slot too large.\n" +#~ msgstr "Ranura demasiado grande.\n" -#: src/dird/ua_label.c:602 -#, c-format -msgid "Catalog record for cleaning tape \"%s\" successfully created.\n" -msgstr "" -"Registro de catálogo para la limpieza de la cinta \"%s\" ha creado " -"correctamente.\n" +#~ msgid "command line" +#~ msgstr "línea de comandos" -#: src/dird/ua_label.c:609 -#, c-format -msgid "Catalog error on cleaning tape: %s" -msgstr "Error de catálogo en la limpieza de la cinta: %s" +#~ msgid "No slots in changer to scan.\n" +#~ msgstr "No hay ranuras en cambiador para analizar.\n" -#: src/dird/ua_label.c:645 -#, c-format -msgid "Illegal character \"%c\" in a volume name.\n" -msgstr "Ilegal carácter \"%c\" en un nombre de volumen.\n" +#~ msgid "No Volumes found to label, or no barcodes.\n" +#~ msgstr "No encontraron volúmenes para etiquetar, o sin códigos de barras.\n" -#: src/dird/ua_label.c:693 -#, c-format -msgid "Sending relabel command from \"%s\" to \"%s\" ...\n" -msgstr "Enviando comando relabel desde \"%s\" para \"%s\" ...\n" +#~ msgid "Slot %d greater than max %d ignored.\n" +#~ msgstr "Ranura %d mayor que el máximo %d ignorado.\n" -#: src/dird/ua_label.c:700 -#, c-format -msgid "Sending label command for Volume \"%s\" Slot %d ...\n" -msgstr "Enviando comando relabel para Volumen \"%s\" Ranura %d ...\n" +#~ msgid "No VolName for Slot=%d InChanger set to zero.\n" +#~ msgstr "Ninguno VolName para Ranura=%d InChanger establecido en cero.\n" -#: src/dird/ua_label.c:738 -#, c-format -msgid "Catalog record for Volume \"%s\", Slot %d successfully created.\n" -msgstr "" -"Registro Catalogo para Volumen \"%s\", Ranura %d creado correctamente.\n" +#~ msgid "Catalog record for Volume \"%s\" updated to reference slot %d.\n" +#~ msgstr "" +#~ "Registro de catálogo para Volumen \"%s\" actualizado para referenciar " +#~ "ranura %d.\n" -#: src/dird/ua_label.c:751 -#, c-format -msgid "Label command failed for Volume %s.\n" -msgstr "Comando Label fallido para Volumen %s.\n" +#~ msgid "Catalog record for Volume \"%s\" is up to date.\n" +#~ msgstr "Registro de catálogo para Volumen \"%s\" esta actualizado.\n" -#: src/dird/ua_label.c:765 -msgid "Could not open SD socket.\n" -msgstr "No se pudo abrir socket SD.\n" +#~ msgid "Volume \"%s\" not found in catalog. Slot=%d InChanger set to zero.\n" +#~ msgstr "" +#~ "Volumen \"%s\" no se encuentra en el catálogo. Ranura=%d InChanger " +#~ "configurado para cero.\n" -#: src/dird/ua_label.c:837 src/dird/ua_label.c:847 -#, c-format -msgid "Invalid Slot number: %s\n" -msgstr "Número de Ranura no válido:%s\n" +#~ msgid "" +#~ "Volume \"%s\" has VolStatus %s. It must be Purged or Recycled before " +#~ "relabeling.\n" +#~ msgstr "" +#~ "Volumen \"%s\" hay VolStatus %s. Debe ser purgado o reciclado antes de " +#~ "volver a etiquetar.\n" -#: src/dird/ua_label.c:856 -#, fuzzy, c-format -msgid "Invalid Volume name: %s. Volume skipped.\n" -msgstr "Nombre de Volumen no válido:%s\n" +#~ msgid "Enter new Volume name: " +#~ msgstr "Introduzca el nuevo nombre de Volumen:" -#: src/dird/ua_label.c:950 -#, c-format -msgid "Device \"%s\" has %d slots.\n" -msgstr "Dispositivo \"%s\" tiene %d ranuras.\n" +#~ msgid "Media record for new Volume \"%s\" already exists.\n" +#~ msgstr "Registro de Medios para nuevo volumen \"%s\" ya existe.\n" -#: src/dird/ua_label.c:996 -#, c-format -msgid "Pool \"%s\" resource not found for volume \"%s\"!\n" -msgstr "Recurso Pool \"%s\" no encontrado para volumen \"%s\"!\n" +#~ msgid "Enter slot (0 or Enter for none): " +#~ msgstr "Introduzca ranura (0 o Enter para ninguno):" -#: src/dird/ua_label.c:1210 -msgid "No Volumes found, or no barcodes.\n" -msgstr "Volúmenes no encontrados, o no códigos de barras.\n" +#~ msgid "Delete of Volume \"%s\" failed. ERR=%s" +#~ msgstr "Fallo al eliminar el Volumen \"%s\". ERR=%s" -#: src/dird/ua_label.c:1213 -msgid "" -" Slot | Volume Name | Status | Media Type | " -"Pool |\n" -msgstr "Ranura | Nombre Volumen | Estado | Tipo de Media | Pool |\n" +#~ msgid "Old volume \"%s\" deleted from catalog.\n" +#~ msgstr "Antiguo volumen \"%s\" borrado del catalogo.\n" -#: src/dird/ua_label.c:1214 -msgid "" -"------+------------------+-----------+----------------------" -"+--------------------|\n" -msgstr "" -"------+------------------+-----------+----------------------" -"+--------------------|\n" +#~ msgid "Requesting to mount %s ...\n" +#~ msgstr "Solicitando para montar %s ...\n" -#: src/dird/ua_output.c:56 src/dird/ua_output.c:80 -msgid "ON or OFF keyword missing.\n" -msgstr "Faltan palabra clave ON u OFF.\n" +#~ msgid "Do not forget to mount the drive!!!\n" +#~ msgstr "No se olvide de montar la unidad!!!\n" -#: src/dird/ua_output.c:100 -msgid "Disabled Jobs:\n" -msgstr "Jobs Deshabilitados:\n" +#~ msgid "" +#~ "The following Volumes will be labeled:\n" +#~ "Slot Volume\n" +#~ "==============\n" +#~ msgstr "" +#~ "Los siguientes volúmenes serán etiquetados:\n" +#~ "Ranura Volumen\n" +#~ "==============\n" -#: src/dird/ua_output.c:106 -msgid "No disabled Jobs.\n" -msgstr "Ningún Jobs Deshabilitado.\n" +#~ msgid "Do you want to label these Volumes? (yes|no): " +#~ msgstr "¿Quieres etiquetar estos volúmenes? (sí | no):" -#: src/dird/ua_output.c:208 -msgid "Keywords for the show command are:\n" -msgstr "Palabras clave para el comando show son:\n" +#~ msgid "Media record for Slot %d Volume \"%s\" already exists.\n" +#~ msgstr "Registro de Medios para ranura %d Volumen \"%s\" ya existe.\n" -#: src/dird/ua_output.c:215 -#, c-format -msgid "%s resource %s not found.\n" -msgstr "%s recurso %s no encontrado.\n" +#~ msgid "Error setting InChanger: ERR=%s" +#~ msgstr "Error al configurar InChanger: ERR =% s" -#: src/dird/ua_output.c:219 -#, c-format -msgid "Resource %s not found\n" -msgstr "Recursos %s no encontrado\n" +#~ msgid "Maximum pool Volumes=%d reached.\n" +#~ msgstr "Máximo pool Volúmenes=%d alcanzado.\n" -#: src/dird/ua_output.c:360 -msgid "Hey! DB is NULL\n" -msgstr "Hey! BD esta VACÍA\n" +#~ msgid "Catalog record for cleaning tape \"%s\" successfully created.\n" +#~ msgstr "" +#~ "Registro de catálogo para la limpieza de la cinta \"%s\" ha creado " +#~ "correctamente.\n" -#: src/dird/ua_output.c:522 -#, fuzzy -msgid "Invalid jobid argument\n" -msgstr "argumento invalido" +#~ msgid "Catalog error on cleaning tape: %s" +#~ msgstr "Error de catálogo en la limpieza de la cinta: %s" -#: src/dird/ua_output.c:546 -#, fuzzy, c-format -msgid "Unknown ObjectType %s\n" -msgstr "Tipo de base de datos desconocido: %s\n" +#~ msgid "Illegal character \"%c\" in a volume name.\n" +#~ msgstr "Ilegal carácter \"%c\" en un nombre de volumen.\n" -#: src/dird/ua_output.c:556 -msgid "list pluginrestoreconf requires jobid argument\n" -msgstr "" +#~ msgid "Sending relabel command from \"%s\" to \"%s\" ...\n" +#~ msgstr "Enviando comando relabel desde \"%s\" para \"%s\" ...\n" -#: src/dird/ua_output.c:594 -#, c-format -msgid "Jobid %d used %d Volume(s): %s\n" -msgstr "Jobid %d usado %d Volumen(s): %s\n" +#~ msgid "Sending label command for Volume \"%s\" Slot %d ...\n" +#~ msgstr "Enviando comando relabel para Volumen \"%s\" Ranura %d ...\n" -#: src/dird/ua_output.c:613 -msgid "No Pool specified.\n" -msgstr "Ningún Pool especificado.\n" +#~ msgid "Catalog record for Volume \"%s\", Slot %d successfully created.\n" +#~ msgstr "" +#~ "Registro Catalogo para Volumen \"%s\", Ranura %d creado correctamente.\n" -#: src/dird/ua_output.c:624 src/dird/ua_select.c:612 src/dird/ua_update.c:435 -#, c-format -msgid "Error obtaining pool ids. ERR=%s\n" -msgstr "Error al obteniendo pool ids. ERR=%s\n" +#~ msgid "Label command failed for Volume %s.\n" +#~ msgstr "Comando Label fallido para Volumen %s.\n" -#: src/dird/ua_output.c:634 -#, c-format -msgid "Pool: %s\n" -msgstr "Pool: %s\n" +#~ msgid "Could not open SD socket.\n" +#~ msgstr "No se pudo abrir socket SD.\n" -#: src/dird/ua_output.c:650 -msgid "Ignoring invalid value for days. Max is 50.\n" -msgstr "Ignorando valor invalido para días. Máximo es 50.\n" +#~ msgid "Invalid Slot number: %s\n" +#~ msgstr "Número de Ranura no válido:%s\n" -#: src/dird/ua_output.c:679 -#, c-format -msgid "Unknown list keyword: %s\n" -msgstr "Lista de palabras clave desconocida: %s\n" +#, fuzzy +#~ msgid "Invalid Volume name: %s. Volume skipped.\n" +#~ msgstr "Nombre de Volumen no válido:%s\n" -#: src/dird/ua_output.c:704 -#, c-format -msgid "%s is not a job name.\n" -msgstr "%s no es un nombre de Job.\n" +#~ msgid "Device \"%s\" has %d slots.\n" +#~ msgstr "Dispositivo \"%s\" tiene %d ranuras.\n" -#: src/dird/ua_output.c:718 -#, c-format -msgid "Could not find Pool for Job %s\n" -msgstr "No se pudo encontrar Pool para Job %s\n" +#~ msgid "Pool \"%s\" resource not found for volume \"%s\"!\n" +#~ msgstr "Recurso Pool \"%s\" no encontrado para volumen \"%s\"!\n" -#: src/dird/ua_output.c:731 -#, c-format -msgid "Could not find next Volume for Job %s (Pool=%s, Level=%s).\n" -msgstr "" -"No se pudo encontrar el siguiente Volumen para Job %s (Pool=%s, Nivel=%s).\n" +#~ msgid "No Volumes found, or no barcodes.\n" +#~ msgstr "Volúmenes no encontrados, o no códigos de barras.\n" -#: src/dird/ua_output.c:735 -#, c-format -msgid "" -"The next Volume to be used by Job \"%s\" (Pool=%s, Level=%s) will be %s\n" -msgstr "" -"El próximo Volumen que se utilizará por Job \"%s\" (Pool=%s, Nivel=%s) será " -"%s\n" +#~ msgid "" +#~ " Slot | Volume Name | Status | Media Type | " +#~ "Pool |\n" +#~ msgstr "Ranura | Nombre Volumen | Estado | Tipo de Media | Pool |\n" -#: src/dird/ua_output.c:746 -#, c-format -msgid "Could not find next Volume for Job %s.\n" -msgstr "No se pudo encontrar el siguiente Volumen para Job %s.\n" +#~ msgid "" +#~ "------+------------------+-----------+----------------------" +#~ "+--------------------|\n" +#~ msgstr "" +#~ "------+------------------+-----------+----------------------" +#~ "+--------------------|\n" -#: src/dird/ua_output.c:892 -#, c-format -msgid "Pool %s not in database. %s" -msgstr "Pool %s no creado en la base de datos. %s" +#~ msgid "ON or OFF keyword missing.\n" +#~ msgstr "Faltan palabra clave ON u OFF.\n" -#: src/dird/ua_output.c:900 -#, c-format -msgid "Pool %s created in database.\n" -msgstr "Pool %s creado en la base de datos.\n" +#~ msgid "Disabled Jobs:\n" +#~ msgstr "Jobs Deshabilitados:\n" -#: src/dird/ua_output.c:956 -msgid "You have no messages.\n" -msgstr "Usted no tiene mensajes.\n" +#~ msgid "No disabled Jobs.\n" +#~ msgstr "Ningún Jobs Deshabilitado.\n" -#: src/dird/ua_output.c:1036 -msgid "Message too long to display.\n" -msgstr "Mensaje demasiado largo para mostrar.\n" +#~ msgid "Keywords for the show command are:\n" +#~ msgstr "Palabras clave para el comando show son:\n" -#: src/dird/ua_prune.c:118 -msgid "Choose item to prune" -msgstr "Elija el ítem para podar" +#~ msgid "%s resource %s not found.\n" +#~ msgstr "%s recurso %s no encontrado.\n" -#: src/dird/ua_prune.c:174 -#, c-format -msgid "Cannot prune Volume \"%s\" because it is archived.\n" -msgstr "No se puede podar Volumen \"%s\", porque el esta archivo.\n" +#~ msgid "Resource %s not found\n" +#~ msgstr "Recursos %s no encontrado\n" -#: src/dird/ua_prune.c:219 -msgid "Pruned Jobs from JobHisto catalog.\n" -msgstr "Podar Jobs del catálogo JobHisto.\n" +#~ msgid "Hey! DB is NULL\n" +#~ msgstr "Hey! BD esta VACÍA\n" -#: src/dird/ua_prune.c:307 #, fuzzy -msgid "Begin pruning Files.\n" -msgstr "Comenzar poda de Archivos.\n" +#~ msgid "Invalid jobid argument\n" +#~ msgstr "argumento invalido" -#: src/dird/ua_prune.c:322 -msgid "No Files found to prune.\n" -msgstr "No se encontraron archivos para podar.\n" +#, fuzzy +#~ msgid "Unknown ObjectType %s\n" +#~ msgstr "Tipo de base de datos desconocido: %s\n" -#: src/dird/ua_prune.c:345 -#, c-format -msgid "Pruned Files from %s Jobs for client %s from catalog.\n" -msgstr "Archivos podados desde Jobs %s para el cliente %s desde el catálogo.\n" +#~ msgid "Jobid %d used %d Volume(s): %s\n" +#~ msgstr "Jobid %d usado %d Volumen(s): %s\n" -#: src/dird/ua_prune.c:491 -#, fuzzy, c-format -msgid "Begin pruning Jobs older than %s.\n" -msgstr "Comenzar poda de Jobs.\n" +#~ msgid "No Pool specified.\n" +#~ msgstr "Ningún Pool especificado.\n" -#: src/dird/ua_prune.c:602 -#, c-format -msgid "Pruned %d %s for client %s from catalog.\n" -msgstr "Podados %d %s para el cliente %s desde el catálogo.\n" +#~ msgid "Error obtaining pool ids. ERR=%s\n" +#~ msgstr "Error al obteniendo pool ids. ERR=%s\n" -#: src/dird/ua_prune.c:603 -msgid "Jobs" -msgstr "Jobs" +#~ msgid "Pool: %s\n" +#~ msgstr "Pool: %s\n" -#: src/dird/ua_prune.c:605 -msgid "No Jobs found to prune.\n" -msgstr "No encontraron Jobs para podar.\n" +#~ msgid "Ignoring invalid value for days. Max is 50.\n" +#~ msgstr "Ignorando valor invalido para días. Máximo es 50.\n" -#: src/dird/ua_prune.c:666 -msgid "Expecting limit argument as integer\n" -msgstr "" +#~ msgid "Unknown list keyword: %s\n" +#~ msgstr "Lista de palabras clave desconocida: %s\n" -#: src/dird/ua_prune.c:679 -#, fuzzy, c-format -msgid "Volume \"%s\"" -msgstr "Volumen" +#~ msgid "%s is not a job name.\n" +#~ msgstr "%s no es un nombre de Job.\n" -#: src/dird/ua_purge.c:85 -msgid "" -"\n" -"This command can be DANGEROUS!!!\n" -"\n" -"It purges (deletes) all Files from a Job,\n" -"JobId, Client or Volume; or it purges (deletes)\n" -"all Jobs from a Client or Volume without regard\n" -"to retention periods. Normally you should use the\n" -"PRUNE command, which respects retention periods.\n" -msgstr "" -"\n" -"Este comando puede ser PELIGROSO!!!\n" -"\n" -"El purgas (elimina) todos los archivos de un Job,\n" -"JobId, Cliente o Volumen; o el purgas (elimina)\n" -"Todos los Jobs de un Cliente o Volumen sin tener en cuenta\n" -"los periodos de retención. Normalmente debería utilizar el\n" -"comando PRUNE, que respecta los plazos de retención.\n" +#~ msgid "Could not find Pool for Job %s\n" +#~ msgstr "No se pudo encontrar Pool para Job %s\n" -#: src/dird/ua_purge.c:153 -msgid "Choose item to purge" -msgstr "Elija el ítem para purgar" +#~ msgid "Could not find next Volume for Job %s (Pool=%s, Level=%s).\n" +#~ msgstr "" +#~ "No se pudo encontrar el siguiente Volumen para Job %s (Pool=%s, Nivel=" +#~ "%s).\n" -#: src/dird/ua_purge.c:200 -#, c-format -msgid "Begin purging files for Client \"%s\"\n" -msgstr "Iniciando purga de archivos para Cliente \"%s\"\n" +#~ msgid "" +#~ "The next Volume to be used by Job \"%s\" (Pool=%s, Level=%s) will be %s\n" +#~ msgstr "" +#~ "El próximo Volumen que se utilizará por Job \"%s\" (Pool=%s, Nivel=%s) " +#~ "será %s\n" -#: src/dird/ua_purge.c:209 src/dird/ua_purge.c:259 -#, c-format -msgid "No Files found for client %s to purge from %s catalog.\n" -msgstr "" -"No encuentra los archivos del cliente %s para purgar %s del catálogo.\n" +#~ msgid "Could not find next Volume for Job %s.\n" +#~ msgstr "No se pudo encontrar el siguiente Volumen para Job %s.\n" -#: src/dird/ua_purge.c:212 -#, c-format -msgid "Files for %d Jobs for client \"%s\" purged from %s catalog.\n" -msgstr "Archivos para Jobs %d para cliente \"%s\" purgado del catalogo %s.\n" +#~ msgid "Pool %s not in database. %s" +#~ msgstr "Pool %s no creado en la base de datos. %s" -#: src/dird/ua_purge.c:250 -#, c-format -msgid "Begin purging jobs from Client \"%s\"\n" -msgstr "Iniciando purga de jobs para Cliente \"%s\"\n" +#~ msgid "Pool %s created in database.\n" +#~ msgstr "Pool %s creado en la base de datos.\n" -#: src/dird/ua_purge.c:262 -#, c-format -msgid "%d Jobs for client %s purged from %s catalog.\n" -msgstr "Jobs %d para cliente \"%s\" purgado del catalogo %s.\n" +#~ msgid "You have no messages.\n" +#~ msgstr "Usted no tiene mensajes.\n" -#: src/dird/ua_purge.c:466 -#, c-format -msgid "" -"\n" -"Volume \"%s\" has VolStatus \"%s\" and cannot be purged.\n" -"The VolStatus must be: Append, Full, Used, or Error to be purged.\n" -msgstr "" -"\n" -"Volumen \"%s\" tiene VolStatus \"%s\" y no puede ser purgado.\n" -"El VolStatus debe ser: Añadir, Lleno, Usado, o Error para ser purgado.\n" +#~ msgid "Message too long to display.\n" +#~ msgstr "Mensaje demasiado largo para mostrar.\n" -#: src/dird/ua_purge.c:494 -#, c-format -msgid "%d File%s on Volume \"%s\" purged from catalog.\n" -msgstr "%d Archivo%s en Volumen \"%s\" purgado desde el catalogo.\n" +#~ msgid "Choose item to prune" +#~ msgstr "Elija el ítem para podar" -#: src/dird/ua_purge.c:544 -#, c-format -msgid "" -"There are no more Jobs associated with Volume \"%s\". Marking it purged.\n" -msgstr "" -"No hay más Jobs relacionados con Volumen \"%s\". Marcando el para purgar.\n" +#~ msgid "Cannot prune Volume \"%s\" because it is archived.\n" +#~ msgstr "No se puede podar Volumen \"%s\", porque el esta archivo.\n" + +#~ msgid "Pruned Jobs from JobHisto catalog.\n" +#~ msgstr "Podar Jobs del catálogo JobHisto.\n" -#: src/dird/ua_purge.c:617 #, fuzzy -msgid "Can't update volume size in the catalog\n" -msgstr "Se creó un Volumen nuevo \"%s\" en el catálogo.\n" +#~ msgid "Begin pruning Files.\n" +#~ msgstr "Comenzar poda de Archivos.\n" -#: src/dird/ua_purge.c:619 -#, c-format -msgid "The volume \"%s\" has been truncated\n" -msgstr "" +#~ msgid "No Files found to prune.\n" +#~ msgstr "No se encontraron archivos para podar.\n" -#: src/dird/ua_purge.c:621 -#, fuzzy, c-format -msgid "Unable to truncate volume \"%s\"\n" -msgstr "No se puede truncar el dispositivo %s. ERR=%s\n" +#~ msgid "Pruned Files from %s Jobs for client %s from catalog.\n" +#~ msgstr "" +#~ "Archivos podados desde Jobs %s para el cliente %s desde el catálogo.\n" -#: src/dird/ua_purge.c:714 #, fuzzy -msgid "No Volumes found to perform \"truncate\" command.\n" -msgstr "No encontraron volúmenes para etiquetar, o sin códigos de barras.\n" +#~ msgid "Begin pruning Jobs older than %s.\n" +#~ msgstr "Comenzar poda de Jobs.\n" -#: src/dird/ua_purge.c:781 -#, c-format -msgid "Unable move recycled Volume in full Pool \"%s\" MaxVols=%d\n" -msgstr "" -"No se puede mover el Volumen reciclado en full Pool \"%s\" MaxVols=%d\n" +#~ msgid "Pruned %d %s for client %s from catalog.\n" +#~ msgstr "Podados %d %s para el cliente %s desde el catálogo.\n" -#: src/dird/ua_purge.c:795 -#, c-format -msgid "All records pruned from Volume \"%s\"; marking it \"Purged\"\n" -msgstr "" -"Todos los registros del Volumen \"%s\" podados; marcando el \"Purgados\"\n" +#~ msgid "Jobs" +#~ msgstr "Jobs" -#: src/dird/ua_purge.c:800 -#, c-format -msgid "Cannot purge Volume with VolStatus=%s\n" -msgstr "No se puede purgar Volumen con VolStatus=%s\n" +#~ msgid "No Jobs found to prune.\n" +#~ msgstr "No encontraron Jobs para podar.\n" -#: src/dird/ua_query.c:62 src/findlib/create_file.c:283 -#: src/findlib/create_file.c:385 -#, c-format -msgid "Could not open %s: ERR=%s\n" -msgstr "No se pudo abrir %s: ERR=%s\n" +#, fuzzy +#~ msgid "Volume \"%s\"" +#~ msgstr "Volumen" -#: src/dird/ua_query.c:67 -msgid "Available queries:\n" -msgstr "Consultas disponibles:\n" +#~ msgid "" +#~ "\n" +#~ "This command can be DANGEROUS!!!\n" +#~ "\n" +#~ "It purges (deletes) all Files from a Job,\n" +#~ "JobId, Client or Volume; or it purges (deletes)\n" +#~ "all Jobs from a Client or Volume without regard\n" +#~ "to retention periods. Normally you should use the\n" +#~ "PRUNE command, which respects retention periods.\n" +#~ msgstr "" +#~ "\n" +#~ "Este comando puede ser PELIGROSO!!!\n" +#~ "\n" +#~ "El purgas (elimina) todos los archivos de un Job,\n" +#~ "JobId, Cliente o Volumen; o el purgas (elimina)\n" +#~ "Todos los Jobs de un Cliente o Volumen sin tener en cuenta\n" +#~ "los periodos de retención. Normalmente debería utilizar el\n" +#~ "comando PRUNE, que respecta los plazos de retención.\n" -#: src/dird/ua_query.c:74 -msgid "Choose a query" -msgstr "Elija una consulta" +#~ msgid "Choose item to purge" +#~ msgstr "Elija el ítem para purgar" -#: src/dird/ua_query.c:88 -msgid "Could not find query.\n" -msgstr "No se pudo encontrar la consulta.\n" +#~ msgid "Begin purging files for Client \"%s\"\n" +#~ msgstr "Iniciando purga de archivos para Cliente \"%s\"\n" -#: src/dird/ua_query.c:106 -msgid "Too many prompts in query, max is 9.\n" -msgstr "Demasiadas consolas en consulta, máximo es 9.\n" +#~ msgid "No Files found for client %s to purge from %s catalog.\n" +#~ msgstr "" +#~ "No encuentra los archivos del cliente %s para purgar %s del catálogo.\n" -#: src/dird/ua_query.c:209 -#, c-format -msgid "Warning prompt %d missing.\n" -msgstr "Alerta de consola %d perdida.\n" +#~ msgid "Files for %d Jobs for client \"%s\" purged from %s catalog.\n" +#~ msgstr "" +#~ "Archivos para Jobs %d para cliente \"%s\" purgado del catalogo %s.\n" -#: src/dird/ua_query.c:254 -msgid "" -"Entering SQL query mode.\n" -"Terminate each query with a semicolon.\n" -"Terminate query mode with a blank line.\n" -msgstr "" -"Entrando en modo de consulta SQL.\n" -"Termine cada consulta con un punto-coma.\n" -"Termine el modo de consulta con una linea en blanco.\n" +#~ msgid "Begin purging jobs from Client \"%s\"\n" +#~ msgstr "Iniciando purga de jobs para Cliente \"%s\"\n" -#: src/dird/ua_query.c:257 src/dird/ua_query.c:273 -msgid "Enter SQL query: " -msgstr "Ingrese una consulta SQL:" +#~ msgid "%d Jobs for client %s purged from %s catalog.\n" +#~ msgstr "Jobs %d para cliente \"%s\" purgado del catalogo %s.\n" -#: src/dird/ua_query.c:275 -msgid "Add to SQL query: " -msgstr "Agregar a la consulta SQL:" +#~ msgid "" +#~ "\n" +#~ "Volume \"%s\" has VolStatus \"%s\" and cannot be purged.\n" +#~ "The VolStatus must be: Append, Full, Used, or Error to be purged.\n" +#~ msgstr "" +#~ "\n" +#~ "Volumen \"%s\" tiene VolStatus \"%s\" y no puede ser purgado.\n" +#~ "El VolStatus debe ser: Añadir, Lleno, Usado, o Error para ser purgado.\n" -#: src/dird/ua_query.c:278 -msgid "End query mode.\n" -msgstr "Fin modo de consulta.\n" +#~ msgid "%d File%s on Volume \"%s\" purged from catalog.\n" +#~ msgstr "%d Archivo%s en Volumen \"%s\" purgado desde el catalogo.\n" -#: src/dird/ua_restore.c:295 -msgid "\"RegexWhere\" specification not authorized.\n" -msgstr "\"RegexWhere\" especificación no autorizada.\n" +#~ msgid "" +#~ "There are no more Jobs associated with Volume \"%s\". Marking it purged.\n" +#~ msgstr "" +#~ "No hay más Jobs relacionados con Volumen \"%s\". Marcando el para " +#~ "purgar.\n" -#: src/dird/ua_restore.c:302 -msgid "\"where\" specification not authorized.\n" -msgstr "especificación \"where\" no autorizada.\n" +#, fuzzy +#~ msgid "Can't update volume size in the catalog\n" +#~ msgstr "Se creó un Volumen nuevo \"%s\" en el catálogo.\n" -#: src/dird/ua_restore.c:320 -msgid "" -"No Restore Job Resource found in bacula-dir.conf.\n" -"You must create at least one before running this command.\n" -msgstr "" -"Recurso Job de Restauración no encontrado en bacula-dir.conf.\n" -"Usted debe crear al menos uno antes de ejecutar este comando.\n" +#, fuzzy +#~ msgid "Unable to truncate volume \"%s\"\n" +#~ msgstr "No se puede truncar el dispositivo %s. ERR=%s\n" -#: src/dird/ua_restore.c:337 -msgid "Restore not done.\n" -msgstr "Restauración no hecha.\n" +#, fuzzy +#~ msgid "No Volumes found to perform \"truncate\" command.\n" +#~ msgstr "No encontraron volúmenes para etiquetar, o sin códigos de barras.\n" -#: src/dird/ua_restore.c:348 -msgid "Unable to construct a valid BSR. Cannot continue.\n" -msgstr "No se puede construir un BSR válido. No puede continuar.\n" +#~ msgid "Unable move recycled Volume in full Pool \"%s\" MaxVols=%d\n" +#~ msgstr "" +#~ "No se puede mover el Volumen reciclado en full Pool \"%s\" MaxVols=%d\n" -#: src/dird/ua_restore.c:352 src/dird/ua_restore.c:366 -msgid "No files selected to be restored.\n" -msgstr "No hay archivos seleccionados para ser restaurado.\n" +#~ msgid "All records pruned from Volume \"%s\"; marking it \"Purged\"\n" +#~ msgstr "" +#~ "Todos los registros del Volumen \"%s\" podados; marcando el \"Purgados\"\n" -#: src/dird/ua_restore.c:356 -#, c-format -msgid "Bootstrap records written to %s\n" -msgstr "Registros Bootstrap escritos para %s\n" +#~ msgid "Cannot purge Volume with VolStatus=%s\n" +#~ msgstr "No se puede purgar Volumen con VolStatus=%s\n" -#: src/dird/ua_restore.c:360 -msgid "" -"\n" -"1 file selected to be restored.\n" -"\n" -msgstr "" -"\n" -"1 archivo seleccionado para ser restaurado.\n" -"\n" +#~ msgid "Could not open %s: ERR=%s\n" +#~ msgstr "No se pudo abrir %s: ERR=%s\n" -#: src/dird/ua_restore.c:362 -#, c-format -msgid "" -"\n" -"%s files selected to be restored.\n" -"\n" -msgstr "" -"\n" -"%s archivos seleccionados para ser restaurado.\n" -"\n" +#~ msgid "Available queries:\n" +#~ msgstr "Consultas disponibles:\n" -#: src/dird/ua_restore.c:381 -msgid "No Client resource found!\n" -msgstr "Ningún recurso Cliente encontrado!\n" +#~ msgid "Choose a query" +#~ msgstr "Elija una consulta" -#: src/dird/ua_restore.c:499 -#, fuzzy -msgid "The restore will use the following job(s) as Base\n" -msgstr "Usted ha seleccionado los siguientes JobIds: %s\n" +#~ msgid "Could not find query.\n" +#~ msgstr "No se pudo encontrar la consulta.\n" -#: src/dird/ua_restore.c:532 -#, c-format -msgid "Missing value for keyword: %s\n" -msgstr "Falta el valor de palabra clave: %s\n" +#~ msgid "Too many prompts in query, max is 9.\n" +#~ msgstr "Demasiadas consolas en consulta, máximo es 9.\n" -#: src/dird/ua_restore.c:612 -msgid "List last 20 Jobs run" -msgstr "Listar los Últimos 20 Jobs ejecutados" +#~ msgid "Warning prompt %d missing.\n" +#~ msgstr "Alerta de consola %d perdida.\n" -#: src/dird/ua_restore.c:613 -msgid "List Jobs where a given File is saved" -msgstr "Listado de Jobs donde un determinado archivo se ha guardado" +#~ msgid "" +#~ "Entering SQL query mode.\n" +#~ "Terminate each query with a semicolon.\n" +#~ "Terminate query mode with a blank line.\n" +#~ msgstr "" +#~ "Entrando en modo de consulta SQL.\n" +#~ "Termine cada consulta con un punto-coma.\n" +#~ "Termine el modo de consulta con una linea en blanco.\n" -#: src/dird/ua_restore.c:614 -msgid "Enter list of comma separated JobIds to select" -msgstr "Introduzca lista de JobIds separados por comas para seleccionar" +#~ msgid "Enter SQL query: " +#~ msgstr "Ingrese una consulta SQL:" -#: src/dird/ua_restore.c:615 -msgid "Enter SQL list command" -msgstr "Introduzca lista de comandos SQL" +#~ msgid "Add to SQL query: " +#~ msgstr "Agregar a la consulta SQL:" -#: src/dird/ua_restore.c:616 -msgid "Select the most recent backup for a client" -msgstr "Seleccionar el respaldo mas reciente para un cliente" +#~ msgid "End query mode.\n" +#~ msgstr "Fin modo de consulta.\n" -#: src/dird/ua_restore.c:617 -msgid "Select backup for a client before a specified time" -msgstr "" -"Seleccione un respaldo de un cliente antes de un período de tiempo " -"especificado" +#~ msgid "\"RegexWhere\" specification not authorized.\n" +#~ msgstr "\"RegexWhere\" especificación no autorizada.\n" -#: src/dird/ua_restore.c:618 -msgid "Enter a list of files to restore" -msgstr "Introduzca una lista de archivos para restaurar" +#~ msgid "\"where\" specification not authorized.\n" +#~ msgstr "especificación \"where\" no autorizada.\n" -#: src/dird/ua_restore.c:619 -msgid "Enter a list of files to restore before a specified time" -msgstr "" -"Introduzca una lista de archivos para restaurar antes de un período de " -"tiempo especificado" +#~ msgid "" +#~ "No Restore Job Resource found in bacula-dir.conf.\n" +#~ "You must create at least one before running this command.\n" +#~ msgstr "" +#~ "Recurso Job de Restauración no encontrado en bacula-dir.conf.\n" +#~ "Usted debe crear al menos uno antes de ejecutar este comando.\n" -#: src/dird/ua_restore.c:620 -msgid "Find the JobIds of the most recent backup for a client" -msgstr "Encuentre el JobIds del respaldo más reciente para un cliente" +#~ msgid "Restore not done.\n" +#~ msgstr "Restauración no hecha.\n" -#: src/dird/ua_restore.c:621 -msgid "Find the JobIds for a backup for a client before a specified time" -msgstr "" -"Encuentre el JobIds del respaldo de un cliente antes de un período de tiempo " -"especificado" +#~ msgid "Unable to construct a valid BSR. Cannot continue.\n" +#~ msgstr "No se puede construir un BSR válido. No puede continuar.\n" -#: src/dird/ua_restore.c:622 -msgid "Enter a list of directories to restore for found JobIds" -msgstr "" -"Introduzca una lista de directorios para restaurar por JobIds encontrado" +#~ msgid "No files selected to be restored.\n" +#~ msgstr "No hay archivos seleccionados para ser restaurado.\n" -#: src/dird/ua_restore.c:623 -msgid "Select full restore to a specified Job date" -msgstr "Seleccione restauración completa para una fecha especifica de Job" +#~ msgid "Bootstrap records written to %s\n" +#~ msgstr "Registros Bootstrap escritos para %s\n" -#: src/dird/ua_restore.c:624 src/dird/ua_status.c:1213 src/lib/status.h:120 -msgid "Cancel" -msgstr "Cancelar" +#~ msgid "" +#~ "\n" +#~ "1 file selected to be restored.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "1 archivo seleccionado para ser restaurado.\n" +#~ "\n" -#: src/dird/ua_restore.c:671 -#, c-format -msgid "Unknown keyword: %s\n" -msgstr "Palabra clave desconocida: %s\n" +#~ msgid "" +#~ "\n" +#~ "%s files selected to be restored.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "%s archivos seleccionados para ser restaurado.\n" +#~ "\n" -#: src/dird/ua_restore.c:700 src/dird/ua_update.c:947 -#, c-format -msgid "Improper date format: %s\n" -msgstr "Inadecuado formato de fecha: %s\n" +#~ msgid "No Client resource found!\n" +#~ msgstr "Ningún recurso Cliente encontrado!\n" -#: src/dird/ua_restore.c:735 src/dird/ua_select.c:770 -#, c-format -msgid "Error: Pool resource \"%s\" does not exist.\n" -msgstr "Error: recurso Pool \"%s\" no existe.\n" +#, fuzzy +#~ msgid "The restore will use the following job(s) as Base\n" +#~ msgstr "Usted ha seleccionado los siguientes JobIds: %s\n" -#: src/dird/ua_restore.c:740 -#, c-format -msgid "Error: Pool resource \"%s\" access not allowed.\n" -msgstr "Error: recurso Pool \"%s\" acceso no permitido.\n" +#~ msgid "Missing value for keyword: %s\n" +#~ msgstr "Falta el valor de palabra clave: %s\n" -#: src/dird/ua_restore.c:756 -msgid "" -"\n" -"First you select one or more JobIds that contain files\n" -"to be restored. You will be presented several methods\n" -"of specifying the JobIds. Then you will be allowed to\n" -"select which files from those JobIds are to be restored.\n" -"\n" -msgstr "" -"\n" -"Primero debe seleccionar una o más JobIds que contienen archivos\n" -"para ser restaurado.Se le presentará varios métodos\n" -"para especificar los JobIDs. Luego se le permitirá seleccionar los archivos " -"de los JobIds que deben ser restaurados.\n" -"\n" +#~ msgid "List last 20 Jobs run" +#~ msgstr "Listar los Últimos 20 Jobs ejecutados" -#: src/dird/ua_restore.c:769 -msgid "To select the JobIds, you have the following choices:\n" -msgstr "" -"Para seleccionar el JobIds, usted dispone de las siguientes opciones:\n" +#~ msgid "List Jobs where a given File is saved" +#~ msgstr "Listado de Jobs donde un determinado archivo se ha guardado" -#: src/dird/ua_restore.c:774 -msgid "Select item: " -msgstr "Seleccione un ítem:" +#~ msgid "Enter list of comma separated JobIds to select" +#~ msgstr "Introduzca lista de JobIds separados por comas para seleccionar" -#: src/dird/ua_restore.c:779 src/dird/ua_restore.c:814 -msgid "SQL query not authorized.\n" -msgstr "Consulta SQL no autorizada.\n" +#~ msgid "Enter SQL list command" +#~ msgstr "Introduzca lista de comandos SQL" -#: src/dird/ua_restore.c:792 -msgid "Enter Filename (no path):" -msgstr "Introduzca Nombre de Archivo (sin ruta):" +#~ msgid "Select the most recent backup for a client" +#~ msgstr "Seleccionar el respaldo mas reciente para un cliente" -#: src/dird/ua_restore.c:807 src/dird/ua_restore.c:915 -msgid "Enter JobId(s), comma separated, to restore: " -msgstr "Introduzca JobId(s), separados por comas, para restaurar:" +#~ msgid "Select backup for a client before a specified time" +#~ msgstr "" +#~ "Seleccione un respaldo de un cliente antes de un período de tiempo " +#~ "especificado" -#: src/dird/ua_restore.c:817 -msgid "Enter SQL list command: " -msgstr "Introduzca lista de comandos SQL:" +#~ msgid "Enter a list of files to restore" +#~ msgstr "Introduzca una lista de archivos para restaurar" -#: src/dird/ua_restore.c:851 src/dird/ua_restore.c:874 -msgid "" -"Enter file names with paths, or < to enter a filename\n" -"containing a list of file names with paths, and terminate\n" -"them with a blank line.\n" -msgstr "" -"Escriba los nombres de archivo con las rutas, o < para introducir un nombre " -"de archivo\n" -"conteniendo una lista de nombres de archivo con las rutas, y terminado\n" -"con una línea en blanco.\n" +#~ msgid "Enter a list of files to restore before a specified time" +#~ msgstr "" +#~ "Introduzca una lista de archivos para restaurar antes de un período de " +#~ "tiempo especificado" -#: src/dird/ua_restore.c:855 src/dird/ua_restore.c:878 -msgid "Enter full filename: " -msgstr "Introduzca el nombre de archivo completo:" +#~ msgid "Find the JobIds of the most recent backup for a client" +#~ msgstr "Encuentre el JobIds del respaldo más reciente para un cliente" -#: src/dird/ua_restore.c:913 -#, c-format -msgid "You have already selected the following JobIds: %s\n" -msgstr "Usted ya ha seleccionado los siguientes JobIds: %s\n" +#~ msgid "Find the JobIds for a backup for a client before a specified time" +#~ msgstr "" +#~ "Encuentre el JobIds del respaldo de un cliente antes de un período de " +#~ "tiempo especificado" -#: src/dird/ua_restore.c:931 -msgid "" -"Enter full directory names or start the name\n" -"with a < to indicate it is a filename containing a list\n" -"of directories and terminate them with a blank line.\n" -msgstr "" -"Escriba los nombres de directorio completo o inicie el nombre\n" -" con un < para indicar que es un nombre de archivo que contiene una lista\n" -"de directorios y terminado con una línea en blanco.\n" +#~ msgid "Enter a list of directories to restore for found JobIds" +#~ msgstr "" +#~ "Introduzca una lista de directorios para restaurar por JobIds encontrado" -#: src/dird/ua_restore.c:935 -msgid "Enter directory name: " -msgstr "Introduzca nombre de directorio:" +#~ msgid "Select full restore to a specified Job date" +#~ msgstr "Seleccione restauración completa para una fecha especifica de Job" -#: src/dird/ua_restore.c:951 -msgid "Enter JobId to get the state to restore: " -msgstr "Introduzca JobId para obtener el estado para restaurar:" +#~ msgid "Unknown keyword: %s\n" +#~ msgstr "Palabra clave desconocida: %s\n" -#: src/dird/ua_restore.c:964 src/dird/vbackup.c:146 -#, c-format -msgid "Selecting jobs to build the Full state at %s\n" -msgstr "Seleccionando trabajos para construir el estado completo en %s\n" +#~ msgid "Improper date format: %s\n" +#~ msgstr "Inadecuado formato de fecha: %s\n" -#: src/dird/ua_restore.c:990 -msgid "Invalid JobId in list.\n" -msgstr "JobId inválido en la lista.\n" +#~ msgid "Error: Pool resource \"%s\" does not exist.\n" +#~ msgstr "Error: recurso Pool \"%s\" no existe.\n" -#: src/dird/ua_restore.c:1009 -#, c-format -msgid "Access to JobId=%s (Job \"%s\") not authorized. Not selected.\n" -msgstr "Acceso al JobId=%s (Job \"%s\") no autorizado. No seleccionado.\n" +#~ msgid "Error: Pool resource \"%s\" access not allowed.\n" +#~ msgstr "Error: recurso Pool \"%s\" acceso no permitido.\n" -#: src/dird/ua_restore.c:1022 -msgid "No Jobs selected.\n" -msgstr "Jobs no seleccionados.\n" +#~ msgid "" +#~ "\n" +#~ "First you select one or more JobIds that contain files\n" +#~ "to be restored. You will be presented several methods\n" +#~ "of specifying the JobIds. Then you will be allowed to\n" +#~ "select which files from those JobIds are to be restored.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Primero debe seleccionar una o más JobIds que contienen archivos\n" +#~ "para ser restaurado.Se le presentará varios métodos\n" +#~ "para especificar los JobIDs. Luego se le permitirá seleccionar los " +#~ "archivos de los JobIds que deben ser restaurados.\n" +#~ "\n" -#: src/dird/ua_restore.c:1027 -#, c-format -msgid "You have selected the following JobIds: %s\n" -msgstr "Usted ha seleccionado los siguientes JobIds: %s\n" +#~ msgid "To select the JobIds, you have the following choices:\n" +#~ msgstr "" +#~ "Para seleccionar el JobIds, usted dispone de las siguientes opciones:\n" -#: src/dird/ua_restore.c:1029 -#, c-format -msgid "You have selected the following JobId: %s\n" -msgstr "Usted ha seleccionado el siguiente JobId: %s\n" +#~ msgid "Select item: " +#~ msgstr "Seleccione un ítem:" -#: src/dird/ua_restore.c:1039 -msgid "" -"The restored files will the most current backup\n" -"BEFORE the date you specify below.\n" -"\n" -msgstr "" -"Los archivos restaurados serán los más actuales respaldados\n" -"ANTES de la fecha especificada a continuación.\n" -"\n" +#~ msgid "SQL query not authorized.\n" +#~ msgstr "Consulta SQL no autorizada.\n" -#: src/dird/ua_restore.c:1042 -msgid "Enter date as YYYY-MM-DD HH:MM:SS :" -msgstr "Introduzca la fecha en formato YYYY-MM-DD HH:MM:SS :" +#~ msgid "Enter Filename (no path):" +#~ msgstr "Introduzca Nombre de Archivo (sin ruta):" -#: src/dird/ua_restore.c:1048 -msgid "Improper date format.\n" -msgstr "Inadecuado formato de fecha.\n" +#~ msgid "Enter JobId(s), comma separated, to restore: " +#~ msgstr "Introduzca JobId(s), separados por comas, para restaurar:" -#: src/dird/ua_restore.c:1069 -#, c-format -msgid "Cannot open file %s: ERR=%s\n" -msgstr "No se puede abrir el archivo %s: ERR=%s\n" +#~ msgid "Enter SQL list command: " +#~ msgstr "Introduzca lista de comandos SQL:" -#: src/dird/ua_restore.c:1077 src/dird/ua_restore.c:1081 -#, c-format -msgid "Error occurred on line %d of file \"%s\"\n" -msgstr "Se ha producido un error en la línea %d del archivo \"%s\"\n" +#~ msgid "" +#~ "Enter file names with paths, or < to enter a filename\n" +#~ "containing a list of file names with paths, and terminate\n" +#~ "them with a blank line.\n" +#~ msgstr "" +#~ "Escriba los nombres de archivo con las rutas, o < para introducir un " +#~ "nombre de archivo\n" +#~ "conteniendo una lista de nombres de archivo con las rutas, y terminado\n" +#~ "con una línea en blanco.\n" -#: src/dird/ua_restore.c:1125 src/dird/ua_restore.c:1153 -#, c-format -msgid "No database record found for: %s\n" -msgstr "No encuentra registro en base de datos para: %s\n" +#~ msgid "Enter full filename: " +#~ msgstr "Introduzca el nombre de archivo completo:" -#: src/dird/ua_restore.c:1141 -msgid "No JobId specified cannot continue.\n" -msgstr "JobId no especificado, imposible continuar.\n" +#~ msgid "You have already selected the following JobIds: %s\n" +#~ msgstr "Usted ya ha seleccionado los siguientes JobIds: %s\n" -#: src/dird/ua_restore.c:1174 -#, c-format -msgid "No table found: %s\n" -msgstr "Tabla no encontrada: %s\n" +#~ msgid "" +#~ "Enter full directory names or start the name\n" +#~ "with a < to indicate it is a filename containing a list\n" +#~ "of directories and terminate them with a blank line.\n" +#~ msgstr "" +#~ "Escriba los nombres de directorio completo o inicie el nombre\n" +#~ " con un < para indicar que es un nombre de archivo que contiene una " +#~ "lista\n" +#~ "de directorios y terminado con una línea en blanco.\n" -#: src/dird/ua_restore.c:1232 -msgid "" -"\n" -"\n" -"For one or more of the JobIds selected, no files were found,\n" -"so file selection is not possible.\n" -"Most likely your retention policy pruned the files.\n" -msgstr "" -"\n" -"\n" -"Para uno o más de los JobIds seleccionado, no se encontraron archivos,\n" -"por lo tanto, selección de archivos no es posible.\n" -"El mas probable es que su política de retención podo los archivos.\n" +#~ msgid "Enter directory name: " +#~ msgstr "Introduzca nombre de directorio:" -#: src/dird/ua_restore.c:1235 -msgid "" -"\n" -"Do you want to restore all the files? (yes|no): " -msgstr "" -"\n" -"Desea restaurar todos los archivos? (sí­|no):" +#~ msgid "Enter JobId to get the state to restore: " +#~ msgstr "Introduzca JobId para obtener el estado para restaurar:" -#: src/dird/ua_restore.c:1238 -msgid "" -"\n" -"Regexp matching files to restore? (empty to abort): " -msgstr "" -"\n" -"Regexp para restaurar los archivos que coinciden? (vacío para abortar):" +#~ msgid "Selecting jobs to build the Full state at %s\n" +#~ msgstr "Seleccionando trabajos para construir el estado completo en %s\n" -#: src/dird/ua_restore.c:1254 -#, c-format -msgid "Regex compile error: %s\n" -msgstr "Error de compilación Regex: %s\n" +#~ msgid "Invalid JobId in list.\n" +#~ msgstr "JobId inválido en la lista.\n" -#: src/dird/ua_restore.c:1297 -#, fuzzy, c-format -msgid "Unable to create component file %s. ERR=%s\n" -msgstr "No se puede crear el archivo bootstrap %s. ERR=%s\n" +#~ msgid "Access to JobId=%s (Job \"%s\") not authorized. Not selected.\n" +#~ msgstr "Acceso al JobId=%s (Job \"%s\") no autorizado. No seleccionado.\n" -#: src/dird/ua_restore.c:1304 -#, fuzzy, c-format -msgid "Unable to fdopen component file %s. ERR=%s\n" -msgstr "No se puede abrir el archivo \"%s\": ERR=%s\n" +#~ msgid "No Jobs selected.\n" +#~ msgstr "Jobs no seleccionados.\n" -#: src/dird/ua_restore.c:1311 -#, fuzzy -msgid "Error writing component file.\n" -msgstr "Error escribiendo archivo bsr.\n" +#~ msgid "You have selected the following JobIds: %s\n" +#~ msgstr "Usted ha seleccionado los siguientes JobIds: %s\n" -#: src/dird/ua_restore.c:1356 -#, c-format -msgid "" -"\n" -"Building directory tree for JobId(s) %s ... " -msgstr "" -"\n" -"Construyendo árbol de directorios para JobId(s) %s ..." +#~ msgid "You have selected the following JobId: %s\n" +#~ msgstr "Usted ha seleccionado el siguiente JobId: %s\n" -#: src/dird/ua_restore.c:1426 -#, c-format -msgid "" -"\n" -"%s files inserted into the tree and marked for extraction.\n" -msgstr "" -"\n" -"%s archivos insertados en el árbol y marcados para la extracción.\n" +#~ msgid "" +#~ "The restored files will the most current backup\n" +#~ "BEFORE the date you specify below.\n" +#~ "\n" +#~ msgstr "" +#~ "Los archivos restaurados serán los más actuales respaldados\n" +#~ "ANTES de la fecha especificada a continuación.\n" +#~ "\n" -#: src/dird/ua_restore.c:1429 -#, c-format -msgid "" -"\n" -"%s files inserted into the tree.\n" -msgstr "" -"\n" -"%s archivos insertados en el árbol.\n" +#~ msgid "Enter date as YYYY-MM-DD HH:MM:SS :" +#~ msgstr "Introduzca la fecha en formato YYYY-MM-DD HH:MM:SS :" -#: src/dird/ua_restore.c:1517 -#, c-format -msgid "Error getting FileSet \"%s\": ERR=%s\n" -msgstr "Error al obtener FileSet \"%s\": ERR=%s\n" +#~ msgid "Improper date format.\n" +#~ msgstr "Inadecuado formato de fecha.\n" -#: src/dird/ua_restore.c:1522 -#, fuzzy, c-format -msgid "FileSet argument: %s\n" -msgstr "FileSet: nombre=%s\n" +#~ msgid "Cannot open file %s: ERR=%s\n" +#~ msgstr "No se puede abrir el archivo %s: ERR=%s\n" -#: src/dird/ua_restore.c:1528 src/dird/ua_select.c:204 -msgid "The defined FileSet resources are:\n" -msgstr "Los recursos FileSet definidos son:\n" +#~ msgid "Error occurred on line %d of file \"%s\"\n" +#~ msgstr "Se ha producido un error en la línea %d del archivo \"%s\"\n" -#: src/dird/ua_restore.c:1532 src/dird/ua_run.c:1014 src/dird/ua_select.c:212 -msgid "FileSet" -msgstr "FileSet" +#~ msgid "No database record found for: %s\n" +#~ msgstr "No encuentra registro en base de datos para: %s\n" -#: src/dird/ua_restore.c:1532 src/dird/ua_select.c:212 -msgid "Select FileSet resource" -msgstr "Seleccionar recurso FileSet" +#~ msgid "No JobId specified cannot continue.\n" +#~ msgstr "JobId no especificado, imposible continuar.\n" -#: src/dird/ua_restore.c:1534 -#, c-format -msgid "No FileSet found for client \"%s\".\n" -msgstr "FileSet para cliente \"%s\" no encontrado.\n" +#~ msgid "No table found: %s\n" +#~ msgstr "Tabla no encontrada: %s\n" -#: src/dird/ua_restore.c:1540 -#, c-format -msgid "Error getting FileSet record: %s\n" -msgstr "Error al obtener el registro FileSet: %s\n" +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "For one or more of the JobIds selected, no files were found,\n" +#~ "so file selection is not possible.\n" +#~ "Most likely your retention policy pruned the files.\n" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "Para uno o más de los JobIds seleccionado, no se encontraron archivos,\n" +#~ "por lo tanto, selección de archivos no es posible.\n" +#~ "El mas probable es que su política de retención podo los archivos.\n" -#: src/dird/ua_restore.c:1541 -msgid "" -"This probably means you modified the FileSet.\n" -"Continuing anyway.\n" -msgstr "" -"Esto probablemente significa que usted modifico el FileSet.\n" -"Continuando de todos modos.\n" +#~ msgid "" +#~ "\n" +#~ "Do you want to restore all the files? (yes|no): " +#~ msgstr "" +#~ "\n" +#~ "Desea restaurar todos los archivos? (sí­|no):" -#: src/dird/ua_restore.c:1556 -#, c-format -msgid "Pool \"%s\" not found, using any pool.\n" -msgstr "Pool \"%s\" no encontrado, utilizando cualquier pool.\n" +#~ msgid "" +#~ "\n" +#~ "Regexp matching files to restore? (empty to abort): " +#~ msgstr "" +#~ "\n" +#~ "Regexp para restaurar los archivos que coinciden? (vacío para abortar):" -#: src/dird/ua_restore.c:1583 src/dird/ua_restore.c:1599 -#, c-format -msgid "No Full backup before %s found.\n" -msgstr "Full Backup no encontrado antes de %s.\n" +#~ msgid "Regex compile error: %s\n" +#~ msgstr "Error de compilación Regex: %s\n" -#: src/dird/ua_restore.c:1628 -msgid "No jobs found.\n" -msgstr "Jobs no encontrados.\n" +#, fuzzy +#~ msgid "Unable to create component file %s. ERR=%s\n" +#~ msgstr "No se puede crear el archivo bootstrap %s. ERR=%s\n" -#: src/dird/ua_restore.c:1763 -#, fuzzy, c-format -msgid "" -"\n" -"Warning Storage is overridden by \"%s\" on the command line.\n" -msgstr "" -"Advertencia, storage por defecto reemplazada por \"%s\" en la línea de " -"comandos.\n" +#, fuzzy +#~ msgid "Unable to fdopen component file %s. ERR=%s\n" +#~ msgstr "No se puede abrir el archivo \"%s\": ERR=%s\n" -#: src/dird/ua_restore.c:1768 -#, c-format -msgid "" -"This may not work because of two different MediaTypes:\n" -" Storage MediaType=\"%s\"\n" -" Volume MediaType=\"%s\".\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "Error writing component file.\n" +#~ msgstr "Error escribiendo archivo bsr.\n" -#: src/dird/ua_restore.c:1787 -#, fuzzy, c-format -msgid "Using Storage \"%s\" from MediaType \"%s\".\n" -msgstr "" -"Storage \"%s\" no encontrado, usando Storage \"%s\" desde MediaType\"%s\".\n" +#~ msgid "" +#~ "\n" +#~ "Building directory tree for JobId(s) %s ... " +#~ msgstr "" +#~ "\n" +#~ "Construyendo árbol de directorios para JobId(s) %s ..." -#: src/dird/ua_restore.c:1790 -#, c-format -msgid "Storage \"%s\" not found, using Storage \"%s\" from MediaType \"%s\".\n" -msgstr "" -"Storage \"%s\" no encontrado, usando Storage \"%s\" desde MediaType\"%s\".\n" +#~ msgid "" +#~ "\n" +#~ "%s files inserted into the tree and marked for extraction.\n" +#~ msgstr "" +#~ "\n" +#~ "%s archivos insertados en el árbol y marcados para la extracción.\n" -#: src/dird/ua_restore.c:1799 -#, c-format -msgid "" -"\n" -"Unable to find Storage resource for\n" -"MediaType \"%s\", needed by the Jobs you selected.\n" -msgstr "" -"\n" -"No se puede encontrar los recursos Storage para\n" -"MediaType \"%s\", necesario por los Jobs que ha seleccionado.\n" +#~ msgid "" +#~ "\n" +#~ "%s files inserted into the tree.\n" +#~ msgstr "" +#~ "\n" +#~ "%s archivos insertados en el árbol.\n" -#: src/dird/ua_run.c:165 -msgid "OK to run? (yes/mod/no): " -msgstr "OK para ejecutar? (si/mod/no): " +#~ msgid "Error getting FileSet \"%s\": ERR=%s\n" +#~ msgstr "Error al obtener FileSet \"%s\": ERR=%s\n" -#: src/dird/ua_run.c:194 -#, fuzzy, c-format -msgid "" -"\n" -"Bad response: %s. You must answer yes, mod, or no.\n" -"\n" -msgstr "Respuesta no válida. Usted tiene que contestar sí o no.\n" +#, fuzzy +#~ msgid "FileSet argument: %s\n" +#~ msgstr "FileSet: nombre=%s\n" -#: src/dird/ua_run.c:198 -msgid "Job not run.\n" -msgstr "Job no ejecutando.\n" +#~ msgid "The defined FileSet resources are:\n" +#~ msgstr "Los recursos FileSet definidos son:\n" -#: src/dird/ua_run.c:237 -msgid "Job failed.\n" -msgstr "Job fallido.\n" +#~ msgid "FileSet" +#~ msgstr "FileSet" -#: src/dird/ua_run.c:240 -#, c-format -msgid "Job queued. JobId=%s\n" -msgstr "Cola de Job. JobId=%s\n" +#~ msgid "Select FileSet resource" +#~ msgstr "Seleccionar recurso FileSet" -#: src/dird/ua_run.c:258 -#, c-format -msgid "Job \"%s\" not found\n" -msgstr "Job \"%s\" no encontrado\n" +#~ msgid "No FileSet found for client \"%s\".\n" +#~ msgstr "FileSet para cliente \"%s\" no encontrado.\n" -#: src/dird/ua_run.c:265 -msgid "A job name must be specified.\n" -msgstr "Un nombre de job debe de ser especificado.\n" +#~ msgid "Error getting FileSet record: %s\n" +#~ msgstr "Error al obtener el registro FileSet: %s\n" -#: src/dird/ua_run.c:271 -#, c-format -msgid "No authorization. Job \"%s\".\n" -msgstr "Sin autorización. Job \"%s\".\n" +#~ msgid "" +#~ "This probably means you modified the FileSet.\n" +#~ "Continuing anyway.\n" +#~ msgstr "" +#~ "Esto probablemente significa que usted modifico el FileSet.\n" +#~ "Continuando de todos modos.\n" -#: src/dird/ua_run.c:289 -#, c-format -msgid "Pool \"%s\" not found.\n" -msgstr "Pool \"%s\" no encontrado.\n" +#~ msgid "Pool \"%s\" not found, using any pool.\n" +#~ msgstr "Pool \"%s\" no encontrado, utilizando cualquier pool.\n" -#: src/dird/ua_run.c:299 -#, c-format -msgid "No authorization. Pool \"%s\".\n" -msgstr "Sin autorización. Pool \"%s\".\n" +#~ msgid "No Full backup before %s found.\n" +#~ msgstr "Full Backup no encontrado antes de %s.\n" -#: src/dird/ua_run.c:313 -#, fuzzy, c-format -msgid "NextPool \"%s\" not found.\n" -msgstr "Pool \"%s\" no encontrado.\n" +#~ msgid "No jobs found.\n" +#~ msgstr "Jobs no encontrados.\n" -#: src/dird/ua_run.c:322 -#, fuzzy, c-format -msgid "No authorization. NextPool \"%s\".\n" -msgstr "Sin autorización. Pool \"%s\".\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Warning Storage is overridden by \"%s\" on the command line.\n" +#~ msgstr "" +#~ "Advertencia, storage por defecto reemplazada por \"%s\" en la línea de " +#~ "comandos.\n" -#: src/dird/ua_run.c:353 src/dird/ua_run.c:373 -#, c-format -msgid "No authorization. Client \"%s\".\n" -msgstr "Sin autorización. Cliente \"%s\".\n" +#, fuzzy +#~ msgid "Using Storage \"%s\" from MediaType \"%s\".\n" +#~ msgstr "" +#~ "Storage \"%s\" no encontrado, usando Storage \"%s\" desde MediaType\"%s" +#~ "\".\n" -#: src/dird/ua_run.c:363 -#, c-format -msgid "Restore Client \"%s\" not found.\n" -msgstr "Restaurar Cliente \"%s\" no encontrado.\n" +#~ msgid "" +#~ "Storage \"%s\" not found, using Storage \"%s\" from MediaType \"%s\".\n" +#~ msgstr "" +#~ "Storage \"%s\" no encontrado, usando Storage \"%s\" desde MediaType\"%s" +#~ "\".\n" -#: src/dird/ua_run.c:392 -#, c-format -msgid "FileSet \"%s\" not found.\n" -msgstr "FileSet \"%s\" no encontrado.\n" +#~ msgid "" +#~ "\n" +#~ "Unable to find Storage resource for\n" +#~ "MediaType \"%s\", needed by the Jobs you selected.\n" +#~ msgstr "" +#~ "\n" +#~ "No se puede encontrar los recursos Storage para\n" +#~ "MediaType \"%s\", necesario por los Jobs que ha seleccionado.\n" -#: src/dird/ua_run.c:401 -#, c-format -msgid "No authorization. FileSet \"%s\".\n" -msgstr "Sin autorización. FileSet \"%s\".\n" +#~ msgid "OK to run? (yes/mod/no): " +#~ msgstr "OK para ejecutar? (si/mod/no): " -#: src/dird/ua_run.c:420 -#, c-format -msgid "Storage \"%s\" not found.\n" -msgstr "Storage \"%s\" no encontrado\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Bad response: %s. You must answer yes, mod, or no.\n" +#~ "\n" +#~ msgstr "Respuesta no válida. Usted tiene que contestar sí o no.\n" -#: src/dird/ua_run.c:423 src/dird/ua_run.c:1054 -msgid "user selection" -msgstr "Selección de usuario" +#~ msgid "Job not run.\n" +#~ msgstr "Job no ejecutando.\n" -#: src/dird/ua_run.c:432 -#, c-format -msgid "No authorization. Storage \"%s\".\n" -msgstr "Sin autorización. Storage \"%s\".\n" +#~ msgid "Job failed.\n" +#~ msgstr "Job fallido.\n" -#: src/dird/ua_run.c:456 -#, fuzzy -msgid "No JobId specified.\n" -msgstr "Job no especificado.\n" +#~ msgid "Job queued. JobId=%s\n" +#~ msgstr "Cola de Job. JobId=%s\n" -#: src/dird/ua_run.c:470 -#, fuzzy -msgid "Invalid or no Job name specified.\n" -msgstr "Nombre del Job especificado dos veces.\n" +#~ msgid "Job \"%s\" not found\n" +#~ msgstr "Job \"%s\" no encontrado\n" -#: src/dird/ua_run.c:485 -#, fuzzy -msgid "Enter the JobId list to select: " -msgstr "Introduzca el JobId para seleccionar:" +#~ msgid "A job name must be specified.\n" +#~ msgstr "Un nombre de job debe de ser especificado.\n" -#: src/dird/ua_run.c:501 -#, c-format -msgid "JobId=%d entered is not in the list.\n" -msgstr "" +#~ msgid "No authorization. Job \"%s\".\n" +#~ msgstr "Sin autorización. Job \"%s\".\n" -#: src/dird/ua_run.c:525 -#, fuzzy, c-format -msgid "Could not get job record for selected JobId=%d. ERR=%s" -msgstr "No se pudo obtener el registro Job para JobId %s para %s. ERR=%s" +#~ msgid "Pool \"%s\" not found.\n" +#~ msgstr "Pool \"%s\" no encontrado.\n" -#: src/dird/ua_run.c:593 src/dird/ua_run.c:846 src/dird/ua_select.c:154 -msgid "You have the following choices:\n" -msgstr "Usted tiene las siguientes opciones:\n" +#~ msgid "No authorization. Pool \"%s\".\n" +#~ msgstr "Sin autorización. Pool \"%s\".\n" -#: src/dird/ua_run.c:597 #, fuzzy -msgid "Select termination code: " -msgstr "Código de Terminación del Job: %d" +#~ msgid "NextPool \"%s\" not found.\n" +#~ msgstr "Pool \"%s\" no encontrado.\n" -#: src/dird/ua_run.c:781 #, fuzzy -msgid "Unable to use current plugin configuration, discarding it." -msgstr "No es posible leer el archivo de configuración" +#~ msgid "No authorization. NextPool \"%s\".\n" +#~ msgstr "Sin autorización. Pool \"%s\".\n" -#: src/dird/ua_run.c:796 -#, fuzzy -msgid "Plugin Restore Options\n" -msgstr "Opciones de Plug-in" +#~ msgid "No authorization. Client \"%s\".\n" +#~ msgstr "Sin autorización. Cliente \"%s\".\n" -#: src/dird/ua_run.c:807 -msgid "*None, but required*" -msgstr "" +#~ msgid "Restore Client \"%s\" not found.\n" +#~ msgstr "Restaurar Cliente \"%s\" no encontrado.\n" -#: src/dird/ua_run.c:827 -#, fuzzy -msgid "Use above plugin configuration? (yes/mod/no): " -msgstr "¿Continuar? (sí/mod/no):" +#~ msgid "FileSet \"%s\" not found.\n" +#~ msgstr "FileSet \"%s\" no encontrado.\n" -#: src/dird/ua_run.c:845 src/dird/ua_run.c:1007 src/dird/ua_select.c:73 -msgid "mod" -msgstr "mod" +#~ msgid "No authorization. FileSet \"%s\".\n" +#~ msgstr "Sin autorización. FileSet \"%s\".\n" -#: src/dird/ua_run.c:869 -#, fuzzy, c-format -msgid "Please enter a value for %s: " -msgstr "Por favor, introduzca un JobId para restaurar:" +#~ msgid "Storage \"%s\" not found.\n" +#~ msgstr "Storage \"%s\" no encontrado\n" -#: src/dird/ua_run.c:943 -msgid "No plugin to configure\n" -msgstr "" +#~ msgid "user selection" +#~ msgstr "Selección de usuario" + +#~ msgid "No authorization. Storage \"%s\".\n" +#~ msgstr "Sin autorización. Storage \"%s\".\n" -#: src/dird/ua_run.c:951 #, fuzzy -msgid "Plugins to configure:\n" -msgstr "Plugin=%s no encontrado.\n" +#~ msgid "No JobId specified.\n" +#~ msgstr "Job no especificado.\n" -#: src/dird/ua_run.c:960 #, fuzzy -msgid "Select plugin to configure" -msgstr "TLS permitido, pero no configurado.\n" +#~ msgid "Invalid or no Job name specified.\n" +#~ msgstr "Nombre del Job especificado dos veces.\n" -#: src/dird/ua_run.c:976 -#, fuzzy, c-format -msgid "Can't configure %32s\n" -msgstr "No se puede continuar.\n" +#, fuzzy +#~ msgid "Enter the JobId list to select: " +#~ msgstr "Introduzca el JobId para seleccionar:" -#: src/dird/ua_run.c:1011 -msgid "Level" -msgstr "Level" +#, fuzzy +#~ msgid "Could not get job record for selected JobId=%d. ERR=%s" +#~ msgstr "No se pudo obtener el registro Job para JobId %s para %s. ERR=%s" -#: src/dird/ua_run.c:1016 -msgid "Restore Client" -msgstr "Restaurar Client" +#~ msgid "You have the following choices:\n" +#~ msgstr "Usted tiene las siguientes opciones:\n" -#: src/dird/ua_run.c:1020 -msgid "When" -msgstr "Cuando " +#, fuzzy +#~ msgid "Select termination code: " +#~ msgstr "Código de Terminación del Job: %d" -#: src/dird/ua_run.c:1021 -msgid "Priority" -msgstr "Prioridad" +#, fuzzy +#~ msgid "Unable to use current plugin configuration, discarding it." +#~ msgstr "No es posible leer el archivo de configuración" -#: src/dird/ua_run.c:1026 src/dird/ua_select.c:633 src/dird/ua_select.c:746 -#: src/dird/ua_update.c:615 -msgid "Pool" -msgstr "Pool" +#, fuzzy +#~ msgid "Plugin Restore Options\n" +#~ msgstr "Opciones de Plug-in" -#: src/dird/ua_run.c:1031 #, fuzzy -msgid "NextPool" -msgstr "Pool" +#~ msgid "Use above plugin configuration? (yes/mod/no): " +#~ msgstr "¿Continuar? (sí/mod/no):" + +#~ msgid "mod" +#~ msgstr "mod" -#: src/dird/ua_run.c:1033 -msgid "Verify Job" -msgstr "Verificar Job" +#, fuzzy +#~ msgid "Please enter a value for %s: " +#~ msgstr "Por favor, introduzca un JobId para restaurar:" -#: src/dird/ua_run.c:1036 -msgid "Bootstrap" -msgstr "Bootstrap" +#, fuzzy +#~ msgid "Plugins to configure:\n" +#~ msgstr "Plugin=%s no encontrado.\n" -#: src/dird/ua_run.c:1037 -msgid "Where" -msgstr "Donde" +#, fuzzy +#~ msgid "Select plugin to configure" +#~ msgstr "TLS permitido, pero no configurado.\n" -#: src/dird/ua_run.c:1038 -msgid "File Relocation" -msgstr "Reubicar Archivo" +#, fuzzy +#~ msgid "Can't configure %32s\n" +#~ msgstr "No se puede continuar.\n" -#: src/dird/ua_run.c:1039 -msgid "Replace" -msgstr "Reemplazar" +#~ msgid "Level" +#~ msgstr "Level" -#: src/dird/ua_run.c:1040 -msgid "JobId" -msgstr "JobId" +#~ msgid "Restore Client" +#~ msgstr "Restaurar Client" -#: src/dird/ua_run.c:1043 -msgid "Plugin Options" -msgstr "Opciones de Plug-in" +#~ msgid "When" +#~ msgstr "Cuando " -#: src/dird/ua_run.c:1086 -msgid "" -"Please enter desired start time as YYYY-MM-DD HH:MM:SS (return for now): " -msgstr "" -"Por favor, introduzca hora de inicio deseada YYYY-MM-DD HH:MM:SS (Enter para " -"ahora)" +#~ msgid "Priority" +#~ msgstr "Prioridad" -#: src/dird/ua_run.c:1094 src/dird/ua_run.c:1311 -msgid "Invalid time, using current time.\n" -msgstr "Hora inválida, usando hora actual.\n" +#~ msgid "Pool" +#~ msgstr "Pool" -#: src/dird/ua_run.c:1101 -msgid "Enter new Priority: " -msgstr "Introduzca nueva prioridad:" +#, fuzzy +#~ msgid "NextPool" +#~ msgstr "Pool" -#: src/dird/ua_run.c:1105 -msgid "Priority must be a positive integer.\n" -msgstr "Prioridad debe ser un entero positivo.\n" +#~ msgid "Verify Job" +#~ msgstr "Verificar Job" -#: src/dird/ua_run.c:1126 -msgid "Please enter the Bootstrap file name: " -msgstr "Por favor, introduzca nombre de archivo Bootstrap:" +#~ msgid "Bootstrap" +#~ msgstr "Bootstrap" -#: src/dird/ua_run.c:1138 -#, c-format -msgid "Warning cannot open %s: ERR=%s\n" -msgstr "Advertencia no puede abrir %s: ERR=%s\n" +#~ msgid "Where" +#~ msgstr "Donde" + +#~ msgid "File Relocation" +#~ msgstr "Reubicar Archivo" + +#~ msgid "Replace" +#~ msgstr "Reemplazar" + +#~ msgid "JobId" +#~ msgstr "JobId" + +#~ msgid "Plugin Options" +#~ msgstr "Opciones de Plug-in" + +#~ msgid "" +#~ "Please enter desired start time as YYYY-MM-DD HH:MM:SS (return for now): " +#~ msgstr "" +#~ "Por favor, introduzca hora de inicio deseada YYYY-MM-DD HH:MM:SS (Enter " +#~ "para ahora)" + +#~ msgid "Invalid time, using current time.\n" +#~ msgstr "Hora inválida, usando hora actual.\n" + +#~ msgid "Enter new Priority: " +#~ msgstr "Introduzca nueva prioridad:" + +#~ msgid "Priority must be a positive integer.\n" +#~ msgstr "Prioridad debe ser un entero positivo.\n" + +#~ msgid "Please enter the Bootstrap file name: " +#~ msgstr "Por favor, introduzca nombre de archivo Bootstrap:" + +#~ msgid "Warning cannot open %s: ERR=%s\n" +#~ msgstr "Advertencia no puede abrir %s: ERR=%s\n" -#: src/dird/ua_run.c:1168 #, fuzzy -msgid "Please enter the full path prefix for restore (/ for none): " -msgstr "" -"Por favor, introduzca el prefijo de ruta para restaurar (/ para ninguno):" +#~ msgid "Please enter the full path prefix for restore (/ for none): " +#~ msgstr "" +#~ "Por favor, introduzca el prefijo de ruta para restaurar (/ para ninguno):" -#: src/dird/ua_run.c:1190 -msgid "Replace:\n" -msgstr "Reemplazar:\n" +#~ msgid "Replace:\n" +#~ msgstr "Reemplazar:\n" -#: src/dird/ua_run.c:1194 -msgid "Select replace option" -msgstr "Seleccione la opción sustituir" +#~ msgid "Select replace option" +#~ msgstr "Seleccione la opción sustituir" -#: src/dird/ua_run.c:1205 -msgid "" -"You must set the bootstrap file to NULL to be able to specify a JobId.\n" -msgstr "" -"Usted debe configurar el archivo bootstrap a NULL para poder especificar un " -"jobId.\n" +#~ msgid "" +#~ "You must set the bootstrap file to NULL to be able to specify a JobId.\n" +#~ msgstr "" +#~ "Usted debe configurar el archivo bootstrap a NULL para poder especificar " +#~ "un jobId.\n" -#: src/dird/ua_run.c:1217 -msgid "Please Plugin Options string: " -msgstr "Por favor, cadena de Opciones de Plugin:" +#~ msgid "Please Plugin Options string: " +#~ msgstr "Por favor, cadena de Opciones de Plugin:" -#: src/dird/ua_run.c:1260 src/dird/ua_run.c:1265 #, fuzzy -msgid "Command input" -msgstr "línea de comandos" +#~ msgid "Command input" +#~ msgstr "línea de comandos" -#: src/dird/ua_run.c:1262 src/dird/ua_run.c:1267 src/dird/ua_run.c:1287 -msgid "User input" -msgstr "Entrada del usuario" +#~ msgid "User input" +#~ msgstr "Entrada del usuario" -#: src/dird/ua_run.c:1350 -#, c-format -msgid "Invalid replace option: %s\n" -msgstr "Opción replace no valida: %s\n" +#~ msgid "Invalid replace option: %s\n" +#~ msgstr "Opción replace no valida: %s\n" -#: src/dird/ua_run.c:1449 -#, c-format -msgid "strip_prefix=%s add_prefix=%s add_suffix=%s\n" -msgstr "strip_prefix=%s add_prefix=%s add_suffix=%s\n" +#~ msgid "strip_prefix=%s add_prefix=%s add_suffix=%s\n" +#~ msgstr "strip_prefix=%s add_prefix=%s add_suffix=%s\n" -#: src/dird/ua_run.c:1452 -msgid "This will replace your current Where value\n" -msgstr "Este sustituirá a su actual valor Donde\n" +#~ msgid "This will replace your current Where value\n" +#~ msgstr "Este sustituirá a su actual valor Donde\n" -#: src/dird/ua_run.c:1453 -msgid "Strip prefix" -msgstr "Eliminar prefijo" +#~ msgid "Strip prefix" +#~ msgstr "Eliminar prefijo" -#: src/dird/ua_run.c:1454 -msgid "Add prefix" -msgstr "Añadir prefijo" +#~ msgid "Add prefix" +#~ msgstr "Añadir prefijo" -#: src/dird/ua_run.c:1455 -msgid "Add file suffix" -msgstr "Añadir sufijo de archivo" +#~ msgid "Add file suffix" +#~ msgstr "Añadir sufijo de archivo" -#: src/dird/ua_run.c:1456 -msgid "Enter a regexp" -msgstr "Introduzca una expresión regular" +#~ msgid "Enter a regexp" +#~ msgstr "Introduzca una expresión regular" -#: src/dird/ua_run.c:1457 -msgid "Test filename manipulation" -msgstr "Prueba de la manipulación de nombre de archivo" +#~ msgid "Test filename manipulation" +#~ msgstr "Prueba de la manipulación de nombre de archivo" -#: src/dird/ua_run.c:1458 -msgid "Use this ?" -msgstr "Usar esto ?" +#~ msgid "Use this ?" +#~ msgstr "Usar esto ?" -#: src/dird/ua_run.c:1463 #, fuzzy -msgid "Please enter the path prefix to strip: " -msgstr "Por favor, introduzca la ruta de prefijo para eliminar:" +#~ msgid "Please enter the path prefix to strip: " +#~ msgstr "Por favor, introduzca la ruta de prefijo para eliminar:" -#: src/dird/ua_run.c:1471 #, fuzzy -msgid "Please enter the path prefix to add (/ for none): " -msgstr "" -"Por favor, introduzca el prefijo de la ruta para añadir (/ para ninguno):" +#~ msgid "Please enter the path prefix to add (/ for none): " +#~ msgstr "" +#~ "Por favor, introduzca el prefijo de la ruta para añadir (/ para ninguno):" -#: src/dird/ua_run.c:1482 #, fuzzy -msgid "Please enter the file suffix to add: " -msgstr "Por favor, introduzca el sufijo de archivo para añadir:" +#~ msgid "Please enter the file suffix to add: " +#~ msgstr "Por favor, introduzca el sufijo de archivo para añadir:" -#: src/dird/ua_run.c:1489 -msgid "Please enter a valid regexp (!from!to!): " -msgstr "Por favor, introduzca una expresión regular válida (!from!to!):" +#~ msgid "Please enter a valid regexp (!from!to!): " +#~ msgstr "Por favor, introduzca una expresión regular válida (!from!to!):" -#: src/dird/ua_run.c:1502 -#, c-format -msgid "regexwhere=%s\n" -msgstr "regexdonde=%s\n" +#~ msgid "regexwhere=%s\n" +#~ msgstr "regexdonde=%s\n" -#: src/dird/ua_run.c:1508 -#, c-format -msgid "strip_prefix=%s add_prefix=%s add_suffix=%s result=%s\n" -msgstr "strip_prefix=%s add_prefix=%s add_suffix=%s resultado=%s\n" +#~ msgid "strip_prefix=%s add_prefix=%s add_suffix=%s result=%s\n" +#~ msgstr "strip_prefix=%s add_prefix=%s add_suffix=%s resultado=%s\n" -#: src/dird/ua_run.c:1515 -msgid "Cannot use your regexp\n" -msgstr "No se pudo utilizar su regexp\n" +#~ msgid "Cannot use your regexp\n" +#~ msgstr "No se pudo utilizar su regexp\n" -#: src/dird/ua_run.c:1518 -msgid "Enter a period (.) to stop this test\n" -msgstr "" +#~ msgid "Please enter filename to test: " +#~ msgstr "Por favor, introduzca el nombre de archivo de prueba:" -#: src/dird/ua_run.c:1519 -msgid "Please enter filename to test: " -msgstr "Por favor, introduzca el nombre de archivo de prueba:" +#~ msgid "%s -> %s\n" +#~ msgstr "%s -> %s\n" -#: src/dird/ua_run.c:1521 -#, c-format -msgid "%s -> %s\n" -msgstr "%s -> %s\n" +#~ msgid "Cannot use your regexp.\n" +#~ msgstr "No puede utilizar su expresión regular.\n" -#: src/dird/ua_run.c:1565 -msgid "Cannot use your regexp.\n" -msgstr "No puede utilizar su expresión regular.\n" +#~ msgid "Levels:\n" +#~ msgstr "Niveles:\n" -#: src/dird/ua_run.c:1578 src/dird/ua_run.c:1608 -msgid "Levels:\n" -msgstr "Niveles:\n" +#~ msgid "Full" +#~ msgstr "Completo" -#: src/dird/ua_run.c:1580 src/lib/util.c:505 src/lib/util.c:551 -msgid "Full" -msgstr "Completo" +#~ msgid "Incremental" +#~ msgstr "Incremental" -#: src/dird/ua_run.c:1581 src/lib/util.c:508 -msgid "Incremental" -msgstr "Incremental" +#~ msgid "Differential" +#~ msgstr "Diferencial" -#: src/dird/ua_run.c:1582 src/lib/util.c:511 -msgid "Differential" -msgstr "Diferencial" +#~ msgid "Since" +#~ msgstr "Desde" -#: src/dird/ua_run.c:1583 src/lib/util.c:514 -msgid "Since" -msgstr "Desde" +#~ msgid "VirtualFull" +#~ msgstr "VirtualFull" -#: src/dird/ua_run.c:1584 -msgid "VirtualFull" -msgstr "VirtualFull" +#~ msgid "Select level" +#~ msgstr "Seleccionar Nivel" -#: src/dird/ua_run.c:1585 src/dird/ua_run.c:1614 -msgid "Select level" -msgstr "Seleccionar Nivel" +#~ msgid "Initialize Catalog" +#~ msgstr "Iniciar Catálogo" -#: src/dird/ua_run.c:1609 -msgid "Initialize Catalog" -msgstr "Iniciar Catálogo" +#~ msgid "Verify Catalog" +#~ msgstr "Verificar Catálogo" -#: src/dird/ua_run.c:1610 src/lib/util.c:517 -msgid "Verify Catalog" -msgstr "Verificar Catálogo" +#~ msgid "Verify Volume to Catalog" +#~ msgstr "Verificar volumen de catalogo" -#: src/dird/ua_run.c:1611 src/lib/util.c:523 -msgid "Verify Volume to Catalog" -msgstr "Verificar volumen de catalogo" +#~ msgid "Verify Disk to Catalog" +#~ msgstr "Verificar disco de catalogo" -#: src/dird/ua_run.c:1612 src/lib/util.c:526 -msgid "Verify Disk to Catalog" -msgstr "Verificar disco de catalogo" +#~ msgid "Verify Volume Data (not yet implemented)" +#~ msgstr "Verificar volumen de datos (aún no implementado)" -#: src/dird/ua_run.c:1613 -msgid "Verify Volume Data (not yet implemented)" -msgstr "Verificar volumen de datos (aún no implementado)" +#~ msgid "Level not appropriate for this Job. Cannot be changed.\n" +#~ msgstr "Nivel no adecuado para este trabajo. No se puede cambiar.\n" -#: src/dird/ua_run.c:1634 -msgid "Level not appropriate for this Job. Cannot be changed.\n" -msgstr "Nivel no adecuado para este trabajo. No se puede cambiar.\n" +#, fuzzy +#~ msgid "" +#~ "Run Admin Job\n" +#~ "JobName: %s\n" +#~ "FileSet: %s\n" +#~ "Client: %s\n" +#~ "Storage: %s\n" +#~ "When: %s\n" +#~ "Priority: %d\n" +#~ msgstr "" +#~ "Ejecutar %s job\n" +#~ "JobName: %s\n" +#~ "FileSet: %s\n" +#~ "Cliente: %s\n" +#~ "Storage: %s\n" +#~ "Cuando: %s\n" +#~ "Prioridad: %d\n" -#: src/dird/ua_run.c:1665 -#, fuzzy, c-format -msgid "" -"Run Admin Job\n" -"JobName: %s\n" -"FileSet: %s\n" -"Client: %s\n" -"Storage: %s\n" -"When: %s\n" -"Priority: %d\n" -msgstr "" -"Ejecutar %s job\n" -"JobName: %s\n" -"FileSet: %s\n" -"Cliente: %s\n" -"Storage: %s\n" -"Cuando: %s\n" -"Prioridad: %d\n" - -#: src/dird/ua_run.c:1723 -#, fuzzy, c-format -msgid "" -"Run Backup job\n" -"JobName: %s\n" -"Level: %s\n" -"Client: %s\n" -"FileSet: %s\n" -"Pool: %s (From %s)\n" -"%sStorage: %s (From %s)\n" -"When: %s\n" -"Priority: %d\n" -"%s%s%s" -msgstr "" -"Ejecutar %s job\n" -"Nombre del Job: %s\n" -"Nivel: %s\n" -"Cliente: %s\n" -"FileSet: %s\n" -"Pool: %s (Desde %s)\n" -"Storage: %s (Desde %s)\n" -"Cuando: %s\n" -"Prioridad: %d\n" -"%s%s%s" - -#: src/dird/ua_run.c:1756 -#, fuzzy, c-format -msgid "Could not get job record for selected JobId. ERR=%s" -msgstr "No se ha podido obtener el registro Job para Job anterior. ERR=%s" +#, fuzzy +#~ msgid "" +#~ "Run Backup job\n" +#~ "JobName: %s\n" +#~ "Level: %s\n" +#~ "Client: %s\n" +#~ "FileSet: %s\n" +#~ "Pool: %s (From %s)\n" +#~ "%sStorage: %s (From %s)\n" +#~ "When: %s\n" +#~ "Priority: %d\n" +#~ "%s%s%s" +#~ msgstr "" +#~ "Ejecutar %s job\n" +#~ "Nombre del Job: %s\n" +#~ "Nivel: %s\n" +#~ "Cliente: %s\n" +#~ "FileSet: %s\n" +#~ "Pool: %s (Desde %s)\n" +#~ "Storage: %s (Desde %s)\n" +#~ "Cuando: %s\n" +#~ "Prioridad: %d\n" +#~ "%s%s%s" -#: src/dird/ua_run.c:1795 -#, fuzzy, c-format -msgid "" -"Run Verify Job\n" -"JobName: %s\n" -"Level: %s\n" -"Client: %s\n" -"FileSet: %s\n" -"Pool: %s (From %s)\n" -"Storage: %s (From %s)\n" -"Verify Job: %s\n" -"Verify List: %s\n" -"When: %s\n" -"Priority: %d\n" -msgstr "" -"Ejecutar %s job\n" -"JobName: %s\n" -"Level: %s\n" -"Cliente: %s\n" -"FileSet: %s\n" -"Pool: %s (Desde %s)\n" -"Storage: %s (Desde %s)\n" -"Verify Job: %s\n" -"Verify List: %s\n" -"Cuando: %s\n" -"Prioridad: %d\n" - -#: src/dird/ua_run.c:1824 -msgid "Please enter a JobId for restore: " -msgstr "Por favor, introduzca un JobId para restaurar:" - -#: src/dird/ua_run.c:1863 src/dird/ua_run.c:1890 src/dird/ua_run.c:1921 -#: src/dird/ua_run.c:1948 src/dird/ua_run.c:1986 -#, fuzzy -msgid "User specified" -msgstr "tiempo de espera especificado" - -#: src/dird/ua_run.c:1865 -#, c-format -msgid "" -"Run Restore job\n" -"JobName: %s\n" -"Bootstrap: %s\n" -"RegexWhere: %s\n" -"Replace: %s\n" -"FileSet: %s\n" -"Backup Client: %s\n" -"Restore Client: %s\n" -"Storage: %s\n" -"When: %s\n" -"Catalog: %s\n" -"Priority: %d\n" -"Plugin Options: %s\n" -msgstr "" -"Ejecutar Job de Restauración\n" -"Nombre del Job: %s\n" -"Bootstrap: %s\n" -"RegexWhere: %s\n" -"Reemplazar: %s\n" -"FileSet: %s\n" -"Cliente de Respaldo: %s\n" -"Cliente de Restauración: %s\n" -"Storage: %s\n" -"Cuando: %s\n" -"Catalogo: %s\n" -"Prioridad: %d\n" -"Opciones de Plugin: %s\n" - -#: src/dird/ua_run.c:1923 -#, c-format -msgid "" -"Run Restore job\n" -"JobName: %s\n" -"Bootstrap: %s\n" -"Where: %s\n" -"Replace: %s\n" -"FileSet: %s\n" -"Backup Client: %s\n" -"Restore Client: %s\n" -"Storage: %s\n" -"When: %s\n" -"Catalog: %s\n" -"Priority: %d\n" -"Plugin Options: %s\n" -msgstr "" -"Ejecutar Job de Restauración\n" -"Nombre del Job: %s\n" -"Bootstrap: %s\n" -"Donde: %s\n" -"Reemplazar: %s\n" -"FileSet: %s\n" -"Respaldo Cliente: %s\n" -"Restaurar Cliente: %s\n" -"Storage: %s\n" -"Cuando: %s\n" -"Catalogo: %s\n" -"Prioridad: %d\n" -"Opciones de Plugin: %s\n" - -#: src/dird/ua_run.c:1955 -#, c-format -msgid "" -"Run Restore job\n" -"JobName: %s\n" -"Bootstrap: %s\n" -msgstr "" -"Ejecutar Job Restaurar\n" -"JobName: %s\n" -"Bootstrap: %s\n" +#, fuzzy +#~ msgid "Could not get job record for selected JobId. ERR=%s" +#~ msgstr "No se ha podido obtener el registro Job para Job anterior. ERR=%s" -#: src/dird/ua_run.c:1963 -#, c-format -msgid "RegexWhere: %s\n" -msgstr "RegexWhere: %s\n" +#, fuzzy +#~ msgid "" +#~ "Run Verify Job\n" +#~ "JobName: %s\n" +#~ "Level: %s\n" +#~ "Client: %s\n" +#~ "FileSet: %s\n" +#~ "Pool: %s (From %s)\n" +#~ "Storage: %s (From %s)\n" +#~ "Verify Job: %s\n" +#~ "Verify List: %s\n" +#~ "When: %s\n" +#~ "Priority: %d\n" +#~ msgstr "" +#~ "Ejecutar %s job\n" +#~ "JobName: %s\n" +#~ "Level: %s\n" +#~ "Cliente: %s\n" +#~ "FileSet: %s\n" +#~ "Pool: %s (Desde %s)\n" +#~ "Storage: %s (Desde %s)\n" +#~ "Verify Job: %s\n" +#~ "Verify List: %s\n" +#~ "Cuando: %s\n" +#~ "Prioridad: %d\n" -#: src/dird/ua_run.c:1966 -#, c-format -msgid "Where: %s\n" -msgstr "Donde: %s\n" +#~ msgid "Please enter a JobId for restore: " +#~ msgstr "Por favor, introduzca un JobId para restaurar:" -#: src/dird/ua_run.c:1970 -#, c-format -msgid "" -"Replace: %s\n" -"Client: %s\n" -"Storage: %s\n" -"JobId: %s\n" -"When: %s\n" -"Catalog: %s\n" -"Priority: %d\n" -"Plugin Options: %s\n" -msgstr "" -"Remplazar: %s\n" -"Cliente: %s\n" -"Storage: %s\n" -"JobId: %s\n" -"Cuando: %s\n" -"Catalogo: %s\n" -"Prioridad: %d\n" -"Opciones de Plugin: %s\n" - -#: src/dird/ua_run.c:2028 -msgid "Run Copy job\n" -msgstr "Ejecutar Job de Copia\n" - -#: src/dird/ua_run.c:2030 -msgid "Run Migration job\n" -msgstr "Ejecutar Job de Migración\n" - -#: src/dird/ua_run.c:2062 -#, c-format -msgid "Unknown Job Type=%d\n" -msgstr "Tipo de Job desconocido=%d\n" +#, fuzzy +#~ msgid "User specified" +#~ msgstr "tiempo de espera especificado" -#: src/dird/ua_run.c:2136 -#, c-format -msgid "Value missing for keyword %s\n" -msgstr "Falta valor para la palabra clave %s\n" +#~ msgid "" +#~ "Run Restore job\n" +#~ "JobName: %s\n" +#~ "Bootstrap: %s\n" +#~ "RegexWhere: %s\n" +#~ "Replace: %s\n" +#~ "FileSet: %s\n" +#~ "Backup Client: %s\n" +#~ "Restore Client: %s\n" +#~ "Storage: %s\n" +#~ "When: %s\n" +#~ "Catalog: %s\n" +#~ "Priority: %d\n" +#~ "Plugin Options: %s\n" +#~ msgstr "" +#~ "Ejecutar Job de Restauración\n" +#~ "Nombre del Job: %s\n" +#~ "Bootstrap: %s\n" +#~ "RegexWhere: %s\n" +#~ "Reemplazar: %s\n" +#~ "FileSet: %s\n" +#~ "Cliente de Respaldo: %s\n" +#~ "Cliente de Restauración: %s\n" +#~ "Storage: %s\n" +#~ "Cuando: %s\n" +#~ "Catalogo: %s\n" +#~ "Prioridad: %d\n" +#~ "Opciones de Plugin: %s\n" + +#~ msgid "" +#~ "Run Restore job\n" +#~ "JobName: %s\n" +#~ "Bootstrap: %s\n" +#~ "Where: %s\n" +#~ "Replace: %s\n" +#~ "FileSet: %s\n" +#~ "Backup Client: %s\n" +#~ "Restore Client: %s\n" +#~ "Storage: %s\n" +#~ "When: %s\n" +#~ "Catalog: %s\n" +#~ "Priority: %d\n" +#~ "Plugin Options: %s\n" +#~ msgstr "" +#~ "Ejecutar Job de Restauración\n" +#~ "Nombre del Job: %s\n" +#~ "Bootstrap: %s\n" +#~ "Donde: %s\n" +#~ "Reemplazar: %s\n" +#~ "FileSet: %s\n" +#~ "Respaldo Cliente: %s\n" +#~ "Restaurar Cliente: %s\n" +#~ "Storage: %s\n" +#~ "Cuando: %s\n" +#~ "Catalogo: %s\n" +#~ "Prioridad: %d\n" +#~ "Opciones de Plugin: %s\n" + +#~ msgid "" +#~ "Run Restore job\n" +#~ "JobName: %s\n" +#~ "Bootstrap: %s\n" +#~ msgstr "" +#~ "Ejecutar Job Restaurar\n" +#~ "JobName: %s\n" +#~ "Bootstrap: %s\n" + +#~ msgid "RegexWhere: %s\n" +#~ msgstr "RegexWhere: %s\n" + +#~ msgid "Where: %s\n" +#~ msgstr "Donde: %s\n" + +#~ msgid "" +#~ "Replace: %s\n" +#~ "Client: %s\n" +#~ "Storage: %s\n" +#~ "JobId: %s\n" +#~ "When: %s\n" +#~ "Catalog: %s\n" +#~ "Priority: %d\n" +#~ "Plugin Options: %s\n" +#~ msgstr "" +#~ "Remplazar: %s\n" +#~ "Cliente: %s\n" +#~ "Storage: %s\n" +#~ "JobId: %s\n" +#~ "Cuando: %s\n" +#~ "Catalogo: %s\n" +#~ "Prioridad: %d\n" +#~ "Opciones de Plugin: %s\n" + +#~ msgid "Run Copy job\n" +#~ msgstr "Ejecutar Job de Copia\n" + +#~ msgid "Run Migration job\n" +#~ msgstr "Ejecutar Job de Migración\n" -#: src/dird/ua_run.c:2146 -msgid "JobId specified twice.\n" -msgstr "JobId especificada dos veces.\n" +#~ msgid "Unknown Job Type=%d\n" +#~ msgstr "Tipo de Job desconocido=%d\n" -#: src/dird/ua_run.c:2155 src/dird/ua_run.c:2295 -msgid "Client specified twice.\n" -msgstr "Cliente especificado dos veces.\n" +#~ msgid "Value missing for keyword %s\n" +#~ msgstr "Falta valor para la palabra clave %s\n" -#: src/dird/ua_run.c:2163 -msgid "FileSet specified twice.\n" -msgstr "FileSet especificado dos veces.\n" +#~ msgid "JobId specified twice.\n" +#~ msgstr "JobId especificada dos veces.\n" -#: src/dird/ua_run.c:2171 -msgid "Level specified twice.\n" -msgstr "Level especificado dos veces.\n" +#~ msgid "Client specified twice.\n" +#~ msgstr "Cliente especificado dos veces.\n" -#: src/dird/ua_run.c:2180 -msgid "Storage specified twice.\n" -msgstr "Storage especificado dos veces.\n" +#~ msgid "FileSet specified twice.\n" +#~ msgstr "FileSet especificado dos veces.\n" -#: src/dird/ua_run.c:2188 -msgid "RegexWhere or Where specified twice.\n" -msgstr "RegexDónde o Dónde especificado dos veces.\n" +#~ msgid "Level specified twice.\n" +#~ msgstr "Level especificado dos veces.\n" -#: src/dird/ua_run.c:2193 -msgid "No authorization for \"regexwhere\" specification.\n" -msgstr "Sin autorización para especificación \"regexwhere\".\n" +#~ msgid "Storage specified twice.\n" +#~ msgstr "Storage especificado dos veces.\n" -#: src/dird/ua_run.c:2200 -msgid "Where or RegexWhere specified twice.\n" -msgstr "Dónde o RegexDónde especificado dos veces.\n" +#~ msgid "RegexWhere or Where specified twice.\n" +#~ msgstr "RegexDónde o Dónde especificado dos veces.\n" -#: src/dird/ua_run.c:2205 -msgid "No authoriztion for \"where\" specification.\n" -msgstr "Sin autorización para especificación \"where\".\n" +#~ msgid "No authorization for \"regexwhere\" specification.\n" +#~ msgstr "Sin autorización para especificación \"regexwhere\".\n" -#: src/dird/ua_run.c:2212 -msgid "Bootstrap specified twice.\n" -msgstr "Bootstrap especificado dos veces.\n" +#~ msgid "Where or RegexWhere specified twice.\n" +#~ msgstr "Dónde o RegexDónde especificado dos veces.\n" -#: src/dird/ua_run.c:2220 -msgid "Replace specified twice.\n" -msgstr "Replace especificado dos veces.\n" +#~ msgid "No authoriztion for \"where\" specification.\n" +#~ msgstr "Sin autorización para especificación \"where\".\n" -#: src/dird/ua_run.c:2228 -msgid "When specified twice.\n" -msgstr "Cuando especificado dos veces.\n" +#~ msgid "Bootstrap specified twice.\n" +#~ msgstr "Bootstrap especificado dos veces.\n" -#: src/dird/ua_run.c:2236 -msgid "Priority specified twice.\n" -msgstr "Prioridad especificada dos veces.\n" +#~ msgid "Replace specified twice.\n" +#~ msgstr "Replace especificado dos veces.\n" -#: src/dird/ua_run.c:2241 -msgid "Priority must be positive nonzero setting it to 10.\n" -msgstr "Prioridad debe ser positivo y distinto a cero, configurando en 10.\n" +#~ msgid "When specified twice.\n" +#~ msgstr "Cuando especificado dos veces.\n" -#: src/dird/ua_run.c:2251 -msgid "Verify Job specified twice.\n" -msgstr "Job Verificar especificado dos veces.\n" +#~ msgid "Priority specified twice.\n" +#~ msgstr "Prioridad especificada dos veces.\n" -#: src/dird/ua_run.c:2279 -msgid "Migration Job specified twice.\n" -msgstr "Job Migración especificado dos veces.\n" +#~ msgid "Priority must be positive nonzero setting it to 10.\n" +#~ msgstr "" +#~ "Prioridad debe ser positivo y distinto a cero, configurando en 10.\n" + +#~ msgid "Verify Job specified twice.\n" +#~ msgstr "Job Verificar especificado dos veces.\n" -#: src/dird/ua_run.c:2287 -msgid "Pool specified twice.\n" -msgstr "Pool especificado dos veces.\n" +#~ msgid "Migration Job specified twice.\n" +#~ msgstr "Job Migración especificado dos veces.\n" -#: src/dird/ua_run.c:2303 -msgid "Restore Client specified twice.\n" -msgstr "Restaurar Cliente especificado dos veces.\n" +#~ msgid "Pool specified twice.\n" +#~ msgstr "Pool especificado dos veces.\n" -#: src/dird/ua_run.c:2310 -msgid "Plugin Options not yet implemented.\n" -msgstr "Opciones de Plugin todavía no se ha implementado.\n" +#~ msgid "Restore Client specified twice.\n" +#~ msgstr "Restaurar Cliente especificado dos veces.\n" -#: src/dird/ua_run.c:2313 -msgid "Plugin Options specified twice.\n" -msgstr "Opciones de Plugin especificado dos veces.\n" +#~ msgid "Plugin Options not yet implemented.\n" +#~ msgstr "Opciones de Plugin todavía no se ha implementado.\n" -#: src/dird/ua_run.c:2318 -msgid "No authoriztion for \"PluginOptions\" specification.\n" -msgstr "Sin autorización para especificación \"PluginOptions\".\n" +#~ msgid "Plugin Options specified twice.\n" +#~ msgstr "Opciones de Plugin especificado dos veces.\n" -#: src/dird/ua_run.c:2325 -msgid "Spool flag specified twice.\n" -msgstr "Bandera de cola especificada dos veces.\n" +#~ msgid "No authoriztion for \"PluginOptions\" specification.\n" +#~ msgstr "Sin autorización para especificación \"PluginOptions\".\n" -#: src/dird/ua_run.c:2332 -msgid "Invalid spooldata flag.\n" -msgstr "Invalida bandera spooldata.\n" +#~ msgid "Spool flag specified twice.\n" +#~ msgstr "Bandera de cola especificada dos veces.\n" + +#~ msgid "Invalid spooldata flag.\n" +#~ msgstr "Invalida bandera spooldata.\n" -#: src/dird/ua_run.c:2341 #, fuzzy -msgid "IgnoreDuplicateCheck flag specified twice.\n" -msgstr "Bandera de cola especificada dos veces.\n" +#~ msgid "IgnoreDuplicateCheck flag specified twice.\n" +#~ msgstr "Bandera de cola especificada dos veces.\n" -#: src/dird/ua_run.c:2348 #, fuzzy -msgid "Invalid ignoreduplicatecheck flag.\n" -msgstr "Invalida bandera spooldata.\n" +#~ msgid "Invalid ignoreduplicatecheck flag.\n" +#~ msgstr "Invalida bandera spooldata.\n" -#: src/dird/ua_run.c:2353 #, fuzzy -msgid "Accurate flag specified twice.\n" -msgstr "Bandera de cola especificada dos veces.\n" +#~ msgid "Accurate flag specified twice.\n" +#~ msgstr "Bandera de cola especificada dos veces.\n" -#: src/dird/ua_run.c:2360 #, fuzzy -msgid "Invalid accurate flag.\n" -msgstr "Invalida bandera spooldata.\n" +#~ msgid "Invalid accurate flag.\n" +#~ msgstr "Invalida bandera spooldata.\n" -#: src/dird/ua_run.c:2365 -msgid "Job name specified twice.\n" -msgstr "Nombre del Job especificado dos veces.\n" +#~ msgid "Job name specified twice.\n" +#~ msgstr "Nombre del Job especificado dos veces.\n" -#: src/dird/ua_run.c:2373 #, fuzzy -msgid "Media Type specified twice.\n" -msgstr "Replace especificado dos veces.\n" +#~ msgid "Media Type specified twice.\n" +#~ msgstr "Replace especificado dos veces.\n" -#: src/dird/ua_run.c:2381 #, fuzzy -msgid "NextPool specified twice.\n" -msgstr "Pool especificado dos veces.\n" +#~ msgid "NextPool specified twice.\n" +#~ msgstr "Pool especificado dos veces.\n" -#: src/dird/ua_run.c:2406 -#, c-format -msgid "Invalid keyword: %s\n" -msgstr "Palabra clave inválida: %s\n" +#~ msgid "Invalid keyword: %s\n" +#~ msgstr "Palabra clave inválida: %s\n" -#: src/dird/ua_run.c:2421 -#, c-format -msgid "Catalog \"%s\" not found\n" -msgstr "Catalogo \"%s\" no encontrado\n" +#~ msgid "Catalog \"%s\" not found\n" +#~ msgstr "Catalogo \"%s\" no encontrado\n" -#: src/dird/ua_run.c:2425 -#, c-format -msgid "No authorization. Catalog \"%s\".\n" -msgstr "Sin autorización. Catalogo \"%s\".\n" +#~ msgid "No authorization. Catalog \"%s\".\n" +#~ msgstr "Sin autorización. Catalogo \"%s\".\n" -#: src/dird/ua_run.c:2459 -#, c-format -msgid "Verify Job \"%s\" not found.\n" -msgstr "Job Verificar \"%s\" no encontrado.\n" +#~ msgid "Verify Job \"%s\" not found.\n" +#~ msgstr "Job Verificar \"%s\" no encontrado.\n" -#: src/dird/ua_run.c:2469 -#, c-format -msgid "Migration Job \"%s\" not found.\n" -msgstr "Job Migración \"%s\" no encontrado.\n" +#~ msgid "Migration Job \"%s\" not found.\n" +#~ msgstr "Job Migración \"%s\" no encontrado.\n" -#: src/dird/ua_select.c:39 src/dird/ua_select.c:65 -#, c-format -msgid "The current %s retention period is: %s\n" -msgstr "El período actual %s de retención es: %s\n" +#~ msgid "The current %s retention period is: %s\n" +#~ msgstr "El período actual %s de retención es: %s\n" -#: src/dird/ua_select.c:44 #, fuzzy -msgid "Continue? (yes/no): " -msgstr "¿Continuar? (sí/mod/no):" +#~ msgid "Continue? (yes/no): " +#~ msgstr "¿Continuar? (sí/mod/no):" -#: src/dird/ua_select.c:70 -msgid "Continue? (yes/mod/no): " -msgstr "¿Continuar? (sí/mod/no):" +#~ msgid "Continue? (yes/mod/no): " +#~ msgstr "¿Continuar? (sí/mod/no):" -#: src/dird/ua_select.c:74 -msgid "Enter new retention period: " -msgstr "Introduzca el nuevo periodo de retención:" +#~ msgid "Enter new retention period: " +#~ msgstr "Introduzca el nuevo periodo de retención:" -#: src/dird/ua_select.c:78 -msgid "Invalid period.\n" -msgstr "Período no válido.\n" +#~ msgid "Invalid period.\n" +#~ msgstr "Período no válido.\n" -#: src/dird/ua_select.c:177 -msgid "The defined Storage resources are:\n" -msgstr "Los recursos Storage definidos son:\n" +#~ msgid "The defined Storage resources are:\n" +#~ msgstr "Los recursos Storage definidos son:\n" -#: src/dird/ua_select.c:189 -msgid "Select Storage resource" -msgstr "Seleccione recurso Storage" +#~ msgid "Select Storage resource" +#~ msgstr "Seleccione recurso Storage" -#: src/dird/ua_select.c:245 -msgid "You must specify a \"use \" command before continuing.\n" -msgstr "" -"Usted debe especificar un comando \"use \" antes de " -"continuar.\n" +#~ msgid "" +#~ "You must specify a \"use \" command before continuing.\n" +#~ msgstr "" +#~ "Usted debe especificar un comando \"use \" antes de " +#~ "continuar.\n" -#: src/dird/ua_select.c:251 -msgid "The defined Catalog resources are:\n" -msgstr "Los recursos Catalogo definidos son:\n" +#~ msgid "The defined Catalog resources are:\n" +#~ msgstr "Los recursos Catalogo definidos son:\n" -#: src/dird/ua_select.c:259 -msgid "Catalog" -msgstr "Catalogo" +#~ msgid "Catalog" +#~ msgstr "Catalogo" -#: src/dird/ua_select.c:259 -msgid "Select Catalog resource" -msgstr "Seleccione recurso Catalogo" +#~ msgid "Select Catalog resource" +#~ msgstr "Seleccione recurso Catalogo" -#: src/dird/ua_select.c:278 #, fuzzy -msgid "The disabled Job resources are:\n" -msgstr "Los recursos Job definidos son:\n" +#~ msgid "The disabled Job resources are:\n" +#~ msgstr "Los recursos Job definidos son:\n" -#: src/dird/ua_select.c:280 #, fuzzy -msgid "The enabled Job resources are:\n" -msgstr "Los recursos Job definidos son:\n" +#~ msgid "The enabled Job resources are:\n" +#~ msgstr "Los recursos Job definidos son:\n" -#: src/dird/ua_select.c:292 src/dird/ua_select.c:315 -msgid "Select Job resource" -msgstr "Seleccione recurso Job" +#~ msgid "Select Job resource" +#~ msgstr "Seleccione recurso Job" -#: src/dird/ua_select.c:307 -msgid "The defined Job resources are:\n" -msgstr "Los recursos Job definidos son:\n" +#~ msgid "The defined Job resources are:\n" +#~ msgstr "Los recursos Job definidos son:\n" -#: src/dird/ua_select.c:334 -#, fuzzy, c-format -msgid "Error: Restore Job resource \"%s\" does not exist.\n" -msgstr "Error: recurso Pool \"%s\" no existe.\n" +#, fuzzy +#~ msgid "Error: Restore Job resource \"%s\" does not exist.\n" +#~ msgstr "Error: recurso Pool \"%s\" no existe.\n" -#: src/dird/ua_select.c:348 -msgid "The defined Restore Job resources are:\n" -msgstr "Los recursos Restore definidos son:\n" +#~ msgid "The defined Restore Job resources are:\n" +#~ msgstr "Los recursos Restore definidos son:\n" -#: src/dird/ua_select.c:356 -msgid "Select Restore Job" -msgstr "Seleccione recurso Restore" +#~ msgid "Select Restore Job" +#~ msgstr "Seleccione recurso Restore" -#: src/dird/ua_select.c:372 src/dird/ua_select.c:399 -msgid "The defined Client resources are:\n" -msgstr "Los recursos Clientes definidos son:\n" +#~ msgid "The defined Client resources are:\n" +#~ msgstr "Los recursos Clientes definidos son:\n" -#: src/dird/ua_select.c:383 #, fuzzy -msgid "Select Client resource" -msgstr "Seleccionar recurso FileSet" +#~ msgid "Select Client resource" +#~ msgstr "Seleccionar recurso FileSet" -#: src/dird/ua_select.c:407 -msgid "Select Client (File daemon) resource" -msgstr "Seleccione recurso Cliente (File Daemon)" +#~ msgid "Select Client (File daemon) resource" +#~ msgstr "Seleccione recurso Cliente (File Daemon)" -#: src/dird/ua_select.c:434 -#, c-format -msgid "Error: Client resource %s does not exist.\n" -msgstr "Error: Recurso Cliente %s no existe.\n" +#~ msgid "Error: Client resource %s does not exist.\n" +#~ msgstr "Error: Recurso Cliente %s no existe.\n" -#: src/dird/ua_select.c:450 #, fuzzy -msgid "The defined Schedule resources are:\n" -msgstr "Los recursos Clientes definidos son:\n" +#~ msgid "The defined Schedule resources are:\n" +#~ msgstr "Los recursos Clientes definidos son:\n" -#: src/dird/ua_select.c:461 #, fuzzy -msgid "Schedule" -msgstr "" -"\n" -"Scheduled Jobs:\n" +#~ msgid "Schedule" +#~ msgstr "" +#~ "\n" +#~ "Scheduled Jobs:\n" -#: src/dird/ua_select.c:461 #, fuzzy -msgid "Select Schedule resource" -msgstr "Seleccione recurso Pool" +#~ msgid "Select Schedule resource" +#~ msgstr "Seleccione recurso Pool" -#: src/dird/ua_select.c:487 -#, c-format -msgid "Could not find Client %s: ERR=%s" -msgstr "No se pudo encontrar el Cliente %s: ERR=%s" +#~ msgid "Could not find Client %s: ERR=%s" +#~ msgstr "No se pudo encontrar el Cliente %s: ERR=%s" -#: src/dird/ua_select.c:497 src/dird/ua_select.c:551 -#, c-format -msgid "Could not find Client \"%s\": ERR=%s" -msgstr "No se pudo encontrar Cliente \"%s\": ERR=%s" +#~ msgid "Could not find Client \"%s\": ERR=%s" +#~ msgstr "No se pudo encontrar Cliente \"%s\": ERR=%s" -#: src/dird/ua_select.c:526 -#, c-format -msgid "Error obtaining client ids. ERR=%s\n" -msgstr "Error al obtener el ID del cliente. ERR=%s\n" +#~ msgid "Error obtaining client ids. ERR=%s\n" +#~ msgstr "Error al obtener el ID del cliente. ERR=%s\n" -#: src/dird/ua_select.c:530 -msgid "No clients defined. You must run a job before using this command.\n" -msgstr "" -"Clientes no definidos. Usted debe ejecutar un Job antes de usar este " -"comando.\n" +#~ msgid "No clients defined. You must run a job before using this command.\n" +#~ msgstr "" +#~ "Clientes no definidos. Usted debe ejecutar un Job antes de usar este " +#~ "comando.\n" -#: src/dird/ua_select.c:534 -msgid "Defined Clients:\n" -msgstr "Clientes definidos:\n" +#~ msgid "Defined Clients:\n" +#~ msgstr "Clientes definidos:\n" -#: src/dird/ua_select.c:544 -msgid "Select the Client" -msgstr "Seleccione el Cliente" +#~ msgid "Select the Client" +#~ msgstr "Seleccione el Cliente" -#: src/dird/ua_select.c:577 src/dird/ua_select.c:601 src/dird/ua_select.c:646 -#, c-format -msgid "Could not find Pool \"%s\": ERR=%s" -msgstr "No se pudo encontrar Pool \"%s\": ERR=%s" +#~ msgid "Could not find Pool \"%s\": ERR=%s" +#~ msgstr "No se pudo encontrar Pool \"%s\": ERR=%s" -#: src/dird/ua_select.c:616 -msgid "No pools defined. Use the \"create\" command to create one.\n" -msgstr "Pools no definidos. Utilice el comando \"create\" para crear uno.\n" +#~ msgid "No pools defined. Use the \"create\" command to create one.\n" +#~ msgstr "Pools no definidos. Utilice el comando \"create\" para crear uno.\n" -#: src/dird/ua_select.c:620 -msgid "Defined Pools:\n" -msgstr "Pools definidos:\n" +#~ msgid "Defined Pools:\n" +#~ msgstr "Pools definidos:\n" -#: src/dird/ua_select.c:633 -msgid "Select the Pool" -msgstr "Seleccione el Pool" +#~ msgid "Select the Pool" +#~ msgstr "Seleccione el Pool" -#: src/dird/ua_select.c:671 -#, c-format -msgid "No access to Pool \"%s\"\n" -msgstr "No tienen acceso al Pool \"%s\"\n" +#~ msgid "No access to Pool \"%s\"\n" +#~ msgstr "No tienen acceso al Pool \"%s\"\n" -#: src/dird/ua_select.c:703 #, fuzzy -msgid "Enter a Volume name or *MediaId: " -msgstr "Introduzca nombre de Volumen:" +#~ msgid "Enter a Volume name or *MediaId: " +#~ msgstr "Introduzca nombre de Volumen:" -#: src/dird/ua_select.c:738 -msgid "The defined Pool resources are:\n" -msgstr "Los recursos Pool definidos son:\n" +#~ msgid "The defined Pool resources are:\n" +#~ msgstr "Los recursos Pool definidos son:\n" -#: src/dird/ua_select.c:746 -msgid "Select Pool resource" -msgstr "Seleccione recurso Pool" +#~ msgid "Select Pool resource" +#~ msgstr "Seleccione recurso Pool" -#: src/dird/ua_select.c:781 -msgid "Enter the JobId to select: " -msgstr "Introduzca el JobId para seleccionar:" +#~ msgid "Enter the JobId to select: " +#~ msgstr "Introduzca el JobId para seleccionar:" -#: src/dird/ua_select.c:819 -#, c-format -msgid "Could not find Job \"%s\": ERR=%s" -msgstr "No pudo encontrar Job \"%s\": ERR=%s" +#~ msgid "Could not find Job \"%s\": ERR=%s" +#~ msgstr "No pudo encontrar Job \"%s\": ERR=%s" -#: src/dird/ua_select.c:910 src/dird/ua_select.c:1006 -#, c-format -msgid "Automatically selected %s: %s\n" -msgstr "Seleccionado automáticamente %s: %s\n" +#~ msgid "Automatically selected %s: %s\n" +#~ msgstr "Seleccionado automáticamente %s: %s\n" -#: src/dird/ua_select.c:921 src/dird/ua_select.c:1017 -#, c-format -msgid "" -"Your request has multiple choices for \"%s\". Selection is not possible in " -"batch mode.\n" -msgstr "" -"Su petición ha múltiples opciones para \"%s\". La selección no es posible en " -"modo batch.\n" +#~ msgid "" +#~ "Your request has multiple choices for \"%s\". Selection is not possible " +#~ "in batch mode.\n" +#~ msgstr "" +#~ "Su petición ha múltiples opciones para \"%s\". La selección no es posible " +#~ "en modo batch.\n" -#: src/dird/ua_select.c:939 src/dird/ua_select.c:999 -#, c-format -msgid "Selection list for \"%s\" is empty!\n" -msgstr "Lista de selección para \"%s\" está vacía!\n" +#~ msgid "Selection list for \"%s\" is empty!\n" +#~ msgstr "Lista de selección para \"%s\" está vacía!\n" -#: src/dird/ua_select.c:945 -#, c-format -msgid "Automatically selected: %s\n" -msgstr "Seleccionado automáticamente: %s\n" +#~ msgid "Automatically selected: %s\n" +#~ msgstr "Seleccionado automáticamente: %s\n" -#: src/dird/ua_select.c:957 -msgid "Selection aborted, nothing done.\n" -msgstr "Selección abortada, no hay nada hecho.\n" +#~ msgid "Selection aborted, nothing done.\n" +#~ msgstr "Selección abortada, no hay nada hecho.\n" -#: src/dird/ua_select.c:962 src/dird/ua_select.c:1051 -#, c-format -msgid "Please enter a number between 1 and %d\n" -msgstr "Por favor, introduzca un número entre 1 y %d\n" +#~ msgid "Please enter a number between 1 and %d\n" +#~ msgstr "Por favor, introduzca un número entre 1 y %d\n" -#: src/dird/ua_select.c:1105 -msgid "Storage name given twice.\n" -msgstr "Nombre de Storage especificado dos veces.\n" +#~ msgid "Storage name given twice.\n" +#~ msgstr "Nombre de Storage especificado dos veces.\n" -#: src/dird/ua_select.c:1122 -#, c-format -msgid "Expecting jobid=nn command, got: %s\n" -msgstr "Esperando comando jobid=nn, obtuvo: %s.\n" +#~ msgid "Expecting jobid=nn command, got: %s\n" +#~ msgstr "Esperando comando jobid=nn, obtuvo: %s.\n" -#: src/dird/ua_select.c:1126 -#, c-format -msgid "JobId %s is not running.\n" -msgstr "JobId %s no está en ejecución.\n" +#~ msgid "JobId %s is not running.\n" +#~ msgstr "JobId %s no está en ejecución.\n" -#: src/dird/ua_select.c:1136 -#, c-format -msgid "Expecting job=xxx, got: %s.\n" -msgstr "Esperando job=xxx, obtuvo: %s.\n" +#~ msgid "Expecting job=xxx, got: %s.\n" +#~ msgstr "Esperando job=xxx, obtuvo: %s.\n" -#: src/dird/ua_select.c:1140 -#, c-format -msgid "Job \"%s\" is not running.\n" -msgstr "Job \"%s\" no está en ejecución.\n" +#~ msgid "Job \"%s\" is not running.\n" +#~ msgstr "Job \"%s\" no está en ejecución.\n" -#: src/dird/ua_select.c:1148 -#, c-format -msgid "Expecting ujobid=xxx, got: %s.\n" -msgstr "Esperando ujobid=xxx, obtuvo: %s.\n" +#~ msgid "Expecting ujobid=xxx, got: %s.\n" +#~ msgstr "Esperando ujobid=xxx, obtuvo: %s.\n" -#: src/dird/ua_select.c:1169 -#, c-format -msgid "Storage resource \"%s\": not found\n" -msgstr "Recurso Storage \"%s\": No encontrado\n" +#~ msgid "Storage resource \"%s\": not found\n" +#~ msgstr "Recurso Storage \"%s\": No encontrado\n" -#: src/dird/ua_select.c:1201 -msgid "Enter autochanger drive[0]: " -msgstr "Introduzca unidad Autochanger [0]:" +#~ msgid "Enter autochanger drive[0]: " +#~ msgstr "Introduzca unidad Autochanger [0]:" -#: src/dird/ua_select.c:1222 -msgid "Enter autochanger slot: " -msgstr "Introduzca ranura Autochanger:" +#~ msgid "Enter autochanger slot: " +#~ msgstr "Introduzca ranura Autochanger:" -#: src/dird/ua_select.c:1252 -msgid "Media Types defined in conf file:\n" -msgstr "Tipos de Media definidos en el archivo de configuración:\n" +#~ msgid "Media Types defined in conf file:\n" +#~ msgstr "Tipos de Media definidos en el archivo de configuración:\n" -#: src/dird/ua_select.c:1258 -msgid "Media Type" -msgstr "Tipo de Media" +#~ msgid "Media Type" +#~ msgstr "Tipo de Media" -#: src/dird/ua_select.c:1258 -msgid "Select the Media Type" -msgstr "Seleccione el Tipo de Media" +#~ msgid "Select the Media Type" +#~ msgstr "Seleccione el Tipo de Media" -#: src/dird/ua_select.c:1296 src/filed/status.c:322 src/stored/status.c:915 -msgid "No Jobs running.\n" -msgstr "No hay Jobs en ejecución.\n" +#~ msgid "No Jobs running.\n" +#~ msgstr "No hay Jobs en ejecución.\n" -#: src/dird/ua_select.c:1298 -msgid "None of your jobs are running.\n" -msgstr "Ninguno de sus trabajos se está ejecutando.\n" +#~ msgid "None of your jobs are running.\n" +#~ msgstr "Ninguno de sus trabajos se está ejecutando.\n" -#: src/dird/ua_select.c:1326 #, fuzzy -msgid "No value given for \"jobid\".\n" -msgstr "Volúmenes no encontrados para JobId=%d\n" - -#: src/dird/ua_select.c:1338 -#, fuzzy, c-format -msgid "Unauthorized command from this console for JobId=%d.\n" -msgstr "Comando no autorizado desde esta consola.\n" - -#: src/dird/ua_select.c:1342 -#, fuzzy, c-format -msgid "Warning Job JobId=%d is not running.\n" -msgstr "" -"Advertencia Job %s no está¡ en ejecución. Continuar de todos modos ...\n" - -#: src/dird/ua_select.c:1367 src/dird/ua_select.c:1462 -#, fuzzy, c-format -msgid "Confirm %s of %d Job%s (yes/no): " -msgstr "Confirmar cancelar(si/no): " +#~ msgid "No value given for \"jobid\".\n" +#~ msgstr "Volúmenes no encontrados para JobId=%d\n" -#: src/dird/ua_select.c:1380 #, fuzzy -msgid "No value given for \"job\".\n" -msgstr "Volúmenes no encontrados para JobId=%d\n" +#~ msgid "Unauthorized command from this console for JobId=%d.\n" +#~ msgstr "Comando no autorizado desde esta consola.\n" -#: src/dird/ua_select.c:1390 -#, fuzzy, c-format -msgid "Unauthorized command from this console for job=%s.\n" -msgstr "Comando no autorizado desde esta consola.\n" +#, fuzzy +#~ msgid "Warning Job JobId=%d is not running.\n" +#~ msgstr "" +#~ "Advertencia Job %s no está¡ en ejecución. Continuar de todos modos ...\n" -#: src/dird/ua_select.c:1396 src/dird/ua_select.c:1421 -#, fuzzy, c-format -msgid "Warning Job %s is not running.\n" -msgstr "JobId %s no está en ejecución.\n" +#, fuzzy +#~ msgid "Confirm %s of %d Job%s (yes/no): " +#~ msgstr "Confirmar cancelar(si/no): " -#: src/dird/ua_select.c:1405 #, fuzzy -msgid "No value given for \"ujobid\".\n" -msgstr "Volúmenes no encontrados para JobId=%d\n" +#~ msgid "No value given for \"job\".\n" +#~ msgstr "Volúmenes no encontrados para JobId=%d\n" -#: src/dird/ua_select.c:1415 -#, fuzzy, c-format -msgid "Unauthorized command from this console for ujobid=%s.\n" -msgstr "Comando no autorizado desde esta consola.\n" +#, fuzzy +#~ msgid "Unauthorized command from this console for job=%s.\n" +#~ msgstr "Comando no autorizado desde esta consola.\n" -#: src/dird/ua_select.c:1441 #, fuzzy -msgid "Select Job(s):\n" -msgstr "Seleccione Job:\n" +#~ msgid "Warning Job %s is not running.\n" +#~ msgstr "JobId %s no está en ejecución.\n" -#: src/dird/ua_select.c:1447 -#, c-format -msgid "JobId=%s Job=%s" -msgstr "JobId=%s Job=%s" +#, fuzzy +#~ msgid "No value given for \"ujobid\".\n" +#~ msgstr "Volúmenes no encontrados para JobId=%d\n" -#: src/dird/ua_select.c:1451 -#, fuzzy, c-format -msgid "Choose Job list to %s" -msgstr "Elija Job para cancelar" +#, fuzzy +#~ msgid "Unauthorized command from this console for ujobid=%s.\n" +#~ msgstr "Comando no autorizado desde esta consola.\n" -#: src/dird/ua_server.c:57 -#, c-format -msgid "Cannot create UA thread: %s\n" -msgstr "No se puede crear hilo UA: %s\n" +#, fuzzy +#~ msgid "Select Job(s):\n" +#~ msgstr "Seleccione Job:\n" -#: src/dird/ua_server.c:147 -msgid "You have messages.\n" -msgstr "Usted tiene mensajes.\n" +#~ msgid "JobId=%s Job=%s" +#~ msgstr "JobId=%s Job=%s" -#: src/dird/ua_status.c:171 -msgid "Status available for:\n" -msgstr "Estado disponible para:\n" +#, fuzzy +#~ msgid "Choose Job list to %s" +#~ msgstr "Elija Job para cancelar" -#: src/dird/ua_status.c:178 -msgid "Select daemon type for status" -msgstr "Seleccione el tipo de demonio para estado" +#~ msgid "Cannot create UA thread: %s\n" +#~ msgstr "No se puede crear hilo UA: %s\n" -#: src/dird/ua_status.c:324 src/stored/status.c:499 -#, fuzzy, c-format -msgid "%s %sVersion: %s (%s) %s %s %s\n" -msgstr "%s Versión: %s (%s) %s %s %s\n" +#~ msgid "You have messages.\n" +#~ msgstr "Usted tiene mensajes.\n" -#: src/dird/ua_status.c:328 -#, fuzzy, c-format -msgid "Daemon started %s, conf reloaded %s\n" -msgstr "Demonio iniciado %s, 1 Job ejecutando desde el inicio.\n" +#~ msgid "Status available for:\n" +#~ msgstr "Estado disponible para:\n" -#: src/dird/ua_status.c:329 -#, fuzzy, c-format -msgid " Jobs: run=%d, running=%d mode=%d,%d\n" -msgstr "Demonio iniciado %s, %d Job ejecutando desde el inicio.\n" +#~ msgid "Select daemon type for status" +#~ msgstr "Seleccione el tipo de demonio para estado" -#: src/dird/ua_status.c:331 src/filed/status.c:175 src/stored/status.c:509 -#, c-format -msgid " Heap: heap=%s smbytes=%s max_bytes=%s bufs=%s max_bufs=%s\n" -msgstr "Heap: heap=%s smbytes=%s max_bytes=%s bufs=%s max_bufs=%s\n" +#, fuzzy +#~ msgid "%s %sVersion: %s (%s) %s %s %s\n" +#~ msgstr "%s Versión: %s (%s) %s %s %s\n" -#: src/dird/ua_status.c:337 -#, c-format -msgid "" -" Res: njobs=%d nclients=%d nstores=%d npools=%d ncats=%d nfsets=%d nscheds=" -"%d\n" -msgstr "" +#, fuzzy +#~ msgid "Daemon started %s, conf reloaded %s\n" +#~ msgstr "Demonio iniciado %s, 1 Job ejecutando desde el inicio.\n" -#: src/dird/ua_status.c:394 -#, fuzzy, c-format -msgid "No authorization for Storage \"%s\"\n" -msgstr "Sin autorización. Storage \"%s\".\n" +#, fuzzy +#~ msgid " Jobs: run=%d, running=%d mode=%d,%d\n" +#~ msgstr "Demonio iniciado %s, %d Job ejecutando desde el inicio.\n" -#: src/dird/ua_status.c:404 -msgid "Restricted Client or Job does not permit access to Storage daemons\n" -msgstr "" +#~ msgid " Heap: heap=%s smbytes=%s max_bytes=%s bufs=%s max_bufs=%s\n" +#~ msgstr "Heap: heap=%s smbytes=%s max_bytes=%s bufs=%s max_bufs=%s\n" -#: src/dird/ua_status.c:414 -#, c-format -msgid "" -"\n" -"Failed to connect to Storage daemon %s.\n" -"====\n" -msgstr "" -"\n" -"Fallo al conectar con el demonio Storage %s.\n" -"====\n" +#, fuzzy +#~ msgid "No authorization for Storage \"%s\"\n" +#~ msgstr "Sin autorización. Storage \"%s\".\n" -#: src/dird/ua_status.c:429 -msgid "Must have three aguments\n" -msgstr "" +#~ msgid "" +#~ "\n" +#~ "Failed to connect to Storage daemon %s.\n" +#~ "====\n" +#~ msgstr "" +#~ "\n" +#~ "Fallo al conectar con el demonio Storage %s.\n" +#~ "====\n" -#: src/dird/ua_status.c:478 -#, c-format -msgid "" -"Failed to connect to Client %s.\n" -"====\n" -msgstr "" -"Fallo al conectar con el Cliente %s.\n" -"====\n" +#~ msgid "" +#~ "Failed to connect to Client %s.\n" +#~ "====\n" +#~ msgstr "" +#~ "Fallo al conectar con el Cliente %s.\n" +#~ "====\n" -#: src/dird/ua_status.c:483 -msgid "Connected to file daemon\n" -msgstr "Conectado al demonio file\n" +#~ msgid "Connected to file daemon\n" +#~ msgstr "Conectado al demonio file\n" -#: src/dird/ua_status.c:502 src/dird/ua_status.c:511 -msgid "" -"\n" -"Scheduled Jobs:\n" -msgstr "" -"\n" -"Scheduled Jobs:\n" +#~ msgid "" +#~ "\n" +#~ "Scheduled Jobs:\n" +#~ msgstr "" +#~ "\n" +#~ "Scheduled Jobs:\n" -#: src/dird/ua_status.c:503 #, fuzzy -msgid "" -"Level Type Pri Scheduled Job Name Volume\n" -msgstr "Nivel Tipo Pri Scheduled Nombre Volumen\n" +#~ msgid "" +#~ "Level Type Pri Scheduled Job Name " +#~ "Volume\n" +#~ msgstr "Nivel Tipo Pri Scheduled Nombre Volumen\n" -#: src/dird/ua_status.c:504 -msgid "===================================================================================\n" -msgstr "===================================================================================\n" +#~ msgid "===================================================================================\n" +#~ msgstr "===================================================================================\n" -#: src/dird/ua_status.c:512 #, fuzzy -msgid "" -"Level Type Pri Scheduled Job Name Schedule\n" -msgstr "Nivel Tipo Pri Scheduled Nombre Volumen\n" +#~ msgid "" +#~ "Level Type Pri Scheduled Job Name " +#~ "Schedule\n" +#~ msgstr "Nivel Tipo Pri Scheduled Nombre Volumen\n" -#: src/dird/ua_status.c:513 #, fuzzy -msgid "=====================================================================================\n" -msgstr "===================================================================================\n" +#~ msgid "=====================================================================================\n" +#~ msgstr "===================================================================================\n" -#: src/dird/ua_status.c:570 src/dird/ua_status.c:753 -#, c-format -msgid "%-14s\t%-8s\t%3d\t%-18s\t%-18s\t%s\n" -msgstr "%-14s\t%-8s\t%3d\t%-18s\t%-18s\t%s\n" +#~ msgid "%-14s\t%-8s\t%3d\t%-18s\t%-18s\t%s\n" +#~ msgstr "%-14s\t%-8s\t%3d\t%-18s\t%-18s\t%s\n" -#: src/dird/ua_status.c:591 src/dird/ua_status.c:757 -#, c-format -msgid "%-14s %-8s %3d %-18s %-18s %s\n" -msgstr "%-14s %-8s %3d %-18s %-18s %s\n" +#~ msgid "%-14s %-8s %3d %-18s %-18s %s\n" +#~ msgstr "%-14s %-8s %3d %-18s %-18s %s\n" -#: src/dird/ua_status.c:627 #, fuzzy -msgid "Ignoring invalid value for days. Max is 3000.\n" -msgstr "Ignorando valores inválidos para el día. Máximo es de 500.\n" +#~ msgid "Ignoring invalid value for days. Max is 3000.\n" +#~ msgstr "Ignorando valores inválidos para el día. Máximo es de 500.\n" -#: src/dird/ua_status.c:638 #, fuzzy -msgid "Ignoring invalid value for limit. Max is 2000.\n" -msgstr "Ignorando valores inválidos para el día. Máximo es de 500.\n" +#~ msgid "Ignoring invalid value for limit. Max is 2000.\n" +#~ msgstr "Ignorando valores inválidos para el día. Máximo es de 500.\n" -#: src/dird/ua_status.c:649 #, fuzzy -msgid "Ignoring invalid time.\n" -msgstr "Ruta dada no válida.\n" - -#: src/dird/ua_status.c:772 src/dird/ua_status.c:877 -msgid "No Scheduled Jobs.\n" -msgstr "No hay Jobs Programados.\n" +#~ msgid "Ignoring invalid time.\n" +#~ msgstr "Ruta dada no válida.\n" -#: src/dird/ua_status.c:824 -msgid "Ignoring invalid value for days. Max is 500.\n" -msgstr "Ignorando valores inválidos para el día. Máximo es de 500.\n" +#~ msgid "No Scheduled Jobs.\n" +#~ msgstr "No hay Jobs Programados.\n" -#: src/dird/ua_status.c:903 src/filed/status.c:228 src/stored/status.c:816 -msgid "" -"\n" -"Running Jobs:\n" -msgstr "" -"\n" -"Jobs Ejecutando:\n" +#~ msgid "Ignoring invalid value for days. Max is 500.\n" +#~ msgstr "Ignorando valores inválidos para el día. Máximo es de 500.\n" -#: src/dird/ua_status.c:911 -#, fuzzy, c-format -msgid "Console connected %sat %s\n" -msgstr "Consola conectada en %s\n" +#~ msgid "" +#~ "\n" +#~ "Running Jobs:\n" +#~ msgstr "" +#~ "\n" +#~ "Jobs Ejecutando:\n" -#: src/dird/ua_status.c:912 src/filed/status.c:240 -msgid "using TLS " -msgstr "" +#, fuzzy +#~ msgid "Console connected %sat %s\n" +#~ msgstr "Consola conectada en %s\n" -#: src/dird/ua_status.c:922 -msgid "" -"No Jobs running.\n" -"====\n" -msgstr "" -"Ningún Jobs ejecutando.\n" -"====\n" +#~ msgid "" +#~ "No Jobs running.\n" +#~ "====\n" +#~ msgstr "" +#~ "Ningún Jobs ejecutando.\n" +#~ "====\n" -#: src/dird/ua_status.c:929 #, fuzzy -msgid " JobId Type Level Files Bytes Name Status\n" -msgstr "JobId Nivel Nombre Estado\n" +#~ msgid " JobId Type Level Files Bytes Name Status\n" +#~ msgstr "JobId Nivel Nombre Estado\n" -#: src/dird/ua_status.c:930 -msgid "======================================================================\n" -msgstr "======================================================================\n" +#~ msgid "======================================================================\n" +#~ msgstr "======================================================================\n" -#: src/dird/ua_status.c:945 -msgid "is waiting execution" -msgstr "esta esperando ejecución" +#~ msgid "is waiting execution" +#~ msgstr "esta esperando ejecución" -#: src/dird/ua_status.c:948 -msgid "is running" -msgstr "esta ejecutando" +#~ msgid "is running" +#~ msgstr "esta ejecutando" -#: src/dird/ua_status.c:951 -msgid "is blocked" -msgstr "esta bloqueado" +#~ msgid "is blocked" +#~ msgstr "esta bloqueado" -#: src/dird/ua_status.c:954 -msgid "has terminated" -msgstr "ha terminado" +#~ msgid "has terminated" +#~ msgstr "ha terminado" -#: src/dird/ua_status.c:957 -msgid "has terminated with warnings" -msgstr "ha terminado con advertencias" +#~ msgid "has terminated with warnings" +#~ msgstr "ha terminado con advertencias" -#: src/dird/ua_status.c:960 #, fuzzy -msgid "has terminated in incomplete state" -msgstr "ha terminado con advertencias" +#~ msgid "has terminated in incomplete state" +#~ msgstr "ha terminado con advertencias" -#: src/dird/ua_status.c:963 -msgid "has erred" -msgstr "ha errado" +#~ msgid "has erred" +#~ msgstr "ha errado" -#: src/dird/ua_status.c:966 -msgid "has errors" -msgstr "tiene errores" +#~ msgid "has errors" +#~ msgstr "tiene errores" -#: src/dird/ua_status.c:969 -msgid "has a fatal error" -msgstr "tiene un error fatal" +#~ msgid "has a fatal error" +#~ msgstr "tiene un error fatal" -#: src/dird/ua_status.c:972 -msgid "has verify differences" -msgstr "ha verificar diferencias" +#~ msgid "has verify differences" +#~ msgstr "ha verificar diferencias" -#: src/dird/ua_status.c:975 -msgid "has been canceled" -msgstr "ha sido cancelado" +#~ msgid "has been canceled" +#~ msgstr "ha sido cancelado" -#: src/dird/ua_status.c:980 -msgid "is waiting on Client" -msgstr "esta esperando por Client" +#~ msgid "is waiting on Client" +#~ msgstr "esta esperando por Client" -#: src/dird/ua_status.c:982 -#, c-format -msgid "is waiting on Client %s" -msgstr "esta esperando por Cliente %s" +#~ msgid "is waiting on Client %s" +#~ msgstr "esta esperando por Cliente %s" -#: src/dird/ua_status.c:990 src/dird/ua_status.c:992 -#, fuzzy, c-format -msgid "is waiting on Storage \"%s\"" -msgstr "esta esperando por Storage %s" +#, fuzzy +#~ msgid "is waiting on Storage \"%s\"" +#~ msgstr "esta esperando por Storage %s" -#: src/dird/ua_status.c:994 -msgid "is waiting on Storage" -msgstr "esta esperando por Storage" +#~ msgid "is waiting on Storage" +#~ msgstr "esta esperando por Storage" -#: src/dird/ua_status.c:1000 -msgid "is waiting on max Storage jobs" -msgstr "esta esperando por máximo Storage jobs" +#~ msgid "is waiting on max Storage jobs" +#~ msgstr "esta esperando por máximo Storage jobs" -#: src/dird/ua_status.c:1003 -msgid "is waiting on max Client jobs" -msgstr "esta esperando por máximo Cliente jobs" +#~ msgid "is waiting on max Client jobs" +#~ msgstr "esta esperando por máximo Cliente jobs" -#: src/dird/ua_status.c:1006 -msgid "is waiting on max Job jobs" -msgstr "esta esperando por máximo Jobs jobs" +#~ msgid "is waiting on max Job jobs" +#~ msgstr "esta esperando por máximo Jobs jobs" -#: src/dird/ua_status.c:1009 -msgid "is waiting on max total jobs" -msgstr "esta esperando por máximo total jobs" +#~ msgid "is waiting on max total jobs" +#~ msgstr "esta esperando por máximo total jobs" -#: src/dird/ua_status.c:1013 -#, fuzzy, c-format -msgid "is waiting for its start time (%s)" -msgstr "esta esperando por su hora de inicio" +#, fuzzy +#~ msgid "is waiting for its start time (%s)" +#~ msgstr "esta esperando por su hora de inicio" -#: src/dird/ua_status.c:1019 -msgid "is waiting for higher priority jobs to finish" -msgstr "está esperando por jobs de una mayor prioridad para terminar" +#~ msgid "is waiting for higher priority jobs to finish" +#~ msgstr "está esperando por jobs de una mayor prioridad para terminar" -#: src/dird/ua_status.c:1022 #, fuzzy -msgid "is waiting for a Shared Storage device" -msgstr "esta esperando por Storage" +#~ msgid "is waiting for a Shared Storage device" +#~ msgstr "esta esperando por Storage" -#: src/dird/ua_status.c:1025 src/dird/ua_status.c:1076 src/lib/util.c:317 -msgid "SD committing Data" -msgstr "SD perpetrando Datos" +#~ msgid "SD committing Data" +#~ msgstr "SD perpetrando Datos" -#: src/dird/ua_status.c:1028 src/dird/ua_status.c:1079 src/lib/util.c:320 -msgid "SD despooling Data" -msgstr "SD desencolando Datos" +#~ msgid "SD despooling Data" +#~ msgstr "SD desencolando Datos" -#: src/dird/ua_status.c:1031 src/dird/ua_status.c:1082 src/lib/util.c:323 -msgid "SD despooling Attributes" -msgstr "SD desencolando Atributos" +#~ msgid "SD despooling Attributes" +#~ msgstr "SD desencolando Atributos" -#: src/dird/ua_status.c:1034 src/dird/ua_status.c:1085 src/lib/util.c:326 -msgid "Dir inserting Attributes" -msgstr "Insertando Atributos Dir" +#~ msgid "Dir inserting Attributes" +#~ msgstr "Insertando Atributos Dir" -#: src/dird/ua_status.c:1039 -#, c-format -msgid "is in unknown state %c" -msgstr "esta en estado desconocido %c" +#~ msgid "is in unknown state %c" +#~ msgstr "esta en estado desconocido %c" -#: src/dird/ua_status.c:1053 -msgid "is waiting for a mount request" -msgstr "esta esperando por petición de montaje" +#~ msgid "is waiting for a mount request" +#~ msgstr "esta esperando por petición de montaje" -#: src/dird/ua_status.c:1060 -msgid "is waiting for an appendable Volume" -msgstr "está esperando un Volumen appendable" +#~ msgid "is waiting for an appendable Volume" +#~ msgstr "está esperando un Volumen appendable" -#: src/dird/ua_status.c:1068 -msgid "is waiting for Client to connect to Storage daemon" -msgstr "está esperando por cliente para conectarse al demonio Storage" +#~ msgid "is waiting for Client to connect to Storage daemon" +#~ msgstr "está esperando por cliente para conectarse al demonio Storage" -#: src/dird/ua_status.c:1070 -#, c-format -msgid "is waiting for Client %s to connect to Storage %s" -msgstr "está aguardando por el Cliente %s para conectarse al Storage %s" +#~ msgid "is waiting for Client %s to connect to Storage %s" +#~ msgstr "está aguardando por el Cliente %s para conectarse al Storage %s" -#: src/dird/ua_status.c:1101 -#, fuzzy, c-format -msgid "%6d\t%-6s\t%-20s\t%s\t%s\n" -msgstr "%6d\t%-6s\t%-20s\t%s\n" +#, fuzzy +#~ msgid "%6d\t%-6s\t%-20s\t%s\t%s\n" +#~ msgstr "%6d\t%-6s\t%-20s\t%s\n" -#: src/dird/ua_status.c:1133 -#, fuzzy, c-format -msgid "%6d %-4s %-3s %10s %10s %-17s %s\n" -msgstr "%6d %-6s %8s %10s %-7s %-8s %s\n" +#, fuzzy +#~ msgid "%6d %-4s %-3s %10s %10s %-17s %s\n" +#~ msgstr "%6d %-6s %8s %10s %-7s %-8s %s\n" -#: src/dird/ua_status.c:1161 -msgid "No Terminated Jobs.\n" -msgstr "Jobs No Terminados.\n" +#~ msgid "No Terminated Jobs.\n" +#~ msgstr "Jobs No Terminados.\n" -#: src/dird/ua_status.c:1167 src/lib/status.h:77 -msgid "" -"\n" -"Terminated Jobs:\n" -msgstr "" -"\n" -"Jobs No Terminados:\n" +#~ msgid "====================================================================\n" +#~ msgstr "====================================================================\n" -#: src/dird/ua_status.c:1168 src/lib/status.h:84 -msgid " JobId Level Files Bytes Status Finished Name \n" -msgstr "JobId Nivel Archivos Bytes Estado Finalizado Nombre \n" +#~ msgid "\n" +#~ msgstr "\n" -#: src/dird/ua_status.c:1169 -msgid "====================================================================\n" -msgstr "====================================================================\n" +#~ msgid "add dir/file to be restored recursively, wildcards allowed" +#~ msgstr "" +#~ "añadir directorio/archivo a ser restaurado de forma recursiva, comodines " +#~ "permitido" -#: src/dird/ua_status.c:1203 src/lib/status.h:110 src/lib/util.c:256 -msgid "Created" -msgstr "Creado" +#~ msgid "change current directory" +#~ msgstr "cambio del directorio actual" -#: src/dird/ua_status.c:1210 src/lib/status.h:117 -msgid "Diffs" -msgstr "Diferencias" +#~ msgid "count marked files in and below the cd" +#~ msgstr "contar archivos marcados dentro y por debajo de CD" -#: src/dird/ua_status.c:1219 src/lib/status.h:126 src/lib/util.c:278 -#: src/lib/util.c:400 src/lib/util.c:406 -msgid "OK -- with warnings" -msgstr "OK - con advertencias" +#~ msgid "delete dir/file to be restored recursively in dir" +#~ msgstr "eliminar dir/archivo a restaurar recursivamente en dir" -#: src/dird/ua_status.c:1222 src/lib/status.h:129 -msgid "Incomplete" -msgstr "" +#~ msgid "long list current directory, wildcards allowed" +#~ msgstr "larga lista directorio actual, comodines permitido" -#: src/dird/ua_status.c:1225 src/lib/status.h:132 -msgid "Other" -msgstr "Otros" +#~ msgid "leave file selection mode" +#~ msgstr "abandonar el modo de selección de archivos" -#: src/dird/ua_status.c:1229 src/lib/status.h:144 -#, c-format -msgid "%6d\t%-6s\t%8s\t%10s\t%-7s\t%-8s\t%s\n" -msgstr "%6d\t%-6s\t%8s\t%10s\t%-7s\t%-8s\t%s\n" +#~ msgid "estimate restore size" +#~ msgstr "tamaño estimado de restauración" -#: src/dird/ua_status.c:1255 src/lib/status.h:173 -#, c-format -msgid "%6d %-6s %8s %10s %-7s %-8s %s\n" -msgstr "%6d %-6s %8s %10s %-7s %-8s %s\n" +#~ msgid "same as done command" +#~ msgstr "mismo que el comando done" -#: src/dird/ua_status.c:1265 -msgid "\n" -msgstr "\n" +#~ msgid "find files, wildcards allowed" +#~ msgstr "encontrar los archivos, comodines permitidos" -#: src/dird/ua_tree.c:63 -msgid "add dir/file to be restored recursively, wildcards allowed" -msgstr "" -"añadir directorio/archivo a ser restaurado de forma recursiva, comodines " -"permitido" +#~ msgid "print help" +#~ msgstr "imprimir ayuda" -#: src/dird/ua_tree.c:64 -msgid "change current directory" -msgstr "cambio del directorio actual" +#~ msgid "list current directory, wildcards allowed" +#~ msgstr "lista el directorio actual, comodines permitidos" -#: src/dird/ua_tree.c:65 -msgid "count marked files in and below the cd" -msgstr "contar archivos marcados dentro y por debajo de CD" +#, fuzzy +#~ msgid "list subdir in current directory, wildcards allowed" +#~ msgstr "lista el directorio actual, comodines permitidos" -#: src/dird/ua_tree.c:66 -msgid "delete dir/file to be restored recursively in dir" -msgstr "eliminar dir/archivo a restaurar recursivamente en dir" +#~ msgid "list the marked files in and below the cd" +#~ msgstr "lista los archivos marcados dentro y por debajo de CD" -#: src/dird/ua_tree.c:67 src/dird/ua_tree.c:68 -msgid "long list current directory, wildcards allowed" -msgstr "larga lista directorio actual, comodines permitido" +#, fuzzy +#~ msgid "list the marked files in" +#~ msgstr "lista los archivos marcados dentro y por debajo de CD" -#: src/dird/ua_tree.c:69 -msgid "leave file selection mode" -msgstr "abandonar el modo de selección de archivos" +#~ msgid "mark dir/file to be restored recursively, wildcards allowed" +#~ msgstr "" +#~ "marca directorio/archivo para restaurar recursivamente, comodines " +#~ "permitido" -#: src/dird/ua_tree.c:70 -msgid "estimate restore size" -msgstr "tamaño estimado de restauración" +#~ msgid "mark directory name to be restored (no files)" +#~ msgstr "marca nombre del directorio para ser restaurado (sin archivos)" -#: src/dird/ua_tree.c:71 -msgid "same as done command" -msgstr "mismo que el comando done" +#~ msgid "print current working directory" +#~ msgstr "imprimir directorio de trabajo actual" -#: src/dird/ua_tree.c:72 -msgid "find files, wildcards allowed" -msgstr "encontrar los archivos, comodines permitidos" +#~ msgid "unmark dir/file to be restored recursively in dir" +#~ msgstr "" +#~ "desmarcar directorio/archivo para ser restaurado en el directorio " +#~ "recursivamente" -#: src/dird/ua_tree.c:73 src/dird/ua_tree.c:86 src/dird/ua_tree.c:87 -msgid "print help" -msgstr "imprimir ayuda" +#~ msgid "unmark directory name only no recursion" +#~ msgstr "desmarcar solo nombre del directorio sin recursividad" -#: src/dird/ua_tree.c:74 src/dird/ua_tree.c:75 -msgid "list current directory, wildcards allowed" -msgstr "lista el directorio actual, comodines permitidos" +#~ msgid "quit and do not do restore" +#~ msgstr "salir y no restaurar" -#: src/dird/ua_tree.c:76 -#, fuzzy -msgid "list subdir in current directory, wildcards allowed" -msgstr "lista el directorio actual, comodines permitidos" +#~ msgid "" +#~ "\n" +#~ "You are now entering file selection mode where you add (mark) and\n" +#~ "remove (unmark) files to be restored. No files are initially added, " +#~ "unless\n" +#~ "you used the \"all\" keyword on the command line.\n" +#~ "Enter \"done\" to leave this mode.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Usted está entrando ahora en el modo de selección de archivo donde usted " +#~ "agrega(mark) y\n" +#~ "elimina (unmark) los archivos que va a restaurar. No hay archivos añadido " +#~ "inicialmente, a menos que\n" +#~ "usted utilice la palabra clave \"all\" en la línea de comandos. " +#~ "Introduzca \"done\" para salir de este modo.\n" +#~ "\n" -#: src/dird/ua_tree.c:77 -msgid "list the marked files in and below the cd" -msgstr "lista los archivos marcados dentro y por debajo de CD" +#~ msgid "cwd is: %s\n" +#~ msgstr "cwd es: %s\n" -#: src/dird/ua_tree.c:78 #, fuzzy -msgid "list the marked files in" -msgstr "lista los archivos marcados dentro y por debajo de CD" +#~ msgid "Invalid command \"%s\". Enter \"done\" to exit.\n" +#~ msgstr "Invalido comando \"%s\". Introduzca \"done\" para salir.\n" -#: src/dird/ua_tree.c:79 -msgid "mark dir/file to be restored recursively, wildcards allowed" -msgstr "" -"marca directorio/archivo para restaurar recursivamente, comodines permitido" +#~ msgid "No files marked.\n" +#~ msgstr "Ningún archivo marcado.\n" -#: src/dird/ua_tree.c:80 -msgid "mark directory name to be restored (no files)" -msgstr "marca nombre del directorio para ser restaurado (sin archivos)" +#~ msgid "1 file marked.\n" +#~ msgstr "1 archivo marcado.\n" -#: src/dird/ua_tree.c:81 src/dird/ua_tree.c:82 -msgid "print current working directory" -msgstr "imprimir directorio de trabajo actual" +#~ msgid "%s files marked.\n" +#~ msgstr "%s archivos marcados.\n" -#: src/dird/ua_tree.c:83 -msgid "unmark dir/file to be restored recursively in dir" -msgstr "" -"desmarcar directorio/archivo para ser restaurado en el directorio " -"recursivamente" +#~ msgid "No directories marked.\n" +#~ msgstr "Ningún directorio marcado.\n" -#: src/dird/ua_tree.c:84 -msgid "unmark directory name only no recursion" -msgstr "desmarcar solo nombre del directorio sin recursividad" +#~ msgid "1 directory marked.\n" +#~ msgstr "1 directorio marcado.\n" -#: src/dird/ua_tree.c:85 -msgid "quit and do not do restore" -msgstr "salir y no restaurar" +#~ msgid "%s directories marked.\n" +#~ msgstr "%s directorios marcados.\n" -#: src/dird/ua_tree.c:107 -msgid "" -"\n" -"You are now entering file selection mode where you add (mark) and\n" -"remove (unmark) files to be restored. No files are initially added, unless\n" -"you used the \"all\" keyword on the command line.\n" -"Enter \"done\" to leave this mode.\n" -"\n" -msgstr "" -"\n" -"Usted está entrando ahora en el modo de selección de archivo donde usted " -"agrega(mark) y\n" -"elimina (unmark) los archivos que va a restaurar. No hay archivos añadido " -"inicialmente, a menos que\n" -"usted utilice la palabra clave \"all\" en la línea de comandos. Introduzca " -"\"done\" para salir de este modo.\n" -"\n" +#~ msgid "%s total files/dirs. %s marked to be restored.\n" +#~ msgstr "" +#~ "%s total de los archivos/directorios. %s marcado para ser restaurado.\n" -#: src/dird/ua_tree.c:118 src/dird/ua_tree.c:848 -#, c-format -msgid "cwd is: %s\n" -msgstr "cwd es: %s\n" +#~ msgid "No file specification given.\n" +#~ msgstr "Especificación de archivo no dado.\n" -#: src/dird/ua_tree.c:127 src/dird/ua_tree.c:146 -#, fuzzy, c-format -msgid "Invalid command \"%s\". Enter \"done\" to exit.\n" -msgstr "Invalido comando \"%s\". Introduzca \"done\" para salir.\n" +#~ msgid "Node %s has no children.\n" +#~ msgstr "Nodo %s no tiene hijos.\n" -#: src/dird/ua_tree.c:218 -#, c-format -msgid "" -"Something is wrong with the Delta sequence of %s, skiping new parts. Current " -"sequence is %d\n" -msgstr "" +#~ msgid "%d total files; %d marked to be restored; %s bytes.\n" +#~ msgstr "" +#~ "%d total de los archivos; %d marcado para ser restaurado; %s bytes.\n" -#: src/dird/ua_tree.c:390 src/dird/ua_tree.c:402 src/dird/ua_tree.c:419 -msgid "No files marked.\n" -msgstr "Ningún archivo marcado.\n" +#~ msgid "" +#~ " Command Description\n" +#~ " ======= ===========\n" +#~ msgstr "" +#~ "Comando Descripción\n" +#~ " ======= ===========\n" -#: src/dird/ua_tree.c:404 -msgid "1 file marked.\n" -msgstr "1 archivo marcado.\n" +#~ msgid "Too few or too many arguments. Try using double quotes.\n" +#~ msgstr "Muy pocos o demasiados argumentos. Trate de usar comillas dobles.\n" -#: src/dird/ua_tree.c:406 -#, c-format -msgid "%s files marked.\n" -msgstr "%s archivos marcados.\n" +#~ msgid "Invalid path given.\n" +#~ msgstr "Ruta dada no válida.\n" -#: src/dird/ua_tree.c:434 -msgid "No directories marked.\n" -msgstr "Ningún directorio marcado.\n" +#~ msgid "No files unmarked.\n" +#~ msgstr "No hay archivos sin marcar.\n" -#: src/dird/ua_tree.c:436 -msgid "1 directory marked.\n" -msgstr "1 directorio marcado.\n" +#~ msgid "1 file unmarked.\n" +#~ msgstr "1 archivo sin marcar.\n" -#: src/dird/ua_tree.c:438 -#, c-format -msgid "%s directories marked.\n" -msgstr "%s directorios marcados.\n" +#~ msgid "%s files unmarked.\n" +#~ msgstr "%s archivos sin marcar.\n" -#: src/dird/ua_tree.c:459 -#, c-format -msgid "%s total files/dirs. %s marked to be restored.\n" -msgstr "" -"%s total de los archivos/directorios. %s marcado para ser restaurado.\n" +#~ msgid "No directories unmarked.\n" +#~ msgstr "No hay directorios sin marcar.\n" -#: src/dird/ua_tree.c:470 -msgid "No file specification given.\n" -msgstr "Especificación de archivo no dado.\n" +#~ msgid "1 directory unmarked.\n" +#~ msgstr "1 directorio sin marcar.\n" -#: src/dird/ua_tree.c:691 -#, c-format -msgid "Node %s has no children.\n" -msgstr "Nodo %s no tiene hijos.\n" +#~ msgid "%d directories unmarked.\n" +#~ msgstr "%d directorios sin marcar.\n" -#: src/dird/ua_tree.c:784 -#, c-format -msgid "%d total files; %d marked to be restored; %s bytes.\n" -msgstr "%d total de los archivos; %d marcado para ser restaurado; %s bytes.\n" +#~ msgid "Update choice:\n" +#~ msgstr "Actualizar selección:\n" -#: src/dird/ua_tree.c:795 src/stored/btape.c:2948 -#, c-format -msgid "" -" Command Description\n" -" ======= ===========\n" -msgstr "" -"Comando Descripción\n" -" ======= ===========\n" +#~ msgid "Volume parameters" +#~ msgstr "Parámetros del Volumen" -#: src/dird/ua_tree.c:818 -msgid "Too few or too many arguments. Try using double quotes.\n" -msgstr "Muy pocos o demasiados argumentos. Trate de usar comillas dobles.\n" +#~ msgid "Pool from resource" +#~ msgstr "Pool de recursos" -#: src/dird/ua_tree.c:831 -msgid "Invalid path given.\n" -msgstr "Ruta dada no válida.\n" +#~ msgid "Slots from autochanger" +#~ msgstr "Slots de cargador" -#: src/dird/ua_tree.c:867 src/dird/ua_tree.c:879 -msgid "No files unmarked.\n" -msgstr "No hay archivos sin marcar.\n" +#~ msgid "Long term statistics" +#~ msgstr "Estadísticas a largo plazo" -#: src/dird/ua_tree.c:881 -msgid "1 file unmarked.\n" -msgstr "1 archivo sin marcar.\n" +#, fuzzy +#~ msgid "Snapshot parameters" +#~ msgstr "Parámetros del Volumen" -#: src/dird/ua_tree.c:884 -#, c-format -msgid "%s files unmarked.\n" -msgstr "%s archivos sin marcar.\n" +#~ msgid "item" +#~ msgstr "í­tem" -#: src/dird/ua_tree.c:895 src/dird/ua_tree.c:912 -msgid "No directories unmarked.\n" -msgstr "No hay directorios sin marcar.\n" +#~ msgid "Choose catalog item to update" +#~ msgstr "Seleccione el ítem del catalogo para ser actualizado" -#: src/dird/ua_tree.c:914 -msgid "1 directory unmarked.\n" -msgstr "1 directorio sin marcar.\n" +#~ msgid "Invalid VolStatus specified: %s\n" +#~ msgstr "Invalido VolStatus especificado: %s\n" -#: src/dird/ua_tree.c:916 -#, c-format -msgid "%d directories unmarked.\n" -msgstr "%d directorios sin marcar.\n" +#~ msgid "New Volume status is: %s\n" +#~ msgstr "Nuevo estado del Volumen es: %s\n" -#: src/dird/ua_update.c:92 -msgid "Update choice:\n" -msgstr "Actualizar selección:\n" +#~ msgid "Invalid use duration specified: %s\n" +#~ msgstr "Duración de uso especificado no válido: %s\n" -#: src/dird/ua_update.c:93 -msgid "Volume parameters" -msgstr "Parámetros del Volumen" +#~ msgid "New use duration is: %s\n" +#~ msgstr "Nueva duración de uso es: %s\n" -#: src/dird/ua_update.c:94 -msgid "Pool from resource" -msgstr "Pool de recursos" +#~ msgid "New max jobs is: %s\n" +#~ msgstr "Nuevo máximo jobs es: %s\n" -#: src/dird/ua_update.c:95 -msgid "Slots from autochanger" -msgstr "Slots de cargador" +#~ msgid "New max files is: %s\n" +#~ msgstr "Nuevo máximo files es: %s\n" -#: src/dird/ua_update.c:96 -msgid "Long term statistics" -msgstr "Estadísticas a largo plazo" +#~ msgid "Invalid max. bytes specification: %s\n" +#~ msgstr "Invalido máximo bytes especificación: %s\n" -#: src/dird/ua_update.c:97 -#, fuzzy -msgid "Snapshot parameters" -msgstr "Parámetros del Volumen" +#~ msgid "New Max bytes is: %s\n" +#~ msgstr "Nuevo máximo bytes es: %s\n" -#: src/dird/ua_update.c:98 -msgid "item" -msgstr "í­tem" +#~ msgid "Invalid value. It must be yes or no.\n" +#~ msgstr "Valor no válido. Debe ser sí o no.\n" -#: src/dird/ua_update.c:98 -msgid "Choose catalog item to update" -msgstr "Seleccione el ítem del catalogo para ser actualizado" +#~ msgid "New Recycle flag is: %s\n" +#~ msgstr "Nueva Recycle flag es: %s\n" -#: src/dird/ua_update.c:144 -#, c-format -msgid "Invalid VolStatus specified: %s\n" -msgstr "Invalido VolStatus especificado: %s\n" +#~ msgid "New InChanger flag is: %s\n" +#~ msgstr "Nueva InChanger flag es: %s\n" -#: src/dird/ua_update.c:153 -#, c-format -msgid "New Volume status is: %s\n" -msgstr "Nuevo estado del Volumen es: %s\n" +#~ msgid "Invalid slot, it must be between 0 and MaxVols=%d\n" +#~ msgstr "Ranura no válido, debe estar entre 0 y MaxVols=%d\n" -#: src/dird/ua_update.c:182 -#, c-format -msgid "Invalid use duration specified: %s\n" -msgstr "Duración de uso especificado no válido: %s\n" +#~ msgid "Error updating media record Slot: ERR=%s" +#~ msgstr "Error actualizando registro de medios de Ranuras: ERR=%s" -#: src/dird/ua_update.c:190 -#, c-format -msgid "New use duration is: %s\n" -msgstr "Nueva duración de uso es: %s\n" +#~ msgid "New Slot is: %d\n" +#~ msgstr "Nueva Ranura es: %d\n" -#: src/dird/ua_update.c:204 -#, c-format -msgid "New max jobs is: %s\n" -msgstr "Nuevo máximo jobs es: %s\n" +#~ msgid "New Pool is: %s\n" +#~ msgstr "Nuevo Pool es: %s\n" -#: src/dird/ua_update.c:217 -#, c-format -msgid "New max files is: %s\n" -msgstr "Nuevo máximo files es: %s\n" +#~ msgid "New RecyclePool is: %s\n" +#~ msgstr "Nuevo RecyclePool es: %s\n" -#: src/dird/ua_update.c:228 -#, c-format -msgid "Invalid max. bytes specification: %s\n" -msgstr "Invalido máximo bytes especificación: %s\n" +#~ msgid "Error updating Volume record: ERR=%s" +#~ msgstr "Error actualizando registro Volumen: ERR=%s" -#: src/dird/ua_update.c:236 -#, c-format -msgid "New Max bytes is: %s\n" -msgstr "Nuevo máximo bytes es: %s\n" +#~ msgid "Volume defaults updated from \"%s\" Pool record.\n" +#~ msgstr "Volumen por defecto actualizado desde registro \"%s\" Pool.\n" -#: src/dird/ua_update.c:247 src/dird/ua_update.c:267 -msgid "Invalid value. It must be yes or no.\n" -msgstr "Valor no válido. Debe ser sí o no.\n" +#~ msgid "Error updating Volume records: ERR=%s" +#~ msgstr "Error actualizando registros Volumen: ERR=%s" -#: src/dird/ua_update.c:255 -#, c-format -msgid "New Recycle flag is: %s\n" -msgstr "Nueva Recycle flag es: %s\n" +#~ msgid "All Volume defaults updated from \"%s\" Pool record.\n" +#~ msgstr "" +#~ "Todos Volúmenes por defectos actualizado desde registro \"%s\" Pool.\n" -#: src/dird/ua_update.c:275 -#, c-format -msgid "New InChanger flag is: %s\n" -msgstr "Nueva InChanger flag es: %s\n" +#~ msgid "Updating all pools, but skipped PoolId=%d. ERR=%s\n" +#~ msgstr "Actualizando todos los pools, pero saltando PoolId=%d. ERR=%s\n" -#: src/dird/ua_update.c:293 -#, c-format -msgid "Invalid slot, it must be between 0 and MaxVols=%d\n" -msgstr "Ranura no válido, debe estar entre 0 y MaxVols=%d\n" +#~ msgid "Error updating media record Enabled: ERR=%s" +#~ msgstr "Error actualizando registro media Activado: ERR=%s" -#: src/dird/ua_update.c:303 src/dird/ua_update.c:727 -#, c-format -msgid "Error updating media record Slot: ERR=%s" -msgstr "Error actualizando registro de medios de Ranuras: ERR=%s" +#~ msgid "New Enabled is: %d\n" +#~ msgstr "Nuevo Activado es: %d\n" -#: src/dird/ua_update.c:305 -#, c-format -msgid "New Slot is: %d\n" -msgstr "Nueva Ranura es: %d\n" +#~ msgid "Error updating media record ActionOnPurge: ERR=%s" +#~ msgstr "Error actualizando registro de medios ActionOnPurge: ERR=%s" -#: src/dird/ua_update.c:330 -#, c-format -msgid "New Pool is: %s\n" -msgstr "Nuevo Pool es: %s\n" +#~ msgid "New ActionOnPurge is: %s\n" +#~ msgstr "Nueva ActionOnPurge es: %s\n" -#: src/dird/ua_update.c:373 -#, c-format -msgid "New RecyclePool is: %s\n" -msgstr "Nuevo RecyclePool es: %s\n" +#~ msgid "Volume Status" +#~ msgstr "Estado del Volumen" -#: src/dird/ua_update.c:393 -#, c-format -msgid "Error updating Volume record: ERR=%s" -msgstr "Error actualizando registro Volumen: ERR=%s" +#~ msgid "Volume Retention Period" +#~ msgstr "Periodo de Retención del Volumen" -#: src/dird/ua_update.c:395 -#, c-format -msgid "Volume defaults updated from \"%s\" Pool record.\n" -msgstr "Volumen por defecto actualizado desde registro \"%s\" Pool.\n" +#~ msgid "Volume Use Duration" +#~ msgstr "Duración de uso del Volumen" -#: src/dird/ua_update.c:418 src/dird/ua_update.c:450 -#, c-format -msgid "Error updating Volume records: ERR=%s" -msgstr "Error actualizando registros Volumen: ERR=%s" +#~ msgid "Maximum Volume Jobs" +#~ msgstr "Máximo Volumen Jobs" -#: src/dird/ua_update.c:420 src/dird/ua_update.c:452 -#, c-format -msgid "All Volume defaults updated from \"%s\" Pool record.\n" -msgstr "Todos Volúmenes por defectos actualizado desde registro \"%s\" Pool.\n" +#~ msgid "Maximum Volume Files" +#~ msgstr "Máximo Archivos de Volumen" -#: src/dird/ua_update.c:442 -#, c-format -msgid "Updating all pools, but skipped PoolId=%d. ERR=%s\n" -msgstr "Actualizando todos los pools, pero saltando PoolId=%d. ERR=%s\n" +#~ msgid "Maximum Volume Bytes" +#~ msgstr "Máximo Volumen Bytes" -#: src/dird/ua_update.c:468 -#, c-format -msgid "Error updating media record Enabled: ERR=%s" -msgstr "Error actualizando registro media Activado: ERR=%s" +#~ msgid "Recycle Flag" +#~ msgstr "Recycle Flag" -#: src/dird/ua_update.c:471 -#, c-format -msgid "New Enabled is: %d\n" -msgstr "Nuevo Activado es: %d\n" +#~ msgid "Slot" +#~ msgstr "Ranura" -#: src/dird/ua_update.c:486 -#, c-format -msgid "Error updating media record ActionOnPurge: ERR=%s" -msgstr "Error actualizando registro de medios ActionOnPurge: ERR=%s" +#~ msgid "InChanger Flag" +#~ msgstr "InChanger Flag" -#: src/dird/ua_update.c:489 -#, c-format -msgid "New ActionOnPurge is: %s\n" -msgstr "Nueva ActionOnPurge es: %s\n" +#~ msgid "Volume Files" +#~ msgstr "Archivos de Volumen" -#: src/dird/ua_update.c:605 -msgid "Volume Status" -msgstr "Estado del Volumen" +#~ msgid "Volume from Pool" +#~ msgstr "Volumen de Pool" -#: src/dird/ua_update.c:606 -msgid "Volume Retention Period" -msgstr "Periodo de Retención del Volumen" +#~ msgid "All Volumes from Pool" +#~ msgstr "Todos Volúmenes de Pool" -#: src/dird/ua_update.c:607 -msgid "Volume Use Duration" -msgstr "Duración de uso del Volumen" +#~ msgid "All Volumes from all Pools" +#~ msgstr "Todos los Volúmenes de todas los Pools" -#: src/dird/ua_update.c:608 -msgid "Maximum Volume Jobs" -msgstr "Máximo Volumen Jobs" +#~ msgid "Enabled" +#~ msgstr "Activado" -#: src/dird/ua_update.c:609 -msgid "Maximum Volume Files" -msgstr "Máximo Archivos de Volumen" +#~ msgid "RecyclePool" +#~ msgstr "RecyclePool" -#: src/dird/ua_update.c:610 -msgid "Maximum Volume Bytes" -msgstr "Máximo Volumen Bytes" +#~ msgid "Action On Purge" +#~ msgstr "Action On Purge" -#: src/dird/ua_update.c:611 -msgid "Recycle Flag" -msgstr "Recycle Flag" +#~ msgid "Updating Volume \"%s\"\n" +#~ msgstr "Actualizando Volumen \"%s\"\n" -#: src/dird/ua_update.c:612 -msgid "Slot" -msgstr "Ranura" +#~ msgid "Current Volume status is: %s\n" +#~ msgstr "Actual estado del Volumen es: %s\n" -#: src/dird/ua_update.c:613 -msgid "InChanger Flag" -msgstr "InChanger Flag" +#~ msgid "Possible Values are:\n" +#~ msgstr "Posibles Valores son:\n" -#: src/dird/ua_update.c:614 -msgid "Volume Files" -msgstr "Archivos de Volumen" +#~ msgid "Choose new Volume Status" +#~ msgstr "Seleccione el nuevo estado del Volumen" -#: src/dird/ua_update.c:616 -msgid "Volume from Pool" -msgstr "Volumen de Pool" +#~ msgid "Enter Volume Retention period: " +#~ msgstr "Introduzca periodo de Retención del Volumen:" -#: src/dird/ua_update.c:617 -msgid "All Volumes from Pool" -msgstr "Todos Volúmenes de Pool" +#~ msgid "Current use duration is: %s\n" +#~ msgstr "Duración de uso actual es: %s\n" -#: src/dird/ua_update.c:618 -msgid "All Volumes from all Pools" -msgstr "Todos los Volúmenes de todas los Pools" +#~ msgid "Enter Volume Use Duration: " +#~ msgstr "Introduzca Duración de Uso de Volumen:" -#: src/dird/ua_update.c:619 -msgid "Enabled" -msgstr "Activado" +#~ msgid "Current max jobs is: %u\n" +#~ msgstr "Máximo jobs actual es: %u\n" -#: src/dird/ua_update.c:620 -msgid "RecyclePool" -msgstr "RecyclePool" +#~ msgid "Enter new Maximum Jobs: " +#~ msgstr "Introduzca nuevo Máximo de Trabajos" -#: src/dird/ua_update.c:621 -msgid "Action On Purge" -msgstr "Action On Purge" +#~ msgid "Current max files is: %u\n" +#~ msgstr "Actual máximo de archivos es: %u\n" -#: src/dird/ua_update.c:631 -#, c-format -msgid "Updating Volume \"%s\"\n" -msgstr "Actualizando Volumen \"%s\"\n" +#~ msgid "Enter new Maximum Files: " +#~ msgstr "Introduzca nuevo máximo de archivos:" -#: src/dird/ua_update.c:636 -#, c-format -msgid "Current Volume status is: %s\n" -msgstr "Actual estado del Volumen es: %s\n" +#~ msgid "Current value is: %s\n" +#~ msgstr "Valor actual es: %s\n" -#: src/dird/ua_update.c:637 -msgid "Possible Values are:\n" -msgstr "Posibles Valores son:\n" +#~ msgid "Enter new Maximum Bytes: " +#~ msgstr "Introduzca nuevo Máximo de Bytes:" -#: src/dird/ua_update.c:648 -msgid "Choose new Volume Status" -msgstr "Seleccione el nuevo estado del Volumen" +#~ msgid "Current recycle flag is: %s\n" +#~ msgstr "Recycle flag actual es: %s\n" -#: src/dird/ua_update.c:656 -msgid "Enter Volume Retention period: " -msgstr "Introduzca periodo de Retención del Volumen:" +#~ msgid "Enter new Recycle status: " +#~ msgstr "Introduzca el nuevo estado de Reciclaje:" -#: src/dird/ua_update.c:663 -#, c-format -msgid "Current use duration is: %s\n" -msgstr "Duración de uso actual es: %s\n" +#~ msgid "Current Slot is: %d\n" +#~ msgstr "Ranura Actual es: %d\n" -#: src/dird/ua_update.c:665 -msgid "Enter Volume Use Duration: " -msgstr "Introduzca Duración de Uso de Volumen:" +#~ msgid "Enter new Slot: " +#~ msgstr "Introduzca nueva Ranura:" -#: src/dird/ua_update.c:672 -#, c-format -msgid "Current max jobs is: %u\n" -msgstr "Máximo jobs actual es: %u\n" +#~ msgid "Current InChanger flag is: %d\n" +#~ msgstr "Bandera InChanger actual es: %d\n" -#: src/dird/ua_update.c:673 -msgid "Enter new Maximum Jobs: " -msgstr "Introduzca nuevo Máximo de Trabajos" +#~ msgid "Set InChanger flag for Volume \"%s\": yes/no: " +#~ msgstr "Configurar bandera InChanger para Volumen \"%s\": sí/no: " -#: src/dird/ua_update.c:680 -#, c-format -msgid "Current max files is: %u\n" -msgstr "Actual máximo de archivos es: %u\n" +#~ msgid "New InChanger flag is: %d\n" +#~ msgstr "Nueva InChanger flag es: %d\n" -#: src/dird/ua_update.c:681 -msgid "Enter new Maximum Files: " -msgstr "Introduzca nuevo máximo de archivos:" +#~ msgid "" +#~ "Warning changing Volume Files can result\n" +#~ "in loss of data on your Volume\n" +#~ "\n" +#~ msgstr "" +#~ "Advertencia, cambiar Archivos de Volumen puede resultar\n" +#~ "en pérdida de datos en el Volumen\n" +#~ "\n" -#: src/dird/ua_update.c:688 -#, c-format -msgid "Current value is: %s\n" -msgstr "Valor actual es: %s\n" +#~ msgid "Current Volume Files is: %u\n" +#~ msgstr "Archivos de Volumen actual es: %u\n" -#: src/dird/ua_update.c:689 -msgid "Enter new Maximum Bytes: " -msgstr "Introduzca nuevo Máximo de Bytes:" +#~ msgid "Enter new number of Files for Volume: " +#~ msgstr "Introduzca el nuevo número de Archivos para el Volumen:" -#: src/dird/ua_update.c:697 -#, c-format -msgid "Current recycle flag is: %s\n" -msgstr "Recycle flag actual es: %s\n" +#~ msgid "Normally, you should only increase Volume Files by one!\n" +#~ msgstr "Normalmente, sólo debería aumentar el Archivo de Volumen en uno!\n" -#: src/dird/ua_update.c:699 -msgid "Enter new Recycle status: " -msgstr "Introduzca el nuevo estado de Reciclaje:" +#~ msgid "Increase Volume Files? (yes/no): " +#~ msgstr "Incrementar Archivo de Volumen? (sí/no):" -#: src/dird/ua_update.c:706 -#, c-format -msgid "Current Slot is: %d\n" -msgstr "Ranura Actual es: %d\n" +#~ msgid "New Volume Files is: %u\n" +#~ msgstr "Nuevo Archivo de Volumen es: %u\n" -#: src/dird/ua_update.c:707 -msgid "Enter new Slot: " -msgstr "Introduzca nueva Ranura:" +#~ msgid "Current Pool is: %s\n" +#~ msgstr "Pool actual es: %s\n" -#: src/dird/ua_update.c:714 -#, c-format -msgid "Current InChanger flag is: %d\n" -msgstr "Bandera InChanger actual es: %d\n" +#~ msgid "Enter new Pool name: " +#~ msgstr "Introduzca el nuevo nombre del Pool:" -#: src/dird/ua_update.c:715 -#, c-format -msgid "Set InChanger flag for Volume \"%s\": yes/no: " -msgstr "Configurar bandera InChanger para Volumen \"%s\": sí/no: " +#~ msgid "Current Enabled is: %d\n" +#~ msgstr "Habilitado(Enabled) actual es: %d\n" -#: src/dird/ua_update.c:729 -#, c-format -msgid "New InChanger flag is: %d\n" -msgstr "Nueva InChanger flag es: %d\n" +#~ msgid "Enter new Enabled: " +#~ msgstr "Introduzca nuevo Habilitado(Enabled):" -#: src/dird/ua_update.c:736 -msgid "" -"Warning changing Volume Files can result\n" -"in loss of data on your Volume\n" -"\n" -msgstr "" -"Advertencia, cambiar Archivos de Volumen puede resultar\n" -"en pérdida de datos en el Volumen\n" -"\n" +#~ msgid "Current RecyclePool is: %s\n" +#~ msgstr "RecyclePool actual es: %s\n" -#: src/dird/ua_update.c:738 -#, c-format -msgid "Current Volume Files is: %u\n" -msgstr "Archivos de Volumen actual es: %u\n" +#~ msgid "No current RecyclePool\n" +#~ msgstr "No actual RecyclePool\n" -#: src/dird/ua_update.c:739 -msgid "Enter new number of Files for Volume: " -msgstr "Introduzca el nuevo número de Archivos para el Volumen:" +#~ msgid "Current ActionOnPurge is: %s\n" +#~ msgstr "Actual ActionOnPurge es: %s\n" -#: src/dird/ua_update.c:744 -msgid "Normally, you should only increase Volume Files by one!\n" -msgstr "Normalmente, sólo debería aumentar el Archivo de Volumen en uno!\n" +#~ msgid "Enter new ActionOnPurge (one of: Truncate, None): " +#~ msgstr "Introduzca nuevo ActionOnPurge (uno de: Truncar, Ninguno):" -#: src/dird/ua_update.c:745 -msgid "Increase Volume Files? (yes/no): " -msgstr "Incrementar Archivo de Volumen? (sí/no):" +#~ msgid "Updating %i job(s).\n" +#~ msgstr "Actualizando %i job(s).\n" -#: src/dird/ua_update.c:755 -#, c-format -msgid "New Volume Files is: %u\n" -msgstr "Nuevo Archivo de Volumen es: %u\n" +#~ msgid "db_update_pool_record returned %d. ERR=%s\n" +#~ msgstr "db_update_pool_record regreso %d. ERR=%s\n" -#: src/dird/ua_update.c:767 -#, c-format -msgid "Current Pool is: %s\n" -msgstr "Pool actual es: %s\n" +#~ msgid "Pool DB record updated from resource.\n" +#~ msgstr "registro BD Pool actualizado desde recursos.\n" -#: src/dird/ua_update.c:768 -msgid "Enter new Pool name: " -msgstr "Introduzca el nuevo nombre del Pool:" +#~ msgid "Expect JobId keyword, not found.\n" +#~ msgstr "Esperaba palabra clave JobId, no encontrada.\n" -#: src/dird/ua_update.c:789 -#, c-format -msgid "Current Enabled is: %d\n" -msgstr "Habilitado(Enabled) actual es: %d\n" +#~ msgid "Neither Client nor StartTime specified.\n" +#~ msgstr "Ni el Cliente ni StartTime especificado.\n" -#: src/dird/ua_update.c:790 -msgid "Enter new Enabled: " -msgstr "Introduzca nuevo Habilitado(Enabled):" +#~ msgid "Start Virtual Backup JobId %s, Job=%s\n" +#~ msgstr "Respaldo Virtual iniciado JobId %s, Job=%s\n" -#: src/dird/ua_update.c:800 -#, c-format -msgid "Current RecyclePool is: %s\n" -msgstr "RecyclePool actual es: %s\n" +#~ msgid "" +#~ "This Job is not an Accurate backup so is not equivalent to a Full " +#~ "backup.\n" +#~ msgstr "" +#~ "Este trabajo no es una copia de seguridad exacta, por lo que no es " +#~ "equivalente a una copia de seguridad completa.\n" -#: src/dird/ua_update.c:802 -msgid "No current RecyclePool\n" -msgstr "No actual RecyclePool\n" +#, fuzzy +#~ msgid "No valid Jobs found from user selection.\n" +#~ msgstr "No se encontró ningún Job para: %s.\n" -#: src/dird/ua_update.c:812 -#, c-format -msgid "Current ActionOnPurge is: %s\n" -msgstr "Actual ActionOnPurge es: %s\n" +#, fuzzy +#~ msgid "Using user supplied JobIds=%s\n" +#~ msgstr "%s utilizando JobId=%s Job=%s\n" -#: src/dird/ua_update.c:814 -msgid "Enter new ActionOnPurge (one of: Truncate, None): " -msgstr "Introduzca nuevo ActionOnPurge (uno de: Truncar, Ninguno):" +#~ msgid "No previous Jobs found.\n" +#~ msgstr "Jobs previos no encontrados.\n" -#: src/dird/ua_update.c:842 -#, c-format -msgid "Updating %i job(s).\n" -msgstr "Actualizando %i job(s).\n" +#~ msgid "Error getting Job record for previous Job: ERR=%s" +#~ msgstr "Error obteniendo registro Job para Job anterior: ERR=%s" -#: src/dird/ua_update.c:874 -#, c-format -msgid "db_update_pool_record returned %d. ERR=%s\n" -msgstr "db_update_pool_record regreso %d. ERR=%s\n" +#, fuzzy +#~ msgid "" +#~ "%s %s %s (%s):\n" +#~ " Build OS: %s %s %s\n" +#~ " JobId: %d\n" +#~ " Job: %s\n" +#~ " Backup Level: Virtual Full\n" +#~ " Client: \"%s\" %s\n" +#~ " FileSet: \"%s\" %s\n" +#~ " Pool: \"%s\" (From %s)\n" +#~ " Catalog: \"%s\" (From %s)\n" +#~ " Storage: \"%s\" (From %s)\n" +#~ " Scheduled time: %s\n" +#~ " Start time: %s\n" +#~ " End time: %s\n" +#~ " Elapsed time: %s\n" +#~ " Priority: %d\n" +#~ " SD Files Written: %s\n" +#~ " SD Bytes Written: %s (%sB)\n" +#~ " Rate: %.1f KB/s\n" +#~ " Volume name(s): %s\n" +#~ " Volume Session Id: %d\n" +#~ " Volume Session Time: %d\n" +#~ " Last Volume Bytes: %s (%sB)\n" +#~ " SD Errors: %d\n" +#~ " SD termination status: %s\n" +#~ " Termination: %s\n" +#~ "\n" +#~ msgstr "" +#~ "%s %s %s (%s): %s\n" +#~ " Build OS: %s %s %s\n" +#~ " JobId: %d\n" +#~ " Job: %s\n" +#~ " Nivel del Respaldo: Virtual Completo\n" +#~ " Cliente: \"%s\" %s\n" +#~ " FileSet: \"%s\" %s\n" +#~ " Pool: \"%s\" (Desde %s)\n" +#~ " Catalogo: \"%s\" (Desde %s)\n" +#~ " Storage: \"%s\" (Desde %s)\n" +#~ " Hora programada: %s\n" +#~ " Hora de inicio: %s\n" +#~ " Hora de finalización: %s\n" +#~ " Tiempo transcurrido: %s\n" +#~ " Prioridad: %d\n" +#~ " SD Archivos Escritos: %s\n" +#~ " SD Bytes Escritos: %s (%sB)\n" +#~ " Tasa: %.1f KB/s\n" +#~ " Nombre del Volumen(es): %s\n" +#~ " Id de Sesión de Volumen: %d\n" +#~ " Tiempo de Sesión de Volumen: %d\n" +#~ " Ultimo Bytes del Volumen: %s (%sB)\n" +#~ " Errores del SD: %d\n" +#~ " Estado de terminación del SD: %s\n" +#~ " Terminación: %s\n" +#~ "\n" -#: src/dird/ua_update.c:881 -msgid "Pool DB record updated from resource.\n" -msgstr "registro BD Pool actualizado desde recursos.\n" +#~ msgid "Unimplemented Verify level %d(%c)\n" +#~ msgstr "Nivel Verify no implementado %d(%c)\n" -#: src/dird/ua_update.c:908 -msgid "Expect JobId keyword, not found.\n" -msgstr "Esperaba palabra clave JobId, no encontrada.\n" +#~ msgid "" +#~ "Unable to find JobId of previous InitCatalog Job.\n" +#~ "Please run a Verify with Level=InitCatalog before\n" +#~ "running the current Job.\n" +#~ msgstr "" +#~ "No se puede encontrar JobId de Job InitCatalog anterior.\n" +#~ "Por favor, ejecutar Verificar con Nivel=InitCatalog antes de\n" +#~ " ejecutar el Job actual.\n" -#: src/dird/ua_update.c:933 -msgid "Neither Client nor StartTime specified.\n" -msgstr "Ni el Cliente ni StartTime especificado.\n" +#~ msgid "Unable to find JobId of previous Job for this client.\n" +#~ msgstr "" +#~ "No se puede encontrar JobId del trabajo anterior por este cliente.\n" -#: src/dird/vbackup.c:122 -#, c-format -msgid "Start Virtual Backup JobId %s, Job=%s\n" -msgstr "Respaldo Virtual iniciado JobId %s, Job=%s\n" +#~ msgid "Could not get job record for previous Job. ERR=%s" +#~ msgstr "No se ha podido obtener el registro Job para Job anterior. ERR=%s" -#: src/dird/vbackup.c:126 -msgid "" -"This Job is not an Accurate backup so is not equivalent to a Full backup.\n" -msgstr "" -"Este trabajo no es una copia de seguridad exacta, por lo que no es " -"equivalente a una copia de seguridad completa.\n" +#~ msgid "Last Job %d did not terminate normally. JobStatus=%c\n" +#~ msgstr "Último Job %d no termino normalmente. JobStatus=%c\n" -#: src/dird/vbackup.c:172 -#, fuzzy -msgid "No valid Jobs found from user selection.\n" -msgstr "No se encontró ningún Job para: %s.\n" +#~ msgid "Verifying against JobId=%d Job=%s\n" +#~ msgstr "Verificar contra JobId=%d Job=%s\n" -#: src/dird/vbackup.c:176 -#, fuzzy, c-format -msgid "Using user supplied JobIds=%s\n" -msgstr "%s utilizando JobId=%s Job=%s\n" +#~ msgid "Start Verify JobId=%s Level=%s Job=%s\n" +#~ msgstr "Inicio Verificar JobId=%s Nivel=%s Job=%s\n" -#: src/dird/vbackup.c:195 -msgid "No previous Full found in list, using Differential level\n" -msgstr "" +#~ msgid "Deprecated feature ... use bootstrap.\n" +#~ msgstr "Función obsoleta ... use bootstrap.\n" -#: src/dird/vbackup.c:200 -msgid "No previous Full found in list, using Incremental level\n" -msgstr "" +#~ msgid "Unimplemented verify level %d\n" +#~ msgstr "Nivel Verify no implementado %d\n" -#: src/dird/vbackup.c:213 -msgid "No previous Jobs found.\n" -msgstr "Jobs previos no encontrados.\n" +#~ msgid "Verify OK" +#~ msgstr "Verificar OK" -#: src/dird/vbackup.c:236 -#, c-format -msgid "Error getting Job record for previous Job: ERR=%s" -msgstr "Error obteniendo registro Job para Job anterior: ERR=%s" +#~ msgid "*** Verify Error ***" +#~ msgstr "*** Verificar Error ***" -#: src/dird/vbackup.c:449 -#, fuzzy, c-format -msgid "" -"%s %s %s (%s):\n" -" Build OS: %s %s %s\n" -" JobId: %d\n" -" Job: %s\n" -" Backup Level: Virtual Full\n" -" Client: \"%s\" %s\n" -" FileSet: \"%s\" %s\n" -" Pool: \"%s\" (From %s)\n" -" Catalog: \"%s\" (From %s)\n" -" Storage: \"%s\" (From %s)\n" -" Scheduled time: %s\n" -" Start time: %s\n" -" End time: %s\n" -" Elapsed time: %s\n" -" Priority: %d\n" -" SD Files Written: %s\n" -" SD Bytes Written: %s (%sB)\n" -" Rate: %.1f KB/s\n" -" Volume name(s): %s\n" -" Volume Session Id: %d\n" -" Volume Session Time: %d\n" -" Last Volume Bytes: %s (%sB)\n" -" SD Errors: %d\n" -" SD termination status: %s\n" -" Termination: %s\n" -"\n" -msgstr "" -"%s %s %s (%s): %s\n" -" Build OS: %s %s %s\n" -" JobId: %d\n" -" Job: %s\n" -" Nivel del Respaldo: Virtual Completo\n" -" Cliente: \"%s\" %s\n" -" FileSet: \"%s\" %s\n" -" Pool: \"%s\" (Desde %s)\n" -" Catalogo: \"%s\" (Desde %s)\n" -" Storage: \"%s\" (Desde %s)\n" -" Hora programada: %s\n" -" Hora de inicio: %s\n" -" Hora de finalización: %s\n" -" Tiempo transcurrido: %s\n" -" Prioridad: %d\n" -" SD Archivos Escritos: %s\n" -" SD Bytes Escritos: %s (%sB)\n" -" Tasa: %.1f KB/s\n" -" Nombre del Volumen(es): %s\n" -" Id de Sesión de Volumen: %d\n" -" Tiempo de Sesión de Volumen: %d\n" -" Ultimo Bytes del Volumen: %s (%sB)\n" -" Errores del SD: %d\n" -" Estado de terminación del SD: %s\n" -" Terminación: %s\n" -"\n" +#~ msgid "Verify warnings" +#~ msgstr "Verificar advertencias" -#: src/dird/verify.c:72 src/dird/verify.c:319 -#, c-format -msgid "Unimplemented Verify level %d(%c)\n" -msgstr "Nivel Verify no implementado %d(%c)\n" +#~ msgid "Verify Canceled" +#~ msgstr "Verificar Cancelada" -#: src/dird/verify.c:136 -msgid "" -"Unable to find JobId of previous InitCatalog Job.\n" -"Please run a Verify with Level=InitCatalog before\n" -"running the current Job.\n" -msgstr "" -"No se puede encontrar JobId de Job InitCatalog anterior.\n" -"Por favor, ejecutar Verificar con Nivel=InitCatalog antes de\n" -" ejecutar el Job actual.\n" +#~ msgid "Verify Differences" +#~ msgstr "Verificar Diferencias" -#: src/dird/verify.c:141 -msgid "Unable to find JobId of previous Job for this client.\n" -msgstr "No se puede encontrar JobId del trabajo anterior por este cliente.\n" +#~ msgid "Inappropriate term code: %d %c\n" +#~ msgstr "Inadecuado código de terminación: %d %c\n" -#: src/dird/verify.c:158 -#, c-format -msgid "Could not get job record for previous Job. ERR=%s" -msgstr "No se ha podido obtener el registro Job para Job anterior. ERR=%s" +#, fuzzy +#~ msgid "" +#~ "%s %s %s (%s):\n" +#~ " Build OS: %s %s %s\n" +#~ " JobId: %d\n" +#~ " Job: %s\n" +#~ " FileSet: %s\n" +#~ " Verify Level: %s\n" +#~ " Client: %s\n" +#~ " Verify JobId: %d\n" +#~ " Verify Job: %s\n" +#~ " Start time: %s\n" +#~ " End time: %s\n" +#~ " Files Expected: %s\n" +#~ " Files Examined: %s\n" +#~ " Non-fatal FD errors: %d\n" +#~ " FD termination status: %s\n" +#~ " SD termination status: %s\n" +#~ " Termination: %s\n" +#~ "\n" +#~ msgstr "" +#~ "%s %s %s (%s): %s\n" +#~ " Build OS: %s %s %s\n" +#~ " JobId: %d\n" +#~ " Job: %s\n" +#~ " FileSet: %s\n" +#~ " Verificar Nivel: %s\n" +#~ " Cliente: %s\n" +#~ " Verificar JobId: %d\n" +#~ " Verificar Job: %s\n" +#~ " Hora de inicio: %s\n" +#~ " Hora de finalización: %s\n" +#~ " Archivos Esperado: %s\n" +#~ " Archivos Examinados: %s\n" +#~ " No-fatal FD errores: %d\n" +#~ " Estado de terminación del FD: %s\n" +#~ " Estado de terminación del SD: %s\n" +#~ " Terminación: %s\n" +#~ "\n" -#: src/dird/verify.c:164 -#, c-format -msgid "Last Job %d did not terminate normally. JobStatus=%c\n" -msgstr "Último Job %d no termino normalmente. JobStatus=%c\n" +#, fuzzy +#~ msgid "" +#~ "%s %s %s (%s):\n" +#~ " Build: %s %s %s\n" +#~ " JobId: %d\n" +#~ " Job: %s\n" +#~ " FileSet: %s\n" +#~ " Verify Level: %s\n" +#~ " Client: %s\n" +#~ " Verify JobId: %d\n" +#~ " Verify Job: %s\n" +#~ " Start time: %s\n" +#~ " End time: %s\n" +#~ " Files Examined: %s\n" +#~ " Non-fatal FD errors: %d\n" +#~ " FD termination status: %s\n" +#~ " Termination: %s\n" +#~ "\n" +#~ msgstr "" +#~ "%s %s %s (%s): %s\n" +#~ " Build: %s %s %s\n" +#~ " JobId: %d\n" +#~ " Job: %s\n" +#~ " FileSet: %s\n" +#~ " Verificar Nivel: %s\n" +#~ " Cliente: %s\n" +#~ " Verificar JobId: %d\n" +#~ " Verificar Job: %s\n" +#~ " Hora de Inicio: %s\n" +#~ " Hora de Finalización: %s\n" +#~ " Archivos Examinados: %s\n" +#~ " No-fatal FD errores: %d\n" +#~ " FD estado de finalización: %s\n" +#~ " Terminación: %s\n" +#~ "\n" -#: src/dird/verify.c:168 -#, c-format -msgid "Verifying against JobId=%d Job=%s\n" -msgstr "Verificar contra JobId=%d Job=%s\n" +#~ msgid "" +#~ "birdSD.\n" +#~ msgstr "No puede establecer el tamaño del búfer FD-> SD.\n" -#: src/filed/acl.c:1890 -#, c-format -msgid "acl_set error on file \"%s\": ERR=%s\n" -msgstr "error de acl_set en el archivo \"%s\": ERR=%s\n" +#, fuzzy +#~ msgid "Had %ld acl errors while doing backup\n" +#~ msgstr "Detectado %ld errores de acl al hacer copia de seguridad\n" -#: src/filed/acl.c:1976 -#, c-format -msgid "acltotext error on file \"%s\": ERR=%s\n" -msgstr "acltotext error en el archivo \"%s\": ERR=%s\n" +#, fuzzy +#~ msgid "Had %ld xattr errors while doing backup\n" +#~ msgstr "Detectado %ld errores de xattr al hacer copia de seguridad\n" -#: src/filed/acl.c:1999 -#, c-format -msgid "aclfromtext error on file \"%s\": ERR=%s\n" -msgstr "aclfromtext error en el archivo \"%s\": ERR=%s\n" +#~ msgid " Recursion turned off. Will not descend from %s into %s\n" +#~ msgstr "Recursión desactivado. No descenderá de %s dentro de %s\n" -#: src/filed/acl.c:2019 -#, c-format -msgid "acl(SETACL) error on file \"%s\": ERR=%s\n" -msgstr "acl(SETACL) error en el archivo \"%s\": ERR=%s\n" +#, fuzzy +#~ msgid "" +#~ " %s is a different filesystem. Will not descend from %s into it.\n" +#~ msgstr "" +#~ "%s es un sistema de ficheros diferentes. No descenderá de %s dentro de " +#~ "%s\n" -#: src/filed/acl.c:2085 -#, fuzzy, c-format -msgid "pioctl VIOCGETAL error on file \"%s\": ERR=%s\n" -msgstr "acl(SETACL) error en el archivo \"%s\": ERR=%s\n" +#~ msgid " Disallowed filesystem. Will not descend from %s into %s\n" +#~ msgstr "Sistema de Archivos no permitido. No descenderá de %s en %s\n" -#: src/filed/acl.c:2113 -#, fuzzy, c-format -msgid "pioctl VIOCSETAL error on file \"%s\": ERR=%s\n" -msgstr "acl(SETACL) error en el archivo \"%s\": ERR=%s\n" +#~ msgid " Disallowed drive type. Will not descend into %s\n" +#~ msgstr "Tipo de unidad no permitido. No descenderá en %s\n" -#: src/filed/acl.c:2245 src/filed/xattr.c:3859 -#, fuzzy, c-format -msgid "Unable to stat file \"%s\": ERR=%s\n" -msgstr "No se puede abrir el archivo \"%s\": ERR=%s\n" +#~ msgid " Socket file skipped: %s\n" +#~ msgstr "Archivo de Socket omitido: %s\n" -#: src/filed/acl.c:2344 -#, c-format -msgid "Can't restore ACLs of %s - incompatible acl stream encountered - %d\n" -msgstr "" -"No puede restaurar ACL de %s - incompatible flujo acl encontrado - %d\n" +#~ msgid " Could not access \"%s\": ERR=%s\n" +#~ msgstr "No se pudo acceder a \"%s\": ERR=%s\n" -#: src/filed/authenticate.c:86 -#, c-format -msgid "Incorrect password given by Director at %s.\n" -msgstr "Contraseña incorrecta dada por el Director en %s.\n" +#~ msgid " Could not follow link \"%s\": ERR=%s\n" +#~ msgstr "No se pudo seguir el enlace \"%s\": ERR=%s\n" -#: src/filed/authenticate.c:93 src/filed/authenticate.c:199 -#: src/stored/authenticate.c:85 src/stored/authenticate.c:178 -#: src/stored/authenticate.c:286 -msgid "" -"Authorization problem: Remote server did not advertize required TLS " -"support.\n" -msgstr "" -"Problema de autorización: El servidor remoto no anunció suporte TLS " -"requerido.\n" +#~ msgid " Could not stat \"%s\": ERR=%s\n" +#~ msgstr "No se pudo stat \"%s\": ERR=%s\n" -#: src/filed/authenticate.c:190 -msgid "" -"Authorization key rejected by Storage daemon.\n" -"For help, please see " -msgstr "" +#~ msgid " Unchanged file skipped: %s\n" +#~ msgstr "Archivo sin modificar omitido: %s\n" -#: src/filed/backup.c:87 -msgid "Cannot set buffer size FD->SD.\n" -msgstr "No puede establecer el tamaño del búfer FD-> SD.\n" +#~ msgid " Archive file not saved: %s\n" +#~ msgstr "Archivo no guardado: %s\n" -#: src/filed/backup.c:176 -msgid "The heartbeat didn't start in time.\n" -msgstr "" +#~ msgid " Could not open directory \"%s\": ERR=%s\n" +#~ msgstr "No se puede abrir directorio \"%s\": ERR=%s.\n" -#: src/filed/backup.c:190 -#, fuzzy, c-format -msgid "Had %ld acl errors while doing backup\n" -msgstr "Detectado %ld errores de acl al hacer copia de seguridad\n" +#~ msgid " Unknown file type %d; not saved: %s\n" +#~ msgstr " Tipo de archivo %d desconocido; no ha sido guardado: %s\n" -#: src/filed/backup.c:196 -#, fuzzy, c-format -msgid "Had %ld xattr errors while doing backup\n" -msgstr "Detectado %ld errores de xattr al hacer copia de seguridad\n" +#~ msgid " Cannot open \"%s\": ERR=%s.\n" +#~ msgstr "No se puede abrir \"%s\": ERR=%s.\n" -#: src/filed/backup.c:323 -#, c-format -msgid " Recursion turned off. Will not descend from %s into %s\n" -msgstr "Recursión desactivado. No descenderá de %s dentro de %s\n" +#, fuzzy +#~ msgid "Windows Encrypted data not supported on this OS.\n" +#~ msgstr "flujo %s no suportado en este Cliente.\n" -#: src/filed/backup.c:330 -#, fuzzy, c-format -msgid " %s is a different filesystem. Will not descend from %s into it.\n" -msgstr "" -"%s es un sistema de ficheros diferentes. No descenderá de %s dentro de %s\n" +#~ msgid "Read error on file %s. ERR=%s\n" +#~ msgstr "Error de lectura en el archivo %s. ERR=%s\n" -#: src/filed/backup.c:336 -#, c-format -msgid " Disallowed filesystem. Will not descend from %s into %s\n" -msgstr "Sistema de Archivos no permitido. No descenderá de %s en %s\n" +#, fuzzy +#~ msgid "Too many errors. JobErrors=%d.\n" +#~ msgstr "Demasiados errores.\n" -#: src/filed/backup.c:341 -#, c-format -msgid " Disallowed drive type. Will not descend into %s\n" -msgstr "Tipo de unidad no permitido. No descenderá en %s\n" +#~ msgid "Encryption padding error\n" +#~ msgstr "Error de relleno de cifrado\n" -#: src/filed/backup.c:352 -#, c-format -msgid " Socket file skipped: %s\n" -msgstr "Archivo de Socket omitido: %s\n" +#~ msgid "Encryption error\n" +#~ msgstr "Error de cifrado\n" -#: src/filed/backup.c:365 -#, c-format -msgid " Could not access \"%s\": ERR=%s\n" -msgstr "No se pudo acceder a \"%s\": ERR=%s\n" +#~ msgid "Invalid file flags, no supported data stream type.\n" +#~ msgstr "" +#~ "Invalidas banderas de archivo, tipo de flujo de datos no soportado.\n" -#: src/filed/backup.c:372 -#, c-format -msgid " Could not follow link \"%s\": ERR=%s\n" -msgstr "No se pudo seguir el enlace \"%s\": ERR=%s\n" +#, fuzzy +#~ msgid "Network send error to SD. Data=%s ERR=%s\n" +#~ msgstr "Error de red al enviar para SD. ERR=%s\n" -#: src/filed/backup.c:379 -#, c-format -msgid " Could not stat \"%s\": ERR=%s\n" -msgstr "No se pudo stat \"%s\": ERR=%s\n" +#~ msgid "Compression deflateParams error: %d\n" +#~ msgstr "Error de compresión DeflateParams: %d\n" -#: src/filed/backup.c:386 src/filed/verify.c:130 -#, c-format -msgid " Unchanged file skipped: %s\n" -msgstr "Archivo sin modificar omitido: %s\n" +#~ msgid " Cannot open resource fork for \"%s\": ERR=%s.\n" +#~ msgstr "No se puede abrir recurso fork para \"%s\": ERR=%s.\n" -#: src/filed/backup.c:389 -#, c-format -msgid " Archive file not saved: %s\n" -msgstr "Archivo no guardado: %s\n" +#~ msgid "Compression deflate error: %d\n" +#~ msgstr "Error de compresión Deflate: %d\n" -#: src/filed/backup.c:393 -#, c-format -msgid " Could not open directory \"%s\": ERR=%s\n" -msgstr "No se puede abrir directorio \"%s\": ERR=%s.\n" +#~ msgid "Compression deflateReset error: %d\n" +#~ msgstr "Error de compresión DeflateReset: %d\n" -#: src/filed/backup.c:402 -#, c-format -msgid " Unknown file type %d; not saved: %s\n" -msgstr " Tipo de archivo %d desconocido; no ha sido guardado: %s\n" +#, fuzzy +#~ msgid "Compression LZO error: %d\n" +#~ msgstr "Error de compresión Deflate: %d\n" -#: src/filed/backup.c:511 -#, c-format -msgid " Cannot open \"%s\": ERR=%s.\n" -msgstr "No se puede abrir \"%s\": ERR=%s.\n" +#~ msgid "VSS Writer (BackupComplete): %s\n" +#~ msgstr "VSS Writer (BackupComplete): %s\n" -#: src/filed/backup.c:690 src/filed/restore.c:1449 #, fuzzy -msgid "Windows Encrypted data not supported on this OS.\n" -msgstr "flujo %s no suportado en este Cliente.\n" +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bfdjson [-c config_file] [-d debug_level]\n" +#~ " -r get resource type \n" +#~ " -n get resource \n" +#~ " -l get only directives matching dirs (use with -r)\n" +#~ " -D get only data\n" +#~ " -c use as configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print a timestamp in debug output\n" +#~ " -t test configuration file and exit\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Version: %s (%s)\n" +#~ "\n" +#~ "Utilice: bacula-fd [-f -s] [-c archivo_de_configuración] [-d " +#~ "nivel_depuración]\n" +#~ " -c establecer archivo de configuración para archivo \n" +#~ " -d establecer el nivel de depuración para \n" +#~ " -dt imprimir timestamp en salida de depuración\n" +#~ " -f ejecutar en primer plano (para depuración)\n" +#~ " -g groupid\n" +#~ " -k keep readall capabilities\n" +#~ " -m imprimir salida kaboom para depuración)\n" +#~ " -s sin señales(para depuración)\n" +#~ " -t prueba - leer la configuración y salir\n" +#~ " -u userid\n" +#~ " -v mensajes de usuario detallados\n" +#~ " -? imprimir este mensaje.\n" +#~ "\n" -#: src/filed/backup.c:717 -#, c-format -msgid "Read error on file %s. ERR=%s\n" -msgstr "Error de lectura en el archivo %s. ERR=%s\n" +#~ msgid "" +#~ "No File daemon resource defined in %s\n" +#~ "Without that I don't know who I am :-(\n" +#~ msgstr "" +#~ "Ninguno recurso File Daemon definido en %s\n" +#~ "Sin eso yo no sé quién soy :-(\n" -#: src/filed/backup.c:720 -#, fuzzy, c-format -msgid "Too many errors. JobErrors=%d.\n" -msgstr "Demasiados errores.\n" +#~ msgid "Only one Client resource permitted in %s\n" +#~ msgstr "Sólo un recurso de cliente permitido en %s\n" -#: src/filed/backup.c:730 -msgid "Encryption padding error\n" -msgstr "Error de relleno de cifrado\n" +#~ msgid "" +#~ "Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined " +#~ "for File daemon in %s.\n" +#~ msgstr "" +#~ "Ninguno \"Certificado TLS de CA\" o \"Directorio de Certificado TLS de CA" +#~ "\" están definidos para el demonio File en %s.\n" -#: src/filed/backup.c:873 src/filed/backup.c:889 -msgid "Encryption error\n" -msgstr "Error de cifrado\n" +#~ msgid "" +#~ "\"PKI Key Pair\" must be defined for File daemon \"%s\" in %s if either " +#~ "\"PKI Sign\" or \"PKI Encrypt\" are enabled.\n" +#~ msgstr "" +#~ "\"Par de Claves PKI\" debe estar definido para el demonio File \"%s\" en " +#~ "%s, si uno o otro \"Firma PKI\" o \"Cifrar PKI\" están habilitados.\n" -#: src/filed/backup.c:910 -msgid "main thread is stopping because heartbeat thread stopped\n" -msgstr "" +#~ msgid "No Director resource defined in %s\n" +#~ msgstr "Recurso Director no definido en %s\n" -#: src/filed/backup.c:967 -msgid "Invalid file flags, no supported data stream type.\n" -msgstr "Invalidas banderas de archivo, tipo de flujo de datos no soportado.\n" +#, fuzzy +#~ msgid "Encrypting sparse or offset data not supported.\n" +#~ msgstr "Cifrado de datos dispersos no soportado.\n" -#: src/filed/backup.c:1007 -#, fuzzy, c-format -msgid "Network send error to SD. Data=%s ERR=%s\n" -msgstr "Error de red al enviar para SD. ERR=%s\n" +#~ msgid "Failed to initialize encryption context.\n" +#~ msgstr "Fallo al inicializar el contexto de cifrado.\n" -#: src/filed/backup.c:1148 -#, c-format -msgid "Compression deflateParams error: %d\n" -msgstr "Error de compresión DeflateParams: %d\n" +#~ msgid "%s signature digest initialization failed\n" +#~ msgstr "Fallo la inicialización de la firma digest %s\n" -#: src/filed/backup.c:1201 -#, c-format -msgid " Cannot open resource fork for \"%s\": ERR=%s.\n" -msgstr "No se puede abrir recurso fork para \"%s\": ERR=%s.\n" +#, fuzzy +#~ msgid "Unsupported cipher on this system.\n" +#~ msgstr "Tipo de cifrado especificados no soportado\n" -#: src/filed/backup.c:1259 -#, c-format -msgid "Compression deflate error: %d\n" -msgstr "Error de compresión Deflate: %d\n" +#~ msgid "An error occurred while encrypting the stream.\n" +#~ msgstr "A ocurrido un error al cifrar el stream.\n" -#: src/filed/backup.c:1266 -#, c-format -msgid "Compression deflateReset error: %d\n" -msgstr "Error de compresión DeflateReset: %d\n" +#~ msgid "Failed to allocate memory for crypto signature.\n" +#~ msgstr "No se pudo asignar memoria para la firma de cifrado.\n" -#: src/filed/backup.c:1308 -#, fuzzy, c-format -msgid "Compression LZO error: %d\n" -msgstr "Error de compresión Deflate: %d\n" +#, fuzzy +#~ msgid "An error occurred while adding signer the stream.\n" +#~ msgstr "Se produjo un error al firmar el stream.\n" -#: src/filed/backup.c:1518 -#, c-format -msgid "VSS Writer (BackupComplete): %s\n" -msgstr "VSS Writer (BackupComplete): %s\n" +#~ msgid "An error occurred while signing the stream.\n" +#~ msgstr "Se produjo un error al firmar el stream.\n" -#: src/filed/bfdjson.c:68 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bfdjson [-c config_file] [-d debug_level]\n" -" -r get resource type \n" -" -n get resource \n" -" -l get only directives matching dirs (use with -r)\n" -" -D get only data\n" -" -c use as configuration file\n" -" -d set debug level to \n" -" -dt print a timestamp in debug output\n" -" -t test configuration file and exit\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Version: %s (%s)\n" -"\n" -"Utilice: bacula-fd [-f -s] [-c archivo_de_configuración] [-d " -"nivel_depuración]\n" -" -c establecer archivo de configuración para archivo \n" -" -d establecer el nivel de depuración para \n" -" -dt imprimir timestamp en salida de depuración\n" -" -f ejecutar en primer plano (para depuración)\n" -" -g groupid\n" -" -k keep readall capabilities\n" -" -m imprimir salida kaboom para depuración)\n" -" -s sin señales(para depuración)\n" -" -t prueba - leer la configuración y salir\n" -" -u userid\n" -" -v mensajes de usuario detallados\n" -" -? imprimir este mensaje.\n" -"\n" +#~ msgid "An error occurred finalizing signing the stream.\n" +#~ msgstr "Se produjo un error concluir la firma del stream.\n" -#: src/filed/bfdjson.c:463 src/filed/filed.c:328 -#, c-format -msgid "" -"No File daemon resource defined in %s\n" -"Without that I don't know who I am :-(\n" -msgstr "" -"Ninguno recurso File Daemon definido en %s\n" -"Sin eso yo no sé quién soy :-(\n" +#, fuzzy +#~ msgid "Command plugin \"%s\": no type in startBackupFile packet.\n" +#~ msgstr "Comando plugin \"%s\" regresó malo paquete startBackupFile.\n" -#: src/filed/bfdjson.c:468 src/filed/filed.c:333 -#, c-format -msgid "Only one Client resource permitted in %s\n" -msgstr "Sólo un recurso de cliente permitido en %s\n" +#, fuzzy +#~ msgid "Command plugin \"%s\": no object_name in startBackupFile packet.\n" +#~ msgstr "Comando plugin \"%s\" regresó malo paquete startBackupFile.\n" -#: src/filed/bfdjson.c:492 src/filed/filed.c:388 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"File daemon in %s.\n" -msgstr "" -"Ninguno \"Certificado TLS de CA\" o \"Directorio de Certificado TLS de CA\" " -"están definidos para el demonio File en %s.\n" +#, fuzzy +#~ msgid "Command plugin \"%s\": no fname in startBackupFile packet.\n" +#~ msgstr "Comando plugin \"%s\" regresó malo paquete startBackupFile.\n" -#: src/filed/bfdjson.c:504 src/filed/filed.c:423 -#, c-format -msgid "" -"\"PKI Key Pair\" must be defined for File daemon \"%s\" in %s if either " -"\"PKI Sign\" or \"PKI Encrypt\" are enabled.\n" -msgstr "" -"\"Par de Claves PKI\" debe estar definido para el demonio File \"%s\" en %s, " -"si uno o otro \"Firma PKI\" o \"Cifrar PKI\" están habilitados.\n" +#~ msgid "Plugin save packet not found.\n" +#~ msgstr "Plugin guardar paquetes no encontrado.\n" -#: src/filed/bfdjson.c:517 src/filed/filed.c:538 -#, c-format -msgid "No Director resource defined in %s\n" -msgstr "Recurso Director no definido en %s\n" +#~ msgid "Plugin=%s not found.\n" +#~ msgstr "Plugin=%s no encontrado.\n" -#: src/filed/crypto.c:37 -#, fuzzy -msgid "Encrypting sparse or offset data not supported.\n" -msgstr "Cifrado de datos dispersos no soportado.\n" +#~ msgid "Plugin createFile call failed. Stat=%d file=%s\n" +#~ msgstr "Fallo llamada plugin createFile. Stat=%d archivo=%s\n" -#: src/filed/crypto.c:44 -msgid "Failed to initialize encryption context.\n" -msgstr "Fallo al inicializar el contexto de cifrado.\n" +#~ msgid "Plugin createFile call failed. Returned CF_ERROR file=%s\n" +#~ msgstr "Fallo llamada plugin createFile. Retorno CF_ERROR archivo=%s\n" -#: src/filed/crypto.c:117 -#, c-format -msgid "%s signature digest initialization failed\n" -msgstr "Fallo la inicialización de la firma digest %s\n" +#~ msgid "Could not create %s: ERR=%s\n" +#~ msgstr "No se pudo crear %s: ERR=%s\n" -#: src/filed/crypto.c:147 #, fuzzy -msgid "Unsupported cipher on this system.\n" -msgstr "Tipo de cifrado especificados no soportado\n" - -#: src/filed/crypto.c:153 src/filed/crypto.c:162 -msgid "An error occurred while encrypting the stream.\n" -msgstr "A ocurrido un error al cifrar el stream.\n" +#~ msgid "Command plugin: no fname in baculaCheckChanges packet.\n" +#~ msgstr "Comando plugin \"%s\" regresó malo paquete startBackupFile.\n" -#: src/filed/crypto.c:225 -msgid "Failed to allocate memory for crypto signature.\n" -msgstr "No se pudo asignar memoria para la firma de cifrado.\n" +#, fuzzy +#~ msgid "Error while creating command string %s.\n" +#~ msgstr "" +#~ "Error al analizar los argumentos de línea de comandos, usando valores por " +#~ "defecto.\n" -#: src/filed/crypto.c:230 #, fuzzy -msgid "An error occurred while adding signer the stream.\n" -msgstr "Se produjo un error al firmar el stream.\n" +#~ msgid "Error while executing \"%s\" %s. %s %s\n" +#~ msgstr "A ocurrido un error al cifrar el stream.\n" -#: src/filed/crypto.c:236 src/filed/crypto.c:251 -msgid "An error occurred while signing the stream.\n" -msgstr "Se produjo un error al firmar el stream.\n" +#, fuzzy +#~ msgid "Unable to create snapshot record. ERR=%s\n" +#~ msgstr "No se puede crear hilo. ERR=%s\n" -#: src/filed/crypto.c:275 -msgid "An error occurred finalizing signing the stream.\n" -msgstr "Se produjo un error concluir la firma del stream.\n" +#, fuzzy +#~ msgid "Unable to create snapshot record, got %s\n" +#~ msgstr "No se puede obtener el registro Job para JobId=%s: ERR=%s\n" -#: src/filed/dedupfiled.c:88 -#, c-format -msgid "Quarantine, got ACK for unknown block #%08x\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to delete snapshot record. ERR=%s\n" +#~ msgstr "No se pudo obtener registro de Job. ERR=%s\n" -#: src/filed/dedupfiled.c:100 -#, c-format -msgid "Quarantine, got request for unknown block #%08x\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to delete snapshot record, got %s\n" +#~ msgstr "No se puede obtener el registro Job para JobId=%s: ERR=%s\n" -#: src/filed/dedupfiled.c:130 -#, c-format -msgid "Quarantine, got unexpected command %d len=%d \"%s\" \n" -msgstr "" +#, fuzzy +#~ msgid "Unable to get snapshot record. ERR=%s\n" +#~ msgstr "No se pudo obtener registro de Job. ERR=%s\n" -#: src/filed/dedupfiled.c:332 -#, c-format -msgid "DEDUP SD didn't found #%08x, use zeroes instead\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to get snapshot record, got %s\n" +#~ msgstr "No se puede obtener el registro Job para JobId=%s: ERR=%s\n" -#: src/filed/dedupfiled.c:338 -#, c-format -msgid "DEDUP got a BNET_CMD_UNK_HASH but don't know the hash #%08x.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to parse command output\n" +#~ msgstr "Fallo al conectar con el cliente.\n" -#: src/filed/dedupfiled.c:368 -#, c-format -msgid "DEDUP got a BNET_CMD_STO_BLOCK but don't know the hash #%08x.\n" -msgstr "" +#, fuzzy +#~ msgid " Unable to delete snapshot of %s ERR=%s\n" +#~ msgstr "No se puede escribir última en %s: ERR=%s\n" -#: src/filed/fd_plugins.c:546 src/filed/fd_plugins.c:690 -#, fuzzy, c-format -msgid "Command plugin \"%s\": no type in startBackupFile packet.\n" -msgstr "Comando plugin \"%s\" regresó malo paquete startBackupFile.\n" +#, fuzzy +#~ msgid " Create Snapshot for %s\n" +#~ msgstr "Fallo al generar VSS snapshots.\n" -#: src/filed/fd_plugins.c:559 -#, fuzzy, c-format -msgid "Command plugin \"%s\": no object_name in startBackupFile packet.\n" -msgstr "Comando plugin \"%s\" regresó malo paquete startBackupFile.\n" +#, fuzzy +#~ msgid " Unable to create snapshot of %s ERR=%s\n" +#~ msgstr "No se puede escribir última en %s: ERR=%s\n" -#: src/filed/fd_plugins.c:572 src/filed/fd_plugins.c:697 -#, fuzzy, c-format -msgid "Command plugin \"%s\": no fname in startBackupFile packet.\n" -msgstr "Comando plugin \"%s\" regresó malo paquete startBackupFile.\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bacula-fd [-f -s] [-c config_file] [-d debug_level]\n" +#~ " -c use as configuration file\n" +#~ " -d [,] set debug level to , debug tags to \n" +#~ " -dt print a timestamp in debug output\n" +#~ " -f run in foreground (for debugging)\n" +#~ " -g groupid\n" +#~ " -k keep readall capabilities\n" +#~ " -m print kaboom output (for debugging)\n" +#~ " -s no signals (for debugging)\n" +#~ " -t test configuration file and exit\n" +#~ " -T set trace on\n" +#~ " -u userid\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Version: %s (%s)\n" +#~ "\n" +#~ "Utilice: bacula-fd [-f -s] [-c archivo_de_configuración] [-d " +#~ "nivel_depuración]\n" +#~ " -c establecer archivo de configuración para archivo \n" +#~ " -d establecer el nivel de depuración para \n" +#~ " -dt imprimir timestamp en salida de depuración\n" +#~ " -f ejecutar en primer plano (para depuración)\n" +#~ " -g groupid\n" +#~ " -k keep readall capabilities\n" +#~ " -m imprimir salida kaboom para depuración)\n" +#~ " -s sin señales(para depuración)\n" +#~ " -t prueba - leer la configuración y salir\n" +#~ " -u userid\n" +#~ " -v mensajes de usuario detallados\n" +#~ " -? imprimir este mensaje.\n" +#~ "\n" -#: src/filed/fd_plugins.c:771 -msgid "Plugin save packet not found.\n" -msgstr "Plugin guardar paquetes no encontrado.\n" +#~ msgid "-k option has no meaning without -u option.\n" +#~ msgstr "la opción -k no tiene sentido sin la opción -u.\n" -#: src/filed/fd_plugins.c:906 -#, c-format -msgid "Plugin=%s not found.\n" -msgstr "Plugin=%s no encontrado.\n" +#, fuzzy +#~ msgid "Disable Command \"%s\" not found.\n" +#~ msgstr "Registro FileSet \"%s\" no encontrado.\n" -#: src/filed/fd_plugins.c:973 -#, c-format -msgid "Plugin createFile call failed. Stat=%d file=%s\n" -msgstr "Fallo llamada plugin createFile. Stat=%d archivo=%s\n" +#~ msgid "PKI encryption/signing enabled but not compiled into Bacula.\n" +#~ msgstr "Cifrado o Firma PKI habilitado, pero no compilado en Bacula.\n" -#: src/filed/fd_plugins.c:978 -#, c-format -msgid "Plugin createFile call failed. Returned CF_ERROR file=%s\n" -msgstr "Fallo llamada plugin createFile. Retorno CF_ERROR archivo=%s\n" +#~ msgid "Failed to allocate a new keypair object.\n" +#~ msgstr "No se ha podido asignar un nuevo objeto keypair.\n" -#: src/filed/fd_plugins.c:1008 src/findlib/create_file.c:220 -#, c-format -msgid "Could not create %s: ERR=%s\n" -msgstr "No se pudo crear %s: ERR=%s\n" +#~ msgid "Failed to load public certificate for File daemon \"%s\" in %s.\n" +#~ msgstr "" +#~ "Fallo al cargar certificado publico para File Daemon \"%s\" en %s.\n" -#: src/filed/fd_plugins.c:1875 -#, fuzzy -msgid "Command plugin: no fname in baculaCheckChanges packet.\n" -msgstr "Comando plugin \"%s\" regresó malo paquete startBackupFile.\n" +#~ msgid "Failed to load private key for File daemon \"%s\" in %s.\n" +#~ msgstr "Fallo al cargar llave privada para File Daemon \"%s\" en %s.\n" -#: src/filed/fd_snapshot.c:939 -#, fuzzy, c-format -msgid "Error while creating command string %s.\n" -msgstr "" -"Error al analizar los argumentos de línea de comandos, usando valores por " -"defecto.\n" +#~ msgid "" +#~ "Failed to load private key from file %s for File daemon \"%s\" in %s.\n" +#~ msgstr "" +#~ "Fallo al cargar llave privada desde el archivo %s para File Daemon \"%s\" " +#~ "en %s.\n" -#: src/filed/fd_snapshot.c:959 -#, fuzzy, c-format -msgid "Error while executing \"%s\" %s. %s %s\n" -msgstr "A ocurrido un error al cifrar el stream.\n" +#~ msgid "" +#~ "Failed to load trusted signer certificate from file %s for File daemon " +#~ "\"%s\" in %s.\n" +#~ msgstr "" +#~ "Fallo al cargar certificado del firmante desde el archivo %s para File " +#~ "Daemon \"%s\" en %s.\n" -#: src/filed/fd_snapshot.c:970 -msgid "Unable to parse snapshot command output\n" -msgstr "" +#~ msgid "" +#~ "Failed to load master key certificate from file %s for File daemon \"%s\" " +#~ "in %s.\n" +#~ msgstr "" +#~ "Fallo al cargar certificado de llave maestro desde el archivo %s para " +#~ "File Daemon \"%s\" en %s.\n" -#: src/filed/fd_snapshot.c:1104 -#, fuzzy, c-format -msgid "Unable to create snapshot record. ERR=%s\n" -msgstr "No se puede crear hilo. ERR=%s\n" +#, fuzzy +#~ msgid "Expected a Cipher Type keyword, got: %s" +#~ msgstr "Esperaba una palabra clave Tipo Device, obtuvo: %s" -#: src/filed/fd_snapshot.c:1108 -#, fuzzy, c-format -msgid "Unable to create snapshot record, got %s\n" -msgstr "No se puede obtener el registro Job para JobId=%s: ERR=%s\n" +#~ msgid "Bad Hello command from Director at %s. Len=%d.\n" +#~ msgstr "Malo comando Hello desde Director en %s. Len=%d\n" -#: src/filed/fd_snapshot.c:1125 -#, fuzzy, c-format -msgid "Unable to delete snapshot record. ERR=%s\n" -msgstr "No se pudo obtener registro de Job. ERR=%s\n" +#~ msgid "Bad Hello command from Director at %s: %s\n" +#~ msgstr "Malo comando Hello desde Director en %s: %s\n" -#: src/filed/fd_snapshot.c:1129 -#, fuzzy, c-format -msgid "Unable to delete snapshot record, got %s\n" -msgstr "No se puede obtener el registro Job para JobId=%s: ERR=%s\n" +#~ msgid "Connection from unknown Director %s at %s rejected.\n" +#~ msgstr "Conexión desde Director %s desconocido en %s rechazada.\n" -#: src/filed/fd_snapshot.c:1153 -#, fuzzy, c-format -msgid "Unable to get snapshot record. ERR=%s\n" -msgstr "No se pudo obtener registro de Job. ERR=%s\n" +#, fuzzy +#~ msgid "SD connect failed: Bad Hello command\n" +#~ msgstr "Director rechazo comando Hello\n" -#: src/filed/fd_snapshot.c:1157 -#, fuzzy, c-format -msgid "Unable to get snapshot record, got %s\n" -msgstr "No se puede obtener el registro Job para JobId=%s: ERR=%s\n" +#, fuzzy +#~ msgid "SD connect failed: Job name not found: %s\n" +#~ msgstr "Fallo al conectar a FD: Nombre del Job no encontrado: %s\n" -#: src/filed/fd_snapshot.c:1162 #, fuzzy -msgid "Unable to parse command output\n" -msgstr "Fallo al conectar con el cliente.\n" +#~ msgid "SD \"%s\" tried to connect two times.\n" +#~ msgstr "Fallo al conectar con el cliente.\n" -#: src/filed/fd_snapshot.c:1342 -msgid "Un-Quiescing applications\n" -msgstr "" +#, fuzzy +#~ msgid "Recv caps from SD failed. ERR=%s\n" +#~ msgstr "cap_from_text fallido: ERR=%s\n" -#: src/filed/fd_snapshot.c:1354 -msgid "Quiescing applications\n" -msgstr "" +#, fuzzy +#~ msgid "Bad caps from SD: %s.\n" +#~ msgstr "Malo comando Hello desde Director en %s: %s\n" -#: src/filed/fd_snapshot.c:1391 -#, c-format -msgid " Delete Snapshot for %s\n" -msgstr "" +#, fuzzy +#~ msgid "Bad caps from SD: %s\n" +#~ msgstr "Mal estado desde BSF. ERR=%s\n" -#: src/filed/fd_snapshot.c:1394 -#, fuzzy, c-format -msgid " Unable to delete snapshot of %s ERR=%s\n" -msgstr "No se puede escribir última en %s: ERR=%s\n" +#, fuzzy +#~ msgid "Command: \"%s\" is disabled.\n" +#~ msgstr "Job \"%s\" %sabled\n" -#: src/filed/fd_snapshot.c:1430 -#, fuzzy, c-format -msgid " Create Snapshot for %s\n" -msgstr "Fallo al generar VSS snapshots.\n" +#, fuzzy +#~ msgid "Bad command from %s. Len=%d.\n" +#~ msgstr "Malo comando Hello desde Director en %s. Len=%d\n" -#: src/filed/fd_snapshot.c:1438 -#, fuzzy, c-format -msgid " Unable to create snapshot of %s ERR=%s\n" -msgstr "No se puede escribir última en %s: ERR=%s\n" +#~ msgid "2902 Error scanning cancel command.\n" +#~ msgstr "2902 Error escaneando comando cancelar.\n" -#: src/filed/filed.c:52 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bacula-fd [-f -s] [-c config_file] [-d debug_level]\n" -" -c use as configuration file\n" -" -d [,] set debug level to , debug tags to \n" -" -dt print a timestamp in debug output\n" -" -f run in foreground (for debugging)\n" -" -g groupid\n" -" -k keep readall capabilities\n" -" -m print kaboom output (for debugging)\n" -" -s no signals (for debugging)\n" -" -t test configuration file and exit\n" -" -T set trace on\n" -" -u userid\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Version: %s (%s)\n" -"\n" -"Utilice: bacula-fd [-f -s] [-c archivo_de_configuración] [-d " -"nivel_depuración]\n" -" -c establecer archivo de configuración para archivo \n" -" -d establecer el nivel de depuración para \n" -" -dt imprimir timestamp en salida de depuración\n" -" -f ejecutar en primer plano (para depuración)\n" -" -g groupid\n" -" -k keep readall capabilities\n" -" -m imprimir salida kaboom para depuración)\n" -" -s sin señales(para depuración)\n" -" -t prueba - leer la configuración y salir\n" -" -u userid\n" -" -v mensajes de usuario detallados\n" -" -? imprimir este mensaje.\n" -"\n" +#~ msgid "2901 Job %s not found.\n" +#~ msgstr "2901 Job %s no encontrado.\n" -#: src/filed/filed.c:185 -msgid "-k option has no meaning without -u option.\n" -msgstr "la opción -k no tiene sentido sin la opción -u.\n" +#, fuzzy +#~ msgid "2001 Job \"%s\" marked to be %s.\n" +#~ msgstr "2001 Job %s marcado para ser cancelado.\n" -#: src/filed/filed.c:361 src/filed/filed.c:560 -#, fuzzy, c-format -msgid "Disable Command \"%s\" not found.\n" -msgstr "Registro FileSet \"%s\" no encontrado.\n" +#, fuzzy +#~ msgid "2991 Bad setbandwidth command: %s\n" +#~ msgstr "2991 Comando setdebug malo: %s\n" -#: src/filed/filed.c:412 -msgid "PKI encryption/signing enabled but not compiled into Bacula.\n" -msgstr "Cifrado o Firma PKI habilitado, pero no compilado en Bacula.\n" +#~ msgid "2991 Bad setdebug command: %s\n" +#~ msgstr "2991 Comando setdebug malo: %s\n" -#: src/filed/filed.c:435 src/filed/filed.c:466 src/filed/filed.c:516 -msgid "Failed to allocate a new keypair object.\n" -msgstr "No se ha podido asignar un nuevo objeto keypair.\n" +#~ msgid "Bad estimate command: %s" +#~ msgstr "Malo comando estimate: %s" -#: src/filed/filed.c:439 -#, c-format -msgid "Failed to load public certificate for File daemon \"%s\" in %s.\n" -msgstr "Fallo al cargar certificado publico para File Daemon \"%s\" en %s.\n" +#~ msgid "2992 Bad estimate command.\n" +#~ msgstr "2992 Malo comando estimación.\n" -#: src/filed/filed.c:445 -#, c-format -msgid "Failed to load private key for File daemon \"%s\" in %s.\n" -msgstr "Fallo al cargar llave privada para File Daemon \"%s\" en %s.\n" +#~ msgid "Bad Job Command: %s" +#~ msgstr "Malo Comando Job: %s" -#: src/filed/filed.c:475 -#, c-format -msgid "Failed to load private key from file %s for File daemon \"%s\" in %s.\n" -msgstr "" -"Fallo al cargar llave privada desde el archivo %s para File Daemon \"%s\" en " -"%s.\n" +#~ msgid "Bad RunBeforeJob command: %s\n" +#~ msgstr "Malo comando RunBeforeJob: %s\n" -#: src/filed/filed.c:482 -#, c-format -msgid "" -"Failed to load trusted signer certificate from file %s for File daemon \"%s" -"\" in %s.\n" -msgstr "" -"Fallo al cargar certificado del firmante desde el archivo %s para File " -"Daemon \"%s\" en %s.\n" +#~ msgid "2905 Bad RunBeforeJob command.\n" +#~ msgstr "2905 Malo comando RunBeforeJob.\n" -#: src/filed/filed.c:522 -#, c-format -msgid "" -"Failed to load master key certificate from file %s for File daemon \"%s\" in " -"%s.\n" -msgstr "" -"Fallo al cargar certificado de llave maestro desde el archivo %s para File " -"Daemon \"%s\" en %s.\n" +#~ msgid "2905 Bad RunBeforeNow command.\n" +#~ msgstr "2905 Malo comando RunBeforeNow.\n" -#: src/filed/filed_conf.c:200 src/filed/filed_conf.c:224 -#, fuzzy, c-format -msgid "Expected a Cipher Type keyword, got: %s" -msgstr "Esperaba una palabra clave Tipo Device, obtuvo: %s" +#~ msgid "Bad RunAfter command: %s\n" +#~ msgstr "Malo comando RunAfter: %s\n" -#: src/filed/hello.c:79 src/stored/hello.c:102 -#, c-format -msgid "Bad Hello command from Director at %s. Len=%d.\n" -msgstr "Malo comando Hello desde Director en %s. Len=%d\n" +#~ msgid "2905 Bad RunAfterJob command.\n" +#~ msgstr "2905 Malo comando RunAfterJob.\n" -#: src/filed/hello.c:93 src/stored/hello.c:116 -#, c-format -msgid "Bad Hello command from Director at %s: %s\n" -msgstr "Malo comando Hello desde Director en %s: %s\n" +#~ msgid "Bad RunScript command: %s\n" +#~ msgstr "Malo comando RunScript: %s\n" -#: src/filed/hello.c:111 -#, c-format -msgid "Connection from unknown Director %s at %s rejected.\n" -msgstr "Conexión desde Director %s desconocido en %s rechazada.\n" +#~ msgid "2905 Bad RunScript command.\n" +#~ msgstr "2905 Malo comando RunScript.\n" -#: src/filed/hello.c:145 #, fuzzy -msgid "SD connect failed: Bad Hello command\n" -msgstr "Director rechazo comando Hello\n" +#~ msgid "Bad RestoreObject command: %s\n" +#~ msgstr "Malo comando storage: %s" -#: src/filed/hello.c:153 -#, fuzzy, c-format -msgid "SD connect failed: Job name not found: %s\n" -msgstr "Fallo al conectar a FD: Nombre del Job no encontrado: %s\n" +#, fuzzy +#~ msgid "2909 Bad RestoreObject command.\n" +#~ msgstr "2905 Malo comando RunBeforeJob.\n" -#: src/filed/hello.c:164 -#, fuzzy, c-format -msgid "SD \"%s\" tried to connect two times.\n" -msgstr "Fallo al conectar con el cliente.\n" +#, fuzzy +#~ msgid "Plugin Directory not defined. Cannot use plugin: \"%s\"\n" +#~ msgstr "Directorio de Plugin no definido. No se puede usar plug-in: \"%\"\n" -#: src/filed/hello.c:269 src/filed/hello.c:271 src/stored/hello.c:500 -#: src/stored/hello.c:502 -#, fuzzy, c-format -msgid "Recv caps from SD failed. ERR=%s\n" -msgstr "cap_from_text fallido: ERR=%s\n" +#~ msgid "Error running program: %s. stat=%d: ERR=%s\n" +#~ msgstr "Error al ejecutar el programa: %s. stat=%d: ERR=%s\n" -#: src/filed/hello.c:277 src/stored/hello.c:508 -#, fuzzy, c-format -msgid "Bad caps from SD: %s.\n" -msgstr "Malo comando Hello desde Director en %s: %s\n" +#~ msgid "Cannot open FileSet input file: %s. ERR=%s\n" +#~ msgstr "No se puede abrir archivo de entrada FileSet: %s. ERR=%s\n" -#: src/filed/hello.c:278 src/stored/hello.c:509 -#, fuzzy, c-format -msgid "Bad caps from SD: %s\n" -msgstr "Mal estado desde BSF. ERR=%s\n" +#~ msgid "REGEX %s compile error. ERR=%s\n" +#~ msgstr "Error de compilación REGEX %s. ERR=%s\n" -#: src/filed/job.c:322 -#, fuzzy, c-format -msgid "Command: \"%s\" is disabled.\n" -msgstr "Job \"%s\" %sabled\n" +#~ msgid "Invalid FileSet command: %s\n" +#~ msgstr "Comando FilseSet invalido: %s\n" -#: src/filed/job.c:491 -#, fuzzy, c-format -msgid "Bad command from %s. Len=%d.\n" -msgstr "Malo comando Hello desde Director en %s. Len=%d\n" +#~ msgid "Unknown include/exclude option: %c\n" +#~ msgstr "Opción incluir/excluir desconocida: %c\n" -#: src/filed/job.c:552 -msgid "2902 Error scanning cancel command.\n" -msgstr "2902 Error escaneando comando cancelar.\n" +#~ msgid "" +#~ "DIR and FD clocks differ by %lld seconds, FD automatically compensating.\n" +#~ msgstr "" +#~ "Relojes de DIR y FD difieren por %lld segundos, FD compensando " +#~ "automáticamente.\n" -#: src/filed/job.c:556 src/filed/job.c:595 -#, c-format -msgid "2901 Job %s not found.\n" -msgstr "2901 Job %s no encontrado.\n" +#~ msgid "Unknown backup level: %s\n" +#~ msgstr "Nivel de copia de seguridad desconocido: %s\n" -#: src/filed/job.c:566 -#, fuzzy, c-format -msgid "2001 Job \"%s\" marked to be %s.\n" -msgstr "2001 Job %s marcado para ser cancelado.\n" +#~ msgid "Bad level command: %s\n" +#~ msgstr "Malo comando nivel: %s\n" -#: src/filed/job.c:589 -#, fuzzy, c-format -msgid "2991 Bad setbandwidth command: %s\n" -msgstr "2991 Comando setdebug malo: %s\n" +#~ msgid "Bad session command: %s" +#~ msgstr "Malo comando sesión: %s" -#: src/filed/job.c:645 -#, c-format -msgid "2991 Bad setdebug command: %s\n" -msgstr "2991 Comando setdebug malo: %s\n" +#~ msgid "Bad storage command: %s" +#~ msgstr "Malo comando storage: %s" -#: src/filed/job.c:695 -#, c-format -msgid "Bad estimate command: %s" -msgstr "Malo comando estimate: %s" +#~ msgid "Failed to connect to Storage daemon: %s:%d\n" +#~ msgstr "Error al conectar con el demonio de Storage: %s:%d\n" -#: src/filed/job.c:696 -msgid "2992 Bad estimate command.\n" -msgstr "2992 Malo comando estimación.\n" +#, fuzzy +#~ msgid "Failed connect from Storage daemon. SD bsock=NULL.\n" +#~ msgstr "Error al conectar con demonio Storage.\n" -#: src/filed/job.c:719 -#, c-format -msgid "Bad Job Command: %s" -msgstr "Malo Comando Job: %s" +#~ msgid "ACL support not configured for your machine.\n" +#~ msgstr "Soporte ACL no configurado para su máquina. \n" -#: src/filed/job.c:759 -#, c-format -msgid "Bad RunBeforeJob command: %s\n" -msgstr "Malo comando RunBeforeJob: %s\n" +#~ msgid "XATTR support not configured for your machine.\n" +#~ msgstr "Soporte XATTR no está configurado para su máquina.\n" -#: src/filed/job.c:760 src/filed/job.c:779 -msgid "2905 Bad RunBeforeJob command.\n" -msgstr "2905 Malo comando RunBeforeJob.\n" +#~ msgid "Cannot contact Storage daemon\n" +#~ msgstr "No puede contactar demonio Storage\n" -#: src/filed/job.c:790 -msgid "2905 Bad RunBeforeNow command.\n" -msgstr "2905 Malo comando RunBeforeNow.\n" +#~ msgid "Bad response to append open: %s\n" +#~ msgstr "Mala respuesta para añadir abierto: %s\n" -#: src/filed/job.c:809 -#, c-format -msgid "Bad RunAfter command: %s\n" -msgstr "Malo comando RunAfter: %s\n" +#~ msgid "Bad response from stored to open command\n" +#~ msgstr "Mala respuesta desde almacén para comando abrir\n" -#: src/filed/job.c:810 -msgid "2905 Bad RunAfterJob command.\n" -msgstr "2905 Malo comando RunAfterJob.\n" +#, fuzzy +#~ msgid "Generate VSS snapshots. Driver=\"%s\"\n" +#~ msgstr "" +#~ "Generar instantáneas(snapshots) VSS. Driver=\"%s\", Drive(s)=\"%s\"\n" -#: src/filed/job.c:846 -#, c-format -msgid "Bad RunScript command: %s\n" -msgstr "Malo comando RunScript: %s\n" +#, fuzzy +#~ msgid "VSS CreateSnapshots failed. ERR=%s\n" +#~ msgstr "Fallo al generar VSS snapshots.\n" -#: src/filed/job.c:847 -msgid "2905 Bad RunScript command.\n" -msgstr "2905 Malo comando RunScript.\n" +#~ msgid "VSS Writer (PrepareForBackup): %s\n" +#~ msgstr "VSS Writer (PrepareForBackup): %s\n" -#: src/filed/job.c:902 -#, fuzzy, c-format -msgid "Bad RestoreObject command: %s\n" -msgstr "Malo comando storage: %s" +#~ msgid "No drive letters found for generating VSS snapshots.\n" +#~ msgstr "" +#~ "No encuentra las letras de unidad para la generación de " +#~ "instantáneas(snapshots) VSS.\n" -#: src/filed/job.c:967 #, fuzzy -msgid "2909 Bad RestoreObject command.\n" -msgstr "2905 Malo comando RunBeforeJob.\n" +#~ msgid "VSS was not initialized properly. ERR=%s\n" +#~ msgstr "" +#~ "VSS no se inicializo correctamente. Suporte VSS está desactivado. ERR=%s\n" -#: src/filed/job.c:1064 -#, fuzzy, c-format -msgid "Plugin Directory not defined. Cannot use plugin: \"%s\"\n" -msgstr "Directorio de Plugin no definido. No se puede usar plug-in: \"%\"\n" +#~ msgid "Append Close with SD failed.\n" +#~ msgstr "Añadir Cierre con SD fallido.\n" -#: src/filed/job.c:1106 -#, c-format -msgid "Error running program: %s. stat=%d: ERR=%s\n" -msgstr "Error al ejecutar el programa: %s. stat=%d: ERR=%s\n" +#, fuzzy +#~ msgid "Bad status %d %c returned from Storage Daemon.\n" +#~ msgstr "Mal estado %d regresado desde demonio Storage.\n" -#: src/filed/job.c:1117 -#, c-format -msgid "Cannot open FileSet input file: %s. ERR=%s\n" -msgstr "No se puede abrir archivo de entrada FileSet: %s. ERR=%s\n" +#~ msgid "2994 Bad verify command: %s\n" +#~ msgstr "2994 Malo comando verificar: %s\n" -#: src/filed/job.c:1271 -#, c-format -msgid "REGEX %s compile error. ERR=%s\n" -msgstr "Error de compilación REGEX %s. ERR=%s\n" +#~ msgid "2994 Bad verify level: %s\n" +#~ msgstr "2994 Malo nivel de verificar: %s\n" -#: src/filed/job.c:1422 -#, c-format -msgid "Invalid FileSet command: %s\n" -msgstr "Comando FilseSet invalido: %s\n" +#~ msgid "Bad replace command. CMD=%s\n" +#~ msgstr "Comando replace malo. CMD=%s\n" -#: src/filed/job.c:1708 src/findlib/match.c:205 src/tools/testfind.c:640 -#, c-format -msgid "Unknown include/exclude option: %c\n" -msgstr "Opción incluir/excluir desconocida: %c\n" +#~ msgid "Bad where regexp. where=%s\n" +#~ msgstr "Mala regexp where. where=%s\n" -#: src/filed/job.c:1862 -#, c-format -msgid "" -"DIR and FD clocks differ by %lld seconds, FD automatically compensating.\n" -msgstr "" -"Relojes de DIR y FD difieren por %lld segundos, FD compensando " -"automáticamente.\n" - -#: src/filed/job.c:1871 -#, c-format -msgid "Unknown backup level: %s\n" -msgstr "Nivel de copia de seguridad desconocido: %s\n" +#~ msgid "VSS was not initialized properly. VSS support is disabled. ERR=%s\n" +#~ msgstr "" +#~ "VSS no se inicializo correctamente. Suporte VSS está desactivado. ERR=%s\n" -#: src/filed/job.c:1884 -#, c-format -msgid "Bad level command: %s\n" -msgstr "Malo comando nivel: %s\n" +#, fuzzy +#~ msgid "VSS Writer (RestoreComplete): %s\n" +#~ msgstr "VSS Writer (BackupComplete): %s\n" -#: src/filed/job.c:1906 -#, c-format -msgid "Bad session command: %s" -msgstr "Malo comando sesión: %s" +#~ msgid "Improper calling sequence.\n" +#~ msgstr "Secuencia de llamada impropia.\n" -#: src/filed/job.c:1965 src/stored/dircmd.c:348 -#, c-format -msgid "Bad storage command: %s" -msgstr "Malo comando storage: %s" +#~ msgid "Bad response to SD read open: %s\n" +#~ msgstr "Mala respuesta para SD leer abrir: %s\n" -#: src/filed/job.c:1993 src/stored/dircmd.c:370 -#, c-format -msgid "Failed to connect to Storage daemon: %s:%d\n" -msgstr "Error al conectar con el demonio de Storage: %s:%d\n" +#~ msgid "Bad response from stored to read open command\n" +#~ msgstr "Mala respuesta desde storage para comando leer abir\n" -#: src/filed/job.c:2034 #, fuzzy -msgid "Failed connect from Storage daemon. SD bsock=NULL.\n" -msgstr "Error al conectar con demonio Storage.\n" +#~ msgid "" +#~ "Bad response from SD to %s command. Wanted %s, got len=%ld msg=\"%s\"\n" +#~ msgstr "Mala respuesta al comando %s. Esperaba %s, obtuvo %s\n" -#: src/filed/job.c:2282 -msgid "ACL support not configured for your machine.\n" -msgstr "Soporte ACL no configurado para su máquina. \n" +#~ msgid "" +#~ "Size of data or stream of %s not correct. Original %s, restored %s.\n" +#~ msgstr "" +#~ "Tamaño de datos o flujo de %s no es correcto. Original %s, restaurado %s\n" -#: src/filed/job.c:2286 -msgid "XATTR support not configured for your machine.\n" -msgstr "Soporte XATTR no está configurado para su máquina.\n" +#~ msgid "Invalid length of Finder Info (got %d, not 32)\n" +#~ msgstr "Longitud no válida de Buscador de Información (obtuvo %d, no 32)\n" -#: src/filed/job.c:2295 -msgid "Cannot contact Storage daemon\n" -msgstr "No puede contactar demonio Storage\n" +#~ msgid "Could not set Finder Info on %s\n" +#~ msgstr "No se pudo establecer Finder Info en %s\n" -#: src/filed/job.c:2314 -#, c-format -msgid "Bad response to append open: %s\n" -msgstr "Mala respuesta para añadir abierto: %s\n" +#~ msgid "Unknown stream=%d ignored. This shouldn't happen!\n" +#~ msgstr "Flujo desconocido=%d ignorado. Esto no debería suceder!\n" -#: src/filed/job.c:2319 -msgid "Bad response from stored to open command\n" -msgstr "Mala respuesta desde almacén para comando abrir\n" +#, fuzzy +#~ msgid "LZO init failed\n" +#~ msgstr "Negociación TLS fallida\n" -#: src/filed/job.c:2350 -#, fuzzy, c-format -msgid "Generate VSS snapshots. Driver=\"%s\"\n" -msgstr "Generar instantáneas(snapshots) VSS. Driver=\"%s\", Drive(s)=\"%s\"\n" +#~ msgid "Record header scan error: %s\n" +#~ msgstr "Error analizando registro de cabecera: %s\n" -#: src/filed/job.c:2355 -#, fuzzy, c-format -msgid "VSS CreateSnapshots failed. ERR=%s\n" -msgstr "Fallo al generar VSS snapshots.\n" +#~ msgid "Data record error. ERR=%s\n" +#~ msgstr "Error de registro de datos. ERR=%s\n" -#: src/filed/job.c:2361 -#, c-format -msgid "VSS Writer (PrepareForBackup): %s\n" -msgstr "VSS Writer (PrepareForBackup): %s\n" +#~ msgid "Actual data size %d not same as header %d\n" +#~ msgstr "Tamaño actual de los datos %d no igual a cabecera %d\n" -#: src/filed/job.c:2366 -msgid "No drive letters found for generating VSS snapshots.\n" -msgstr "" -"No encuentra las letras de unidad para la generación de " -"instantáneas(snapshots) VSS.\n" +#~ msgid "%s stream not supported on this Client.\n" +#~ msgstr "flujo %s no suportado en este Cliente.\n" -#: src/filed/job.c:2370 -#, fuzzy, c-format -msgid "VSS was not initialized properly. ERR=%s\n" -msgstr "" -"VSS no se inicializo correctamente. Suporte VSS está desactivado. ERR=%s\n" +#~ msgid "Unexpected cryptographic session data stream.\n" +#~ msgstr "Inesperado flujo de datos de sesión criptográfica.\n" -#: src/filed/job.c:2428 -msgid "Append Close with SD failed.\n" -msgstr "Añadir Cierre con SD fallido.\n" +#~ msgid "" +#~ "No private decryption keys have been defined to decrypt encrypted backup " +#~ "data.\n" +#~ msgstr "" +#~ "Ninguna claves privadas de descifrado se ha definido para descifrar los " +#~ "datos cifrados de las copia de seguridad.\n" -#: src/filed/job.c:2433 -#, fuzzy, c-format -msgid "Bad status %d %c returned from Storage Daemon.\n" -msgstr "Mal estado %d regresado desde demonio Storage.\n" +#~ msgid "Could not create digest.\n" +#~ msgstr "No es posible crear sumario.\n" -#: src/filed/job.c:2463 -#, c-format -msgid "2994 Bad verify command: %s\n" -msgstr "2994 Malo comando verificar: %s\n" +#~ msgid "Missing private key required to decrypt encrypted backup data.\n" +#~ msgstr "" +#~ "Falta la clave privada requerida para descifrar los datos del respaldo " +#~ "cifrado.\n" -#: src/filed/job.c:2478 src/filed/job.c:2519 -#, c-format -msgid "2994 Bad verify level: %s\n" -msgstr "2994 Malo nivel de verificar: %s\n" +#~ msgid "Decrypt of the session key failed.\n" +#~ msgstr "Fallo al descifrar la clave de sesión.\n" -#: src/filed/job.c:2624 -#, c-format -msgid "Bad replace command. CMD=%s\n" -msgstr "Comando replace malo. CMD=%s\n" +#, fuzzy +#~ msgid "Signer not found. Decryption failed.\n" +#~ msgstr "Fallo en creación de firma" -#: src/filed/job.c:2650 -#, c-format -msgid "Bad where regexp. where=%s\n" -msgstr "Mala regexp where. where=%s\n" +#, fuzzy +#~ msgid "Unsupported digest algorithm. Decrypt failed.\n" +#~ msgstr "Algoritmo de resumen no soportado" -#: src/filed/job.c:2686 -#, c-format -msgid "VSS was not initialized properly. VSS support is disabled. ERR=%s\n" -msgstr "" -"VSS no se inicializo correctamente. Suporte VSS está desactivado. ERR=%s\n" +#, fuzzy +#~ msgid "Unsupported encryption algorithm. Decrypt failed.\n" +#~ msgstr "Algoritmo de cifrado no soportado" -#: src/filed/job.c:2731 -#, fuzzy, c-format -msgid "VSS Writer (RestoreComplete): %s\n" -msgstr "VSS Writer (BackupComplete): %s\n" +#, fuzzy +#~ msgid "" +#~ "An error=%d occurred while decoding encrypted session data stream: ERR=" +#~ "%s\n" +#~ msgstr "" +#~ "Se produjo un error al descodificar flujo de datos de sesión encriptados: " +#~ "%s\n" -#: src/filed/job.c:2786 -msgid "Improper calling sequence.\n" -msgstr "Secuencia de llamada impropia.\n" +#~ msgid "Missing encryption session data stream for %s\n" +#~ msgstr "Falta cifrado de flujo de datos de sesión para %s\n" -#: src/filed/job.c:2806 -#, c-format -msgid "Bad response to SD read open: %s\n" -msgstr "Mala respuesta para SD leer abrir: %s\n" +#~ msgid "Failed to initialize decryption context for %s\n" +#~ msgstr "Fallo al inicializar el contexto de descifrado para %s\n" -#: src/filed/job.c:2811 -msgid "Bad response from stored to read open command\n" -msgstr "Mala respuesta desde storage para comando leer abir\n" +#~ msgid "Cannot open resource fork for %s.\n" +#~ msgstr "No se puede abrir recursos fork para %s.\n" -#: src/filed/job.c:2900 -#, fuzzy, c-format -msgid "Bad response from SD to %s command. Wanted %s, got len=%ld msg=\"%s\"\n" -msgstr "Mala respuesta al comando %s. Esperaba %s, obtuvo %s\n" +#~ msgid "Unexpected cryptographic signature data stream.\n" +#~ msgstr "Inesperado signatura de datos de sesión criptográfica.\n" -#: src/filed/restore.c:99 -#, c-format -msgid "Size of data or stream of %s not correct. Original %s, restored %s.\n" -msgstr "" -"Tamaño de datos o flujo de %s no es correcto. Original %s, restaurado %s\n" +#~ msgid "Failed to decode message signature for %s\n" +#~ msgstr "No se ha podido descifrar la firma del mensaje para %s\n" -#: src/filed/restore.c:119 -#, c-format -msgid "Invalid length of Finder Info (got %d, not 32)\n" -msgstr "Longitud no válida de Buscador de Información (obtuvo %d, no 32)\n" +#~ msgid "Encountered %ld acl errors while doing restore\n" +#~ msgstr "Detectado %ld errores de acl mientras que hace restaurar\n" -#: src/filed/restore.c:124 -#, c-format -msgid "Could not set Finder Info on %s\n" -msgstr "No se pudo establecer Finder Info en %s\n" +#~ msgid "Encountered %ld xattr errors while doing restore\n" +#~ msgstr "Detectado %ld errores de xattr al hacer restauración\n" -#: src/filed/restore.c:312 src/filed/restore.c:995 src/stored/bextract.c:696 -#, c-format -msgid "Unknown stream=%d ignored. This shouldn't happen!\n" -msgstr "Flujo desconocido=%d ignorado. Esto no debería suceder!\n" +#~ msgid "" +#~ "%d non-supported data streams and %d non-supported attrib streams " +#~ "ignored.\n" +#~ msgstr "" +#~ "%d incompatible flujos de datos y %d incompatible atributos de flujos " +#~ "ignorados.\n" -#: src/filed/restore.c:410 -#, fuzzy -msgid "LZO init failed\n" -msgstr "Negociación TLS fallida\n" +#~ msgid "%d non-supported resource fork streams ignored.\n" +#~ msgstr "%d incompatible flujo de recurso fork ignorado.\n" -#: src/filed/restore.c:472 src/filed/verify_vol.c:95 -#, c-format -msgid "Record header scan error: %s\n" -msgstr "Error analizando registro de cabecera: %s\n" +#~ msgid "%d non-supported Finder Info streams ignored.\n" +#~ msgstr "%d incompatible flujo Finder Info ignorado.\n" -#: src/filed/restore.c:482 src/filed/verify_vol.c:105 -#, c-format -msgid "Data record error. ERR=%s\n" -msgstr "Error de registro de datos. ERR=%s\n" +#~ msgid "%d non-supported acl streams ignored.\n" +#~ msgstr "%d incompatible flujo de acl ignorado.\n" -#: src/filed/restore.c:486 src/filed/verify_vol.c:109 -#, c-format -msgid "Actual data size %d not same as header %d\n" -msgstr "Tamaño actual de los datos %d no igual a cabecera %d\n" +#~ msgid "%d non-supported crypto streams ignored.\n" +#~ msgstr "%d incompatible flujo de cifrado ignorado.\n" -#: src/filed/restore.c:548 src/stored/bextract.c:436 -#, c-format -msgid "%s stream not supported on this Client.\n" -msgstr "flujo %s no suportado en este Cliente.\n" +#~ msgid "%d non-supported xattr streams ignored.\n" +#~ msgstr "ignorado %d no soportado flujo xattr.\n" -#: src/filed/restore.c:629 -msgid "Unexpected cryptographic session data stream.\n" -msgstr "Inesperado flujo de datos de sesión criptográfica.\n" +#~ msgid "None" +#~ msgstr "Ninguno" -#: src/filed/restore.c:637 -msgid "" -"No private decryption keys have been defined to decrypt encrypted backup " -"data.\n" -msgstr "" -"Ninguna claves privadas de descifrado se ha definido para descifrar los " -"datos cifrados de las copia de seguridad.\n" +#~ msgid "Zlib errno" +#~ msgstr "Zlib error" -#: src/filed/restore.c:648 -msgid "Could not create digest.\n" -msgstr "No es posible crear sumario.\n" +#~ msgid "Zlib stream error" +#~ msgstr "Zlib error de stream" -#: src/filed/restore.c:662 -msgid "Missing private key required to decrypt encrypted backup data.\n" -msgstr "" -"Falta la clave privada requerida para descifrar los datos del respaldo " -"cifrado.\n" +#~ msgid "Zlib data error" +#~ msgstr "Zlib error de datos" -#: src/filed/restore.c:665 -msgid "Decrypt of the session key failed.\n" -msgstr "Fallo al descifrar la clave de sesión.\n" +#~ msgid "Zlib memory error" +#~ msgstr "Zlib error de memoria" -#: src/filed/restore.c:668 -#, fuzzy -msgid "Signer not found. Decryption failed.\n" -msgstr "Fallo en creación de firma" +#~ msgid "Zlib buffer error" +#~ msgstr "Zlib error de buffer" -#: src/filed/restore.c:671 -#, fuzzy -msgid "Unsupported digest algorithm. Decrypt failed.\n" -msgstr "Algoritmo de resumen no soportado" +#~ msgid "Zlib version error" +#~ msgstr "Zlib error de version" -#: src/filed/restore.c:674 -#, fuzzy -msgid "Unsupported encryption algorithm. Decrypt failed.\n" -msgstr "Algoritmo de cifrado no soportado" +#~ msgid "*none*" +#~ msgstr "*ninguno*" -#: src/filed/restore.c:678 -#, fuzzy, c-format -msgid "" -"An error=%d occurred while decoding encrypted session data stream: ERR=%s\n" -msgstr "" -"Se produjo un error al descodificar flujo de datos de sesión encriptados: " -"%s\n" +#~ msgid "Missing cryptographic signature for %s\n" +#~ msgstr "Falta la firma criptográfica para %s\n" -#: src/filed/restore.c:747 src/filed/restore.c:795 -#, c-format -msgid "Missing encryption session data stream for %s\n" -msgstr "Falta cifrado de flujo de datos de sesión para %s\n" +#~ msgid "Signature validation failed for file %s: ERR=%s\n" +#~ msgstr "Validación de la firma fallida para el archivo %s: ERR=%s\n" -#: src/filed/restore.c:755 src/filed/restore.c:802 -#, c-format -msgid "Failed to initialize decryption context for %s\n" -msgstr "Fallo al inicializar el contexto de descifrado para %s\n" +#~ msgid "Digest one file failed for file: %s\n" +#~ msgstr "Digest de un archivo fallido para el archivo: %s\n" -#: src/filed/restore.c:814 -#, c-format -msgid "Cannot open resource fork for %s.\n" -msgstr "No se puede abrir recursos fork para %s.\n" +#~ msgid "Signature validation failed for %s: %s\n" +#~ msgstr "Validación de la firma fallida para %s: %s\n" -#: src/filed/restore.c:956 -msgid "Unexpected cryptographic signature data stream.\n" -msgstr "Inesperado signatura de datos de sesión criptográfica.\n" +#~ msgid "Seek to %s error on %s: ERR=%s\n" +#~ msgstr "Tratar de %s error en %s: ERR=%s\n" -#: src/filed/restore.c:962 -#, c-format -msgid "Failed to decode message signature for %s\n" -msgstr "No se ha podido descifrar la firma del mensaje para %s\n" +#, fuzzy +#~ msgid "LZO uncompression error on file %s. ERR=%d\n" +#~ msgstr "Error de descompresión en el archivo %s. ERR=%s\n" -#: src/filed/restore.c:1033 -#, c-format -msgid "Encountered %ld acl errors while doing restore\n" -msgstr "Detectado %ld errores de acl mientras que hace restaurar\n" +#~ msgid "Uncompression error on file %s. ERR=%s\n" +#~ msgstr "Error de descompresión en el archivo %s. ERR=%s\n" -#: src/filed/restore.c:1037 -#, c-format -msgid "Encountered %ld xattr errors while doing restore\n" -msgstr "Detectado %ld errores de xattr al hacer restauración\n" +#~ msgid "GZIP data stream found, but GZIP not configured!\n" +#~ msgstr "Flujo de datos GZIP encontrado, pero GZIP no está configurado!\n" -#: src/filed/restore.c:1041 -#, c-format -msgid "" -"%d non-supported data streams and %d non-supported attrib streams ignored.\n" -msgstr "" -"%d incompatible flujos de datos y %d incompatible atributos de flujos " -"ignorados.\n" +#~ msgid "Write error in Win32 Block Decomposition on %s: %s\n" +#~ msgstr "Error de escritura en Bloque de Descomposición Win32 en %s: %s\n" -#: src/filed/restore.c:1045 -#, c-format -msgid "%d non-supported resource fork streams ignored.\n" -msgstr "%d incompatible flujo de recurso fork ignorado.\n" +#, fuzzy +#~ msgid "Write write error on %s: ERR=%s\n" +#~ msgstr "Error de escritura en %s: %s\n" -#: src/filed/restore.c:1048 -#, c-format -msgid "%d non-supported Finder Info streams ignored.\n" -msgstr "%d incompatible flujo Finder Info ignorado.\n" +#, fuzzy +#~ msgid "Wrong write size error at %lld block=%d wanted=%d wrote=%d\n" +#~ msgstr "Error de escritura en Bloque de Descomposición Win32 en %s: %s\n" -#: src/filed/restore.c:1051 -#, c-format -msgid "%d non-supported acl streams ignored.\n" -msgstr "%d incompatible flujo de acl ignorado.\n" +#, fuzzy +#~ msgid "" +#~ "Write write error at %lld block=%d write_len=%d lerror=%d on %s: ERR=%s\n" +#~ msgstr "Error de escritura en Bloque de Descomposición Win32 en %s: %s\n" -#: src/filed/restore.c:1054 -#, c-format -msgid "%d non-supported crypto streams ignored.\n" -msgstr "%d incompatible flujo de cifrado ignorado.\n" +#~ msgid "Decryption error\n" +#~ msgstr "Error de descifrado\n" -#: src/filed/restore.c:1057 -#, c-format -msgid "%d non-supported xattr streams ignored.\n" -msgstr "ignorado %d no soportado flujo xattr.\n" +#~ msgid "Logic error: output file should be open\n" +#~ msgstr "Error lógico: el archivo de salida debe estar abierto\n" -#: src/filed/restore.c:1136 src/lib/util.c:488 -msgid "None" -msgstr "Ninguno" +#~ msgid "Logic error: output file should not be open\n" +#~ msgstr "Error lógica: archivo de salida no debe estar abierto\n" -#: src/filed/restore.c:1140 -msgid "Zlib errno" -msgstr "Zlib error" +#~ msgid "Decryption error. buf_len=%d decrypt_len=%d on file %s\n" +#~ msgstr "Error de descifrado. buf_len=%d decrypt_len=%d en el archivo %s\n" -#: src/filed/restore.c:1142 -msgid "Zlib stream error" -msgstr "Zlib error de stream" +#, fuzzy +#~ msgid "%s %sVersion: %s (%s) %s %s %s %s\n" +#~ msgstr "%s Versión: %s (%s) %s %s %s %s\n" -#: src/filed/restore.c:1144 -msgid "Zlib data error" -msgstr "Zlib error de datos" +#, fuzzy +#~ msgid "Daemon started %s. Jobs: run=%d running=%d.\n" +#~ msgstr "Demonio iniciado %s, %d Job ejecutando desde el inicio.\n" -#: src/filed/restore.c:1146 -msgid "Zlib memory error" -msgstr "Zlib error de memoria" +#, fuzzy +#~ msgid "" +#~ " Sizes: boffset_t=%d size_t=%d debug=%s trace=%d mode=%d,%d bwlimit=%skB/" +#~ "s\n" +#~ msgstr "Sizeof: boffset_t=%d size_t=%d debug=%d trace=%d\n" -#: src/filed/restore.c:1148 -msgid "Zlib buffer error" -msgstr "Zlib error de buffer" +#, fuzzy +#~ msgid "Director connected %sat: %s\n" +#~ msgstr "Director conectado en: %s\n" -#: src/filed/restore.c:1150 -msgid "Zlib version error" -msgstr "Zlib error de version" +#~ msgid "JobId %d Job %s is running.\n" +#~ msgstr "JobId %d Job %s se está ejecutando.\n" -#: src/filed/restore.c:1152 src/lib/util.c:832 src/lib/util.c:842 -#: src/lib/util.c:853 src/lib/util.c:860 src/lib/util.c:867 src/lib/util.c:881 -#: src/lib/util.c:891 src/lib/util.c:904 src/lib/util.c:915 -msgid "*none*" -msgstr "*ninguno*" +#, fuzzy +#~ msgid " %s%s %s Job started: %s\n" +#~ msgstr " %s%s Job iniciado: %s\n" -#: src/filed/restore.c:1189 -#, c-format -msgid "Missing cryptographic signature for %s\n" -msgstr "Falta la firma criptográfica para %s\n" +#, fuzzy +#~ msgid "" +#~ " Files=%s Bytes=%s AveBytes/sec=%s LastBytes/sec=%s Errors=%d\n" +#~ " Bwlimit=%s ReadBytes=%s\n" +#~ msgstr "Archivos=%s Bytes=%s Bytes/sec=%s Errores=%d\n" -#: src/filed/restore.c:1219 src/filed/restore.c:1243 -#, c-format -msgid "Signature validation failed for file %s: ERR=%s\n" -msgstr "Validación de la firma fallida para el archivo %s: ERR=%s\n" +#, fuzzy +#~ msgid " Files: Examined=%s Backed up=%s\n" +#~ msgstr "Archivos examinados=%s\n" -#: src/filed/restore.c:1233 -#, c-format -msgid "Digest one file failed for file: %s\n" -msgstr "Digest de un archivo fallido para el archivo: %s\n" +#~ msgid " Processing file: %s\n" +#~ msgstr "Procesando archivo: %s\n" -#: src/filed/restore.c:1264 -#, c-format -msgid "Signature validation failed for %s: %s\n" -msgstr "Validación de la firma fallida para %s: %s\n" +#~ msgid " SDSocket closed.\n" +#~ msgstr "SDSocket cerrado.\n" -#: src/filed/restore.c:1290 src/stored/bextract.c:531 -#: src/stored/bextract.c:596 -#, c-format -msgid "Seek to %s error on %s: ERR=%s\n" -msgstr "Tratar de %s error en %s: ERR=%s\n" +#~ msgid "====\n" +#~ msgstr "====\n" -#: src/filed/restore.c:1331 -#, c-format -msgid "Compressed header version error. Got=0x%x want=0x%x\n" -msgstr "" +#~ msgid "Bad .status command: %s\n" +#~ msgstr "Comando .status malo: %s\n" -#: src/filed/restore.c:1336 src/stored/bextract.c:625 -#, c-format -msgid "Compressed header size error. comp_len=%d, msglen=%d\n" -msgstr "" +#~ msgid "2900 Bad .status command, missing argument.\n" +#~ msgstr "2900 Malo comando .status, falta argumento.\n" -#: src/filed/restore.c:1359 -#, fuzzy, c-format -msgid "LZO uncompression error on file %s. ERR=%d\n" -msgstr "Error de descompresión en el archivo %s. ERR=%s\n" +#~ msgid "2900 Bad .status command, wrong argument.\n" +#~ msgstr "2900 Malo comando .status, malo argumento.\n" -#: src/filed/restore.c:1369 src/stored/bextract.c:660 -#, c-format -msgid "Compression algorithm 0x%x found, but not supported!\n" -msgstr "" +#~ msgid "Cannot malloc %d network read buffer\n" +#~ msgstr "No se pudo leer búfer de red malloc %d\n" -#: src/filed/restore.c:1394 -#, c-format -msgid "Uncompression error on file %s. ERR=%s\n" -msgstr "Error de descompresión en el archivo %s. ERR=%s\n" +#~ msgid " Could not access %s: ERR=%s\n" +#~ msgstr "No es posible acceder %s: ERR=%s\n" -#: src/filed/restore.c:1403 src/stored/bextract.c:564 -msgid "GZIP data stream found, but GZIP not configured!\n" -msgstr "Flujo de datos GZIP encontrado, pero GZIP no está configurado!\n" +#~ msgid " Could not follow link %s: ERR=%s\n" +#~ msgstr " No es posible seguir el enlace %s: ERR=%s\n" -#: src/filed/restore.c:1431 -#, c-format -msgid "Write error in Win32 Block Decomposition on %s: %s\n" -msgstr "Error de escritura en Bloque de Descomposición Win32 en %s: %s\n" +#~ msgid " Could not stat %s: ERR=%s\n" +#~ msgstr "No se pudo stat %s: ERR=%s\n" -#: src/filed/restore.c:1439 src/filed/restore.c:1454 -#, fuzzy, c-format -msgid "Write write error on %s: ERR=%s\n" -msgstr "Error de escritura en %s: %s\n" +#~ msgid " Archive file skipped: %s\n" +#~ msgstr "Archivo Archive omitido: %s\n" -#: src/filed/restore.c:1482 -#, fuzzy, c-format -msgid "Wrong write size error at %lld block=%d wanted=%d wrote=%d\n" -msgstr "Error de escritura en Bloque de Descomposición Win32 en %s: %s\n" +#~ msgid " Recursion turned off. Directory skipped: %s\n" +#~ msgstr "Recursión apagado. Directorio omitido: %s\n" -#: src/filed/restore.c:1486 -#, fuzzy, c-format -msgid "" -"Write write error at %lld block=%d write_len=%d lerror=%d on %s: ERR=%s\n" -msgstr "Error de escritura en Bloque de Descomposición Win32 en %s: %s\n" +#~ msgid " File system change prohibited. Directory skipped: %s\n" +#~ msgstr "" +#~ "Prohibido el cambio de sistema de archivos. Directorio omitido: %s\n" -#: src/filed/restore.c:1543 -msgid "Decryption error\n" -msgstr "Error de descifrado\n" +#~ msgid " Could not open directory %s: ERR=%s\n" +#~ msgstr "No se pudo abrir el directorio %s: ERR=%s\n" -#: src/filed/restore.c:1627 -msgid "Logic error: output file should be open\n" -msgstr "Error lógico: el archivo de salida debe estar abierto\n" +#~ msgid " Unknown file type %d: %s\n" +#~ msgstr "Tipo de archivo desconocido %d: %s\n" -#: src/filed/restore.c:1663 -msgid "Logic error: output file should not be open\n" -msgstr "Error lógica: archivo de salida no debe estar abierto\n" +#~ msgid "Network error in send to Director: ERR=%s\n" +#~ msgstr "Error de red en enviar al Director: ERR=%s\n" -#: src/filed/restore.c:1694 -#, c-format -msgid "Decryption error. buf_len=%d decrypt_len=%d on file %s\n" -msgstr "Error de descifrado. buf_len=%d decrypt_len=%d en el archivo %s\n" +#~ msgid " Cannot open %s: ERR=%s.\n" +#~ msgstr "No se puede abrir %s: ERR=%s.\n" -#: src/filed/status.c:115 -#, fuzzy, c-format -msgid "%s %sVersion: %s (%s) %s %s %s %s\n" -msgstr "%s Versión: %s (%s) %s %s %s %s\n" +#~ msgid " Cannot open resource fork for %s: ERR=%s.\n" +#~ msgstr "No se puede abrir recursos fork para %s: ERR=%s.\n" -#: src/filed/status.c:120 -#, fuzzy, c-format -msgid "Daemon started %s. Jobs: run=%d running=%d.\n" -msgstr "Demonio iniciado %s, %d Job ejecutando desde el inicio.\n" +#~ msgid "Error reading file %s: ERR=%s\n" +#~ msgstr "Error leyendo archivo %s: ERR=%s\n" -#: src/filed/status.c:182 -#, fuzzy, c-format -msgid "" -" Sizes: boffset_t=%d size_t=%d debug=%s trace=%d mode=%d,%d bwlimit=%skB/s\n" -msgstr "Sizeof: boffset_t=%d size_t=%d debug=%d trace=%d\n" +#~ msgid "Storage command not issued before Verify.\n" +#~ msgstr "Comando Storage no publicado antes de Verificar.\n" -#: src/filed/status.c:239 -#, fuzzy, c-format -msgid "Director connected %sat: %s\n" -msgstr "Director conectado en: %s\n" +#~ msgid "Error scanning record header: %s\n" +#~ msgstr "Error escaneando registro de cabecera: %s\n" -#: src/filed/status.c:243 -#, c-format -msgid "JobId %d Job %s is running.\n" -msgstr "JobId %d Job %s se está ejecutando.\n" +#, fuzzy +#~ msgid "WriteEncryptedFileRaw failure: ERR=%s\n" +#~ msgstr "Fallo al listar Media: ERR=%s\n" -#: src/filed/status.c:246 -#, fuzzy, c-format -msgid " %s%s %s Job started: %s\n" -msgstr " %s%s Job iniciado: %s\n" +#~ msgid "Illegal xattr stream, no XATTR_MAGIC on file \"%s\"\n" +#~ msgstr "Flujo xattr ilegal, no hay XATTR_MAGIC en el archivo \"%s\"\n" -#: src/filed/status.c:274 -#, fuzzy, c-format -msgid "" -" Files=%s Bytes=%s AveBytes/sec=%s LastBytes/sec=%s Errors=%d\n" -" Bwlimit=%s ReadBytes=%s\n" -msgstr "Archivos=%s Bytes=%s Bytes/sec=%s Errores=%d\n" +#, fuzzy +#~ msgid "Illegal xattr stream, xattr name length <= 0 on file \"%s\"\n" +#~ msgstr "" +#~ "Ilegal flujo xattr, fallo al analizar flujo xattr en el archivo \"%s\"\n" -#: src/filed/status.c:285 -#, c-format -msgid " Files: Restored=%s Expected=%s Completed=%d%%\n" -msgstr "" +#, fuzzy +#~ msgid "llistea error on file \"%s\": ERR=%s\n" +#~ msgstr "error de llistxattr en el archivo \"%s\": ERR=%s\n" -#: src/filed/status.c:290 -#, fuzzy, c-format -msgid " Files: Examined=%s Backed up=%s\n" -msgstr "Archivos examinados=%s\n" +#, fuzzy +#~ msgid "lgetea error on file \"%s\": ERR=%s\n" +#~ msgstr "error de getacl en el archivo \"%s\": ERR=%s\n" -#: src/filed/status.c:303 -#, c-format -msgid " Processing file: %s\n" -msgstr "Procesando archivo: %s\n" +#~ msgid "Xattr stream on file \"%s\" exceeds maximum size of %d bytes\n" +#~ msgstr "" +#~ "Flujo Xattr en el archivo \"%s\" excede el máximo tamaño de %d bytes\n" -#: src/filed/status.c:315 -msgid " SDSocket closed.\n" -msgstr "SDSocket cerrado.\n" +#~ msgid "Failed to serialize extended attributes on file \"%s\"\n" +#~ msgstr "" +#~ "No se pudo serializar los atributos extendidos en el archivo \"%s\"\n" -#: src/filed/status.c:325 -msgid "====\n" -msgstr "====\n" +#, fuzzy +#~ msgid "lsetea error on file \"%s\": ERR=%s\n" +#~ msgstr "setacl error en el archivo \"%s\": ERR=%s\n" -#: src/filed/status.c:458 src/filed/status.c:492 -#, c-format -msgid "Bad .status command: %s\n" -msgstr "Comando .status malo: %s\n" +#, fuzzy +#~ msgid "attr_list error on file \"%s\": ERR=%s\n" +#~ msgstr "error de extattr_list_link en el archivo \"%s\": ERR=%s\n" -#: src/filed/status.c:459 -msgid "2900 Bad .status command, missing argument.\n" -msgstr "2900 Malo comando .status, falta argumento.\n" +#, fuzzy +#~ msgid "Received illegal xattr named %s on file \"%s\"\n" +#~ msgstr "Flujo xattr ilegal, no hay XATTR_MAGIC en el archivo \"%s\"\n" -#: src/filed/status.c:493 -msgid "2900 Bad .status command, wrong argument.\n" -msgstr "2900 Malo comando .status, malo argumento.\n" +#, fuzzy +#~ msgid "attr_set error on file \"%s\": ERR=%s\n" +#~ msgstr "error de acl_set en el archivo \"%s\": ERR=%s\n" -#: src/filed/verify.c:40 -#, c-format -msgid "Cannot malloc %d network read buffer\n" -msgstr "No se pudo leer búfer de red malloc %d\n" +#~ msgid "llistxattr error on file \"%s\": ERR=%s\n" +#~ msgstr "error de llistxattr en el archivo \"%s\": ERR=%s\n" -#: src/filed/verify.c:110 -#, c-format -msgid " Could not access %s: ERR=%s\n" -msgstr "No es posible acceder %s: ERR=%s\n" +#~ msgid "lgetxattr error on file \"%s\": ERR=%s\n" +#~ msgstr "error de lgetxattr en el archivo \"%s\": ERR=%s\n" -#: src/filed/verify.c:117 -#, c-format -msgid " Could not follow link %s: ERR=%s\n" -msgstr " No es posible seguir el enlace %s: ERR=%s\n" +#~ msgid "lsetxattr error on file \"%s\": ERR=%s\n" +#~ msgstr "error de lsetxattr en el archivo \"%s\": ERR=%s\n" -#: src/filed/verify.c:124 -#, c-format -msgid " Could not stat %s: ERR=%s\n" -msgstr "No se pudo stat %s: ERR=%s\n" +#~ msgid "extattr_list_link error on file \"%s\": ERR=%s\n" +#~ msgstr "error de extattr_list_link en el archivo \"%s\": ERR=%s\n" -#: src/filed/verify.c:133 -#, c-format -msgid " Archive file skipped: %s\n" -msgstr "Archivo Archive omitido: %s\n" +#~ msgid "Failed to convert %d into namespace on file \"%s\"\n" +#~ msgstr "No se pudo convertir %d al namespace en el archivo \"%s\"\n" -#: src/filed/verify.c:136 -#, c-format -msgid " Recursion turned off. Directory skipped: %s\n" -msgstr "Recursión apagado. Directorio omitido: %s\n" +#~ msgid "extattr_get_link error on file \"%s\": ERR=%s\n" +#~ msgstr "error de extattr_get_link en el archivo \"%s\": ERR=%s\n" -#: src/filed/verify.c:140 -#, c-format -msgid " File system change prohibited. Directory skipped: %s\n" -msgstr "Prohibido el cambio de sistema de archivos. Directorio omitido: %s\n" +#~ msgid "Failed to split %s into namespace and name part on file \"%s\"\n" +#~ msgstr "" +#~ "No se ha podido separar %s en el namespace y parte del nombre en el " +#~ "archivo \"%s\"\n" -#: src/filed/verify.c:148 -#, c-format -msgid " Could not open directory %s: ERR=%s\n" -msgstr "No se pudo abrir el directorio %s: ERR=%s\n" +#~ msgid "Failed to convert %s into namespace on file \"%s\"\n" +#~ msgstr "No se pudo convertir %s al namespace en el archivo \"%s\"\n" -#: src/filed/verify.c:153 -#, c-format -msgid " Unknown file type %d: %s\n" -msgstr "Tipo de archivo desconocido %d: %s\n" +#~ msgid "extattr_set_link error on file \"%s\": ERR=%s\n" +#~ msgstr "error de extattr_set_link en el archivo \"%s\": ERR=%s\n" -#: src/filed/verify.c:197 src/filed/verify_vol.c:205 -#, c-format -msgid "Network error in send to Director: ERR=%s\n" -msgstr "Error de red en enviar al Director: ERR=%s\n" +#, fuzzy +#~ msgid "getproplist error on file \"%s\": ERR=%s\n" +#~ msgstr "error de getacl en el archivo \"%s\": ERR=%s\n" -#: src/filed/verify.c:291 -#, c-format -msgid " Cannot open %s: ERR=%s.\n" -msgstr "No se puede abrir %s: ERR=%s.\n" +#, fuzzy +#~ msgid "Unable create proper proplist to restore xattrs on file \"%s\"\n" +#~ msgstr "No es posible leer el contenido de xattr %s en el archivo \"%s\"\n" -#: src/filed/verify.c:305 -#, c-format -msgid " Cannot open resource fork for %s: ERR=%s.\n" -msgstr "No se puede abrir recursos fork para %s: ERR=%s.\n" +#, fuzzy +#~ msgid "setproplist error on file \"%s\": ERR=%s\n" +#~ msgstr "strtoacl error en el archivo \"%s\": ERR=%s\n" -#: src/filed/verify.c:367 -#, c-format -msgid "Error reading file %s: ERR=%s\n" -msgstr "Error leyendo archivo %s: ERR=%s\n" +#~ msgid "Unable to get acl on xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "No se puede obtener acl en xattr %s en el archivo \"%s\": ERR=%s\n" -#: src/filed/verify_vol.c:52 -msgid "Storage command not issued before Verify.\n" -msgstr "Comando Storage no publicado antes de Verificar.\n" +#~ msgid "Unable to get acl text on xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "" +#~ "No se puede obtener acl texto en xattr %s en el archivo \"%s\": ERR=%s\n" -#: src/filed/verify_vol.c:142 -#, c-format -msgid "Error scanning record header: %s\n" -msgstr "Error escaneando registro de cabecera: %s\n" +#~ msgid "Unable to get status on xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "" +#~ "No se puede obtener estado en xattr %s en el archivo \"%s\": ERR=%s\n" -#: src/filed/win_efs.c:106 -#, c-format -msgid "Restore data %ld bytes too long for Microsoft buffer %ld bytes.\n" -msgstr "" +#~ msgid "Unable to open xattr %s on \"%s\": ERR=%s\n" +#~ msgstr "No se puede abrir xattr %s en \"%s\": ERR=%s\n" -#: src/filed/win_efs.c:192 -#, c-format -msgid "Restore data %ld bytes too long for Microsoft buffer %lld bytes.\n" -msgstr "" +#~ msgid "Unable to read symlin %s on \"%s\": ERR=%s\n" +#~ msgstr "No se puede leer symlin %s en \"%s\": ERR=%s\n" -#: src/filed/win_efs.c:227 -#, fuzzy, c-format -msgid "WriteEncryptedFileRaw failure: ERR=%s\n" -msgstr "Fallo al listar Media: ERR=%s\n" +#~ msgid "Unable to read content of xattr %s on file \"%s\"\n" +#~ msgstr "No es posible leer el contenido de xattr %s en el archivo \"%s\"\n" -#: src/filed/xattr.c:235 -#, c-format -msgid "Illegal xattr stream, no XATTR_MAGIC on file \"%s\"\n" -msgstr "Flujo xattr ilegal, no hay XATTR_MAGIC en el archivo \"%s\"\n" +#~ msgid "Unable to chdir to xattr space of file \"%s\": ERR=%s\n" +#~ msgstr "No se puede chdir a xattr espacio de archivo \"%s\": ERR=%s\n" -#: src/filed/xattr.c:249 -#, fuzzy, c-format -msgid "Illegal xattr stream, xattr name length <= 0 on file \"%s\"\n" -msgstr "" -"Ilegal flujo xattr, fallo al analizar flujo xattr en el archivo \"%s\"\n" +#~ msgid "Unable to open file \"%s\": ERR=%s\n" +#~ msgstr "No se puede abrir el archivo \"%s\": ERR=%s\n" -#: src/filed/xattr.c:371 src/filed/xattr.c:407 -#, fuzzy, c-format -msgid "llistea error on file \"%s\": ERR=%s\n" -msgstr "error de llistxattr en el archivo \"%s\": ERR=%s\n" +#~ msgid "Unable to open xattr space %s on file \"%s\": ERR=%s\n" +#~ msgstr "No se puede abrir espacio xattr %s en el archivo \"%s\": ERR=%s\n" -#: src/filed/xattr.c:457 src/filed/xattr.c:511 -#, fuzzy, c-format -msgid "lgetea error on file \"%s\": ERR=%s\n" -msgstr "error de getacl en el archivo \"%s\": ERR=%s\n" +#~ msgid "Unable to chdir to xattr space on file \"%s\": ERR=%s\n" +#~ msgstr "No se puede chdir a xattr espacio en el archivo \"%s\": ERR=%s\n" -#: src/filed/xattr.c:547 src/filed/xattr.c:869 src/filed/xattr.c:1344 -#: src/filed/xattr.c:1812 src/filed/xattr.c:2169 src/filed/xattr.c:2961 -#, c-format -msgid "Xattr stream on file \"%s\" exceeds maximum size of %d bytes\n" -msgstr "Flujo Xattr en el archivo \"%s\" excede el máximo tamaño de %d bytes\n" +#~ msgid "Unable to list the xattr space on file \"%s\": ERR=%s\n" +#~ msgstr "No se puede listar el xattr espacio en el archivo \"%s\": ERR=%s\n" -#: src/filed/xattr.c:567 src/filed/xattr.c:895 src/filed/xattr.c:1364 -#: src/filed/xattr.c:1842 src/filed/xattr.c:2186 -#, c-format -msgid "Failed to serialize extended attributes on file \"%s\"\n" -msgstr "No se pudo serializar los atributos extendidos en el archivo \"%s\"\n" +#~ msgid "Unable to convert acl from text on file \"%s\"\n" +#~ msgstr "No se puede convertir acl de texto en el archivo \"%s\"\n" -#: src/filed/xattr.c:634 -#, fuzzy, c-format -msgid "lsetea error on file \"%s\": ERR=%s\n" -msgstr "setacl error en el archivo \"%s\": ERR=%s\n" +#~ msgid "Unable to restore acl of xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "" +#~ "No se puede restablecer acl de xattr %s en el archivo \"%s\": ERR=%s\n" -#: src/filed/xattr.c:722 src/filed/xattr.c:760 src/filed/xattr.c:824 -#: src/filed/xattr.c:836 -#, fuzzy, c-format -msgid "attr_list error on file \"%s\": ERR=%s\n" -msgstr "error de extattr_list_link en el archivo \"%s\": ERR=%s\n" +#~ msgid "Unable to open xattr space on file \"%s\": ERR=%s\n" +#~ msgstr "No se puede abrir xattr espacio en el archivo \"%s\": ERR=%s\n" -#: src/filed/xattr.c:960 -#, fuzzy, c-format -msgid "Received illegal xattr named %s on file \"%s\"\n" -msgstr "Flujo xattr ilegal, no hay XATTR_MAGIC en el archivo \"%s\"\n" +#~ msgid "Unable to open xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "No se puede abrir xattr %s en el archivo \"%s\": ERR=%s\n" -#: src/filed/xattr.c:993 src/filed/xattr.c:1003 -#, fuzzy, c-format -msgid "attr_set error on file \"%s\": ERR=%s\n" -msgstr "error de acl_set en el archivo \"%s\": ERR=%s\n" +#~ msgid "Unable to chdir to xattr space %s on file \"%s\": ERR=%s\n" +#~ msgstr "" +#~ "No se puede chdir a xattr espacio de %s en el archivo \"%s\": ERR=%s\n" -#: src/filed/xattr.c:1153 src/filed/xattr.c:1188 -#, c-format -msgid "llistxattr error on file \"%s\": ERR=%s\n" -msgstr "error de llistxattr en el archivo \"%s\": ERR=%s\n" +#~ msgid "Unable to mkfifo xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "No se puede mkfifo xattr %s en el archivo \"%s\": ERR=%s\n" -#: src/filed/xattr.c:1256 src/filed/xattr.c:1308 -#, c-format -msgid "lgetxattr error on file \"%s\": ERR=%s\n" -msgstr "error de lgetxattr en el archivo \"%s\": ERR=%s\n" +#~ msgid "Unable to mknod xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "No se puede mknode xattr %s en el archivo \"%s\": ERR=%s\n" -#: src/filed/xattr.c:1427 -#, c-format -msgid "lsetxattr error on file \"%s\": ERR=%s\n" -msgstr "error de lsetxattr en el archivo \"%s\": ERR=%s\n" +#~ msgid "Unable to mkdir xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "No se puede mkdir xattr %s en el archivo \"%s\": ERR=%s\n" -#: src/filed/xattr.c:1585 src/filed/xattr.c:1620 -#, c-format -msgid "extattr_list_link error on file \"%s\": ERR=%s\n" -msgstr "error de extattr_list_link en el archivo \"%s\": ERR=%s\n" +#~ msgid "Unable to link xattr %s to %s on file \"%s\": ERR=%s\n" +#~ msgstr "No se puede link xattr %s para %s en el archivo \"%s\": ERR=%s\n" -#: src/filed/xattr.c:1640 -#, c-format -msgid "Failed to convert %d into namespace on file \"%s\"\n" -msgstr "No se pudo convertir %d al namespace en el archivo \"%s\"\n" +#~ msgid "" +#~ "Unable to restore data of xattr %s on file \"%s\": Not all data available " +#~ "in xattr stream\n" +#~ msgstr "" +#~ "No se puede restaurar los datos de xattr %s en el archivo \"%s\": No " +#~ "todos los datos disponibles en flujo xattr\n" -#: src/filed/xattr.c:1720 src/filed/xattr.c:1775 -#, c-format -msgid "extattr_get_link error on file \"%s\": ERR=%s\n" -msgstr "error de extattr_get_link en el archivo \"%s\": ERR=%s\n" +#~ msgid "Unable to restore data of xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "" +#~ "No se puede restaurar los datos de xattr %s en el archivo \"%s\": ERR=%s\n" -#: src/filed/xattr.c:1899 -#, c-format -msgid "Failed to split %s into namespace and name part on file \"%s\"\n" -msgstr "" -"No se ha podido separar %s en el namespace y parte del nombre en el archivo " -"\"%s\"\n" +#~ msgid "Unable to symlink xattr %s to %s on file \"%s\": ERR=%s\n" +#~ msgstr "No se puede symlink xattr %s para %s en el archivo \"%s\": ERR=%s\n" -#: src/filed/xattr.c:1912 -#, c-format -msgid "Failed to convert %s into namespace on file \"%s\"\n" -msgstr "No se pudo convertir %s al namespace en el archivo \"%s\"\n" +#~ msgid "Unable to restore owner of xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "" +#~ "No es posible restablecer el propietario de xattr %s en el archivo \"%s" +#~ "\": ERR=%s\n" -#: src/filed/xattr.c:1933 -#, c-format -msgid "extattr_set_link error on file \"%s\": ERR=%s\n" -msgstr "error de extattr_set_link en el archivo \"%s\": ERR=%s\n" +#~ msgid "Unable to restore filetimes of xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "" +#~ "No es posible restablecer filetimes de xattr %s en el archivo \"%s\": ERR=" +#~ "%s\n" -#: src/filed/xattr.c:2036 src/filed/xattr.c:2061 -#, fuzzy, c-format -msgid "getproplist error on file \"%s\": ERR=%s\n" -msgstr "error de getacl en el archivo \"%s\": ERR=%s\n" +#~ msgid "Illegal xattr stream, failed to parse xattr stream on file \"%s\"\n" +#~ msgstr "" +#~ "Ilegal flujo xattr, fallo al analizar flujo xattr en el archivo \"%s\"\n" -#: src/filed/xattr.c:2255 -#, fuzzy, c-format -msgid "Unable create proper proplist to restore xattrs on file \"%s\"\n" -msgstr "No es posible leer el contenido de xattr %s en el archivo \"%s\"\n" +#~ msgid "Failed to restore extensible attributes on file \"%s\"\n" +#~ msgstr "Fallo al restablecer atributos extensible en el archivo \"%s\"\n" -#: src/filed/xattr.c:2284 -#, fuzzy, c-format -msgid "setproplist error on file \"%s\": ERR=%s\n" -msgstr "strtoacl error en el archivo \"%s\": ERR=%s\n" +#~ msgid "Failed to restore extended attributes on file \"%s\"\n" +#~ msgstr "Fallo al restablecer atributos extendidos en el archivo \"%s\"\n" -#: src/filed/xattr.c:2602 src/filed/xattr.c:2655 -#, c-format -msgid "Unable to get acl on xattr %s on file \"%s\": ERR=%s\n" -msgstr "No se puede obtener acl en xattr %s en el archivo \"%s\": ERR=%s\n" +#~ msgid "" +#~ "Can't restore Extended Attributes of %s - incompatible xattr stream " +#~ "encountered - %d\n" +#~ msgstr "" +#~ "No se puede restaurar los atributos extendidos de %s - incompatible flujo " +#~ "xattr encontrado - %d\n" -#: src/filed/xattr.c:2672 -#, c-format -msgid "Unable to get acl text on xattr %s on file \"%s\": ERR=%s\n" -msgstr "" -"No se puede obtener acl texto en xattr %s en el archivo \"%s\": ERR=%s\n" +#~ msgid "Unable to set file owner %s: ERR=%s\n" +#~ msgstr "No se pudo establecer propietario del archivo %s: ERR=%s\n" -#: src/filed/xattr.c:2746 -#, c-format -msgid "Unable to get status on xattr %s on file \"%s\": ERR=%s\n" -msgstr "No se puede obtener estado en xattr %s en el archivo \"%s\": ERR=%s\n" +#~ msgid "Unable to set file modes %s: ERR=%s\n" +#~ msgstr "No se pudo establecer modos del archivo %s: ERR=%s\n" -#: src/filed/xattr.c:2879 -#, c-format -msgid "Unable to open xattr %s on \"%s\": ERR=%s\n" -msgstr "No se puede abrir xattr %s en \"%s\": ERR=%s\n" +#~ msgid "Unable to set file times %s: ERR=%s\n" +#~ msgstr "No se pudo establecer tiempos del archivo %s: ERR=%s\n" -#: src/filed/xattr.c:2902 -#, c-format -msgid "Unable to read symlin %s on \"%s\": ERR=%s\n" -msgstr "No se puede leer symlin %s en \"%s\": ERR=%s\n" +#~ msgid "" +#~ "File size of restored file %s not correct. Original %s, restored %s.\n" +#~ msgstr "" +#~ "Tamaño del archivo %s restaurado no es correcto. Original %s, restaurado " +#~ "%s.\n" -#: src/filed/xattr.c:2977 -#, c-format -msgid "Unable to read content of xattr %s on file \"%s\"\n" -msgstr "No es posible leer el contenido de xattr %s en el archivo \"%s\"\n" +#~ msgid "Unable to set file flags %s: ERR=%s\n" +#~ msgstr "No es posible establecer banderas en archivo %s: ERR=%s\n" -#: src/filed/xattr.c:3017 -#, c-format -msgid "Unable to chdir to xattr space of file \"%s\": ERR=%s\n" -msgstr "No se puede chdir a xattr espacio de archivo \"%s\": ERR=%s\n" +#~ msgid "Error in %s file %s: ERR=%s\n" +#~ msgstr "Error en %s archivo %s: ERR=%s\n" -#: src/filed/xattr.c:3074 src/filed/xattr.c:3323 -#, c-format -msgid "Unable to open file \"%s\": ERR=%s\n" -msgstr "No se puede abrir el archivo \"%s\": ERR=%s\n" +#~ msgid "Error in %s: ERR=%s\n" +#~ msgstr "Error en %s: ERR=%s\n" -#: src/filed/xattr.c:3102 src/filed/xattr.c:3384 -#, c-format -msgid "Unable to open xattr space %s on file \"%s\": ERR=%s\n" -msgstr "No se puede abrir espacio xattr %s en el archivo \"%s\": ERR=%s\n" +#~ msgid "Unix attributes" +#~ msgstr "Atributos Unix" -#: src/filed/xattr.c:3118 src/filed/xattr.c:3348 -#, c-format -msgid "Unable to chdir to xattr space on file \"%s\": ERR=%s\n" -msgstr "No se puede chdir a xattr espacio en el archivo \"%s\": ERR=%s\n" +#~ msgid "File data" +#~ msgstr "Archivo de datos" -#: src/filed/xattr.c:3139 -#, c-format -msgid "Unable to list the xattr space on file \"%s\": ERR=%s\n" -msgstr "No se puede listar el xattr espacio en el archivo \"%s\": ERR=%s\n" +#~ msgid "MD5 digest" +#~ msgstr "Sumario MD5" -#: src/filed/xattr.c:3231 -#, c-format -msgid "Unable to convert acl from text on file \"%s\"\n" -msgstr "No se puede convertir acl de texto en el archivo \"%s\"\n" +#~ msgid "GZIP data" +#~ msgstr "GZIP datos" -#: src/filed/xattr.c:3241 src/filed/xattr.c:3264 -#, c-format -msgid "Unable to restore acl of xattr %s on file \"%s\": ERR=%s\n" -msgstr "No se puede restablecer acl de xattr %s en el archivo \"%s\": ERR=%s\n" +#, fuzzy +#~ msgid "Compressed data" +#~ msgstr "Datos dispersos" -#: src/filed/xattr.c:3337 -#, c-format -msgid "Unable to open xattr space on file \"%s\": ERR=%s\n" -msgstr "No se puede abrir xattr espacio en el archivo \"%s\": ERR=%s\n" +#~ msgid "Extended attributes" +#~ msgstr "Atributos extendidos" -#: src/filed/xattr.c:3367 src/filed/xattr.c:3529 -#, c-format -msgid "Unable to open xattr %s on file \"%s\": ERR=%s\n" -msgstr "No se puede abrir xattr %s en el archivo \"%s\": ERR=%s\n" +#~ msgid "Sparse data" +#~ msgstr "Datos dispersos" -#: src/filed/xattr.c:3401 -#, c-format -msgid "Unable to chdir to xattr space %s on file \"%s\": ERR=%s\n" -msgstr "No se puede chdir a xattr espacio de %s en el archivo \"%s\": ERR=%s\n" +#~ msgid "GZIP sparse data" +#~ msgstr "Datos GZIP dispersos" -#: src/filed/xattr.c:3441 -#, c-format -msgid "Unable to mkfifo xattr %s on file \"%s\": ERR=%s\n" -msgstr "No se puede mkfifo xattr %s en el archivo \"%s\": ERR=%s\n" +#, fuzzy +#~ msgid "Compressed sparse data" +#~ msgstr "Datos GZIP dispersos" -#: src/filed/xattr.c:3459 -#, c-format -msgid "Unable to mknod xattr %s on file \"%s\": ERR=%s\n" -msgstr "No se puede mknode xattr %s en el archivo \"%s\": ERR=%s\n" +#~ msgid "Program names" +#~ msgstr "Programa de nombres" -#: src/filed/xattr.c:3477 -#, c-format -msgid "Unable to mkdir xattr %s on file \"%s\": ERR=%s\n" -msgstr "No se puede mkdir xattr %s en el archivo \"%s\": ERR=%s\n" +#~ msgid "Program data" +#~ msgstr "Datos de programa" -#: src/filed/xattr.c:3497 -#, c-format -msgid "Unable to link xattr %s to %s on file \"%s\": ERR=%s\n" -msgstr "No se puede link xattr %s para %s en el archivo \"%s\": ERR=%s\n" +#~ msgid "SHA1 digest" +#~ msgstr "Sumario SHA1" -#: src/filed/xattr.c:3550 -#, c-format -msgid "" -"Unable to restore data of xattr %s on file \"%s\": Not all data available in " -"xattr stream\n" -msgstr "" -"No se puede restaurar los datos de xattr %s en el archivo \"%s\": No todos " -"los datos disponibles en flujo xattr\n" +#~ msgid "Win32 data" +#~ msgstr "Win32 datos" -#: src/filed/xattr.c:3563 -#, c-format -msgid "Unable to restore data of xattr %s on file \"%s\": ERR=%s\n" -msgstr "" -"No se puede restaurar los datos de xattr %s en el archivo \"%s\": ERR=%s\n" +#~ msgid "Win32 GZIP data" +#~ msgstr "Win32 GZIP datos" -#: src/filed/xattr.c:3586 -#, c-format -msgid "Unable to symlink xattr %s to %s on file \"%s\": ERR=%s\n" -msgstr "No se puede symlink xattr %s para %s en el archivo \"%s\": ERR=%s\n" +#, fuzzy +#~ msgid "Win32 compressed data" +#~ msgstr "Win32 datos" -#: src/filed/xattr.c:3622 -#, c-format -msgid "Unable to restore owner of xattr %s on file \"%s\": ERR=%s\n" -msgstr "" -"No es posible restablecer el propietario de xattr %s en el archivo \"%s\": " -"ERR=%s\n" +#~ msgid "MacOS Fork data" +#~ msgstr "Datos rama MacOS" -#: src/filed/xattr.c:3650 -#, c-format -msgid "Unable to restore filetimes of xattr %s on file \"%s\": ERR=%s\n" -msgstr "" -"No es posible restablecer filetimes de xattr %s en el archivo \"%s\": ERR=" -"%s\n" +#~ msgid "HFS+ attribs" +#~ msgstr "HFS+ attribs" -#: src/filed/xattr.c:3666 -#, c-format -msgid "Illegal xattr stream, failed to parse xattr stream on file \"%s\"\n" -msgstr "" -"Ilegal flujo xattr, fallo al analizar flujo xattr en el archivo \"%s\"\n" +#~ msgid "Standard Unix ACL attribs" +#~ msgstr "ACL estándar de Unix attribs" -#: src/filed/xattr.c:3727 -#, c-format -msgid "Failed to restore extensible attributes on file \"%s\"\n" -msgstr "Fallo al restablecer atributos extensible en el archivo \"%s\"\n" +#~ msgid "Default Unix ACL attribs" +#~ msgstr "ACL por defecto de Unix attribs" -#: src/filed/xattr.c:3740 -#, c-format -msgid "Failed to restore extended attributes on file \"%s\"\n" -msgstr "Fallo al restablecer atributos extendidos en el archivo \"%s\"\n" +#~ msgid "SHA256 digest" +#~ msgstr "Sumario SHA256" -#: src/filed/xattr.c:3909 -#, c-format -msgid "" -"Can't restore Extended Attributes of %s - incompatible xattr stream " -"encountered - %d\n" -msgstr "" -"No se puede restaurar los atributos extendidos de %s - incompatible flujo " -"xattr encontrado - %d\n" +#~ msgid "SHA512 digest" +#~ msgstr "Sumario SAH512" -#: src/findlib/attribs.c:94 src/findlib/attribs.c:131 -#: src/findlib/attribs.c:613 -#, c-format -msgid "Unable to set file owner %s: ERR=%s\n" -msgstr "No se pudo establecer propietario del archivo %s: ERR=%s\n" +#~ msgid "Signed digest" +#~ msgstr "Sumario Firmado" -#: src/findlib/attribs.c:105 src/findlib/attribs.c:137 -#, c-format -msgid "Unable to set file modes %s: ERR=%s\n" -msgstr "No se pudo establecer modos del archivo %s: ERR=%s\n" +#~ msgid "Encrypted File data" +#~ msgstr "Cifrado de Archivo de datos" -#: src/findlib/attribs.c:124 src/findlib/attribs.c:149 -#, c-format -msgid "Unable to set file times %s: ERR=%s\n" -msgstr "No se pudo establecer tiempos del archivo %s: ERR=%s\n" +#~ msgid "Encrypted Win32 data" +#~ msgstr "Cifrado de datos Win32" -#: src/findlib/attribs.c:590 -#, c-format -msgid "File size of restored file %s not correct. Original %s, restored %s.\n" -msgstr "" -"Tamaño del archivo %s restaurado no es correcto. Original %s, restaurado " -"%s.\n" +#~ msgid "Encrypted session data" +#~ msgstr "Cifrado de datos de sesiones " -#: src/findlib/attribs.c:633 -#, c-format -msgid "Unable to set file flags %s: ERR=%s\n" -msgstr "No es posible establecer banderas en archivo %s: ERR=%s\n" +#~ msgid "Encrypted GZIP data" +#~ msgstr "Cifrado de datos GZIP" -#: src/findlib/attribs.c:920 -#, c-format -msgid "Error in %s file %s: ERR=%s\n" -msgstr "Error en %s archivo %s: ERR=%s\n" +#, fuzzy +#~ msgid "Encrypted compressed data" +#~ msgstr "Cifrado de datos de sesiones " -#: src/findlib/attribs.c:942 -#, c-format -msgid "Error in %s: ERR=%s\n" -msgstr "Error en %s: ERR=%s\n" +#~ msgid "Encrypted Win32 GZIP data" +#~ msgstr "Cifrado de datos Win32 GZIP" -#: src/findlib/bfile.c:86 -msgid "Unix attributes" -msgstr "Atributos Unix" +#, fuzzy +#~ msgid "Encrypted Win32 Compressed data" +#~ msgstr "Cifrado de datos Win32" -#: src/findlib/bfile.c:88 -msgid "File data" -msgstr "Archivo de datos" +#~ msgid "Encrypted MacOS fork data" +#~ msgstr "Datos encriptados rama MacOS" -#: src/findlib/bfile.c:90 -msgid "MD5 digest" -msgstr "Sumario MD5" +#, fuzzy +#~ msgid "Plugin Data" +#~ msgstr "Opciones de Plug-in" -#: src/findlib/bfile.c:92 -msgid "GZIP data" -msgstr "GZIP datos" +#, fuzzy +#~ msgid "Restore Object" +#~ msgstr "Restauración OK" -#: src/findlib/bfile.c:94 #, fuzzy -msgid "Compressed data" -msgstr "Datos dispersos" +#~ msgid "AIX ACL attribs" +#~ msgstr "Atributos ACL específicos de AIX" -#: src/findlib/bfile.c:96 -msgid "Extended attributes" -msgstr "Atributos extendidos" +#, fuzzy +#~ msgid "Darwin ACL attribs" +#~ msgstr "Atributos ACL específicos de Darwin" -#: src/findlib/bfile.c:98 -msgid "Sparse data" -msgstr "Datos dispersos" +#, fuzzy +#~ msgid "FreeBSD Default ACL attribs" +#~ msgstr "Atributos ACL por defecto específicos de FreeBSD" -#: src/findlib/bfile.c:100 -msgid "GZIP sparse data" -msgstr "Datos GZIP dispersos" - -#: src/findlib/bfile.c:102 #, fuzzy -msgid "Compressed sparse data" -msgstr "Datos GZIP dispersos" - -#: src/findlib/bfile.c:104 -msgid "Program names" -msgstr "Programa de nombres" - -#: src/findlib/bfile.c:106 -msgid "Program data" -msgstr "Datos de programa" - -#: src/findlib/bfile.c:108 -msgid "SHA1 digest" -msgstr "Sumario SHA1" +#~ msgid "FreeBSD Access ACL attribs" +#~ msgstr "Atributos ACL de acceso específicos de FreeBSD" -#: src/findlib/bfile.c:110 -msgid "Win32 data" -msgstr "Win32 datos" - -#: src/findlib/bfile.c:112 -msgid "Win32 GZIP data" -msgstr "Win32 GZIP datos" - -#: src/findlib/bfile.c:114 #, fuzzy -msgid "Win32 compressed data" -msgstr "Win32 datos" - -#: src/findlib/bfile.c:116 -msgid "MacOS Fork data" -msgstr "Datos rama MacOS" - -#: src/findlib/bfile.c:118 -msgid "HFS+ attribs" -msgstr "HFS+ attribs" +#~ msgid "HPUX ACL attribs" +#~ msgstr "Atributos ACL específicos de HPUX" -#: src/findlib/bfile.c:120 -msgid "Standard Unix ACL attribs" -msgstr "ACL estándar de Unix attribs" +#, fuzzy +#~ msgid "Irix Default ACL attribs" +#~ msgstr "Atributos ACL por defecto específicos de Irix" -#: src/findlib/bfile.c:122 -msgid "Default Unix ACL attribs" -msgstr "ACL por defecto de Unix attribs" +#, fuzzy +#~ msgid "Irix Access ACL attribs" +#~ msgstr "Atributos ACL de acceso específicos de Irix" -#: src/findlib/bfile.c:124 -msgid "SHA256 digest" -msgstr "Sumario SHA256" +#, fuzzy +#~ msgid "Linux Default ACL attribs" +#~ msgstr "Atributos ACL por defecto específicos de Linux" -#: src/findlib/bfile.c:126 -msgid "SHA512 digest" -msgstr "Sumario SAH512" +#, fuzzy +#~ msgid "Linux Access ACL attribs" +#~ msgstr "Atributos ACL de acceso específicos de Linux" -#: src/findlib/bfile.c:128 -msgid "Signed digest" -msgstr "Sumario Firmado" +#, fuzzy +#~ msgid "TRU64 Default ACL attribs" +#~ msgstr "Atributos ACL por defecto específicos de Irix" -#: src/findlib/bfile.c:130 -msgid "Encrypted File data" -msgstr "Cifrado de Archivo de datos" +#, fuzzy +#~ msgid "TRU64 Access ACL attribs" +#~ msgstr "Atributos ACL de acceso específicos de Irix" -#: src/findlib/bfile.c:132 -msgid "Encrypted Win32 data" -msgstr "Cifrado de datos Win32" +#, fuzzy +#~ msgid "Solaris POSIX ACL attribs" +#~ msgstr "Atributos ACL específicos de Solaris" -#: src/findlib/bfile.c:134 -msgid "Encrypted session data" -msgstr "Cifrado de datos de sesiones " +#, fuzzy +#~ msgid "Solaris NFSv4/ZFS ACL attribs" +#~ msgstr "Atributos ACL específicos de Solaris" -#: src/findlib/bfile.c:136 -msgid "Encrypted GZIP data" -msgstr "Cifrado de datos GZIP" +#, fuzzy +#~ msgid "AFS ACL attribs" +#~ msgstr "Atributos ACL específicos de AIX" -#: src/findlib/bfile.c:138 #, fuzzy -msgid "Encrypted compressed data" -msgstr "Cifrado de datos de sesiones " +#~ msgid "AIX POSIX ACL attribs" +#~ msgstr "Atributos ACL específicos de AIX" -#: src/findlib/bfile.c:140 -msgid "Encrypted Win32 GZIP data" -msgstr "Cifrado de datos Win32 GZIP" +#, fuzzy +#~ msgid "AIX NFSv4 ACL attribs" +#~ msgstr "Atributos ACL específicos de AIX" -#: src/findlib/bfile.c:142 #, fuzzy -msgid "Encrypted Win32 Compressed data" -msgstr "Cifrado de datos Win32" +#~ msgid "FreeBSD NFSv4/ZFS ACL attribs" +#~ msgstr "Atributos ACL de acceso específicos de FreeBSD" -#: src/findlib/bfile.c:144 -msgid "Encrypted MacOS fork data" -msgstr "Datos encriptados rama MacOS" +#, fuzzy +#~ msgid "GNU Hurd Default ACL attribs" +#~ msgstr "Atributos ACL por defecto específicos de Irix" -#: src/findlib/bfile.c:146 -msgid "Plugin Name" -msgstr "" +#, fuzzy +#~ msgid "GNU Hurd Access ACL attribs" +#~ msgstr "Atributos ACL de acceso específicos de Irix" -#: src/findlib/bfile.c:148 #, fuzzy -msgid "Plugin Data" -msgstr "Opciones de Plug-in" +#~ msgid "GNU Hurd Extended attribs" +#~ msgstr "Atributos Extendidos Específicos de Linux" -#: src/findlib/bfile.c:150 #, fuzzy -msgid "Restore Object" -msgstr "Restauración OK" +#~ msgid "IRIX Extended attribs" +#~ msgstr "Atributos Extendidos Específicos de Linux" -#: src/findlib/bfile.c:152 #, fuzzy -msgid "AIX ACL attribs" -msgstr "Atributos ACL específicos de AIX" +#~ msgid "TRU64 Extended attribs" +#~ msgstr "Atributos Extendidos Específicos de Linux" -#: src/findlib/bfile.c:154 #, fuzzy -msgid "Darwin ACL attribs" -msgstr "Atributos ACL específicos de Darwin" +#~ msgid "AIX Extended attribs" +#~ msgstr "Atributos extendidos" -#: src/findlib/bfile.c:156 #, fuzzy -msgid "FreeBSD Default ACL attribs" -msgstr "Atributos ACL por defecto específicos de FreeBSD" +#~ msgid "OpenBSD Extended attribs" +#~ msgstr "Atributos Extendidos específicos de OpenBSD" -#: src/findlib/bfile.c:158 #, fuzzy -msgid "FreeBSD Access ACL attribs" -msgstr "Atributos ACL de acceso específicos de FreeBSD" +#~ msgid "Solaris Extensible attribs or System Extended attribs" +#~ msgstr "" +#~ "Atributos extensible específicos de Solaris o atributos de Sistema de " +#~ "Extensión" -#: src/findlib/bfile.c:160 #, fuzzy -msgid "HPUX ACL attribs" -msgstr "Atributos ACL específicos de HPUX" +#~ msgid "Solaris Extended attribs" +#~ msgstr "Atributos Extendidos Específicos de Solaris" -#: src/findlib/bfile.c:162 #, fuzzy -msgid "Irix Default ACL attribs" -msgstr "Atributos ACL por defecto específicos de Irix" +#~ msgid "Darwin Extended attribs" +#~ msgstr "Atributos Extendidos Específicos de Darwin" -#: src/findlib/bfile.c:164 #, fuzzy -msgid "Irix Access ACL attribs" -msgstr "Atributos ACL de acceso específicos de Irix" +#~ msgid "FreeBSD Extended attribs" +#~ msgstr "Atributos Extendidos Específicos de FreeBSD" -#: src/findlib/bfile.c:166 #, fuzzy -msgid "Linux Default ACL attribs" -msgstr "Atributos ACL por defecto específicos de Linux" +#~ msgid "Linux Extended attribs" +#~ msgstr "Atributos Extendidos Específicos de Linux" -#: src/findlib/bfile.c:168 #, fuzzy -msgid "Linux Access ACL attribs" -msgstr "Atributos ACL de acceso específicos de Linux" +#~ msgid "NetBSD Extended attribs" +#~ msgstr "Atributos Extendidos Específicos de NetBSD" + +#~ msgid "File skipped. Not newer: %s\n" +#~ msgstr "Archivo omitido. No más reciente: %s\n" + +#~ msgid "File skipped. Not older: %s\n" +#~ msgstr "Archivo omitido. No más viejo: %s\n" + +#~ msgid "File skipped. Already exists: %s\n" +#~ msgstr "Archivo omitido. Ya existe: %s\n" + +#~ msgid "File %s already exists and could not be replaced. ERR=%s.\n" +#~ msgstr "El archivo %s ya existe y no puede ser reemplazado. ERR=%s.\n" + +#~ msgid "bpkt already open fid=%d\n" +#~ msgstr "bpkt ya abierto fid=%d\n" + +#~ msgid "Cannot make fifo %s: ERR=%s\n" +#~ msgstr "No puede crear fifo %s: ERR=%s\n" + +#~ msgid "Cannot make node %s: ERR=%s\n" +#~ msgstr "No puede crear nodo %s: ERR=%s\n" + +#~ msgid "Could not symlink %s -> %s: ERR=%s\n" +#~ msgstr "No se pudo crear enlace simbólico %s -> %s: ERR=%s\n" + +#~ msgid "Could not restore file flags for file %s: ERR=%s\n" +#~ msgstr "" +#~ "No se pudo restaurar el archivo de banderas para el archivo% s: ERR=%s\n" + +#~ msgid "Could not hard link %s -> %s: ERR=%s\n" +#~ msgstr "No se pudo crear enlace duro %s -> %s: ERR=%s\n" + +#~ msgid "Could not reset file flags for file %s: ERR=%s\n" +#~ msgstr "" +#~ "No se pudo restablecer el archivo de banderas para el archivo %s: ERR=%s\n" + +#~ msgid "Original file %s have been deleted: type=%d\n" +#~ msgstr "Archivo %s original se han eliminado: tipo=%d\n" + +#~ msgid "Original file %s not saved: type=%d\n" +#~ msgstr "Archivo original %s no guardado: tipo=%d\n" + +#~ msgid "Unknown file type %d; not restored: %s\n" +#~ msgstr "Tipo de archivo desconocido %d; no restaurado: %s\n" + +#~ msgid "Zero length filename: %s\n" +#~ msgstr "Nombre de archivo con longitud cero: %s\n" + +#~ msgid "AdjustTokenPrivileges set " +#~ msgstr "Establecer AdjustTokenPrivileges " -#: src/findlib/bfile.c:170 #, fuzzy -msgid "TRU64 Default ACL attribs" -msgstr "Atributos ACL por defecto específicos de Irix" +#~ msgid "Plugin: \"%s\" not found.\n" +#~ msgstr "Plugin=%s no encontrado.\n" + +#~ msgid " NODUMP flag set - will not process %s\n" +#~ msgstr "Indicador NODUMP establecido - no procesará %s\n" + +#~ msgid "Cannot stat file %s: ERR=%s\n" +#~ msgstr "No puede stat archivo %s: ERR=%s\n" + +#~ msgid "%s mtime changed during backup.\n" +#~ msgstr "%s mtime cambiado durante la copia de seguridad.\n" + +#~ msgid "%s ctime changed during backup.\n" +#~ msgstr "%s ctime cambiado durante la copia de seguridad.\n" -#: src/findlib/bfile.c:172 #, fuzzy -msgid "TRU64 Access ACL attribs" -msgstr "Atributos ACL de acceso específicos de Irix" +#~ msgid "%s size of %lld changed during backup to %lld.n" +#~ msgstr "%s tamaño cambiado durante la copia de seguridad.\n" + +#~ msgid "Top level directory \"%s\" has unlisted fstype \"%s\"\n" +#~ msgstr "" +#~ "Directorio de nivel superior \"%s\" tiene fstype \"%s\" no listado\n" + +#~ msgid "Top level directory \"%s\" has an unlisted drive type \"%s\"\n" +#~ msgstr "" +#~ "Directorio de nivel superior \"%s\" tiene un tipo de unidad \"%s\" no " +#~ "listado\n" + +#~ msgid "Cannot create directory %s: ERR=%s\n" +#~ msgstr "No se puede crear directorio %s: ERR=%s\n" + +#~ msgid "%s exists but is not a directory.\n" +#~ msgstr "%s existe pero no es un directorio.\n" + +#~ msgid "Cannot change owner and/or group of %s: ERR=%s\n" +#~ msgstr "No se puede cambiar el propietario y/o grupo de %s: ERR=%s\n" + +#~ msgid "Cannot change permissions of %s: ERR=%s\n" +#~ msgstr "No puede cambiar los permisos de %s: ERR=%s\n" + +#~ msgid "%c: is not a valid drive.\n" +#~ msgstr "%c: no es una unidad válida.\n" + +#~ msgid "Too many subdirectories. Some permissions not reset.\n" +#~ msgstr "Demasiados subdirectorios. Algunos permisos no se restablece.\n" + +#~ msgid "Cannot open current directory: ERR=%s\n" +#~ msgstr "No se puede abrir el directorio actual: ERR=%s\n" + +#~ msgid "Cannot get current directory: ERR=%s\n" +#~ msgstr "No se puede obtener el directorio actual: ERR=%s\n" + +#~ msgid "Cannot reset current directory: ERR=%s\n" +#~ msgstr "No se puede restablecer el directorio actual: ERR=%s\n" + +#~ msgid "Only ipv4 and ipv6 are supported (%d)\n" +#~ msgstr "Solo ipv4 y ipv6 estan soportado (%d)\n" + +#~ msgid "Only ipv4 is supported (%d)\n" +#~ msgstr "Solo ipv4 esta soportado (%d)\n" -#: src/findlib/bfile.c:174 #, fuzzy -msgid "Solaris POSIX ACL attribs" -msgstr "Atributos ACL específicos de Solaris" +#~ msgid "You tried to assign a ipv6 address to an ipv4(%d)\n" +#~ msgstr "Se trató de asignar una dirección IPv4 a IPv6(%d)\n" -#: src/findlib/bfile.c:176 #, fuzzy -msgid "Solaris NFSv4/ZFS ACL attribs" -msgstr "Atributos ACL específicos de Solaris" +#~ msgid "You tried to assign an ipv4 address to an ipv6(%d)\n" +#~ msgstr "Se trató de asignar una dirección IPv4 a IPv6(%d)\n" -#: src/findlib/bfile.c:178 #, fuzzy -msgid "AFS ACL attribs" -msgstr "Atributos ACL específicos de AIX" +#~ msgid "Can't add default IPv4 address (%s)\n" +#~ msgstr "No se puede agregar dirección por defecto (%s)\n" -#: src/findlib/bfile.c:180 #, fuzzy -msgid "AIX POSIX ACL attribs" -msgstr "Atributos ACL específicos de AIX" +#~ msgid "" +#~ "Old style addresses cannot be mixed with new style. Try removing Port=nnn." +#~ msgstr "" +#~ "el viejo estilo de las direcciones no se pueden mezclar con el nuevo " +#~ "estilo" -#: src/findlib/bfile.c:182 #, fuzzy -msgid "AIX NFSv4 ACL attribs" -msgstr "Atributos ACL específicos de AIX" +#~ msgid "Cannot resolve service(%s)" +#~ msgstr "no se puede resolver el servicio(%s)" -#: src/findlib/bfile.c:184 #, fuzzy -msgid "FreeBSD NFSv4/ZFS ACL attribs" -msgstr "Atributos ACL de acceso específicos de FreeBSD" +#~ msgid "Cannot resolve hostname(%s) %s" +#~ msgstr "no se puede resolver el hostname(%s) %s" -#: src/findlib/bfile.c:186 #, fuzzy -msgid "GNU Hurd Default ACL attribs" -msgstr "Atributos ACL por defecto específicos de Irix" +#~ msgid "Expected a block to begin with { but got: %s" +#~ msgstr "Esperaba un inicio de bloque {, obtuvo: %s" + +#~ msgid "Empty addr block is not allowed" +#~ msgstr "Bloque de direcciones vacío no está permitido" -#: src/findlib/bfile.c:188 #, fuzzy -msgid "GNU Hurd Access ACL attribs" -msgstr "Atributos ACL de acceso específicos de Irix" +#~ msgid "Expected a string but got: %s" +#~ msgstr "Esperaba una cadena, obtuvo: %s" -#: src/findlib/bfile.c:190 #, fuzzy -msgid "GNU Hurd Extended attribs" -msgstr "Atributos Extendidos Específicos de Linux" +#~ msgid "Expected a string [ip|ipv4|ipv6] but got: %s" +#~ msgstr "Espera una cadena [ip|ipv4|ipv6], obtuvo: %s" -#: src/findlib/bfile.c:192 #, fuzzy -msgid "IRIX Extended attribs" -msgstr "Atributos Extendidos Específicos de Linux" +#~ msgid "Expected a string [ip|ipv4] but got: %s" +#~ msgstr "Espera una cadena [ip|ipv4], obtuvo: %s" -#: src/findlib/bfile.c:194 #, fuzzy -msgid "TRU64 Extended attribs" -msgstr "Atributos Extendidos Específicos de Linux" +#~ msgid "Expected an equal = but got: %s" +#~ msgstr "Esperaba una igual =, obtuvo: %s" -#: src/findlib/bfile.c:196 #, fuzzy -msgid "AIX Extended attribs" -msgstr "Atributos extendidos" +#~ msgid "Expected an identifier [addr|port] but got: %s" +#~ msgstr "Esperaba un identificador [addr|port], obtuvo: %s" + +#~ msgid "Only one port per address block" +#~ msgstr "Sólo un puerto por bloque de direcciones" + +#~ msgid "Only one addr per address block" +#~ msgstr "Sólo una dirección por bloque de direcciones" -#: src/findlib/bfile.c:198 #, fuzzy -msgid "OpenBSD Extended attribs" -msgstr "Atributos Extendidos específicos de OpenBSD" +#~ msgid "Expected a identifier [addr|port] but got: %s" +#~ msgstr "Esperaba un identificador [addr|port], obtuvo: %s" + +#~ msgid "Expected a equal =, got: %s" +#~ msgstr "Esperaba una igual =, obtuvo: %s" -#: src/findlib/bfile.c:200 #, fuzzy -msgid "Solaris Extensible attribs or System Extended attribs" -msgstr "" -"Atributos extensible específicos de Solaris o atributos de Sistema de " -"Extensión" +#~ msgid "Expected a number or a string but got: %s" +#~ msgstr "Esperaba un numero o una cadena , obtuvo: %s" -#: src/findlib/bfile.c:202 #, fuzzy -msgid "Solaris Extended attribs" -msgstr "Atributos Extendidos Específicos de Solaris" +#~ msgid "Expected an IP number or a hostname but got: %s" +#~ msgstr "Esperaba un numero IP o un hostname, obtuvo: %s" + +#~ msgid "State machine missmatch" +#~ msgstr "Estado de la máquina desajustado" -#: src/findlib/bfile.c:204 #, fuzzy -msgid "Darwin Extended attribs" -msgstr "Atributos Extendidos Específicos de Darwin" +#~ msgid "Expected a end of block with } but got: %s" +#~ msgstr "Esperaba un fin de bloque }, obtuvo: %s" -#: src/findlib/bfile.c:206 #, fuzzy -msgid "FreeBSD Extended attribs" -msgstr "Atributos Extendidos Específicos de FreeBSD" +#~ msgid "Cannot add hostname(%s) and port(%s) to addrlist (%s)" +#~ msgstr "" +#~ "No se puede agregar el nombre de maquina(%s) y puerto(%s) a addrlist(%s)" -#: src/findlib/bfile.c:208 #, fuzzy -msgid "Linux Extended attribs" -msgstr "Atributos Extendidos Específicos de Linux" +#~ msgid "Expected an end of block with } but got: %s" +#~ msgstr "Esperaba un fin de bloque }, obtuvo: %s" + +#~ msgid "Expected an IP number or a hostname, got: %s" +#~ msgstr "Esperaba un numero IP o un hostname, obtuvo: %s" -#: src/findlib/bfile.c:210 #, fuzzy -msgid "NetBSD Extended attribs" -msgstr "Atributos Extendidos Específicos de NetBSD" +#~ msgid "Cannot add port (%s) to (%s)" +#~ msgstr "no puede agregar el puerto (%s) a (%s)" -#: src/findlib/create_file.c:118 -#, c-format -msgid "File skipped. Not newer: %s\n" -msgstr "Archivo omitido. No más reciente: %s\n" +#~ msgid "Expected a port number or string, got: %s" +#~ msgstr "Esperaba un numero de puerto o cadena, obtuvo: %s" -#: src/findlib/create_file.c:125 -#, c-format -msgid "File skipped. Not older: %s\n" -msgstr "Archivo omitido. No más viejo: %s\n" +#~ msgid "Error scanning attributes: %s\n" +#~ msgstr "Error escaneando atributos: %s\n" -#: src/findlib/create_file.c:135 -#, c-format -msgid "File skipped. Already exists: %s\n" -msgstr "Archivo omitido. Ya existe: %s\n" +#~ msgid "Child exited normally." +#~ msgstr "Hijo salió normalmente." -#: src/findlib/create_file.c:161 -#, c-format -msgid "File %s already exists and could not be replaced. ERR=%s.\n" -msgstr "El archivo %s ya existe y no puede ser reemplazado. ERR=%s.\n" +#~ msgid "Unknown error during program execvp" +#~ msgstr "Error desconocido durante el programa execvp" -#: src/findlib/create_file.c:212 src/findlib/create_file.c:276 -#: src/findlib/create_file.c:371 -#, c-format -msgid "bpkt already open fid=%d\n" -msgstr "bpkt ya abierto fid=%d\n" +#~ msgid "Child exited with code %d" +#~ msgstr "Hijo salió con el código %d" -#: src/findlib/create_file.c:235 -#, c-format -msgid "Cannot make fifo %s: ERR=%s\n" -msgstr "No puede crear fifo %s: ERR=%s\n" +#~ msgid "Child died from signal %d: %s" +#~ msgstr "Niño muerto con la señal %d: %s" -#: src/findlib/create_file.c:253 -#, c-format -msgid "Cannot make node %s: ERR=%s\n" -msgstr "No puede crear nodo %s: ERR=%s\n" +#~ msgid "Invalid errno. No error message possible." +#~ msgstr "Invalido errorno. Imposible mensaje de error." -#: src/findlib/create_file.c:299 -#, c-format -msgid "Could not symlink %s -> %s: ERR=%s\n" -msgstr "No se pudo crear enlace simbólico %s -> %s: ERR=%s\n" +#~ msgid "Status OK\n" +#~ msgstr "Estado OK\n" -#: src/findlib/create_file.c:322 src/findlib/create_file.c:335 -#, c-format -msgid "Could not restore file flags for file %s: ERR=%s\n" -msgstr "" -"No se pudo restaurar el archivo de banderas para el archivo% s: ERR=%s\n" +#~ msgid "bget_msg: unknown signal %d\n" +#~ msgstr "bget_msg: señal desconocida %d\n" -#: src/findlib/create_file.c:326 src/findlib/create_file.c:343 -#, c-format -msgid "Could not hard link %s -> %s: ERR=%s\n" -msgstr "No se pudo crear enlace duro %s -> %s: ERR=%s\n" +#, fuzzy +#~ msgid "Attr spool write error. wrote=%d wanted=%d bytes. ERR=%s\n" +#~ msgstr "Error de escritura en cola de atributo. ERR=%s\n" -#: src/findlib/create_file.c:339 -#, c-format -msgid "Could not reset file flags for file %s: ERR=%s\n" -msgstr "" -"No se pudo restablecer el archivo de banderas para el archivo %s: ERR=%s\n" +#~ msgid "TLS connection initialization failed.\n" +#~ msgstr "Ha fallado la conexión de inicialización TLS.\n" -#: src/findlib/create_file.c:395 -#, c-format -msgid "Original file %s have been deleted: type=%d\n" -msgstr "Archivo %s original se han eliminado: tipo=%d\n" +#~ msgid "TLS Negotiation failed.\n" +#~ msgstr "Negociación TLS fallida.\n" -#: src/findlib/create_file.c:407 -#, c-format -msgid "Original file %s not saved: type=%d\n" -msgstr "Archivo original %s no guardado: tipo=%d\n" +#~ msgid "" +#~ "TLS certificate verification failed. Peer certificate did not match a " +#~ "required commonName\n" +#~ msgstr "" +#~ "Comprobación de certificados TLS fallido. Certificado equivalente no " +#~ "corresponde con el commonName requerido\n" -#: src/findlib/create_file.c:410 -#, c-format -msgid "Unknown file type %d; not restored: %s\n" -msgstr "Tipo de archivo desconocido %d; no restaurado: %s\n" +#~ msgid "" +#~ "TLS host certificate verification failed. Host name \"%s\" did not match " +#~ "presented certificate\n" +#~ msgstr "" +#~ "Fallo en verificación en certificado TLS de la maquina. Nombre de la " +#~ "maquina \"%s\" no coincide con el certificado presentado\n" -#: src/findlib/create_file.c:455 -#, c-format -msgid "Zero length filename: %s\n" -msgstr "Nombre de archivo con longitud cero: %s\n" +#~ msgid "TLS enabled but not configured.\n" +#~ msgstr "TLS activado, pero no configurado.\n" -#: src/findlib/enable_priv.c:81 -msgid "AdjustTokenPrivileges set " -msgstr "Establecer AdjustTokenPrivileges " +#~ msgid "TLS enable but not configured.\n" +#~ msgstr "TLS permitido, pero no configurado.\n" -#: src/findlib/find.c:185 -#, fuzzy, c-format -msgid "Plugin: \"%s\" not found.\n" -msgstr "Plugin=%s no encontrado.\n" +#~ msgid "No problem." +#~ msgstr "No hay problema." -#: src/findlib/find_one.c:223 -#, c-format -msgid " NODUMP flag set - will not process %s\n" -msgstr "Indicador NODUMP establecido - no procesará %s\n" +#~ msgid "Authoritative answer for host not found." +#~ msgstr "Respuesta autoritativa para el host no encontrado." -#: src/findlib/find_one.c:244 -#, c-format -msgid "Cannot stat file %s: ERR=%s\n" -msgstr "No puede stat archivo %s: ERR=%s\n" +#~ msgid "Non-authoritative for host not found, or ServerFail." +#~ msgstr "Non-autoritativa para la maquina no encontrada, o ServerFail." -#: src/findlib/find_one.c:249 -#, c-format -msgid "%s mtime changed during backup.\n" -msgstr "%s mtime cambiado durante la copia de seguridad.\n" +#~ msgid "Non-recoverable errors, FORMERR, REFUSED, or NOTIMP." +#~ msgstr "Errores no recuperables, FORMERR, RECHAZADO o NOTIMP." -#: src/findlib/find_one.c:256 -#, c-format -msgid "%s ctime changed during backup.\n" -msgstr "%s ctime cambiado durante la copia de seguridad.\n" +#~ msgid "Valid name, no data record of resquested type." +#~ msgstr "Nombre válido, ningún registro de datos del tipo solicitado." -#: src/findlib/find_one.c:263 -#, fuzzy, c-format -msgid "%s size of %lld changed during backup to %lld.n" -msgstr "%s tamaño cambiado durante la copia de seguridad.\n" +#~ msgid "Unknown error." +#~ msgstr "Error desconocido." -#: src/findlib/find_one.c:391 -#, c-format -msgid "Top level directory \"%s\" has unlisted fstype \"%s\"\n" -msgstr "Directorio de nivel superior \"%s\" tiene fstype \"%s\" no listado\n" +#~ msgid "Unknown sig %d" +#~ msgstr "Sig desconocido %d" -#: src/findlib/find_one.c:406 -#, c-format -msgid "Top level directory \"%s\" has an unlisted drive type \"%s\"\n" -msgstr "" -"Directorio de nivel superior \"%s\" tiene un tipo de unidad \"%s\" no " -"listado\n" +#~ msgid "Cannot open stream socket. ERR=%s. Current %s All %s\n" +#~ msgstr "No se puede abrir el socket de flujo. ERR=%s. Actual %s Todos %s\n" -#: src/findlib/mkpath.c:137 src/stored/dedupengine.c:250 -#, c-format -msgid "Cannot create directory %s: ERR=%s\n" -msgstr "No se puede crear directorio %s: ERR=%s\n" +#~ msgid "Cannot set SO_REUSEADDR on socket: %s\n" +#~ msgstr "No se puede establecer SO_REUSEADDR en el socket: %s\n" -#: src/findlib/mkpath.c:141 src/findlib/mkpath.c:217 -#: src/stored/dedupengine.c:254 -#, c-format -msgid "%s exists but is not a directory.\n" -msgstr "%s existe pero no es un directorio.\n" +#~ msgid "Cannot bind port %d: ERR=%s: Retrying ...\n" +#~ msgstr "No se puede enlazar a puerto %d: ERR=%s: Reintentando ...\n" -#: src/findlib/mkpath.c:153 -#, c-format -msgid "Security problem!! We created directory %s, but it is a link.\n" -msgstr "" +#~ msgid "Cannot bind port %d: ERR=%s.\n" +#~ msgstr "No se puede enlazar a puerto %d: ERR=%s.\n" -#: src/findlib/mkpath.c:179 -#, c-format -msgid "Cannot change owner and/or group of %s: ERR=%s\n" -msgstr "No se puede cambiar el propietario y/o grupo de %s: ERR=%s\n" +#, fuzzy +#~ msgid "No addr/port found to listen on.\n" +#~ msgstr "Ninguno %s encontrado para %s.\n" -#: src/findlib/mkpath.c:184 -#, c-format -msgid "Cannot change permissions of %s: ERR=%s\n" -msgstr "No puede cambiar los permisos de %s: ERR=%s\n" +#~ msgid "Could not init client queue: ERR=%s\n" +#~ msgstr "No se pudo iniciar cola cliente: ERR=%s\n" -#: src/findlib/mkpath.c:254 -#, c-format -msgid "%c: is not a valid drive.\n" -msgstr "%c: no es una unidad válida.\n" +#~ msgid "Error in select: %s\n" +#~ msgstr "Error al seleccionar: %s\n" -#: src/findlib/mkpath.c:298 -msgid "Too many subdirectories. Some permissions not reset.\n" -msgstr "Demasiados subdirectorios. Algunos permisos no se restablece.\n" +#~ msgid "Connection from %s:%d refused by hosts.access\n" +#~ msgstr "Conexión desde %s:%d rechazada por hosts.access\n" -#: src/findlib/savecwd.c:49 -#, c-format -msgid "Cannot open current directory: ERR=%s\n" -msgstr "No se puede abrir el directorio actual: ERR=%s\n" +#~ msgid "Cannot set SO_KEEPALIVE on socket: %s\n" +#~ msgstr "No se puede establecer SO_KEEPALIVE en el socket: %s\n" -#: src/findlib/savecwd.c:60 -#, c-format -msgid "Cannot get current directory: ERR=%s\n" -msgstr "No se puede obtener el directorio actual: ERR=%s\n" +#~ msgid "Could not create client BSOCK.\n" +#~ msgstr "No es posible crear cliente BSOCK. \n" -#: src/findlib/savecwd.c:84 src/findlib/savecwd.c:95 -#, c-format -msgid "Cannot reset current directory: ERR=%s\n" -msgstr "No se puede restablecer el directorio actual: ERR=%s\n" +#~ msgid "Could not add job to client queue: ERR=%s\n" +#~ msgstr "No se pudo agregar job a la cola de cliente: ERR=%s\n" -#: src/lib/address_conf.c:51 -#, c-format -msgid "Only ipv4 and ipv6 are supported (%d)\n" -msgstr "Solo ipv4 y ipv6 estan soportado (%d)\n" +#~ msgid "Could not destroy client queue: ERR=%s\n" +#~ msgstr "No es posible destruir la cola de cliente: ERR=%s\n" -#: src/lib/address_conf.c:55 -#, c-format -msgid "Only ipv4 is supported (%d)\n" -msgstr "Solo ipv4 esta soportado (%d)\n" +#~ msgid "Program killed by Bacula (timeout)\n" +#~ msgstr "Programa finalizado(killed) por Bacula (timeout) \n" -#: src/lib/address_conf.c:178 -#, fuzzy, c-format -msgid "You tried to assign a ipv6 address to an ipv4(%d)\n" -msgstr "Se trató de asignar una dirección IPv4 a IPv6(%d)\n" +#~ msgid "" +#~ "Could not connect to %s on %s:%d. ERR=%s\n" +#~ "Retrying ...\n" +#~ msgstr "" +#~ "No se pudo conectar a %s en %s:%d. ERR=%s\n" +#~ "Reintentando ...\n" -#: src/lib/address_conf.c:187 -#, fuzzy, c-format -msgid "You tried to assign an ipv4 address to an ipv6(%d)\n" -msgstr "Se trató de asignar una dirección IPv4 a IPv6(%d)\n" +#~ msgid "Unable to connect to %s on %s:%d. ERR=%s\n" +#~ msgstr "No se puede conectar a %s en %s:%d. ERR=%s\n" -#: src/lib/address_conf.c:270 -#, fuzzy, c-format -msgid "Can't add default IPv4 address (%s)\n" -msgstr "No se puede agregar dirección por defecto (%s)\n" +#~ msgid "gethostbyname() for host \"%s\" failed: ERR=%s\n" +#~ msgstr "fallo gethostbyname() para la maquina \"%s\": ERR=%s\n" -#: src/lib/address_conf.c:301 -#, fuzzy -msgid "" -"Old style addresses cannot be mixed with new style. Try removing Port=nnn." -msgstr "" -"el viejo estilo de las direcciones no se pueden mezclar con el nuevo estilo" +#~ msgid "Socket open error. proto=%d port=%d. ERR=%s\n" +#~ msgstr "Error al abrir socket. proto=%d puerto=%d. ERR=%s\n" -#: src/lib/address_conf.c:323 -#, fuzzy, c-format -msgid "Cannot resolve service(%s)" -msgstr "no se puede resolver el servicio(%s)" +#~ msgid "Source address bind error. proto=%d. ERR=%s\n" +#~ msgstr "Error al enlazar dirección de origen. proto=%d. ERR=%s\n" -#: src/lib/address_conf.c:333 -#, fuzzy, c-format -msgid "Cannot resolve hostname(%s) %s" -msgstr "no se puede resolver el hostname(%s) %s" +#, fuzzy +#~ msgid "Cannot set TCP_KEEPIDLE on socket: %s\n" +#~ msgstr "No se puede establecer SO_KEEPIDLE en el socket: %s\n" -#: src/lib/address_conf.c:441 src/lib/address_conf.c:474 -#, fuzzy, c-format -msgid "Expected a block to begin with { but got: %s" -msgstr "Esperaba un inicio de bloque {, obtuvo: %s" +#, fuzzy +#~ msgid "Could not init bsock read mutex. ERR=%s\n" +#~ msgstr "No se pudo iniciar bsock mutex. ERR=%s\n" -#: src/lib/address_conf.c:446 -msgid "Empty addr block is not allowed" -msgstr "Bloque de direcciones vacío no está permitido" +#, fuzzy +#~ msgid "Could not init bsock write mutex. ERR=%s\n" +#~ msgstr "No se pudo iniciar bsock mutex. ERR=%s\n" -#: src/lib/address_conf.c:450 -#, fuzzy, c-format -msgid "Expected a string but got: %s" -msgstr "Esperaba una cadena, obtuvo: %s" +#, fuzzy +#~ msgid "Socket is closed\n" +#~ msgstr "SDSocket cerrado.\n" -#: src/lib/address_conf.c:461 -#, fuzzy, c-format -msgid "Expected a string [ip|ipv4|ipv6] but got: %s" -msgstr "Espera una cadena [ip|ipv4|ipv6], obtuvo: %s" +#~ msgid "Write error sending %d bytes to %s:%s:%d: ERR=%s\n" +#~ msgstr "Error de escritura enviando %d bytes para %s:%s:%d: ERR=%s\n" -#: src/lib/address_conf.c:465 -#, fuzzy, c-format -msgid "Expected a string [ip|ipv4] but got: %s" -msgstr "Espera una cadena [ip|ipv4], obtuvo: %s" +#~ msgid "Wrote %d bytes to %s:%s:%d, but only %d accepted.\n" +#~ msgstr "Escribió %d bytes para %s:%s:%d, pero solo %d aceptado.\n" -#: src/lib/address_conf.c:470 -#, fuzzy, c-format -msgid "Expected an equal = but got: %s" -msgstr "Esperaba una igual =, obtuvo: %s" +#~ msgid "Read expected %d got %d from %s:%s:%d\n" +#~ msgstr "Esperaba leer %d obtuvo %d desde %s:%s:%d\n" -#: src/lib/address_conf.c:481 -#, fuzzy, c-format -msgid "Expected an identifier [addr|port] but got: %s" -msgstr "Esperaba un identificador [addr|port], obtuvo: %s" +#, fuzzy +#~ msgid "Packet size=%d too big from \"%s:%s:%d. Terminating connection.\n" +#~ msgstr "" +#~ "Tamaño de paquete muy grande de \"%s:%s:%d. Conexión de terminación.\n" -#: src/lib/address_conf.c:486 -msgid "Only one port per address block" -msgstr "Sólo un puerto por bloque de direcciones" +#~ msgid "Read error from %s:%s:%d: ERR=%s\n" +#~ msgstr "Error de lectura desde %s:%s:%d: ERR=%s\n" -#: src/lib/address_conf.c:492 -msgid "Only one addr per address block" -msgstr "Sólo una dirección por bloque de direcciones" +#, fuzzy +#~ msgid "fread attr spool error. Wanted=%d got=%d bytes. ERR=%s\n" +#~ msgstr "Error fread attr spool. ERR=%s\n" -#: src/lib/address_conf.c:496 -#, fuzzy, c-format -msgid "Expected a identifier [addr|port] but got: %s" -msgstr "Esperaba un identificador [addr|port], obtuvo: %s" +#~ msgid "fread attr spool I/O error.\n" +#~ msgstr "Error fread attr spool I/O.\n" -#: src/lib/address_conf.c:500 -#, c-format -msgid "Expected a equal =, got: %s" -msgstr "Esperaba una igual =, obtuvo: %s" +#~ msgid "Could not malloc BSOCK data buffer\n" +#~ msgstr "No se pudo malloc datos BSOCK buffer.\n" -#: src/lib/address_conf.c:508 -#, fuzzy, c-format -msgid "Expected a number or a string but got: %s" -msgstr "Esperaba un numero o una cadena , obtuvo: %s" +#~ msgid "sockopt error: %s\n" +#~ msgstr "error de sockopt: %s\n" -#: src/lib/address_conf.c:514 -#, fuzzy, c-format -msgid "Expected an IP number or a hostname but got: %s" -msgstr "Esperaba un numero IP o un hostname, obtuvo: %s" +#~ msgid "Warning network buffer = %d bytes not max size.\n" +#~ msgstr "Alerta, búfer de red=%d bytes no tamaño máximo.\n" -#: src/lib/address_conf.c:520 -msgid "State machine missmatch" -msgstr "Estado de la máquina desajustado" +#~ msgid "fcntl F_GETFL error. ERR=%s\n" +#~ msgstr "error F_GETFL fcntl. ERR=%s\n" -#: src/lib/address_conf.c:526 -#, fuzzy, c-format -msgid "Expected a end of block with } but got: %s" -msgstr "Esperaba un fin de bloque }, obtuvo: %s" +#~ msgid "fcntl F_SETFL error. ERR=%s\n" +#~ msgstr "error F_SETFL fcntl. ERR=%s\n" -#: src/lib/address_conf.c:532 -#, fuzzy, c-format -msgid "Cannot add hostname(%s) and port(%s) to addrlist (%s)" -msgstr "" -"No se puede agregar el nombre de maquina(%s) y puerto(%s) a addrlist(%s)" +#, fuzzy +#~ msgid "Director authorization error at \"%s:%d\"\n" +#~ msgstr "Problema de autorización de Director en \"%s:%d\"\n" -#: src/lib/address_conf.c:538 -#, fuzzy, c-format -msgid "Expected an end of block with } but got: %s" -msgstr "Esperaba un fin de bloque }, obtuvo: %s" +#, fuzzy +#~ msgid "" +#~ "Authorization error: Remote server at \"%s:%d\" did not advertise " +#~ "required TLS support.\n" +#~ msgstr "" +#~ "Problema de autorización: El servidor remoto en \"%s:%d\" no anuncio " +#~ "soporte TLS requiere.\n" -#: src/lib/address_conf.c:547 -#, c-format -msgid "Expected an IP number or a hostname, got: %s" -msgstr "Esperaba un numero IP o un hostname, obtuvo: %s" +#, fuzzy +#~ msgid "" +#~ "Authorization error with Director at \"%s:%d\": Remote server requires " +#~ "TLS.\n" +#~ msgstr "" +#~ "Problema de autorización con el Director en \"%s:%d\": El servidor remoto " +#~ "requiere TLS.\n" -#: src/lib/address_conf.c:552 src/lib/address_conf.c:566 -#, fuzzy, c-format -msgid "Cannot add port (%s) to (%s)" -msgstr "no puede agregar el puerto (%s) a (%s)" +#, fuzzy +#~ msgid "" +#~ "Bad errmsg to Hello command: ERR=%s\n" +#~ "The Director at \"%s:%d\" may not be running.\n" +#~ msgstr "" +#~ "Mala respuesta al comando Hello: ERR=%s\n" +#~ "El director en \"%s:%d\" probablemente no esta corriendo.\n" -#: src/lib/address_conf.c:561 -#, c-format -msgid "Expected a port number or string, got: %s" -msgstr "Esperaba un numero de puerto o cadena, obtuvo: %s" +#, fuzzy +#~ msgid "" +#~ "Authorization error with Director at \"%s:%d\"\n" +#~ "Most likely the passwords do not agree.\n" +#~ "If you are using TLS, there may have been a certificate validation error " +#~ "during the TLS handshake.\n" +#~ "For help, please see: " +#~ msgstr "" +#~ "Problema de autorización con el Director en \"%s:%d\"\n" +#~ "Lo mas probable es que las contraseñas no están de acuerdo.\n" +#~ "Si está usando TLS, puede haber habido un error de validación de " +#~ "certificados durante la negociación TLS.\n" +#~ " Por favor vea http://www.bacula.org/en/rel-manual/" +#~ "Bacula_Freque_Asked_Questi.html#SECTION003760000000000000000 para ayuda.\n" -#: src/lib/attr.c:70 -#, c-format -msgid "Error scanning attributes: %s\n" -msgstr "Error escaneando atributos: %s\n" +#, fuzzy +#~ msgid "safe_unlink could not compile regex pattern \"%s\" ERR=%s\n" +#~ msgstr "No se ha podido compilar patrón regex \"%s\" ERR=%s\n" -#: src/lib/berrno.c:52 -msgid "Child exited normally." -msgstr "Hijo salió normalmente." +#~ msgid "Out of memory: ERR=%s\n" +#~ msgstr "Fuera de memoria: ERR=%s\n" -#: src/lib/berrno.c:59 -msgid "Unknown error during program execvp" -msgstr "Error desconocido durante el programa execvp" +#~ msgid "Buffer overflow.\n" +#~ msgstr "Desbordamiento de búfer.\n" -#: src/lib/berrno.c:62 -#, c-format -msgid "Child exited with code %d" -msgstr "Hijo salió con el código %d" +#~ msgid "Bad errno" +#~ msgstr "Malo errno" -#: src/lib/berrno.c:70 -#, c-format -msgid "Child died from signal %d: %s" -msgstr "Niño muerto con la señal %d: %s" +#~ msgid "Memset for %d bytes at %s:%d\n" +#~ msgstr "Memset para %d bytes en %s:%d\n" -#: src/lib/berrno.c:76 -msgid "Invalid errno. No error message possible." -msgstr "Invalido errorno. Imposible mensaje de error." +#, fuzzy +#~ msgid "Cannot open %s file. %s ERR=%s\n" +#~ msgstr "No se puede abrir el archivo pid. %s ERR=%s\n" -#: src/lib/bget_msg.c:90 -msgid "Status OK\n" -msgstr "Estado OK\n" +#~ msgid "" +#~ "%s is already running. pid=%d\n" +#~ "Check file %s\n" +#~ msgstr "" +#~ "%s ya está en ejecución. pid=%d\n" +#~ "Compruebe el archivo %s\n" -#: src/lib/bget_msg.c:94 -#, c-format -msgid "bget_msg: unknown signal %d\n" -msgstr "bget_msg: señal desconocida %d\n" +#, fuzzy +#~ msgid "Could not open %s file. %s ERR=%s\n" +#~ msgstr "No se pudo abrir el archivo pid. %s ERR=%s\n" -#: src/lib/bnet.c:130 -#, fuzzy, c-format -msgid "Attr spool write error. wrote=%d wanted=%d bytes. ERR=%s\n" -msgstr "Error de escritura en cola de atributo. ERR=%s\n" +#, fuzzy +#~ msgid "Cannot lock %s file. %s ERR=%s\n" +#~ msgstr "No se puede abrir el archivo pid. %s ERR=%s\n" -#: src/lib/bnet.c:215 src/lib/bnet.c:256 -msgid "TLS connection initialization failed.\n" -msgstr "Ha fallado la conexión de inicialización TLS.\n" +#, fuzzy +#~ msgid "Cannot not open %s file. %s ERR=%s\n" +#~ msgstr "No se puede abrir el archivo pid. %s ERR=%s\n" -#: src/lib/bnet.c:223 -msgid "TLS Negotiation failed.\n" -msgstr "Negociación TLS fallida.\n" +#~ msgid "Could not create state file. %s ERR=%s\n" +#~ msgstr "No es posible crear el archivo de estado. %s ERR=%s\n" -#: src/lib/bnet.c:229 src/lib/bnet.c:271 -msgid "" -"TLS certificate verification failed. Peer certificate did not match a " -"required commonName\n" -msgstr "" -"Comprobación de certificados TLS fallido. Certificado equivalente no " -"corresponde con el commonName requerido\n" +#~ msgid "Write final hdr error: ERR=%s\n" +#~ msgstr "Error de escritura HDR final: ERR=%s\n" -#: src/lib/bnet.c:280 -#, c-format -msgid "" -"TLS host certificate verification failed. Host name \"%s\" did not match " -"presented certificate\n" -msgstr "" -"Fallo en verificación en certificado TLS de la maquina. Nombre de la maquina " -"\"%s\" no coincide con el certificado presentado\n" +#~ msgid "stop_btimer called with NULL btimer_id\n" +#~ msgstr "stop_btimer llamado con NULL btimer_id\n" -#: src/lib/bnet.c:297 -msgid "TLS enabled but not configured.\n" -msgstr "TLS activado, pero no configurado.\n" +#~ msgid "1999 Authorization failed.\n" +#~ msgstr "1999 Fallo de Autorización.\n" -#: src/lib/bnet.c:303 -msgid "TLS enable but not configured.\n" -msgstr "TLS permitido, pero no configurado.\n" +#~ msgid "Unable to open certificate file" +#~ msgstr "No se puede abrir el archivo de certificado" -#: src/lib/bnet.c:400 -msgid "No problem." -msgstr "No hay problema." +#~ msgid "Unable to read certificate from file" +#~ msgstr "No es posible leer el archivo de certificado" -#: src/lib/bnet.c:403 -msgid "Authoritative answer for host not found." -msgstr "Respuesta autoritativa para el host no encontrado." +#~ msgid "Unable to extract public key from certificate" +#~ msgstr "No se puede extraer la clave pública del certificado" -#: src/lib/bnet.c:406 -msgid "Non-authoritative for host not found, or ServerFail." -msgstr "Non-autoritativa para la maquina no encontrada, o ServerFail." +#~ msgid "" +#~ "Provided certificate does not include the required subjectKeyIdentifier " +#~ "extension." +#~ msgstr "" +#~ "Certificado suministrado no incluye la extensión subjectKeyIdentifier " +#~ "necesaria." -#: src/lib/bnet.c:409 -msgid "Non-recoverable errors, FORMERR, REFUSED, or NOTIMP." -msgstr "Errores no recuperables, FORMERR, RECHAZADO o NOTIMP." +#~ msgid "Unsupported key type provided: %d\n" +#~ msgstr "Tipo de clave prevista no soportada: %d\n" -#: src/lib/bnet.c:412 -msgid "Valid name, no data record of resquested type." -msgstr "Nombre válido, ningún registro de datos del tipo solicitado." +#~ msgid "Unable to open private key file" +#~ msgstr "No se puede abrir archivo de clave privada" -#: src/lib/bnet.c:415 -msgid "Unknown error." -msgstr "Error desconocido." +#~ msgid "Unable to read private key from file" +#~ msgstr "No se puede leer la clave privada del archivo" -#: src/lib/bnet.c:557 -#, c-format -msgid "Unknown sig %d" -msgstr "Sig desconocido %d" +#~ msgid "Unsupported digest type: %d\n" +#~ msgstr "Tipo Digest no soportado: %d\n" -#: src/lib/bnet_server.c:99 -#, c-format -msgid "Cannot open stream socket. ERR=%s. Current %s All %s\n" -msgstr "No se puede abrir el socket de flujo. ERR=%s. Actual %s Todos %s\n" +#~ msgid "OpenSSL digest initialization failed" +#~ msgstr "Fallo al inicializar resume OpenSSL" -#: src/lib/bnet_server.c:112 -#, c-format -msgid "Cannot set SO_REUSEADDR on socket: %s\n" -msgstr "No se puede establecer SO_REUSEADDR en el socket: %s\n" +#~ msgid "OpenSSL digest update failed" +#~ msgstr "Fallo al actualizar resume OpenSSL" -#: src/lib/bnet_server.c:121 -#, c-format -msgid "Cannot bind port %d: ERR=%s: Retrying ...\n" -msgstr "No se puede enlazar a puerto %d: ERR=%s: Reintentando ...\n" +#~ msgid "OpenSSL digest finalize failed" +#~ msgstr "Fallo al finalizar resume OpenSSL" -#: src/lib/bnet_server.c:129 src/lib/bnet_server.c:137 -#, c-format -msgid "Cannot bind port %d: ERR=%s.\n" -msgstr "No se puede enlazar a puerto %d: ERR=%s.\n" +#~ msgid "OpenSSL digest_new failed" +#~ msgstr "fallo digest_new OpenSSL" -#: src/lib/bnet_server.c:144 -#, fuzzy -msgid "No addr/port found to listen on.\n" -msgstr "Ninguno %s encontrado para %s.\n" +#~ msgid "OpenSSL sign get digest failed" +#~ msgstr "Fallo OpenSSL al obtener firma digest " -#: src/lib/bnet_server.c:150 -#, c-format -msgid "Could not init client queue: ERR=%s\n" -msgstr "No se pudo iniciar cola cliente: ERR=%s\n" +#~ msgid "OpenSSL digest Verify final failed" +#~ msgstr "Fallo OpenSSL Verificación final digest " -#: src/lib/bnet_server.c:169 -#, c-format -msgid "Error in select: %s\n" -msgstr "Error al seleccionar: %s\n" +#~ msgid "No signers found for crypto verify.\n" +#~ msgstr "Firmantes no encontrados para verificar el cifrado.\n" -#: src/lib/bnet_server.c:192 -#, c-format -msgid "Connection from %s:%d refused by hosts.access\n" -msgstr "Conexión desde %s:%d rechazada por hosts.access\n" +#~ msgid "Signature creation failed" +#~ msgstr "Fallo en creación de firma" -#: src/lib/bnet_server.c:208 src/lib/bsock.c:363 src/lib/bsock.c:402 -#, c-format -msgid "Cannot set SO_KEEPALIVE on socket: %s\n" -msgstr "No se puede establecer SO_KEEPALIVE en el socket: %s\n" +#~ msgid "Signature decoding failed" +#~ msgstr "Fallo en decodificación de firma" -#: src/lib/bnet_server.c:220 -msgid "Could not create client BSOCK.\n" -msgstr "No es posible crear cliente BSOCK. \n" +#~ msgid "Unsupported cipher type specified\n" +#~ msgstr "Tipo de cifrado especificados no soportado\n" -#: src/lib/bnet_server.c:227 -#, c-format -msgid "Could not add job to client queue: ERR=%s\n" -msgstr "No se pudo agregar job a la cola de cliente: ERR=%s\n" +#~ msgid "CryptoData decoding failed" +#~ msgstr "decodificación CryptoData fallida" -#: src/lib/bnet_server.c:244 -#, c-format -msgid "Could not destroy client queue: ERR=%s\n" -msgstr "No es posible destruir la cola de cliente: ERR=%s\n" +#~ msgid "Failure decrypting the session key" +#~ msgstr "Error al descifrar la clave de sesión" -#: src/lib/bpipe.c:373 src/lib/bpipe.c:456 -msgid "Program killed by Bacula (timeout)\n" -msgstr "Programa finalizado(killed) por Bacula (timeout) \n" +#~ msgid "Unsupported contentEncryptionAlgorithm: %d\n" +#~ msgstr "ContentEncryptionAlgorithm no soportado: %d\n" -#: src/lib/bsock.c:221 -#, c-format -msgid "" -"Could not connect to %s on %s:%d. ERR=%s\n" -"Retrying ...\n" -msgstr "" -"No se pudo conectar a %s en %s:%d. ERR=%s\n" -"Reintentando ...\n" +#~ msgid "OpenSSL cipher context initialization failed" +#~ msgstr "Fallo al inicializar contexto cipher OpenSSl" -#: src/lib/bsock.c:227 -#, c-format -msgid "Unable to connect to %s on %s:%d. ERR=%s\n" -msgstr "No se puede conectar a %s en %s:%d. ERR=%s\n" +#~ msgid "Encryption session provided an invalid symmetric key" +#~ msgstr "Cifrado de sesión suministro una clave simétrica inválida" -#: src/lib/bsock.c:303 -#, c-format -msgid "gethostbyname() for host \"%s\" failed: ERR=%s\n" -msgstr "fallo gethostbyname() para la maquina \"%s\": ERR=%s\n" +#~ msgid "Encryption session provided an invalid IV" +#~ msgstr "Cifrado de sesión suministro una IV inválida" -#: src/lib/bsock.c:334 src/lib/bsock.c:336 -#, c-format -msgid "Socket open error. proto=%d port=%d. ERR=%s\n" -msgstr "Error al abrir socket. proto=%d puerto=%d. ERR=%s\n" +#~ msgid "OpenSSL cipher context key/IV initialization failed" +#~ msgstr "Fallido inicialización de contexto OpenSSL de cifrado de clave/IV " -#: src/lib/bsock.c:349 src/lib/bsock.c:351 -#, c-format -msgid "Source address bind error. proto=%d. ERR=%s\n" -msgstr "Error al enlazar dirección de origen. proto=%d. ERR=%s\n" +#~ msgid "Unsupported digest type=%d specified\n" +#~ msgstr "Incompatible resume tipo=%d especificado\n" -#: src/lib/bsock.c:371 -#, fuzzy, c-format -msgid "Cannot set TCP_KEEPIDLE on socket: %s\n" -msgstr "No se puede establecer SO_KEEPIDLE en el socket: %s\n" +#~ msgid "SHA1Update() returned an error: %d\n" +#~ msgstr "SHA1Update() retorno un error: %d\n" -#: src/lib/bsock.c:438 -#, fuzzy, c-format -msgid "Could not init bsock read mutex. ERR=%s\n" -msgstr "No se pudo iniciar bsock mutex. ERR=%s\n" +#~ msgid "No error" +#~ msgstr "Ningún error" -#: src/lib/bsock.c:444 -#, fuzzy, c-format -msgid "Could not init bsock write mutex. ERR=%s\n" -msgstr "No se pudo iniciar bsock mutex. ERR=%s\n" +#~ msgid "Signer not found" +#~ msgstr "Firmante no encontrado" -#: src/lib/bsock.c:594 -#, fuzzy -msgid "Socket is closed\n" -msgstr "SDSocket cerrado.\n" +#~ msgid "Recipient not found" +#~ msgstr "Recipiente no encontrado" -#: src/lib/bsock.c:600 -#, c-format -msgid "Socket has errors=%d on call to %s:%s:%d\n" -msgstr "" +#~ msgid "Unsupported digest algorithm" +#~ msgstr "Algoritmo de resumen no soportado" -#: src/lib/bsock.c:607 -#, c-format -msgid "Socket is terminated=%d on call to %s:%s:%d\n" -msgstr "" +#~ msgid "Unsupported encryption algorithm" +#~ msgstr "Algoritmo de cifrado no soportado" -#: src/lib/bsock.c:616 -#, c-format -msgid "Socket has insane msglen=%d on call to %s:%s:%d\n" -msgstr "" +#~ msgid "Signature is invalid" +#~ msgstr "La firma no es válida" -#: src/lib/bsock.c:626 -#, c-format -msgid "Flowcontrol failure on %s:%s:%d\n" -msgstr "" +#~ msgid "Decryption error" +#~ msgstr "Error de Descifrado" -#: src/lib/bsock.c:711 -#, c-format -msgid "Write error sending %d bytes to %s:%s:%d: ERR=%s\n" -msgstr "Error de escritura enviando %d bytes para %s:%s:%d: ERR=%s\n" +#~ msgid "Internal error" +#~ msgstr "Error interno" -#: src/lib/bsock.c:717 -#, c-format -msgid "Wrote %d bytes to %s:%s:%d, but only %d accepted.\n" -msgstr "Escribió %d bytes para %s:%s:%d, pero solo %d aceptado.\n" +#~ msgid "Unknown error" +#~ msgstr "Error desconocido" -#: src/lib/bsock.c:818 src/lib/bsock.c:846 src/lib/bsock.c:920 -#: src/lib/bsock.c:963 -#, c-format -msgid "Read expected %d got %d from %s:%s:%d\n" -msgstr "Esperaba leer %d obtuvo %d desde %s:%s:%d\n" +#~ msgid "Cannot fork to become daemon: ERR=%s\n" +#~ msgstr "No se puede fork para convertirse en demonio: ERR =%s\n" -#: src/lib/bsock.c:879 -#, fuzzy, c-format -msgid "Packet size=%d too big from \"%s:%s:%d. Terminating connection.\n" -msgstr "Tamaño de paquete muy grande de \"%s:%s:%d. Conexión de terminación.\n" +#, fuzzy +#~ msgid "writeunlock called too many times.\n" +#~ msgstr "rwl_writeunlock llamado muchas veces.\n" -#: src/lib/bsock.c:909 -#, c-format -msgid "Read error from %s:%s:%d: ERR=%s\n" -msgstr "Error de lectura desde %s:%s:%d: ERR=%s\n" +#, fuzzy +#~ msgid "writeunlock by non-owner.\n" +#~ msgstr "rwl_writeunlock por no-propietario.\n" -#: src/lib/bsock.c:1041 -#, fuzzy, c-format -msgid "fread attr spool error. Wanted=%d got=%d bytes. ERR=%s\n" -msgstr "Error fread attr spool. ERR=%s\n" +#~ msgid "Thread %d found unchanged elements %d times\n" +#~ msgstr "Hilo %d encontró elementos sin cambios %d veces\n" -#: src/lib/bsock.c:1059 -msgid "fread attr spool I/O error.\n" -msgstr "Error fread attr spool I/O.\n" +#~ msgid "%02d: interval %d, writes %d, reads %d\n" +#~ msgstr "%02d: intervalo %d, escritos %d, leídos %d\n" -#: src/lib/bsock.c:1120 -msgid "Could not malloc BSOCK data buffer\n" -msgstr "No se pudo malloc datos BSOCK buffer.\n" +#~ msgid "data %02d: value %d, %d writes\n" +#~ msgstr "datos %02d: valor %d, %d escritos\n" -#: src/lib/bsock.c:1138 src/lib/bsock.c:1157 -#, c-format -msgid "sockopt error: %s\n" -msgstr "error de sockopt: %s\n" +#~ msgid "Total: %d thread writes, %d data writes\n" +#~ msgstr "Total: %d hilos escritos, %d datos escritos\n" -#: src/lib/bsock.c:1144 src/lib/bsock.c:1163 -#, c-format -msgid "Warning network buffer = %d bytes not max size.\n" -msgstr "Alerta, búfer de red=%d bytes no tamaño máximo.\n" +#~ msgid "Try write lock" +#~ msgstr "Intente escribir bloqueo" -#: src/lib/bsock.c:1183 src/lib/bsock.c:1217 -#, c-format -msgid "fcntl F_GETFL error. ERR=%s\n" -msgstr "error F_GETFL fcntl. ERR=%s\n" +#~ msgid "Try read lock" +#~ msgstr "Intente leer bloqueo" -#: src/lib/bsock.c:1189 src/lib/bsock.c:1223 src/lib/bsock.c:1255 -#, c-format -msgid "fcntl F_SETFL error. ERR=%s\n" -msgstr "error F_SETFL fcntl. ERR=%s\n" +#~ msgid "Create thread" +#~ msgstr "Crear hilo" -#: src/lib/bsock.c:1470 -#, fuzzy, c-format -msgid "Director authorization error at \"%s:%d\"\n" -msgstr "Problema de autorización de Director en \"%s:%d\"\n" +#~ msgid "Join thread" +#~ msgstr "Unir hilo" -#: src/lib/bsock.c:1477 -#, fuzzy, c-format -msgid "" -"Authorization error: Remote server at \"%s:%d\" did not advertise required " -"TLS support.\n" -msgstr "" -"Problema de autorización: El servidor remoto en \"%s:%d\" no anuncio soporte " -"TLS requiere.\n" +#~ msgid "%02d: interval %d, updates %d, r_collisions %d, w_collisions %d\n" +#~ msgstr "" +#~ "%02d: intervalo %d, actualizados %d, r_collisions %d, w_collisions %d\n" -#: src/lib/bsock.c:1485 -#, fuzzy, c-format -msgid "" -"Authorization error with Director at \"%s:%d\": Remote server requires TLS.\n" -msgstr "" -"Problema de autorización con el Director en \"%s:%d\": El servidor remoto " -"requiere TLS.\n" +#~ msgid "data %02d: value %d, %d updates\n" +#~ msgstr "datos %02d: valor %d, %d actualizados\n" -#: src/lib/bsock.c:1497 src/qt-console/bcomm/dircomm_auth.cpp:134 -#, c-format -msgid "TLS negotiation failed with Director at \"%s:%d\"\n" -msgstr "Fallo negociación TLS no con el Director en \"%s:%d\"\n" +#, fuzzy +#~ msgid "Empty name not allowed.\n" +#~ msgstr "Bloque de direcciones vacío no está permitido" -#: src/lib/bsock.c:1507 -#, fuzzy, c-format -msgid "" -"Bad errmsg to Hello command: ERR=%s\n" -"The Director at \"%s:%d\" may not be running.\n" -msgstr "" -"Mala respuesta al comando Hello: ERR=%s\n" -"El director en \"%s:%d\" probablemente no esta corriendo.\n" +#~ msgid "Illegal character \"%c\" in name.\n" +#~ msgstr "Carácter ilegal \"%c\" en el nombre.\n" -#: src/lib/bsock.c:1516 src/qt-console/bcomm/dircomm_auth.cpp:155 -#, c-format -msgid "Director at \"%s:%d\" rejected Hello command\n" -msgstr "Director en \"%s:%d\" rechazó comando Hello\n" +#~ msgid "Name too long.\n" +#~ msgstr "Nombre demasiado largo.\n" -#: src/lib/bsock.c:1526 -#, fuzzy, c-format -msgid "" -"Authorization error with Director at \"%s:%d\"\n" -"Most likely the passwords do not agree.\n" -"If you are using TLS, there may have been a certificate validation error " -"during the TLS handshake.\n" -"For help, please see: " -msgstr "" -"Problema de autorización con el Director en \"%s:%d\"\n" -"Lo mas probable es que las contraseñas no están de acuerdo.\n" -"Si está usando TLS, puede haber habido un error de validación de " -"certificados durante la negociación TLS.\n" -" Por favor vea http://www.bacula.org/en/rel-manual/" -"Bacula_Freque_Asked_Questi.html#SECTION003760000000000000000 para ayuda.\n" +#, fuzzy +#~ msgid "" +#~ "Config file error: %s\n" +#~ " : Line %d, col %d of file %s\n" +#~ "%s\n" +#~ msgstr "" +#~ "Error de configuración: %s\n" +#~ " : línea %d, columna %d en el archivo %s\n" +#~ "%s\n" +#~ "%s" -#: src/lib/bsys.c:142 -#, fuzzy, c-format -msgid "safe_unlink could not compile regex pattern \"%s\" ERR=%s\n" -msgstr "No se ha podido compilar patrón regex \"%s\" ERR=%s\n" +#, fuzzy +#~ msgid "Cannot open config file %s: %s\n" +#~ msgstr "No se pudo abrir archivo de configuración \"%s\": %s\n" -#: src/lib/bsys.c:342 src/lib/bsys.c:359 src/lib/bsys.c:383 src/lib/bsys.c:396 -#, c-format -msgid "Out of memory: ERR=%s\n" -msgstr "Fuera de memoria: ERR=%s\n" +#, fuzzy +#~ msgid "Cannot open lex\n" +#~ msgstr "No se pudo abrir %s\n" -#: src/lib/bsys.c:438 -msgid "Buffer overflow.\n" -msgstr "Desbordamiento de búfer.\n" +#~ msgid "Backup" +#~ msgstr "Backup" -#: src/lib/bsys.c:504 -msgid "Bad errno" -msgstr "Malo errno" +#~ msgid "Verifying" +#~ msgstr "Verificando" -#: src/lib/bsys.c:519 -#, c-format -msgid "Memset for %d bytes at %s:%d\n" -msgstr "Memset para %d bytes en %s:%d\n" +#~ msgid "Restoring" +#~ msgstr "Restaurando" -#: src/lib/bsys.c:568 -#, fuzzy, c-format -msgid "Cannot open %s file. %s ERR=%s\n" -msgstr "No se puede abrir el archivo pid. %s ERR=%s\n" +#~ msgid "Archiving" +#~ msgstr "Archivando" -#: src/lib/bsys.c:585 src/lib/bsys.c:621 -#, c-format -msgid "" -"%s is already running. pid=%d\n" -"Check file %s\n" -msgstr "" -"%s ya está en ejecución. pid=%d\n" -"Compruebe el archivo %s\n" +#~ msgid "Copying" +#~ msgstr "Copiando" -#: src/lib/bsys.c:601 -#, fuzzy, c-format -msgid "Could not open %s file. %s ERR=%s\n" -msgstr "No se pudo abrir el archivo pid. %s ERR=%s\n" +#~ msgid "Migration" +#~ msgstr "Migración" -#: src/lib/bsys.c:624 -#, fuzzy, c-format -msgid "Cannot lock %s file. %s ERR=%s\n" -msgstr "No se puede abrir el archivo pid. %s ERR=%s\n" +#~ msgid "Scanning" +#~ msgstr "Escaneando" -#: src/lib/bsys.c:637 -#, fuzzy, c-format -msgid "Cannot not open %s file. %s ERR=%s\n" -msgstr "No se puede abrir el archivo pid. %s ERR=%s\n" +#~ msgid "Unknown operation" +#~ msgstr "Operación desconocida" -#: src/lib/bsys.c:769 -#, c-format -msgid "Could not create state file. %s ERR=%s\n" -msgstr "No es posible crear el archivo de estado. %s ERR=%s\n" +#~ msgid "backup" +#~ msgstr "backup" -#: src/lib/bsys.c:788 -#, c-format -msgid "Write final hdr error: ERR=%s\n" -msgstr "Error de escritura HDR final: ERR=%s\n" +#~ msgid "verified" +#~ msgstr "verificado" -#: src/lib/btimers.c:254 -msgid "stop_btimer called with NULL btimer_id\n" -msgstr "stop_btimer llamado con NULL btimer_id\n" +#~ msgid "verify" +#~ msgstr "verificar" -#: src/lib/cram-md5.c:106 src/lib/cram-md5.c:138 -msgid "1999 Authorization failed.\n" -msgstr "1999 Fallo de Autorización.\n" +#~ msgid "restored" +#~ msgstr "restaurado" -#: src/lib/crypto.c:428 -msgid "Unable to open certificate file" -msgstr "No se puede abrir el archivo de certificado" +#~ msgid "restore" +#~ msgstr "restaurar" -#: src/lib/crypto.c:435 -msgid "Unable to read certificate from file" -msgstr "No es posible leer el archivo de certificado" +#~ msgid "archived" +#~ msgstr "archivado" -#: src/lib/crypto.c:441 -msgid "Unable to extract public key from certificate" -msgstr "No se puede extraer la clave pública del certificado" +#~ msgid "archive" +#~ msgstr "archivo" -#: src/lib/crypto.c:448 -msgid "" -"Provided certificate does not include the required subjectKeyIdentifier " -"extension." -msgstr "" -"Certificado suministrado no incluye la extensión subjectKeyIdentifier " -"necesaria." +#~ msgid "copied" +#~ msgstr "copiado" -#: src/lib/crypto.c:455 -#, c-format -msgid "Unsupported key type provided: %d\n" -msgstr "Tipo de clave prevista no soportada: %d\n" +#~ msgid "copy" +#~ msgstr "copia" -#: src/lib/crypto.c:492 src/lib/crypto.c:540 -msgid "Unable to open private key file" -msgstr "No se puede abrir archivo de clave privada" +#~ msgid "migrated" +#~ msgstr "migrado" -#: src/lib/crypto.c:522 src/lib/crypto.c:556 -msgid "Unable to read private key from file" -msgstr "No se puede leer la clave privada del archivo" +#~ msgid "migrate" +#~ msgstr "migrar" -#: src/lib/crypto.c:615 -#, c-format -msgid "Unsupported digest type: %d\n" -msgstr "Tipo Digest no soportado: %d\n" +#~ msgid "scanned" +#~ msgstr "escaneado" -#: src/lib/crypto.c:629 -msgid "OpenSSL digest initialization failed" -msgstr "Fallo al inicializar resume OpenSSL" +#~ msgid "scan" +#~ msgstr "escanear" -#: src/lib/crypto.c:643 -msgid "OpenSSL digest update failed" -msgstr "Fallo al actualizar resume OpenSSL" +#~ msgid "unknown action" +#~ msgstr "acción desconocida" -#: src/lib/crypto.c:661 -msgid "OpenSSL digest finalize failed" -msgstr "Fallo al finalizar resume OpenSSL" +#~ msgid "pthread key create failed: ERR=%s\n" +#~ msgstr "fallo crear clave pthread: ERR=%s\n" -#: src/lib/crypto.c:759 -msgid "OpenSSL digest_new failed" -msgstr "fallo digest_new OpenSSL" +#~ msgid "pthread_once failed. ERR=%s\n" +#~ msgstr "fallo pthread_once. ERR=%s\n" -#: src/lib/crypto.c:765 -msgid "OpenSSL sign get digest failed" -msgstr "Fallo OpenSSL al obtener firma digest " +#~ msgid "Could not init msg_queue mutex. ERR=%s\n" +#~ msgstr "No se pudo iniciar msg_queue mutex. ERR=%s\n" -#: src/lib/crypto.c:804 src/lib/crypto.c:808 -msgid "OpenSSL digest Verify final failed" -msgstr "Fallo OpenSSL Verificación final digest " +#~ msgid "NULL jcr.\n" +#~ msgstr "NULL jcr.\n" -#: src/lib/crypto.c:813 -msgid "No signers found for crypto verify.\n" -msgstr "Firmantes no encontrados para verificar el cifrado.\n" +#~ msgid "pthread_setspecific failed: ERR=%s\n" +#~ msgstr "fallo pthread_setspecific: ERR=%s\n" -#: src/lib/crypto.c:874 -msgid "Signature creation failed" -msgstr "Fallo en creación de firma" +#~ msgid "" +#~ "Watchdog sending kill after %d secs to thread stalled reading Storage " +#~ "daemon.\n" +#~ msgstr "" +#~ "Watchdog envío kill después de %d segundos para hilo estancado leyendo " +#~ "demonio Storage.\n" -#: src/lib/crypto.c:952 -msgid "Signature decoding failed" -msgstr "Fallo en decodificación de firma" +#~ msgid "" +#~ "Watchdog sending kill after %d secs to thread stalled reading File " +#~ "daemon.\n" +#~ msgstr "" +#~ "Watchdog envío kill después de %d segundos para hilo estancado leyendo " +#~ "demonio File.\n" -#: src/lib/crypto.c:1029 -msgid "Unsupported cipher type specified\n" -msgstr "Tipo de cifrado especificados no soportado\n" +#~ msgid "" +#~ "Watchdog sending kill after %d secs to thread stalled reading Director.\n" +#~ msgstr "" +#~ "Watchdog envío kill después de %d segundos para hilo estancado leyendo " +#~ "demonio Director.\n" -#: src/lib/crypto.c:1178 -msgid "CryptoData decoding failed" -msgstr "decodificación CryptoData fallida" +#~ msgid "Problem probably begins at line %d.\n" +#~ msgstr "Probablemente comienza el problema en la línea %d\n" -#: src/lib/crypto.c:1222 -msgid "Failure decrypting the session key" -msgstr "Error al descifrar la clave de sesión" +#~ msgid "" +#~ "Config error: %s\n" +#~ " : line %d, col %d of file %s\n" +#~ "%s\n" +#~ "%s" +#~ msgstr "" +#~ "Error de configuración: %s\n" +#~ " : línea %d, columna %d en el archivo %s\n" +#~ "%s\n" +#~ "%s" -#: src/lib/crypto.c:1273 -#, c-format -msgid "Unsupported contentEncryptionAlgorithm: %d\n" -msgstr "ContentEncryptionAlgorithm no soportado: %d\n" +#~ msgid "Config error: %s\n" +#~ msgstr "Error de configuración: %s\n" -#: src/lib/crypto.c:1283 src/lib/crypto.c:1289 -msgid "OpenSSL cipher context initialization failed" -msgstr "Fallo al inicializar contexto cipher OpenSSl" +#~ msgid "Close of NULL file\n" +#~ msgstr "Cierre de archivo NULL\n" -#: src/lib/crypto.c:1296 -msgid "Encryption session provided an invalid symmetric key" -msgstr "Cifrado de sesión suministro una clave simétrica inválida" +#~ msgid "" +#~ "get_char: called after EOF. You may have a open double quote without the " +#~ "closing double quote.\n" +#~ msgstr "" +#~ "get_char: llamado después de EOF. Usted puede tener una comilla doble " +#~ "abierta sin el cierre de comillas dobles.\n" -#: src/lib/crypto.c:1302 -msgid "Encryption session provided an invalid IV" -msgstr "Cifrado de sesión suministro una IV inválida" +#~ msgid "Config token too long, file: %s, line %d, begins at line %d\n" +#~ msgstr "" +#~ "Configuración de señal demasiado largo, archivo: %s, línea %d, se inicia " +#~ "en la línea %d\n" -#: src/lib/crypto.c:1308 -msgid "OpenSSL cipher context key/IV initialization failed" -msgstr "Fallido inicialización de contexto OpenSSL de cifrado de clave/IV " +#~ msgid "none" +#~ msgstr "ninguno" -#: src/lib/crypto.c:1407 -#, c-format -msgid "Unsupported digest type=%d specified\n" -msgstr "Incompatible resume tipo=%d especificado\n" +#~ msgid "comment" +#~ msgstr "comentario" -#: src/lib/crypto.c:1427 -#, c-format -msgid "SHA1Update() returned an error: %d\n" -msgstr "SHA1Update() retorno un error: %d\n" +#~ msgid "number" +#~ msgstr "numero" -#: src/lib/crypto.c:1566 -msgid "No error" -msgstr "Ningún error" +#~ msgid "ip_addr" +#~ msgstr "ip_addr" -#: src/lib/crypto.c:1568 -msgid "Signer not found" -msgstr "Firmante no encontrado" +#~ msgid "identifier" +#~ msgstr "identificar" -#: src/lib/crypto.c:1570 -msgid "Recipient not found" -msgstr "Recipiente no encontrado" +#~ msgid "string" +#~ msgstr "cadena" -#: src/lib/crypto.c:1572 -msgid "Unsupported digest algorithm" -msgstr "Algoritmo de resumen no soportado" +#~ msgid "quoted_string" +#~ msgstr "quoted_string" -#: src/lib/crypto.c:1574 -msgid "Unsupported encryption algorithm" -msgstr "Algoritmo de cifrado no soportado" +#~ msgid "include" +#~ msgstr "incluir" -#: src/lib/crypto.c:1576 -msgid "Signature is invalid" -msgstr "La firma no es válida" +#~ msgid "include_quoted_string" +#~ msgstr "include_quoted_string" -#: src/lib/crypto.c:1578 -msgid "Decryption error" -msgstr "Error de Descifrado" +#~ msgid "UTF-8 Byte Order Mark" +#~ msgstr "Marca de Orden de UTF-8 Byte" -#: src/lib/crypto.c:1581 -msgid "Internal error" -msgstr "Error interno" +#~ msgid "UTF-16le Byte Order Mark" +#~ msgstr "Marca de Orden de UTF-16le Byte" -#: src/lib/crypto.c:1583 -msgid "Unknown error" -msgstr "Error desconocido" +#~ msgid "expected a positive integer number, got: %s" +#~ msgstr "esperaba un numero entero positivo, obtuvo: %s" -#: src/lib/daemon.c:51 -#, c-format -msgid "Cannot fork to become daemon: ERR=%s\n" -msgstr "No se puede fork para convertirse en demonio: ERR =%s\n" +#~ msgid "" +#~ "This config file appears to be in an unsupported Unicode format " +#~ "(UTF-16be). Please resave as UTF-8\n" +#~ msgstr "" +#~ "Este archivo de configuración parece estar en un formato no compatible " +#~ "con Unicode (UTF-16be). Por favor, vuelva a guardar como UTF-8\n" -#: src/lib/devlock.c:319 -#, fuzzy -msgid "writeunlock called too many times.\n" -msgstr "rwl_writeunlock llamado muchas veces.\n" +#~ msgid "Cannot open included config file %s: %s\n" +#~ msgstr "No se puede abrir el archivo de configuración incluido %s: %s\n" -#: src/lib/devlock.c:324 -#, fuzzy -msgid "writeunlock by non-owner.\n" -msgstr "rwl_writeunlock por no-propietario.\n" +#~ msgid "expected an integer or a range, got %s: %s" +#~ msgstr "esperaba un numero entero o un rango, obtuvo %s: %s" -#: src/lib/devlock.c:490 src/lib/rwlock.c:427 -#, c-format -msgid "Thread %d found unchanged elements %d times\n" -msgstr "Hilo %d encontró elementos sin cambios %d veces\n" +#~ msgid "expected an integer number, got %s: %s" +#~ msgstr "esperaba un numero entero, obtuvo %s: %s" -#: src/lib/devlock.c:558 src/lib/rwlock.c:494 -#, c-format -msgid "%02d: interval %d, writes %d, reads %d\n" -msgstr "%02d: intervalo %d, escritos %d, leídos %d\n" +#~ msgid "expected a name, got %s: %s" +#~ msgstr "esperaba un nombre, obtuvo %s: %s" -#: src/lib/devlock.c:568 src/lib/rwlock.c:504 -#, c-format -msgid "data %02d: value %d, %d writes\n" -msgstr "datos %02d: valor %d, %d escritos\n" +#~ msgid "name %s length %d too long, max is %d\n" +#~ msgstr "nombre %s longitud %d demasiado largo, el máximo es %d\n" -#: src/lib/devlock.c:573 src/lib/rwlock.c:509 -#, c-format -msgid "Total: %d thread writes, %d data writes\n" -msgstr "Total: %d hilos escritos, %d datos escritos\n" +#~ msgid "expected a string, got %s: %s" +#~ msgstr "esperaba una cadena, obtuvo %s: %s" -#: src/lib/devlock.c:645 src/lib/rwlock.c:581 -msgid "Try write lock" -msgstr "Intente escribir bloqueo" +#~ msgid "Mutex lock failure. ERR=%s\n" +#~ msgstr "Error bloqueando Mutex. ERR=%s\n" -#: src/lib/devlock.c:651 src/lib/rwlock.c:587 -msgid "Try read lock" -msgstr "Intente leer bloqueo" +#~ msgid "Mutex unlock failure. ERR=%s\n" +#~ msgstr "Error desbloqueando Mutex. ERR=%s\n" -#: src/lib/devlock.c:705 src/lib/rwlock.c:640 -msgid "Create thread" -msgstr "Crear hilo" +#~ msgid "pthread_create failed: ERR=%s\n" +#~ msgstr "pthread_create fallido: ERR=%s\n" -#: src/lib/devlock.c:715 src/lib/rwlock.c:650 -msgid "Join thread" -msgstr "Unir hilo" +#~ msgid "MemPool index %d larger than max %d\n" +#~ msgstr "MemPool índice %d mayor que máximo %d\n" -#: src/lib/devlock.c:717 src/lib/rwlock.c:652 -#, c-format -msgid "%02d: interval %d, updates %d, r_collisions %d, w_collisions %d\n" -msgstr "" -"%02d: intervalo %d, actualizados %d, r_collisions %d, w_collisions %d\n" +#~ msgid "Out of memory requesting %d bytes\n" +#~ msgstr "Fuera de memoria solicitando %d bytes\n" -#: src/lib/devlock.c:729 src/lib/rwlock.c:664 -#, c-format -msgid "data %02d: value %d, %d updates\n" -msgstr "datos %02d: valor %d, %d actualizados\n" +#~ msgid "obuf is NULL\n" +#~ msgstr "obuf es NULL\n" -#: src/lib/edit.c:491 -#, fuzzy -msgid "Empty name not allowed.\n" -msgstr "Bloque de direcciones vacío no está permitido" +#~ msgid "Could not open console message file %s: ERR=%s\n" +#~ msgstr "No puede abrir el archivo de mensajes de la consola %s: ERR=%s\n" -#: src/lib/edit.c:501 -#, c-format -msgid "Illegal character \"%c\" in name.\n" -msgstr "Carácter ilegal \"%c\" en el nombre.\n" +#~ msgid "Could not get con mutex: ERR=%s\n" +#~ msgstr "No se pudo obtener con mutex: ERR=%s\n" -#: src/lib/edit.c:508 -msgid "Name too long.\n" -msgstr "Nombre demasiado largo.\n" +#~ msgid "Bacula Message" +#~ msgstr "Bacula Message" -#: src/lib/ini.c:97 src/lib/ini.c:109 -#, fuzzy, c-format -msgid "" -"Config file error: %s\n" -" : Line %d, col %d of file %s\n" -"%s\n" -msgstr "" -"Error de configuración: %s\n" -" : línea %d, columna %d en el archivo %s\n" -"%s\n" -"%s" +#~ msgid "open mail pipe %s failed: ERR=%s\n" +#~ msgstr "Fallo al abrir tubería de correo %s: ERR=%s\n" -#: src/lib/ini.c:367 src/lib/ini.c:414 -#, fuzzy, c-format -msgid "Cannot open config file %s: %s\n" -msgstr "No se pudo abrir archivo de configuración \"%s\": %s\n" +#~ msgid "open mail pipe failed.\n" +#~ msgstr "Fallo al abrir tubería de correo .\n" -#: src/lib/ini.c:382 -#, fuzzy -msgid "Cannot open lex\n" -msgstr "No se pudo abrir %s\n" +#~ msgid "close error: ERR=%s\n" +#~ msgstr "Error al cerrar: ERR=%s\n" -#: src/lib/jcr.c:221 src/lib/util.c:438 -msgid "Backup" -msgstr "Backup" +#~ msgid "Mail prog: %s" +#~ msgstr "Programa de Correo: %s" -#: src/lib/jcr.c:223 -msgid "Verifying" -msgstr "Verificando" +#~ msgid "" +#~ "Mail program terminated in error.\n" +#~ "CMD=%s\n" +#~ "ERR=%s\n" +#~ msgstr "" +#~ "Programa de correo terminado en error.\n" +#~ "CMD=%s\n" +#~ "ERR=%s\n" -#: src/lib/jcr.c:225 -msgid "Restoring" -msgstr "Restaurando" +#~ msgid "fopen %s failed: ERR=%s\n" +#~ msgstr "fopen %s ha fallado: ERR=%s\n" -#: src/lib/jcr.c:227 -msgid "Archiving" -msgstr "Archivando" +#, fuzzy +#~ msgid "" +#~ "Msg delivery error: Operator mail program terminated in error.\n" +#~ "CMD=%s\n" +#~ "ERR=%s\n" +#~ msgstr "" +#~ "Operador de programa de correo terminado en error.\n" +#~ "CMD=%s\n" +#~ "ERR=%s\n" -#: src/lib/jcr.c:229 -msgid "Copying" -msgstr "Copiando" +#, fuzzy +#~ msgid "Msg delivery error: fopen %s failed: ERR=%s\n" +#~ msgstr "fopen %s ha fallado: ERR=%s\n" -#: src/lib/jcr.c:231 -msgid "Migration" -msgstr "Migración" +#~ msgid "%s: ABORTING due to ERROR in %s:%d\n" +#~ msgstr "%s: ABORTADO debido a un ERROR en %s:%d\n" -#: src/lib/jcr.c:233 -msgid "Scanning" -msgstr "Escaneando" +#~ msgid "%s: ERROR TERMINATION at %s:%d\n" +#~ msgstr "%s: ERROR DE TERMINACIÓN en %s:%d\n" -#: src/lib/jcr.c:235 -msgid "Unknown operation" -msgstr "Operación desconocida" +#~ msgid "%s: Fatal Error because: " +#~ msgstr "%s: Error Fatal porque: " -#: src/lib/jcr.c:244 -msgid "backup" -msgstr "backup" +#~ msgid "%s: Fatal Error at %s:%d because:\n" +#~ msgstr "%s: Error Fatal en %s:%d porque:\n" -#: src/lib/jcr.c:246 -msgid "verified" -msgstr "verificado" +#~ msgid "%s: ERROR: " +#~ msgstr "%s: ERROR: " -#: src/lib/jcr.c:246 -msgid "verify" -msgstr "verificar" +#~ msgid "%s: ERROR in %s:%d " +#~ msgstr "%s: ERROR en %s:%d " -#: src/lib/jcr.c:248 -msgid "restored" -msgstr "restaurado" +#~ msgid "%s: Warning: " +#~ msgstr "%s: Advertencia: " -#: src/lib/jcr.c:248 -msgid "restore" -msgstr "restaurar" +#~ msgid "%s: Security violation: " +#~ msgstr "%s: Violación de seguridad: " -#: src/lib/jcr.c:250 -msgid "archived" -msgstr "archivado" +#~ msgid "%s ABORTING due to ERROR\n" +#~ msgstr "%s: ABORTADO debido a un ERROR\n" -#: src/lib/jcr.c:250 -msgid "archive" -msgstr "archivo" +#~ msgid "%s ERROR TERMINATION\n" +#~ msgstr "%s: ERROR DE TERMINACIÓN\n" -#: src/lib/jcr.c:252 -msgid "copied" -msgstr "copiado" +#~ msgid "%s JobId %u: Fatal error: " +#~ msgstr "%s JobId %u: Error Fatal: " -#: src/lib/jcr.c:252 -msgid "copy" -msgstr "copia" +#~ msgid "%s JobId %u: Error: " +#~ msgstr "%s JobId %u: Error: " -#: src/lib/jcr.c:254 -msgid "migrated" -msgstr "migrado" +#~ msgid "%s JobId %u: Warning: " +#~ msgstr "%s JobId %u: Advertencia: " -#: src/lib/jcr.c:254 -msgid "migrate" -msgstr "migrar" +#~ msgid "%s JobId %u: Security violation: " +#~ msgstr "%s JobId %u: Violación de seguridad: " -#: src/lib/jcr.c:256 -msgid "scanned" -msgstr "escaneado" +#, fuzzy +#~ msgid "Debug all information" +#~ msgstr "Instrucción ilegal" -#: src/lib/jcr.c:256 -msgid "scan" -msgstr "escanear" +#~ msgid "Unable to init mutex: ERR=%s\n" +#~ msgstr "No se puede iniciar mutex: ERR=%s\n" -#: src/lib/jcr.c:258 -msgid "unknown action" -msgstr "acción desconocida" +#~ msgid "Unable to destroy mutex: ERR=%s\n" +#~ msgstr "No se puede destruir mutex: ERR=%s\n" -#: src/lib/jcr.c:310 src/lib/lockmgr.c:305 src/lib/lockmgr.c:780 -#: src/lib/lockmgr.c:808 -#, c-format -msgid "pthread key create failed: ERR=%s\n" -msgstr "fallo crear clave pthread: ERR=%s\n" +#~ msgid "Unable to init OpenSSL threading: ERR=%s\n" +#~ msgstr "No se puede inicializar hilo OpenSSL: ERR=%s\n" -#: src/lib/jcr.c:331 -#, c-format -msgid "pthread_once failed. ERR=%s\n" -msgstr "fallo pthread_once. ERR=%s\n" +#~ msgid "Failed to seed OpenSSL PRNG\n" +#~ msgstr "Fallo al seed OpenSSL PRNG\n" -#: src/lib/jcr.c:340 -#, c-format -msgid "Could not init msg_queue mutex. ERR=%s\n" -msgstr "No se pudo iniciar msg_queue mutex. ERR=%s\n" +#~ msgid "Failed to save OpenSSL PRNG\n" +#~ msgstr "Fallo al guardar OpenSSL PRNG\n" -#: src/lib/jcr.c:397 -msgid "NULL jcr.\n" -msgstr "NULL jcr.\n" +#~ msgid "***UNKNOWN***" +#~ msgstr "***DESCONOCIDO***" -#: src/lib/jcr.c:606 -#, c-format -msgid "pthread_setspecific failed: ERR=%s\n" -msgstr "fallo pthread_setspecific: ERR=%s\n" +#, fuzzy +#~ msgid "Inserted res: %s index=%d\n" +#~ msgstr "Insertando %s res: %s index=%d pass=%d\n" -#: src/lib/jcr.c:1097 -#, c-format -msgid "" -"Watchdog sending kill after %d secs to thread stalled reading Storage " -"daemon.\n" -msgstr "" -"Watchdog envío kill después de %d segundos para hilo estancado leyendo " -"demonio Storage.\n" +#~ msgid "expected an =, got: %s" +#~ msgstr "esperaba un =, obtuvo: %s" -#: src/lib/jcr.c:1109 -#, c-format -msgid "" -"Watchdog sending kill after %d secs to thread stalled reading File daemon.\n" -msgstr "" -"Watchdog envío kill después de %d segundos para hilo estancado leyendo " -"demonio File.\n" +#~ msgid "Unknown item code: %d\n" +#~ msgstr "Código de ítem desconocido: %d\n" -#: src/lib/jcr.c:1121 -#, c-format -msgid "" -"Watchdog sending kill after %d secs to thread stalled reading Director.\n" -msgstr "" -"Watchdog envío kill después de %d segundos para hilo estancado leyendo " -"demonio Director.\n" +#~ msgid "message type: %s not found" +#~ msgstr "tipo de mensaje: %s no encontrado" -#: src/lib/lex.c:81 -#, c-format -msgid "Problem probably begins at line %d.\n" -msgstr "Probablemente comienza el problema en la línea %d\n" +#~ msgid "Attempt to redefine name \"%s\" to \"%s\"." +#~ msgstr "Intento de redefinir el nombre \"%s\" para \"%s\"." -#: src/lib/lex.c:86 -#, c-format -msgid "" -"Config error: %s\n" -" : line %d, col %d of file %s\n" -"%s\n" -"%s" -msgstr "" -"Error de configuración: %s\n" -" : línea %d, columna %d en el archivo %s\n" -"%s\n" -"%s" +#~ msgid "Attempt to redefine resource \"%s\" referenced on line %d : %s\n" +#~ msgstr "" +#~ "Intento de redefinir recurso \"%s\" referenciado en la línea %d: %s\n" -#: src/lib/lex.c:90 -#, c-format -msgid "Config error: %s\n" -msgstr "Error de configuración: %s\n" +#~ msgid "Too many %s directives. Max. is %d. line %d: %s\n" +#~ msgstr "Demasiadas directivas %s. Máximo es %d. linea %d: %s\n" -#: src/lib/lex.c:119 -msgid "Close of NULL file\n" -msgstr "Cierre de archivo NULL\n" +#~ msgid "Could not find config Resource \"%s\" referenced on line %d : %s\n" +#~ msgstr "" +#~ "No pudo encontrar recurso de configuración \"%s\" referenciado en linea " +#~ "%d : %s\n" -#: src/lib/lex.c:273 src/lib/xml.c:149 -msgid "" -"get_char: called after EOF. You may have a open double quote without the " -"closing double quote.\n" -msgstr "" -"get_char: llamado después de EOF. Usted puede tener una comilla doble " -"abierta sin el cierre de comillas dobles.\n" +#~ msgid "Missing config Resource \"%s\" referenced on line %d : %s\n" +#~ msgstr "" +#~ "Falta la configuración de Recurso \"%s\" referenciado en linea %d : %s\n" -#: src/lib/lex.c:333 src/lib/xml.c:192 src/lib/xml.c:205 -#, c-format -msgid "Config token too long, file: %s, line %d, begins at line %d\n" -msgstr "" -"Configuración de señal demasiado largo, archivo: %s, línea %d, se inicia en " -"la línea %d\n" +#~ msgid "expected a size number, got: %s" +#~ msgstr "esperaba un numero de tamaño, obtuvo: %s" -#: src/lib/lex.c:357 -msgid "none" -msgstr "ninguno" +#, fuzzy +#~ msgid "expected a speed number, got: %s" +#~ msgstr "esperaba un numero de tamaño, obtuvo: %s" -#: src/lib/lex.c:358 -msgid "comment" -msgstr "comentario" +#, fuzzy +#~ msgid "expected a %s, got: %s" +#~ msgstr "esperaba un tamaño, obtuvo: %s" -#: src/lib/lex.c:359 -msgid "number" -msgstr "numero" +#~ msgid "Expected a Tape Label keyword, got: %s" +#~ msgstr "esperaba una etiqueta Tape Label , obtuvo: %s" -#: src/lib/lex.c:360 -msgid "ip_addr" -msgstr "ip_addr" +#~ msgid "Unable to initialize resource lock. ERR=%s\n" +#~ msgstr "No se puede inicializar recurso de bloqueo. ERR=%s\n" -#: src/lib/lex.c:361 -msgid "identifier" -msgstr "identificar" +#~ msgid "Config filename too long.\n" +#~ msgstr "Nombre de archivo de configuración muy largo.\n" -#: src/lib/lex.c:362 -msgid "string" -msgstr "cadena" +#~ msgid "Cannot open config file \"%s\": %s\n" +#~ msgstr "No se pudo abrir archivo de configuración \"%s\": %s\n" -#: src/lib/lex.c:363 -msgid "quoted_string" -msgstr "quoted_string" +#~ msgid "" +#~ "Currently we cannot handle UTF-16 source files. Please convert the conf " +#~ "file to UTF-8\n" +#~ msgstr "" +#~ "Actualmente no podemos manejar archivos de origen UTF-16 . Por favor, " +#~ "convierta el archivo de configuración a UTF-8\n" -#: src/lib/lex.c:364 -msgid "include" -msgstr "incluir" +#~ msgid "Expected a Resource name identifier, got: %s" +#~ msgstr "esperaba un nombre de identificación de Recurso, obtuvo: %s" -#: src/lib/lex.c:365 -msgid "include_quoted_string" -msgstr "include_quoted_string" +#~ msgid "expected resource name, got: %s" +#~ msgstr "esperaba un nombre de recurso, obtuvo: %s" -#: src/lib/lex.c:366 -msgid "UTF-8 Byte Order Mark" -msgstr "Marca de Orden de UTF-8 Byte" +#~ msgid "not in resource definition: %s" +#~ msgstr "no en la definición de recurso: %s" -#: src/lib/lex.c:367 -msgid "UTF-16le Byte Order Mark" -msgstr "Marca de Orden de UTF-16le Byte" +#~ msgid "" +#~ "Keyword \"%s\" not permitted in this resource.\n" +#~ "Perhaps you left the trailing brace off of the previous resource." +#~ msgstr "" +#~ "Palabra clave \"%s\" no permitida en este recurso.\n" +#~ "Tal vez a la izquierda de la llave de los recursos anteriores." -#: src/lib/lex.c:405 src/lib/lex.c:411 src/lib/lex.c:422 src/lib/lex.c:428 -#, c-format -msgid "expected a positive integer number, got: %s" -msgstr "esperaba un numero entero positivo, obtuvo: %s" +#~ msgid "Name not specified for resource" +#~ msgstr "Nombre no especificado para el recurso" -#: src/lib/lex.c:544 src/lib/xml.c:344 -msgid "" -"This config file appears to be in an unsupported Unicode format (UTF-16be). " -"Please resave as UTF-8\n" -msgstr "" -"Este archivo de configuración parece estar en un formato no compatible con " -"Unicode (UTF-16be). Por favor, vuelva a guardar como UTF-8\n" +#~ msgid "unexpected token %d %s in resource definition" +#~ msgstr "símbolo %d no soporte %s en la definición de los recursos" -#: src/lib/lex.c:690 src/lib/lex.c:718 -#, c-format -msgid "Cannot open included config file %s: %s\n" -msgstr "No se puede abrir el archivo de configuración incluido %s: %s\n" +#~ msgid "Unknown parser state %d\n" +#~ msgstr "Estado del Analizador %d desconocido\n" -#: src/lib/lex.c:777 src/lib/lex.c:834 -#, c-format -msgid "expected an integer or a range, got %s: %s" -msgstr "esperaba un numero entero o un rango, obtuvo %s: %s" +#~ msgid "End of conf file reached with unclosed resource." +#~ msgstr "Fin de archivo de configuración alcanzado con recursos sin cerrar." -#: src/lib/lex.c:791 src/lib/lex.c:799 src/lib/lex.c:810 src/lib/lex.c:818 -#, c-format -msgid "expected an integer number, got %s: %s" -msgstr "esperaba un numero entero, obtuvo %s: %s" +#~ msgid "Failed to open Plugin directory %s: ERR=%s\n" +#~ msgstr "No se pudo abrir el directorio de Plugin %s: ERR=%s\n" -#: src/lib/lex.c:848 -#, c-format -msgid "expected a name, got %s: %s" -msgstr "esperaba un nombre, obtuvo %s: %s" +#~ msgid "Failed to find any plugins in %s\n" +#~ msgstr "No se pudo encontrar ningún plugin en %s\n" -#: src/lib/lex.c:852 -#, c-format -msgid "name %s length %d too long, max is %d\n" -msgstr "nombre %s longitud %d demasiado largo, el máximo es %d\n" +#, fuzzy +#~ msgid "dlopen plugin %s failed: ERR=%s\n" +#~ msgstr "fopen %s ha fallado: ERR=%s\n" -#: src/lib/lex.c:860 -#, c-format -msgid "expected a string, got %s: %s" -msgstr "esperaba una cadena, obtuvo %s: %s" +#~ msgid "Lookup of loadPlugin in plugin %s failed: ERR=%s\n" +#~ msgstr "Fallo buscando por loadPlugin en plugin %s: ERR=%s\n" -#: src/lib/lockmgr.c:54 -#, c-format -msgid "ASSERT failed at %s:%i: %s\n" -msgstr "" +#~ msgid "Lookup of unloadPlugin in plugin %s failed: ERR=%s\n" +#~ msgstr "Fallo buscando por unloadPlugin en plugin %s: ERR=%s\n" -#: src/lib/lockmgr.c:59 -#, c-format -msgid "ASSERT failed at %s:%i: %s \n" -msgstr "" +#~ msgid "Could not find userid=%s: ERR=%s\n" +#~ msgstr "No se pudo encontrar userid=%s: ERR=%s\n" -#: src/lib/lockmgr.c:65 -#, c-format -msgid "ASSERT failed at %s:%i: %s (%s)\n" -msgstr "" +#~ msgid "Could not find password entry. ERR=%s\n" +#~ msgstr "No se pudo encontrar contraseña de entrada. ERR=%s\n" -#: src/lib/lockmgr.c:96 -#, c-format -msgid "Mutex lock failure. ERR=%s\n" -msgstr "Error bloqueando Mutex. ERR=%s\n" +#~ msgid "Could not find group=%s: ERR=%s\n" +#~ msgstr "No se pudo encontrar grupo=%s: ERR=%s\n" -#: src/lib/lockmgr.c:106 -#, c-format -msgid "Mutex unlock failure. ERR=%s\n" -msgstr "Error desbloqueando Mutex. ERR=%s\n" +#~ msgid "Could not initgroups for group=%s, userid=%s: ERR=%s\n" +#~ msgstr "Podría no initgroups para grupo=%s, userid=%s: ERR=%s\n" -#: src/lib/lockmgr.c:792 -#, c-format -msgid "pthread_create failed: ERR=%s\n" -msgstr "pthread_create fallido: ERR=%s\n" +#~ msgid "Could not initgroups for userid=%s: ERR=%s\n" +#~ msgstr "Podría no initgroups para userid=%s: ERR=%s\n" -#: src/lib/mem_pool.c:103 -#, c-format -msgid "MemPool index %d larger than max %d\n" -msgstr "MemPool índice %d mayor que máximo %d\n" +#~ msgid "Could not set group=%s: ERR=%s\n" +#~ msgstr "No se pudo establecer grupo=%s: ERR=%s\n" -#: src/lib/mem_pool.c:121 src/lib/mem_pool.c:141 src/lib/mem_pool.c:177 -#: src/lib/mem_pool.c:250 src/lib/mem_pool.c:270 src/lib/mem_pool.c:305 -#: src/lib/mem_pool.c:616 -#, c-format -msgid "Out of memory requesting %d bytes\n" -msgstr "Fuera de memoria solicitando %d bytes\n" +#~ msgid "prctl failed: ERR=%s\n" +#~ msgstr "prctl fallido: ERR=%s\n" -#: src/lib/mem_pool.c:158 -msgid "obuf is NULL\n" -msgstr "obuf es NULL\n" +#~ msgid "setreuid failed: ERR=%s\n" +#~ msgstr "setreuid fallido: ERR=%s\n" -#: src/lib/message.c:418 src/lib/message.c:428 -#, c-format -msgid "Could not open console message file %s: ERR=%s\n" -msgstr "No puede abrir el archivo de mensajes de la consola %s: ERR=%s\n" +#~ msgid "cap_from_text failed: ERR=%s\n" +#~ msgstr "cap_from_text fallido: ERR=%s\n" -#: src/lib/message.c:433 -#, c-format -msgid "Could not get con mutex: ERR=%s\n" -msgstr "No se pudo obtener con mutex: ERR=%s\n" +#~ msgid "cap_set_proc failed: ERR=%s\n" +#~ msgstr "cap_set_proc fallido: ERR=%s\n" -#: src/lib/message.c:538 -msgid "Bacula Message" -msgstr "Bacula Message" +#~ msgid "Keep readall caps not implemented this OS or missing libraries.\n" +#~ msgstr "" +#~ "seguir readall caps no implementado en este SO o faltan bibliotecas.\n" -#: src/lib/message.c:542 -#, c-format -msgid "open mail pipe %s failed: ERR=%s\n" -msgstr "Fallo al abrir tubería de correo %s: ERR=%s\n" +#~ msgid "Could not set specified userid: %s\n" +#~ msgstr "No se pudo establecer userid especificado: %s\n" -#: src/lib/message.c:633 -msgid "open mail pipe failed.\n" -msgstr "Fallo al abrir tubería de correo .\n" +#~ msgid "Could not initialize Python\n" +#~ msgstr "No se pudo inicializar Python\n" -#: src/lib/message.c:646 -#, c-format -msgid "close error: ERR=%s\n" -msgstr "Error al cerrar: ERR=%s\n" +#~ msgid "Could not Run Python string %s\n" +#~ msgstr "No se pudo ejecutar Python cadena %s\n" -#: src/lib/message.c:657 -#, c-format -msgid "Mail prog: %s" -msgstr "Programa de Correo: %s" +#~ msgid "Could not initialize Python Job type.\n" +#~ msgstr "No se pudo inicializar Job tipo Python.\n" -#: src/lib/message.c:666 -#, c-format -msgid "" -"Mail program terminated in error.\n" -"CMD=%s\n" -"ERR=%s\n" -msgstr "" -"Programa de correo terminado en error.\n" -"CMD=%s\n" -"ERR=%s\n" +#~ msgid "Could not import Python script %s/%s. Python disabled.\n" +#~ msgstr "No se puede importar script Python %s/%s. Python deshabilitado.\n" -#: src/lib/message.c:773 -#, c-format -msgid "fopen %s failed: ERR=%s\n" -msgstr "fopen %s ha fallado: ERR=%s\n" +#~ msgid "Could not create Python Job Object.\n" +#~ msgstr "No es posible crear objeto Job Python.\n" -#: src/lib/message.c:895 src/lib/message.c:898 -msgid "Msg delivery error: Unable to store data in database.\n" -msgstr "" +#~ msgid "Python function \"%s\" not found.\n" +#~ msgstr "Python función \"%s\" no encontrada.\n" -#: src/lib/message.c:950 -#, fuzzy, c-format -msgid "" -"Msg delivery error: Operator mail program terminated in error.\n" -"CMD=%s\n" -"ERR=%s\n" -msgstr "" -"Operador de programa de correo terminado en error.\n" -"CMD=%s\n" -"ERR=%s\n" +#~ msgid "Unknown Python daemon event %s\n" +#~ msgstr "Demonio Python evento %s desconocido\n" -#: src/lib/message.c:971 -#, fuzzy, c-format -msgid "Msg delivery error: fopen %s failed: ERR=%s\n" -msgstr "fopen %s ha fallado: ERR=%s\n" +#~ msgid "Unable to initialize the Python lock. ERR=%s\n" +#~ msgstr "No se puede inicializar el bloqueo de Python. ERR=%s\n" -#: src/lib/message.c:1318 -#, c-format -msgid "%s: ABORTING due to ERROR in %s:%d\n" -msgstr "%s: ABORTADO debido a un ERROR en %s:%d\n" +#~ msgid "rwl_writelock failure at %s:%d: ERR=%s\n" +#~ msgstr "Fallo rwl_writelock en %s:%d: ERR=%s\n" -#: src/lib/message.c:1322 -#, c-format -msgid "%s: ERROR TERMINATION at %s:%d\n" -msgstr "%s: ERROR DE TERMINACIÓN en %s:%d\n" +#~ msgid "rwl_writeunlock failure at %s:%d:. ERR=%s\n" +#~ msgstr "Fallo \trwl_writeunlock en %s:%d: ERR=%s\n" -#: src/lib/message.c:1327 -#, c-format -msgid "%s: Fatal Error because: " -msgstr "%s: Error Fatal porque: " +#~ msgid "%s: run %s \"%s\"\n" +#~ msgstr "%s: ejecutar %s \"%s\"\n" -#: src/lib/message.c:1329 -#, c-format -msgid "%s: Fatal Error at %s:%d because:\n" -msgstr "%s: Error Fatal en %s:%d porque:\n" +#~ msgid "Runscript: %s could not execute. ERR=%s\n" +#~ msgstr "Runscript: No pudo ejecutar %s. ERR=%s\n" -#: src/lib/message.c:1333 -#, c-format -msgid "%s: ERROR: " -msgstr "%s: ERROR: " +#~ msgid "%s: %s\n" +#~ msgstr "%s: %s\n" -#: src/lib/message.c:1335 -#, c-format -msgid "%s: ERROR in %s:%d " -msgstr "%s: ERROR en %s:%d " +#~ msgid "Runscript: %s returned non-zero status=%d. ERR=%s\n" +#~ msgstr "Runscript: %s devolvió estado=%d distinto de cero. ERR=%s\n" -#: src/lib/message.c:1338 -#, c-format -msgid "%s: Warning: " -msgstr "%s: Advertencia: " +#~ msgid "rwl_writeunlock called too many times.\n" +#~ msgstr "rwl_writeunlock llamado muchas veces.\n" -#: src/lib/message.c:1341 -#, c-format -msgid "%s: Security violation: " -msgstr "%s: Violación de seguridad: " +#~ msgid "rwl_writeunlock by non-owner.\n" +#~ msgstr "rwl_writeunlock por no-propietario.\n" -#: src/lib/message.c:1430 -#, c-format -msgid "%s ABORTING due to ERROR\n" -msgstr "%s: ABORTADO debido a un ERROR\n" +#, fuzzy +#~ msgid "Negative numbers not permitted.\n" +#~ msgstr "Números negativos no permitidos.\n" -#: src/lib/message.c:1433 -#, c-format -msgid "%s ERROR TERMINATION\n" -msgstr "%s: ERROR DE TERMINACIÓN\n" +#, fuzzy +#~ msgid "User cancel requested.\n" +#~ msgstr "Restauración cancelada.\n" -#: src/lib/message.c:1436 -#, c-format -msgid "%s JobId %u: Fatal error: " -msgstr "%s JobId %u: Error Fatal: " +#, fuzzy +#~ msgid "Selection items must be be greater than zero.\n" +#~ msgstr "Los valores deben ser ser mayor que cero.\n" -#: src/lib/message.c:1445 -#, c-format -msgid "%s JobId %u: Error: " -msgstr "%s JobId %u: Error: " +#~ msgid "Invalid signal number" +#~ msgstr "Número de la señal no válida" -#: src/lib/message.c:1451 -#, c-format -msgid "%s JobId %u: Warning: " -msgstr "%s JobId %u: Advertencia: " +#~ msgid "Bacula interrupted by signal %d: %s\n" +#~ msgstr "Bacula interrumpido por señal %d: %s\n" -#: src/lib/message.c:1457 -#, c-format -msgid "%s JobId %u: Security violation: " -msgstr "%s JobId %u: Violación de seguridad: " +#, fuzzy +#~ msgid "Kaboom! %s, %s got signal %d - %s at %s. Attempting traceback.\n" +#~ msgstr "Kaboom! %s, %s obtuvo la señal %d - %s. Intentando rastreo.\n" -#: src/lib/message.c:1732 -msgid "Debug lock information" -msgstr "" +#~ msgid "Kaboom! exepath=%s\n" +#~ msgstr "Kaboom! exepath=%s\n" -#: src/lib/message.c:1733 -msgid "Debug network information" -msgstr "" +#~ msgid "Fork error: ERR=%s\n" +#~ msgstr "Fork error: ERR=%s\n" -#: src/lib/message.c:1734 -msgid "Debug plugin information" -msgstr "" +#~ msgid "Calling: %s %s %s %s\n" +#~ msgstr "Llamando: %s %s %s %s\n" -#: src/lib/message.c:1735 -msgid "Debug volume information" -msgstr "" +#~ msgid "execv: %s failed: ERR=%s\n" +#~ msgstr "execv: %s ha fallado: ERR=%s\n" -#: src/lib/message.c:1736 -msgid "Debug SQL queries" -msgstr "" +#, fuzzy +#~ msgid "It looks like the traceback worked...\n" +#~ msgstr "Parece que el rastreo trabaja ...\n" -#: src/lib/message.c:1737 -msgid "Debug BVFS queries" -msgstr "" +#~ msgid "BA_NSIG too small (%d) should be (%d)\n" +#~ msgstr "BA_NSIG demasiado pequeño (%d) debe ser (%d)\n" -#: src/lib/message.c:1738 -msgid "Debug memory allocation" -msgstr "" +#~ msgid "UNKNOWN SIGNAL" +#~ msgstr "SEÑAL DESCONOCIDA" -#: src/lib/message.c:1739 -msgid "Debug scheduler information" -msgstr "" +#~ msgid "Hangup" +#~ msgstr "Colgar" -#: src/lib/message.c:1740 -msgid "Debug protocol information" -msgstr "" +#~ msgid "Interrupt" +#~ msgstr "Interrumpir" -#: src/lib/message.c:1741 -#, fuzzy -msgid "Debug dedup information" -msgstr "Instrucción ilegal" +#~ msgid "Quit" +#~ msgstr "Salir" -#: src/lib/message.c:1742 -msgid "Debug snapshots" -msgstr "" +#~ msgid "Illegal instruction" +#~ msgstr "Instrucción ilegal" -#: src/lib/message.c:1743 -msgid "Debug dedup engine" -msgstr "" +#~ msgid "Trace/Breakpoint trap" +#~ msgstr "Trace/Trampa de Punto de Interrupción" -#: src/lib/message.c:1744 -msgid "ASX personal's debugging" -msgstr "" +#~ msgid "Abort" +#~ msgstr "Anular" -#: src/lib/message.c:1745 -#, fuzzy -msgid "Debug all information" -msgstr "Instrucción ilegal" +#~ msgid "EMT instruction (Emulation Trap)" +#~ msgstr "Instrucción EMT (Emulación de Trampa)" -#: src/lib/openssl.c:113 src/lib/openssl.c:172 src/stored/dev.c:385 -#: src/stored/dev.c:443 -#, c-format -msgid "Unable to init mutex: ERR=%s\n" -msgstr "No se puede iniciar mutex: ERR=%s\n" +#~ msgid "IOT trap" +#~ msgstr "trampa IOT" -#: src/lib/openssl.c:134 src/lib/openssl.c:205 -#, c-format -msgid "Unable to destroy mutex: ERR=%s\n" -msgstr "No se puede destruir mutex: ERR=%s\n" +#~ msgid "BUS error" +#~ msgstr "BUS error" -#: src/lib/openssl.c:273 -#, c-format -msgid "Unable to init OpenSSL threading: ERR=%s\n" -msgstr "No se puede inicializar hilo OpenSSL: ERR=%s\n" +#~ msgid "Floating-point exception" +#~ msgstr "Excepción de punto flotante" -#: src/lib/openssl.c:286 -msgid "Failed to seed OpenSSL PRNG\n" -msgstr "Fallo al seed OpenSSL PRNG\n" +#~ msgid "Kill, unblockable" +#~ msgstr "Matar, imbloqueable" -#: src/lib/openssl.c:312 -msgid "Failed to save OpenSSL PRNG\n" -msgstr "Fallo al guardar OpenSSL PRNG\n" +#~ msgid "User-defined signal 1" +#~ msgstr "Señal 1 definida por el usuario" -#: src/lib/parse_conf.c:164 -msgid "***UNKNOWN***" -msgstr "***DESCONOCIDO***" +#~ msgid "Segmentation violation" +#~ msgstr "Violación de segmento" -#: src/lib/parse_conf.c:208 -#, c-format -msgid "Attempt to define second %s resource named \"%s\" is not permitted.\n" -msgstr "" -"Segundo intento de definir recurso %s llamado \"%s\" no está permitido.\n" +#~ msgid "User-defined signal 2" +#~ msgstr "Señal definida por el usuario 2" -#: src/lib/parse_conf.c:214 -#, fuzzy, c-format -msgid "Inserted res: %s index=%d\n" -msgstr "Insertando %s res: %s index=%d pass=%d\n" +#~ msgid "Broken pipe" +#~ msgstr "Tuberí­a rota" -#: src/lib/parse_conf.c:328 src/lib/parse_conf.c:349 -#, c-format -msgid "expected an =, got: %s" -msgstr "esperaba un =, obtuvo: %s" +#~ msgid "Alarm clock" +#~ msgstr "Alarma" -#: src/lib/parse_conf.c:358 -#, c-format -msgid "Unknown item code: %d\n" -msgstr "Código de ítem desconocido: %d\n" +#~ msgid "Termination" +#~ msgstr "Terminación" -#: src/lib/parse_conf.c:398 -#, c-format -msgid "message type: %s not found" -msgstr "tipo de mensaje: %s no encontrado" +#~ msgid "Stack fault" +#~ msgstr "Error de pila" -#: src/lib/parse_conf.c:437 -#, c-format -msgid "Attempt to redefine name \"%s\" to \"%s\"." -msgstr "Intento de redefinir el nombre \"%s\" para \"%s\"." +#~ msgid "Child status has changed" +#~ msgstr "El estado de hijo ha cambiado" -#: src/lib/parse_conf.c:542 -#, c-format -msgid "Attempt to redefine resource \"%s\" referenced on line %d : %s\n" -msgstr "Intento de redefinir recurso \"%s\" referenciado en la línea %d: %s\n" +#~ msgid "Continue" +#~ msgstr "Continue" -#: src/lib/parse_conf.c:578 -#, c-format -msgid "Too many %s directives. Max. is %d. line %d: %s\n" -msgstr "Demasiadas directivas %s. Máximo es %d. linea %d: %s\n" +#~ msgid "Stop, unblockable" +#~ msgstr "Detener, imbloqueable" -#: src/lib/parse_conf.c:589 -#, c-format -msgid "Could not find config Resource \"%s\" referenced on line %d : %s\n" -msgstr "" -"No pudo encontrar recurso de configuración \"%s\" referenciado en linea %d : " -"%s\n" +#~ msgid "Keyboard stop" +#~ msgstr "Teclado detenido" -#: src/lib/parse_conf.c:657 -#, c-format -msgid "Missing config Resource \"%s\" referenced on line %d : %s\n" -msgstr "" -"Falta la configuración de Recurso \"%s\" referenciado en linea %d : %s\n" +#~ msgid "Background read from tty" +#~ msgstr "Leer en segundo plan desde tty" -#: src/lib/parse_conf.c:732 -#, c-format -msgid "expected a size number, got: %s" -msgstr "esperaba un numero de tamaño, obtuvo: %s" +#~ msgid "Background write to tty" +#~ msgstr "Escribir en segundo plan al tty" -#: src/lib/parse_conf.c:737 -#, fuzzy, c-format -msgid "expected a speed number, got: %s" -msgstr "esperaba un numero de tamaño, obtuvo: %s" +#~ msgid "Urgent condition on socket" +#~ msgstr "Condición de urgencia en el socket" -#: src/lib/parse_conf.c:748 -#, fuzzy, c-format -msgid "expected a %s, got: %s" -msgstr "esperaba un tamaño, obtuvo: %s" +#~ msgid "CPU limit exceeded" +#~ msgstr "Limite de CPU superado" -#: src/lib/parse_conf.c:749 -msgid "size" -msgstr "" +#~ msgid "File size limit exceeded" +#~ msgstr "Superado el límite de tamaño de archivo" -#: src/lib/parse_conf.c:749 -msgid "speed" -msgstr "" +#~ msgid "Virtual alarm clock" +#~ msgstr "Despertador virtual" -#: src/lib/parse_conf.c:870 -#, c-format -msgid "Expected a Tape Label keyword, got: %s" -msgstr "esperaba una etiqueta Tape Label , obtuvo: %s" +#~ msgid "Profiling alarm clock" +#~ msgstr "Perfiles de alarma" -#: src/lib/parse_conf.c:939 -#, c-format -msgid "Unable to initialize resource lock. ERR=%s\n" -msgstr "No se puede inicializar recurso de bloqueo. ERR=%s\n" +#~ msgid "Window size change" +#~ msgstr "Cambiar el tamaño de la ventana" -#: src/lib/parse_conf.c:947 -msgid "Config filename too long.\n" -msgstr "Nombre de archivo de configuración muy largo.\n" +#~ msgid "I/O now possible" +#~ msgstr "I/O posible ahora" -#: src/lib/parse_conf.c:971 -#, c-format -msgid "Cannot open config file \"%s\": %s\n" -msgstr "No se pudo abrir archivo de configuración \"%s\": %s\n" +#~ msgid "Power failure restart" +#~ msgstr "Fallo reiniciar energía" -#: src/lib/parse_conf.c:989 -msgid "" -"Currently we cannot handle UTF-16 source files. Please convert the conf file " -"to UTF-8\n" -msgstr "" -"Actualmente no podemos manejar archivos de origen UTF-16 . Por favor, " -"convierta el archivo de configuración a UTF-8\n" +#~ msgid "No runnable lwp" +#~ msgstr "LWP no ejecutable" -#: src/lib/parse_conf.c:993 -#, c-format -msgid "Expected a Resource name identifier, got: %s" -msgstr "esperaba un nombre de identificación de Recurso, obtuvo: %s" +#~ msgid "SIGLWP special signal used by thread library" +#~ msgstr "La señal especial SIGLWP utilizado por la biblioteca del hilo" -#: src/lib/parse_conf.c:1009 -#, c-format -msgid "expected resource name, got: %s" -msgstr "esperaba un nombre de recurso, obtuvo: %s" +#~ msgid "Checkpoint Freeze" +#~ msgstr "Checkpoint de Congelación" -#: src/lib/parse_conf.c:1020 -#, c-format -msgid "not in resource definition: %s" -msgstr "no en la definición de recurso: %s" +#~ msgid "Checkpoint Thaw" +#~ msgstr "Checkpoint de Thaw" -#: src/lib/parse_conf.c:1051 -#, c-format -msgid "" -"Keyword \"%s\" not permitted in this resource.\n" -"Perhaps you left the trailing brace off of the previous resource." -msgstr "" -"Palabra clave \"%s\" no permitida en este recurso.\n" -"Tal vez a la izquierda de la llave de los recursos anteriores." +#~ msgid "Thread Cancellation" +#~ msgstr "Cancelación de Hilo" -#: src/lib/parse_conf.c:1062 -msgid "Name not specified for resource" -msgstr "Nombre no especificado para el recurso" +#~ msgid "Resource Lost (e.g. record-lock lost)" +#~ msgstr "Recurso Perdido (por ejemplo, registro de bloqueo perdido)" -#: src/lib/parse_conf.c:1072 -#, c-format -msgid "unexpected token %d %s in resource definition" -msgstr "símbolo %d no soporte %s en la definición de los recursos" +#~ msgid "Out of memory\n" +#~ msgstr "Fuera de memoria\n" -#: src/lib/parse_conf.c:1078 -#, c-format -msgid "Unknown parser state %d\n" -msgstr "Estado del Analizador %d desconocido\n" +#~ msgid "Too much memory used." +#~ msgstr "Demasiada memoria utilizada." -#: src/lib/parse_conf.c:1083 -msgid "End of conf file reached with unclosed resource." -msgstr "Fin de archivo de configuración alcanzado con recursos sin cerrar." +#~ msgid "Attempt to free NULL called from %s:%d\n" +#~ msgstr "Intento para liberar NULL llamado desde %s:%d\n" -#: src/lib/plugins.c:106 -#, c-format -msgid "Failed to open Plugin directory %s: ERR=%s\n" -msgstr "No se pudo abrir el directorio de Plugin %s: ERR=%s\n" +#, fuzzy +#~ msgid "in-use bit not set: double free from %s:%d\n" +#~ msgstr "doble libre desde %s:%d\n" -#: src/lib/plugins.c:123 -#, c-format -msgid "Failed to find any plugins in %s\n" -msgstr "No se pudo encontrar ningún plugin en %s\n" +#~ msgid "qp->qnext->qprev != qp called from %s:%d\n" +#~ msgstr "qp->qnext->qprev != qp llamado desde %s:%d\n" -#: src/lib/plugins.c:157 -#, fuzzy, c-format -msgid "dlopen plugin %s failed: ERR=%s\n" -msgstr "fopen %s ha fallado: ERR=%s\n" +#~ msgid "qp->qprev->qnext != qp called from %s:%d\n" +#~ msgstr "qp->qprev->qnext != qp llamado desde %s:%d\n" -#: src/lib/plugins.c:168 -#, c-format -msgid "Lookup of loadPlugin in plugin %s failed: ERR=%s\n" -msgstr "Fallo buscando por loadPlugin en plugin %s: ERR=%s\n" +#~ msgid "sm_realloc size: %d\n" +#~ msgstr "sm_realloc tamaño: %d\n" -#: src/lib/plugins.c:177 -#, c-format -msgid "Lookup of unloadPlugin in plugin %s failed: ERR=%s\n" -msgstr "Fallo buscando por unloadPlugin en plugin %s: ERR=%s\n" +#~ msgid "sm_realloc %d at %p from %s:%d\n" +#~ msgstr "sm_realloc %d en %p desde %s:%d\n" -#: src/lib/priv.c:57 -#, c-format -msgid "Could not find userid=%s: ERR=%s\n" -msgstr "No se pudo encontrar userid=%s: ERR=%s\n" +#~ msgid "" +#~ "\n" +#~ "Orphaned buffers exist. Dump terminated following\n" +#~ " discovery of bad links in chain of orphaned buffers.\n" +#~ " Buffer address with bad links: %p\n" +#~ msgstr "" +#~ "\n" +#~ "Buffers huérfanos existen. Volcado terminado tras el\n" +#~ "descubrimiento de malos vínculos en la cadena de buffers huérfanos.\n" +#~ " Dirección del buffer con enlaces malos: %p\n" -#: src/lib/priv.c:63 -#, c-format -msgid "Could not find password entry. ERR=%s\n" -msgstr "No se pudo encontrar contraseña de entrada. ERR=%s\n" +#~ msgid "Damaged buffer found. Called from %s:%d\n" +#~ msgstr "Búfer dañado encontrado. Llamado desde %s:%d\n" -#: src/lib/priv.c:76 -#, c-format -msgid "Could not find group=%s: ERR=%s\n" -msgstr "No se pudo encontrar grupo=%s: ERR=%s\n" +#~ msgid "" +#~ "\n" +#~ "Damaged buffers found at %s:%d\n" +#~ msgstr "" +#~ "\n" +#~ "Búfers dañado encontrado en %s:%d\n" -#: src/lib/priv.c:84 -#, c-format -msgid "Could not initgroups for group=%s, userid=%s: ERR=%s\n" -msgstr "Podría no initgroups para grupo=%s, userid=%s: ERR=%s\n" +#~ msgid " discovery of bad prev link.\n" +#~ msgstr "descubrimiento de un malo vínculo anterior.\n" -#: src/lib/priv.c:87 -#, c-format -msgid "Could not initgroups for userid=%s: ERR=%s\n" -msgstr "Podría no initgroups para userid=%s: ERR=%s\n" +#~ msgid " discovery of bad next link.\n" +#~ msgstr "descubrimiento del siguiente malo enlace malo.\n" -#: src/lib/priv.c:94 -#, c-format -msgid "Could not set group=%s: ERR=%s\n" -msgstr "No se pudo establecer grupo=%s: ERR=%s\n" +#~ msgid " discovery of data overrun.\n" +#~ msgstr "descubrimiento de datos de rebosamiento.\n" -#: src/lib/priv.c:104 -#, c-format -msgid "prctl failed: ERR=%s\n" -msgstr "prctl fallido: ERR=%s\n" +#~ msgid " NULL pointer.\n" +#~ msgstr "Puntero NULL.\n" -#: src/lib/priv.c:108 -#, c-format -msgid "setreuid failed: ERR=%s\n" -msgstr "setreuid fallido: ERR=%s\n" +#~ msgid " Buffer address: %p\n" +#~ msgstr "Dirección de buffer : %p\n" -#: src/lib/priv.c:112 -#, c-format -msgid "cap_from_text failed: ERR=%s\n" -msgstr "cap_from_text fallido: ERR=%s\n" +#~ msgid "Damaged buffer: %6u bytes allocated at line %d of %s %s\n" +#~ msgstr "Búfer dañados: %6u bytes asignados en la línea %d de %s %s\n" -#: src/lib/priv.c:116 -#, c-format -msgid "cap_set_proc failed: ERR=%s\n" -msgstr "cap_set_proc fallido: ERR=%s\n" +#~ msgid "" +#~ "Error with certificate at depth: %d, issuer = %s, subject = %s, ERR=%d:" +#~ "%s\n" +#~ msgstr "" +#~ "Error con el certificado en profundidad: %d, emisor=%s, asunto=%s, ERR=%d:" +#~ "%s\n" -#: src/lib/priv.c:120 -msgid "Keep readall caps not implemented this OS or missing libraries.\n" -msgstr "seguir readall caps no implementado en este SO o faltan bibliotecas.\n" +#~ msgid "Error initializing SSL context" +#~ msgstr "Error inicializando contexto SSL" -#: src/lib/priv.c:124 -#, c-format -msgid "Could not set specified userid: %s\n" -msgstr "No se pudo establecer userid especificado: %s\n" +#~ msgid "Error loading certificate verification stores" +#~ msgstr "Error al cargar los almacenes de verificación del certificado" -#: src/lib/pythonlib.c:105 -msgid "Could not initialize Python\n" -msgstr "No se pudo inicializar Python\n" +#~ msgid "" +#~ "Either a certificate file or a directory must be specified as a " +#~ "verification store\n" +#~ msgstr "" +#~ "Un certificado de archivo o un directorio debe especificarse como un " +#~ "almacenes de verificación\n" -#: src/lib/pythonlib.c:110 -#, c-format -msgid "Could not Run Python string %s\n" -msgstr "No se pudo ejecutar Python cadena %s\n" +#~ msgid "Error loading certificate file" +#~ msgstr "Error cargando archivos de certificados" -#: src/lib/pythonlib.c:122 -msgid "Could not initialize Python Job type.\n" -msgstr "No se pudo inicializar Job tipo Python.\n" +#~ msgid "Error loading private key" +#~ msgstr "Error cargando llaves privadas" -#: src/lib/pythonlib.c:127 -#, c-format -msgid "Could not import Python script %s/%s. Python disabled.\n" -msgstr "No se puede importar script Python %s/%s. Python deshabilitado.\n" +#~ msgid "Unable to open DH parameters file" +#~ msgstr "No se puede abrir el archivo de parámetros de DH" -#: src/lib/pythonlib.c:229 -msgid "Could not create Python Job Object.\n" -msgstr "No es posible crear objeto Job Python.\n" +#~ msgid "Unable to load DH parameters from specified file" +#~ msgstr "" +#~ "No es posible cargar los parámetros de DH desde el archivo especificado" -#: src/lib/pythonlib.c:242 src/lib/pythonlib.c:266 -#, c-format -msgid "Python function \"%s\" not found.\n" -msgstr "Python función \"%s\" no encontrada.\n" +#~ msgid "Failed to set TLS Diffie-Hellman parameters" +#~ msgstr "No se pudo establecer parámetros TLS de Diffie-Hellman" -#: src/lib/pythonlib.c:281 -#, c-format -msgid "Unknown Python daemon event %s\n" -msgstr "Demonio Python evento %s desconocido\n" +#~ msgid "Error setting cipher list, no valid ciphers available\n" +#~ msgstr "" +#~ "Error configurando lista de cipher, no hay ciphers válidos disponibles\n" -#: src/lib/pythonlib.c:306 -#, c-format -msgid "Unable to initialize the Python lock. ERR=%s\n" -msgstr "No se puede inicializar el bloqueo de Python. ERR=%s\n" +#~ msgid "Peer failed to present a TLS certificate\n" +#~ msgstr "Par ha fallado al presentar un certificado TLS\n" -#: src/lib/res.c:54 -#, c-format -msgid "rwl_writelock failure at %s:%d: ERR=%s\n" -msgstr "Fallo rwl_writelock en %s:%d: ERR=%s\n" +#~ msgid "Peer %s failed to present a TLS certificate\n" +#~ msgstr "Par %s ha fallado al presentar un certificado TLS\n" -#: src/lib/res.c:64 -#, c-format -msgid "rwl_writeunlock failure at %s:%d:. ERR=%s\n" -msgstr "Fallo \trwl_writeunlock en %s:%d: ERR=%s\n" +#~ msgid "Error creating file descriptor-based BIO" +#~ msgstr "Error al crear archivo descriptor basado en BIO" -#: src/lib/runscript.c:225 -#, c-format -msgid "%s: run %s \"%s\"\n" -msgstr "%s: ejecutar %s \"%s\"\n" +#~ msgid "Error creating new SSL object" +#~ msgstr "Error creando nuevo objeto SSL" -#: src/lib/runscript.c:234 -#, c-format -msgid "Runscript: %s could not execute. ERR=%s\n" -msgstr "Runscript: No pudo ejecutar %s. ERR=%s\n" +#~ msgid "Connect failure" +#~ msgstr "Fallo al conectar" -#: src/lib/runscript.c:243 -#, c-format -msgid "%s: %s\n" -msgstr "%s: %s\n" +#~ msgid "TLS shutdown failure." +#~ msgstr "Error de apagado TLS." -#: src/lib/runscript.c:248 -#, c-format -msgid "Runscript: %s returned non-zero status=%d. ERR=%s\n" -msgstr "Runscript: %s devolvió estado=%d distinto de cero. ERR=%s\n" +#~ msgid "TLS read/write failure." +#~ msgstr "Error de lectura/escritura TLS." -#: src/lib/rwlock.c:291 -msgid "rwl_writeunlock called too many times.\n" -msgstr "rwl_writeunlock llamado muchas veces.\n" +#~ msgid "Running" +#~ msgstr "Ejecutando" -#: src/lib/rwlock.c:296 -msgid "rwl_writeunlock by non-owner.\n" -msgstr "rwl_writeunlock por no-propietario.\n" +#~ msgid "Blocked" +#~ msgstr "Bloqueado" -#: src/lib/sellist.c:58 #, fuzzy -msgid "Negative numbers not permitted.\n" -msgstr "Números negativos no permitidos.\n" +#~ msgid "Incomplete job" +#~ msgstr "Job insertado" -#: src/lib/sellist.c:84 -#, fuzzy -msgid "User cancel requested.\n" -msgstr "Restauración cancelada.\n" +#~ msgid "Non-fatal error" +#~ msgstr "No Fatal Error" -#: src/lib/sellist.c:107 -#, fuzzy -msgid "Selection items must be be greater than zero.\n" -msgstr "Los valores deben ser ser mayor que cero.\n" +#~ msgid "Canceled" +#~ msgstr "Cancelado" -#: src/lib/signal.c:57 -msgid "Invalid signal number" -msgstr "Número de la señal no válida" +#~ msgid "Verify differences" +#~ msgstr "Verificar diferencias" -#: src/lib/signal.c:147 src/lib/signal.c:149 -#, c-format -msgid "Bacula interrupted by signal %d: %s\n" -msgstr "Bacula interrumpido por señal %d: %s\n" +#~ msgid "Waiting on FD" +#~ msgstr "Esperando al FD" -#: src/lib/signal.c:165 -#, fuzzy, c-format -msgid "Kaboom! %s, %s got signal %d - %s at %s. Attempting traceback.\n" -msgstr "Kaboom! %s, %s obtuvo la señal %d - %s. Intentando rastreo.\n" +#~ msgid "Wait on SD" +#~ msgstr "Espere al SD" -#: src/lib/signal.c:167 -#, c-format -msgid "Kaboom! exepath=%s\n" -msgstr "Kaboom! exepath=%s\n" +#~ msgid "Wait for new Volume" +#~ msgstr "Espere por un nuevo Volumen" -#: src/lib/signal.c:208 -#, c-format -msgid "Fork error: ERR=%s\n" -msgstr "Fork error: ERR=%s\n" +#~ msgid "Waiting for mount" +#~ msgstr "Esperando por montaje" -#: src/lib/signal.c:216 -#, c-format -msgid "Calling: %s %s %s %s\n" -msgstr "Llamando: %s %s %s %s\n" +#~ msgid "Waiting for Storage resource" +#~ msgstr "Esperando al recurso Storage" -#: src/lib/signal.c:220 -#, c-format -msgid "execv: %s failed: ERR=%s\n" -msgstr "execv: %s ha fallado: ERR=%s\n" +#~ msgid "Waiting for Job resource" +#~ msgstr "Esperando al recurso Job" -#: src/lib/signal.c:242 -#, fuzzy, c-format -msgid "It looks like the traceback worked...\n" -msgstr "Parece que el rastreo trabaja ...\n" +#~ msgid "Waiting for Client resource" +#~ msgstr "Esperando al recurso Cliente" -#: src/lib/signal.c:244 -#, c-format -msgid "The btraceback call returned %d\n" -msgstr "" +#~ msgid "Waiting on Max Jobs" +#~ msgstr "Esperando el máximo Jobs" -#: src/lib/signal.c:304 -#, c-format -msgid "BA_NSIG too small (%d) should be (%d)\n" -msgstr "BA_NSIG demasiado pequeño (%d) debe ser (%d)\n" +#~ msgid "Waiting for Start Time" +#~ msgstr "Esperando a Hora de Inicio" -#: src/lib/signal.c:310 -msgid "UNKNOWN SIGNAL" -msgstr "SEÑAL DESCONOCIDA" +#~ msgid "Waiting on Priority" +#~ msgstr "Esperando por prioridad" -#: src/lib/signal.c:311 -msgid "Hangup" -msgstr "Colgar" +#~ msgid "Unknown Job termination status=%d" +#~ msgstr "Estado de terminación de Job desconocido=%d" -#: src/lib/signal.c:312 -msgid "Interrupt" -msgstr "Interrumpir" +#~ msgid "Completed successfully" +#~ msgstr "Se ha completado con éxito" -#: src/lib/signal.c:313 -msgid "Quit" -msgstr "Salir" +#~ msgid "Completed with warnings" +#~ msgstr "Completado con advertencias" -#: src/lib/signal.c:314 -msgid "Illegal instruction" -msgstr "Instrucción ilegal" +#~ msgid "Terminated with errors" +#~ msgstr "Terminado con errores" -#: src/lib/signal.c:315 -msgid "Trace/Breakpoint trap" -msgstr "Trace/Trampa de Punto de Interrupción" +#~ msgid "Fatal error" +#~ msgstr "Error fatal" -#: src/lib/signal.c:316 -msgid "Abort" -msgstr "Anular" +#~ msgid "Created, not yet running" +#~ msgstr "Creado, aún no se ejecuta" -#: src/lib/signal.c:318 -msgid "EMT instruction (Emulation Trap)" -msgstr "Instrucción EMT (Emulación de Trampa)" +#~ msgid "Canceled by user" +#~ msgstr "Cancelada por el usuario" -#: src/lib/signal.c:321 -msgid "IOT trap" -msgstr "trampa IOT" +#~ msgid "Verify found differences" +#~ msgstr "Verificar diferencias encontradas" -#: src/lib/signal.c:323 -msgid "BUS error" -msgstr "BUS error" +#~ msgid "Waiting for File daemon" +#~ msgstr "Esperando por demonio File" -#: src/lib/signal.c:324 -msgid "Floating-point exception" -msgstr "Excepción de punto flotante" +#~ msgid "Waiting for Storage daemon" +#~ msgstr "Esperando por demonio Storage" -#: src/lib/signal.c:325 -msgid "Kill, unblockable" -msgstr "Matar, imbloqueable" +#~ msgid "Waiting for higher priority jobs" +#~ msgstr "Esperando por trabajos de mayor prioridad" -#: src/lib/signal.c:326 -msgid "User-defined signal 1" -msgstr "Señal 1 definida por el usuario" +#~ msgid "Batch inserting file records" +#~ msgstr "Insertando registros de archivo en lote" -#: src/lib/signal.c:327 -msgid "Segmentation violation" -msgstr "Violación de segmento" +#~ msgid "Fatal Error" +#~ msgstr "Error Fatal" -#: src/lib/signal.c:328 -msgid "User-defined signal 2" -msgstr "Señal definida por el usuario 2" +#~ msgid "Differences" +#~ msgstr "Diferencias" -#: src/lib/signal.c:329 -msgid "Broken pipe" -msgstr "Tuberí­a rota" +#~ msgid "Unknown term code" +#~ msgstr "Código del término desconocido" -#: src/lib/signal.c:330 -msgid "Alarm clock" -msgstr "Alarma" +#~ msgid "Migrated Job" +#~ msgstr "Jod de Migración" -#: src/lib/signal.c:331 -msgid "Termination" -msgstr "Terminación" +#~ msgid "Verify" +#~ msgstr "Verificar" -#: src/lib/signal.c:333 -msgid "Stack fault" -msgstr "Error de pila" +#~ msgid "Restore" +#~ msgstr "Restaurar" -#: src/lib/signal.c:335 -msgid "Child status has changed" -msgstr "El estado de hijo ha cambiado" +#~ msgid "Console" +#~ msgstr "Consola" -#: src/lib/signal.c:336 -msgid "Continue" -msgstr "Continue" +#~ msgid "System or Console" +#~ msgstr "Sistema o Consola" -#: src/lib/signal.c:337 -msgid "Stop, unblockable" -msgstr "Detener, imbloqueable" +#~ msgid "Admin" +#~ msgstr "Admin" -#: src/lib/signal.c:338 -msgid "Keyboard stop" -msgstr "Teclado detenido" +#~ msgid "Archive" +#~ msgstr "Archivo" -#: src/lib/signal.c:339 -msgid "Background read from tty" -msgstr "Leer en segundo plan desde tty" +#~ msgid "Job Copy" +#~ msgstr "Job de Copia" -#: src/lib/signal.c:340 -msgid "Background write to tty" -msgstr "Escribir en segundo plan al tty" +#~ msgid "Copy" +#~ msgstr "Copiar" -#: src/lib/signal.c:341 -msgid "Urgent condition on socket" -msgstr "Condición de urgencia en el socket" +#~ msgid "Migrate" +#~ msgstr "Migrar" -#: src/lib/signal.c:342 -msgid "CPU limit exceeded" -msgstr "Limite de CPU superado" +#~ msgid "Scan" +#~ msgstr "Escanear" -#: src/lib/signal.c:343 -msgid "File size limit exceeded" -msgstr "Superado el límite de tamaño de archivo" +#~ msgid "Unknown Type" +#~ msgstr "Tipo Desconocido" -#: src/lib/signal.c:344 -msgid "Virtual alarm clock" -msgstr "Despertador virtual" +#~ msgid "Truncate" +#~ msgstr "Truncar" -#: src/lib/signal.c:345 -msgid "Profiling alarm clock" -msgstr "Perfiles de alarma" +#~ msgid "Base" +#~ msgstr "Base" -#: src/lib/signal.c:346 -msgid "Window size change" -msgstr "Cambiar el tamaño de la ventana" +#~ msgid "Verify Init Catalog" +#~ msgstr "Verificar Catálogo Inicial" -#: src/lib/signal.c:347 -msgid "I/O now possible" -msgstr "I/O posible ahora" +#~ msgid "Verify Data" +#~ msgstr "Verificar Datos" -#: src/lib/signal.c:349 -msgid "Power failure restart" -msgstr "Fallo reiniciar energía" +#~ msgid "Virtual Full" +#~ msgstr "Virtual completa" -#: src/lib/signal.c:352 -msgid "No runnable lwp" -msgstr "LWP no ejecutable" +#~ msgid "Unknown Job Level" +#~ msgstr "Nivel del Job desconocido" -#: src/lib/signal.c:355 -msgid "SIGLWP special signal used by thread library" -msgstr "La señal especial SIGLWP utilizado por la biblioteca del hilo" +#~ msgid "Append" +#~ msgstr "Añadir" -#: src/lib/signal.c:358 -msgid "Checkpoint Freeze" -msgstr "Checkpoint de Congelación" +#~ msgid "Disabled" +#~ msgstr "Inhabilitado" -#: src/lib/signal.c:361 -msgid "Checkpoint Thaw" -msgstr "Checkpoint de Thaw" +#~ msgid "Used" +#~ msgstr "Usado" -#: src/lib/signal.c:364 -msgid "Thread Cancellation" -msgstr "Cancelación de Hilo" +#~ msgid "Cleaning" +#~ msgstr "Limpieza" -#: src/lib/signal.c:367 -msgid "Resource Lost (e.g. record-lock lost)" -msgstr "Recurso Perdido (por ejemplo, registro de bloqueo perdido)" +#~ msgid "Purged" +#~ msgstr "Purga" -#: src/lib/smartall.c:134 src/lib/smartall.c:247 src/lib/smartall.c:262 -msgid "Out of memory\n" -msgstr "Fuera de memoria\n" +#~ msgid "Recycle" +#~ msgstr "Reciclar" -#: src/lib/smartall.c:139 -msgid "Too much memory used." -msgstr "Demasiada memoria utilizada." +#~ msgid "Read-Only" +#~ msgstr "Sólo-Lectura" -#: src/lib/smartall.c:171 -#, c-format -msgid "Attempt to free NULL called from %s:%d\n" -msgstr "Intento para liberar NULL llamado desde %s:%d\n" +#~ msgid "Invalid volume status" +#~ msgstr "Invalido estado de volumen" -#: src/lib/smartall.c:185 -#, fuzzy, c-format -msgid "in-use bit not set: double free from %s:%d\n" -msgstr "doble libre desde %s:%d\n" +#~ msgid "Working directory not defined. Cannot continue.\n" +#~ msgstr "Directorio de trabajo no definido. No se puede continuar.\n" -#: src/lib/smartall.c:193 -#, c-format -msgid "qp->qnext->qprev != qp called from %s:%d\n" -msgstr "qp->qnext->qprev != qp llamado desde %s:%d\n" +#~ msgid "Working Directory: \"%s\" not found. Cannot continue.\n" +#~ msgstr "" +#~ "Directorio de Trabajo: \"%s\" no encontrado. No se puede continuar.\n" -#: src/lib/smartall.c:197 -#, c-format -msgid "qp->qprev->qnext != qp called from %s:%d\n" -msgstr "qp->qprev->qnext != qp llamado desde %s:%d\n" +#~ msgid "Working Directory: \"%s\" is not a directory. Cannot continue.\n" +#~ msgstr "" +#~ "Directorio de Trabajo: \"%s\" no es un directorio. No se puede " +#~ "continuar.\n" -#: src/lib/smartall.c:206 -#, c-format -msgid "Overrun buffer: len=%d addr=%p allocated: %s:%d called from %s:%d\n" -msgstr "" +#~ msgid "everything ok" +#~ msgstr "todo bien" -#: src/lib/smartall.c:284 -#, c-format -msgid "sm_realloc size: %d\n" -msgstr "sm_realloc tamaño: %d\n" +#~ msgid "incomplete named character" +#~ msgstr "carácter nombrado incompleto" -#: src/lib/smartall.c:322 -#, c-format -msgid "sm_realloc %d at %p from %s:%d\n" -msgstr "sm_realloc %d en %p desde %s:%d\n" +#~ msgid "incomplete hexadecimal value" +#~ msgstr "valor hexadecimal incompleto" -#: src/lib/smartall.c:382 -#, c-format -msgid "" -"\n" -"Orphaned buffers exist. Dump terminated following\n" -" discovery of bad links in chain of orphaned buffers.\n" -" Buffer address with bad links: %p\n" -msgstr "" -"\n" -"Buffers huérfanos existen. Volcado terminado tras el\n" -"descubrimiento de malos vínculos en la cadena de buffers huérfanos.\n" -" Dirección del buffer con enlaces malos: %p\n" +#~ msgid "invalid hexadecimal value" +#~ msgstr "valor hexadecimal inválido" -#: src/lib/smartall.c:427 -#, c-format -msgid "Damaged buffer found. Called from %s:%d\n" -msgstr "Búfer dañado encontrado. Llamado desde %s:%d\n" +#~ msgid "octal value too large" +#~ msgstr "valor octal demasiado grande" -#: src/lib/smartall.c:460 -#, c-format -msgid "" -"\n" -"Damaged buffers found at %s:%d\n" -msgstr "" -"\n" -"Búfers dañado encontrado en %s:%d\n" +#~ msgid "invalid octal value" +#~ msgstr "valor octal inválido" -#: src/lib/smartall.c:463 -msgid " discovery of bad prev link.\n" -msgstr "descubrimiento de un malo vínculo anterior.\n" +#~ msgid "incomplete octal value" +#~ msgstr "valor octal incompleto" -#: src/lib/smartall.c:466 -msgid " discovery of bad next link.\n" -msgstr "descubrimiento del siguiente malo enlace malo.\n" +#~ msgid "incomplete grouped hexadecimal value" +#~ msgstr "valor hexadecimal agrupado incompleto" -#: src/lib/smartall.c:469 -msgid " discovery of data overrun.\n" -msgstr "descubrimiento de datos de rebosamiento.\n" +#~ msgid "incorrect character class specification" +#~ msgstr "incorrecta especificación de clase de caracteres" -#: src/lib/smartall.c:472 -msgid " NULL pointer.\n" -msgstr "Puntero NULL.\n" +#~ msgid "invalid expansion configuration" +#~ msgstr "configuración de expansión inválido" -#: src/lib/smartall.c:478 -#, c-format -msgid " Buffer address: %p\n" -msgstr "Dirección de buffer : %p\n" +#~ msgid "out of memory" +#~ msgstr "sin memoria" -#: src/lib/smartall.c:485 -#, c-format -msgid "Damaged buffer: %6u bytes allocated at line %d of %s %s\n" -msgstr "Búfer dañados: %6u bytes asignados en la línea %d de %s %s\n" +#~ msgid "incomplete variable specification" +#~ msgstr "especificación de la variable incompleta" -#: src/lib/status.h:86 -msgid "===================================================================\n" -msgstr "===================================================================\n" +#~ msgid "undefined variable" +#~ msgstr "variable no definida" -#: src/lib/tls.c:81 -#, c-format -msgid "" -"Error with certificate at depth: %d, issuer = %s, subject = %s, ERR=%d:%s\n" -msgstr "" -"Error con el certificado en profundidad: %d, emisor=%s, asunto=%s, ERR=%d:" -"%s\n" +#~ msgid "input is neither text nor variable" +#~ msgstr "de entrada no es ni texto ni variable" -#: src/lib/tls.c:118 -msgid "Error initializing SSL context" -msgstr "Error inicializando contexto SSL" +#~ msgid "unknown command character in variable" +#~ msgstr "carácter de comando desconocido en la variable" -#: src/lib/tls.c:139 -msgid "Error loading certificate verification stores" -msgstr "Error al cargar los almacenes de verificación del certificado" +#~ msgid "malformatted search and replace operation" +#~ msgstr "mal-formada operación de búsqueda y reemplazo" -#: src/lib/tls.c:144 -msgid "" -"Either a certificate file or a directory must be specified as a verification " -"store\n" -msgstr "" -"Un certificado de archivo o un directorio debe especificarse como un " -"almacenes de verificación\n" +#~ msgid "unknown flag in search and replace operation" +#~ msgstr "bandera desconocida en operación de búsqueda y reemplazo" -#: src/lib/tls.c:155 -msgid "Error loading certificate file" -msgstr "Error cargando archivos de certificados" +#~ msgid "invalid regex in search and replace operation" +#~ msgstr "regex no válida en operación de búsqueda y reemplazo" -#: src/lib/tls.c:163 -msgid "Error loading private key" -msgstr "Error cargando llaves privadas" +#~ msgid "missing parameter in command" +#~ msgstr "faltan parámetros en el comando" -#: src/lib/tls.c:171 -msgid "Unable to open DH parameters file" -msgstr "No se puede abrir el archivo de parámetros de DH" +#~ msgid "empty search string in search and replace operation" +#~ msgstr "palabra de búsqueda vacía en operación de búsqueda y reemplazo" -#: src/lib/tls.c:177 -msgid "Unable to load DH parameters from specified file" -msgstr "" -"No es posible cargar los parámetros de DH desde el archivo especificado" +#~ msgid "start offset missing in cut operation" +#~ msgstr "inicio offset ausente en operación de corte" -#: src/lib/tls.c:181 -msgid "Failed to set TLS Diffie-Hellman parameters" -msgstr "No se pudo establecer parámetros TLS de Diffie-Hellman" +#~ msgid "offsets in cut operation delimited by unknown character" +#~ msgstr "offset en operación de corte delimitado por carácter desconocido" -#: src/lib/tls.c:191 -msgid "Error setting cipher list, no valid ciphers available\n" -msgstr "" -"Error configurando lista de cipher, no hay ciphers válidos disponibles\n" +#~ msgid "range out of bounds in cut operation" +#~ msgstr "rango fuera de límites en operaciones de corte" -#: src/lib/tls.c:250 -msgid "Peer failed to present a TLS certificate\n" -msgstr "Par ha fallado al presentar un certificado TLS\n" +#~ msgid "offset out of bounds in cut operation" +#~ msgstr "desplazamiento fuera de límites en operaciones de corte" -#: src/lib/tls.c:296 src/lib/tls.c:297 -#, c-format -msgid "Peer %s failed to present a TLS certificate\n" -msgstr "Par %s ha fallado al presentar un certificado TLS\n" +#~ msgid "logic error in cut operation" +#~ msgstr "error lógico en la operación de corte" -#: src/lib/tls.c:429 -msgid "Error creating file descriptor-based BIO" -msgstr "Error al crear archivo descriptor basado en BIO" +#~ msgid "malformatted transpose operation" +#~ msgstr "malformación en operación de transposición" -#: src/lib/tls.c:440 -msgid "Error creating new SSL object" -msgstr "Error creando nuevo objeto SSL" +#~ msgid "source and target class mismatch in transpose operation" +#~ msgstr "" +#~ "clase de origen y de destino desajustada en operación de transposición" -#: src/lib/tls.c:509 src/lib/tls.c:532 -msgid "Connect failure" -msgstr "Fallo al conectar" +#~ msgid "empty character class in transpose operation" +#~ msgstr "clase de caracteres vacía en operación de transposición" -#: src/lib/tls.c:612 src/lib/tls.c:616 -msgid "TLS shutdown failure." -msgstr "Error de apagado TLS." +#~ msgid "incorrect character class in transpose operation" +#~ msgstr "clase de caracteres incorrectos en la operación adaptación" -#: src/lib/tls.c:677 src/lib/tls.c:703 -msgid "TLS read/write failure." -msgstr "Error de lectura/escritura TLS." +#~ msgid "malformatted padding operation" +#~ msgstr "malformación en operación de relleno" -#: src/lib/util.c:259 -msgid "Running" -msgstr "Ejecutando" +#~ msgid "width parameter missing in padding operation" +#~ msgstr "parámetro de anchura ausente en la operación de relleno" -#: src/lib/util.c:262 -msgid "Blocked" -msgstr "Bloqueado" +#~ msgid "fill string missing in padding operation" +#~ msgstr "cadena de llenado ausente en la operación de relleno" -#: src/lib/util.c:268 -#, fuzzy -msgid "Incomplete job" -msgstr "Job insertado" +#~ msgid "unknown quoted pair in search and replace operation" +#~ msgstr "par de citado desconocido en operación de búsqueda y reemplazo" -#: src/lib/util.c:275 -msgid "Non-fatal error" -msgstr "No Fatal Error" +#~ msgid "sub-matching reference out of range" +#~ msgstr "referencia de sub-coincidente fuera de rango" -#: src/lib/util.c:281 src/lib/util.c:416 -msgid "Canceled" -msgstr "Cancelado" +#~ msgid "invalid argument" +#~ msgstr "argumento invalido" -#: src/lib/util.c:284 -msgid "Verify differences" -msgstr "Verificar diferencias" +#~ msgid "incomplete quoted pair" +#~ msgstr "par de la cita incompleta" -#: src/lib/util.c:287 -msgid "Waiting on FD" -msgstr "Esperando al FD" +#~ msgid "lookup function does not support variable arrays" +#~ msgstr "función de búsqueda no soporta conjuntos de variables" -#: src/lib/util.c:290 -msgid "Wait on SD" -msgstr "Espere al SD" +#~ msgid "index of array variable contains an invalid character" +#~ msgstr "índice de la variable de matriz contiene un carácter inválido" -#: src/lib/util.c:293 -msgid "Wait for new Volume" -msgstr "Espere por un nuevo Volumen" +#~ msgid "index of array variable is incomplete" +#~ msgstr "índice de la variable de matriz está incompleta" -#: src/lib/util.c:296 -msgid "Waiting for mount" -msgstr "Esperando por montaje" +#~ msgid "bracket expression in array variable's index not closed" +#~ msgstr "expresión de corchetes en el índice variable de matriz no cerrado" -#: src/lib/util.c:299 -msgid "Waiting for Storage resource" -msgstr "Esperando al recurso Storage" +#~ msgid "division by zero error in index specification" +#~ msgstr "Error de división por cero en especificación del índice" -#: src/lib/util.c:302 -msgid "Waiting for Job resource" -msgstr "Esperando al recurso Job" +#~ msgid "unterminated loop construct" +#~ msgstr "no terminado la construcción de bucle" -#: src/lib/util.c:305 -msgid "Waiting for Client resource" -msgstr "Esperando al recurso Cliente" +#~ msgid "invalid character in loop limits" +#~ msgstr "carácter no válido en el bucle de límites" -#: src/lib/util.c:308 -msgid "Waiting on Max Jobs" -msgstr "Esperando el máximo Jobs" +#~ msgid "malformed operation argument list" +#~ msgstr "lista de argumentos de operación mal formada " -#: src/lib/util.c:311 -msgid "Waiting for Start Time" -msgstr "Esperando a Hora de Inicio" +#~ msgid "undefined operation" +#~ msgstr "operación no definida" -#: src/lib/util.c:314 -msgid "Waiting on Priority" -msgstr "Esperando por prioridad" +#~ msgid "formatting failure" +#~ msgstr "Error de formato" -#: src/lib/util.c:333 -#, c-format -msgid "Unknown Job termination status=%d" -msgstr "Estado de terminación de Job desconocido=%d" +#~ msgid "unknown error" +#~ msgstr "error desconocido" + +#~ msgid "Unable to initialize watchdog lock. ERR=%s\n" +#~ msgstr "No se puede inicializar bloqueo de vigilancia. ERR=%s\n" -#: src/lib/util.c:349 -msgid "Completed successfully" -msgstr "Se ha completado con éxito" +#~ msgid "BUG! register_watchdog called before start_watchdog\n" +#~ msgstr "BUG! register_watchdog llamado antes de start_watchdog\n" -#: src/lib/util.c:352 -msgid "Completed with warnings" -msgstr "Completado con advertencias" +#~ msgid "BUG! Watchdog %p has NULL callback\n" +#~ msgstr "BUG! Watchdog %p tiene llamada NULL\n" -#: src/lib/util.c:355 -msgid "Terminated with errors" -msgstr "Terminado con errores" +#~ msgid "BUG! Watchdog %p has zero interval\n" +#~ msgstr "BUG! Watchdog %p tiene intervalo cero \n" -#: src/lib/util.c:358 -msgid "Fatal error" -msgstr "Error fatal" +#~ msgid "BUG! unregister_watchdog_unlocked called before start_watchdog\n" +#~ msgstr "ERROR! unregister_watchdog_unlocked llamado antes start_watchdog\n" -#: src/lib/util.c:361 -msgid "Created, not yet running" -msgstr "Creado, aún no se ejecuta" +#~ msgid "rwl_writelock failure. ERR=%s\n" +#~ msgstr "rwl_writelock failure. ERR=%s\n" -#: src/lib/util.c:364 -msgid "Canceled by user" -msgstr "Cancelada por el usuario" +#~ msgid "rwl_writeunlock failure. ERR=%s\n" +#~ msgstr "rwl_writeunlock failure. ERR=%s\n" + +#, fuzzy +#~ msgid "Can't use replace=ifnewer with Delta plugin on %s\n" +#~ msgstr "No se puede unescapar cadena: ERR=%s\n" -#: src/lib/util.c:367 -msgid "Verify found differences" -msgstr "Verificar diferencias encontradas" +#, fuzzy +#~ msgid "Can't use replace=ifolder with Delta plugin on %s\n" +#~ msgstr "No se puede unescapar cadena: ERR=%s\n" -#: src/lib/util.c:370 -msgid "Waiting for File daemon" -msgstr "Esperando por demonio File" +#, fuzzy +#~ msgid "Can't run command %s. ERR=%s\n" +#~ msgstr "No se puede ejecutar el programa: %s. ERR=%s\n" -#: src/lib/util.c:373 -msgid "Waiting for Storage daemon" -msgstr "Esperando por demonio Storage" +#, fuzzy +#~ msgid "Can't create working directory %s. ERR=%s\n" +#~ msgstr "No se puede crear directorio %s: ERR=%s\n" -#: src/lib/util.c:376 -msgid "Waiting for higher priority jobs" -msgstr "Esperando por trabajos de mayor prioridad" +#, fuzzy +#~ msgid "Can't delete working directory %s. ERR=%s\n" +#~ msgstr "No se puede crear directorio %s: ERR=%s\n" -#: src/lib/util.c:379 -msgid "Batch inserting file records" -msgstr "Insertando registros de archivo en lote" +#, fuzzy +#~ msgid "Unknown parameter or missing argument for %s.\n" +#~ msgstr "Estado del Analizador %d desconocido\n" -#: src/lib/util.c:413 -msgid "Fatal Error" -msgstr "Error Fatal" +#, fuzzy +#~ msgid "Unknown parameter for %s. Expecting block or file\n" +#~ msgstr "Estado del Analizador %d desconocido\n" -#: src/lib/util.c:419 -msgid "Differences" -msgstr "Diferencias" +#, fuzzy +#~ msgid "Unknown parameter %s.\n" +#~ msgstr "Estado del Analizador %d desconocido\n" -#: src/lib/util.c:422 -msgid "Unknown term code" -msgstr "Código del término desconocido" +#, fuzzy +#~ msgid "Can't analyse plugin command line\n" +#~ msgstr "No se puede usar comando %s en un runscript" -#: src/lib/util.c:441 -msgid "Migrated Job" -msgstr "Jod de Migración" +#, fuzzy +#~ msgid "Unable to access guest volume\n" +#~ msgstr "No se puede truncar el dispositivo %s. ERR=%s\n" -#: src/lib/util.c:444 -msgid "Verify" -msgstr "Verificar" +#, fuzzy +#~ msgid "Unable to create temporary file %s. ERR=%s\n" +#~ msgstr "No se puede crear el archivo bootstrap %s. ERR=%s\n" -#: src/lib/util.c:447 -msgid "Restore" -msgstr "Restaurar" +#, fuzzy +#~ msgid "Can't use mode=%s in MySQL plugin\n" +#~ msgstr "No se puede unescapar cadena: ERR=%s\n" -#: src/lib/util.c:450 -msgid "Console" -msgstr "Consola" +#, fuzzy +#~ msgid "Unable to fdopen file %s. ERR=%s\n" +#~ msgstr "No se puede abrir el archivo \"%s\": ERR=%s\n" -#: src/lib/util.c:453 -msgid "System or Console" -msgstr "Sistema o Consola" +#, fuzzy +#~ msgid " Dumping database \"%s\"\n" +#~ msgstr "No se puede abrir la base de datos \"%s\".\n" -#: src/lib/util.c:456 -msgid "Admin" -msgstr "Admin" +#, fuzzy +#~ msgid "Unable to detect the MySQL data_directory on this system.\n" +#~ msgstr "No se puede mknode xattr %s en el archivo \"%s\": ERR=%s\n" -#: src/lib/util.c:459 src/lib/util.c:549 -msgid "Archive" -msgstr "Archivo" +#, fuzzy +#~ msgid "Unable to determine the last binlog %s\n" +#~ msgstr "No se puede escribir en %s\n" -#: src/lib/util.c:462 -msgid "Job Copy" -msgstr "Job de Copia" +#, fuzzy +#~ msgid "Can't get server configuration.\n" +#~ msgstr "Cambio del archivo de configuración" -#: src/lib/util.c:465 -msgid "Copy" -msgstr "Copiar" +#, fuzzy +#~ msgid "Unable to get the BINLOG list.\n" +#~ msgstr "No se puede crear hilo. ERR=%s\n" -#: src/lib/util.c:468 -msgid "Migrate" -msgstr "Migrar" +#, fuzzy +#~ msgid "Unable to determine the last LSN for %s (Previous job is %s)\n" +#~ msgstr "No se puede escribir en %s\n" -#: src/lib/util.c:471 -msgid "Scan" -msgstr "Escanear" +#, fuzzy +#~ msgid "Unable to detect datadir from MySQL\n" +#~ msgstr "No se puede crear hilo. ERR=%s\n" -#: src/lib/util.c:475 -msgid "Unknown Type" -msgstr "Tipo Desconocido" +#, fuzzy +#~ msgid "Unable to get last LSN from the backup\n" +#~ msgstr "No se puede obtener el registro Job para JobId=%s: ERR=%s\n" -#: src/lib/util.c:485 -msgid "Truncate" -msgstr "Truncar" +#, fuzzy +#~ msgid "The current LSN is %s\n" +#~ msgstr "Pool actual es: %s\n" -#: src/lib/util.c:502 -msgid "Base" -msgstr "Base" +#, fuzzy +#~ msgid "Restoring target database \"%s\"\n" +#~ msgstr "No se puede abrir la base de datos \"%s\".\n" -#: src/lib/util.c:520 -msgid "Verify Init Catalog" -msgstr "Verificar Catálogo Inicial" +#, fuzzy +#~ msgid "Creating target database \"%s\"\n" +#~ msgstr "No se puede abrir la base de datos \"%s\".\n" -#: src/lib/util.c:529 -msgid "Verify Data" -msgstr "Verificar Datos" +#, fuzzy +#~ msgid "Database \"%s\" already exists. Skipping creation.\n" +#~ msgstr "No existe base de datos %s, por favor crearla.\n" -#: src/lib/util.c:532 -msgid "Virtual Full" -msgstr "Virtual completa" +#, fuzzy +#~ msgid "Unable to parse or to use plugin options, %s\n" +#~ msgstr "No se puede abrir xattr %s en \"%s\": ERR=%s\n" -#: src/lib/util.c:538 -msgid "Unknown Job Level" -msgstr "Nivel del Job desconocido" +#, fuzzy +#~ msgid "Unknown parameter or bad argument for %s.\n" +#~ msgstr "Estado del Analizador %d desconocido\n" -#: src/lib/util.c:548 -msgid "Append" -msgstr "Añadir" +#, fuzzy +#~ msgid "Can't use mode=%s in postgresql plugin\n" +#~ msgstr "No se puede unescapar cadena: ERR=%s\n" -#: src/lib/util.c:550 -msgid "Disabled" -msgstr "Inhabilitado" +#, fuzzy +#~ msgid "Can't use service=%s in postgresql plugin ERR=%s\n" +#~ msgstr "No se puede unescapar cadena: ERR=%s\n" -#: src/lib/util.c:552 -msgid "Used" -msgstr "Usado" +#, fuzzy +#~ msgid "Can't get cluster configuration.\n" +#~ msgstr "Cambio del archivo de configuración" -#: src/lib/util.c:553 -msgid "Cleaning" -msgstr "Limpieza" +#, fuzzy +#~ msgid "Can't determine the last WAL file\n" +#~ msgstr "No se puede escribir en %s\n" -#: src/lib/util.c:554 -msgid "Purged" -msgstr "Purga" +#, fuzzy +#~ msgid "Can't determine WAL directory\n" +#~ msgstr "No se puede crear directorio %s: ERR=%s\n" -#: src/lib/util.c:555 -msgid "Recycle" -msgstr "Reciclar" +#, fuzzy +#~ msgid "Can't open WAL directory %s. ERR=%s\n" +#~ msgstr "No se puede crear directorio %s: ERR=%s\n" -#: src/lib/util.c:556 -msgid "Read-Only" -msgstr "Sólo-Lectura" +#, fuzzy +#~ msgid "Unable to detect the PostgreSQL data_directory on this system.\n" +#~ msgstr "No se puede mknode xattr %s en el archivo \"%s\": ERR=%s\n" -#: src/lib/util.c:568 -msgid "Invalid volume status" -msgstr "Invalido estado de volumen" +#, fuzzy +#~ msgid "Unable to find data_directory=%s on this system. ERR=%s\n" +#~ msgstr "No se puede mknode xattr %s en el archivo \"%s\": ERR=%s\n" -#: src/lib/util.c:956 -msgid "Working directory not defined. Cannot continue.\n" -msgstr "Directorio de trabajo no definido. No se puede continuar.\n" +#, fuzzy +#~ msgid "Unable to start the PITR backup on this system.\n" +#~ msgstr "No se puede mknode xattr %s en el archivo \"%s\": ERR=%s\n" -#: src/lib/util.c:959 -#, c-format -msgid "Working Directory: \"%s\" not found. Cannot continue.\n" -msgstr "Directorio de Trabajo: \"%s\" no encontrado. No se puede continuar.\n" +#, fuzzy +#~ msgid "Unable to determine the first WAL file on this system.\n" +#~ msgstr "No se puede mknode xattr %s en el archivo \"%s\": ERR=%s\n" -#: src/lib/util.c:963 -#, c-format -msgid "Working Directory: \"%s\" is not a directory. Cannot continue.\n" -msgstr "" -"Directorio de Trabajo: \"%s\" no es un directorio. No se puede continuar.\n" +#, fuzzy +#~ msgid "Unable to analyse tablespaces %s on this system. ERR=%s\n" +#~ msgstr "No se puede abrir espacio xattr %s en el archivo \"%s\": ERR=%s\n" -#: src/lib/var.c:2659 -msgid "everything ok" -msgstr "todo bien" +#, fuzzy +#~ msgid "Unable to analyse data_directory %s on this system. ERR=%s\n" +#~ msgstr "No se puede abrir xattr %s en el archivo \"%s\": ERR=%s\n" -#: src/lib/var.c:2660 -msgid "incomplete named character" -msgstr "carácter nombrado incompleto" +#, fuzzy +#~ msgid "Can't create the %s file for recovery. ERR=%s\n" +#~ msgstr "No es posible crear registro media. ERR=%s\n" -#: src/lib/var.c:2661 -msgid "incomplete hexadecimal value" -msgstr "valor hexadecimal incompleto" +#, fuzzy +#~ msgid "3612 JobId=%u waiting because device %s is reserved by: %s.\n" +#~ msgstr "" +#~ "3605 JobId=%u requiere la unidad disponible, pero el dispositivo %s está " +#~ "ocupado.\n" -#: src/lib/var.c:2662 -msgid "invalid hexadecimal value" -msgstr "valor hexadecimal inválido" +#, fuzzy +#~ msgid "" +#~ "3998 Bad return from storage \"%s\" command: ERR=%s.\n" +#~ "Results=%s\n" +#~ msgstr "" +#~ "3991 Malo comando auto-cambiador comando \"cargar? unidad %d\": ERR=%s\n" +#~ "Resultados=%s\n" -#: src/lib/var.c:2663 -msgid "octal value too large" -msgstr "valor octal demasiado grande" +#~ msgid "Acquire read: num_writers=%d not zero. Job %d canceled.\n" +#~ msgstr "Adquirir leer: num_writers=%d no es cero. Empleo %d cancelado.\n" -#: src/lib/var.c:2664 -msgid "invalid octal value" -msgstr "valor octal inválido" +#~ msgid "No volumes specified for reading. Job %s canceled.\n" +#~ msgstr "No se especifica el volumen de lectura. Job %s cancelado.\n" -#: src/lib/var.c:2665 -msgid "incomplete octal value" -msgstr "valor octal incompleto" +#~ msgid "Logic error: no next volume to read. Numvol=%d Curvol=%d\n" +#~ msgstr "" +#~ "Error logico: no hay prójimo volumen para leer. Numvol=%d Curvol=%d\n" -#: src/lib/var.c:2666 -msgid "incomplete grouped hexadecimal value" -msgstr "valor hexadecimal agrupado incompleto" +#, fuzzy +#~ msgid "" +#~ "Changing read device. Want Media Type=\"%s\" have=\"%s\"\n" +#~ " %s device=%s\n" +#~ msgstr "" +#~ "Cambiando dispositivo de lectura. Media Type=\"%s\" tiene=\"%s\"\n" +#~ " dispositivo=%s\n" -#: src/lib/var.c:2667 -msgid "incorrect character class specification" -msgstr "incorrecta especificación de clase de caracteres" +#, fuzzy +#~ msgid "Media Type change. New read %s device %s chosen.\n" +#~ msgstr "Cambio Media Type. Nuevo dispositivo de lectura %s elegido.\n" -#: src/lib/var.c:2668 -msgid "invalid expansion configuration" -msgstr "configuración de expansión inválido" +#~ msgid "No suitable device found to read Volume \"%s\"\n" +#~ msgstr "No encuentra dispositivo adecuado para leer Volumen \"%s\"\n" -#: src/lib/var.c:2669 -msgid "out of memory" -msgstr "sin memoria" +#~ msgid "Job %s canceled.\n" +#~ msgstr "Job %s cancelado.\n" -#: src/lib/var.c:2670 -msgid "incomplete variable specification" -msgstr "especificación de la variable incompleta" +#, fuzzy +#~ msgid "Read open %s device %s Volume \"%s\" failed: ERR=%s\n" +#~ msgstr "Fallo al leer dispositivo %s abierto, Volumen \"%s\": ERR=%s\n" -#: src/lib/var.c:2671 -msgid "undefined variable" -msgstr "variable no definida" +#, fuzzy +#~ msgid "Too many errors trying to mount %s device %s for reading.\n" +#~ msgstr "" +#~ "Demasiados errores tratando de montar el dispositivo %s para la lectura.\n" -#: src/lib/var.c:2672 -msgid "input is neither text nor variable" -msgstr "de entrada no es ni texto ni variable" +#, fuzzy +#~ msgid "Ready to read from volume \"%s\" on %s device %s.\n" +#~ msgstr "Listo para leer desde volumen \"%s\" en el dispositivo %s.\n" -#: src/lib/var.c:2673 -msgid "unknown command character in variable" -msgstr "carácter de comando desconocido en la variable" +#, fuzzy +#~ msgid "Could not ready %s device %s for append.\n" +#~ msgstr "Dispositivo %s puede no está listo para anexar.\n" -#: src/lib/var.c:2674 -msgid "malformatted search and replace operation" -msgstr "mal-formada operación de búsqueda y reemplazo" +#~ msgid "Could not create JobMedia record for Volume=\"%s\" Job=%s\n" +#~ msgstr "" +#~ "No es posible crear el registro JobMedia para Volumen=\"%s\" Job=%s\n" -#: src/lib/var.c:2675 -msgid "unknown flag in search and replace operation" -msgstr "bandera desconocida en operación de búsqueda y reemplazo" +#~ msgid "Alert: %s" +#~ msgstr "Alerta: %s" -#: src/lib/var.c:2676 -msgid "invalid regex in search and replace operation" -msgstr "regex no válida en operación de búsqueda y reemplazo" +#~ msgid "3997 Bad alert command: %s: ERR=%s.\n" +#~ msgstr "3997 Malo comando alerta: %s: ERR=%s.\n" -#: src/lib/var.c:2677 -msgid "missing parameter in command" -msgstr "faltan parámetros en el comando" +#~ msgid "Could not initialize %s\n" +#~ msgstr "No se puede iniciar %s\n" -#: src/lib/var.c:2678 -msgid "empty search string in search and replace operation" -msgstr "palabra de búsqueda vacía en operación de búsqueda y reemplazo" +#, fuzzy +#~ msgid "Error closing device %s. ERR=%s.\n" +#~ msgstr "Error leyendo archivo %s: ERR=%s\n" -#: src/lib/var.c:2679 -msgid "start offset missing in cut operation" -msgstr "inicio offset ausente en operación de corte" +#~ msgid "No FreeSpace command defined.\n" +#~ msgstr "Comando FreeSpace no definido.\n" -#: src/lib/var.c:2680 -msgid "offsets in cut operation delimited by unknown character" -msgstr "offset en operación de corte delimitado por carácter desconocido" +#~ msgid "Cannot run free space command. Results=%s ERR=%s\n" +#~ msgstr "" +#~ "No se puede ejecutar comando de espacio libre. Resultados=%s ERR=%s\n" -#: src/lib/var.c:2681 -msgid "range out of bounds in cut operation" -msgstr "rango fuera de límites en operaciones de corte" +#~ msgid "Sanity check failed. maxlen=%d datalen=%d. Block discarded.\n" +#~ msgstr "" +#~ "Chequeo de Sanidad fracasado. maxlen=%d datalen=%d. Bloque descartado.\n" -#: src/lib/var.c:2682 -msgid "offset out of bounds in cut operation" -msgstr "desplazamiento fuera de límites en operaciones de corte" +#~ msgid "Read error on device %s in ANSI label. ERR=%s\n" +#~ msgstr "Error de lectura en el dispositivo %s en la etiqueta ANSI. ERR=%s\n" -#: src/lib/var.c:2683 -msgid "logic error in cut operation" -msgstr "error lógico en la operación de corte" +#~ msgid "Insane! End of tape while reading ANSI label.\n" +#~ msgstr "Insano! Fin de la cinta mientras leía la etiqueta ANSI.\n" -#: src/lib/var.c:2684 -msgid "malformatted transpose operation" -msgstr "malformación en operación de transposición" +#~ msgid "No VOL1 label while reading ANSI/IBM label.\n" +#~ msgstr "Ninguna etiqueta VOL1 al leer etiqueta ANSI/IBM.\n" -#: src/lib/var.c:2685 -msgid "source and target class mismatch in transpose operation" -msgstr "clase de origen y de destino desajustada en operación de transposición" +#~ msgid "Wanted ANSI Volume \"%s\" got \"%s\"\n" +#~ msgstr "Buscando volumen ANSI \"%s\" obtuvo \"%s\"\n" -#: src/lib/var.c:2686 -msgid "empty character class in transpose operation" -msgstr "clase de caracteres vacía en operación de transposición" +#~ msgid "No HDR1 label while reading ANSI label.\n" +#~ msgstr "Ninguna etiqueta HDR1 al leer etiqueta ANSI.\n" -#: src/lib/var.c:2687 -msgid "incorrect character class in transpose operation" -msgstr "clase de caracteres incorrectos en la operación adaptación" +#~ msgid "ANSI/IBM Volume \"%s\" does not belong to Bacula.\n" +#~ msgstr "Volumen \"%s\" ANSI/IBM, no pertenece a Bacula.\n" -#: src/lib/var.c:2688 -msgid "malformatted padding operation" -msgstr "malformación en operación de relleno" +#~ msgid "No HDR2 label while reading ANSI/IBM label.\n" +#~ msgstr "Ninguna etiqueta HDR2 al leer etiqueta ANSI/IBM.\n" -#: src/lib/var.c:2689 -msgid "width parameter missing in padding operation" -msgstr "parámetro de anchura ausente en la operación de relleno" +#~ msgid "Unknown or bad ANSI/IBM label record.\n" +#~ msgstr "Registro de etiqueta ANSI/IBM desconocido o malo.\n" -#: src/lib/var.c:2690 -msgid "fill string missing in padding operation" -msgstr "cadena de llenado ausente en la operación de relleno" +#~ msgid "Too many records in while reading ANSI/IBM label.\n" +#~ msgstr "Demasiados registros mientras leía etiqueta ANSI/IBM.\n" -#: src/lib/var.c:2691 -msgid "unknown quoted pair in search and replace operation" -msgstr "par de citado desconocido en operación de búsqueda y reemplazo" +#~ msgid "ANSI Volume label name \"%s\" longer than 6 chars.\n" +#~ msgstr "Nombre de etiqueta de Volumen ANSI \"%s\" más de 6 caracteres.\n" -#: src/lib/var.c:2692 -msgid "sub-matching reference out of range" -msgstr "referencia de sub-coincidente fuera de rango" +#, fuzzy +#~ msgid "Could not write ANSI VOL1 label. Wanted size=%d got=%d ERR=%s\n" +#~ msgstr "No ha podido escribir etiqueta ANSI VOL1. ERR=%s\n" -#: src/lib/var.c:2693 -msgid "invalid argument" -msgstr "argumento invalido" +#~ msgid "Could not write ANSI HDR1 label. ERR=%s\n" +#~ msgstr "No ha podido escribir etiqueta ANSI HDR1. ERR=%s\n" -#: src/lib/var.c:2694 -msgid "incomplete quoted pair" -msgstr "par de la cita incompleta" +#~ msgid "Could not write ANSI HDR1 label.\n" +#~ msgstr "No se puede escribir la etiqueta ANSI HDR1.\n" -#: src/lib/var.c:2695 -msgid "lookup function does not support variable arrays" -msgstr "función de búsqueda no soporta conjuntos de variables" +#~ msgid "Error writing EOF to tape. ERR=%s" +#~ msgstr "Error al escribir EOF a la cinta. ERR=%s" -#: src/lib/var.c:2696 -msgid "index of array variable contains an invalid character" -msgstr "índice de la variable de matriz contiene un carácter inválido" +#~ msgid "write_ansi_ibm_label called for non-ANSI/IBM type\n" +#~ msgstr "write_ansi_ibm_label llamado para tipo non-ANSI/IBM\n" -#: src/lib/var.c:2697 -msgid "index of array variable is incomplete" -msgstr "índice de la variable de matriz está incompleta" +#~ msgid "DCR is NULL!!!\n" +#~ msgstr "DCR es NULL!!!\n" -#: src/lib/var.c:2698 -msgid "bracket expression in array variable's index not closed" -msgstr "expresión de corchetes en el índice variable de matriz no cerrado" +#~ msgid "DEVICE is NULL!!!\n" +#~ msgstr "DEVICE es NULL!!!\n" -#: src/lib/var.c:2699 -msgid "division by zero error in index specification" -msgstr "Error de división por cero en especificación del índice" +#~ msgid "Unable to set network buffer size.\n" +#~ msgstr "No se puede establecer el tamaño del búfer de red.\n" -#: src/lib/var.c:2700 -msgid "unterminated loop construct" -msgstr "no terminado la construcción de bucle" +#~ msgid "NULL Volume name. This shouldn't happen!!!\n" +#~ msgstr "Nombre de volumen VACÍO. Esto no debería suceder!\n" -#: src/lib/var.c:2701 -msgid "invalid character in loop limits" -msgstr "carácter no válido en el bucle de límites" +#~ msgid "Write session label failed. ERR=%s\n" +#~ msgstr "Fallo al escribir la etiqueta de sesión. ERR=%s\n" -#: src/lib/var.c:2702 -msgid "malformed operation argument list" -msgstr "lista de argumentos de operación mal formada " +#~ msgid "Network send error to FD. ERR=%s\n" +#~ msgstr "Error de red al enviar a FD. ERR=%s\n" -#: src/lib/var.c:2703 -msgid "undefined operation" -msgstr "operación no definida" +#, fuzzy +#~ msgid "Error reading data header from FD. n=%d msglen=%d ERR=%s\n" +#~ msgstr "Error al leer datos de cabecera de FD. ERR=%s\n" -#: src/lib/var.c:2704 -msgid "formatting failure" -msgstr "Error de formato" +#~ msgid "Malformed data header from FD: %s\n" +#~ msgstr "Datos de cabecera mal formados desde FD: %s\n" -#: src/lib/var.c:2713 -msgid "unknown error" -msgstr "error desconocido" +#, fuzzy +#~ msgid "FI=%d from FD not positive or last_FI=%d\n" +#~ msgstr "Archivo de índice de FD no es positivo o secuencial\n" -#: src/lib/watchdog.c:85 -#, c-format -msgid "Unable to initialize watchdog lock. ERR=%s\n" -msgstr "No se puede inicializar bloqueo de vigilancia. ERR=%s\n" +#~ msgid "Network error reading from FD. ERR=%s\n" +#~ msgstr "Error al leer la red desde FD. ERR=%s\n" -#: src/lib/watchdog.c:182 -msgid "BUG! register_watchdog called before start_watchdog\n" -msgstr "BUG! register_watchdog llamado antes de start_watchdog\n" +#, fuzzy +#~ msgid "DDE commit failed. ERR=%s\n" +#~ msgstr "prctl fallido: ERR=%s\n" -#: src/lib/watchdog.c:185 -#, c-format -msgid "BUG! Watchdog %p has NULL callback\n" -msgstr "BUG! Watchdog %p tiene llamada NULL\n" +#~ msgid "Fatal append error on device %s: ERR=%s\n" +#~ msgstr "Error Fatal añadiendo en el dispositivo %s: ERR=%s\n" -#: src/lib/watchdog.c:188 -#, c-format -msgid "BUG! Watchdog %p has zero interval\n" -msgstr "BUG! Watchdog %p tiene intervalo cero \n" +#~ msgid "Set ok=FALSE after write_block_to_device.\n" +#~ msgstr "Set ok=FALSE después de write_block_to_device.\n" -#: src/lib/watchdog.c:208 -msgid "BUG! unregister_watchdog_unlocked called before start_watchdog\n" -msgstr "ERROR! unregister_watchdog_unlocked llamado antes start_watchdog\n" +#~ msgid "Error writing end session label. ERR=%s\n" +#~ msgstr "Error escribiendo etiqueta de fin de sesión. ERR=%s\n" -#: src/lib/watchdog.c:328 -#, c-format -msgid "rwl_writelock failure. ERR=%s\n" -msgstr "rwl_writelock failure. ERR=%s\n" +#, fuzzy +#~ msgid "Set ok=FALSE after write_final_block_to_device.\n" +#~ msgstr "Set ok=FALSE después de write_block_to_device.\n" -#: src/lib/watchdog.c:343 -#, c-format -msgid "rwl_writeunlock failure. ERR=%s\n" -msgstr "rwl_writeunlock failure. ERR=%s\n" +#, fuzzy +#~ msgid "Elapsed time=%02d:%02d:%02d, Transfer rate=%s Bytes/second\n" +#~ msgstr "" +#~ "Tiempo transcurrido de escritura del Job = %02d:%02d:%02d, Tasa de " +#~ "transferencia = %s Bytes/segundo\n" -#: src/lib/xml.c:407 -msgid "Malformed XML expecting start of tag.\n" -msgstr "" +#~ msgid "Error updating file attributes. ERR=%s\n" +#~ msgstr "Error al actualizar los atributos de archivo. ERR=%s\n" -#: src/lib/xml.c:460 -msgid "Bad file start bytes (utf8 bom).\n" -msgstr "" +#~ msgid "Network error on bnet_recv in req_vol_info.\n" +#~ msgstr "Error de red en bnet_recv en req_vol_info.\n" -#: src/lib/xml.c:472 -msgid "Bad file start bytes (utf16 bom).\n" -msgstr "" +#~ msgid "Error getting Volume info: %s" +#~ msgstr "Error al obtener Volumen información: %s" -#: src/plugins/fd/delta-fd.c:1359 -#, fuzzy, c-format -msgid "Can't use replace=ifnewer with Delta plugin on %s\n" -msgstr "No se puede unescapar cadena: ERR=%s\n" +#~ msgid "Didn't get vol info vol=%s: ERR=%s" +#~ msgstr "no recibió información de volumen vol=%s: ERR=%s" -#: src/plugins/fd/delta-fd.c:1366 -#, fuzzy, c-format -msgid "Can't use replace=ifolder with Delta plugin on %s\n" -msgstr "No se puede unescapar cadena: ERR=%s\n" +#~ msgid "Error creating JobMedia record: ERR=%s\n" +#~ msgstr "Error al crear registro JobMedia: ERR=%s\n" -#: src/plugins/fd/delta-fd.c:1376 -#, c-format -msgid "" -"Can't restore %s, file already exists. Delta plugin doesn't support " -"replace=never option\n" -msgstr "" +#~ msgid "Error creating JobMedia record: %s\n" +#~ msgstr "Error al crear registro JobMedia: %s\n" -#: src/plugins/fd/hvplugin.c:698 src/plugins/fd/mysql-fd.c:1178 -#: src/plugins/fd/postgresql-fd.c:731 -#, fuzzy, c-format -msgid "Can't run command %s. ERR=%s\n" -msgstr "No se puede ejecutar el programa: %s. ERR=%s\n" +#~ msgid "Job %s canceled while waiting for mount on Storage Device \"%s\".\n" +#~ msgstr "" +#~ "Job %s cancelado a la espera de montar el dispositivo Storage \"%s\".\n" -#: src/plugins/fd/hvplugin.c:844 -#, fuzzy, c-format -msgid "Can't create working directory %s. ERR=%s\n" -msgstr "No se puede crear directorio %s: ERR=%s\n" +#, fuzzy +#~ msgid "" +#~ "Job %s is waiting. Cannot find any appendable volumes.\n" +#~ "Please use the \"label\" command to create a new Volume for:\n" +#~ " Storage: %s\n" +#~ " Pool: %s\n" +#~ " Media type: %s\n" +#~ msgstr "" +#~ "Job %s en espera. No se puede encontrar ningún volumen grabable.\n" +#~ "Por favor utilice el comando \"label\" para crear un nuevo Volumen para:\n" +#~ "Storage: %s\n" +#~ "Pool: %s\n" +#~ "Tipo de Media: %s\n" -#: src/plugins/fd/hvplugin.c:864 -#, fuzzy, c-format -msgid "Can't delete working directory %s. ERR=%s\n" -msgstr "No se puede crear directorio %s: ERR=%s\n" +#~ msgid "Max time exceeded waiting to mount Storage Device %s for Job %s\n" +#~ msgstr "" +#~ "Tiempo máximo de espera excedido para montar dispositivo Storage %s para " +#~ "el Job %s\n" -#: src/plugins/fd/hvplugin.c:1007 src/plugins/fd/mysql-fd.c:1496 -#, fuzzy, c-format -msgid "Unknown parameter or missing argument for %s.\n" -msgstr "Estado del Analizador %d desconocido\n" +#~ msgid "pthread error in mount_next_volume.\n" +#~ msgstr "pthread error en mount_next_volume.\n" -#: src/plugins/fd/hvplugin.c:1046 -#, fuzzy, c-format -msgid "Unknown parameter for %s. Expecting block or file\n" -msgstr "Estado del Analizador %d desconocido\n" +#~ msgid "Cannot request another volume: no volume name given.\n" +#~ msgstr "No puede solicitar otro volumen: nombre de volumen no entregado.\n" -#: src/plugins/fd/hvplugin.c:1051 src/plugins/fd/mysql-fd.c:1573 -#: src/plugins/fd/postgresql-fd.c:1035 -#, fuzzy, c-format -msgid "Unknown parameter %s.\n" -msgstr "Estado del Analizador %d desconocido\n" +#~ msgid "Job %s canceled while waiting for mount on Storage Device %s.\n" +#~ msgstr "Job %s cancelado a la espera de montar el dispositivo Storage %s.\n" -#: src/plugins/fd/hvplugin.c:1217 src/plugins/fd/hvplugin.c:1231 -#: src/plugins/fd/hvplugin.c:1261 src/plugins/fd/mysql-fd.c:2813 -#: src/plugins/fd/mysql-fd.c:2841 src/plugins/fd/mysql-fd.c:3171 -#: src/plugins/fd/postgresql-fd.c:2198 src/plugins/fd/postgresql-fd.c:2220 -#: src/plugins/fd/postgresql-fd.c:2478 #, fuzzy -msgid "Can't analyse plugin command line\n" -msgstr "No se puede usar comando %s en un runscript" +#~ msgid "" +#~ "%sPlease mount append Volume \"%s\" or label a new one for:\n" +#~ " Job: %s\n" +#~ " Storage: %s\n" +#~ " Pool: %s\n" +#~ " Media type: %s\n" +#~ msgstr "" +#~ "Por favor, montar Volumen \"%s\" o etiquete uno nuevo para :\n" +#~ " Job: %s\n" +#~ " Storage: %s\n" +#~ " Pool: %s\n" +#~ " Media type: %s\n" -#: src/plugins/fd/hvplugin.c:1221 #, fuzzy -msgid "Unable to access guest volume\n" -msgstr "No se puede truncar el dispositivo %s. ERR=%s\n" - -#: src/plugins/fd/hvplugin.c:1238 -msgid "The hvplugin plugin doesn't support regexwhere parameter.\n" -msgstr "" +#~ msgid "" +#~ "%sPlease mount read Volume \"%s\" for:\n" +#~ " Job: %s\n" +#~ " Storage: %s\n" +#~ " Pool: %s\n" +#~ " Media type: %s\n" +#~ msgstr "" +#~ "Por favor, montar el volumen \"%s\" for:\n" +#~ " Job: %s\n" +#~ " Storage: %s\n" +#~ " Pool: %s\n" +#~ " Media type: %s\n" -#: src/plugins/fd/hvplugin.c:1271 -msgid "" -"The hvplugin plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=hvplugin command in the\n" -"Include {} block.\n" -msgstr "" +#~ msgid "pthread error in mount_volume\n" +#~ msgstr "pthread error en mount_volume\n" -#: src/plugins/fd/mysql-fd.c:824 -#, c-format -msgid "Found MASTER_LOG position %s:%lld for \"%s\"\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Incorrect password given by Director.\n" +#~ "For help, please see: " +#~ msgstr "Contraseña incorrecta dada por el Director en %s.\n" -#: src/plugins/fd/mysql-fd.c:868 -#, c-format -msgid "Unable to get MySQL version %s, might cause errors\n" -msgstr "" +#~ msgid "TLS negotiation failed with DIR at \"%s:%d\"\n" +#~ msgstr "Fallida la negociación TLS con DIR en \"%s:%d\"\n" -#: src/plugins/fd/mysql-fd.c:961 -#, c-format -msgid "Can't reach MySQL server to get database list. ERR=%d\n" -msgstr "" +#~ msgid "Unable to authenticate Director at %s.\n" +#~ msgstr "No se puede autenticar Director en %s.\n" -#: src/plugins/fd/mysql-fd.c:1069 -#, c-format -msgid "Can't reach MySQL server to get database config. ERR=%d\n" -msgstr "" +#~ msgid "TLS negotiation failed with FD at \"%s:%d\"\n" +#~ msgstr "Fallida la negociación TLS con FD en \"%s:%d\"\n" -#: src/plugins/fd/mysql-fd.c:1267 src/plugins/fd/mysql-fd.c:1290 -#: src/plugins/fd/mysql-fd.c:1302 src/plugins/fd/mysql-fd.c:1356 -#: src/plugins/fd/mysql-fd.c:1669 src/plugins/fd/postgresql-fd.c:1167 -#, fuzzy, c-format -msgid "Unable to create temporary file %s. ERR=%s\n" -msgstr "No se puede crear el archivo bootstrap %s. ERR=%s\n" +#~ msgid "No Changer Name given for device %s. Cannot continue.\n" +#~ msgstr "" +#~ "Ningún Nombre Changer obtenido para el dispositivo %s. No se puede " +#~ "continuar.\n" -#: src/plugins/fd/mysql-fd.c:1527 -#, c-format -msgid "Invalid argument for %s. Expecting tar or xbstream\n" -msgstr "" +#~ msgid "No Changer Command given for device %s. Cannot continue.\n" +#~ msgstr "" +#~ "Ningún Comando Changer obtenido para el dispositivo %s. No se puede " +#~ "continuar.\n" -#: src/plugins/fd/mysql-fd.c:1531 -msgid "" -"bin_format=tar is incompatible with Incremental backup. Using xbstream " -"instead\n" -msgstr "" +#, fuzzy +#~ msgid "No slot defined in catalog (slot=%d) for Volume \"%s\" on %s.\n" +#~ msgstr "" +#~ "Invalida ranura=%d definida en el catálogo para volumen \"%s\" en %s. " +#~ "Carga manual puede ser requerida.\n" -#: src/plugins/fd/mysql-fd.c:1547 -#, fuzzy, c-format -msgid "Can't use mode=%s in MySQL plugin\n" -msgstr "No se puede unescapar cadena: ERR=%s\n" +#~ msgid "" +#~ "No \"Changer Device\" for %s. Manual load of Volume may be required.\n" +#~ msgstr "" +#~ "Ninguno \"Dispositivo Changer\" para %s. Carga manual de volumen puede " +#~ "ser requerido.\n" -#: src/plugins/fd/mysql-fd.c:1584 -msgid "Unable to detect where my.cnf is located. Use config_file=" -msgstr "" +#~ msgid "" +#~ "No \"Changer Command\" for %s. Manual load of Volume may be requird.\n" +#~ msgstr "" +#~ "Ninguno \"Comando Changer\" para %s. Carga manual de volumen puede ser " +#~ "requerido.\n" -#: src/plugins/fd/mysql-fd.c:1679 src/plugins/fd/postgresql-fd.c:1177 -#, fuzzy, c-format -msgid "Unable to fdopen file %s. ERR=%s\n" -msgstr "No se puede abrir el archivo \"%s\": ERR=%s\n" +#~ msgid "3304 Issuing autochanger \"load slot %d, drive %d\" command.\n" +#~ msgstr "" +#~ "3304 Emitiendo comando auto-cambiador \"cargar ranura %d, unidad %d\".\n" -#: src/plugins/fd/mysql-fd.c:1774 -msgid "log_bin mysqld parameter is not suitable for Incremental backup.\n" -msgstr "" +#~ msgid "3305 Autochanger \"load slot %d, drive %d\", status is OK.\n" +#~ msgstr "3305 Auto-cambiador \"carga ranura %d, unidad %d\", estado es OK.\n" -#: src/plugins/fd/mysql-fd.c:1776 -msgid "Generating Full dump instead...\n" -msgstr "" +#~ msgid "" +#~ "3992 Bad autochanger \"load slot %d, drive %d\": ERR=%s.\n" +#~ "Results=%s\n" +#~ msgstr "" +#~ "2992 Malo Auto-cambiador \"carga ranura %d, unidad %d\": ERR=%s.\n" +#~ "Resultados=%s\n" -#: src/plugins/fd/mysql-fd.c:2039 -#, fuzzy, c-format -msgid " Dumping database \"%s\"\n" -msgstr "No se puede abrir la base de datos \"%s\".\n" +#~ msgid "3301 Issuing autochanger \"loaded? drive %d\" command.\n" +#~ msgstr "3301 Emitiendo comando auto-cambiador \"¿cargado? unidad %d\".\n" -#: src/plugins/fd/mysql-fd.c:2181 -#, fuzzy -msgid "Unable to detect the MySQL data_directory on this system.\n" -msgstr "No se puede mknode xattr %s en el archivo \"%s\": ERR=%s\n" +#~ msgid "3302 Autochanger \"loaded? drive %d\", result is Slot %d.\n" +#~ msgstr "" +#~ "3302 Auto-cambiador \"¿cargado? unidad %d\", el resultado es Ranura %d.\n" -#: src/plugins/fd/mysql-fd.c:2188 -#, c-format -msgid "Configuration of log_bin=%s is not suitable for PITR backup.\n" -msgstr "" +#~ msgid "3302 Autochanger \"loaded? drive %d\", result: nothing loaded.\n" +#~ msgstr "" +#~ "3302 Auto-cambiador \"¿cargado? unidad %d\", resultado: nada cargado.\n" -#: src/plugins/fd/mysql-fd.c:2217 -#, fuzzy, c-format -msgid "Unable to determine the last binlog %s\n" -msgstr "No se puede escribir en %s\n" +#~ msgid "" +#~ "3991 Bad autochanger \"loaded? drive %d\" command: ERR=%s.\n" +#~ "Results=%s\n" +#~ msgstr "" +#~ "3991 Malo comando auto-cambiador comando \"cargar? unidad %d\": ERR=%s\n" +#~ "Resultados=%s\n" -#: src/plugins/fd/mysql-fd.c:2269 #, fuzzy -msgid "Can't get server configuration.\n" -msgstr "Cambio del archivo de configuración" +#~ msgid "Lock failure on autochanger. ERR=%s\n" +#~ msgstr "Error bloqueando Mutex. ERR=%s\n" -#: src/plugins/fd/mysql-fd.c:2290 #, fuzzy -msgid "Unable to get the BINLOG list.\n" -msgstr "No se puede crear hilo. ERR=%s\n" +#~ msgid "Unlock failure on autochanger. ERR=%s\n" +#~ msgstr "Error desbloqueando Mutex. ERR=%s\n" -#: src/plugins/fd/mysql-fd.c:2375 -#, c-format -msgid "" -"Unable to read %s. ERR=%s\n" -"Check permissions and/or use config_file parameter.\n" -msgstr "" +#~ msgid "3307 Issuing autochanger \"unload slot %d, drive %d\" command.\n" +#~ msgstr "" +#~ "3307 Emitiendo comando auto-cambiador \"descargar ranura %d, unidad %d\"\n" -#: src/plugins/fd/mysql-fd.c:2418 -#, fuzzy, c-format -msgid "Unable to determine the last LSN for %s (Previous job is %s)\n" -msgstr "No se puede escribir en %s\n" +#~ msgid "" +#~ "3995 Bad autochanger \"unload slot %d, drive %d\": ERR=%s\n" +#~ "Results=%s\n" +#~ msgstr "" +#~ "3995 Malo comando auto-cambiador \"descargar ranura %d, unidad %d\": ERR=" +#~ "%s\n" +#~ "Resultados=%s\n" -#: src/plugins/fd/mysql-fd.c:2426 -#, c-format -msgid "Will use LSN=%s for the current backup\n" -msgstr "" +#~ msgid "Volume \"%s\" wanted on %s is in use by device %s\n" +#~ msgstr "Volumen \"%s\" buscado en %s está en uso por el dispositivo %s\n" -#: src/plugins/fd/mysql-fd.c:2461 #, fuzzy -msgid "Unable to detect datadir from MySQL\n" -msgstr "No se puede crear hilo. ERR=%s\n" +#~ msgid "3997 Bad autochanger \"unload slot %d, drive %d\": ERR=%s.\n" +#~ msgstr "" +#~ "3995 Malo comando auto-cambiador \"descargar ranura %d, unidad %d\": ERR=" +#~ "%s.\n" -#: src/plugins/fd/mysql-fd.c:2507 -#, fuzzy -msgid "Unable to get last LSN from the backup\n" -msgstr "No se puede obtener el registro Job para JobId=%s: ERR=%s\n" +#~ msgid "3993 Device %s not an autochanger device.\n" +#~ msgstr "3993 Dispositivo %s no es un dispositivo auto-cargador.\n" -#: src/plugins/fd/mysql-fd.c:2512 -#, fuzzy, c-format -msgid "The current LSN is %s\n" -msgstr "Pool actual es: %s\n" +#~ msgid "3306 Issuing autochanger \"%s\" command.\n" +#~ msgstr "3306 Emitiendo comando \"%s\" al auto-cambiador.\n" -#: src/plugins/fd/mysql-fd.c:2866 -msgid "" -"The MySQL plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=mysql command in the\n" -"Include {} block.\n" -msgstr "" +#~ msgid "3996 Open bpipe failed.\n" +#~ msgstr "3996 Fallo al abrir bpipe.\n" -#: src/plugins/fd/mysql-fd.c:3250 src/plugins/fd/postgresql-fd.c:2698 -msgid "replace=ifnewer/ifolder are not supported, switching to replace=never\n" -msgstr "" +#~ msgid "Autochanger error: ERR=%s\n" +#~ msgstr "Auto-cambiador error: ERR=%s\n" -#: src/plugins/fd/mysql-fd.c:3294 src/plugins/fd/postgresql-fd.c:2739 -#: src/plugins/fd/postgresql-fd.c:2802 -#, c-format -msgid "" -"Database \"%s\" already exists, can't replace it when using replace=never\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bcopy [-d debug_level] \n" +#~ " -b bootstrap specify a bootstrap file\n" +#~ " -c specify a Storage configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -i specify input Volume names (separated by |)\n" +#~ " -o specify output Volume names (separated by |)\n" +#~ " -p proceed inspite of errors\n" +#~ " -v verbose\n" +#~ " -w specify working directory (default /tmp)\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Versión: %s (%s)\n" +#~ "\n" +#~ "Utilice: bcopy [-d nivel_ depuración] \n" +#~ " -b bootstrap especifica un archivo bootstrap\n" +#~ " -c especifica un archivo Storage de configuración\n" +#~ " -d establece nivel de depuración para \n" +#~ " -dt imprime timestamp en salida de depuración\n" +#~ " -i especifica nombres de Volúmenes de entrada (separados por |)\n" +#~ " -o especifica nombres de Volúmenes de salida (separados por |)\n" +#~ " -p proceder a pesar de los errores\n" +#~ "\n" +#~ " -v detallado\n" +#~ " -w especifica directorio de trabajo (por defecto /tmp)\n" +#~ " -? imprime esta mensaje\n" +#~ "\n" -#: src/plugins/fd/mysql-fd.c:3310 -#, fuzzy, c-format -msgid "Restoring target database \"%s\"\n" -msgstr "No se puede abrir la base de datos \"%s\".\n" +#~ msgid "Wrong number of arguments: \n" +#~ msgstr "Incorrecto numero de argumentos: \n" -#: src/plugins/fd/mysql-fd.c:3327 src/plugins/fd/postgresql-fd.c:2771 -msgid "Re-creating roles, may produce errors if roles already exist\n" -msgstr "" +#~ msgid "dev open failed: %s\n" +#~ msgstr "Fallo al abrir dev: %s\n" -#: src/plugins/fd/mysql-fd.c:3335 -#, fuzzy, c-format -msgid "Creating target database \"%s\"\n" -msgstr "No se puede abrir la base de datos \"%s\".\n" +#~ msgid "Write of last block failed.\n" +#~ msgstr "Fallo al escribir ultimo bloque.\n" -#: src/plugins/fd/mysql-fd.c:3346 -#, fuzzy, c-format -msgid "Database \"%s\" already exists. Skipping creation.\n" -msgstr "No existe base de datos %s, por favor crearla.\n" +#~ msgid "%u Jobs copied. %u records copied.\n" +#~ msgstr "%u Jobs copiado. %u registros copiados.\n" -#: src/plugins/fd/mysql-fd.c:3351 -msgid "" -"To restore all databases from a single dump file, use replace=always restore " -"option." -msgstr "" +#~ msgid "Record: SessId=%u SessTim=%u FileIndex=%d Stream=%d len=%u\n" +#~ msgstr "Registro: SessId=%u SessTim=%u FileIndex=%d Stream=%d len=%u\n" -#: src/plugins/fd/mysql-fd.c:3355 -msgid "" -"To restore all databases from a single dump file, use where=/ restore option." -msgstr "" +#~ msgid "Volume is prelabeled. This volume cannot be copied.\n" +#~ msgstr "Volumen esta pre-etiquetado. Este volumen no puede ser copiado.\n" -#: src/plugins/fd/mysql-fd.c:3358 -msgid "Restoring all databases from all-databases.sql file\n" -msgstr "" +#~ msgid "Volume label not copied.\n" +#~ msgstr "Etiqueta Volumen no copiada.\n" -#: src/plugins/fd/mysql-fd.c:3379 -msgid "" -"bin-log should be restored separately as files using where=/a/directory and " -"applied using mysqlbinlog program and MASTER_LOG position found in the " -"restore log.\n" -msgstr "" +#~ msgid "Copy skipped. Record does not match BSR filter.\n" +#~ msgstr "Copia omitida. Registro no coincide con filtro de BSR.\n" -#: src/plugins/fd/mysql-fd.c:3381 -#, c-format -msgid "Skipping \"%s\".\n" -msgstr "" +#~ msgid "Cannot fixup device error. %s\n" +#~ msgstr "No se puede corregir error de dispositivo. %s\n" -#: src/plugins/fd/ndmp-fd.c:1081 -msgid "" -"Unable to get where= argument for the restore.\n" -"Using regexwhere is unsupported with the ndmp plugin.\n" -msgstr "" +#~ msgid "EOM label not copied.\n" +#~ msgstr "Etiqueta EOM no copiada.\n" -#: src/plugins/fd/ndmp-fd.c:1105 -#, fuzzy, c-format -msgid "Unable to parse or to use plugin options, %s\n" -msgstr "No se puede abrir xattr %s en \"%s\": ERR=%s\n" +#~ msgid "EOT label not copied.\n" +#~ msgstr "Etiqueta EOT no copiada.\n" -#: src/plugins/fd/ndmp-fd.c:1116 -msgid "" -"The ndmp plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=ndmp command in the\n" -"Include {} block.\n" -msgstr "" +#~ msgid "Fresh Volume Label" +#~ msgstr "Nueva Etiqueta de Volumen" -#: src/plugins/fd/postgresql-fd.c:608 -#, c-format -msgid "Can't reach PostgreSQL server to get database list. ERR=%d\n" -msgstr "" +#~ msgid "Volume Label" +#~ msgstr "Etiqueta de Volumen" -#: src/plugins/fd/postgresql-fd.c:662 -#, c-format -msgid "Can't reach PostgreSQL server to get database config. ERR=%d\n" -msgstr "" +#~ msgid "Begin Job Session" +#~ msgstr "Inicio Job Sesión" -#: src/plugins/fd/postgresql-fd.c:982 -#, fuzzy, c-format -msgid "Unknown parameter or bad argument for %s.\n" -msgstr "Estado del Analizador %d desconocido\n" +#~ msgid "End Job Session" +#~ msgstr "Fin Job Sesión" -#: src/plugins/fd/postgresql-fd.c:1002 -#, fuzzy, c-format -msgid "Can't use mode=%s in postgresql plugin\n" -msgstr "No se puede unescapar cadena: ERR=%s\n" +#~ msgid "End of Medium" +#~ msgstr "Fin de Medio" -#: src/plugins/fd/postgresql-fd.c:1011 -#, fuzzy, c-format -msgid "Can't use service=%s in postgresql plugin ERR=%s\n" -msgstr "No se puede unescapar cadena: ERR=%s\n" +#~ msgid "Unknown" +#~ msgstr "Desconocido" -#: src/plugins/fd/postgresql-fd.c:1030 -#, c-format -msgid "Bad compress=%s parameter expect 0-9.\n" -msgstr "" +#~ msgid "%s Record: VolSessionId=%d VolSessionTime=%d JobId=%d DataLen=%d\n" +#~ msgstr "" +#~ "%s Registro: VolSessionId=%d VolSessionTime=%d JobId=%d DataLen=%d\n" + +#~ msgid "Mount Volume \"%s\" on device %s and press return when ready: " +#~ msgstr "" +#~ "Monte Volumen \"%s\" en el dispositivo %s y presione ENTER cuando esté " +#~ "preparado:" -#: src/plugins/fd/postgresql-fd.c:1272 #, fuzzy -msgid "Can't get cluster configuration.\n" -msgstr "Cambio del archivo de configuración" +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bextract \n" +#~ " -b specify a bootstrap file\n" +#~ " -c specify a Storage configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -T send debug traces to trace file\n" +#~ " -e exclude list\n" +#~ " -i include list\n" +#~ " -p proceed inspite of I/O errors\n" +#~ " -t read data from volume, do not write anything\n" +#~ " -v verbose\n" +#~ " -V specify Volume names (separated by |)\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Versión: %s (%s)\n" +#~ "\n" +#~ "Utilice: bextract " +#~ "\n" +#~ " -b especifica un archivo bootstrap\n" +#~ " -c especifica un archivo Storage de configuración\n" +#~ " -d establece nivel de depuración para \n" +#~ " -dt imprime timestamp en salida de depuración\n" +#~ " -e lista de exclusión\n" +#~ " -i lista de inclusión\n" +#~ " -p proceder a pesar de los errores de E/S\n" +#~ " -v detallado\n" +#~ " -V especifica nombres de Volúmenes (separados por |)\n" +#~ " -? imprime esta mensaje\n" +#~ "\n" -#: src/plugins/fd/postgresql-fd.c:1283 -msgid "Can't stop the current backup\n" -msgstr "" +#~ msgid "Could not open exclude file: %s, ERR=%s\n" +#~ msgstr "No se pudo abrir archivo excluir: %s, ERR=%s\n" -#: src/plugins/fd/postgresql-fd.c:1289 src/plugins/fd/postgresql-fd.c:1297 -#, fuzzy -msgid "Can't determine the last WAL file\n" -msgstr "No se puede escribir en %s\n" +#~ msgid "Could not open include file: %s, ERR=%s\n" +#~ msgstr "No se pudo abrir archivo incluir: %s, ERR=%s\n" + +#~ msgid "%d Program Name and/or Program Data Stream records ignored.\n" +#~ msgstr "" +#~ "Nombre del Programa %d y/o registros de Datos de Flujo del Programa " +#~ "ignorado.\n" + +#~ msgid "%d Win32 data or Win32 gzip data stream records. Ignored.\n" +#~ msgstr "" +#~ "%d registros de flujo de datos Win32 or Win32 datos gzip. Ignorados.\n" + +#~ msgid "Cannot stat %s. It must exist. ERR=%s\n" +#~ msgstr "No se puede stat %s. El debe existir. ERR=%s\n" + +#~ msgid "%s must be a directory.\n" +#~ msgstr "%s debe ser un directorio.\n" + +#~ msgid "%u files restored.\n" +#~ msgstr "%u archivos restaurados.\n" -#: src/plugins/fd/postgresql-fd.c:1312 src/plugins/fd/postgresql-fd.c:1919 #, fuzzy -msgid "Can't determine WAL directory\n" -msgstr "No se puede crear directorio %s: ERR=%s\n" +#~ msgid "Found %s error%s\n" +#~ msgstr "Encontrados %d para: %s\n" -#: src/plugins/fd/postgresql-fd.c:1319 -#, fuzzy, c-format -msgid "Can't open WAL directory %s. ERR=%s\n" -msgstr "No se puede crear directorio %s: ERR=%s\n" +#~ msgid "Write error on %s: %s\n" +#~ msgstr "Error de escritura en %s: %s\n" -#: src/plugins/fd/postgresql-fd.c:1861 -msgid "Your PostgreSQL version is too old for PITR mode\n" -msgstr "" +#~ msgid "Cannot continue.\n" +#~ msgstr "No se puede continuar.\n" + +#~ msgid "Logic error output file should be open but is not.\n" +#~ msgstr "" +#~ "Error lógico, archivo de salida debería estar abierto, pero no esta.\n" + +#~ msgid "%s was deleted.\n" +#~ msgstr "%s se ha eliminado.\n" + +#~ msgid "Seek error on %s: %s\n" +#~ msgstr "Buscar error en %s: %s\n" + +#~ msgid "Uncompression error. ERR=%d\n" +#~ msgstr "Error de descompresión. ERR=%d\n" -#: src/plugins/fd/postgresql-fd.c:1866 #, fuzzy -msgid "Unable to detect the PostgreSQL data_directory on this system.\n" -msgstr "No se puede mknode xattr %s en el archivo \"%s\": ERR=%s\n" +#~ msgid "LZO uncompression error. ERR=%d\n" +#~ msgstr "Error de descompresión. ERR=%d\n" -#: src/plugins/fd/postgresql-fd.c:1873 -#, fuzzy, c-format -msgid "Unable to find data_directory=%s on this system. ERR=%s\n" -msgstr "No se puede mknode xattr %s en el archivo \"%s\": ERR=%s\n" +#~ msgid "Got Program Name or Data Stream. Ignored.\n" +#~ msgstr "Obtener Nombre de Programa o Secuencia de Datos. Ignorado.\n" -#: src/plugins/fd/postgresql-fd.c:1882 -msgid "Configuration wal_level=minimal is not suitable for PITR backup.\n" -msgstr "" +#, fuzzy +#~ msgid "Error writing final JobMedia record to catalog.\n" +#~ msgstr "Error al escribir registro al bloque.\n" -#: src/plugins/fd/postgresql-fd.c:1892 -msgid "Configuration archive_command is not suitable for PITR backup.\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot write block. Device at EOM. dev=%s\n" +#~ msgstr "No se pudo escribir bloque. Dispositivo en EOM.\n" -#: src/plugins/fd/postgresql-fd.c:1994 #, fuzzy -msgid "Unable to start the PITR backup on this system.\n" -msgstr "No se puede mknode xattr %s en el archivo \"%s\": ERR=%s\n" +#~ msgid "Attempt to write on read-only Volume. dev=%s\n" +#~ msgstr "Intento de escritura en volumen de sólo lectura.\n" -#: src/plugins/fd/postgresql-fd.c:2000 #, fuzzy -msgid "Unable to determine the first WAL file on this system.\n" -msgstr "No se puede mknode xattr %s en el archivo \"%s\": ERR=%s\n" +#~ msgid "Attempt to write on closed device=%s\n" +#~ msgstr "Intento de escritura en volumen de sólo lectura.\n" -#: src/plugins/fd/postgresql-fd.c:2015 -#, fuzzy, c-format -msgid "Unable to analyse tablespaces %s on this system. ERR=%s\n" -msgstr "No se puede abrir espacio xattr %s en el archivo \"%s\": ERR=%s\n" +#~ msgid "Unable to write EOF. ERR=%s\n" +#~ msgstr "No se pudo escribir EOF. ERR=%s\n" -#: src/plugins/fd/postgresql-fd.c:2065 -#, fuzzy, c-format -msgid "Unable to analyse data_directory %s on this system. ERR=%s\n" -msgstr "No se puede abrir xattr %s en el archivo \"%s\": ERR=%s\n" +#~ msgid "Write block header zeroed.\n" +#~ msgstr "Escribir cabecera de bloque cero.\n" -#: src/plugins/fd/postgresql-fd.c:2245 -msgid "" -"The postgresql plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=postgresql command in the\n" -"Include {} block.\n" -msgstr "" +#~ msgid "Write error at %u:%u on device %s. ERR=%s.\n" +#~ msgstr "Error de escritura en %u:%u en el dispositivo %s. ERR=%s.\n" -#: src/plugins/fd/postgresql-fd.c:2490 -msgid "" -"You need to set PrefixLinks=Yes in your Restore job definition, or you will " -"need to fix all symlinks yourself." -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Out of freespace caused End of Volume \"%s\" at %u:%u on device %s. Write " +#~ "of %u bytes got %d.\n" +#~ msgstr "" +#~ "Fin de Volumen \"%s\" en %u:%u en el dispositivo %s. Escribió %u bytes " +#~ "obtuvo %d.\n" -#: src/plugins/fd/postgresql-fd.c:2544 -#, c-format -msgid "Creating %s to help you starting the recovery.\n" -msgstr "" +#~ msgid "" +#~ "End of Volume \"%s\" at %u:%u on device %s. Write of %u bytes got %d.\n" +#~ msgstr "" +#~ "Fin de Volumen \"%s\" en %u:%u en el dispositivo %s. Escribió %u bytes " +#~ "obtuvo %d.\n" -#: src/plugins/fd/postgresql-fd.c:2549 -#, fuzzy, c-format -msgid "Can't create the %s file for recovery. ERR=%s\n" -msgstr "No es posible crear registro media. ERR=%s\n" +#, fuzzy +#~ msgid "Job failed or canceled.\n" +#~ msgstr "Job %d cancelado.\n" -#: src/plugins/fd/postgresql-fd.c:2758 -msgid "" -"The destination database already exists,it might generate some harmless " -"error messages." -msgstr "" +#, fuzzy +#~ msgid "Attempt to read past end of tape or file.\n" +#~ msgstr "Intento de leer sesión no abierta.\n" -#: src/plugins/sd/shstore-sd.c:179 -#, fuzzy, c-format -msgid "3612 JobId=%u waiting because device %s is reserved by: %s.\n" -msgstr "" -"3605 JobId=%u requiere la unidad disponible, pero el dispositivo %s está " -"ocupado.\n" +#, fuzzy +#~ msgid "" +#~ "Attempt to read closed device: fd=%d at file:blk %u:%u on device %s\n" +#~ msgstr "" +#~ "Error de lectura en fd=%d desde archivo:blk %u:%u en el dispositivo %s. " +#~ "ERR=%s.\n" -#: src/plugins/sd/shstore-sd.c:435 -#, fuzzy, c-format -msgid "" -"3998 Bad return from storage \"%s\" command: ERR=%s.\n" -"Results=%s\n" -msgstr "" -"3991 Malo comando auto-cambiador comando \"cargar? unidad %d\": ERR=%s\n" -"Resultados=%s\n" +#~ msgid "Block buffer size looping problem on device %s\n" +#~ msgstr "Problema de tamaño de búfer del bloque en el dispositivo %s\n" -#: src/qt-console/bat_conf.cpp:144 -#, c-format -msgid "Console: name=%s\n" -msgstr "Console: nombre=%s\n" +#~ msgid "Unable to open device part=%d %s: ERR=%s\n" +#~ msgstr "No se puede abrir el dispositivo parte =%d %s: ERR=%s\n" -#: src/qt-console/bat_conf.cpp:147 -#: src/qt-console/tray-monitor/tray_conf.cpp:185 -#, c-format -msgid "ConsoleFont: name=%s font face=%s\n" -msgstr "ConsoleFont: nombre=%s font face=%s\n" +#, fuzzy +#~ msgid "The Volume=%s on device=%s appears to be unlabeled.\n" +#~ msgstr "Volumen en %s tiene una malo tipo de etiqueta Bacula: %x\n" -#: src/qt-console/bcomm/dircomm.cpp:86 -#, c-format -msgid "Already connected\"%s\".\n" -msgstr "Ya conectado\"%s\".\n" +#~ msgid "Read error on fd=%d at file:blk %u:%u on device %s. ERR=%s.\n" +#~ msgstr "" +#~ "Error de lectura en fd=%d desde archivo:blk %u:%u en el dispositivo %s. " +#~ "ERR=%s.\n" -#: src/qt-console/bcomm/dircomm.cpp:97 -#: src/qt-console/tray-monitor/tray-monitor.cpp:351 -#, c-format -msgid "Connecting to Director %s:%d" -msgstr "Conectando con Director %s:%d" +#, fuzzy +#~ msgid "Read zero %sbytes Vol=%s at %lld on device %s.\n" +#~ msgstr "Leer cero bytes en %u:%u en el dispositivo %s.\n" -#: src/qt-console/bcomm/dircomm.cpp:99 -#, c-format -msgid "" -"Connecting to Director %s:%d\n" -"\n" -msgstr "" -"Conectando con Director %s:%d\n" -"\n" +#~ msgid "" +#~ "Volume data error at %u:%u! Very short block of %d bytes on device %s " +#~ "discarded.\n" +#~ msgstr "" +#~ "Error datos de volumen en %u:%u! Bloque muy corto de %d bytes en " +#~ "dispositivo %s descartado.\n" -#: src/qt-console/bcomm/dircomm.cpp:196 -#: src/qt-console/tray-monitor/tray-monitor.cpp:356 -msgid "Director daemon" -msgstr "Servicio Director" +#~ msgid "Block length %u is greater than buffer %u. Attempting recovery.\n" +#~ msgstr "" +#~ "Longitud del bloque %u es mayor que el buffer %u. Intentando " +#~ "recuperación.\n" -#: src/qt-console/bcomm/dircomm.cpp:234 -msgid "Initializing ..." -msgstr "Inicializando ..." +#~ msgid "Setting block buffer size to %u bytes.\n" +#~ msgstr "Configurando tamaño del bufer del bloque para %u bytes.\n" -#: src/qt-console/bcomm/dircomm.cpp:250 src/qt-console/console/console.cpp:131 -msgid "Connected" -msgstr "Conectado" +#~ msgid "" +#~ "Volume data error at %u:%u! Short block of %d bytes on device %s " +#~ "discarded.\n" +#~ msgstr "" +#~ "Error datos de volumen en %u:%u! Bloque corto de %d bytes en dispositivo " +#~ "%s descartado.\n" -#: src/qt-console/bcomm/dircomm.cpp:374 -msgid "Command completed ..." -msgstr "Comando completado ..." +#, fuzzy +#~ msgid "" +#~ "Dump block %s %p: adata=%d size=%d BlkNum=%d\n" +#~ " Hdrcksum=%x cksum=%x\n" +#~ msgstr "" +#~ "Volcado de bloque %s %x: tamaño=%d BlkNum=%d\n" +#~ " Hdrcksum=%x cksum=%x\n" -#: src/qt-console/bcomm/dircomm.cpp:381 src/qt-console/console/console.cpp:368 -msgid "Processing command ..." -msgstr "Procesando comando ..." +#, fuzzy +#~ msgid " Rec: VId=%u VT=%u FI=%s Strm=%s len=%d reclen=%d\n" +#~ msgstr "Rec: VId=%u VT=%u FI=%s Strm=%s len=%d p=%x\n" -#: src/qt-console/bcomm/dircomm.cpp:388 -msgid "At main prompt waiting for input ..." -msgstr "En prompt principal esperando por una entrada..." +#~ msgid "%d block read errors not printed.\n" +#~ msgstr "%d errores de lectura de bloques no impresos.\n" -#: src/qt-console/bcomm/dircomm.cpp:395 src/qt-console/bcomm/dircomm.cpp:405 -msgid "At prompt waiting for input ..." -msgstr "En prompt esperando por una entrada..." +#, fuzzy +#~ msgid "" +#~ "Volume data error at %lld!\n" +#~ "Adata block checksum mismatch in block=%u len=%d: calc=%x blk=%x\n" +#~ msgstr "" +#~ "Error de datos de Volumen en %u:%u!\n" +#~ "Bloque checksum desajustado en bloque=%u len=%d: calc=%x blk=%x\n" -#: src/qt-console/bcomm/dircomm.cpp:413 -msgid "Command failed." -msgstr "Comando fallido." +#~ msgid "" +#~ "Volume data error at %u:%u! Wanted ID: \"%s\", got \"%s\". Buffer " +#~ "discarded.\n" +#~ msgstr "" +#~ "Error de volumen de datos en %u:%u! Se busca ID: \"%s\",se obtiene \"%s" +#~ "\". Buffer descartado.\n" -#: src/qt-console/bcomm/dircomm.cpp:485 -msgid "Director disconnected." -msgstr "Director desconectado." +#~ msgid "" +#~ "Volume data error at %u:%u! Block length %u is insane (too large), " +#~ "probably due to a bad archive.\n" +#~ msgstr "" +#~ "Error de datos de volumen en %u:%u! Longitud de bloque %u es demente " +#~ "(demasiado grande), probablemente debido a un archivo malo.\n" -#: src/qt-console/bcomm/dircomm_auth.cpp:108 -#, c-format -msgid "Director authorization problem at \"%s:%d\"\n" -msgstr "Problema de autorización de Director en \"%s:%d\"\n" +#~ msgid "" +#~ "Volume data error at %u:%u!\n" +#~ "Block checksum mismatch in block=%u len=%d: calc=%x blk=%x\n" +#~ msgstr "" +#~ "Error de datos de Volumen en %u:%u!\n" +#~ "Bloque checksum desajustado en bloque=%u len=%d: calc=%x blk=%x\n" -#: src/qt-console/bcomm/dircomm_auth.cpp:115 -#, c-format -msgid "" -"Authorization problem: Remote server at \"%s:%d\" did not advertise required " -"TLS support.\n" -msgstr "" -"Problema de autorización: El servidor remoto en \"%s:%d\" no anuncio soporte " -"TLS requiere.\n" +#, fuzzy +#~ msgid "" +#~ "User defined maximum volume size %s will be exceeded on device %s.\n" +#~ " Marking Volume \"%s\" as Full.\n" +#~ msgstr "" +#~ "Capacidad máxima %s de volumen definido por el usuario superado en el " +#~ "dispositivo %s.\n" -#: src/qt-console/bcomm/dircomm_auth.cpp:123 -#, c-format -msgid "" -"Authorization problem with Director at \"%s:%d\": Remote server requires " -"TLS.\n" -msgstr "" -"Problema de autorización con el Director en \"%s:%d\": El servidor remoto " -"requiere TLS.\n" +#~ msgid "Backspace file at EOT failed. ERR=%s\n" +#~ msgstr "Fallo en retroceso de archivo desde EOT. ERR=%s\n" -#: src/qt-console/bcomm/dircomm_auth.cpp:146 -#, c-format -msgid "" -"Bad response to Hello command: ERR=%s\n" -"The Director at \"%s:%d\" is probably not running.\n" -msgstr "" -"Mala respuesta al comando Hello: ERR=%s\n" -"El director en \"%s:%d\" probablemente no esta corriendo.\n" +#~ msgid "Backspace record at EOT failed. ERR=%s\n" +#~ msgstr "Fallo en retroceso de registro desde EOT. ERR=%s\n" -#: src/qt-console/bcomm/dircomm_auth.cpp:174 -#, fuzzy, c-format -msgid "" -"Authorization problem with Director at \"%s:%d\"\n" -"Most likely the passwords do not agree.\n" -"If you are using TLS, there may have been a certificate validation error " -"during the TLS handshake.\n" -"For help, please see " -msgstr "" -"Problema de autorización con el Director en \"%s:%d\"\n" -"Lo mas probable es que las contraseñas no están de acuerdo.\n" -"Si está usando TLS, puede haber habido un error de validación de " -"certificados durante la negociación TLS.\n" -" Por favor vea http://www.bacula.org/en/rel-manual/" -"Bacula_Freque_Asked_Questi.html#SECTION003760000000000000000 para ayuda.\n" +#~ msgid "Re-read last block at EOT failed. ERR=%s" +#~ msgstr "Fallo en re-lectura del último bloque en EOT. ERR=%s" -#: src/qt-console/main.cpp:185 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s) %s %s %s\n" -"\n" -"Usage: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" -" -c set configuration file to file\n" -" -dnn set debug level to nn\n" -" -s no signals\n" -" -t test - read configuration and exit\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Versión: %s (%s) %s %s %s\n" -"\n" -"Utilice: bat [-s] [-c archivo_de_configuración] [-d nivel_depuración " -"[archivo_de_configuración]\n" -" -c establecer archivo de configuración para el archivo\n" -" -dnn establecer el nivel de depuración a nn\n" -" -s no hay señales\n" -" -t prueba - leer la configuración y salir\n" -" -? imprimir este mensaje.\n" -"\n" +#~ msgid "" +#~ "Re-read of last block: block numbers differ by more than one.\n" +#~ "Probable tape misconfiguration and data loss. Read block=%u Want block=" +#~ "%u.\n" +#~ msgstr "" +#~ "Re-lectura del último bloque: número de bloque difieren en más de uno.\n" +#~ "Probable mala configuración de la cinta y pérdida de datos. Leer bloque=" +#~ "%u Espera bloque=%u.\n" -#: src/qt-console/tray-monitor/authenticate.cpp:76 -#, fuzzy -msgid "" -"Director authorization problem.\n" -"Most likely the passwords do not agree.\n" -"For help, please see " -msgstr "" -"Director problema de autorización.\n" -"Lo mas probable es que las contraseñas no están de acuerdo.\n" -"Por favor vea http://www.bacula.org/en/rel-manual/Bacula_Freque_Asked_Questi." -"html#SECTION003760000000000000000 para ayuda.\n" +#~ msgid "" +#~ "Re-read of last block OK, but block numbers differ. Read block=%u Want " +#~ "block=%u.\n" +#~ msgstr "" +#~ "Re-lectura del último bloque OK, pero número de bloque difieren. Leer " +#~ "bloque=%u Espera bloque=%u.\n" + +#~ msgid "Re-read of last block succeeded.\n" +#~ msgstr "Éxito en re-lectura del último bloque.\n" + +#~ msgid "" +#~ "Error writing final EOF to tape. This Volume may not be readable.\n" +#~ "%s" +#~ msgstr "" +#~ "Error al escribir EOF final a la cinta. Este volumen puede no ser " +#~ "legible.\n" +#~ "%s" -#: src/qt-console/tray-monitor/authenticate.cpp:126 #, fuzzy -msgid "" -"Director and Storage daemon passwords or names not the same.\n" -"For help, please see " -msgstr "Nombres o contraseñas en el Director o Storage no son las mismas.\n" +#~ msgid "Error sending Volume info to Director.\n" +#~ msgstr "Error al obtener Volumen información: %s" -#: src/qt-console/tray-monitor/authenticate.cpp:133 -#, c-format -msgid "bdird\n" +#~ " -b specify a bootstrap file\n" +#~ " -c specify a Storage configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -e exclude list\n" +#~ " -i include list\n" +#~ " -j list jobs\n" +#~ " -k list blocks\n" +#~ " (no j or k option) list saved files\n" +#~ " -L dump label\n" +#~ " -p proceed inspite of errors\n" +#~ " -v be verbose\n" +#~ " -V specify Volume names (separated by |)\n" +#~ " -E Check records to detect errors\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Versión: %s (%s)\n" +#~ "\n" +#~ "Utilice: bls [opciones] \n" +#~ " -b especifica un archivo bootstrap\n" +#~ " -c especifica un archivo Storage de configuración\n" +#~ " -d establece nivel de depuración para \n" +#~ " -dt imprime timestamp en salida de depuración\n" +#~ " -e lista de exclusión\n" +#~ " -i lista de inclusión\n" +#~ " -j lista de trabajos\n" +#~ " -k lista de bloques\n" +#~ " (no j o k opción) lista de archivos guardados\n" +#~ " -L dump label\n" +#~ " -p proceder a pesar de los errores\n" +#~ " -v detallado\n" +#~ " -V especifica nombres de Volumen (separados por |)\n" +#~ " -? imprime esta mensaje\n" +#~ "\n" -#: src/qt-console/tray-monitor/tray-monitor.cpp:56 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s) %s %s %s\n" -"\n" -"Usage: tray-monitor [-c config_file] [-d debug_level]\n" -" -c set configuration file to file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -t test - read configuration and exit\n" -" -? print this message.\n" -"\n" -msgstr "" -"Escrito por Nicolas Boichat (2004)\n" -"\n" -"Versión: %s (%s) %s %s %s\n" -"\n" -"Utilice: tray-monitor [-c archivo_configuración] [-d nivel_depuración]\n" -" -c establece archivo de configuración para archivo\n" -" -d establece nivel de depuración para \n" -" -dt imprime timestamp en salida de depuración\n" -" -t prueba - leer configuración y salir\n" -" -? imprimir este mensaje.\n" -"\n" +#~ msgid "No archive name specified\n" +#~ msgstr "Nombre de archivo no especificado\n" -#: src/qt-console/tray-monitor/tray-monitor.cpp:208 -#, c-format -msgid "" -"Error: %d Monitor resources defined in %s. You must define one and only one " -"Monitor resource.\n" -msgstr "" -"Error: %d Monitor de recursos definidos en %s. Usted debe definir un único " -"monitor de recursos.\n" +#~ msgid "" +#~ "\n" +#~ "Warning, this Volume is a continuation of Volume %s\n" +#~ msgstr "" +#~ "\n" +#~ "Advertencia, este Volumen es una continuación del Volumen %s\n" -#: src/qt-console/tray-monitor/tray-monitor.cpp:240 -#, c-format -msgid "" -"No Client, Storage or Director resource defined in %s\n" -"Without that I don't how to get status from the File, Storage or Director " -"Daemon :-(\n" -msgstr "" -"Ningún recurso Cliente, Storage o Director definido en %s\n" -"Sin esto, Yo no se como obtener el estado de los demonios File, Storage o " -"Director :-(\n" +#~ msgid "Got EOM at file %u on device %s, Volume \"%s\"\n" +#~ msgstr "Obtuvo EOM en archivo %u en el dispositivo %s, Volumen \"%s\"\n" -#: src/qt-console/tray-monitor/tray-monitor.cpp:255 -#, c-format -msgid "" -"Invalid refresh interval defined in %s\n" -"This value must be greater or equal to 1 second and less or equal to 10 " -"minutes (read value: %d).\n" -msgstr "" -"Invalido intervalo de actualización definido en %s\n" -"Este valor debe ser mayor o igual a 1 segundo y menor o igual a 10 minutos " -"(leer el valor:% d).\n" +#~ msgid "Mounted Volume \"%s\".\n" +#~ msgstr "Volumen Montado \"%s\".\n" -#: src/qt-console/tray-monitor/tray-monitor.cpp:323 -#, c-format -msgid "Error, currentitem is not a Client or a Storage..\n" -msgstr "Error, CurrentItem no es un Cliente o un Storage ...\n" +#~ msgid "End of file %u on device %s, Volume \"%s\"\n" +#~ msgstr "Fin de archivo %u en el dispositivo %s, Volumen \"%s\"\n" -#: src/qt-console/tray-monitor/tray-monitor.cpp:361 -#, c-format -msgid "Connecting to Client %s:%d" -msgstr "Conectando con Cliente %s:%d" +#~ msgid "" +#~ "File:blk=%u:%u blk_num=%u blen=%u First rec FI=%s SessId=%u SessTim=%u " +#~ "Strm=%s rlen=%d\n" +#~ msgstr "" +#~ "Archivo:blk=%u:%u blk_num=%u blen=%u Primer registro FI=%s SessId=%u " +#~ "SessTim=%u Strm=%s rlen=%d\n" -#: src/qt-console/tray-monitor/tray-monitor.cpp:366 -msgid "File daemon" -msgstr "demonio File" +#~ msgid "Block: %d size=%d\n" +#~ msgstr "Bloque: %d tamaño=%d\n" -#: src/qt-console/tray-monitor/tray-monitor.cpp:371 -#, c-format -msgid "Connecting to Storage %s:%d" -msgstr "Conectando con Storage %s:%d" +#~ msgid "" +#~ "FileIndex=%d VolSessionId=%d VolSessionTime=%d Stream=%d DataLen=%d\n" +#~ msgstr "" +#~ "FileIndex=%d VolSessionId=%d VolSessionTime=%d Stream=%d DataLen=%d\n" -#: src/qt-console/tray-monitor/tray-monitor.cpp:380 -#: src/qt-console/tray-monitor/tray-monitor.cpp:410 -#, c-format -msgid "Error, currentitem is not a Client, a Storage or a Director..\n" -msgstr "Error, currentitem no es un cliente, un Storage o un Director..\n" +#, fuzzy +#~ msgid "End of Physical Medium" +#~ msgstr "Fin de Medio" -#: src/qt-console/tray-monitor/tray-monitor.cpp:385 -msgid "Cannot connect to daemon." -msgstr "No se puede conectar al demonio" +#, fuzzy +#~ msgid "End of object" +#~ msgstr "Fin de la Cinta" -#: src/qt-console/tray-monitor/tray-monitor.cpp:394 -#, c-format -msgid "Authentication error : %s" -msgstr "Error de autenticación : %s" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bscan [ options ] \n" +#~ " -b bootstrap specify a bootstrap file\n" +#~ " -c specify configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -m update media info in database\n" +#~ " -D specify the driver database name (default NULL)\n" +#~ " -n specify the database name (default bacula)\n" +#~ " -u specify database user name (default bacula)\n" +#~ " -P specify database password (default none)\n" +#~ " -h specify database host (default NULL)\n" +#~ " -t specify database port (default 0)\n" +#~ " -p proceed inspite of I/O errors\n" +#~ " -r list records\n" +#~ " -s synchronize or store in database\n" +#~ " -S show scan progress periodically\n" +#~ " -v verbose\n" +#~ " -V specify Volume names (separated by |)\n" +#~ " -w specify working directory (default from conf " +#~ "file)\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Versión: %s (%s)\n" +#~ "\n" +#~ "Utilice: bscan [opciones] \n" +#~ " -b especifica un archivo bootstrap\n" +#~ " -c especifica un archivo de configuración\n" +#~ " -d establece nivel de depuración para \n" +#~ " -dt imprime timestamp en salida de depuración\n" +#~ " -m Actualiza información de los medios en la base de datos\n" +#~ " -D especifica el nombre del driver de base de datos " +#~ "(por defecto NULL)\n" +#~ " -n especifica el nombre de la base de datos (por defecto " +#~ "bacula)\n" +#~ " -u especifica el nombre de usuario de la base de datos (por " +#~ "defecto bacula)\n" +#~ " -P especifica la contraseña de la base de datos (por " +#~ "defecto none)\n" +#~ " -h especifica servidor de la base de datos (por defecto " +#~ "NULL)\n" +#~ " -t especifica el puerto de la base de datos (por defecto 0)\n" +#~ " -p proceder a pesar de los errores\n" +#~ " -r lista de registros\n" + +#~ msgid "No Working Directory defined in %s. Cannot continue.\n" +#~ msgstr "Directorio de Trabajo no definido en %s. No se puede continuar.\n" + +#~ msgid "Working Directory: %s not found. Cannot continue.\n" +#~ msgstr "Directorio de Trabajo: %s no encontrado. No se puede continuar.\n" + +#~ msgid "Working Directory: %s is not a directory. Cannot continue.\n" +#~ msgstr "" +#~ "Directorio de Trabajo: %s no es un directorio. No se puede continuar.\n" -#: src/qt-console/tray-monitor/tray-monitor.cpp:401 -msgid "Opened connection with Director daemon." -msgstr "Conexión abierta con demonio Director." +#~ msgid "First Volume Size = %s\n" +#~ msgstr "Tamaño Primero Volumen = %s\n" -#: src/qt-console/tray-monitor/tray-monitor.cpp:404 -msgid "Opened connection with File daemon." -msgstr "Conexión abierta con demonio File." +#~ msgid "Using Database: %s, User: %s\n" +#~ msgstr "Usando Base de Datos: %s, Usuario: %s\n" -#: src/qt-console/tray-monitor/tray-monitor.cpp:407 -msgid "Opened connection with Storage daemon." -msgstr "Conexión abierta con demonio Storage." +#~ msgid "Create JobMedia for Job %s\n" +#~ msgstr "Crear JobMedia para Job %s\n" -#: src/qt-console/tray-monitor/tray-monitor.cpp:458 -msgid "Error : BNET_HARDEOF or BNET_ERROR" -msgstr "Error: BNET_HARDEOF o BNET_ERROR" +#~ msgid "Could not create JobMedia record for Volume=%s Job=%s\n" +#~ msgstr "No es posible crear registro JobMedia para Volumen=%s Job=%s\n" -#: src/qt-console/tray-monitor/tray-monitor.cpp:467 -msgid "Error : Connection closed." -msgstr "Error : Conexión cerrada." +#~ msgid "done: %d%%\n" +#~ msgstr "Hecho: %d%%\n" -#: src/qt-console/tray-monitor/tray_conf.cpp:167 -#, c-format -msgid "Monitor: name=%s FDtimeout=%s SDtimeout=%s\n" -msgstr "Monitor: nombre=%s FDtimeout=%s SDtimeout=%s\n" +#~ msgid "Volume is prelabeled. This tape cannot be scanned.\n" +#~ msgstr "El volumen esta prelabeled. Esta cinta no puede ser escaneada. \n" -#: src/qt-console/tray-monitor/tray_conf.cpp:173 -#, c-format -msgid "Director: name=%s address=%s FDport=%d\n" -msgstr "Director: nombre=%s dirección=%s FDport=%d\n" +#~ msgid "Pool record for %s found in DB.\n" +#~ msgstr "Registro Pool para %s encontrado en BD.\n" -#: src/qt-console/tray-monitor/tray_conf.cpp:177 -#, c-format -msgid "Client: name=%s address=%s FDport=%d\n" -msgstr "Cliente: nombre=%s dirección=%s FDport=%d\n" +#~ msgid "VOL_LABEL: Pool record not found for Pool: %s\n" +#~ msgstr "VOL_LABEL: Registro Pool no encontrado para Pool: %s\n" -#: src/qt-console/tray-monitor/tray_conf.cpp:181 -#, c-format -msgid "Storage: name=%s address=%s SDport=%d\n" -msgstr "Storage: nombre=%s dirección=%s SDport=%d\n" +#~ msgid "VOL_LABEL: PoolType mismatch. DB=%s Vol=%s\n" +#~ msgstr "VOL_LABEL: PoolType desajustado. BD=%s Vol=%s\n" -#: src/stored/acquire.c:62 -#, c-format -msgid "Acquire read: num_writers=%d not zero. Job %d canceled.\n" -msgstr "Adquirir leer: num_writers=%d no es cero. Empleo %d cancelado.\n" +#~ msgid "Pool type \"%s\" is OK.\n" +#~ msgstr "Tipo de Pool \"%s\" esta OK.\n" -#: src/stored/acquire.c:71 -#, c-format -msgid "No volumes specified for reading. Job %s canceled.\n" -msgstr "No se especifica el volumen de lectura. Job %s cancelado.\n" +#~ msgid "Media record for %s found in DB.\n" +#~ msgstr "Registro Media para %s encontrado en BD.\n" -#: src/stored/acquire.c:80 -#, c-format -msgid "Logic error: no next volume to read. Numvol=%d Curvol=%d\n" -msgstr "Error logico: no hay prójimo volumen para leer. Numvol=%d Curvol=%d\n" +#~ msgid "VOL_LABEL: Media record not found for Volume: %s\n" +#~ msgstr "VOL_LABEL: Registro Media no encontrado para Volumen: %s\n" -#: src/stored/acquire.c:87 src/stored/acquire.c:164 src/stored/acquire.c:439 -#: src/stored/stored.c:614 -msgid "generate_plugin_event(bsdEventDeviceOpen) Failed\n" -msgstr "" +#~ msgid "VOL_LABEL: MediaType mismatch. DB=%s Vol=%s\n" +#~ msgstr "VOL_LABEL: MediaType desajustada. BD=%s Vol=%s\n" -#: src/stored/acquire.c:111 -#, fuzzy, c-format -msgid "" -"Changing read device. Want Media Type=\"%s\" have=\"%s\"\n" -" %s device=%s\n" -msgstr "" -"Cambiando dispositivo de lectura. Media Type=\"%s\" tiene=\"%s\"\n" -" dispositivo=%s\n" +#~ msgid "Media type \"%s\" is OK.\n" +#~ msgstr "Tipo de Media \"%s\" esta OK.\n" -#: src/stored/acquire.c:159 -#, fuzzy, c-format -msgid "Media Type change. New read %s device %s chosen.\n" -msgstr "Cambio Media Type. Nuevo dispositivo de lectura %s elegido.\n" +#~ msgid "VOL_LABEL: OK for Volume: %s\n" +#~ msgstr "VOL_LABEL: OK para Volumen: %s\n" -#: src/stored/acquire.c:176 -#, c-format -msgid "No suitable device found to read Volume \"%s\"\n" -msgstr "No encuentra dispositivo adecuado para leer Volumen \"%s\"\n" +#~ msgid "%d \"errors\" ignored before first Start of Session record.\n" +#~ msgstr "" +#~ "%d \"errores\" ignorados antes del primero registro de Inicio de Sesión.\n" -#: src/stored/acquire.c:215 -#, c-format -msgid "Job %s canceled.\n" -msgstr "Job %s cancelado.\n" +#~ msgid "SOS_LABEL: Found Job record for JobId: %d\n" +#~ msgstr "SOS_LABEL: Encontrado registro Job para JobId: %d\n" -#: src/stored/acquire.c:233 -#, fuzzy, c-format -msgid "Read open %s device %s Volume \"%s\" failed: ERR=%s\n" -msgstr "Fallo al leer dispositivo %s abierto, Volumen \"%s\": ERR=%s\n" +#~ msgid "SOS_LABEL: Job record not found for JobId: %d\n" +#~ msgstr "SOS_LABEL: Registro Job no encontrado para JobId: %d\n" -#: src/stored/acquire.c:326 -#, fuzzy, c-format -msgid "Too many errors trying to mount %s device %s for reading.\n" -msgstr "" -"Demasiados errores tratando de montar el dispositivo %s para la lectura.\n" +#~ msgid "SOS_LABEL: VolSessId mismatch for JobId=%u. DB=%d Vol=%d\n" +#~ msgstr "SOS_LABEL: VolSessId desajustado para JobId=%u. BD=%d Vol=%d\n" -#: src/stored/acquire.c:334 -#, fuzzy, c-format -msgid "Ready to read from volume \"%s\" on %s device %s.\n" -msgstr "Listo para leer desde volumen \"%s\" en el dispositivo %s.\n" +#~ msgid "SOS_LABEL: VolSessTime mismatch for JobId=%u. DB=%d Vol=%d\n" +#~ msgstr "SOS_LABEL: VolSessTime desajustado para JobId=%u. BD=%d Vol=%d\n" -#: src/stored/acquire.c:424 -#, fuzzy, c-format -msgid "Could not ready %s device %s for append.\n" -msgstr "Dispositivo %s puede no está listo para anexar.\n" +#~ msgid "SOS_LABEL: PoolId mismatch for JobId=%u. DB=%d Vol=%d\n" +#~ msgstr "SOS_LABEL: PoolId diferente para JobId=%u. BD=%d Vol=%d\n" -#: src/stored/acquire.c:520 src/stored/block_util.c:669 -#: src/stored/block_util.c:742 src/stored/block_util.c:772 -#: src/stored/spool.c:277 -#, c-format -msgid "Could not create JobMedia record for Volume=\"%s\" Job=%s\n" -msgstr "No es posible crear el registro JobMedia para Volumen=\"%s\" Job=%s\n" +#~ msgid "Could not find SessId=%d SessTime=%d for EOS record.\n" +#~ msgstr "No se pudo encontrar SessId=%d SessTime=%d para registro EOS.\n" -#: src/stored/acquire.c:575 -#, c-format -msgid "Alert: %s" -msgstr "Alerta: %s" +#~ msgid "Could not update job record. ERR=%s\n" +#~ msgstr "No se pudo actualizar el registro de trabajo. ERR=%s\n" -#: src/stored/acquire.c:583 -#, c-format -msgid "3997 Bad alert command: %s: ERR=%s.\n" -msgstr "3997 Malo comando alerta: %s: ERR=%s.\n" +#~ msgid "End of all Volumes. VolFiles=%u VolBlocks=%u VolBytes=%s\n" +#~ msgstr "" +#~ "Final de todos los volúmenes. VolFiles=%u VolBlocks=%u VolBytes=%s\n" -#: src/stored/aligned_dev.c:44 src/stored/dev.c:122 src/stored/stored.c:583 -#, c-format -msgid "Could not initialize %s\n" -msgstr "No se puede iniciar %s\n" +#~ msgid "Could not find Job for SessId=%d SessTime=%d record.\n" +#~ msgstr "No se pudo encontrar registro trabajo para SessId=%d SessTime=%d.\n" -#: src/stored/aligned_dev.c:132 src/stored/dev.c:667 -#, fuzzy, c-format -msgid "Error closing device %s. ERR=%s.\n" -msgstr "Error leyendo archivo %s: ERR=%s\n" +#~ msgid "%s file records. At file:blk=%s:%s bytes=%s\n" +#~ msgstr "%s registros de archivo. En el archivo:blk=%s:%s bytes=%s\n" -#: src/stored/aligned_dev.c:432 src/stored/dvd.c:102 -msgid "No FreeSpace command defined.\n" -msgstr "Comando FreeSpace no definido.\n" +#~ msgid "Got MD5 record: %s\n" +#~ msgstr "Obtuvo registro MD5: %s\n" -#: src/stored/aligned_dev.c:465 src/stored/dvd.c:136 -#, c-format -msgid "Cannot run free space command. Results=%s ERR=%s\n" -msgstr "No se puede ejecutar comando de espacio libre. Resultados=%s ERR=%s\n" +#~ msgid "Got SHA1 record: %s\n" +#~ msgstr "Obtuvo registro SHA1: %s\n" -#: src/stored/aligned_read.c:199 -#, c-format -msgid "Record not properly reconstructed. Remainder wanted=%d got=%d\n" -msgstr "" +#~ msgid "Got SHA256 record: %s\n" +#~ msgstr "Obtuvo registro SHA256: %s\n" -#: src/stored/aligned_read.c:249 src/stored/record_read.c:177 -#, c-format -msgid "Sanity check failed. maxlen=%d datalen=%d. Block discarded.\n" -msgstr "" -"Chequeo de Sanidad fracasado. maxlen=%d datalen=%d. Bloque descartado.\n" +#~ msgid "Got SHA512 record: %s\n" +#~ msgstr "Obtuvo registro SHA512: %s\n" -#: src/stored/ansi_label.c:82 -#, c-format -msgid "Read error on device %s in ANSI label. ERR=%s\n" -msgstr "Error de lectura en el dispositivo %s en la etiqueta ANSI. ERR=%s\n" +#~ msgid "Got signed digest record\n" +#~ msgstr "Obtuvo registro resume firmado: %s\n" -#: src/stored/ansi_label.c:92 -msgid "Insane! End of tape while reading ANSI label.\n" -msgstr "Insano! Fin de la cinta mientras leía la etiqueta ANSI.\n" +#~ msgid "Got Prog Names Stream: %s\n" +#~ msgstr "Obtuvo Stream Nombres de Programas: %s\n" -#: src/stored/ansi_label.c:118 -msgid "No VOL1 label while reading ANSI/IBM label.\n" -msgstr "Ninguna etiqueta VOL1 al leer etiqueta ANSI/IBM.\n" +#~ msgid "Got Prog Data Stream record.\n" +#~ msgstr "Obtuvo Registro Stream Datos de Programas: %s\n" -#: src/stored/ansi_label.c:141 -#, c-format -msgid "Wanted ANSI Volume \"%s\" got \"%s\"\n" -msgstr "Buscando volumen ANSI \"%s\" obtuvo \"%s\"\n" +#~ msgid "Unknown stream type!!! stream=%d len=%i\n" +#~ msgstr "Tipo de flujo desconocido!!! stream=%d len=%i\n" -#: src/stored/ansi_label.c:152 -msgid "No HDR1 label while reading ANSI label.\n" -msgstr "Ninguna etiqueta HDR1 al leer etiqueta ANSI.\n" +#~ msgid "Could not create File Attributes record. ERR=%s\n" +#~ msgstr "No se pudo crear el registro de Archivos de Atributos. ERR=%s\n" -#: src/stored/ansi_label.c:158 -#, c-format -msgid "ANSI/IBM Volume \"%s\" does not belong to Bacula.\n" -msgstr "Volumen \"%s\" ANSI/IBM, no pertenece a Bacula.\n" +#~ msgid "Created File record: %s\n" +#~ msgstr "Registro Archivo creado: %s\n" -#: src/stored/ansi_label.c:170 -msgid "No HDR2 label while reading ANSI/IBM label.\n" -msgstr "Ninguna etiqueta HDR2 al leer etiqueta ANSI/IBM.\n" +#~ msgid "Could not create media record. ERR=%s\n" +#~ msgstr "No es posible crear registro media. ERR=%s\n" -#: src/stored/ansi_label.c:185 -msgid "Unknown or bad ANSI/IBM label record.\n" -msgstr "Registro de etiqueta ANSI/IBM desconocido o malo.\n" +#~ msgid "Could not update media record. ERR=%s\n" +#~ msgstr "No es posible actualizar registro media. ERR=%s\n" -#: src/stored/ansi_label.c:193 -msgid "Too many records in while reading ANSI/IBM label.\n" -msgstr "Demasiados registros mientras leía etiqueta ANSI/IBM.\n" +#~ msgid "Created Media record for Volume: %s\n" +#~ msgstr "Creado Registro Media para Volumen: %s\n" -#: src/stored/ansi_label.c:293 -#, c-format -msgid "ANSI Volume label name \"%s\" longer than 6 chars.\n" -msgstr "Nombre de etiqueta de Volumen ANSI \"%s\" más de 6 caracteres.\n" +#~ msgid "Updated Media record at end of Volume: %s\n" +#~ msgstr "Actualizado el registro Media al final del Volumen: %s\n" -#: src/stored/ansi_label.c:319 -#, fuzzy, c-format -msgid "Could not write ANSI VOL1 label. Wanted size=%d got=%d ERR=%s\n" -msgstr "No ha podido escribir etiqueta ANSI VOL1. ERR=%s\n" +#~ msgid "Could not create pool record. ERR=%s\n" +#~ msgstr "No es posible crear el registro Pool. ERR=%s\n" -#: src/stored/ansi_label.c:357 src/stored/ansi_label.c:386 -#, c-format -msgid "Could not write ANSI HDR1 label. ERR=%s\n" -msgstr "No ha podido escribir etiqueta ANSI HDR1. ERR=%s\n" +#~ msgid "Created Pool record for Pool: %s\n" +#~ msgstr "Creado el registro Pool para Pool: %s\n" -#: src/stored/ansi_label.c:362 src/stored/ansi_label.c:393 -msgid "Could not write ANSI HDR1 label.\n" -msgstr "No se puede escribir la etiqueta ANSI HDR1.\n" +#~ msgid "Could not get Client record. ERR=%s\n" +#~ msgstr "No se ha podido obtener el registro del cliente. ERR=%s\n" -#: src/stored/ansi_label.c:398 -#, c-format -msgid "Error writing EOF to tape. ERR=%s" -msgstr "Error al escribir EOF a la cinta. ERR=%s" +#~ msgid "Created Client record for Client: %s\n" +#~ msgstr "Creado registro Cliente para Cliente: %s\n" -#: src/stored/ansi_label.c:403 -msgid "write_ansi_ibm_label called for non-ANSI/IBM type\n" -msgstr "write_ansi_ibm_label llamado para tipo non-ANSI/IBM\n" +#~ msgid "Fileset \"%s\" already exists.\n" +#~ msgstr "Fileset \"%s\" ya existe.\n" -#: src/stored/append.c:77 -msgid "DCR is NULL!!!\n" -msgstr "DCR es NULL!!!\n" +#~ msgid "Could not create FileSet record \"%s\". ERR=%s\n" +#~ msgstr "No es posible crear registro FileSet \"%s\". ERR=%s\n" -#: src/stored/append.c:83 -msgid "DEVICE is NULL!!!\n" -msgstr "DEVICE es NULL!!!\n" +#~ msgid "Created FileSet record \"%s\"\n" +#~ msgstr "Creado registro FileSet \"%s\"\n" -#: src/stored/append.c:94 -msgid "Unable to set network buffer size.\n" -msgstr "No se puede establecer el tamaño del búfer de red.\n" +#~ msgid "Could not create JobId record. ERR=%s\n" +#~ msgstr "No es posible crear registro JobId. ERR=%s\n" -#: src/stored/append.c:108 src/stored/append.c:118 src/stored/append.c:132 -#: src/stored/askdir.c:378 src/stored/askdir.c:379 -msgid "NULL Volume name. This shouldn't happen!!!\n" -msgstr "Nombre de volumen VACÍO. Esto no debería suceder!\n" +#~ msgid "Could not update job start record. ERR=%s\n" +#~ msgstr "No se pudo actualizar el registro job de inicio. ERR=%s\n" -#: src/stored/append.c:124 src/stored/btape.c:2231 -#, c-format -msgid "Write session label failed. ERR=%s\n" -msgstr "Fallo al escribir la etiqueta de sesión. ERR=%s\n" +#~ msgid "Created new JobId=%u record for original JobId=%u\n" +#~ msgstr "Creado nuevo registro JobId=%u para JobId=%u original\n" -#: src/stored/append.c:138 -#, c-format -msgid "Network send error to FD. ERR=%s\n" -msgstr "Error de red al enviar a FD. ERR=%s\n" +#~ msgid "Could not update JobId=%u record. ERR=%s\n" +#~ msgstr "No se puede actualizar registro JobId=%u. ERR=%s\n" -#: src/stored/append.c:195 -#, fuzzy, c-format -msgid "Error reading data header from FD. n=%d msglen=%d ERR=%s\n" -msgstr "Error al leer datos de cabecera de FD. ERR=%s\n" +#~ msgid "Updated Job termination record for JobId=%u Level=%s TermStat=%c\n" +#~ msgstr "" +#~ "Actualizado el registro de terminación de Job para JobId=%u Nivel=%s " +#~ "TermStat=%c\n" -#: src/stored/append.c:206 -#, c-format -msgid "Malformed data header from FD: %s\n" -msgstr "Datos de cabecera mal formados desde FD: %s\n" +#~ msgid "Job Termination code: %d" +#~ msgstr "Código de Terminación del Job: %d" -#: src/stored/append.c:228 -#, fuzzy, c-format -msgid "FI=%d from FD not positive or last_FI=%d\n" -msgstr "Archivo de índice de FD no es positivo o secuencial\n" +#~ msgid "" +#~ "%s\n" +#~ "JobId: %d\n" +#~ "Job: %s\n" +#~ "FileSet: %s\n" +#~ "Backup Level: %s\n" +#~ "Client: %s\n" +#~ "Start time: %s\n" +#~ "End time: %s\n" +#~ "Files Written: %s\n" +#~ "Bytes Written: %s\n" +#~ "Volume Session Id: %d\n" +#~ "Volume Session Time: %d\n" +#~ "Last Volume Bytes: %s\n" +#~ "Termination: %s\n" +#~ "\n" +#~ msgstr "" +#~ "%s\n" +#~ "JobId: %d\n" +#~ "Job: %s\n" +#~ "FileSet: %s\n" +#~ "Nivel de Respaldo: %s\n" +#~ "Cliente: %s\n" +#~ "Hora de Inicio: %s\n" +#~ "Hora de Finalización: %s\n" +#~ "Archivos Escritos: %s\n" +#~ "Bytes Escritos: %s\n" +#~ "Id Volumen Sesión: %d\n" +#~ "Tiempo de la Sesión del Volumen: %d\n" +#~ "Últimos Bytes del Volumen: %s\n" +#~ "Terminación: %s\n" +#~ "\n" -#: src/stored/append.c:353 -#, c-format -msgid "Network error reading from FD. ERR=%s\n" -msgstr "Error al leer la red desde FD. ERR=%s\n" +#~ msgid "Could not create JobMedia record. ERR=%s\n" +#~ msgstr "No es posible crear registro JobMedia. ERR=%s\n" -#: src/stored/append.c:373 -#, fuzzy, c-format -msgid "DDE commit failed. ERR=%s\n" -msgstr "prctl fallido: ERR=%s\n" +#~ msgid "Created JobMedia record JobId %d, MediaId %d\n" +#~ msgstr "Creado registro JobMedia JobID %d, MediaID %d\n" -#: src/stored/append.c:404 src/stored/append.c:431 src/stored/spool.c:266 -#: src/stored/vbackup.c:120 src/stored/vbackup.c:130 src/stored/vbackup.c:300 -#, c-format -msgid "Fatal append error on device %s: ERR=%s\n" -msgstr "Error Fatal añadiendo en el dispositivo %s: ERR=%s\n" +#~ msgid "Could not find SessId=%d SessTime=%d for MD5/SHA1 record.\n" +#~ msgstr "" +#~ "No se pudo encontrar SessId=%d SessTime=%d para registro MD5/SHA1.\n" -#: src/stored/append.c:406 src/stored/vbackup.c:122 -msgid "Set ok=FALSE after write_block_to_device.\n" -msgstr "Set ok=FALSE después de write_block_to_device.\n" +#~ msgid "Could not add MD5/SHA1 to File record. ERR=%s\n" +#~ msgstr "No se pudo agregar MD5/SHA1 al registro File. ERR=%s\n" -#: src/stored/append.c:418 src/stored/btape.c:2350 -#, c-format -msgid "Error writing end session label. ERR=%s\n" -msgstr "Error escribiendo etiqueta de fin de sesión. ERR=%s\n" +#~ msgid "Updated MD5/SHA1 record\n" +#~ msgstr "Actualizado registro MD5/SHA1\n" -#: src/stored/append.c:433 src/stored/vbackup.c:132 #, fuzzy -msgid "Set ok=FALSE after write_final_block_to_device.\n" -msgstr "Set ok=FALSE después de write_block_to_device.\n" +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bsdjson [options] [-c config_file] [config_file]\n" +#~ " -r get resource type \n" +#~ " -n get resource \n" +#~ " -l get only directives matching dirs (use with -r)\n" +#~ " -D get only data\n" +#~ " -c use as configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -t test - read config and exit\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Versión: %s (%s)\n" +#~ "\n" +#~ "Utilice: stored [opciones] [-c archivo_configuración] " +#~ "[archivo_configuración]\n" +#~ " -c usar como archivo de configuración\n" +#~ " -d establecer el nivel de depuración para \n" +#~ " -dt imprimir timestamp en salida de depuración\n" +#~ " -f ejecutar en primer plano (para depuración)\n" +#~ " -g establecer groupid para grupo\n" +#~ " -m imprimir salida kaboom para depuración)\n" +#~ " -p continuar a pesar de errores de E/S\n" +#~ " -s sin señales (para depuración)\n" +#~ " -t prueba - leer la configuración y salir\n" +#~ " -u establecer userid para \n" +#~ " -v mensajes de usuario detallados\n" +#~ " -? imprimir este mensaje.\n" +#~ "\n" -#: src/stored/append.c:458 src/stored/read.c:110 src/stored/vbackup.c:155 -#, fuzzy, c-format -msgid "Elapsed time=%02d:%02d:%02d, Transfer rate=%s Bytes/second\n" -msgstr "" -"Tiempo transcurrido de escritura del Job = %02d:%02d:%02d, Tasa de " -"transferencia = %s Bytes/segundo\n" +#~ msgid "No Storage resource defined in %s. Cannot continue.\n" +#~ msgstr "Recurso Storage no definido en %s. No se puede continuar.\n" -#: src/stored/append.c:495 -#, c-format -msgid "Error updating file attributes. ERR=%s\n" -msgstr "Error al actualizar los atributos de archivo. ERR=%s\n" +#~ msgid "Only one Storage resource permitted in %s\n" +#~ msgstr "Sólo un recurso Storage permitido en %s\n" -#: src/stored/askdir.c:174 -msgid "Network error on bnet_recv in req_vol_info.\n" -msgstr "Error de red en bnet_recv en req_vol_info.\n" +#~ msgid "No Director resource defined in %s. Cannot continue.\n" +#~ msgstr "Recurso Director no definido en %s. No se puede continuar.\n" -#: src/stored/askdir.c:198 -#, c-format -msgid "Error getting Volume info: %s" -msgstr "Error al obtener Volumen información: %s" +#~ msgid "No Device resource defined in %s. Cannot continue.\n" +#~ msgstr "Recurso Device no definido en %s. No se puede continuar.\n" -#: src/stored/askdir.c:433 -#, c-format -msgid "Didn't get vol info vol=%s: ERR=%s" -msgstr "no recibió información de volumen vol=%s: ERR=%s" +#~ msgid "No Messages resource defined in %s. Cannot continue.\n" +#~ msgstr "Recurso Mensajes no definido en %s. No se puede continuar.\n" -#: src/stored/askdir.c:531 -#, c-format -msgid "Error creating JobMedia record: ERR=%s\n" -msgstr "Error al crear registro JobMedia: ERR=%s\n" +#~ msgid "\"TLS Certificate\" file not defined for Storage \"%s\" in %s.\n" +#~ msgstr "" +#~ "Archivo \"TLS Certificate\" no definido para Storage \"%s\" en %s.\n" -#: src/stored/askdir.c:538 -#, c-format -msgid "Error creating JobMedia record: %s\n" -msgstr "Error al crear registro JobMedia: %s\n" +#~ msgid "\"TLS Key\" file not defined for Storage \"%s\" in %s.\n" +#~ msgstr "Archivo \"TLS Key\" no definido para Storage \"%s\" en %s.\n" -#: src/stored/askdir.c:630 -#, c-format -msgid "Job %s canceled while waiting for mount on Storage Device \"%s\".\n" -msgstr "" -"Job %s cancelado a la espera de montar el dispositivo Storage \"%s\".\n" +#~ msgid "" +#~ "Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined " +#~ "for Storage \"%s\" in %s. At least one CA certificate store is required " +#~ "when using \"TLS Verify Peer\".\n" +#~ msgstr "" +#~ "Ni \"Certificado TLS CA \" o \"Directorio del Certificado TLS CA\" están " +#~ "definidos para el Storage \"%s\" en %s. Por lo menos un almacén de " +#~ "Certificados CA es necesario cuando se utiliza \"Verificar TLS Peer\".\n" -#: src/stored/askdir.c:643 -#, fuzzy, c-format -msgid "" -"Job %s is waiting. Cannot find any appendable volumes.\n" -"Please use the \"label\" command to create a new Volume for:\n" -" Storage: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" -"Job %s en espera. No se puede encontrar ningún volumen grabable.\n" -"Por favor utilice el comando \"label\" para crear un nuevo Volumen para:\n" -"Storage: %s\n" -"Pool: %s\n" -"Tipo de Media: %s\n" +#~ msgid "Tape block size (%d) not multiple of system size (%d)\n" +#~ msgstr "" +#~ "Tamaño de bloque de cinta (%d) no es múltiplo del tamaño de sistema (% " +#~ "d)\n" -#: src/stored/askdir.c:668 src/stored/askdir.c:780 -#, c-format -msgid "Max time exceeded waiting to mount Storage Device %s for Job %s\n" -msgstr "" -"Tiempo máximo de espera excedido para montar dispositivo Storage %s para el " -"Job %s\n" +#~ msgid "Tape block size (%d) is not a power of 2\n" +#~ msgstr "Tamaño de bloque de cinta (%d) no es una potencia de 2\n" -#: src/stored/askdir.c:679 -msgid "pthread error in mount_next_volume.\n" -msgstr "pthread error en mount_next_volume.\n" +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "!!!! Warning large disk addressing disabled. boffset_t=%d should be 8 or " +#~ "more !!!!!\n" +#~ "\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "!!!! Advertencia, deshabilitado direccionamiento de discos largos. " +#~ "boffset_t=%d debe ser de 8 o más !!!!!\n" +#~ "\n" +#~ "\n" -#: src/stored/askdir.c:714 -msgid "Cannot request another volume: no volume name given.\n" -msgstr "No puede solicitar otro volumen: nombre de volumen no entregado.\n" +#~ msgid "32 bit printf/scanf problem. i=%d x32=%u y32=%u\n" +#~ msgstr "32 bit printf/scanf problema. i=%d x32=%u y32=%u\n" -#: src/stored/askdir.c:720 -msgid "The current operation doesn't support mount request\n" -msgstr "" +#~ msgid "64 bit printf/scanf problem. i=%d x64=%" +#~ msgstr "64 bit printf/scanf problema. i=%d x64=%" -#: src/stored/askdir.c:727 -#, c-format -msgid "Job %s canceled while waiting for mount on Storage Device %s.\n" -msgstr "Job %s cancelado a la espera de montar el dispositivo Storage %s.\n" +#~ msgid "Tape block granularity is %d bytes.\n" +#~ msgstr "Granularidad del bloque de cinta es %d bytes.\n" -#: src/stored/askdir.c:745 -#, fuzzy, c-format -msgid "" -"%sPlease mount append Volume \"%s\" or label a new one for:\n" -" Job: %s\n" -" Storage: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" -"Por favor, montar Volumen \"%s\" o etiquete uno nuevo para :\n" -" Job: %s\n" -" Storage: %s\n" -" Pool: %s\n" -" Media type: %s\n" +#~ msgid "No archive name specified.\n" +#~ msgstr "Nombre de archivo no especificado.\n" -#: src/stored/askdir.c:751 -#, fuzzy, c-format -msgid "" -"%sPlease mount read Volume \"%s\" for:\n" -" Job: %s\n" -" Storage: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" -"Por favor, montar el volumen \"%s\" for:\n" -" Job: %s\n" -" Storage: %s\n" -" Pool: %s\n" -" Media type: %s\n" +#~ msgid "Improper number of arguments specified.\n" +#~ msgstr "Número incorrecto de argumentos especificados.\n" -#: src/stored/askdir.c:758 -msgid "" -"\n" -"\n" -"WARNING: device is full! Please add more disk space then ...\n" -"\n" -msgstr "" +#~ msgid "btape does not work with DVD storage.\n" +#~ msgstr "btape no funciona con el almacenamiento de DVD.\n" -#: src/stored/askdir.c:791 -msgid "pthread error in mount_volume\n" -msgstr "pthread error en mount_volume\n" +#~ msgid "btape only works with tape storage.\n" +#~ msgstr "btape sólo funciona con almacenamiento en cinta.\n" -#: src/stored/authenticate.c:77 -#, fuzzy -msgid "" -"Incorrect password given by Director.\n" -"For help, please see: " -msgstr "Contraseña incorrecta dada por el Director en %s.\n" +#~ msgid "Total Volume bytes=%sB. Total Write rate = %sB/s\n" +#~ msgstr "Volumen total bytes=%sB. Tasa total de Escritura = %sB/s\n" -#: src/stored/authenticate.c:103 -#, c-format -msgid "TLS negotiation failed with DIR at \"%s:%d\"\n" -msgstr "Fallida la negociación TLS con DIR en \"%s:%d\"\n" +#~ msgid "Volume bytes=%sB. Write rate = %sB/s\n" +#~ msgstr "Volumen bytes=%sB. Tasa de Escritura = %sB/s\n" -#: src/stored/authenticate.c:121 -#, c-format -msgid "Unable to authenticate Director at %s.\n" -msgstr "No se puede autenticar Director en %s.\n" +#~ msgid "open device %s: OK\n" +#~ msgstr "abrir dispositivo %s: OK\n" -#: src/stored/authenticate.c:169 src/stored/authenticate.c:209 -#, c-format -msgid "" -"Incorrect authorization key from File daemon at %s rejected.\n" -"For help, please see: " -msgstr "" +#~ msgid "Enter Volume Name: " +#~ msgstr "Ingrese nombre de Volumen:" -#: src/stored/authenticate.c:196 -#, c-format -msgid "TLS negotiation failed with FD at \"%s:%d\"\n" -msgstr "Fallida la negociación TLS con FD en \"%s:%d\"\n" +#~ msgid "Device open failed. ERR=%s\n" +#~ msgstr "Fallo al abrir dispositivo. ERR=%s\n" -#: src/stored/authenticate.c:277 -msgid "" -"Authorization key rejected by Storage daemon.\n" -"Please see " -msgstr "" +#~ msgid "Wrote Volume label for volume \"%s\".\n" +#~ msgstr "Escribe la etiqueta de Volumen para el volumen \"%s\".\n" -#: src/stored/autochanger.c:67 -#, c-format -msgid "No Changer Name given for device %s. Cannot continue.\n" -msgstr "" -"Ningún Nombre Changer obtenido para el dispositivo %s. No se puede " -"continuar.\n" +#~ msgid "Volume has no label.\n" +#~ msgstr "Volumen no tiene etiqueta.\n" -#: src/stored/autochanger.c:73 -#, c-format -msgid "No Changer Command given for device %s. Cannot continue.\n" -msgstr "" -"Ningún Comando Changer obtenido para el dispositivo %s. No se puede " -"continuar.\n" +#~ msgid "Volume label read correctly.\n" +#~ msgstr "Etiqueta de volumen leída correctamente.\n" -#: src/stored/autochanger.c:142 -#, fuzzy, c-format -msgid "No slot defined in catalog (slot=%d) for Volume \"%s\" on %s.\n" -msgstr "" -"Invalida ranura=%d definida en el catálogo para volumen \"%s\" en %s. Carga " -"manual puede ser requerida.\n" +#~ msgid "I/O error on device: ERR=%s" +#~ msgstr "error de E/S en el dispositivo: ERR=%s" -#: src/stored/autochanger.c:144 -msgid "Cartridge change or \"update slots\" may be required.\n" -msgstr "" +#, fuzzy +#~ msgid "Volume type error: ERR=%s\n" +#~ msgstr "Seek error: ERR=%s\n" -#: src/stored/autochanger.c:150 -#, c-format -msgid "No \"Changer Device\" for %s. Manual load of Volume may be required.\n" -msgstr "" -"Ninguno \"Dispositivo Changer\" para %s. Carga manual de volumen puede ser " -"requerido.\n" +#~ msgid "Volume name error\n" +#~ msgstr "Nombre de Volumen error\n" -#: src/stored/autochanger.c:157 -#, c-format -msgid "No \"Changer Command\" for %s. Manual load of Volume may be requird.\n" -msgstr "" -"Ninguno \"Comando Changer\" para %s. Carga manual de volumen puede ser " -"requerido.\n" +#~ msgid "Error creating label. ERR=%s" +#~ msgstr "Error creando etiqueta. ERR=%s" -#: src/stored/autochanger.c:191 -#, c-format -msgid "3304 Issuing autochanger \"load slot %d, drive %d\" command.\n" -msgstr "" -"3304 Emitiendo comando auto-cambiador \"cargar ranura %d, unidad %d\".\n" +#~ msgid "Volume version error.\n" +#~ msgstr "Volumen versión error.\n" -#: src/stored/autochanger.c:199 -#, c-format -msgid "3305 Autochanger \"load slot %d, drive %d\", status is OK.\n" -msgstr "3305 Auto-cambiador \"carga ranura %d, unidad %d\", estado es OK.\n" +#~ msgid "Bad Volume label type.\n" +#~ msgstr "Malo tipo de etiqueta de volumen.\n" -#: src/stored/autochanger.c:212 -#, c-format -msgid "" -"3992 Bad autochanger \"load slot %d, drive %d\": ERR=%s.\n" -"Results=%s\n" -msgstr "" -"2992 Malo Auto-cambiador \"carga ranura %d, unidad %d\": ERR=%s.\n" -"Resultados=%s\n" +#~ msgid "Unknown error.\n" +#~ msgstr "Error desconocido.\n" -#: src/stored/autochanger.c:275 -#, c-format -msgid "3301 Issuing autochanger \"loaded? drive %d\" command.\n" -msgstr "3301 Emitiendo comando auto-cambiador \"¿cargado? unidad %d\".\n" +#~ msgid "Bad status from load. ERR=%s\n" +#~ msgstr "Malo estado de carga. ERR=%s\n" -#: src/stored/autochanger.c:287 -#, c-format -msgid "3302 Autochanger \"loaded? drive %d\", result is Slot %d.\n" -msgstr "" -"3302 Auto-cambiador \"¿cargado? unidad %d\", el resultado es Ranura %d.\n" +#~ msgid "Loaded %s\n" +#~ msgstr "Cargado %s\n" -#: src/stored/autochanger.c:294 -#, c-format -msgid "3302 Autochanger \"loaded? drive %d\", result: nothing loaded.\n" -msgstr "" -"3302 Auto-cambiador \"¿cargado? unidad %d\", resultado: nada cargado.\n" +#~ msgid "Bad status from rewind. ERR=%s\n" +#~ msgstr "Malo estado de rebobinado. ERR=%s\n" -#: src/stored/autochanger.c:306 -#, c-format -msgid "" -"3991 Bad autochanger \"loaded? drive %d\" command: ERR=%s.\n" -"Results=%s\n" -msgstr "" -"3991 Malo comando auto-cambiador comando \"cargar? unidad %d\": ERR=%s\n" -"Resultados=%s\n" +#~ msgid "Rewound %s\n" +#~ msgstr "Rebobinado %s\n" -#: src/stored/autochanger.c:326 -#, fuzzy, c-format -msgid "Lock failure on autochanger. ERR=%s\n" -msgstr "Error bloqueando Mutex. ERR=%s\n" +#~ msgid "Bad status from weof. ERR=%s\n" +#~ msgstr "Malo estado de weof. ERR=%s\n" -#: src/stored/autochanger.c:340 -#, fuzzy, c-format -msgid "Unlock failure on autochanger. ERR=%s\n" -msgstr "Error desbloqueando Mutex. ERR=%s\n" +#~ msgid "Wrote 1 EOF to %s\n" +#~ msgstr "Escribir 1 EOF para %s\n" -#: src/stored/autochanger.c:387 src/stored/autochanger.c:553 -#, c-format -msgid "3307 Issuing autochanger \"unload slot %d, drive %d\" command.\n" -msgstr "" -"3307 Emitiendo comando auto-cambiador \"descargar ranura %d, unidad %d\"\n" +#~ msgid "Wrote %d EOFs to %s\n" +#~ msgstr "Escribir %d EOFs para %s\n" -#: src/stored/autochanger.c:400 -#, c-format -msgid "" -"3995 Bad autochanger \"unload slot %d, drive %d\": ERR=%s\n" -"Results=%s\n" -msgstr "" -"3995 Malo comando auto-cambiador \"descargar ranura %d, unidad %d\": ERR=%s\n" -"Resultados=%s\n" +#~ msgid "Moved to end of medium.\n" +#~ msgstr "Movido para el final de la media.\n" -#: src/stored/autochanger.c:503 -#, c-format -msgid "Volume \"%s\" wanted on %s is in use by device %s\n" -msgstr "Volumen \"%s\" buscado en %s está en uso por el dispositivo %s\n" +#~ msgid "Bad status from bsf. ERR=%s\n" +#~ msgstr "Mal estado desde BSF. ERR=%s\n" -#: src/stored/autochanger.c:570 -#, fuzzy, c-format -msgid "3997 Bad autochanger \"unload slot %d, drive %d\": ERR=%s.\n" -msgstr "" -"3995 Malo comando auto-cambiador \"descargar ranura %d, unidad %d\": ERR=" -"%s.\n" +#~ msgid "Backspaced %d file%s.\n" +#~ msgstr "Backspaced %d archivo%s.\n" -#: src/stored/autochanger.c:613 -#, c-format -msgid "3993 Device %s not an autochanger device.\n" -msgstr "3993 Dispositivo %s no es un dispositivo auto-cargador.\n" +#~ msgid "Bad status from bsr. ERR=%s\n" +#~ msgstr "Malo estado de BSR. ERR=%s\n" -#: src/stored/autochanger.c:640 -#, c-format -msgid "3306 Issuing autochanger \"%s\" command.\n" -msgstr "3306 Emitiendo comando \"%s\" al auto-cambiador.\n" +#~ msgid "Backspaced %d record%s.\n" +#~ msgstr "Backspaced %d registro%s.\n" -#: src/stored/autochanger.c:643 -msgid "3996 Open bpipe failed.\n" -msgstr "3996 Fallo al abrir bpipe.\n" +#~ msgid "Configured device capabilities:\n" +#~ msgstr "Capacidades del dispositivo configuradas:\n" -#: src/stored/autochanger.c:670 -#, c-format -msgid "Autochanger error: ERR=%s\n" -msgstr "Auto-cambiador error: ERR=%s\n" +#~ msgid "Device status:\n" +#~ msgstr "Estado del Dispositivo:\n" -#: src/stored/bcopy.c:62 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bcopy [-d debug_level] \n" -" -b bootstrap specify a bootstrap file\n" -" -c specify a Storage configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -i specify input Volume names (separated by |)\n" -" -o specify output Volume names (separated by |)\n" -" -p proceed inspite of errors\n" -" -v verbose\n" -" -w specify working directory (default /tmp)\n" -" -? print this message\n" -"\n" -msgstr "" -"\n" -"Versión: %s (%s)\n" -"\n" -"Utilice: bcopy [-d nivel_ depuración] \n" -" -b bootstrap especifica un archivo bootstrap\n" -" -c especifica un archivo Storage de configuración\n" -" -d establece nivel de depuración para \n" -" -dt imprime timestamp en salida de depuración\n" -" -i especifica nombres de Volúmenes de entrada (separados por |)\n" -" -o especifica nombres de Volúmenes de salida (separados por |)\n" -" -p proceder a pesar de los errores\n" -"\n" -" -v detallado\n" -" -w especifica directorio de trabajo (por defecto /tmp)\n" -" -? imprime esta mensaje\n" -"\n" +#~ msgid "Device parameters:\n" +#~ msgstr "Parámetros del Dispositivo:\n" -#: src/stored/bcopy.c:149 src/stored/bextract.c:206 src/stored/bscan.c:236 -#: src/tools/bbatch.c:176 src/tools/bvfs_test.c:189 src/tools/cats_test.c:308 -msgid "Wrong number of arguments: \n" -msgstr "Incorrecto numero de argumentos: \n" +#~ msgid "Status:\n" +#~ msgstr "Estados:\n" -#: src/stored/bcopy.c:193 src/stored/btape.c:468 src/stored/device.c:338 -#, c-format -msgid "dev open failed: %s\n" -msgstr "Fallo al abrir dev: %s\n" +#~ msgid "" +#~ "Test writing larger and larger records.\n" +#~ "This is a torture test for records.\n" +#~ "I am going to write\n" +#~ "larger and larger records. It will stop when the record size\n" +#~ "plus the header exceeds the block size (by default about 64K)\n" +#~ msgstr "" +#~ "Prueba de escritura de registros cada vez mayores.\n" +#~ "Esta es una prueba de tortura para los registros.\n" +#~ "Voy a escribir\n" +#~ "registros cada vez mayores. Se detendrá cuando el tamaño de registro " +#~ "además de la cabecera excede el tamaño de bloque (por defecto sobre 64K)\n" -#: src/stored/bcopy.c:208 -msgid "Write of last block failed.\n" -msgstr "Fallo al escribir ultimo bloque.\n" +#~ msgid "Do you want to continue? (y/n): " +#~ msgstr "Desea continuar? (y/n)" -#: src/stored/bcopy.c:212 -#, c-format -msgid "%u Jobs copied. %u records copied.\n" -msgstr "%u Jobs copiado. %u registros copiados.\n" +#~ msgid "Command aborted.\n" +#~ msgstr "Comando Abortado.\n" -#: src/stored/bcopy.c:229 src/stored/bscan.c:419 -#, c-format -msgid "Record: SessId=%u SessTim=%u FileIndex=%d Stream=%d len=%u\n" -msgstr "Registro: SessId=%u SessTim=%u FileIndex=%d Stream=%d len=%u\n" +#~ msgid "Block %d i=%d\n" +#~ msgstr "Bloque %d i=%d\n" -#: src/stored/bcopy.c:245 -msgid "Volume is prelabeled. This volume cannot be copied.\n" -msgstr "Volumen esta pre-etiquetado. Este volumen no puede ser copiado.\n" +#~ msgid "Skipping read backwards test because BSR turned off.\n" +#~ msgstr "" +#~ "Saltar prueba de lectura hacia atrás, porque BSR esta desactivado.\n" -#: src/stored/bcopy.c:248 -msgid "Volume label not copied.\n" -msgstr "Etiqueta Volumen no copiada.\n" +#~ msgid "" +#~ "\n" +#~ "=== Write, backup, and re-read test ===\n" +#~ "\n" +#~ "I'm going to write three records and an EOF\n" +#~ "then backup over the EOF and re-read the last record.\n" +#~ "Bacula does this after writing the last block on the\n" +#~ "tape to verify that the block was written correctly.\n" +#~ "\n" +#~ "This is not an *essential* feature ...\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "=== Prueba de escritura, copia de seguridad y re-lectura ===\n" +#~ "\n" +#~ "Yo voy a escribir 3 registros y un EOF\n" +#~ "a continuación respaldar sobre el EOF y re-leer el ultimo registro.\n" +#~ " Bacula hace esto después de escribir el último bloque en la\n" +#~ "cinta para comprobar que el bloque ha sido escrito correctamente.\n" +#~ "\n" +#~ "Esta es una característica *esencial* ...\n" +#~ "\n" -#: src/stored/bcopy.c:254 -msgid "Copy skipped. Record does not match BSR filter.\n" -msgstr "Copia omitida. Registro no coincide con filtro de BSR.\n" +#~ msgid "Error writing record to block.\n" +#~ msgstr "Error al escribir registro al bloque.\n" -#: src/stored/bcopy.c:271 src/stored/bcopy.c:279 src/stored/bcopy.c:307 -#: src/stored/btape.c:2755 -#, c-format -msgid "Cannot fixup device error. %s\n" -msgstr "No se puede corregir error de dispositivo. %s\n" +#~ msgid "Error writing block to device.\n" +#~ msgstr "Error al escribir bloque al dispositivo.\n" -#: src/stored/bcopy.c:285 -msgid "EOM label not copied.\n" -msgstr "Etiqueta EOM no copiada.\n" +#~ msgid "Wrote first record of %d bytes.\n" +#~ msgstr "Escribió primer registro de %d bytes.\n" -#: src/stored/bcopy.c:288 -msgid "EOT label not copied.\n" -msgstr "Etiqueta EOT no copiada.\n" +#~ msgid "Wrote second record of %d bytes.\n" +#~ msgstr "Escribió segundo registro de %d bytes.\n" -#: src/stored/bcopy.c:321 src/stored/bls.c:439 src/stored/read_records.c:392 -msgid "Fresh Volume Label" -msgstr "Nueva Etiqueta de Volumen" +#~ msgid "Wrote third record of %d bytes.\n" +#~ msgstr "Escribió tercer registro de %d bytes.\n" -#: src/stored/bcopy.c:324 src/stored/bls.c:442 src/stored/read_records.c:395 -msgid "Volume Label" -msgstr "Etiqueta de Volumen" +#~ msgid "Backspace file failed! ERR=%s\n" +#~ msgstr "Fallo en retroceso de archivo! ERR=%s\n" -#: src/stored/bcopy.c:328 src/stored/bls.c:446 src/stored/label.c:1332 -msgid "Begin Job Session" -msgstr "Inicio Job Sesión" +#~ msgid "Backspaced over EOF OK.\n" +#~ msgstr "Retroceso sobre EOF OK.\n" -#: src/stored/bcopy.c:332 src/stored/bls.c:451 src/stored/label.c:1335 -msgid "End Job Session" -msgstr "Fin Job Sesión" +#~ msgid "Backspace record failed! ERR=%s\n" +#~ msgstr "Fallo en retroceso de registro! ERR=%s\n" -#: src/stored/bcopy.c:337 src/stored/bls.c:455 -msgid "End of Medium" -msgstr "Fin de Medio" +#~ msgid "Backspace record OK.\n" +#~ msgstr "Retroceso de registro OK.\n" -#: src/stored/bcopy.c:340 src/stored/bls.c:467 src/stored/label.c:1344 -msgid "Unknown" -msgstr "Desconocido" +#~ msgid "Read block failed! ERR=%s\n" +#~ msgstr "Lectura de bloque fallida! ERR=%s\n" -#: src/stored/bcopy.c:346 src/stored/bls.c:474 src/stored/read_records.c:413 -#, c-format -msgid "%s Record: VolSessionId=%d VolSessionTime=%d JobId=%d DataLen=%d\n" -msgstr "%s Registro: VolSessionId=%d VolSessionTime=%d JobId=%d DataLen=%d\n" +#~ msgid "Bad data in record. Test failed!\n" +#~ msgstr "Datos erróneos en el registro. Prueba fallida!\n" -#: src/stored/bcopy.c:364 src/stored/bextract.c:721 src/stored/bls.c:493 -#: src/stored/bscan.c:1359 src/stored/btape.c:3049 -#, c-format -msgid "Mount Volume \"%s\" on device %s and press return when ready: " -msgstr "" -"Monte Volumen \"%s\" en el dispositivo %s y presione ENTER cuando esté " -"preparado:" +#~ msgid "" +#~ "\n" +#~ "Block re-read correct. Test succeeded!\n" +#~ msgstr "" +#~ "\n" +#~ "Re-lectura de bloque correcta. Prueba Satisfactoria!\n" -#: src/stored/bextract.c:80 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bextract \n" -" -b specify a bootstrap file\n" -" -c specify a Storage configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -T send debug traces to trace file\n" -" -e exclude list\n" -" -i include list\n" -" -p proceed inspite of I/O errors\n" -" -t read data from volume, do not write anything\n" -" -v verbose\n" -" -V specify Volume names (separated by |)\n" -" -? print this message\n" -"\n" -msgstr "" -"\n" -"Versión: %s (%s)\n" -"\n" -"Utilice: bextract " -"\n" -" -b especifica un archivo bootstrap\n" -" -c especifica un archivo Storage de configuración\n" -" -d establece nivel de depuración para \n" -" -dt imprime timestamp en salida de depuración\n" -" -e lista de exclusión\n" -" -i lista de inclusión\n" -" -p proceder a pesar de los errores de E/S\n" -" -v detallado\n" -" -V especifica nombres de Volúmenes (separados por |)\n" -" -? imprime esta mensaje\n" -"\n" +#~ msgid "" +#~ "=== End Write, backup, and re-read test ===\n" +#~ "\n" +#~ msgstr "" +#~ "=== Fin prueba de escritura, copia de seguridad, y re-lectura ===\n" +#~ "\n" -#: src/stored/bextract.c:156 src/stored/bls.c:143 -#, c-format -msgid "Could not open exclude file: %s, ERR=%s\n" -msgstr "No se pudo abrir archivo excluir: %s, ERR=%s\n" +#~ msgid "" +#~ "This is not terribly serious since Bacula only uses\n" +#~ "this function to verify the last block written to the\n" +#~ "tape. Bacula will skip the last block verification\n" +#~ "if you add:\n" +#~ "\n" +#~ "Backward Space Record = No\n" +#~ "\n" +#~ "to your Storage daemon's Device resource definition.\n" +#~ msgstr "" +#~ "Esto no es terriblemente grave, desde que sólo utilices Bacula\n" +#~ "esta función para verificar el último bloque por escrito en la\n" +#~ "cinta. Bacula saltará la verificación del último bloque\n" +#~ "si usted agrega:\n" +#~ "\n" +#~ "Backward Space Record = NO\n" +#~ "\n" +#~ " en la definición de los recursos de Dispositivos de su demonio Storage.\n" -#: src/stored/bextract.c:171 src/stored/bls.c:158 -#, c-format -msgid "Could not open include file: %s, ERR=%s\n" -msgstr "No se pudo abrir archivo incluir: %s, ERR=%s\n" +#~ msgid "Begin writing %i files of %sB with raw blocks of %u bytes.\n" +#~ msgstr "" +#~ "Inicia escribiendo %i archivos de %sB con raw bloques de %u bytes.\n" -#: src/stored/bextract.c:231 -#, c-format -msgid "%d Program Name and/or Program Data Stream records ignored.\n" -msgstr "" -"Nombre del Programa %d y/o registros de Datos de Flujo del Programa " -"ignorado.\n" +#~ msgid "Write failed at block %u. stat=%d ERR=%s\n" +#~ msgstr "Error al escritura en el bloque %u. stat=%d ERR=%s\n" -#: src/stored/bextract.c:235 -#, c-format -msgid "%d Win32 data or Win32 gzip data stream records. Ignored.\n" -msgstr "%d registros de flujo de datos Win32 or Win32 datos gzip. Ignorados.\n" +#~ msgid "Begin writing %i files of %sB with blocks of %u bytes.\n" +#~ msgstr "Inicia escribiendo %i archivos de %sB con bloques de %u bytes.\n" -#: src/stored/bextract.c:263 -#, c-format -msgid "Cannot stat %s. It must exist. ERR=%s\n" -msgstr "No se puede stat %s. El debe existir. ERR=%s\n" +#~ msgid "" +#~ "\n" +#~ "Error writing record to block.\n" +#~ msgstr "" +#~ "\n" +#~ "Error escribiendo registro al bloque.\n" -#: src/stored/bextract.c:267 -#, c-format -msgid "%s must be a directory.\n" -msgstr "%s debe ser un directorio.\n" +#~ msgid "" +#~ "\n" +#~ "Error writing block to device.\n" +#~ msgstr "" +#~ "\n" +#~ "Error escribiendo bloque al dispositivo.\n" -#: src/stored/bextract.c:296 -#, c-format -msgid "%u files restored.\n" -msgstr "%u archivos restaurados.\n" +#~ msgid "The file_size is too big, stop this test with Ctrl-c.\n" +#~ msgstr "" +#~ "El tamaño_archivo es demasiado grande, detenga esta prueba con Ctrl-c.\n" -#: src/stored/bextract.c:298 -#, fuzzy, c-format -msgid "Found %s error%s\n" -msgstr "Encontrados %d para: %s\n" +#~ msgid "Test with zero data, should give the maximum throughput.\n" +#~ msgstr "Prueba con cero de datos, debe dar el máximo rendimiento.\n" -#: src/stored/bextract.c:309 src/stored/bextract.c:315 -#, c-format -msgid "Write error on %s: %s\n" -msgstr "Error de escritura en %s: %s\n" +#~ msgid "Test with random data, should give the minimum throughput.\n" +#~ msgstr "Prueba con datos aleatorios, deben dar el rendimiento mínimo.\n" -#: src/stored/bextract.c:346 src/stored/read.c:163 src/stored/read.c:290 -#: src/stored/vbackup.c:265 -msgid "Cannot do rehydration, device is not dedup aware\n" -msgstr "" +#~ msgid "Test with zero data and bacula block structure.\n" +#~ msgstr "Prueba con cero de datos y estructura del bloque de Bacula.\n" -#: src/stored/bextract.c:354 -#, c-format -msgid "" -"Got rehydration error at file=%d record=%s fname=%s volsessionid=%d " -"volsessiontime=%d Msg=%s" -msgstr "" +#~ msgid "" +#~ "\n" +#~ "=== Write, rewind, and re-read test ===\n" +#~ "\n" +#~ "I'm going to write %d records and an EOF\n" +#~ "then write %d records and an EOF, then rewind,\n" +#~ "and re-read the data to verify that it is correct.\n" +#~ "\n" +#~ "This is an *essential* feature ...\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "=== Probar Escritura, Rebobinado y Re-lectura === \n" +#~ "\n" +#~ "Voy a escribir %d registros y un EOF\n" +#~ "a continuación escribiré %d registros y un EOF, a continuación, " +#~ "rebobinar,\n" +#~ "y re-leer los datos para verificar que son correctos.\n" +#~ "\n" +#~ "Este es una característica *esencial*...\n" +#~ "\n" -#: src/stored/bextract.c:388 src/stored/bextract.c:426 src/stored/bls.c:400 -#: src/stored/bscan.c:679 -msgid "Cannot continue.\n" -msgstr "No se puede continuar.\n" +#~ msgid "Wrote %d blocks of %d bytes.\n" +#~ msgstr "Escribió %d bloques de %d bytes.\n" -#: src/stored/bextract.c:419 src/stored/bextract.c:691 -msgid "Logic error output file should be open but is not.\n" -msgstr "Error lógico, archivo de salida debería estar abierto, pero no esta.\n" +#~ msgid "Rewind OK.\n" +#~ msgstr "Rebobinar OK.\n" -#: src/stored/bextract.c:446 -#, c-format -msgid "%s was deleted.\n" -msgstr "%s se ha eliminado.\n" +#~ msgid "Got EOF on tape.\n" +#~ msgstr "Obtuvo EOF en la cinta.\n" -#: src/stored/bextract.c:495 -#, c-format -msgid "Seek error on %s: %s\n" -msgstr "Buscar error en %s: %s\n" +#~ msgid "Read block %d failed! ERR=%s\n" +#~ msgstr "Fallo al leer bloque %d! ERR=%s\n" -#: src/stored/bextract.c:550 -#, c-format -msgid "Uncompression error. ERR=%d\n" -msgstr "Error de descompresión. ERR=%d\n" +#~ msgid "Read record failed. Block %d! ERR=%s\n" +#~ msgstr "Fallo al leer registro. Bloque %d! ERR =%s\n" -#: src/stored/bextract.c:619 -#, c-format -msgid "Compressed header version error. version=0x%x\n" -msgstr "" +#~ msgid "Bad data in record. Expected %d, got %d at byte %d. Test failed!\n" +#~ msgstr "" +#~ "Datos incorrectos en el registro. Esperaba %d, obtuvo %d en byte %d. " +#~ "Prueba Fallida!\n" -#: src/stored/bextract.c:648 -#, fuzzy, c-format -msgid "LZO uncompression error. ERR=%d\n" -msgstr "Error de descompresión. ERR=%d\n" +#~ msgid "%d blocks re-read correctly.\n" +#~ msgstr "%d bloques releídos correctamente.\n" -#: src/stored/bextract.c:682 -msgid "Got Program Name or Data Stream. Ignored.\n" -msgstr "Obtener Nombre de Programa o Secuencia de Datos. Ignorado.\n" +#~ msgid "" +#~ "=== Test Succeeded. End Write, rewind, and re-read test ===\n" +#~ "\n" +#~ msgstr "" +#~ "=== Prueba Satisfactoria. Fin prueba de Escritura, Rebobinado y Re-" +#~ "lectura ===\n" +#~ "\n" -#: src/stored/block.c:100 -#, fuzzy -msgid "Error writing final JobMedia record to catalog.\n" -msgstr "Error al escribir registro al bloque.\n" +#~ msgid "Block position test\n" +#~ msgstr "Prueba de posición del bloque\n" -#: src/stored/block.c:148 -#, fuzzy, c-format -msgid "Cannot write block. Device at EOM. dev=%s\n" -msgstr "No se pudo escribir bloque. Dispositivo en EOM.\n" +#~ msgid "Reposition to file:block %d:%d\n" +#~ msgstr "Reposición para archivo:bloque %d:%d\n" -#: src/stored/block.c:153 -#, fuzzy, c-format -msgid "Attempt to write on read-only Volume. dev=%s\n" -msgstr "Intento de escritura en volumen de sólo lectura.\n" +#~ msgid "Reposition error.\n" +#~ msgstr "Error de reposición.\n" -#: src/stored/block.c:159 -#, fuzzy, c-format -msgid "Attempt to write on closed device=%s\n" -msgstr "Intento de escritura en volumen de sólo lectura.\n" +#~ msgid "" +#~ "Read block %d failed! file=%d blk=%d. ERR=%s\n" +#~ "\n" +#~ msgstr "" +#~ "Fallo al leer bloque %d! archivo=%d blk=%d. ERR=%s\n" +#~ "\n" -#: src/stored/block.c:198 -#, c-format -msgid "Unable to write EOF. ERR=%s\n" -msgstr "No se pudo escribir EOF. ERR=%s\n" +#~ msgid "" +#~ "This may be because the tape drive block size is not\n" +#~ " set to variable blocking as normally used by Bacula.\n" +#~ " Please see the Tape Testing chapter in the manual and \n" +#~ " look for using mt with defblksize and setoptions\n" +#~ "If your tape drive block size is correct, then perhaps\n" +#~ " your SCSI driver is *really* stupid and does not\n" +#~ " correctly report the file:block after a FSF. In this\n" +#~ " case try setting:\n" +#~ " Fast Forward Space File = no\n" +#~ " in your Device resource.\n" +#~ msgstr "" +#~ "Esto puede ser porque el tamaño del bloque de la\n" +#~ "unidad de cinta no está establecido en la variable\n" +#~ "de bloqueo como utilizado normalmente por Bacula.\n" +#~ "Consulte el capítulo Probando Cintas en el manual y\n" +#~ "busque por usando mt con defblksize y setoptions.\n" +#~ "Si el tamaño del bloque de la unidad de cinta es correcto,\n" +#~ "entonces quizá el controlador SCSI es *realmente* estúpido\n" +#~ "y no informa correctamente el archivo:bloque después de un FSF.\n" +#~ "En este caso, intente configurar:\n" +#~ " Fast Forward Space File = no\n" +#~ "en su recurso de Dispositivos.\n" + +#~ msgid "Read record failed! ERR=%s\n" +#~ msgstr "Fallo al leer registro! ERR=%s\n" + +#~ msgid "Block %d re-read correctly.\n" +#~ msgstr "Bloque %d re-leído correctamente.\n" -#: src/stored/block.c:234 src/stored/block.c:292 -msgid "Write block header zeroed.\n" -msgstr "Escribir cabecera de bloque cero.\n" +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "=== Append files test ===\n" +#~ "\n" +#~ "This test is essential to Bacula.\n" +#~ "\n" +#~ "I'm going to write one record in file 0,\n" +#~ " two records in file 1,\n" +#~ " and three records in file 2\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "=== Prueba de Añadir Archivos===\n" +#~ "\n" +#~ "Esta prueba es esencial para Bacula.\n" +#~ "\n" +#~ "Voy a escribir un registro en el archivo 0,\n" +#~ " dos registros en el archivo 1,\n" +#~ " y tres registros en el archivo de 2\n" +#~ "\n" -#: src/stored/block.c:284 -#, c-format -msgid "Block checksum changed during write: before=%ud after=%ud\n" -msgstr "" +#~ msgid "Now moving to end of medium.\n" +#~ msgstr "Moviendo ahora a final de medio.\n" -#: src/stored/block.c:311 -#, c-format -msgid "Write error at %u:%u on device %s. ERR=%s.\n" -msgstr "Error de escritura en %u:%u en el dispositivo %s. ERR=%s.\n" +#~ msgid "We should be in file 3. I am at file %d. %s\n" +#~ msgstr "Deberíamos estar en el archivo 3. Estoy en el archivo %d. %s\n" -#: src/stored/block.c:321 -#, fuzzy, c-format -msgid "" -"Out of freespace caused End of Volume \"%s\" at %u:%u on device %s. Write of " -"%u bytes got %d.\n" -msgstr "" -"Fin de Volumen \"%s\" en %u:%u en el dispositivo %s. Escribió %u bytes " -"obtuvo %d.\n" +#~ msgid "This is correct!" +#~ msgstr "Esto es correcto!" -#: src/stored/block.c:326 -#, c-format -msgid "End of Volume \"%s\" at %u:%u on device %s. Write of %u bytes got %d.\n" -msgstr "" -"Fin de Volumen \"%s\" en %u:%u en el dispositivo %s. Escribió %u bytes " -"obtuvo %d.\n" +#~ msgid "This is NOT correct!!!!" +#~ msgstr "Esto NO es correcto!" -#: src/stored/block.c:456 -#, fuzzy -msgid "Job failed or canceled.\n" -msgstr "Job %d cancelado.\n" +#~ msgid "" +#~ "\n" +#~ "Now the important part, I am going to attempt to append to the tape.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Ahora la parte importante, voy a tratar de anexar a la cinta.\n" +#~ "\n" -#: src/stored/block.c:462 -#, fuzzy -msgid "Attempt to read past end of tape or file.\n" -msgstr "Intento de leer sesión no abierta.\n" +#~ msgid "" +#~ "Done appending, there should be no I/O errors\n" +#~ "\n" +#~ msgstr "" +#~ "Añadiendo hecho, no debería haber ningún error de E/S\n" +#~ "\n" -#: src/stored/block.c:470 -#, fuzzy, c-format -msgid "Attempt to read closed device: fd=%d at file:blk %u:%u on device %s\n" -msgstr "" -"Error de lectura en fd=%d desde archivo:blk %u:%u en el dispositivo %s. ERR=" -"%s.\n" +#~ msgid "Doing Bacula scan of blocks:\n" +#~ msgstr "Hacer Bacula exploración de los bloques:\n" -#: src/stored/block.c:483 -#, c-format -msgid "Block buffer size looping problem on device %s\n" -msgstr "Problema de tamaño de búfer del bloque en el dispositivo %s\n" +#~ msgid "End scanning the tape.\n" +#~ msgstr "Fin del escaneo de la cinta.\n" -#: src/stored/block.c:498 -#, c-format -msgid "Unable to open device part=%d %s: ERR=%s\n" -msgstr "No se puede abrir el dispositivo parte =%d %s: ERR=%s\n" +#~ msgid "We should be in file 4. I am at file %d. %s\n" +#~ msgstr "Deberíamos estar en el archivo 4. Estoy en el archivo %d. %s\n" -#: src/stored/block.c:534 -#, fuzzy, c-format -msgid "The Volume=%s on device=%s appears to be unlabeled.\n" -msgstr "Volumen en %s tiene una malo tipo de etiqueta Bacula: %x\n" +#~ msgid "" +#~ "\n" +#~ "Autochanger enabled, but no name or no command device specified.\n" +#~ msgstr "" +#~ "\n" +#~ "Auto-cambiador habilitado, pero ningún nombre o comando de dispositivo " +#~ "especificado.\n" -#: src/stored/block.c:537 -#, c-format -msgid "Read error on fd=%d at file:blk %u:%u on device %s. ERR=%s.\n" -msgstr "" -"Error de lectura en fd=%d desde archivo:blk %u:%u en el dispositivo %s. ERR=" -"%s.\n" +#~ msgid "" +#~ "\n" +#~ "Ah, I see you have an autochanger configured.\n" +#~ "To test the autochanger you must have a blank tape\n" +#~ " that I can write on in Slot 1.\n" +#~ msgstr "" +#~ "\n" +#~ "Ah, veo que tienen un auto-cargador configurado.\n" +#~ "Para probar el auto-cargador debe tener una cinta en blanco\n" +#~ " que yo pueda escribir en la Ranura 1.\n" -#: src/stored/block.c:548 -#, c-format -msgid "The %sVolume=%s on device=%s appears to be unlabeled.\n" -msgstr "" +#~ msgid "" +#~ "\n" +#~ "Do you wish to continue with the Autochanger test? (y/n): " +#~ msgstr "" +#~ "\n" +#~ "¿Desea continuar con la prueba del auto-cambiador? (y/n):" -#: src/stored/block.c:551 -#, fuzzy, c-format -msgid "Read zero %sbytes Vol=%s at %lld on device %s.\n" -msgstr "Leer cero bytes en %u:%u en el dispositivo %s.\n" +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "=== Autochanger test ===\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "=== Prueba Auto-cambiador ===\n" +#~ "\n" -#: src/stored/block.c:585 -#, c-format -msgid "" -"Volume data error at %u:%u! Very short block of %d bytes on device %s " -"discarded.\n" -msgstr "" -"Error datos de volumen en %u:%u! Bloque muy corto de %d bytes en " -"dispositivo %s descartado.\n" +#~ msgid "3301 Issuing autochanger \"loaded\" command.\n" +#~ msgstr "3301 Emitiendo comando auto-cambiador \"cargado\".\n" -#: src/stored/block.c:613 -#, c-format -msgid "Block length %u is greater than buffer %u. Attempting recovery.\n" -msgstr "" -"Longitud del bloque %u es mayor que el buffer %u. Intentando recuperación.\n" +#~ msgid "3991 Bad autochanger command: %s\n" +#~ msgstr "3991 Malo comando cargador: %s\n" -#: src/stored/block.c:633 -#, c-format -msgid "Setting block buffer size to %u bytes.\n" -msgstr "Configurando tamaño del bufer del bloque para %u bytes.\n" +#~ msgid "3991 result=\"%s\": ERR=%s\n" +#~ msgstr "3991 resultado=\"%s\": ERR=%s\n" -#: src/stored/block.c:648 -#, c-format -msgid "" -"Volume data error at %u:%u! Short block of %d bytes on device %s discarded.\n" -msgstr "" -"Error datos de volumen en %u:%u! Bloque corto de %d bytes en dispositivo %s " -"descartado.\n" +#~ msgid "Slot %d loaded. I am going to unload it.\n" +#~ msgstr "Ranura %d cargada. Voy a descargarla.\n" -#: src/stored/block_util.c:93 -#, fuzzy, c-format -msgid "" -"Dump block %s %p: adata=%d size=%d BlkNum=%d\n" -" Hdrcksum=%x cksum=%x\n" -msgstr "" -"Volcado de bloque %s %x: tamaño=%d BlkNum=%d\n" -" Hdrcksum=%x cksum=%x\n" +#~ msgid "Nothing loaded in the drive. OK.\n" +#~ msgstr "Nada cargado en la unidad. OK.\n" -#: src/stored/block_util.c:118 -#, fuzzy, c-format -msgid " Rec: VId=%u VT=%u FI=%s Strm=%s len=%d reclen=%d\n" -msgstr "Rec: VId=%u VT=%u FI=%s Strm=%s len=%d p=%x\n" +#~ msgid "3302 Issuing autochanger \"unload %d %d\" command.\n" +#~ msgstr "3302 Emitiendo comando auto-cambiador \"descargar %d %d\".\n" -#: src/stored/block_util.c:203 -#, c-format -msgid "%d block read errors not printed.\n" -msgstr "%d errores de lectura de bloques no impresos.\n" +#~ msgid "unload status=%s %d\n" +#~ msgstr "estado descargar=%s %d\n" -#: src/stored/block_util.c:341 -#, fuzzy, c-format -msgid "" -"Volume data error at %lld!\n" -"Adata block checksum mismatch in block=%u len=%d: calc=%x blk=%x\n" -msgstr "" -"Error de datos de Volumen en %u:%u!\n" -"Bloque checksum desajustado en bloque=%u len=%d: calc=%x blk=%x\n" +#~ msgid "Bad" +#~ msgstr "Malo" -#: src/stored/block_util.c:376 src/stored/block_util.c:394 -#: src/stored/block_util.c:404 -#, c-format -msgid "" -"Volume data error at %u:%u! Wanted ID: \"%s\", got \"%s\". Buffer " -"discarded.\n" -msgstr "" -"Error de volumen de datos en %u:%u! Se busca ID: \"%s\",se obtiene \"%s\". " -"Buffer descartado.\n" +#~ msgid "3992 Bad autochanger command: %s\n" +#~ msgstr "3992 Malo comando cargador: %s\n" -#: src/stored/block_util.c:419 -#, c-format -msgid "" -"Volume data error at %u:%u! Block length %u is insane (too large), probably " -"due to a bad archive.\n" -msgstr "" -"Error de datos de volumen en %u:%u! Longitud de bloque %u es demente " -"(demasiado grande), probablemente debido a un archivo malo.\n" +#~ msgid "3992 result=\"%s\": ERR=%s\n" +#~ msgstr "3992 resultado=\"%s\": ERR=%s\n" -#: src/stored/block_util.c:446 -#, c-format -msgid "" -"Volume data error at %u:%u!\n" -"Block checksum mismatch in block=%u len=%d: calc=%x blk=%x\n" -msgstr "" -"Error de datos de Volumen en %u:%u!\n" -"Bloque checksum desajustado en bloque=%u len=%d: calc=%x blk=%x\n" +#~ msgid "3303 Issuing autochanger \"load %d %d\" command.\n" +#~ msgstr "3303 Emitiendo comando auto-cambiador \"cargar %d %d\".\n" -#: src/stored/block_util.c:542 -#, fuzzy, c-format -msgid "" -"User defined maximum volume size %s will be exceeded on device %s.\n" -" Marking Volume \"%s\" as Full.\n" -msgstr "" -"Capacidad máxima %s de volumen definido por el usuario superado en el " -"dispositivo %s.\n" +#~ msgid "3303 Autochanger \"load %d %d\" status is OK.\n" +#~ msgstr "3303 Estado auto-cambiador \"carga %d %d\" está OK.\n" -#: src/stored/block_util.c:579 src/stored/block_util.c:585 -#, c-format -msgid "Backspace file at EOT failed. ERR=%s\n" -msgstr "Fallo en retroceso de archivo desde EOT. ERR=%s\n" +#~ msgid "3993 Bad autochanger command: %s\n" +#~ msgstr "3993 Malo comando cargador: %s\n" -#: src/stored/block_util.c:592 -#, c-format -msgid "Backspace record at EOT failed. ERR=%s\n" -msgstr "Fallo en retroceso de registro desde EOT. ERR=%s\n" +#~ msgid "3993 result=\"%s\": ERR=%s\n" +#~ msgstr "3993 resultado=\"%s\": ERR=%s\n" -#: src/stored/block_util.c:609 -#, c-format -msgid "Re-read last block at EOT failed. ERR=%s" -msgstr "Fallo en re-lectura del último bloque en EOT. ERR=%s" +#~ msgid "" +#~ "\n" +#~ "The test failed, probably because you need to put\n" +#~ "a longer sleep time in the mtx-script in the load) case.\n" +#~ "Adding a 30 second sleep and trying again ...\n" +#~ msgstr "" +#~ "\n" +#~ "Fallo la prueba, probablemente porque es necesario poner\n" +#~ "un mayor tiempo de espera en su mtx-script en la clausula load).\n" +#~ "Añadiendo 30 segundos de espera y volviendo a intentarlo...\n" -#: src/stored/block_util.c:619 -#, c-format -msgid "" -"Re-read of last block: block numbers differ by more than one.\n" -"Probable tape misconfiguration and data loss. Read block=%u Want block=%u.\n" -msgstr "" -"Re-lectura del último bloque: número de bloque difieren en más de uno.\n" -"Probable mala configuración de la cinta y pérdida de datos. Leer bloque=%u " -"Espera bloque=%u.\n" +#~ msgid "Wrote EOF to %s\n" +#~ msgstr "Escribió EOF para %s\n" -#: src/stored/block_util.c:624 -#, c-format -msgid "" -"Re-read of last block OK, but block numbers differ. Read block=%u Want block=" -"%u.\n" -msgstr "" -"Re-lectura del último bloque OK, pero número de bloque difieren. Leer bloque=" -"%u Espera bloque=%u.\n" +#~ msgid "" +#~ "\n" +#~ "The test worked this time. Please add:\n" +#~ "\n" +#~ " sleep %d\n" +#~ "\n" +#~ "to your mtx-changer script in the load) case.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "La prueba funcionó esta vez. Por favor, añada:\n" +#~ "\n" +#~ " sleep %d\n" +#~ "\n" +#~ "en su script mtx-cambiador dentro de de la clausula load).\n" +#~ "\n" -#: src/stored/block_util.c:628 -msgid "Re-read of last block succeeded.\n" -msgstr "Éxito en re-lectura del último bloque.\n" +#~ msgid "" +#~ "\n" +#~ "The test autochanger worked!!\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "La prueba del auto-cargador funcionó!!\n" +#~ "\n" -#: src/stored/block_util.c:677 -#, c-format -msgid "" -"Error writing final EOF to tape. This Volume may not be readable.\n" -"%s" -msgstr "" -"Error al escribir EOF final a la cinta. Este volumen puede no ser legible.\n" -"%s" +#~ msgid "You must correct this error or the Autochanger will not work.\n" +#~ msgstr "Usted debe corregir este error o la Auto-cambiador no funcionará.\n" -#: src/stored/block_util.c:695 -#, fuzzy -msgid "Error sending Volume info to Director.\n" -msgstr "Error al obtener Volumen información: %s" +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "=== Forward space files test ===\n" +#~ "\n" +#~ "This test is essential to Bacula.\n" +#~ "\n" +#~ "I'm going to write five files then test forward spacing\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "=== Probar espaciar archivos hacia adelante ===\n" +#~ "\n" +#~ "Esta prueba es esencial para Bacula.\n" +#~ "\n" +#~ "Voy a escribir cinco archivo, a continuación probar espaciado hacia " +#~ "adelante\n" +#~ "\n" -#: src/stored/block_util.c:815 -#, c-format -msgid "" -"Error while writing, current part number is less than the total number of " -"parts (%d/%d, device=%s)\n" -msgstr "" -"Error al escribir, número de parte actual es menor que el número total de " -"partes (%d/%d, dispositivo=%s)\n" +#~ msgid "Now forward spacing 1 file.\n" +#~ msgstr "Ahora espaciando 1 archivo hacia adelante.\n" -#: src/stored/block_util.c:823 -#, c-format -msgid "Unable to open device next part %s: ERR=%s\n" -msgstr "No se puede abrir próxima parte %s del dispositivo: ERR=%s\n" +#~ msgid "Bad status from fsr. ERR=%s\n" +#~ msgstr "Malo estado desde FSR. ERR=%s\n" -#: src/stored/block_util.c:843 -#, c-format -msgid "" -"End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, " -"free_space_errno=%d, errmsg=%s).\n" -msgstr "" -"Fin de Volumen \"%s\" en %u:%u en el dispositivo %s (part_size=%s, " -"free_space=%s, free_space_errno=%d, errmsg=%s).\n" - -#: src/stored/block_util.c:856 -#, c-format -msgid "" -"End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, " -"free_space_errno=%d).\n" -msgstr "" -"Fin de Volumen \"%s\" en %u:%u en el dispositivo %s (part_size=%s, " -"free_space=%s, free_space_errno=%d).\n" - -#: src/stored/bls.c:68 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bls [options] \n" -" -b specify a bootstrap file\n" -" -c specify a Storage configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -e exclude list\n" -" -i include list\n" -" -j list jobs\n" -" -k list blocks\n" -" (no j or k option) list saved files\n" -" -L dump label\n" -" -p proceed inspite of errors\n" -" -v be verbose\n" -" -V specify Volume names (separated by |)\n" -" -E Check records to detect errors\n" -" -? print this message\n" -"\n" -msgstr "" -"\n" -"Versión: %s (%s)\n" -"\n" -"Utilice: bls [opciones] \n" -" -b especifica un archivo bootstrap\n" -" -c especifica un archivo Storage de configuración\n" -" -d establece nivel de depuración para \n" -" -dt imprime timestamp en salida de depuración\n" -" -e lista de exclusión\n" -" -i lista de inclusión\n" -" -j lista de trabajos\n" -" -k lista de bloques\n" -" (no j o k opción) lista de archivos guardados\n" -" -L dump label\n" -" -p proceder a pesar de los errores\n" -" -v detallado\n" -" -V especifica nombres de Volumen (separados por |)\n" -" -? imprime esta mensaje\n" -"\n" - -#: src/stored/bls.c:205 -msgid "No archive name specified\n" -msgstr "Nombre de archivo no especificado\n" - -#: src/stored/bls.c:244 -#, c-format -msgid "" -"\n" -"Warning, this Volume is a continuation of Volume %s\n" -msgstr "" -"\n" -"Advertencia, este Volumen es una continuación del Volumen %s\n" - -#: src/stored/bls.c:291 -#, c-format -msgid "Got EOM at file %u on device %s, Volume \"%s\"\n" -msgstr "Obtuvo EOM en archivo %u en el dispositivo %s, Volumen \"%s\"\n" - -#: src/stored/bls.c:302 -#, c-format -msgid "Mounted Volume \"%s\".\n" -msgstr "Volumen Montado \"%s\".\n" - -#: src/stored/bls.c:304 -#, c-format -msgid "End of file %u on device %s, Volume \"%s\"\n" -msgstr "Fin de archivo %u en el dispositivo %s, Volumen \"%s\"\n" - -#: src/stored/bls.c:329 -#, c-format -msgid "" -"File:blk=%u:%u blk_num=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=" -"%s rlen=%d\n" -msgstr "" -"Archivo:blk=%u:%u blk_num=%u blen=%u Primer registro FI=%s SessId=%u SessTim=" -"%u Strm=%s rlen=%d\n" - -#: src/stored/bls.c:338 -#, c-format -msgid "Block: %d size=%d\n" -msgstr "Bloque: %d tamaño=%d\n" - -#: src/stored/bls.c:402 -msgid "Attrib unpack error!\n" -msgstr "" - -#: src/stored/bls.c:413 -#, c-format -msgid "FileIndex=%d VolSessionId=%d VolSessionTime=%d Stream=%d DataLen=%d\n" -msgstr "FileIndex=%d VolSessionId=%d VolSessionTime=%d Stream=%d DataLen=%d\n" - -#: src/stored/bls.c:458 -#, fuzzy -msgid "End of Physical Medium" -msgstr "Fin de Medio" - -#: src/stored/bls.c:461 -msgid "Start of object" -msgstr "" - -#: src/stored/bls.c:464 -#, fuzzy -msgid "End of object" -msgstr "Fin de la Cinta" - -#: src/stored/bscan.c:105 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bscan [ options ] \n" -" -b bootstrap specify a bootstrap file\n" -" -c specify configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -m update media info in database\n" -" -D specify the driver database name (default NULL)\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database password (default none)\n" -" -h specify database host (default NULL)\n" -" -t specify database port (default 0)\n" -" -p proceed inspite of I/O errors\n" -" -r list records\n" -" -s synchronize or store in database\n" -" -S show scan progress periodically\n" -" -v verbose\n" -" -V specify Volume names (separated by |)\n" -" -w specify working directory (default from conf file)\n" -" -? print this message\n" -"\n" -msgstr "" -"\n" -"Versión: %s (%s)\n" -"\n" -"Utilice: bscan [opciones] \n" -" -b especifica un archivo bootstrap\n" -" -c especifica un archivo de configuración\n" -" -d establece nivel de depuración para \n" -" -dt imprime timestamp en salida de depuración\n" -" -m Actualiza información de los medios en la base de datos\n" -" -D especifica el nombre del driver de base de datos " -"(por defecto NULL)\n" -" -n especifica el nombre de la base de datos (por defecto bacula)\n" -" -u especifica el nombre de usuario de la base de datos (por " -"defecto bacula)\n" -" -P especifica la contraseña de la base de datos (por defecto " -"none)\n" -" -h especifica servidor de la base de datos (por defecto NULL)\n" -" -t especifica el puerto de la base de datos (por defecto 0)\n" -" -p proceder a pesar de los errores\n" -" -r lista de registros\n" - -#: src/stored/bscan.c:254 src/stored/bsdjson.c:481 src/stored/stored.c:349 -#, c-format -msgid "No Working Directory defined in %s. Cannot continue.\n" -msgstr "Directorio de Trabajo no definido en %s. No se puede continuar.\n" - -#: src/stored/bscan.c:262 -#, c-format -msgid "Working Directory: %s not found. Cannot continue.\n" -msgstr "Directorio de Trabajo: %s no encontrado. No se puede continuar.\n" - -#: src/stored/bscan.c:266 -#, c-format -msgid "Working Directory: %s is not a directory. Cannot continue.\n" -msgstr "" -"Directorio de Trabajo: %s no es un directorio. No se puede continuar.\n" - -#: src/stored/bscan.c:280 src/stored/bscan.c:363 -#, c-format -msgid "First Volume Size = %s\n" -msgstr "Tamaño Primero Volumen = %s\n" - -#: src/stored/bscan.c:299 src/tools/bbatch.c:243 src/tools/bvfs_test.c:212 -#, c-format -msgid "Using Database: %s, User: %s\n" -msgstr "Usando Base de Datos: %s, Usuario: %s\n" - -#: src/stored/bscan.c:334 -#, c-format -msgid "Create JobMedia for Job %s\n" -msgstr "Crear JobMedia para Job %s\n" - -#: src/stored/bscan.c:344 -#, c-format -msgid "Could not create JobMedia record for Volume=%s Job=%s\n" -msgstr "No es posible crear registro JobMedia para Volumen=%s Job=%s\n" - -#: src/stored/bscan.c:411 -#, c-format -msgid "done: %d%%\n" -msgstr "Hecho: %d%%\n" - -#: src/stored/bscan.c:435 -msgid "Volume is prelabeled. This tape cannot be scanned.\n" -msgstr "El volumen esta prelabeled. Esta cinta no puede ser escaneada. \n" - -#: src/stored/bscan.c:447 -#, c-format -msgid "Pool record for %s found in DB.\n" -msgstr "Registro Pool para %s encontrado en BD.\n" - -#: src/stored/bscan.c:451 -#, c-format -msgid "VOL_LABEL: Pool record not found for Pool: %s\n" -msgstr "VOL_LABEL: Registro Pool no encontrado para Pool: %s\n" - -#: src/stored/bscan.c:457 -#, c-format -msgid "VOL_LABEL: PoolType mismatch. DB=%s Vol=%s\n" -msgstr "VOL_LABEL: PoolType desajustado. BD=%s Vol=%s\n" - -#: src/stored/bscan.c:461 -#, c-format -msgid "Pool type \"%s\" is OK.\n" -msgstr "Tipo de Pool \"%s\" esta OK.\n" - -#: src/stored/bscan.c:471 -#, c-format -msgid "Media record for %s found in DB.\n" -msgstr "Registro Media para %s encontrado en BD.\n" - -#: src/stored/bscan.c:478 -#, c-format -msgid "VOL_LABEL: Media record not found for Volume: %s\n" -msgstr "VOL_LABEL: Registro Media no encontrado para Volumen: %s\n" - -#: src/stored/bscan.c:485 -#, c-format -msgid "VOL_LABEL: MediaType mismatch. DB=%s Vol=%s\n" -msgstr "VOL_LABEL: MediaType desajustada. BD=%s Vol=%s\n" - -#: src/stored/bscan.c:489 -#, c-format -msgid "Media type \"%s\" is OK.\n" -msgstr "Tipo de Media \"%s\" esta OK.\n" - -#: src/stored/bscan.c:499 -#, c-format -msgid "VOL_LABEL: OK for Volume: %s\n" -msgstr "VOL_LABEL: OK para Volumen: %s\n" - -#: src/stored/bscan.c:506 -#, c-format -msgid "%d \"errors\" ignored before first Start of Session record.\n" -msgstr "" -"%d \"errores\" ignorados antes del primero registro de Inicio de Sesión.\n" - -#: src/stored/bscan.c:517 -#, c-format -msgid "SOS_LABEL: Found Job record for JobId: %d\n" -msgstr "SOS_LABEL: Encontrado registro Job para JobId: %d\n" - -#: src/stored/bscan.c:522 -#, c-format -msgid "SOS_LABEL: Job record not found for JobId: %d\n" -msgstr "SOS_LABEL: Registro Job no encontrado para JobId: %d\n" - -#: src/stored/bscan.c:562 -#, c-format -msgid "SOS_LABEL: VolSessId mismatch for JobId=%u. DB=%d Vol=%d\n" -msgstr "SOS_LABEL: VolSessId desajustado para JobId=%u. BD=%d Vol=%d\n" - -#: src/stored/bscan.c:568 -#, c-format -msgid "SOS_LABEL: VolSessTime mismatch for JobId=%u. DB=%d Vol=%d\n" -msgstr "SOS_LABEL: VolSessTime desajustado para JobId=%u. BD=%d Vol=%d\n" - -#: src/stored/bscan.c:574 -#, c-format -msgid "SOS_LABEL: PoolId mismatch for JobId=%u. DB=%d Vol=%d\n" -msgstr "SOS_LABEL: PoolId diferente para JobId=%u. BD=%d Vol=%d\n" - -#: src/stored/bscan.c:592 src/stored/bscan.c:1146 -#, c-format -msgid "Could not find SessId=%d SessTime=%d for EOS record.\n" -msgstr "No se pudo encontrar SessId=%d SessTime=%d para registro EOS.\n" - -#: src/stored/bscan.c:638 -#, c-format -msgid "Could not update job record. ERR=%s\n" -msgstr "No se pudo actualizar el registro de trabajo. ERR=%s\n" - -#: src/stored/bscan.c:649 -#, c-format -msgid "End of all Volumes. VolFiles=%u VolBlocks=%u VolBytes=%s\n" -msgstr "Final de todos los volúmenes. VolFiles=%u VolBlocks=%u VolBytes=%s\n" - -#: src/stored/bscan.c:661 -#, c-format -msgid "Could not find Job for SessId=%d SessTime=%d record.\n" -msgstr "No se pudo encontrar registro trabajo para SessId=%d SessTime=%d.\n" - -#: src/stored/bscan.c:692 -#, c-format -msgid "%s file records. At file:blk=%s:%s bytes=%s\n" -msgstr "%s registros de archivo. En el archivo:blk=%s:%s bytes=%s\n" - -#: src/stored/bscan.c:757 -#, c-format -msgid "Got MD5 record: %s\n" -msgstr "Obtuvo registro MD5: %s\n" - -#: src/stored/bscan.c:765 -#, c-format -msgid "Got SHA1 record: %s\n" -msgstr "Obtuvo registro SHA1: %s\n" - -#: src/stored/bscan.c:773 -#, c-format -msgid "Got SHA256 record: %s\n" -msgstr "Obtuvo registro SHA256: %s\n" - -#: src/stored/bscan.c:781 -#, c-format -msgid "Got SHA512 record: %s\n" -msgstr "Obtuvo registro SHA512: %s\n" - -#: src/stored/bscan.c:789 src/stored/bscan.c:796 -msgid "Got signed digest record\n" -msgstr "Obtuvo registro resume firmado: %s\n" - -#: src/stored/bscan.c:802 -#, c-format -msgid "Got Prog Names Stream: %s\n" -msgstr "Obtuvo Stream Nombres de Programas: %s\n" - -#: src/stored/bscan.c:808 -msgid "Got Prog Data Stream record.\n" -msgstr "Obtuvo Registro Stream Datos de Programas: %s\n" - -#: src/stored/bscan.c:853 -#, c-format -msgid "Unknown stream type!!! stream=%d len=%i\n" -msgstr "Tipo de flujo desconocido!!! stream=%d len=%i\n" - -#: src/stored/bscan.c:915 -#, c-format -msgid "Could not create File Attributes record. ERR=%s\n" -msgstr "No se pudo crear el registro de Archivos de Atributos. ERR=%s\n" - -#: src/stored/bscan.c:921 -#, c-format -msgid "Created File record: %s\n" -msgstr "Registro Archivo creado: %s\n" - -#: src/stored/bscan.c:966 -#, c-format -msgid "Could not create media record. ERR=%s\n" -msgstr "No es posible crear registro media. ERR=%s\n" - -#: src/stored/bscan.c:970 src/stored/bscan.c:991 -#, c-format -msgid "Could not update media record. ERR=%s\n" -msgstr "No es posible actualizar registro media. ERR=%s\n" - -#: src/stored/bscan.c:974 -#, c-format -msgid "Created Media record for Volume: %s\n" -msgstr "Creado Registro Media para Volumen: %s\n" - -#: src/stored/bscan.c:995 -#, c-format -msgid "Updated Media record at end of Volume: %s\n" -msgstr "Actualizado el registro Media al final del Volumen: %s\n" - -#: src/stored/bscan.c:1012 -#, c-format -msgid "Could not create pool record. ERR=%s\n" -msgstr "No es posible crear el registro Pool. ERR=%s\n" - -#: src/stored/bscan.c:1016 -#, c-format -msgid "Created Pool record for Pool: %s\n" -msgstr "Creado el registro Pool para Pool: %s\n" - -#: src/stored/bscan.c:1035 -#, c-format -msgid "Could not get Client record. ERR=%s\n" -msgstr "No se ha podido obtener el registro del cliente. ERR=%s\n" - -#: src/stored/bscan.c:1045 -#, c-format -msgid "Created Client record for Client: %s\n" -msgstr "Creado registro Cliente para Cliente: %s\n" - -#: src/stored/bscan.c:1062 -#, c-format -msgid "Fileset \"%s\" already exists.\n" -msgstr "Fileset \"%s\" ya existe.\n" - -#: src/stored/bscan.c:1066 -#, c-format -msgid "Could not create FileSet record \"%s\". ERR=%s\n" -msgstr "No es posible crear registro FileSet \"%s\". ERR=%s\n" - -#: src/stored/bscan.c:1071 -#, c-format -msgid "Created FileSet record \"%s\"\n" -msgstr "Creado registro FileSet \"%s\"\n" - -#: src/stored/bscan.c:1118 -#, c-format -msgid "Could not create JobId record. ERR=%s\n" -msgstr "No es posible crear registro JobId. ERR=%s\n" - -#: src/stored/bscan.c:1124 -#, c-format -msgid "Could not update job start record. ERR=%s\n" -msgstr "No se pudo actualizar el registro job de inicio. ERR=%s\n" - -#: src/stored/bscan.c:1127 -#, c-format -msgid "Created new JobId=%u record for original JobId=%u\n" -msgstr "Creado nuevo registro JobId=%u para JobId=%u original\n" - -#: src/stored/bscan.c:1180 -#, c-format -msgid "Could not update JobId=%u record. ERR=%s\n" -msgstr "No se puede actualizar registro JobId=%u. ERR=%s\n" - -#: src/stored/bscan.c:1185 -#, c-format -msgid "Updated Job termination record for JobId=%u Level=%s TermStat=%c\n" -msgstr "" -"Actualizado el registro de terminación de Job para JobId=%u Nivel=%s " -"TermStat=%c\n" - -#: src/stored/bscan.c:1210 -#, c-format -msgid "Job Termination code: %d" -msgstr "Código de Terminación del Job: %d" - -#: src/stored/bscan.c:1215 -#, c-format -msgid "" -"%s\n" -"JobId: %d\n" -"Job: %s\n" -"FileSet: %s\n" -"Backup Level: %s\n" -"Client: %s\n" -"Start time: %s\n" -"End time: %s\n" -"Files Written: %s\n" -"Bytes Written: %s\n" -"Volume Session Id: %d\n" -"Volume Session Time: %d\n" -"Last Volume Bytes: %s\n" -"Termination: %s\n" -"\n" -msgstr "" -"%s\n" -"JobId: %d\n" -"Job: %s\n" -"FileSet: %s\n" -"Nivel de Respaldo: %s\n" -"Cliente: %s\n" -"Hora de Inicio: %s\n" -"Hora de Finalización: %s\n" -"Archivos Escritos: %s\n" -"Bytes Escritos: %s\n" -"Id Volumen Sesión: %d\n" -"Tiempo de la Sesión del Volumen: %d\n" -"Últimos Bytes del Volumen: %s\n" -"Terminación: %s\n" -"\n" - -#: src/stored/bscan.c:1273 -#, c-format -msgid "Could not create JobMedia record. ERR=%s\n" -msgstr "No es posible crear registro JobMedia. ERR=%s\n" - -#: src/stored/bscan.c:1277 -#, c-format -msgid "Created JobMedia record JobId %d, MediaId %d\n" -msgstr "Creado registro JobMedia JobID %d, MediaID %d\n" - -#: src/stored/bscan.c:1293 -#, c-format -msgid "Could not find SessId=%d SessTime=%d for MD5/SHA1 record.\n" -msgstr "No se pudo encontrar SessId=%d SessTime=%d para registro MD5/SHA1.\n" - -#: src/stored/bscan.c:1307 -#, c-format -msgid "Could not add MD5/SHA1 to File record. ERR=%s\n" -msgstr "No se pudo agregar MD5/SHA1 al registro File. ERR=%s\n" - -#: src/stored/bscan.c:1312 -msgid "Updated MD5/SHA1 record\n" -msgstr "Actualizado registro MD5/SHA1\n" - -#: src/stored/bsdjson.c:74 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bsdjson [options] [-c config_file] [config_file]\n" -" -r get resource type \n" -" -n get resource \n" -" -l get only directives matching dirs (use with -r)\n" -" -D get only data\n" -" -c use as configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -t test - read config and exit\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Versión: %s (%s)\n" -"\n" -"Utilice: stored [opciones] [-c archivo_configuración] " -"[archivo_configuración]\n" -" -c usar como archivo de configuración\n" -" -d establecer el nivel de depuración para \n" -" -dt imprimir timestamp en salida de depuración\n" -" -f ejecutar en primer plano (para depuración)\n" -" -g establecer groupid para grupo\n" -" -m imprimir salida kaboom para depuración)\n" -" -p continuar a pesar de errores de E/S\n" -" -s sin señales (para depuración)\n" -" -t prueba - leer la configuración y salir\n" -" -u establecer userid para \n" -" -v mensajes de usuario detallados\n" -" -? imprimir este mensaje.\n" -"\n" - -#: src/stored/bsdjson.c:450 src/stored/butil.c:78 src/stored/stored.c:318 -#, c-format -msgid "No Storage resource defined in %s. Cannot continue.\n" -msgstr "Recurso Storage no definido en %s. No se puede continuar.\n" - -#: src/stored/bsdjson.c:456 src/stored/stored.c:324 -#, c-format -msgid "Only one Storage resource permitted in %s\n" -msgstr "Sólo un recurso Storage permitido en %s\n" - -#: src/stored/bsdjson.c:461 src/stored/stored.c:329 -#, c-format -msgid "No Director resource defined in %s. Cannot continue.\n" -msgstr "Recurso Director no definido en %s. No se puede continuar.\n" - -#: src/stored/bsdjson.c:466 src/stored/stored.c:334 -#, c-format -msgid "No Device resource defined in %s. Cannot continue.\n" -msgstr "Recurso Device no definido en %s. No se puede continuar.\n" - -#: src/stored/bsdjson.c:474 src/stored/stored.c:342 -#, c-format -msgid "No Messages resource defined in %s. Cannot continue.\n" -msgstr "Recurso Mensajes no definido en %s. No se puede continuar.\n" - -#: src/stored/bsdjson.c:503 src/stored/stored.c:371 -#, c-format -msgid "\"TLS Certificate\" file not defined for Storage \"%s\" in %s.\n" -msgstr "Archivo \"TLS Certificate\" no definido para Storage \"%s\" en %s.\n" - -#: src/stored/bsdjson.c:509 src/stored/stored.c:377 -#, c-format -msgid "\"TLS Key\" file not defined for Storage \"%s\" in %s.\n" -msgstr "Archivo \"TLS Key\" no definido para Storage \"%s\" en %s.\n" - -#: src/stored/bsdjson.c:515 src/stored/stored.c:383 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Storage \"%s\" in %s. At least one CA certificate store is required when " -"using \"TLS Verify Peer\".\n" -msgstr "" -"Ni \"Certificado TLS CA \" o \"Directorio del Certificado TLS CA\" están " -"definidos para el Storage \"%s\" en %s. Por lo menos un almacén de " -"Certificados CA es necesario cuando se utiliza \"Verificar TLS Peer\".\n" - -#: src/stored/btape.c:165 src/stored/stored.c:132 -#, c-format -msgid "Tape block size (%d) not multiple of system size (%d)\n" -msgstr "" -"Tamaño de bloque de cinta (%d) no es múltiplo del tamaño de sistema (% d)\n" - -#: src/stored/btape.c:169 src/stored/stored.c:136 -#, c-format -msgid "Tape block size (%d) is not a power of 2\n" -msgstr "Tamaño de bloque de cinta (%d) no es una potencia de 2\n" - -#: src/stored/btape.c:172 -#, c-format -msgid "" -"\n" -"\n" -"!!!! Warning large disk addressing disabled. boffset_t=%d should be 8 or " -"more !!!!!\n" -"\n" -"\n" -msgstr "" -"\n" -"\n" -"!!!! Advertencia, deshabilitado direccionamiento de discos largos. boffset_t=" -"%d debe ser de 8 o más !!!!!\n" -"\n" -"\n" - -#: src/stored/btape.c:179 -#, c-format -msgid "32 bit printf/scanf problem. i=%d x32=%u y32=%u\n" -msgstr "32 bit printf/scanf problema. i=%d x32=%u y32=%u\n" - -#: src/stored/btape.c:188 -msgid "64 bit printf/scanf problem. i=%d x64=%" -msgstr "64 bit printf/scanf problema. i=%d x64=%" - -#: src/stored/btape.c:193 -#, c-format -msgid "Tape block granularity is %d bytes.\n" -msgstr "Granularidad del bloque de cinta es %d bytes.\n" - -#: src/stored/btape.c:269 -msgid "No archive name specified.\n" -msgstr "Nombre de archivo no especificado.\n" - -#: src/stored/btape.c:273 -msgid "Improper number of arguments specified.\n" -msgstr "Número incorrecto de argumentos especificados.\n" - -#: src/stored/btape.c:287 -msgid "btape does not work with DVD storage.\n" -msgstr "btape no funciona con el almacenamiento de DVD.\n" - -#: src/stored/btape.c:292 -msgid "btape only works with tape storage.\n" -msgstr "btape sólo funciona con almacenamiento en cinta.\n" - -#: src/stored/btape.c:378 -#, c-format -msgid "Total Volume bytes=%sB. Total Write rate = %sB/s\n" -msgstr "Volumen total bytes=%sB. Tasa total de Escritura = %sB/s\n" - -#: src/stored/btape.c:404 -#, c-format -msgid "Volume bytes=%sB. Write rate = %sB/s\n" -msgstr "Volumen bytes=%sB. Tasa de Escritura = %sB/s\n" - -#: src/stored/btape.c:472 -#, c-format -msgid "open device %s: OK\n" -msgstr "abrir dispositivo %s: OK\n" - -#: src/stored/btape.c:495 -msgid "Enter Volume Name: " -msgstr "Ingrese nombre de Volumen:" - -#: src/stored/btape.c:502 -#, c-format -msgid "Device open failed. ERR=%s\n" -msgstr "Fallo al abrir dispositivo. ERR=%s\n" - -#: src/stored/btape.c:507 -#, c-format -msgid "Wrote Volume label for volume \"%s\".\n" -msgstr "Escribe la etiqueta de Volumen para el volumen \"%s\".\n" - -#: src/stored/btape.c:521 -msgid "Volume has no label.\n" -msgstr "Volumen no tiene etiqueta.\n" - -#: src/stored/btape.c:524 -msgid "Volume label read correctly.\n" -msgstr "Etiqueta de volumen leída correctamente.\n" - -#: src/stored/btape.c:527 -#, c-format -msgid "I/O error on device: ERR=%s" -msgstr "error de E/S en el dispositivo: ERR=%s" - -#: src/stored/btape.c:530 -#, fuzzy, c-format -msgid "Volume type error: ERR=%s\n" -msgstr "Seek error: ERR=%s\n" - -#: src/stored/btape.c:533 -msgid "Volume name error\n" -msgstr "Nombre de Volumen error\n" - -#: src/stored/btape.c:536 -#, c-format -msgid "Error creating label. ERR=%s" -msgstr "Error creando etiqueta. ERR=%s" - -#: src/stored/btape.c:539 -msgid "Volume version error.\n" -msgstr "Volumen versión error.\n" - -#: src/stored/btape.c:542 -msgid "Bad Volume label type.\n" -msgstr "Malo tipo de etiqueta de volumen.\n" - -#: src/stored/btape.c:545 -msgid "Unknown error.\n" -msgstr "Error desconocido.\n" - -#: src/stored/btape.c:563 -#, c-format -msgid "Bad status from load. ERR=%s\n" -msgstr "Malo estado de carga. ERR=%s\n" - -#: src/stored/btape.c:565 -#, c-format -msgid "Loaded %s\n" -msgstr "Cargado %s\n" - -#: src/stored/btape.c:574 src/stored/btape.c:1137 src/stored/btape.c:1210 -#: src/stored/btape.c:1289 src/stored/btape.c:1559 -#, c-format -msgid "Bad status from rewind. ERR=%s\n" -msgstr "Malo estado de rebobinado. ERR=%s\n" - -#: src/stored/btape.c:577 src/stored/btape.c:1567 -#, c-format -msgid "Rewound %s\n" -msgstr "Rebobinado %s\n" - -#: src/stored/btape.c:603 src/stored/btape.c:1571 -#, c-format -msgid "Bad status from weof. ERR=%s\n" -msgstr "Malo estado de weof. ERR=%s\n" - -#: src/stored/btape.c:607 -#, c-format -msgid "Wrote 1 EOF to %s\n" -msgstr "Escribir 1 EOF para %s\n" - -#: src/stored/btape.c:610 -#, c-format -msgid "Wrote %d EOFs to %s\n" -msgstr "Escribir %d EOFs para %s\n" - -#: src/stored/btape.c:628 -msgid "Moved to end of medium.\n" -msgstr "Movido para el final de la media.\n" - -#: src/stored/btape.c:655 -#, c-format -msgid "Bad status from bsf. ERR=%s\n" -msgstr "Mal estado desde BSF. ERR=%s\n" - -#: src/stored/btape.c:657 -#, c-format -msgid "Backspaced %d file%s.\n" -msgstr "Backspaced %d archivo%s.\n" - -#: src/stored/btape.c:674 -#, c-format -msgid "Bad status from bsr. ERR=%s\n" -msgstr "Malo estado de BSR. ERR=%s\n" - -#: src/stored/btape.c:676 -#, c-format -msgid "Backspaced %d record%s.\n" -msgstr "Backspaced %d registro%s.\n" - -#: src/stored/btape.c:686 src/stored/status.c:626 -#, c-format -msgid "Configured device capabilities:\n" -msgstr "Capacidades del dispositivo configuradas:\n" - -#: src/stored/btape.c:704 -#, c-format -msgid "Device status:\n" -msgstr "Estado del Dispositivo:\n" - -#: src/stored/btape.c:718 src/stored/status.c:682 -#, c-format -msgid "Device parameters:\n" -msgstr "Parámetros del Dispositivo:\n" - -#: src/stored/btape.c:723 -#, c-format -msgid "Status:\n" -msgstr "Estados:\n" - -#: src/stored/btape.c:738 -msgid "" -"Test writing larger and larger records.\n" -"This is a torture test for records.\n" -"I am going to write\n" -"larger and larger records. It will stop when the record size\n" -"plus the header exceeds the block size (by default about 64K)\n" -msgstr "" -"Prueba de escritura de registros cada vez mayores.\n" -"Esta es una prueba de tortura para los registros.\n" -"Voy a escribir\n" -"registros cada vez mayores. Se detendrá cuando el tamaño de registro además " -"de la cabecera excede el tamaño de bloque (por defecto sobre 64K)\n" - -#: src/stored/btape.c:744 -msgid "Do you want to continue? (y/n): " -msgstr "Desea continuar? (y/n)" - -#: src/stored/btape.c:746 src/stored/btape.c:2196 -msgid "Command aborted.\n" -msgstr "Comando Abortado.\n" - -#: src/stored/btape.c:763 -#, c-format -msgid "Block %d i=%d\n" -msgstr "Bloque %d i=%d\n" - -#: src/stored/btape.c:790 -msgid "Skipping read backwards test because BSR turned off.\n" -msgstr "Saltar prueba de lectura hacia atrás, porque BSR esta desactivado.\n" - -#: src/stored/btape.c:794 -msgid "" -"\n" -"=== Write, backup, and re-read test ===\n" -"\n" -"I'm going to write three records and an EOF\n" -"then backup over the EOF and re-read the last record.\n" -"Bacula does this after writing the last block on the\n" -"tape to verify that the block was written correctly.\n" -"\n" -"This is not an *essential* feature ...\n" -"\n" -msgstr "" -"\n" -"=== Prueba de escritura, copia de seguridad y re-lectura ===\n" -"\n" -"Yo voy a escribir 3 registros y un EOF\n" -"a continuación respaldar sobre el EOF y re-leer el ultimo registro.\n" -" Bacula hace esto después de escribir el último bloque en la\n" -"cinta para comprobar que el bloque ha sido escrito correctamente.\n" -"\n" -"Esta es una característica *esencial* ...\n" -"\n" - -#: src/stored/btape.c:807 src/stored/btape.c:818 src/stored/btape.c:829 -#: src/stored/btape.c:1147 src/stored/btape.c:1163 src/stored/btape.c:1903 -#: src/stored/btape.c:2822 -msgid "Error writing record to block.\n" -msgstr "Error al escribir registro al bloque.\n" - -#: src/stored/btape.c:811 src/stored/btape.c:822 src/stored/btape.c:833 -#: src/stored/btape.c:1151 src/stored/btape.c:1167 src/stored/btape.c:1907 -#: src/stored/btape.c:2826 -msgid "Error writing block to device.\n" -msgstr "Error al escribir bloque al dispositivo.\n" - -#: src/stored/btape.c:814 -#, c-format -msgid "Wrote first record of %d bytes.\n" -msgstr "Escribió primer registro de %d bytes.\n" - -#: src/stored/btape.c:825 -#, c-format -msgid "Wrote second record of %d bytes.\n" -msgstr "Escribió segundo registro de %d bytes.\n" - -#: src/stored/btape.c:836 -#, c-format -msgid "Wrote third record of %d bytes.\n" -msgstr "Escribió tercer registro de %d bytes.\n" - -#: src/stored/btape.c:843 src/stored/btape.c:848 -#, c-format -msgid "Backspace file failed! ERR=%s\n" -msgstr "Fallo en retroceso de archivo! ERR=%s\n" - -#: src/stored/btape.c:852 -msgid "Backspaced over EOF OK.\n" -msgstr "Retroceso sobre EOF OK.\n" - -#: src/stored/btape.c:854 -#, c-format -msgid "Backspace record failed! ERR=%s\n" -msgstr "Fallo en retroceso de registro! ERR=%s\n" - -#: src/stored/btape.c:857 -msgid "Backspace record OK.\n" -msgstr "Retroceso de registro OK.\n" - -#: src/stored/btape.c:859 src/stored/btape.c:865 -#, c-format -msgid "Read block failed! ERR=%s\n" -msgstr "Lectura de bloque fallida! ERR=%s\n" - -#: src/stored/btape.c:870 -msgid "Bad data in record. Test failed!\n" -msgstr "Datos erróneos en el registro. Prueba fallida!\n" - -#: src/stored/btape.c:874 -msgid "" -"\n" -"Block re-read correct. Test succeeded!\n" -msgstr "" -"\n" -"Re-lectura de bloque correcta. Prueba Satisfactoria!\n" - -#: src/stored/btape.c:875 -msgid "" -"=== End Write, backup, and re-read test ===\n" -"\n" -msgstr "" -"=== Fin prueba de escritura, copia de seguridad, y re-lectura ===\n" -"\n" - -#: src/stored/btape.c:882 -msgid "" -"This is not terribly serious since Bacula only uses\n" -"this function to verify the last block written to the\n" -"tape. Bacula will skip the last block verification\n" -"if you add:\n" -"\n" -"Backward Space Record = No\n" -"\n" -"to your Storage daemon's Device resource definition.\n" -msgstr "" -"Esto no es terriblemente grave, desde que sólo utilices Bacula\n" -"esta función para verificar el último bloque por escrito en la\n" -"cinta. Bacula saltará la verificación del último bloque\n" -"si usted agrega:\n" -"\n" -"Backward Space Record = NO\n" -"\n" -" en la definición de los recursos de Dispositivos de su demonio Storage.\n" - -#: src/stored/btape.c:904 -#, c-format -msgid "Begin writing %i files of %sB with raw blocks of %u bytes.\n" -msgstr "Inicia escribiendo %i archivos de %sB con raw bloques de %u bytes.\n" - -#: src/stored/btape.c:925 src/stored/btape.c:2878 -#, c-format -msgid "Write failed at block %u. stat=%d ERR=%s\n" -msgstr "Error al escritura en el bloque %u. stat=%d ERR=%s\n" - -#: src/stored/btape.c:959 -#, c-format -msgid "Begin writing %i files of %sB with blocks of %u bytes.\n" -msgstr "Inicia escribiendo %i archivos de %sB con bloques de %u bytes.\n" - -#: src/stored/btape.c:968 -msgid "" -"\n" -"Error writing record to block.\n" -msgstr "" -"\n" -"Error escribiendo registro al bloque.\n" - -#: src/stored/btape.c:972 -msgid "" -"\n" -"Error writing block to device.\n" -msgstr "" -"\n" -"Error escribiendo bloque al dispositivo.\n" - -#: src/stored/btape.c:1027 -msgid "The file_size is too big, stop this test with Ctrl-c.\n" -msgstr "" -"El tamaño_archivo es demasiado grande, detenga esta prueba con Ctrl-c.\n" - -#: src/stored/btape.c:1055 -msgid "Test with zero data, should give the maximum throughput.\n" -msgstr "Prueba con cero de datos, debe dar el máximo rendimiento.\n" - -#: src/stored/btape.c:1067 src/stored/btape.c:1093 -msgid "Test with random data, should give the minimum throughput.\n" -msgstr "Prueba con datos aleatorios, deben dar el rendimiento mínimo.\n" - -#: src/stored/btape.c:1082 -msgid "Test with zero data and bacula block structure.\n" -msgstr "Prueba con cero de datos y estructura del bloque de Bacula.\n" - -#: src/stored/btape.c:1123 -#, c-format -msgid "" -"\n" -"=== Write, rewind, and re-read test ===\n" -"\n" -"I'm going to write %d records and an EOF\n" -"then write %d records and an EOF, then rewind,\n" -"and re-read the data to verify that it is correct.\n" -"\n" -"This is an *essential* feature ...\n" -"\n" -msgstr "" -"\n" -"=== Probar Escritura, Rebobinado y Re-lectura === \n" -"\n" -"Voy a escribir %d registros y un EOF\n" -"a continuación escribiré %d registros y un EOF, a continuación, rebobinar,\n" -"y re-leer los datos para verificar que son correctos.\n" -"\n" -"Este es una característica *esencial*...\n" -"\n" - -#: src/stored/btape.c:1155 src/stored/btape.c:1171 -#, c-format -msgid "Wrote %d blocks of %d bytes.\n" -msgstr "Escribió %d bloques de %d bytes.\n" - -#: src/stored/btape.c:1213 src/stored/btape.c:1292 -msgid "Rewind OK.\n" -msgstr "Rebobinar OK.\n" - -#: src/stored/btape.c:1225 src/stored/btape.c:1343 -msgid "Got EOF on tape.\n" -msgstr "Obtuvo EOF en la cinta.\n" - -#: src/stored/btape.c:1230 -#, c-format -msgid "Read block %d failed! ERR=%s\n" -msgstr "Fallo al leer bloque %d! ERR=%s\n" - -#: src/stored/btape.c:1236 -#, c-format -msgid "Read record failed. Block %d! ERR=%s\n" -msgstr "Fallo al leer registro. Bloque %d! ERR =%s\n" - -#: src/stored/btape.c:1242 src/stored/btape.c:1373 -#, c-format -msgid "Bad data in record. Expected %d, got %d at byte %d. Test failed!\n" -msgstr "" -"Datos incorrectos en el registro. Esperaba %d, obtuvo %d en byte %d. Prueba " -"Fallida!\n" - -#: src/stored/btape.c:1249 -#, c-format -msgid "%d blocks re-read correctly.\n" -msgstr "%d bloques releídos correctamente.\n" - -#: src/stored/btape.c:1252 src/stored/btape.c:1380 -msgid "" -"=== Test Succeeded. End Write, rewind, and re-read test ===\n" -"\n" -msgstr "" -"=== Prueba Satisfactoria. Fin prueba de Escritura, Rebobinado y Re-lectura " -"===\n" -"\n" - -#: src/stored/btape.c:1280 -msgid "Block position test\n" -msgstr "Prueba de posición del bloque\n" - -#: src/stored/btape.c:1335 -#, c-format -msgid "Reposition to file:block %d:%d\n" -msgstr "Reposición para archivo:bloque %d:%d\n" - -#: src/stored/btape.c:1337 -msgid "Reposition error.\n" -msgstr "Error de reposición.\n" - -#: src/stored/btape.c:1349 -#, c-format -msgid "" -"Read block %d failed! file=%d blk=%d. ERR=%s\n" -"\n" -msgstr "" -"Fallo al leer bloque %d! archivo=%d blk=%d. ERR=%s\n" -"\n" - -#: src/stored/btape.c:1351 -msgid "" -"This may be because the tape drive block size is not\n" -" set to variable blocking as normally used by Bacula.\n" -" Please see the Tape Testing chapter in the manual and \n" -" look for using mt with defblksize and setoptions\n" -"If your tape drive block size is correct, then perhaps\n" -" your SCSI driver is *really* stupid and does not\n" -" correctly report the file:block after a FSF. In this\n" -" case try setting:\n" -" Fast Forward Space File = no\n" -" in your Device resource.\n" -msgstr "" -"Esto puede ser porque el tamaño del bloque de la\n" -"unidad de cinta no está establecido en la variable\n" -"de bloqueo como utilizado normalmente por Bacula.\n" -"Consulte el capítulo Probando Cintas en el manual y\n" -"busque por usando mt con defblksize y setoptions.\n" -"Si el tamaño del bloque de la unidad de cinta es correcto,\n" -"entonces quizá el controlador SCSI es *realmente* estúpido\n" -"y no informa correctamente el archivo:bloque después de un FSF.\n" -"En este caso, intente configurar:\n" -" Fast Forward Space File = no\n" -"en su recurso de Dispositivos.\n" - -#: src/stored/btape.c:1367 -#, c-format -msgid "Read record failed! ERR=%s\n" -msgstr "Fallo al leer registro! ERR=%s\n" - -#: src/stored/btape.c:1378 -#, c-format -msgid "Block %d re-read correctly.\n" -msgstr "Bloque %d re-leído correctamente.\n" - -#: src/stored/btape.c:1399 -msgid "" -"\n" -"\n" -"=== Append files test ===\n" -"\n" -"This test is essential to Bacula.\n" -"\n" -"I'm going to write one record in file 0,\n" -" two records in file 1,\n" -" and three records in file 2\n" -"\n" -msgstr "" -"\n" -"\n" -"=== Prueba de Añadir Archivos===\n" -"\n" -"Esta prueba es esencial para Bacula.\n" -"\n" -"Voy a escribir un registro en el archivo 0,\n" -" dos registros en el archivo 1,\n" -" y tres registros en el archivo de 2\n" -"\n" - -#: src/stored/btape.c:1423 -msgid "Now moving to end of medium.\n" -msgstr "Moviendo ahora a final de medio.\n" - -#: src/stored/btape.c:1425 src/stored/btape.c:1654 -#, c-format -msgid "We should be in file 3. I am at file %d. %s\n" -msgstr "Deberíamos estar en el archivo 3. Estoy en el archivo %d. %s\n" - -#: src/stored/btape.c:1426 src/stored/btape.c:1444 src/stored/btape.c:1643 -#: src/stored/btape.c:1655 src/stored/btape.c:1668 src/stored/btape.c:1685 -msgid "This is correct!" -msgstr "Esto es correcto!" - -#: src/stored/btape.c:1426 src/stored/btape.c:1444 src/stored/btape.c:1643 -#: src/stored/btape.c:1655 src/stored/btape.c:1668 src/stored/btape.c:1685 -msgid "This is NOT correct!!!!" -msgstr "Esto NO es correcto!" - -#: src/stored/btape.c:1432 -msgid "" -"\n" -"Now the important part, I am going to attempt to append to the tape.\n" -"\n" -msgstr "" -"\n" -"Ahora la parte importante, voy a tratar de anexar a la cinta.\n" -"\n" - -#: src/stored/btape.c:1439 -msgid "" -"Done appending, there should be no I/O errors\n" -"\n" -msgstr "" -"Añadiendo hecho, no debería haber ningún error de E/S\n" -"\n" - -#: src/stored/btape.c:1440 -msgid "Doing Bacula scan of blocks:\n" -msgstr "Hacer Bacula exploración de los bloques:\n" - -#: src/stored/btape.c:1442 -msgid "End scanning the tape.\n" -msgstr "Fin del escaneo de la cinta.\n" - -#: src/stored/btape.c:1443 src/stored/btape.c:1667 -#, c-format -msgid "We should be in file 4. I am at file %d. %s\n" -msgstr "Deberíamos estar en el archivo 4. Estoy en el archivo %d. %s\n" - -#: src/stored/btape.c:1468 -msgid "" -"\n" -"Autochanger enabled, but no name or no command device specified.\n" -msgstr "" -"\n" -"Auto-cambiador habilitado, pero ningún nombre o comando de dispositivo " -"especificado.\n" - -#: src/stored/btape.c:1472 -msgid "" -"\n" -"Ah, I see you have an autochanger configured.\n" -"To test the autochanger you must have a blank tape\n" -" that I can write on in Slot 1.\n" -msgstr "" -"\n" -"Ah, veo que tienen un auto-cargador configurado.\n" -"Para probar el auto-cargador debe tener una cinta en blanco\n" -" que yo pueda escribir en la Ranura 1.\n" - -#: src/stored/btape.c:1475 -msgid "" -"\n" -"Do you wish to continue with the Autochanger test? (y/n): " -msgstr "" -"\n" -"¿Desea continuar con la prueba del auto-cambiador? (y/n):" - -#: src/stored/btape.c:1482 -msgid "" -"\n" -"\n" -"=== Autochanger test ===\n" -"\n" -msgstr "" -"\n" -"\n" -"=== Prueba Auto-cambiador ===\n" -"\n" - -#: src/stored/btape.c:1491 -msgid "3301 Issuing autochanger \"loaded\" command.\n" -msgstr "3301 Emitiendo comando auto-cambiador \"cargado\".\n" - -#: src/stored/btape.c:1500 -#, c-format -msgid "3991 Bad autochanger command: %s\n" -msgstr "3991 Malo comando cargador: %s\n" - -#: src/stored/btape.c:1501 -#, c-format -msgid "3991 result=\"%s\": ERR=%s\n" -msgstr "3991 resultado=\"%s\": ERR=%s\n" - -#: src/stored/btape.c:1505 -#, c-format -msgid "Slot %d loaded. I am going to unload it.\n" -msgstr "Ranura %d cargada. Voy a descargarla.\n" - -#: src/stored/btape.c:1507 -msgid "Nothing loaded in the drive. OK.\n" -msgstr "Nada cargado en la unidad. OK.\n" - -#: src/stored/btape.c:1514 -#, c-format -msgid "3302 Issuing autochanger \"unload %d %d\" command.\n" -msgstr "3302 Emitiendo comando auto-cambiador \"descargar %d %d\".\n" - -#: src/stored/btape.c:1519 -#, c-format -msgid "unload status=%s %d\n" -msgstr "estado descargar=%s %d\n" - -#: src/stored/btape.c:1519 -msgid "Bad" -msgstr "Malo" - -#: src/stored/btape.c:1522 -#, c-format -msgid "3992 Bad autochanger command: %s\n" -msgstr "3992 Malo comando cargador: %s\n" - -#: src/stored/btape.c:1523 -#, c-format -msgid "3992 result=\"%s\": ERR=%s\n" -msgstr "3992 resultado=\"%s\": ERR=%s\n" - -#: src/stored/btape.c:1533 -#, c-format -msgid "3303 Issuing autochanger \"load %d %d\" command.\n" -msgstr "3303 Emitiendo comando auto-cambiador \"cargar %d %d\".\n" - -#: src/stored/btape.c:1541 -#, c-format -msgid "3303 Autochanger \"load %d %d\" status is OK.\n" -msgstr "3303 Estado auto-cambiador \"carga %d %d\" está OK.\n" - -#: src/stored/btape.c:1545 -#, c-format -msgid "3993 Bad autochanger command: %s\n" -msgstr "3993 Malo comando cargador: %s\n" - -#: src/stored/btape.c:1546 -#, c-format -msgid "3993 result=\"%s\": ERR=%s\n" -msgstr "3993 resultado=\"%s\": ERR=%s\n" - -#: src/stored/btape.c:1561 -msgid "" -"\n" -"The test failed, probably because you need to put\n" -"a longer sleep time in the mtx-script in the load) case.\n" -"Adding a 30 second sleep and trying again ...\n" -msgstr "" -"\n" -"Fallo la prueba, probablemente porque es necesario poner\n" -"un mayor tiempo de espera en su mtx-script en la clausula load).\n" -"Añadiendo 30 segundos de espera y volviendo a intentarlo...\n" - -#: src/stored/btape.c:1574 -#, c-format -msgid "Wrote EOF to %s\n" -msgstr "Escribió EOF para %s\n" - -#: src/stored/btape.c:1578 -#, c-format -msgid "" -"\n" -"The test worked this time. Please add:\n" -"\n" -" sleep %d\n" -"\n" -"to your mtx-changer script in the load) case.\n" -"\n" -msgstr "" -"\n" -"La prueba funcionó esta vez. Por favor, añada:\n" -"\n" -" sleep %d\n" -"\n" -"en su script mtx-cambiador dentro de de la clausula load).\n" -"\n" - -#: src/stored/btape.c:1583 -msgid "" -"\n" -"The test autochanger worked!!\n" -"\n" -msgstr "" -"\n" -"La prueba del auto-cargador funcionó!!\n" -"\n" - -#: src/stored/btape.c:1594 -msgid "You must correct this error or the Autochanger will not work.\n" -msgstr "Usted debe corregir este error o la Auto-cambiador no funcionará.\n" - -#: src/stored/btape.c:1612 -msgid "" -"\n" -"\n" -"=== Forward space files test ===\n" -"\n" -"This test is essential to Bacula.\n" -"\n" -"I'm going to write five files then test forward spacing\n" -"\n" -msgstr "" -"\n" -"\n" -"=== Probar espaciar archivos hacia adelante ===\n" -"\n" -"Esta prueba es esencial para Bacula.\n" -"\n" -"Voy a escribir cinco archivo, a continuación probar espaciado hacia " -"adelante\n" -"\n" - -#: src/stored/btape.c:1637 -msgid "Now forward spacing 1 file.\n" -msgstr "Ahora espaciando 1 archivo hacia adelante.\n" - -#: src/stored/btape.c:1639 src/stored/btape.c:1651 src/stored/btape.c:1664 -#: src/stored/btape.c:1682 src/stored/btape.c:1858 -#, c-format -msgid "Bad status from fsr. ERR=%s\n" -msgstr "Malo estado desde FSR. ERR=%s\n" - -#: src/stored/btape.c:1642 -#, c-format -msgid "We should be in file 1. I am at file %d. %s\n" -msgstr "Debemos estar en el archivo 1. Estoy en el archivo %d. %s\n" - -#: src/stored/btape.c:1649 -msgid "Now forward spacing 2 files.\n" -msgstr "Ahora espaciando 2 archivo hacia adelante.\n" - -#: src/stored/btape.c:1662 -msgid "Now forward spacing 4 files.\n" -msgstr "Ahora espaciando 4 archivo hacia adelante.\n" - -#: src/stored/btape.c:1674 -msgid "" -"The test worked this time. Please add:\n" -"\n" -" Fast Forward Space File = no\n" -"\n" -"to your Device resource for this drive.\n" -msgstr "" -"La prueba funcionó esta vez. Por favor, añadir:\n" -"\n" -" Fast Forward Space File = no\n" -"\n" -"a su recurso Device para esta unidad.\n" - -#: src/stored/btape.c:1680 -msgid "Now forward spacing 1 more file.\n" -msgstr "Ahora espaciando un archivo mas hacia adelante.\n" - -#: src/stored/btape.c:1684 -#, c-format -msgid "We should be in file 5. I am at file %d. %s\n" -msgstr "Debemos estar en el archivo 5. Estoy en el archivo %d. %s\n" - -#: src/stored/btape.c:1689 -msgid "" -"\n" -"=== End Forward space files test ===\n" -"\n" -msgstr "" -"\n" -"=== Finalizo prueba de Espaciar archivos hacia adelante ===\n" -"\n" - -#: src/stored/btape.c:1693 -msgid "" -"\n" -"The forward space file test failed.\n" -msgstr "" -"\n" -"Fallida la prueba de espaciar archivos hacia adelante.\n" - -#: src/stored/btape.c:1695 -msgid "" -"You have Fast Forward Space File enabled.\n" -"I am turning it off then retrying the test.\n" -msgstr "" -"usted tiene habilitado Espaciar Archivos Hacia Adelante Rápido.\n" -"Voy deshabilitarlo y luego volver a intentar la prueba.\n" - -#: src/stored/btape.c:1701 -msgid "" -"You must correct this error or Bacula will not work.\n" -"Some systems, e.g. OpenBSD, require you to set\n" -" Use MTIOCGET= no\n" -"in your device resource. Use with caution.\n" -msgstr "" -"Usted debe corregir este error o Bacula no funcionará.\n" -"Algunos Sistemas, por ejemplo OpenBSD, requiere que usted establezca\n" -"Use MTIOCGET = no\n" -"en su recurso de dispositivo. Utilizar con precaución.\n" - -#: src/stored/btape.c:1735 -msgid "" -"\n" -"Append test failed. Attempting again.\n" -"Setting \"Hardware End of Medium = no\n" -" and \"Fast Forward Space File = no\n" -"and retrying append test.\n" -"\n" -msgstr "" -"\n" -"Prueba de Añadir fallida. Intentando de nuevo.\n" -"Configurando \"Hardware End of Medium = no\n" -" y \"Fast Forward Space File = no\n" -"y volviendo a intentar la prueba de añadir.\n" -"\n" - -#: src/stored/btape.c:1743 -msgid "" -"\n" -"\n" -"It looks like the test worked this time, please add:\n" -"\n" -" Hardware End of Medium = No\n" -"\n" -" Fast Forward Space File = No\n" -"to your Device resource in the Storage conf file.\n" -msgstr "" -"\n" -"\n" -"Parece que la prueba funcionó esta vez, por favor, añadir:\n" -"\n" -" Hardware End of Medium = No\n" -"\n" -" Fast Forward Space File = No\n" -"a su recurso de Device en el archivo configuración del Storage.\n" - -#: src/stored/btape.c:1750 -msgid "" -"\n" -"\n" -"That appears *NOT* to have corrected the problem.\n" -msgstr "" -"\n" -"\n" -"Parece que *NO* se ha corregido el problema.\n" - -#: src/stored/btape.c:1755 -msgid "" -"\n" -"\n" -"It looks like the append failed. Attempting again.\n" -"Setting \"BSF at EOM = yes\" and retrying append test.\n" -msgstr "" -"\n" -"\n" -"Parece que ha fallado el añadir.Intentando de nuevo.\n" -"Configurando \"BSF en EOM = yes\" y reintentando probar añadir.\n" - -#: src/stored/btape.c:1760 -msgid "" -"\n" -"\n" -"It looks like the test worked this time, please add:\n" -"\n" -" Hardware End of Medium = No\n" -" Fast Forward Space File = No\n" -" BSF at EOM = yes\n" -"\n" -"to your Device resource in the Storage conf file.\n" -msgstr "" -"\n" -"\n" -"Parece que la prueba funcionó esta vez, por favor agregue:\n" -"\n" -"Hardware End of Medium = No\n" -" Fast Forward Space File = No\n" -" BSF at EOM = yes\n" -"\n" -"en su recurso Device en el archivo de configuración del Storage.\n" - -#: src/stored/btape.c:1771 -msgid "" -"\n" -"Append test failed.\n" -"\n" -"\n" -"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" -"Unable to correct the problem. You MUST fix this\n" -"problem before Bacula can use your tape drive correctly\n" -"\n" -"Perhaps running Bacula in fixed block mode will work.\n" -"Do so by setting:\n" -"\n" -"Minimum Block Size = nnn\n" -"Maximum Block Size = nnn\n" -"\n" -"in your Storage daemon's Device definition.\n" -"nnn must match your tape driver's block size, which\n" -"can be determined by reading your tape manufacturers\n" -"information, and the information on your kernel dirver.\n" -"Fixed block sizes, however, are not normally an ideal solution.\n" -"\n" -"Some systems, e.g. OpenBSD, require you to set\n" -" Use MTIOCGET= no\n" -"in your device resource. Use with caution.\n" -msgstr "" -"\n" -"Fallo prueba Anexar.\n" -"\n" -"\n" -"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" -"No se puede corregir el problema. Usted DEBE corregir este\n" -"problema antes de que Bacula pueda utilizar su unidad de cinta " -"correctamente \n" -"\n" -"Tal vez ejecutando Bacula en modo de bloque fijo va a funcionar.\n" -"Hacerlo estableciendo:\n" -"\n" -"Minimum Block Size = nnn\n" -"Maximum Block Size = nnn\n" -"\n" -"en la definición de dispositivo del demonio Storage.\n" -"nnn debe coincidir con el tamaño de bloque controlador de su cinta, que\n" -"puede determinarse mediante lectura de información del fabricante de la " -"cinta, y la información en su driver del núcleo.\n" -"Tamaños de bloque fijo, sin embargo, normalmente no son una solución ideal.\n" -"\n" -"Algunos sistemas, por ejemplo OpenBSD, exigen que se establezcan\n" -"Use MTIOCGET= no\n" -"en su recurso de dispositivo. Utilice con precaución.\n" - -#: src/stored/btape.c:1793 -msgid "" -"\n" -"The above Bacula scan should have output identical to what follows.\n" -"Please double check it ...\n" -"=== Sample correct output ===\n" -"1 block of 64448 bytes in file 1\n" -"End of File mark.\n" -"2 blocks of 64448 bytes in file 2\n" -"End of File mark.\n" -"3 blocks of 64448 bytes in file 3\n" -"End of File mark.\n" -"1 block of 64448 bytes in file 4\n" -"End of File mark.\n" -"Total files=4, blocks=7, bytes = 451,136\n" -"=== End sample correct output ===\n" -"\n" -"If the above scan output is not identical to the\n" -"sample output, you MUST correct the problem\n" -"or Bacula will not be able to write multiple Jobs to \n" -"the tape.\n" -"\n" -msgstr "" -"\n" -"La anterior Bacula análisis debe tener una salida idéntica a lo que sigue.\n" -"Por favor, verifique bien ...\n" -"Ejemplo de la salida correcta === n1 bloque de 64448 bytes en el archivo " -"1\n" -"Fin de la marca de archivo.\n" -"2 bloques de 64.448 bytes en el archivo 2\n" -"Fin de la marca de archivo.\n" -"3 bloques de 64448 bytes en el archivo 3\n" -"Fin de la marca de archivo.\n" -"1 bloque de 64448 bytes en el archivo 4\n" -"Fin de la marca de archivo.\n" -"Total de archivos = 4, bloques = 7, bytes = 451.136\n" -"===Fin ejemplo de la salida correcta===\n" -"\n" -"Si la anterior salida de escaneo no es idéntica a la \n" -"salida de ejemplo, usted DEBE corregir el problema\n" -"o Bacula no será capaz de escribir varios Jobs en\n" -"la cinta.\n" -"\n" - -#: src/stored/btape.c:1836 -#, c-format -msgid "Bad status from fsf. ERR=%s\n" -msgstr "Malo estado desde FSF. ERR=%s\n" +#~ msgid "We should be in file 1. I am at file %d. %s\n" +#~ msgstr "Debemos estar en el archivo 1. Estoy en el archivo %d. %s\n" -#: src/stored/btape.c:1840 -msgid "Forward spaced 1 file.\n" -msgstr "Espaciado 1 archivo hacia adelante.\n" +#~ msgid "Now forward spacing 2 files.\n" +#~ msgstr "Ahora espaciando 2 archivo hacia adelante.\n" -#: src/stored/btape.c:1843 -#, c-format -msgid "Forward spaced %d files.\n" -msgstr "Espaciados %d archivos hacia adelante.\n" - -#: src/stored/btape.c:1862 -msgid "Forward spaced 1 record.\n" -msgstr "Espaciado 1 registro hacia adelante.\n" - -#: src/stored/btape.c:1865 -#, c-format -msgid "Forward spaced %d records.\n" -msgstr "Espaciados %d registros hacia adelante.\n" - -#: src/stored/btape.c:1910 -#, c-format -msgid "Wrote one record of %d bytes.\n" -msgstr "Escribió un registro de %d bytes.\n" - -#: src/stored/btape.c:1912 -msgid "Wrote block to device.\n" -msgstr "Escribió bloques al dispositivo.\n" - -#: src/stored/btape.c:1926 -msgid "Enter length to read: " -msgstr "Introduzca la longitud para leer:" - -#: src/stored/btape.c:1931 -msgid "Bad length entered, using default of 1024 bytes.\n" -msgstr "Mala longitud introducida, utilizando 1024 bytes por defecto.\n" - -#: src/stored/btape.c:1940 -#, c-format -msgid "Read of %d bytes gives stat=%d. ERR=%s\n" -msgstr "Lectura de %d bytes obtuvo stat=%d. ERR=%s\n" - -#: src/stored/btape.c:1963 src/stored/btape.c:2012 -#, c-format -msgid "End of tape\n" -msgstr "Fin de la cinta\n" - -#: src/stored/btape.c:1968 -#, c-format -msgid "Starting scan at file %u\n" -msgstr "Iniciando escaneo en el archivo %u\n" - -#: src/stored/btape.c:1973 src/stored/tape_dev.c:614 -#, c-format -msgid "read error on %s. ERR=%s.\n" -msgstr "error de lectura en %s. ERR=%s.\n" - -#: src/stored/btape.c:1975 -#, c-format -msgid "Bad status from read %d. ERR=%s\n" -msgstr "Malo estado desde lectura %d. ERR=%s\n" - -#: src/stored/btape.c:1978 src/stored/btape.c:1992 src/stored/btape.c:2056 -#: src/stored/btape.c:2068 src/stored/btape.c:2081 src/stored/btape.c:2097 -#, c-format -msgid "1 block of %d bytes in file %d\n" -msgstr "1 bloque de %d bytes en el archivo %d\n" - -#: src/stored/btape.c:1981 src/stored/btape.c:1995 src/stored/btape.c:2059 -#: src/stored/btape.c:2071 src/stored/btape.c:2084 src/stored/btape.c:2100 -#, c-format -msgid "%d blocks of %d bytes in file %d\n" -msgstr "%d bloques de %d bytes en archivo %d\n" - -#: src/stored/btape.c:2003 src/stored/btape.c:2075 -#, c-format -msgid "End of File mark.\n" -msgstr "Fin de la marca de archivo.\n" - -#: src/stored/btape.c:2024 src/stored/btape.c:2128 -#, c-format -msgid "Total files=%d, blocks=%d, bytes = %s\n" -msgstr "Total de archivos=%d, bloques=%d, bytes = %s\n" - -#: src/stored/btape.c:2088 -#, c-format -msgid "Short block read.\n" -msgstr "Leer bloque corto.\n" - -#: src/stored/btape.c:2091 -#, c-format -msgid "Error reading block. ERR=%s\n" -msgstr "Error leyendo el bloque. ERR=%s\n" - -#: src/stored/btape.c:2115 -#, c-format -msgid "" -"Block=%u file,blk=%u,%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%s " -"rlen=%d\n" -msgstr "" -"Bloque=%u archivo,blk=%u,%u blen=%u Primero rec FI=%s SessId=%u SessTim=%u " -"Strm=%s rlen=%d\n" - -#: src/stored/btape.c:2137 -#, c-format -msgid "Device status: %u. ERR=%s\n" -msgstr "Estado del dispositivo: %u. ERR=%s\n" - -#: src/stored/btape.c:2169 -#, c-format -msgid "" -"\n" -"This command simulates Bacula writing to a tape.\n" -"It requires either one or two blank tapes, which it\n" -"will label and write.\n" -"\n" -"If you have an autochanger configured, it will use\n" -"the tapes that are in slots 1 and 2, otherwise, you will\n" -"be prompted to insert the tapes when necessary.\n" -"\n" -"It will print a status approximately\n" -"every 322 MB, and write an EOF every %s. If you have\n" -"selected the simple test option, after writing the first tape\n" -"it will rewind it and re-read the last block written.\n" -"\n" -"If you have selected the multiple tape test, when the first tape\n" -"fills, it will ask for a second, and after writing a few more \n" -"blocks, it will stop. Then it will begin re-reading the\n" -"two tapes.\n" -"\n" -"This may take a long time -- hours! ...\n" -"\n" -msgstr "" -"\n" -"Este comando simula Bacula escrito en una cinta.\n" -"Se requiere de una o dos cintas en blanco, que se pueda etiquetar y " -"escribir.\n" -"\n" -"Si usted tiene un auto-cargador configurado, se usará\n" -"las cintas que se encuentran en las ranuras 1 y 2, de lo contrario,\n" -"se le pedirá que inserte las cintas cuando sea necesario.\n" -"\n" -"Se imprimirá un estado a aproximadamente cada 322 MB, y escribirá un EOF " -"cada %s.Si ha seleccionado\n" -"la opción de prueba simple, después de escribir la primera cinta\n" -"se rebobinará y volverá a leer el último bloque escrito.\n" -"\n" -"Si ha seleccionado\n" -"la prueba de la cinta múltiple, cuando la primera cinta se llena, se le " -"preguntará por la segunda, y después de escribir unos pocos\n" -"bloques más, se detendrá. Entonces comenzará a releer las\n" -"dos cintas.\n" -"\n" -"Esto puede tomar mucho tiempo - horas! ...\n" - -#: src/stored/btape.c:2187 -msgid "" -"Do you want to run the simplified test (s) with one tape\n" -"or the complete multiple tape (m) test: (s/m) " -msgstr "" -"¿Desea ejecutar la prueba simplificada (s) con una cinta\n" -"o la prueba completa con múltiples (m) cintas?: (s/m)" - -#: src/stored/btape.c:2190 -msgid "Simple test (single tape) selected.\n" -msgstr "Prueba simple (una sola cinta) seleccionada.\n" - -#: src/stored/btape.c:2193 -msgid "Multiple tape test selected.\n" -msgstr "Múltiples cintas de prueba seleccionados.\n" - -#: src/stored/btape.c:2235 -msgid "Wrote Start of Session label.\n" -msgstr "Escribe la etiqueta de Inicio de Sesión.\n" - -#: src/stored/btape.c:2254 -#, c-format -msgid "%s Begin writing Bacula records to tape ...\n" -msgstr "%s Empezar a escribir registros Bacula en cinta ...\n" - -#: src/stored/btape.c:2256 -#, c-format -msgid "%s Begin writing Bacula records to first tape ...\n" -msgstr "%s Empezar a escribir registros Bacula en la primera cinta ...\n" - -#: src/stored/btape.c:2282 -msgid "Flush block failed.\n" -msgstr "Fallo Flush bloque.\n" - -#: src/stored/btape.c:2296 -#, c-format -msgid "Wrote block=%u, file,blk=%u,%u VolBytes=%s rate=%sB/s\n" -msgstr "Escribió bloque=%u, archivo,blk=%u,%u VolBytes=%s tasa=%sB/s\n" - -#: src/stored/btape.c:2307 -#, c-format -msgid "%s Flush block, write EOF\n" -msgstr "%s Flush bloque, escribir EOF\n" - -#: src/stored/btape.c:2316 -msgid "Wrote 1000 blocks on second tape. Done.\n" -msgstr "Escribió 1000 bloques en segunda cinta. Hecho.\n" - -#: src/stored/btape.c:2321 -msgid "Not OK\n" -msgstr "No OK\n" - -#: src/stored/btape.c:2345 -msgid "Job canceled.\n" -msgstr "Job cancelado.\n" - -#: src/stored/btape.c:2356 -msgid "Set ok=false after write_block_to_device.\n" -msgstr "Establecer ok=false después de write_block_to_device.\n" - -#: src/stored/btape.c:2360 -msgid "Wrote End of Session label.\n" -msgstr "Escribió etiqueta de Fin de Sesión.\n" +#~ msgid "Now forward spacing 4 files.\n" +#~ msgstr "Ahora espaciando 4 archivo hacia adelante.\n" -#: src/stored/btape.c:2384 -#, c-format -msgid "Wrote state file last_block_num1=%d last_block_num2=%d\n" -msgstr "Escribió archivo de estado last_block_num1=%d last_block_num2=%d\n" +#~ msgid "" +#~ "The test worked this time. Please add:\n" +#~ "\n" +#~ " Fast Forward Space File = no\n" +#~ "\n" +#~ "to your Device resource for this drive.\n" +#~ msgstr "" +#~ "La prueba funcionó esta vez. Por favor, añadir:\n" +#~ "\n" +#~ " Fast Forward Space File = no\n" +#~ "\n" +#~ "a su recurso Device para esta unidad.\n" -#: src/stored/btape.c:2388 -#, c-format -msgid "Could not create state file: %s ERR=%s\n" -msgstr "No se puede crear archivo de estado: %s ERR=%s\n" +#~ msgid "Now forward spacing 1 more file.\n" +#~ msgstr "Ahora espaciando un archivo mas hacia adelante.\n" -#: src/stored/btape.c:2399 -#, c-format -msgid "" -"\n" -"\n" -"%s Done filling tape at %d:%d. Now beginning re-read of tape ...\n" -msgstr "" -"\n" -"\n" -"%s Hecho llenado de cinta en %d:%d. Ahora empezando a releer la cinta ...\n" +#~ msgid "We should be in file 5. I am at file %d. %s\n" +#~ msgstr "Debemos estar en el archivo 5. Estoy en el archivo %d. %s\n" -#: src/stored/btape.c:2402 -#, c-format -msgid "" -"\n" -"\n" -"%s Done filling tapes at %d:%d. Now beginning re-read of first tape ...\n" -msgstr "" -"\n" -"\n" -"%s Hecho llenado de cintas en %d:%d. Ahora empezando a releer la primera " -"cinta ...\n" +#~ msgid "" +#~ "\n" +#~ "=== End Forward space files test ===\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "=== Finalizo prueba de Espaciar archivos hacia adelante ===\n" +#~ "\n" -#: src/stored/btape.c:2408 -msgid "do_unfill failed.\n" -msgstr "do_unfill fallido.\n" +#~ msgid "" +#~ "\n" +#~ "The forward space file test failed.\n" +#~ msgstr "" +#~ "\n" +#~ "Fallida la prueba de espaciar archivos hacia adelante.\n" -#: src/stored/btape.c:2413 -#, c-format -msgid "%s: Error during test.\n" -msgstr "%s: Error durante la prueba.\n" +#~ msgid "" +#~ "You have Fast Forward Space File enabled.\n" +#~ "I am turning it off then retrying the test.\n" +#~ msgstr "" +#~ "usted tiene habilitado Espaciar Archivos Hacia Adelante Rápido.\n" +#~ "Voy deshabilitarlo y luego volver a intentar la prueba.\n" -#: src/stored/btape.c:2448 -msgid "" -"\n" -"The state file level has changed. You must redo\n" -"the fill command.\n" -msgstr "" -"\n" -"El estado del archivo de nivel de ha cambiado. Usted debe rehacer\n" -"el comando llenar.\n" +#~ msgid "" +#~ "You must correct this error or Bacula will not work.\n" +#~ "Some systems, e.g. OpenBSD, require you to set\n" +#~ " Use MTIOCGET= no\n" +#~ "in your device resource. Use with caution.\n" +#~ msgstr "" +#~ "Usted debe corregir este error o Bacula no funcionará.\n" +#~ "Algunos Sistemas, por ejemplo OpenBSD, requiere que usted establezca\n" +#~ "Use MTIOCGET = no\n" +#~ "en su recurso de dispositivo. Utilizar con precaución.\n" -#: src/stored/btape.c:2455 -#, c-format -msgid "" -"\n" -"Could not find the state file: %s ERR=%s\n" -"You must redo the fill command.\n" -msgstr "" -"\n" -"No se pudo encontrar el archivo de estado: %s ERR=%s\n" -"Usted debe rehacer el comando llenar.\n" +#~ msgid "" +#~ "\n" +#~ "Append test failed. Attempting again.\n" +#~ "Setting \"Hardware End of Medium = no\n" +#~ " and \"Fast Forward Space File = no\n" +#~ "and retrying append test.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Prueba de Añadir fallida. Intentando de nuevo.\n" +#~ "Configurando \"Hardware End of Medium = no\n" +#~ " y \"Fast Forward Space File = no\n" +#~ "y volviendo a intentar la prueba de añadir.\n" +#~ "\n" -#: src/stored/btape.c:2521 -msgid "Mount first tape. Press enter when ready: " -msgstr "Monte primera cinta. Cuando esté listo, presione ENTER:" +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "It looks like the test worked this time, please add:\n" +#~ "\n" +#~ " Hardware End of Medium = No\n" +#~ "\n" +#~ " Fast Forward Space File = No\n" +#~ "to your Device resource in the Storage conf file.\n" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "Parece que la prueba funcionó esta vez, por favor, añadir:\n" +#~ "\n" +#~ " Hardware End of Medium = No\n" +#~ "\n" +#~ " Fast Forward Space File = No\n" +#~ "a su recurso de Device en el archivo configuración del Storage.\n" -#: src/stored/btape.c:2538 -msgid "Rewinding.\n" -msgstr "Rebobinado.\n" +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "That appears *NOT* to have corrected the problem.\n" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "Parece que *NO* se ha corregido el problema.\n" -#: src/stored/btape.c:2543 -#, c-format -msgid "Reading the first 10000 records from %u:%u.\n" -msgstr "Leyendo los primeros 10.000 registros desde %u:%u.\n" +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "It looks like the append failed. Attempting again.\n" +#~ "Setting \"BSF at EOM = yes\" and retrying append test.\n" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "Parece que ha fallado el añadir.Intentando de nuevo.\n" +#~ "Configurando \"BSF en EOM = yes\" y reintentando probar añadir.\n" -#: src/stored/btape.c:2547 src/stored/btape.c:2616 -#, c-format -msgid "Reposition from %u:%u to %u:%u\n" -msgstr "Reposición desde %u:%u para %u:%u\n" +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "It looks like the test worked this time, please add:\n" +#~ "\n" +#~ " Hardware End of Medium = No\n" +#~ " Fast Forward Space File = No\n" +#~ " BSF at EOM = yes\n" +#~ "\n" +#~ "to your Device resource in the Storage conf file.\n" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "Parece que la prueba funcionó esta vez, por favor agregue:\n" +#~ "\n" +#~ "Hardware End of Medium = No\n" +#~ " Fast Forward Space File = No\n" +#~ " BSF at EOM = yes\n" +#~ "\n" +#~ "en su recurso Device en el archivo de configuración del Storage.\n" -#: src/stored/btape.c:2550 src/stored/btape.c:2603 src/stored/btape.c:2619 -#, c-format -msgid "Reposition error. ERR=%s\n" -msgstr "Error de reposición. ERR=%s\n" +#~ msgid "" +#~ "\n" +#~ "Append test failed.\n" +#~ "\n" +#~ "\n" +#~ "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" +#~ "Unable to correct the problem. You MUST fix this\n" +#~ "problem before Bacula can use your tape drive correctly\n" +#~ "\n" +#~ "Perhaps running Bacula in fixed block mode will work.\n" +#~ "Do so by setting:\n" +#~ "\n" +#~ "Minimum Block Size = nnn\n" +#~ "Maximum Block Size = nnn\n" +#~ "\n" +#~ "in your Storage daemon's Device definition.\n" +#~ "nnn must match your tape driver's block size, which\n" +#~ "can be determined by reading your tape manufacturers\n" +#~ "information, and the information on your kernel dirver.\n" +#~ "Fixed block sizes, however, are not normally an ideal solution.\n" +#~ "\n" +#~ "Some systems, e.g. OpenBSD, require you to set\n" +#~ " Use MTIOCGET= no\n" +#~ "in your device resource. Use with caution.\n" +#~ msgstr "" +#~ "\n" +#~ "Fallo prueba Anexar.\n" +#~ "\n" +#~ "\n" +#~ "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" +#~ "No se puede corregir el problema. Usted DEBE corregir este\n" +#~ "problema antes de que Bacula pueda utilizar su unidad de cinta " +#~ "correctamente \n" +#~ "\n" +#~ "Tal vez ejecutando Bacula en modo de bloque fijo va a funcionar.\n" +#~ "Hacerlo estableciendo:\n" +#~ "\n" +#~ "Minimum Block Size = nnn\n" +#~ "Maximum Block Size = nnn\n" +#~ "\n" +#~ "en la definición de dispositivo del demonio Storage.\n" +#~ "nnn debe coincidir con el tamaño de bloque controlador de su cinta, que\n" +#~ "puede determinarse mediante lectura de información del fabricante de la " +#~ "cinta, y la información en su driver del núcleo.\n" +#~ "Tamaños de bloque fijo, sin embargo, normalmente no son una solución " +#~ "ideal.\n" +#~ "\n" +#~ "Algunos sistemas, por ejemplo OpenBSD, exigen que se establezcan\n" +#~ "Use MTIOCGET= no\n" +#~ "en su recurso de dispositivo. Utilice con precaución.\n" -#: src/stored/btape.c:2553 -#, c-format -msgid "Reading block %u.\n" -msgstr "Leyendo bloque %u.\n" +#~ msgid "" +#~ "\n" +#~ "The above Bacula scan should have output identical to what follows.\n" +#~ "Please double check it ...\n" +#~ "=== Sample correct output ===\n" +#~ "1 block of 64448 bytes in file 1\n" +#~ "End of File mark.\n" +#~ "2 blocks of 64448 bytes in file 2\n" +#~ "End of File mark.\n" +#~ "3 blocks of 64448 bytes in file 3\n" +#~ "End of File mark.\n" +#~ "1 block of 64448 bytes in file 4\n" +#~ "End of File mark.\n" +#~ "Total files=4, blocks=7, bytes = 451,136\n" +#~ "=== End sample correct output ===\n" +#~ "\n" +#~ "If the above scan output is not identical to the\n" +#~ "sample output, you MUST correct the problem\n" +#~ "or Bacula will not be able to write multiple Jobs to \n" +#~ "the tape.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "La anterior Bacula análisis debe tener una salida idéntica a lo que " +#~ "sigue.\n" +#~ "Por favor, verifique bien ...\n" +#~ "Ejemplo de la salida correcta === n1 bloque de 64448 bytes en el " +#~ "archivo 1\n" +#~ "Fin de la marca de archivo.\n" +#~ "2 bloques de 64.448 bytes en el archivo 2\n" +#~ "Fin de la marca de archivo.\n" +#~ "3 bloques de 64448 bytes en el archivo 3\n" +#~ "Fin de la marca de archivo.\n" +#~ "1 bloque de 64448 bytes en el archivo 4\n" +#~ "Fin de la marca de archivo.\n" +#~ "Total de archivos = 4, bloques = 7, bytes = 451.136\n" +#~ "===Fin ejemplo de la salida correcta===\n" +#~ "\n" +#~ "Si la anterior salida de escaneo no es idéntica a la \n" +#~ "salida de ejemplo, usted DEBE corregir el problema\n" +#~ "o Bacula no será capaz de escribir varios Jobs en\n" +#~ "la cinta.\n" +#~ "\n" -#: src/stored/btape.c:2555 src/stored/btape.c:2608 src/stored/btape.c:2624 -#, c-format -msgid "Error reading block: ERR=%s\n" -msgstr "Error leyendo bloque: ERR=%s.\n" +#~ msgid "Bad status from fsf. ERR=%s\n" +#~ msgstr "Malo estado desde FSF. ERR=%s\n" -#: src/stored/btape.c:2560 -msgid "" -"\n" -"The last block on the tape matches. Test succeeded.\n" -"\n" -msgstr "" -"\n" -"El último bloque de la cinta concuerdan. Prueba Satisfactoria.\n" -"\n" +#~ msgid "Forward spaced 1 file.\n" +#~ msgstr "Espaciado 1 archivo hacia adelante.\n" -#: src/stored/btape.c:2563 -msgid "" -"\n" -"The last block of the first tape matches.\n" -"\n" -msgstr "" -"\n" -"El último bloque de la primera cinta concuerdan.\n" -"\n" +#~ msgid "Forward spaced %d files.\n" +#~ msgstr "Espaciados %d archivos hacia adelante.\n" -#: src/stored/btape.c:2587 -msgid "Mount second tape. Press enter when ready: " -msgstr "Monte la segunda cinta. Cuando esté listo, presione ENTER:" +#~ msgid "Forward spaced 1 record.\n" +#~ msgstr "Espaciado 1 registro hacia adelante.\n" -#: src/stored/btape.c:2601 -#, c-format -msgid "Reposition from %u:%u to 0:1\n" -msgstr "Reposición desde %u:%u para 0:1\n" +#~ msgid "Forward spaced %d records.\n" +#~ msgstr "Espaciados %d registros hacia adelante.\n" -#: src/stored/btape.c:2606 src/stored/btape.c:2622 -#, c-format -msgid "Reading block %d.\n" -msgstr "Leyendo bloque %d.\n" +#~ msgid "Wrote one record of %d bytes.\n" +#~ msgstr "Escribió un registro de %d bytes.\n" -#: src/stored/btape.c:2612 -msgid "" -"\n" -"The first block on the second tape matches.\n" -"\n" -msgstr "" -"\n" -"El primer bloque de la segunda cinta concuerdan.\n" -"\n" +#~ msgid "Wrote block to device.\n" +#~ msgstr "Escribió bloques al dispositivo.\n" -#: src/stored/btape.c:2628 -msgid "" -"\n" -"The last block on the second tape matches. Test succeeded.\n" -"\n" -msgstr "" -"\n" -"El último bloque de la segunda cinta concuerdan. Prueba Satisfactoria.\n" -"\n" +#~ msgid "Enter length to read: " +#~ msgstr "Introduzca la longitud para leer:" -#: src/stored/btape.c:2646 -#, c-format -msgid "10000 records read now at %d:%d\n" -msgstr "Leer 10000 registros ahora desde %d:%d\n" +#~ msgid "Bad length entered, using default of 1024 bytes.\n" +#~ msgstr "Mala longitud introducida, utilizando 1024 bytes por defecto.\n" -#: src/stored/btape.c:2672 src/stored/btape.c:2683 src/stored/btape.c:2728 -msgid "Last block written" -msgstr "Ultimo bloque escrito" +#~ msgid "Read of %d bytes gives stat=%d. ERR=%s\n" +#~ msgstr "Lectura de %d bytes obtuvo stat=%d. ERR=%s\n" -#: src/stored/btape.c:2674 src/stored/btape.c:2684 -msgid "Block read back" -msgstr "Bloque que leer" +#~ msgid "End of tape\n" +#~ msgstr "Fin de la cinta\n" -#: src/stored/btape.c:2675 -#, c-format -msgid "" -"\n" -"\n" -"The blocks differ at byte %u\n" -msgstr "" -"\n" -"\n" -"Los bloques difieren en %u byte\n" +#~ msgid "Starting scan at file %u\n" +#~ msgstr "Iniciando escaneo en el archivo %u\n" -#: src/stored/btape.c:2676 -msgid "" -"\n" -"\n" -"!!!! The last block written and the block\n" -"that was read back differ. The test FAILED !!!!\n" -"This must be corrected before you use Bacula\n" -"to write multi-tape Volumes.!!!!\n" -msgstr "" -"\n" -"\n" -"!!!! El último bloque escrito y el bloque\n" -"que se vuelve a leer difieren. La prueba FALLO !!!!\n" -"Esto debe ser corregido antes de utilizar Bacula\n" -"para escribir volúmenes multi-cinta !!!!\n" +#~ msgid "read error on %s. ERR=%s.\n" +#~ msgstr "error de lectura en %s. ERR=%s.\n" -#: src/stored/btape.c:2712 -#, c-format -msgid "Last block at: %u:%u this_dev_block_num=%d\n" -msgstr "Último bloque en: %u:%u this_dev_block_num=%d\n" +#~ msgid "Bad status from read %d. ERR=%s\n" +#~ msgstr "Malo estado desde lectura %d. ERR=%s\n" -#: src/stored/btape.c:2726 -#, c-format -msgid "Block not written: FileIndex=%u blk_block=%u Size=%u\n" -msgstr "Bloque no está escrito: FileIndex=%u blk_block=%u Tamaño=%u\n" +#~ msgid "1 block of %d bytes in file %d\n" +#~ msgstr "1 bloque de %d bytes en el archivo %d\n" -#: src/stored/btape.c:2730 -msgid "Block not written" -msgstr "Bloque no escrito" +#~ msgid "%d blocks of %d bytes in file %d\n" +#~ msgstr "%d bloques de %d bytes en archivo %d\n" -#: src/stored/btape.c:2745 -#, c-format -msgid "End of tape %d:%d. Volume Bytes=%s. Write rate = %sB/s\n" -msgstr "" -"Fin de la cinta %d:%d. Volumen Bytes=%s. Velocidad de Escritura = %sB/s\n" +#~ msgid "End of File mark.\n" +#~ msgstr "Fin de la marca de archivo.\n" -#: src/stored/btape.c:2796 -msgid "Test writing blocks of 64512 bytes to tape.\n" -msgstr "Prueba de escritura de bloques de 64512 bytes a cinta.\n" +#~ msgid "Total files=%d, blocks=%d, bytes = %s\n" +#~ msgstr "Total de archivos=%d, bloques=%d, bytes = %s\n" -#: src/stored/btape.c:2798 -msgid "How many blocks do you want to write? (1000): " -msgstr "¿Cuántos bloques usted quiere escribir? (1000):" +#~ msgid "Short block read.\n" +#~ msgstr "Leer bloque corto.\n" -#: src/stored/btape.c:2815 -#, c-format -msgid "Begin writing %d Bacula blocks to tape ...\n" -msgstr "Empezando a escribir %d bloques Bacula en la cinta ...\n" +#~ msgid "Error reading block. ERR=%s\n" +#~ msgstr "Error leyendo el bloque. ERR=%s\n" -#: src/stored/btape.c:2858 -#, c-format -msgid "Begin writing raw blocks of %u bytes.\n" -msgstr "Empezando a escribir bloques raw de %u bytes.\n" +#~ msgid "" +#~ "Block=%u file,blk=%u,%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=" +#~ "%s rlen=%d\n" +#~ msgstr "" +#~ "Bloque=%u archivo,blk=%u,%u blen=%u Primero rec FI=%s SessId=%u SessTim=" +#~ "%u Strm=%s rlen=%d\n" -#: src/stored/btape.c:2889 -msgid "test autochanger" -msgstr "prueba Autochanger" +#~ msgid "Device status: %u. ERR=%s\n" +#~ msgstr "Estado del dispositivo: %u. ERR=%s\n" -#: src/stored/btape.c:2890 -msgid "backspace file" -msgstr "archivo de retroceso" +#~ msgid "" +#~ "\n" +#~ "This command simulates Bacula writing to a tape.\n" +#~ "It requires either one or two blank tapes, which it\n" +#~ "will label and write.\n" +#~ "\n" +#~ "If you have an autochanger configured, it will use\n" +#~ "the tapes that are in slots 1 and 2, otherwise, you will\n" +#~ "be prompted to insert the tapes when necessary.\n" +#~ "\n" +#~ "It will print a status approximately\n" +#~ "every 322 MB, and write an EOF every %s. If you have\n" +#~ "selected the simple test option, after writing the first tape\n" +#~ "it will rewind it and re-read the last block written.\n" +#~ "\n" +#~ "If you have selected the multiple tape test, when the first tape\n" +#~ "fills, it will ask for a second, and after writing a few more \n" +#~ "blocks, it will stop. Then it will begin re-reading the\n" +#~ "two tapes.\n" +#~ "\n" +#~ "This may take a long time -- hours! ...\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Este comando simula Bacula escrito en una cinta.\n" +#~ "Se requiere de una o dos cintas en blanco, que se pueda etiquetar y " +#~ "escribir.\n" +#~ "\n" +#~ "Si usted tiene un auto-cargador configurado, se usará\n" +#~ "las cintas que se encuentran en las ranuras 1 y 2, de lo contrario,\n" +#~ "se le pedirá que inserte las cintas cuando sea necesario.\n" +#~ "\n" +#~ "Se imprimirá un estado a aproximadamente cada 322 MB, y escribirá un EOF " +#~ "cada %s.Si ha seleccionado\n" +#~ "la opción de prueba simple, después de escribir la primera cinta\n" +#~ "se rebobinará y volverá a leer el último bloque escrito.\n" +#~ "\n" +#~ "Si ha seleccionado\n" +#~ "la prueba de la cinta múltiple, cuando la primera cinta se llena, se le " +#~ "preguntará por la segunda, y después de escribir unos pocos\n" +#~ "bloques más, se detendrá. Entonces comenzará a releer las\n" +#~ "dos cintas.\n" +#~ "\n" +#~ "Esto puede tomar mucho tiempo - horas! ...\n" -#: src/stored/btape.c:2891 -msgid "backspace record" -msgstr "registro de retroceso" +#~ msgid "" +#~ "Do you want to run the simplified test (s) with one tape\n" +#~ "or the complete multiple tape (m) test: (s/m) " +#~ msgstr "" +#~ "¿Desea ejecutar la prueba simplificada (s) con una cinta\n" +#~ "o la prueba completa con múltiples (m) cintas?: (s/m)" -#: src/stored/btape.c:2892 -msgid "list device capabilities" -msgstr "lista de las capacidades del dispositivo" +#~ msgid "Simple test (single tape) selected.\n" +#~ msgstr "Prueba simple (una sola cinta) seleccionada.\n" -#: src/stored/btape.c:2893 -msgid "clear tape errors" -msgstr "Errores Cinta de Limpieza" +#~ msgid "Multiple tape test selected.\n" +#~ msgstr "Múltiples cintas de prueba seleccionados.\n" -#: src/stored/btape.c:2894 -msgid "go to end of Bacula data for append" -msgstr "ir al final de los datos de Bacula para añadir" +#~ msgid "Wrote Start of Session label.\n" +#~ msgstr "Escribe la etiqueta de Inicio de Sesión.\n" -#: src/stored/btape.c:2895 -msgid "go to the physical end of medium" -msgstr "ir al final del medio físico" +#~ msgid "%s Begin writing Bacula records to tape ...\n" +#~ msgstr "%s Empezar a escribir registros Bacula en cinta ...\n" -#: src/stored/btape.c:2896 -msgid "fill tape, write onto second volume" -msgstr "llenar cinta, escribir en segundo volumen" +#~ msgid "%s Begin writing Bacula records to first tape ...\n" +#~ msgstr "%s Empezar a escribir registros Bacula en la primera cinta ...\n" -#: src/stored/btape.c:2897 -msgid "read filled tape" -msgstr "leer cinta llena" +#~ msgid "Flush block failed.\n" +#~ msgstr "Fallo Flush bloque.\n" -#: src/stored/btape.c:2898 -msgid "forward space a file" -msgstr "espaciar un archivo hacia adelante" +#~ msgid "Wrote block=%u, file,blk=%u,%u VolBytes=%s rate=%sB/s\n" +#~ msgstr "Escribió bloque=%u, archivo,blk=%u,%u VolBytes=%s tasa=%sB/s\n" -#: src/stored/btape.c:2899 -msgid "forward space a record" -msgstr "espaciar un registro hacia adelante" +#~ msgid "%s Flush block, write EOF\n" +#~ msgstr "%s Flush bloque, escribir EOF\n" -#: src/stored/btape.c:2900 -msgid "print this command" -msgstr "imprimir este comando" +#~ msgid "Wrote 1000 blocks on second tape. Done.\n" +#~ msgstr "Escribió 1000 bloques en segunda cinta. Hecho.\n" -#: src/stored/btape.c:2901 -msgid "write a Bacula label to the tape" -msgstr "escribir una etiqueta Bacula en la cinta" +#~ msgid "Not OK\n" +#~ msgstr "No OK\n" -#: src/stored/btape.c:2902 -msgid "load a tape" -msgstr "cargar una cinta" +#~ msgid "Job canceled.\n" +#~ msgstr "Job cancelado.\n" -#: src/stored/btape.c:2903 -msgid "quit btape" -msgstr "salir btape" +#~ msgid "Set ok=false after write_block_to_device.\n" +#~ msgstr "Establecer ok=false después de write_block_to_device.\n" -#: src/stored/btape.c:2904 -msgid "use write() to fill tape" -msgstr "usar write() para llenar la cinta" +#~ msgid "Wrote End of Session label.\n" +#~ msgstr "Escribió etiqueta de Fin de Sesión.\n" -#: src/stored/btape.c:2905 -msgid "read and print the Bacula tape label" -msgstr "leer e imprimir la etiqueta Bacula de la cinta" +#~ msgid "Wrote state file last_block_num1=%d last_block_num2=%d\n" +#~ msgstr "Escribió archivo de estado last_block_num1=%d last_block_num2=%d\n" -#: src/stored/btape.c:2906 -msgid "test record handling functions" -msgstr "prueba de manejo de registro de funciones" +#~ msgid "Could not create state file: %s ERR=%s\n" +#~ msgstr "No se puede crear archivo de estado: %s ERR=%s\n" -#: src/stored/btape.c:2907 -msgid "rewind the tape" -msgstr "rebobinar la cinta" +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "%s Done filling tape at %d:%d. Now beginning re-read of tape ...\n" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "%s Hecho llenado de cinta en %d:%d. Ahora empezando a releer la " +#~ "cinta ...\n" -#: src/stored/btape.c:2908 -msgid "read() tape block by block to EOT and report" -msgstr "leer() cinta bloque por bloque para EOT y reportar" +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "%s Done filling tapes at %d:%d. Now beginning re-read of first tape ...\n" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "%s Hecho llenado de cintas en %d:%d. Ahora empezando a releer la primera " +#~ "cinta ...\n" -#: src/stored/btape.c:2909 -msgid "Bacula read block by block to EOT and report" -msgstr "Bacula leer bloque por bloque para EOT y reportar" +#~ msgid "do_unfill failed.\n" +#~ msgstr "do_unfill fallido.\n" -#: src/stored/btape.c:2910 -msgid "" -"[file_size=n(GB)|nb_file=3|skip_zero|skip_random|skip_raw|skip_block] report " -"drive speed" -msgstr "" -"[file_size=n(GB)|nb_file=3|skip_zero|skip_random|skip_raw|skip_block] " -"informe de velocidad de la unidad" +#~ msgid "%s: Error during test.\n" +#~ msgstr "%s: Error durante la prueba.\n" -#: src/stored/btape.c:2911 -msgid "print tape status" -msgstr "imprimir estado de la cinta" +#~ msgid "" +#~ "\n" +#~ "The state file level has changed. You must redo\n" +#~ "the fill command.\n" +#~ msgstr "" +#~ "\n" +#~ "El estado del archivo de nivel de ha cambiado. Usted debe rehacer\n" +#~ "el comando llenar.\n" -#: src/stored/btape.c:2912 -msgid "General test Bacula tape functions" -msgstr "Prueba general de las funciones de cinta Bacula" +#~ msgid "" +#~ "\n" +#~ "Could not find the state file: %s ERR=%s\n" +#~ "You must redo the fill command.\n" +#~ msgstr "" +#~ "\n" +#~ "No se pudo encontrar el archivo de estado: %s ERR=%s\n" +#~ "Usted debe rehacer el comando llenar.\n" -#: src/stored/btape.c:2913 -msgid "write an EOF on the tape" -msgstr "escribir un EOF en la cinta" +#~ msgid "Mount first tape. Press enter when ready: " +#~ msgstr "Monte primera cinta. Cuando esté listo, presione ENTER:" -#: src/stored/btape.c:2914 -msgid "write a single Bacula block" -msgstr "escribir un único bloque de Bacula" +#~ msgid "Rewinding.\n" +#~ msgstr "Rebobinado.\n" -#: src/stored/btape.c:2915 -msgid "read a single record" -msgstr "leer un solo registro" +#~ msgid "Reading the first 10000 records from %u:%u.\n" +#~ msgstr "Leyendo los primeros 10.000 registros desde %u:%u.\n" -#: src/stored/btape.c:2916 -msgid "read a single Bacula block" -msgstr "leer un único bloque de Bacula" +#~ msgid "Reposition from %u:%u to %u:%u\n" +#~ msgstr "Reposición desde %u:%u para %u:%u\n" -#: src/stored/btape.c:2917 -msgid "quick fill command" -msgstr "comando de llenado rápido" +#~ msgid "Reposition error. ERR=%s\n" +#~ msgstr "Error de reposición. ERR=%s\n" -#: src/stored/btape.c:2938 -#, c-format -msgid "\"%s\" is an invalid command\n" -msgstr "\"%s\" es un comando inválido\n" +#~ msgid "Reading block %u.\n" +#~ msgstr "Leyendo bloque %u.\n" -#: src/stored/btape.c:2947 -#, c-format -msgid "Interactive commands:\n" -msgstr "Comandos interactivos:\n" +#~ msgid "Error reading block: ERR=%s\n" +#~ msgstr "Error leyendo bloque: ERR=%s.\n" -#: src/stored/btape.c:2958 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: btape \n" -" -b specify bootstrap file\n" -" -c set configuration file to file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -p proceed inspite of I/O errors\n" -" -s turn off signals\n" -" -v be verbose\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Versión: %s (%s)\n" -"\n" -"Utilice: btape \n" -" -b especifica un archivo bootstrap\n" -" -c especifica un archivo File de configuración\n" -" -d establece nivel de depuración para \n" -" -dt imprime timestamp en salida de depuración\n" -" -p proceder a pesar de los errores de E/S\n" -" -s desactivar señales\n" -" -v detallado\n" -" -? imprime esta mensaje.\n" -"\n" +#~ msgid "" +#~ "\n" +#~ "The last block on the tape matches. Test succeeded.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "El último bloque de la cinta concuerdan. Prueba Satisfactoria.\n" +#~ "\n" -#: src/stored/btape.c:3046 -#, c-format -msgid "Mount second Volume on device %s and press return when ready: " -msgstr "" -"Monte el segundo volumen en el dispositivo %s y pulse ENTER cuando esté " -"listo:" +#~ msgid "" +#~ "\n" +#~ "The last block of the first tape matches.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "El último bloque de la primera cinta concuerdan.\n" +#~ "\n" -#: src/stored/btape.c:3074 -#, c-format -msgid "Mount blank Volume on device %s and press return when ready: " -msgstr "" -"Monte un volumen en blanco en el dispositivo %s y pulse ENTER cuando esté " -"listo:" +#~ msgid "Mount second tape. Press enter when ready: " +#~ msgstr "Monte la segunda cinta. Cuando esté listo, presione ENTER:" -#: src/stored/btape.c:3094 -#, c-format -msgid "End of Volume \"%s\" %d records.\n" -msgstr "Fin del Volumen \"%s\" %d registros.\n" +#~ msgid "Reposition from %u:%u to 0:1\n" +#~ msgstr "Reposición desde %u:%u para 0:1\n" -#: src/stored/btape.c:3108 -#, c-format -msgid "Read block=%u, VolBytes=%s rate=%sB/s\n" -msgstr "Leer bloque=%u, VolBytes=%s velocidad=%sB/s\n" +#~ msgid "Reading block %d.\n" +#~ msgstr "Leyendo bloque %d.\n" -#: src/stored/btape.c:3121 -#, c-format -msgid "Cannot open Dev=%s, Vol=%s\n" -msgstr "No se puede abrir Dev=%s, Vol=%s\n" +#~ msgid "" +#~ "\n" +#~ "The first block on the second tape matches.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "El primer bloque de la segunda cinta concuerdan.\n" +#~ "\n" -#: src/stored/butil.c:48 -msgid "Nohdr," -msgstr "Nohdr," +#~ msgid "" +#~ "\n" +#~ "The last block on the second tape matches. Test succeeded.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "El último bloque de la segunda cinta concuerdan. Prueba Satisfactoria.\n" +#~ "\n" -#: src/stored/butil.c:51 -msgid "partial," -msgstr "parcial," +#~ msgid "10000 records read now at %d:%d\n" +#~ msgstr "Leer 10000 registros ahora desde %d:%d\n" -#: src/stored/butil.c:54 -msgid "empty," -msgstr "vacío," +#~ msgid "Last block written" +#~ msgstr "Ultimo bloque escrito" -#: src/stored/butil.c:57 -msgid "Nomatch," -msgstr "Nomatch," +#~ msgid "Block read back" +#~ msgstr "Bloque que leer" -#: src/stored/butil.c:60 -msgid "cont," -msgstr "cont," +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "The blocks differ at byte %u\n" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "Los bloques difieren en %u byte\n" -#: src/stored/butil.c:150 -msgid "Volume name or names is too long. Please use a .bsr file.\n" -msgstr "" -"Nombre de Volumen o nombres es demasiado largo. Por favor, use un archivo ." -"BSR.\n" +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "!!!! The last block written and the block\n" +#~ "that was read back differ. The test FAILED !!!!\n" +#~ "This must be corrected before you use Bacula\n" +#~ "to write multi-tape Volumes.!!!!\n" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "!!!! El último bloque escrito y el bloque\n" +#~ "que se vuelve a leer difieren. La prueba FALLO !!!!\n" +#~ "Esto debe ser corregido antes de utilizar Bacula\n" +#~ "para escribir volúmenes multi-cinta !!!!\n" -#: src/stored/butil.c:170 -#, c-format -msgid "Cannot find device \"%s\" in config file %s.\n" -msgstr "" -"No se puede encontrar el dispositivo \"%s\" en el archivo de configuración " -"%s.\n" +#~ msgid "Last block at: %u:%u this_dev_block_num=%d\n" +#~ msgstr "Último bloque en: %u:%u this_dev_block_num=%d\n" -#: src/stored/butil.c:177 -#, c-format -msgid "Cannot init device %s\n" -msgstr "No se pudo iniciar dispositivo %s\n" +#~ msgid "Block not written: FileIndex=%u blk_block=%u Size=%u\n" +#~ msgstr "Bloque no está escrito: FileIndex=%u blk_block=%u Tamaño=%u\n" -#: src/stored/butil.c:203 -#, c-format -msgid "Cannot open %s\n" -msgstr "No se pudo abrir %s\n" +#~ msgid "Block not written" +#~ msgstr "Bloque no escrito" -#: src/stored/butil.c:290 -#, c-format -msgid "Could not find device \"%s\" in config file %s.\n" -msgstr "" -"No se pudo encontrar dispositivo \"%s\" en el archivo de configuración %s.\n" +#~ msgid "End of tape %d:%d. Volume Bytes=%s. Write rate = %sB/s\n" +#~ msgstr "" +#~ "Fin de la cinta %d:%d. Volumen Bytes=%s. Velocidad de Escritura = %sB/s\n" -#: src/stored/butil.c:295 -#, c-format -msgid "Using device: \"%s\" for writing.\n" -msgstr "Utilizando el dispositivo: \"%s\" para escritura.\n" +#~ msgid "Test writing blocks of 64512 bytes to tape.\n" +#~ msgstr "Prueba de escritura de bloques de 64512 bytes a cinta.\n" -#: src/stored/butil.c:297 -#, c-format -msgid "Using device: \"%s\" for reading.\n" -msgstr "Utilizando el dispositivo: \"%s\" para lectura.\n" +#~ msgid "How many blocks do you want to write? (1000): " +#~ msgstr "¿Cuántos bloques usted quiere escribir? (1000):" -#: src/stored/butil.c:313 -msgid "Unexpected End of Data\n" -msgstr "Fin Inesperado de los Datos\n" +#~ msgid "Begin writing %d Bacula blocks to tape ...\n" +#~ msgstr "Empezando a escribir %d bloques Bacula en la cinta ...\n" -#: src/stored/butil.c:315 -msgid "Unexpected End of Tape\n" -msgstr "Fin Inesperado de la Cinta\n" +#~ msgid "Begin writing raw blocks of %u bytes.\n" +#~ msgstr "Empezando a escribir bloques raw de %u bytes.\n" -#: src/stored/butil.c:317 -msgid "Unexpected End of File\n" -msgstr "Fin Inesperado del Archivo\n" +#~ msgid "test autochanger" +#~ msgstr "prueba Autochanger" -#: src/stored/butil.c:319 -msgid "Tape Door is Open\n" -msgstr "Puerta de la cinta está abierta\n" +#~ msgid "backspace file" +#~ msgstr "archivo de retroceso" -#: src/stored/butil.c:321 -msgid "Unexpected Tape is Off-line\n" -msgstr "Inesperado Cinta esta off-line\n" +#~ msgid "backspace record" +#~ msgstr "registro de retroceso" -#: src/stored/dde_status.c:149 -#, fuzzy -msgid "Dedupengine status:\n" -msgstr "Estado del Dispositivo:\n" +#~ msgid "list device capabilities" +#~ msgstr "lista de las capacidades del dispositivo" -#: src/stored/dde_status.c:159 -#, c-format -msgid "" -" DDE: hash_count=%llu ref_count=%llu ref_size=%sB\n" -" ref_ratio=%.2f size_ratio=%.2f dde_errors=%llu\n" -msgstr "" +#~ msgid "clear tape errors" +#~ msgstr "Errores Cinta de Limpieza" -#: src/stored/dde_status.c:167 -#, c-format -msgid "" -" Config: bnum=%lld bmin=%lld bmax=%lld mlock_strategy=%ld mlocked=%lldMB " -"mlock_max=%lldMB\n" -msgstr "" +#~ msgid "go to end of Bacula data for append" +#~ msgstr "ir al final de los datos de Bacula para añadir" -#: src/stored/dde_status.c:173 -#, c-format -msgid " Addr: bad_addr=%llu bad_bucket=%llu wrong=%llu\n" -msgstr "" +#~ msgid "go to the physical end of medium" +#~ msgstr "ir al final del medio físico" -#: src/stored/dde_status.c:178 -#, c-format -msgid "" -" Containers: chunk_allocated=%llu chunk_used=%llu\n" -" disk_space_allocated=%sB disk_space_used=%sB containers_errors=%llu\n" -msgstr "" +#~ msgid "fill tape, write onto second volume" +#~ msgstr "llenar cinta, escribir en segundo volumen" -#: src/stored/dde_status.c:199 -#, c-format -msgid "" -" Vacuum: last_run=\"%s\" duration=%llus ref_count=%llu ref_size=%sB\n" -" vacuum_errors=%llu\n" -msgstr "" +#~ msgid "read filled tape" +#~ msgstr "leer cinta llena" -#: src/stored/dde_status.c:205 -#, c-format -msgid " Stats: read_chunk=%llu query_hash=%llu new_hash=%llu calc_hash=%llu\n" -msgstr "" +#~ msgid "forward space a file" +#~ msgstr "espaciar un archivo hacia adelante" -#: src/stored/dde_status.c:213 -#, c-format -msgid " acc_container_cnt[%d]:%s %14llu\n" -msgstr "" +#~ msgid "forward space a record" +#~ msgstr "espaciar un registro hacia adelante" -#: src/stored/dde_status.c:226 -#, c-format -msgid " [%d]%s filesize=%sB/%sB usage=%llu/%llu/%llu %3llu%% %s\n" -msgstr "" +#~ msgid "print this command" +#~ msgstr "imprimir este comando" -#: src/stored/dde_status.c:239 -#, c-format -msgid " [%d]%s filesize=%sB/%sB usage=%llu/%llu/%llu %3llu%%\n" -msgstr "" +#~ msgid "write a Bacula label to the tape" +#~ msgstr "escribir una etiqueta Bacula en la cinta" -#: src/stored/dde_vacuum.c:84 -#, c-format -msgid "" -"Skipping volume \"%s\" from vacuum process, the volume is only created in " -"the catalog.\n" -msgstr "" +#~ msgid "load a tape" +#~ msgstr "cargar una cinta" -#: src/stored/dde_vacuum.c:91 -#, c-format -msgid "" -"Error: Volume \"%s\" (status %s) not found in %s. All volumes should be " -"available for a Vacuum. ERR=%s\n" -msgstr "" +#~ msgid "quit btape" +#~ msgstr "salir btape" -#: src/stored/dedupengine.c:384 -#, fuzzy -msgid "Initializing DDE." -msgstr "Inicializando ..." +#~ msgid "use write() to fill tape" +#~ msgstr "usar write() para llenar la cinta" -#: src/stored/dedupengine.c:392 -msgid "DedupDirectory directive in Storage resource missing." -msgstr "" +#~ msgid "read and print the Bacula tape label" +#~ msgstr "leer e imprimir la etiqueta Bacula de la cinta" -#: src/stored/dedupengine.c:399 -#, fuzzy, c-format -msgid "Cannot create DedupDirectory: %s" -msgstr "No se puede crear directorio %s: ERR=%s\n" +#~ msgid "test record handling functions" +#~ msgstr "prueba de manejo de registro de funciones" -#: src/stored/dedupengine.c:405 -#, fuzzy, c-format -msgid "Cannot create DedupIndexDirectory: %s" -msgstr "No se puede crear directorio %s: ERR=%s\n" +#~ msgid "rewind the tape" +#~ msgstr "rebobinar la cinta" -#: src/stored/dedupengine.c:414 src/stored/dedupengine.c:421 -#, fuzzy, c-format -msgid "Cannot create recovery directory: %s" -msgstr "No se puede crear directorio %s: ERR=%s\n" +#~ msgid "read() tape block by block to EOT and report" +#~ msgstr "leer() cinta bloque por bloque para EOT y reportar" -#: src/stored/dedupengine.c:428 -#, fuzzy, c-format -msgid "Cannot delete temporary recovery directory: %s" -msgstr "No se puede restablecer el directorio actual: ERR=%s\n" +#~ msgid "Bacula read block by block to EOT and report" +#~ msgstr "Bacula leer bloque por bloque para EOT y reportar" -#: src/stored/dedupengine.c:1246 -#, c-format -msgid "bucket version (%ld) is posterior to the software (%ld)\n" -msgstr "" +#~ msgid "" +#~ "[file_size=n(GB)|nb_file=3|skip_zero|skip_random|skip_raw|skip_block] " +#~ "report drive speed" +#~ msgstr "" +#~ "[file_size=n(GB)|nb_file=3|skip_zero|skip_random|skip_raw|skip_block] " +#~ "informe de velocidad de la unidad" -#: src/stored/dedupengine.c:1772 -#, c-format -msgid "" -"The Deduplication Engine filesystem \"%s\" is full (only %sB free). Running " -"jobs will be stopped and marked as Incomplete. Extend the storage space and " -"run the vacuum procedure\n" -msgstr "" +#~ msgid "print tape status" +#~ msgstr "imprimir estado de la cinta" -#: src/stored/dedupengine.c:1782 -#, c-format -msgid "" -"The Deduplication Engine filesystem \"%s\" is nearly full (%sB free). Please " -"run the vacuum procedure\n" -msgstr "" +#~ msgid "General test Bacula tape functions" +#~ msgstr "Prueba general de las funciones de cinta Bacula" -#: src/stored/dedupengine.c:1965 -msgid "Header not found in DDE index\n" -msgstr "" +#~ msgid "write an EOF on the tape" +#~ msgstr "escribir un EOF en la cinta" -#: src/stored/dedupengine.c:1971 -msgid "DDE index bad magic in header\n" -msgstr "" +#~ msgid "write a single Bacula block" +#~ msgstr "escribir un único bloque de Bacula" -#: src/stored/dedupengine.c:1976 -#, c-format -msgid "" -"Cannot open DDE because the version (%ld) is posterior to the software " -"(%ld)\n" -msgstr "" +#~ msgid "read a single record" +#~ msgstr "leer un solo registro" -#: src/stored/dedupengine.c:1996 -#, c-format -msgid "Cannot open DDE, unknown hash ID: %ld\n" -msgstr "" +#~ msgid "read a single Bacula block" +#~ msgstr "leer un único bloque de Bacula" -#: src/stored/dedupstored.c:99 -#, c-format -msgid "Transport thread error: joining thread (%d)\n" -msgstr "" +#~ msgid "quick fill command" +#~ msgstr "comando de llenado rápido" -#: src/stored/dedupstored.c:208 -#, fuzzy, c-format -msgid "Socket error or stop during rehydration. ERR=%d\n" -msgstr "Error de Socket en comando %s: ERR=%s\n" +#~ msgid "\"%s\" is an invalid command\n" +#~ msgstr "\"%s\" es un comando inválido\n" -#: src/stored/dedupstored.c:226 -#, fuzzy, c-format -msgid "Unexpected message from FD, n=%d msglen=%d msg=%s\n" -msgstr "Error al leer datos de cabecera de FD. ERR=%s\n" +#~ msgid "Interactive commands:\n" +#~ msgstr "Comandos interactivos:\n" -#: src/stored/dedupstored.c:415 -#, c-format -msgid "BAD HASH: computed=#%08x expected=#%08x size=%d\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: btape \n" +#~ " -b specify bootstrap file\n" +#~ " -c set configuration file to file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -p proceed inspite of I/O errors\n" +#~ " -s turn off signals\n" +#~ " -v be verbose\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Versión: %s (%s)\n" +#~ "\n" +#~ "Utilice: btape \n" +#~ " -b especifica un archivo bootstrap\n" +#~ " -c especifica un archivo File de configuración\n" +#~ " -d establece nivel de depuración para \n" +#~ " -dt imprime timestamp en salida de depuración\n" +#~ " -p proceder a pesar de los errores de E/S\n" +#~ " -s desactivar señales\n" +#~ " -v detallado\n" +#~ " -? imprime esta mensaje.\n" +#~ "\n" -#: src/stored/dedupstored.c:521 -#, c-format -msgid "GOT chunk #%08x, now do a CANCEL\n" -msgstr "" +#~ msgid "Mount second Volume on device %s and press return when ready: " +#~ msgstr "" +#~ "Monte el segundo volumen en el dispositivo %s y pulse ENTER cuando esté " +#~ "listo:" -#: src/stored/dedupstored.c:528 -#, c-format -msgid "Received unexpected chunk #%08x\n" -msgstr "" +#~ msgid "Mount blank Volume on device %s and press return when ready: " +#~ msgstr "" +#~ "Monte un volumen en blanco en el dispositivo %s y pulse ENTER cuando esté " +#~ "listo:" -#: src/stored/dedupstored.c:535 -#, c-format -msgid "Cannot lz4decode received chunk #%08x\n" -msgstr "" +#~ msgid "End of Volume \"%s\" %d records.\n" +#~ msgstr "Fin del Volumen \"%s\" %d registros.\n" -#: src/stored/dedupstored.c:541 -#, c-format -msgid "Received chunk #%08x with the wrong size %d (expected %ld) \n" -msgstr "" +#~ msgid "Read block=%u, VolBytes=%s rate=%sB/s\n" +#~ msgstr "Leer bloque=%u, VolBytes=%s velocidad=%sB/s\n" -#: src/stored/dedupstored.c:550 -#, c-format -msgid "Received a chunk with a bad hash #%08x (expected #%08x) size=%d\n" -msgstr "" +#~ msgid "Cannot open Dev=%s, Vol=%s\n" +#~ msgstr "No se puede abrir Dev=%s, Vol=%s\n" -#: src/stored/dedupstored.c:585 -msgid "Ignore dedup flow control protocol error\n" -msgstr "" +#~ msgid "Nohdr," +#~ msgstr "Nohdr," -#: src/stored/dedupstored.c:599 -#, fuzzy, c-format -msgid "Ignore unknown inter-daemon command: %ld\n" -msgstr "Código de ítem desconocido: %d\n" +#~ msgid "partial," +#~ msgstr "parcial," -#: src/stored/dedupstored.c:678 -msgid "Got Dedup data but dedupengine is not started\n" -msgstr "" +#~ msgid "empty," +#~ msgstr "vacío," -#: src/stored/dedupstored.c:718 -#, fuzzy -msgid "Error sending chunk request to client\n" -msgstr "Error escribiendo encabezado para archivo de cola. ERR=%s\n" +#~ msgid "Nomatch," +#~ msgstr "Nomatch," -#: src/stored/dev.c:146 -#, c-format -msgid "Unable to stat device %s: ERR=%s\n" -msgstr "No se puede stat dispositivo %s: ERR=%s\n" +#~ msgid "cont," +#~ msgstr "cont," -#: src/stored/dev.c:164 -#, c-format -msgid "" -"%s is an unknown device type. Must be tape or directory\n" -" or have RequiresMount=yes for DVD. st_mode=%x\n" -msgstr "" -"%s es un tipo de dispositivo desconocido. Debe ser cinta o directorio\n" -" o tener RequiresMount=yes para DVD. st_mode=%x\n" +#~ msgid "Volume name or names is too long. Please use a .bsr file.\n" +#~ msgstr "" +#~ "Nombre de Volumen o nombres es demasiado largo. Por favor, use un " +#~ "archivo .BSR.\n" -#: src/stored/dev.c:177 -msgid "DVD support is now deprecated.\n" -msgstr "" +#~ msgid "Cannot find device \"%s\" in config file %s.\n" +#~ msgstr "" +#~ "No se puede encontrar el dispositivo \"%s\" en el archivo de " +#~ "configuración %s.\n" -#: src/stored/dev.c:180 -msgid "Aligned device not supported. Please use \"DeviceType = File\"\n" -msgstr "" +#~ msgid "Cannot init device %s\n" +#~ msgstr "No se pudo iniciar dispositivo %s\n" -#: src/stored/dev.c:183 -msgid "Deduplication device not supported. Please use \"DeviceType = File\"\n" -msgstr "" +#~ msgid "Cannot open %s\n" +#~ msgstr "No se pudo abrir %s\n" -#: src/stored/dev.c:212 -#, fuzzy -msgid "Deduplication device not properly configured.\n" -msgstr "" -"Dispositivos de lectura y escritura no se han iniciado correctamente.\n" +#~ msgid "Could not find device \"%s\" in config file %s.\n" +#~ msgstr "" +#~ "No se pudo encontrar dispositivo \"%s\" en el archivo de configuración " +#~ "%s.\n" -#: src/stored/dev.c:303 -#, fuzzy, c-format -msgid "Using default block size %u on dedup device %s\n" -msgstr "Mínimo tamaño de bloque > máximo en el dispositivo %s\n" +#~ msgid "Using device: \"%s\" for writing.\n" +#~ msgstr "Utilizando el dispositivo: \"%s\" para escritura.\n" -#: src/stored/dev.c:341 -#, c-format -msgid "Unable to stat mount point %s: ERR=%s\n" -msgstr "No se puede stat punto de montaje %s: ERR=%s\n" +#~ msgid "Using device: \"%s\" for reading.\n" +#~ msgstr "Utilizando el dispositivo: \"%s\" para lectura.\n" -#: src/stored/dev.c:346 -msgid "" -"Mount and unmount commands must defined for a device which requires mount.\n" -msgstr "" -"Comandos mount y unmount deben ser definidos para un dispositivo que " -"requiere montaje.\n" +#~ msgid "Unexpected End of Data\n" +#~ msgstr "Fin Inesperado de los Datos\n" -#: src/stored/dev.c:362 -#, c-format -msgid "Min block size > max on device %s\n" -msgstr "Mínimo tamaño de bloque > máximo en el dispositivo %s\n" +#~ msgid "Unexpected End of Tape\n" +#~ msgstr "Fin Inesperado de la Cinta\n" -#: src/stored/dev.c:366 -#, c-format -msgid "Block size %u on device %s is too large, using default %u\n" -msgstr "" -"Tamaño de bloque %u en el dispositivo %s es demasiado grande, usando %u " -"omisión\n" +#~ msgid "Unexpected End of File\n" +#~ msgstr "Fin Inesperado del Archivo\n" -#: src/stored/dev.c:371 -#, fuzzy, c-format -msgid "Max block size %u not multiple of device %s block size=%d.\n" -msgstr "" -"Tamaño máximo de bloque %u no es múltiplo de tamaño de bloque en dispositivo " -"%s.\n" +#~ msgid "Tape Door is Open\n" +#~ msgstr "Puerta de la cinta está abierta\n" -#: src/stored/dev.c:375 -#, fuzzy, c-format -msgid "Max Vol Size < 8 * Max Block Size for device %s\n" -msgstr "" -"Máximo Tamaño de Volumen < 8 * Máximo Tamaño de Bloque en dispositivo %s\n" +#~ msgid "Unexpected Tape is Off-line\n" +#~ msgstr "Inesperado Cinta esta off-line\n" -#: src/stored/dev.c:391 src/stored/dev.c:397 -#, c-format -msgid "Unable to init cond variable: ERR=%s\n" -msgstr "No se puede iniciar variable cond: ERR=%s\n" +#, fuzzy +#~ msgid "Dedupengine status:\n" +#~ msgstr "Estado del Dispositivo:\n" -#: src/stored/dev.c:403 -#, fuzzy, c-format -msgid "Unable to init spool mutex: ERR=%s\n" -msgstr "No se puede iniciar mutex: ERR=%s\n" +#, fuzzy +#~ msgid "Initializing DDE." +#~ msgstr "Inicializando ..." -#: src/stored/dev.c:409 -#, fuzzy, c-format -msgid "Unable to init acquire mutex: ERR=%s\n" -msgstr "No se puede iniciar mutex: ERR=%s\n" +#, fuzzy +#~ msgid "Cannot create DedupDirectory: %s" +#~ msgstr "No se puede crear directorio %s: ERR=%s\n" -#: src/stored/dev.c:415 -#, fuzzy, c-format -msgid "Unable to init read acquire mutex: ERR=%s\n" -msgstr "No se puede iniciar mutex: ERR=%s\n" +#, fuzzy +#~ msgid "Cannot create DedupIndexDirectory: %s" +#~ msgstr "No se puede crear directorio %s: ERR=%s\n" -#: src/stored/dev.c:421 -#, fuzzy, c-format -msgid "Unable to init adata mutex: ERR=%s\n" -msgstr "No se puede iniciar mutex: ERR=%s\n" +#, fuzzy +#~ msgid "Cannot create recovery directory: %s" +#~ msgstr "No se puede crear directorio %s: ERR=%s\n" -#: src/stored/dev.c:427 -#, fuzzy, c-format -msgid "Unable to init volcat mutex: ERR=%s\n" -msgstr "No se puede iniciar mutex: ERR=%s\n" +#, fuzzy +#~ msgid "Cannot delete temporary recovery directory: %s" +#~ msgstr "No se puede restablecer el directorio actual: ERR=%s\n" -#: src/stored/dev.c:433 -#, fuzzy, c-format -msgid "Unable to init dcrs mutex: ERR=%s\n" -msgstr "No se puede iniciar mutex: ERR=%s\n" +#, fuzzy +#~ msgid "Socket error or stop during rehydration. ERR=%d\n" +#~ msgstr "Error de Socket en comando %s: ERR=%s\n" -#: src/stored/dev.c:523 -msgid "Illegal mode given to open dev.\n" -msgstr "Modo ilegal dado para abrir dev.\n" +#, fuzzy +#~ msgid "Unexpected message from FD, n=%d msglen=%d msg=%s\n" +#~ msgstr "Error al leer datos de cabecera de FD. ERR=%s\n" -#: src/stored/dev.c:575 -msgid "Bad device call. Device not open\n" -msgstr "Mala llamada de dispositivo. Dispositivo no abierto\n" +#, fuzzy +#~ msgid "Ignore unknown inter-daemon command: %ld\n" +#~ msgstr "Código de ítem desconocido: %d\n" -#: src/stored/dev.c:587 -#, c-format -msgid "Seek error: ERR=%s\n" -msgstr "Seek error: ERR=%s\n" +#, fuzzy +#~ msgid "Error sending chunk request to client\n" +#~ msgstr "Error escribiendo encabezado para archivo de cola. ERR=%s\n" -#: src/stored/dev.c:588 src/stored/file_dev.c:78 src/stored/file_dev.c:105 -#: src/stored/tape_dev.c:294 -#, c-format -msgid "lseek error on %s. ERR=%s.\n" -msgstr "Iseek error en %s. ERR=%s.\n" +#~ msgid "Unable to stat device %s: ERR=%s\n" +#~ msgstr "No se puede stat dispositivo %s: ERR=%s\n" -#: src/stored/device.c:126 -#, c-format -msgid "End of medium on Volume \"%s\" Bytes=%s Blocks=%s at %s.\n" -msgstr "Fin de medio en Volumen \"%s\" Bytes=%s Bloques=%s en %s.\n" +#~ msgid "" +#~ "%s is an unknown device type. Must be tape or directory\n" +#~ " or have RequiresMount=yes for DVD. st_mode=%x\n" +#~ msgstr "" +#~ "%s es un tipo de dispositivo desconocido. Debe ser cinta o directorio\n" +#~ " o tener RequiresMount=yes para DVD. st_mode=%x\n" -#: src/stored/device.c:157 -#, c-format -msgid "New volume \"%s\" mounted on device %s at %s.\n" -msgstr "Nuevo volumen \"%s\" montado en el dispositivo %s en %s.\n" +#, fuzzy +#~ msgid "Deduplication device not properly configured.\n" +#~ msgstr "" +#~ "Dispositivos de lectura y escritura no se han iniciado correctamente.\n" -#: src/stored/device.c:169 -#, c-format -msgid "write_block_to_device Volume label failed. ERR=%s" -msgstr "Fallo de etiqueta de volumen write_block_to_device. ERR=%s" +#, fuzzy +#~ msgid "Using default block size %u on dedup device %s\n" +#~ msgstr "Mínimo tamaño de bloque > máximo en el dispositivo %s\n" -#: src/stored/device.c:201 -#, c-format -msgid "write_block_to_device overflow block failed. ERR=%s" -msgstr "Fallo de desbordamiento de bloque write_block_to_device. ERR=%s" +#~ msgid "Unable to stat mount point %s: ERR=%s\n" +#~ msgstr "No se puede stat punto de montaje %s: ERR=%s\n" -#: src/stored/device.c:206 -#, c-format -msgid "Catastrophic error. Cannot write overflow block to device %s. ERR=%s" -msgstr "" -"Error catastrófico. No se puede escribir bloque de desbordamiento al " -"dispositivo %s. ERR=%s" +#~ msgid "" +#~ "Mount and unmount commands must defined for a device which requires " +#~ "mount.\n" +#~ msgstr "" +#~ "Comandos mount y unmount deben ser definidos para un dispositivo que " +#~ "requiere montaje.\n" -#: src/stored/device.c:367 src/stored/tape_dev.c:161 -#, c-format -msgid "Unable to open device %s: ERR=%s\n" -msgstr "No se puede abrir el dispositivo %s: ERR=%s\n" +#~ msgid "Min block size > max on device %s\n" +#~ msgstr "Mínimo tamaño de bloque > máximo en el dispositivo %s\n" -#: src/stored/device.c:369 -#, c-format -msgid "Unable to open archive %s: ERR=%s\n" -msgstr "No se puede abrir archivo %s: ERR=%s\n" +#~ msgid "Block size %u on device %s is too large, using default %u\n" +#~ msgstr "" +#~ "Tamaño de bloque %u en el dispositivo %s es demasiado grande, usando %u " +#~ "omisión\n" -#: src/stored/dircmd.c:164 -#, c-format -msgid "Connection request from %s failed.\n" -msgstr "Fallo solicitud de conexión desde %s.\n" +#, fuzzy +#~ msgid "Max block size %u not multiple of device %s block size=%d.\n" +#~ msgstr "" +#~ "Tamaño máximo de bloque %u no es múltiplo de tamaño de bloque en " +#~ "dispositivo %s.\n" -#: src/stored/dircmd.c:202 -msgid "Unable to authenticate Director\n" -msgstr "No se puede autentificar el Director\n" +#, fuzzy +#~ msgid "Max Vol Size < 8 * Max Block Size for device %s\n" +#~ msgstr "" +#~ "Máximo Tamaño de Volumen < 8 * Máximo Tamaño de Bloque en dispositivo %s\n" -#: src/stored/dircmd.c:296 -#, fuzzy, c-format -msgid "Bad client command: %s" -msgstr "Malo comando nivel: %s\n" +#~ msgid "Unable to init cond variable: ERR=%s\n" +#~ msgstr "No se puede iniciar variable cond: ERR=%s\n" -#: src/stored/dircmd.c:306 #, fuzzy -msgid "Client daemon" -msgstr "demonio File" +#~ msgid "Unable to init spool mutex: ERR=%s\n" +#~ msgstr "No se puede iniciar mutex: ERR=%s\n" -#: src/stored/dircmd.c:309 -#, fuzzy, c-format -msgid "Failed to connect to Client daemon: %s:%d\n" -msgstr "Error al conectar con el demonio de Storage: %s:%d\n" +#, fuzzy +#~ msgid "Unable to init acquire mutex: ERR=%s\n" +#~ msgstr "No se puede iniciar mutex: ERR=%s\n" -#: src/stored/dircmd.c:387 -msgid "In storage_cmd port==0, no prior Storage connection.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to init read acquire mutex: ERR=%s\n" +#~ msgstr "No se puede iniciar mutex: ERR=%s\n" -#: src/stored/dircmd.c:439 -#, c-format -msgid "3991 Bad setdebug command: %s\n" -msgstr "3991 Malo comando setdebug: %s\n" +#, fuzzy +#~ msgid "Unable to init adata mutex: ERR=%s\n" +#~ msgstr "No se puede iniciar mutex: ERR=%s\n" -#: src/stored/dircmd.c:484 #, fuzzy -msgid "3000 Deduplication vacuum marked to be canceled.\n" -msgstr "3000 Job %s marcados para ser cancelados.\n" +#~ msgid "Unable to init volcat mutex: ERR=%s\n" +#~ msgstr "No se puede iniciar mutex: ERR=%s\n" -#: src/stored/dircmd.c:486 -msgid "3900 No deduplication vacuum process found.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to init dcrs mutex: ERR=%s\n" +#~ msgstr "No se puede iniciar mutex: ERR=%s\n" -#: src/stored/dircmd.c:490 -msgid "3903 Error scanning cancel command.\n" -msgstr "3903 Error escaneando comando cancel.\n" +#~ msgid "Illegal mode given to open dev.\n" +#~ msgstr "Modo ilegal dado para abrir dev.\n" -#: src/stored/dircmd.c:494 -#, c-format -msgid "3904 Job %s not found.\n" -msgstr "3904 Job %s no encontrado.\n" +#~ msgid "Bad device call. Device not open\n" +#~ msgstr "Mala llamada de dispositivo. Dispositivo no abierto\n" -#: src/stored/dircmd.c:523 -#, fuzzy, c-format -msgid "3000 JobId=%ld Job=\"%s\" marked to be %s.\n" -msgstr "JobId %s, Job %s marcado para ser cancelado.\n" +#~ msgid "Seek error: ERR=%s\n" +#~ msgstr "Seek error: ERR=%s\n" -#: src/stored/dircmd.c:602 src/stored/dircmd.c:1003 src/stored/dircmd.c:1163 -#: src/stored/dircmd.c:1274 src/stored/dircmd.c:1396 src/stored/dircmd.c:1438 -#, c-format -msgid "3999 Device \"%s\" not found or could not be opened.\n" -msgstr "3999 Dispositivo \"%s\" no encontrado o no pudo ser abierto.\n" +#~ msgid "lseek error on %s. ERR=%s.\n" +#~ msgstr "Iseek error en %s. ERR=%s.\n" -#: src/stored/dircmd.c:607 -#, c-format -msgid "3903 Error scanning label command: %s\n" -msgstr "3903 Error escaneando comando cancel: %s\n" +#~ msgid "End of medium on Volume \"%s\" Bytes=%s Blocks=%s at %s.\n" +#~ msgstr "Fin de medio en Volumen \"%s\" Bytes=%s Bloques=%s en %s.\n" -#: src/stored/dircmd.c:659 -#, fuzzy, c-format -msgid "3910 Unable to open device \"%s\": ERR=%s\n" -msgstr "3910 No se puede abrir el dispositivo %s: ERR=%s\n" +#~ msgid "New volume \"%s\" mounted on device %s at %s.\n" +#~ msgstr "Nuevo volumen \"%s\" montado en el dispositivo %s en %s.\n" -#: src/stored/dircmd.c:676 -#, c-format -msgid "3920 Cannot label Volume because it is already labeled: \"%s\"\n" -msgstr "" -"3920 No se puede etiquetar el volumen porque ya está etiquetado: \"%s\"\n" +#~ msgid "write_block_to_device Volume label failed. ERR=%s" +#~ msgstr "Fallo de etiqueta de volumen write_block_to_device. ERR=%s" -#: src/stored/dircmd.c:683 -msgid "3921 Wrong volume mounted.\n" -msgstr "3921 Volumen incorrecto montado.\n" +#~ msgid "write_block_to_device overflow block failed. ERR=%s" +#~ msgstr "Fallo de desbordamiento de bloque write_block_to_device. ERR=%s" -#: src/stored/dircmd.c:687 -msgid "3922 Cannot relabel an ANSI/IBM labeled Volume.\n" -msgstr "3922 No se puede renombrar un volumen ANSI/IBM etiquetado.\n" +#~ msgid "Catastrophic error. Cannot write overflow block to device %s. ERR=%s" +#~ msgstr "" +#~ "Error catastrófico. No se puede escribir bloque de desbordamiento al " +#~ "dispositivo %s. ERR=%s" -#: src/stored/dircmd.c:695 -#, c-format -msgid "3912 Failed to label Volume: ERR=%s\n" -msgstr "3912 Fallo al etiquetar el Volumen: ERR=%s\n" +#~ msgid "Unable to open device %s: ERR=%s\n" +#~ msgstr "No se puede abrir el dispositivo %s: ERR=%s\n" -#: src/stored/dircmd.c:711 -#, fuzzy, c-format -msgid "3915 Failed to label Volume: ERR=%s\n" -msgstr "3912 Fallo al etiquetar el Volumen: ERR=%s\n" +#~ msgid "Unable to open archive %s: ERR=%s\n" +#~ msgstr "No se puede abrir archivo %s: ERR=%s\n" -#: src/stored/dircmd.c:714 -#, c-format -msgid "3914 Failed to label Volume (no media): ERR=%s\n" -msgstr "3914 No se ha podido etiquetar el volumen (no hay medios): ERR=%s\n" +#~ msgid "Connection request from %s failed.\n" +#~ msgstr "Fallo solicitud de conexión desde %s.\n" -#: src/stored/dircmd.c:717 -#, c-format -msgid "3913 Cannot label Volume. Unknown status %d from read_volume_label()\n" -msgstr "" -"3913 No se puede etiquetar el volumen. Estado desconocido %d de " -"read_volume_label()\n" +#~ msgid "Unable to authenticate Director\n" +#~ msgstr "No se puede autentificar el Director\n" -#: src/stored/dircmd.c:755 -#, c-format -msgid "3001 Mounted Volume: %s\n" -msgstr "3001 Volumen Montado: %s\n" +#, fuzzy +#~ msgid "Bad client command: %s" +#~ msgstr "Malo comando nivel: %s\n" -#: src/stored/dircmd.c:759 src/stored/dircmd.c:1474 -#, fuzzy, c-format -msgid "" -"3902 Cannot mount Volume on Storage Device \"%s\" because:\n" -"%s" -msgstr "" -"3902 No se puede montar el volumen en Storage Device %s debido a que:\n" -"%s" +#, fuzzy +#~ msgid "Client daemon" +#~ msgstr "demonio File" -#: src/stored/dircmd.c:790 src/stored/reserve.c:648 -#, c-format -msgid "" -"\n" -" Device \"%s\" requested by DIR could not be opened or does not exist.\n" -msgstr "" -"\n" -"Dispositivo \"%s\" solicitado por el DIR no se pudo abrir o no existe.\n" +#, fuzzy +#~ msgid "Failed to connect to Client daemon: %s:%d\n" +#~ msgstr "Error al conectar con el demonio de Storage: %s:%d\n" -#: src/stored/dircmd.c:812 src/stored/reserve.c:644 -#, c-format -msgid "" -"\n" -" Device \"%s\" in changer \"%s\" requested by DIR could not be opened or " -"does not exist.\n" -msgstr "" -"\n" -"Dispositivo \"%s\" en el cambiador \"%s\" solicitado por el DIR no se pudo " -"abrir o no existe.\n" +#~ msgid "3991 Bad setdebug command: %s\n" +#~ msgstr "3991 Malo comando setdebug: %s\n" -#: src/stored/dircmd.c:876 -msgid "Specified slot ignored. " -msgstr "Ranura especificado ignorado." +#, fuzzy +#~ msgid "3000 Deduplication vacuum marked to be canceled.\n" +#~ msgstr "3000 Job %s marcados para ser cancelados.\n" -#: src/stored/dircmd.c:896 src/stored/dircmd.c:959 -#, fuzzy, c-format -msgid "3901 Unable to open device \"%s\": ERR=%s\n" -msgstr "3901 No se puede abrir el dispositivo %s: ERR=%s\n" +#~ msgid "3903 Error scanning cancel command.\n" +#~ msgstr "3903 Error escaneando comando cancel.\n" -#: src/stored/dircmd.c:917 src/stored/dircmd.c:947 -#, fuzzy, c-format -msgid "3001 Device \"%s\" is mounted with Volume \"%s\"\n" -msgstr "3001 Dispositivo %s esta montado con volumen \"%s\"\n" +#~ msgid "3904 Job %s not found.\n" +#~ msgstr "3904 Job %s no encontrado.\n" -#: src/stored/dircmd.c:920 src/stored/dircmd.c:950 src/stored/dircmd.c:969 -#, fuzzy, c-format -msgid "" -"3905 Device \"%s\" open but no Bacula volume is mounted.\n" -"If this is not a blank tape, try unmounting and remounting the Volume.\n" -msgstr "" -"3905 Dispositivo %s abierto, pero ninguno volumen Bacula está montado.\n" -"Si esto no es una cinta en blanco, trate de desmontar y volver a montar el " -"volumen.\n" +#, fuzzy +#~ msgid "3000 JobId=%ld Job=\"%s\" marked to be %s.\n" +#~ msgstr "JobId %s, Job %s marcado para ser cancelado.\n" -#: src/stored/dircmd.c:931 -#, fuzzy, c-format -msgid "3001 Device \"%s\" is doing acquire.\n" -msgstr "3001% s dispositivo está haciendo adquirir.\n" +#~ msgid "3999 Device \"%s\" not found or could not be opened.\n" +#~ msgstr "3999 Dispositivo \"%s\" no encontrado o no pudo ser abierto.\n" -#: src/stored/dircmd.c:936 src/stored/dircmd.c:1134 -#, fuzzy, c-format -msgid "3903 Device \"%s\" is being labeled.\n" -msgstr "3903 Dispositivo %s ha sido etiquetada.\n" +#~ msgid "3903 Error scanning label command: %s\n" +#~ msgstr "3903 Error escaneando comando cancel: %s\n" -#: src/stored/dircmd.c:966 -#, fuzzy, c-format -msgid "3001 Device \"%s\" is already mounted with Volume \"%s\"\n" -msgstr "3001 Dispositivo %s ya está montado con el volumen \"%s\"\n" +#, fuzzy +#~ msgid "3910 Unable to open device \"%s\": ERR=%s\n" +#~ msgstr "3910 No se puede abrir el dispositivo %s: ERR=%s\n" -#: src/stored/dircmd.c:979 -#, fuzzy, c-format -msgid "3002 Device \"%s\" is mounted.\n" -msgstr "3002 Dispositivo %s está montado.\n" +#~ msgid "3920 Cannot label Volume because it is already labeled: \"%s\"\n" +#~ msgstr "" +#~ "3920 No se puede etiquetar el volumen porque ya está etiquetado: \"%s\"\n" -#: src/stored/dircmd.c:981 src/stored/dircmd.c:1103 src/stored/dircmd.c:1122 -#: src/stored/dircmd.c:1154 -#, c-format -msgid "3907 %s" -msgstr "3907 %s" +#~ msgid "3921 Wrong volume mounted.\n" +#~ msgstr "3921 Volumen incorrecto montado.\n" -#: src/stored/dircmd.c:984 -#, fuzzy, c-format -msgid "3906 File device \"%s\" is always mounted.\n" -msgstr "3906 Dispositivo de Archivo %s está siempre montado.\n" +#~ msgid "3922 Cannot relabel an ANSI/IBM labeled Volume.\n" +#~ msgstr "3922 No se puede renombrar un volumen ANSI/IBM etiquetado.\n" -#: src/stored/dircmd.c:993 -#, fuzzy, c-format -msgid "3930 Device \"%s\" is being released.\n" -msgstr "3903 Dispositivo %s ha sido etiquetada.\n" +#~ msgid "3912 Failed to label Volume: ERR=%s\n" +#~ msgstr "3912 Fallo al etiquetar el Volumen: ERR=%s\n" -#: src/stored/dircmd.c:997 -#, fuzzy, c-format -msgid "3905 Unknown wait state %d\n" -msgstr "Estado del Analizador %d desconocido\n" +#, fuzzy +#~ msgid "3915 Failed to label Volume: ERR=%s\n" +#~ msgstr "3912 Fallo al etiquetar el Volumen: ERR=%s\n" -#: src/stored/dircmd.c:1007 -#, c-format -msgid "3909 Error scanning mount command: %s\n" -msgstr "3909 Error escaneando comando mount: %s\n" +#~ msgid "3914 Failed to label Volume (no media): ERR=%s\n" +#~ msgstr "3914 No se ha podido etiquetar el volumen (no hay medios): ERR=%s\n" -#: src/stored/dircmd.c:1032 -#, fuzzy, c-format -msgid "3002 Device \"%s\" enabled.\n" -msgstr "3022 Dispositivo %s liberado.\n" +#~ msgid "" +#~ "3913 Cannot label Volume. Unknown status %d from read_volume_label()\n" +#~ msgstr "" +#~ "3913 No se puede etiquetar el volumen. Estado desconocido %d de " +#~ "read_volume_label()\n" -#: src/stored/dircmd.c:1039 -#, fuzzy, c-format -msgid "3907 Error scanning \"enable\" command: %s\n" -msgstr "3903 Error escaneando comando cancel: %s\n" +#~ msgid "3001 Mounted Volume: %s\n" +#~ msgstr "3001 Volumen Montado: %s\n" -#: src/stored/dircmd.c:1064 -#, fuzzy, c-format -msgid "3002 Device \"%s\" disabled.\n" -msgstr "3002 Dispositivo %s está montado.\n" +#, fuzzy +#~ msgid "" +#~ "3902 Cannot mount Volume on Storage Device \"%s\" because:\n" +#~ "%s" +#~ msgstr "" +#~ "3902 No se puede montar el volumen en Storage Device %s debido a que:\n" +#~ "%s" -#: src/stored/dircmd.c:1071 -#, fuzzy, c-format -msgid "3907 Error scanning \"disable\" command: %s\n" -msgstr "3903 Error escaneando comando cancel: %s\n" +#~ msgid "" +#~ "\n" +#~ " Device \"%s\" requested by DIR could not be opened or does not " +#~ "exist.\n" +#~ msgstr "" +#~ "\n" +#~ "Dispositivo \"%s\" solicitado por el DIR no se pudo abrir o no existe.\n" -#: src/stored/dircmd.c:1100 src/stored/dircmd.c:1156 -#, fuzzy, c-format -msgid "3002 Device \"%s\" unmounted.\n" -msgstr "3002 Dispositivo %s desmontado.\n" +#~ msgid "" +#~ "\n" +#~ " Device \"%s\" in changer \"%s\" requested by DIR could not be opened " +#~ "or does not exist.\n" +#~ msgstr "" +#~ "\n" +#~ "Dispositivo \"%s\" en el cambiador \"%s\" solicitado por el DIR no se " +#~ "pudo abrir o no existe.\n" -#: src/stored/dircmd.c:1107 -#, fuzzy, c-format -msgid "3901 Device \"%s\" is already unmounted.\n" -msgstr "3901 Dispositivos %s ya está desmontado.\n" +#~ msgid "Specified slot ignored. " +#~ msgstr "Ranura especificado ignorado." -#: src/stored/dircmd.c:1125 -#, fuzzy, c-format -msgid "3001 Device \"%s\" unmounted.\n" -msgstr "3001 Dispositivo %s desmontado.\n" +#, fuzzy +#~ msgid "3901 Unable to open device \"%s\": ERR=%s\n" +#~ msgstr "3901 No se puede abrir el dispositivo %s: ERR=%s\n" -#: src/stored/dircmd.c:1130 -#, fuzzy, c-format -msgid "3902 Device \"%s\" is busy in acquire.\n" -msgstr "3902 Dispositivo %s está ocupado en adquirir.\n" +#, fuzzy +#~ msgid "3001 Device \"%s\" is mounted with Volume \"%s\"\n" +#~ msgstr "3001 Dispositivo %s esta montado con volumen \"%s\"\n" -#: src/stored/dircmd.c:1168 -#, c-format -msgid "3907 Error scanning unmount command: %s\n" -msgstr "3907 Error escaneando comando unmount: %s\n" +#, fuzzy +#~ msgid "" +#~ "3905 Device \"%s\" open but no Bacula volume is mounted.\n" +#~ "If this is not a blank tape, try unmounting and remounting the Volume.\n" +#~ msgstr "" +#~ "3905 Dispositivo %s abierto, pero ninguno volumen Bacula está montado.\n" +#~ "Si esto no es una cinta en blanco, trate de desmontar y volver a montar " +#~ "el volumen.\n" -#: src/stored/dircmd.c:1196 -msgid "3916 Error scanning action_on_purge command\n" -msgstr "3916 Error de escaneando comando action_on_purge\n" +#, fuzzy +#~ msgid "3001 Device \"%s\" is doing acquire.\n" +#~ msgstr "3001% s dispositivo está haciendo adquirir.\n" -#: src/stored/dircmd.c:1239 -#, fuzzy, c-format -msgid "3921 Device \"%s\" already released.\n" -msgstr "3921 Dispositivo %s ya liberado.\n" +#, fuzzy +#~ msgid "3903 Device \"%s\" is being labeled.\n" +#~ msgstr "3903 Dispositivo %s ha sido etiquetada.\n" -#: src/stored/dircmd.c:1246 -#, fuzzy, c-format -msgid "3922 Device \"%s\" waiting for sysop.\n" -msgstr "3922 Dispositivo %s aguardando por sysop.\n" +#, fuzzy +#~ msgid "3001 Device \"%s\" is already mounted with Volume \"%s\"\n" +#~ msgstr "3001 Dispositivo %s ya está montado con el volumen \"%s\"\n" -#: src/stored/dircmd.c:1252 -#, fuzzy, c-format -msgid "3922 Device \"%s\" waiting for mount.\n" -msgstr "3922 Dispositivo %s aguardando por montar.\n" +#, fuzzy +#~ msgid "3002 Device \"%s\" is mounted.\n" +#~ msgstr "3002 Dispositivo %s está montado.\n" -#: src/stored/dircmd.c:1256 -#, fuzzy, c-format -msgid "3923 Device \"%s\" is busy in acquire.\n" -msgstr "3923 Dispositivo %s está ocupado en adquirir.\n" +#~ msgid "3907 %s" +#~ msgstr "3907 %s" -#: src/stored/dircmd.c:1260 -#, fuzzy, c-format -msgid "3914 Device \"%s\" is being labeled.\n" -msgstr "3914 Dispositivo %s ha sido etiquetada.\n" +#, fuzzy +#~ msgid "3906 File device \"%s\" is always mounted.\n" +#~ msgstr "3906 Dispositivo de Archivo %s está siempre montado.\n" -#: src/stored/dircmd.c:1268 -#, fuzzy, c-format -msgid "3022 Device \"%s\" released.\n" -msgstr "3022 Dispositivo %s liberado.\n" +#, fuzzy +#~ msgid "3930 Device \"%s\" is being released.\n" +#~ msgstr "3903 Dispositivo %s ha sido etiquetada.\n" -#: src/stored/dircmd.c:1279 -#, c-format -msgid "3927 Error scanning release command: %s\n" -msgstr "3927 Error escaneando comando de liberación: %s\n" +#, fuzzy +#~ msgid "3905 Unknown wait state %d\n" +#~ msgstr "Estado del Analizador %d desconocido\n" -#: src/stored/dircmd.c:1308 -#, c-format -msgid "Could not create bootstrap file %s: ERR=%s\n" -msgstr "No se pudo crear el archivo de arranque %s: ERR=%s\n" +#~ msgid "3909 Error scanning mount command: %s\n" +#~ msgstr "3909 Error escaneando comando mount: %s\n" -#: src/stored/dircmd.c:1321 -msgid "Error parsing bootstrap file.\n" -msgstr "Error analizando archivo bootstrap.\n" +#, fuzzy +#~ msgid "3002 Device \"%s\" enabled.\n" +#~ msgstr "3022 Dispositivo %s liberado.\n" -#: src/stored/dircmd.c:1383 -#, fuzzy, c-format -msgid "3998 Device \"%s\" is not an autochanger.\n" -msgstr "3995 Dispositivo %s no es un auto-cargador.\n" +#, fuzzy +#~ msgid "3907 Error scanning \"enable\" command: %s\n" +#~ msgstr "3903 Error escaneando comando cancel: %s\n" -#: src/stored/dircmd.c:1400 -#, fuzzy, c-format -msgid "3909 Error scanning autochanger drives/list/slots command: %s\n" -msgstr "3908 Error comando scanning auto-cambiador drives/list/ranuras: %s\n" +#, fuzzy +#~ msgid "3002 Device \"%s\" disabled.\n" +#~ msgstr "3002 Dispositivo %s está montado.\n" -#: src/stored/dircmd.c:1442 -#, c-format -msgid "3909 Error scanning readlabel command: %s\n" -msgstr "3909 Error comando scanning readlabel: %s\n" +#, fuzzy +#~ msgid "3907 Error scanning \"disable\" command: %s\n" +#~ msgstr "3903 Error escaneando comando cancel: %s\n" -#: src/stored/dircmd.c:1470 -#, c-format -msgid "3001 Volume=%s Slot=%d\n" -msgstr "3001 Volumen=%s Ranura=%d\n" +#, fuzzy +#~ msgid "3002 Device \"%s\" unmounted.\n" +#~ msgstr "3002 Dispositivo %s desmontado.\n" -#: src/stored/dircmd.c:1502 -#, fuzzy, c-format -msgid "3931 Device \"%s\" is BLOCKED. user unmounted.\n" -msgstr "3931 Dispositivo %s está BLOQUEADO. Usuario sin montar.\n" +#, fuzzy +#~ msgid "3901 Device \"%s\" is already unmounted.\n" +#~ msgstr "3901 Dispositivos %s ya está desmontado.\n" -#: src/stored/dircmd.c:1506 -#, fuzzy, c-format -msgid "" -"3932 Device \"%s\" is BLOCKED. user unmounted during wait for media/mount.\n" -msgstr "" -"3932 Dispositivo %s está BLOQUEADO. Usuario sin montar en espera por medios/" -"montar.\n" +#, fuzzy +#~ msgid "3001 Device \"%s\" unmounted.\n" +#~ msgstr "3001 Dispositivo %s desmontado.\n" -#: src/stored/dircmd.c:1510 -#, fuzzy, c-format -msgid "3933 Device \"%s\" is BLOCKED waiting for media.\n" -msgstr "3933 Dispositivo %s está BLOQUEADO esperando por media.\n" +#, fuzzy +#~ msgid "3902 Device \"%s\" is busy in acquire.\n" +#~ msgstr "3902 Dispositivo %s está ocupado en adquirir.\n" -#: src/stored/dircmd.c:1514 -#, fuzzy, c-format -msgid "3934 Device \"%s\" is being initialized.\n" -msgstr "3934 Dispositivo %s se está inicializado.\n" +#~ msgid "3907 Error scanning unmount command: %s\n" +#~ msgstr "3907 Error escaneando comando unmount: %s\n" -#: src/stored/dircmd.c:1518 -#, fuzzy, c-format -msgid "3935 Device \"%s\" is blocked labeling a Volume.\n" -msgstr "3935 Dispositivo %s está BLOQUEADO etiquetando un Volumen.\n" +#~ msgid "3916 Error scanning action_on_purge command\n" +#~ msgstr "3916 Error de escaneando comando action_on_purge\n" -#: src/stored/dircmd.c:1522 -#, fuzzy, c-format -msgid "3935 Device \"%s\" is blocked for unknown reason.\n" -msgstr "3935 Dispositivo %s está BLOQUEADO por razón desconocida.\n" +#, fuzzy +#~ msgid "3921 Device \"%s\" already released.\n" +#~ msgstr "3921 Dispositivo %s ya liberado.\n" -#: src/stored/dircmd.c:1527 -#, fuzzy, c-format -msgid "3936 Device \"%s\" is busy reading.\n" -msgstr "3936 Dispositivo %s está ocupado leyendo.\n" +#, fuzzy +#~ msgid "3922 Device \"%s\" waiting for sysop.\n" +#~ msgstr "3922 Dispositivo %s aguardando por sysop.\n" -#: src/stored/dircmd.c:1530 -#, fuzzy, c-format -msgid "3937 Device \"%s\" is busy with writers=%d reserved=%d.\n" -msgstr "3937 Dispositivo %s está ocupado con %d escritura(s).\n" +#, fuzzy +#~ msgid "3922 Device \"%s\" waiting for mount.\n" +#~ msgstr "3922 Dispositivo %s aguardando por montar.\n" -#: src/stored/dircmd.c:1550 -#, fuzzy, c-format -msgid "" -"3999 Device \"%s\" requested by DIR could not be locked for shared storage.\n" -msgstr "" -"\n" -"Dispositivo \"%s\" solicitado por el DIR no se pudo abrir o no existe.\n" +#, fuzzy +#~ msgid "3923 Device \"%s\" is busy in acquire.\n" +#~ msgstr "3923 Dispositivo %s está ocupado en adquirir.\n" -#: src/stored/dvd.c:252 -#, c-format -msgid "Error writing part %d to the DVD: ERR=%s\n" -msgstr "Error escribiendo parte %d en el DVD: ERR=%s\n" +#, fuzzy +#~ msgid "3914 Device \"%s\" is being labeled.\n" +#~ msgstr "3914 Dispositivo %s ha sido etiquetada.\n" -#: src/stored/dvd.c:254 -#, c-format -msgid "Error while writing current part to the DVD: %s" -msgstr "Error al escribir parte actual al DVD: %s" +#, fuzzy +#~ msgid "3022 Device \"%s\" released.\n" +#~ msgstr "3022 Dispositivo %s liberado.\n" -#: src/stored/dvd.c:264 -#, c-format -msgid "Part %d (%lld bytes) written to DVD.\n" -msgstr "Parte %d (%lld bytes) escrito al DVD.\n" +#~ msgid "3927 Error scanning release command: %s\n" +#~ msgstr "3927 Error escaneando comando de liberación: %s\n" -#: src/stored/dvd.c:281 -#, c-format -msgid "Remaining free space %s on %s\n" -msgstr "Espacio libre restante %s en %s\n" +#~ msgid "Could not create bootstrap file %s: ERR=%s\n" +#~ msgstr "No se pudo crear el archivo de arranque %s: ERR=%s\n" -#: src/stored/dvd.c:347 -#, c-format -msgid "Next Volume part already exists on DVD. Cannot continue: %s\n" -msgstr "" -"Siguiente parte del volumen ya existe en DVD. No se puede continuar: %s\n" +#~ msgid "Error parsing bootstrap file.\n" +#~ msgstr "Error analizando archivo bootstrap.\n" -#: src/stored/dvd.c:552 -#, c-format -msgid "" -"Error writing. Current part less than total number of parts (%d/%d, device=" -"%s)\n" -msgstr "" -"Error al escribir. Parte actual menor que número total de partes (%d/%d, " -"dispositivo=%s)\n" +#, fuzzy +#~ msgid "3998 Device \"%s\" is not an autochanger.\n" +#~ msgstr "3995 Dispositivo %s no es un auto-cargador.\n" + +#, fuzzy +#~ msgid "3909 Error scanning autochanger drives/list/slots command: %s\n" +#~ msgstr "" +#~ "3908 Error comando scanning auto-cambiador drives/list/ranuras: %s\n" -#: src/stored/dvd.c:559 -#, c-format -msgid "Unable to write last on %s: ERR=%s\n" -msgstr "No se puede escribir última en %s: ERR=%s\n" +#~ msgid "3909 Error scanning readlabel command: %s\n" +#~ msgstr "3909 Error comando scanning readlabel: %s\n" -#: src/stored/fd_cmds.c:209 -#, fuzzy, c-format -msgid "Command error with FD, hanging up. ERR=%s\n" -msgstr "Error de comando con FD, colgando. %s\n" +#~ msgid "3001 Volume=%s Slot=%d\n" +#~ msgstr "3001 Volumen=%s Ranura=%d\n" -#: src/stored/fd_cmds.c:212 -msgid "Command error with FD, hanging up.\n" -msgstr "Error de comando con FD, colgando.\n" +#, fuzzy +#~ msgid "3931 Device \"%s\" is BLOCKED. user unmounted.\n" +#~ msgstr "3931 Dispositivo %s está BLOQUEADO. Usuario sin montar.\n" -#: src/stored/fd_cmds.c:223 -#, c-format -msgid "FD command not found: %s\n" -msgstr "Comando FD no encontrado:% s \n" +#, fuzzy +#~ msgid "" +#~ "3932 Device \"%s\" is BLOCKED. user unmounted during wait for media/" +#~ "mount.\n" +#~ msgstr "" +#~ "3932 Dispositivo %s está BLOQUEADO. Usuario sin montar en espera por " +#~ "medios/montar.\n" -#: src/stored/fd_cmds.c:254 -msgid "Attempt to append on non-open session.\n" -msgstr "Intento de anexar en sesión no abierta.\n" +#, fuzzy +#~ msgid "3933 Device \"%s\" is BLOCKED waiting for media.\n" +#~ msgstr "3933 Dispositivo %s está BLOQUEADO esperando por media.\n" -#: src/stored/fd_cmds.c:266 src/stored/fd_cmds.c:309 -msgid "Attempt to close non-open session.\n" -msgstr "Intento de cerrar sesión no abierta.\n" +#, fuzzy +#~ msgid "3934 Device \"%s\" is being initialized.\n" +#~ msgstr "3934 Dispositivo %s se está inicializado.\n" -#: src/stored/fd_cmds.c:284 -msgid "Attempt to open already open session.\n" -msgstr "Intento de abrir sesión ya abierta.\n" +#, fuzzy +#~ msgid "3935 Device \"%s\" is blocked labeling a Volume.\n" +#~ msgstr "3935 Dispositivo %s está BLOQUEADO etiquetando un Volumen.\n" -#: src/stored/fd_cmds.c:338 -msgid "Attempt to read on non-open session.\n" -msgstr "Intento de leer sesión no abierta.\n" +#, fuzzy +#~ msgid "3935 Device \"%s\" is blocked for unknown reason.\n" +#~ msgstr "3935 Dispositivo %s está BLOQUEADO por razón desconocida.\n" -#: src/stored/fd_cmds.c:356 #, fuzzy -msgid "Attempt to open an already open session.\n" -msgstr "Intento de abrir sesión ya abierta.\n" +#~ msgid "3936 Device \"%s\" is busy reading.\n" +#~ msgstr "3936 Dispositivo %s está ocupado leyendo.\n" -#: src/stored/fd_cmds.c:372 #, fuzzy -msgid "Cannot open session, received bad parameters.\n" -msgstr "No se puede abrir recursos fork para %s.\n" +#~ msgid "3937 Device \"%s\" is busy with writers=%d reserved=%d.\n" +#~ msgstr "3937 Dispositivo %s está ocupado con %d escritura(s).\n" -#: src/stored/file_dev.c:95 src/stored/tape_dev.c:859 -msgid "Bad call to reposition. Device not open\n" -msgstr "Mala llamada a reposición. El dispositivo no abre\n" +#, fuzzy +#~ msgid "" +#~ "3999 Device \"%s\" requested by DIR could not be locked for shared " +#~ "storage.\n" +#~ msgstr "" +#~ "\n" +#~ "Dispositivo \"%s\" solicitado por el DIR no se pudo abrir o no existe.\n" -#: src/stored/file_dev.c:157 -#, c-format -msgid "Could not open file device %s. No Volume name given.\n" -msgstr "" -"No se pudo abrir dispositivo de archivo %s. No hay nombre volumen " -"determinado.\n" +#~ msgid "Error writing part %d to the DVD: ERR=%s\n" +#~ msgstr "Error escribiendo parte %d en el DVD: ERR=%s\n" -#: src/stored/file_dev.c:183 -#, fuzzy, c-format -msgid "Could not open(%s,%s,0640): ERR=%s\n" -msgstr "No se pudo abrir %s: ERR=%s\n" +#~ msgid "Error while writing current part to the DVD: %s" +#~ msgstr "Error al escribir parte actual al DVD: %s" -#: src/stored/file_dev.c:202 -#, fuzzy, c-format -msgid "Could not open aligned volume: %s, ERR=%s\n" -msgstr "No se pudo abrir archivo incluir: %s, ERR=%s\n" +#~ msgid "Part %d (%lld bytes) written to DVD.\n" +#~ msgstr "Parte %d (%lld bytes) escrito al DVD.\n" -#: src/stored/file_dev.c:255 -#, c-format -msgid "Unable to truncate device %s. ERR=%s\n" -msgstr "No se puede truncar el dispositivo %s. ERR=%s\n" +#~ msgid "Remaining free space %s on %s\n" +#~ msgstr "Espacio libre restante %s en %s\n" -#: src/stored/file_dev.c:272 -#, c-format -msgid "Unable to stat device %s. ERR=%s\n" -msgstr "No se pudo stat dispositivo %s. ERR=%s\n" +#~ msgid "Next Volume part already exists on DVD. Cannot continue: %s\n" +#~ msgstr "" +#~ "Siguiente parte del volumen ya existe en DVD. No se puede continuar: %s\n" -#: src/stored/file_dev.c:289 -#, c-format -msgid "Device %s doesn't support ftruncate(). Recreating file %s.\n" -msgstr "Dispositivo %s no admite ftruncate(). Recreando el archivo %s.\n" +#~ msgid "" +#~ "Error writing. Current part less than total number of parts (%d/%d, " +#~ "device=%s)\n" +#~ msgstr "" +#~ "Error al escribir. Parte actual menor que número total de partes (%d/%d, " +#~ "dispositivo=%s)\n" -#: src/stored/file_dev.c:301 -#, c-format -msgid "Could not reopen: %s, ERR=%s\n" -msgstr "No se pudo reabrir: %s, ERR=%s\n" +#~ msgid "Unable to write last on %s: ERR=%s\n" +#~ msgstr "No se puede escribir última en %s: ERR=%s\n" -#: src/stored/file_dev.c:379 src/stored/tape_dev.c:1024 -#, c-format -msgid "Device %s cannot be %smounted. ERR=%s\n" -msgstr "Dispositivo %s no puede ser %smounted. ERR=%s\n" +#, fuzzy +#~ msgid "Command error with FD, hanging up. ERR=%s\n" +#~ msgstr "Error de comando con FD, colgando. %s\n" -#: src/stored/hello.c:138 -#, fuzzy, c-format -msgid "" -"Connection from unknown Director %s at %s rejected.\n" -"Please see " -msgstr "Conexión desde Director %s desconocido en %s rechazada.\n" +#~ msgid "Command error with FD, hanging up.\n" +#~ msgstr "Error de comando con FD, colgando.\n" -#: src/stored/hello.c:165 -#, c-format -msgid "Invalid connection from %s. Len=%d\n" -msgstr "Inválida conexión desde %s. Len=%d\n" +#~ msgid "FD command not found: %s\n" +#~ msgstr "Comando FD no encontrado:% s \n" -#: src/stored/hello.c:179 -#, fuzzy, c-format -msgid "Invalid Hello from %s. Len=%d\n" -msgstr "Inválida conexión desde %s. Len=%d\n" +#~ msgid "Attempt to append on non-open session.\n" +#~ msgstr "Intento de anexar en sesión no abierta.\n" -#: src/stored/hello.c:184 -#, fuzzy, c-format -msgid "Client connect failed: Job name not found: %s\n" -msgstr "Fallo al conectar a FD: Nombre del Job no encontrado: %s\n" +#~ msgid "Attempt to close non-open session.\n" +#~ msgstr "Intento de cerrar sesión no abierta.\n" -#: src/stored/hello.c:193 -#, c-format -msgid "" -"A Client \"%s\" tried to authenticate for Job %s, but the Job is already " -"authenticated with \"%s\".\n" -msgstr "" +#~ msgid "Attempt to open already open session.\n" +#~ msgstr "Intento de abrir sesión ya abierta.\n" -#: src/stored/hello.c:227 -#, c-format -msgid "" -"A Client \"%s\" tried to authenticate for Job %s, but the job is already " -"authenticated.\n" -msgstr "" +#~ msgid "Attempt to read on non-open session.\n" +#~ msgstr "Intento de leer sesión no abierta.\n" -#: src/stored/hello.c:234 src/stored/job.c:197 -msgid "Unable to authenticate File daemon\n" -msgstr "No se puede autenticar demonio File\n" +#, fuzzy +#~ msgid "Attempt to open an already open session.\n" +#~ msgstr "Intento de abrir sesión ya abierta.\n" -#: src/stored/hello.c:292 #, fuzzy -msgid "Client socket not open. Could not connect to Client.\n" -msgstr "Fallo al conectar con el cliente.\n" +#~ msgid "Cannot open session, received bad parameters.\n" +#~ msgstr "No se puede abrir recursos fork para %s.\n" -#: src/stored/hello.c:308 src/stored/hello.c:310 -#, fuzzy, c-format -msgid "Recv request to Client failed. ERR=%s\n" -msgstr "Fallo al abrir dispositivo. ERR=%s\n" +#~ msgid "Bad call to reposition. Device not open\n" +#~ msgstr "Mala llamada a reposición. El dispositivo no abre\n" -#: src/stored/hello.c:315 src/stored/hello.c:316 -#, fuzzy, c-format -msgid "Bad Hello from Client: %s.\n" -msgstr "Malo comando Hello desde Director en %s: %s\n" +#~ msgid "Could not open file device %s. No Volume name given.\n" +#~ msgstr "" +#~ "No se pudo abrir dispositivo de archivo %s. No hay nombre volumen " +#~ "determinado.\n" -#: src/stored/hello.c:442 src/stored/hello.c:444 -#, fuzzy, c-format -msgid "Send caps to Client failed. ERR=%s\n" -msgstr "Fallo al abrir dispositivo. ERR=%s\n" +#, fuzzy +#~ msgid "Could not open(%s,%s,0640): ERR=%s\n" +#~ msgstr "No se pudo abrir %s: ERR=%s\n" -#: src/stored/hello.c:457 src/stored/hello.c:459 -#, fuzzy, c-format -msgid "Recv caps from Client failed. ERR=%s\n" -msgstr "Fallo al abrir dispositivo. ERR=%s\n" +#, fuzzy +#~ msgid "Could not open aligned volume: %s, ERR=%s\n" +#~ msgstr "No se pudo abrir archivo incluir: %s, ERR=%s\n" -#: src/stored/hello.c:463 -#, fuzzy, c-format -msgid "Recv bad caps from Client: %s.\n" -msgstr "Malo comando Hello desde Director en %s: %s\n" +#~ msgid "Unable to truncate device %s. ERR=%s\n" +#~ msgstr "No se puede truncar el dispositivo %s. ERR=%s\n" -#: src/stored/hello.c:464 -#, fuzzy, c-format -msgid "Recv bad caps from Client %s\n" -msgstr "Malo comando Hello desde Director en %s: %s\n" +#~ msgid "Unable to stat device %s. ERR=%s\n" +#~ msgstr "No se pudo stat dispositivo %s. ERR=%s\n" -#: src/stored/job.c:353 -msgid "In free_jcr(), but still attached to device!!!!\n" -msgstr "En free_jcr(), pero todavía conectado al dispositivo!!!!\n" +#~ msgid "Device %s doesn't support ftruncate(). Recreating file %s.\n" +#~ msgstr "Dispositivo %s no admite ftruncate(). Recreando el archivo %s.\n" -#: src/stored/label.c:90 -#, fuzzy, c-format -msgid "Couldn't rewind %s device %s: ERR=%s\n" -msgstr "No se puede rebobinar dispositivo %s: ERR=%s\n" +#~ msgid "Could not reopen: %s, ERR=%s\n" +#~ msgstr "No se pudo reabrir: %s, ERR=%s\n" -#: src/stored/label.c:108 src/stored/label.c:204 -#, fuzzy, c-format -msgid "Wrong Volume mounted on %s device %s: Wanted %s have %s\n" -msgstr "" -"Volumen incorrecto montado en el dispositivo %s: Esperaba %s tiene %s\n" +#~ msgid "Device %s cannot be %smounted. ERR=%s\n" +#~ msgstr "Dispositivo %s no puede ser %smounted. ERR=%s\n" -#: src/stored/label.c:111 src/stored/label.c:192 -#, c-format -msgid "Too many tries: %s" -msgstr "Demasiados intentos: %s" +#, fuzzy +#~ msgid "" +#~ "Connection from unknown Director %s at %s rejected.\n" +#~ "Please see " +#~ msgstr "Conexión desde Director %s desconocido en %s rechazada.\n" -#: src/stored/label.c:128 -#, fuzzy, c-format -msgid "" -"Requested Volume \"%s\" on %s device %s is not a Bacula labeled Volume, " -"because: ERR=%s" -msgstr "" -"Volumen requerido \"%s\" en %s no es un volumen etiquetado Bacula, debido a " -"que: ERR=%s" +#~ msgid "Invalid connection from %s. Len=%d\n" +#~ msgstr "Inválida conexión desde %s. Len=%d\n" -#: src/stored/label.c:133 -msgid "Could not read Volume label from block.\n" -msgstr "No se pudo leer la etiqueta de volumen desde bloque.\n" +#, fuzzy +#~ msgid "Invalid Hello from %s. Len=%d\n" +#~ msgstr "Inválida conexión desde %s. Len=%d\n" -#: src/stored/label.c:136 -#, c-format -msgid "Could not unserialize Volume label: ERR=%s\n" -msgstr "No se pudo unserialize etiqueta del Volumen: ERR=%s\n" +#, fuzzy +#~ msgid "Client connect failed: Job name not found: %s\n" +#~ msgstr "Fallo al conectar a FD: Nombre del Job no encontrado: %s\n" -#: src/stored/label.c:144 -#, c-format -msgid "Volume Header Id bad: %s\n" -msgstr "Malo Id de cabecera de Volumen: %s\n" +#~ msgid "Unable to authenticate File daemon\n" +#~ msgstr "No se puede autenticar demonio File\n" -#: src/stored/label.c:177 -#, fuzzy, c-format -msgid "Volume on %s device %s has wrong Bacula version. Wanted %d got %d\n" -msgstr "" -"Volumen en %s tiene la versión incorrecta de Bacula. Busco %d tiene %d\n" +#, fuzzy +#~ msgid "Client socket not open. Could not connect to Client.\n" +#~ msgstr "Fallo al conectar con el cliente.\n" -#: src/stored/label.c:188 -#, fuzzy, c-format -msgid "Volume on %s device %s has bad Bacula label type: %x\n" -msgstr "Volumen en %s tiene una malo tipo de etiqueta Bacula: %x\n" +#, fuzzy +#~ msgid "Recv request to Client failed. ERR=%s\n" +#~ msgstr "Fallo al abrir dispositivo. ERR=%s\n" -#: src/stored/label.c:225 -#, fuzzy, c-format -msgid "Got Aligned or File type Volume %s on Dedup device %s. Wanted File.\n" -msgstr "Etiquetada nuevo Volumen \"%s\" en el dispositivo %s.\n" +#, fuzzy +#~ msgid "Bad Hello from Client: %s.\n" +#~ msgstr "Malo comando Hello desde Director en %s: %s\n" -#: src/stored/label.c:235 -#, fuzzy, c-format -msgid "Got Aligned or Dedup type Volume %s on File device %s. Wanted File.\n" -msgstr "Etiquetada nuevo Volumen \"%s\" en el dispositivo %s.\n" +#, fuzzy +#~ msgid "Send caps to Client failed. ERR=%s\n" +#~ msgstr "Fallo al abrir dispositivo. ERR=%s\n" -#: src/stored/label.c:245 -#, fuzzy, c-format -msgid "" -"Got File or Dedup type Volume %s on Aligned device %s. Wanted Aligned.\n" -msgstr "" -"Escribió etiqueta de volumen \"%s\" pre-etiquetada en el dispositivo %s\n" +#, fuzzy +#~ msgid "Recv caps from Client failed. ERR=%s\n" +#~ msgstr "Fallo al abrir dispositivo. ERR=%s\n" -#: src/stored/label.c:274 src/stored/label.c:467 src/stored/mount.c:502 -#, fuzzy, c-format -msgid "Could not reserve volume %s on %s device %s\n" -msgstr "No es posible reservar volumen %s en %s\n" +#, fuzzy +#~ msgid "Recv bad caps from Client: %s.\n" +#~ msgstr "Malo comando Hello desde Director en %s: %s\n" -#: src/stored/label.c:364 -#, fuzzy, c-format -msgid "Cannot write Volume label to block for %s device %s\n" -msgstr "" -"No se puede escribir la etiqueta de volumen para bloquear el dispositivo %s\n" +#, fuzzy +#~ msgid "Recv bad caps from Client %s\n" +#~ msgstr "Malo comando Hello desde Director en %s: %s\n" -#: src/stored/label.c:431 src/stored/label.c:587 -#, fuzzy, c-format -msgid "Open %s device %s Volume \"%s\" failed: ERR=%s\n" -msgstr "Fallo al abrir dispositivo %s Volumen \"%s\": ERR=%s\n" +#~ msgid "In free_jcr(), but still attached to device!!!!\n" +#~ msgstr "En free_jcr(), pero todavía conectado al dispositivo!!!!\n" -#: src/stored/label.c:601 -#, fuzzy, c-format -msgid "Rewind error on %s device %s: ERR=%s\n" -msgstr "Error de rebobinado en el dispositivo %s: ERR=%s\n" +#, fuzzy +#~ msgid "Couldn't rewind %s device %s: ERR=%s\n" +#~ msgstr "No se puede rebobinar dispositivo %s: ERR=%s\n" -#: src/stored/label.c:609 -#, fuzzy, c-format -msgid "Truncate error on %s device %s: ERR=%s\n" -msgstr "Error al truncar en el dispositivo %s :ERR=%s\n" +#, fuzzy +#~ msgid "Wrong Volume mounted on %s device %s: Wanted %s have %s\n" +#~ msgstr "" +#~ "Volumen incorrecto montado en el dispositivo %s: Esperaba %s tiene %s\n" -#: src/stored/label.c:616 -#, fuzzy, c-format -msgid "Failed to re-open DVD after truncate on %s device %s: ERR=%s\n" -msgstr "" -"No se ha podido re-abrir el DVD después de truncar el dispositivo %s: ERR=" -"%s\n" +#~ msgid "Too many tries: %s" +#~ msgstr "Demasiados intentos: %s" -#: src/stored/label.c:661 -#, fuzzy, c-format -msgid "Unable to write %s device %s: ERR=%s\n" -msgstr "No es posible escribir el dispositivo %s: ERR=%s\n" +#, fuzzy +#~ msgid "" +#~ "Requested Volume \"%s\" on %s device %s is not a Bacula labeled Volume, " +#~ "because: ERR=%s" +#~ msgstr "" +#~ "Volumen requerido \"%s\" en %s no es un volumen etiquetado Bacula, debido " +#~ "a que: ERR=%s" -#: src/stored/label.c:695 -#, fuzzy, c-format -msgid "Recycled volume \"%s\" on %s device %s, all previous data lost.\n" -msgstr "" -"Volumen \"%s\" reciclado en el dispositivo %s, todos los datos anteriores " -"perdidos.\n" +#~ msgid "Could not read Volume label from block.\n" +#~ msgstr "No se pudo leer la etiqueta de volumen desde bloque.\n" -#: src/stored/label.c:698 -#, fuzzy, c-format -msgid "Wrote label to prelabeled Volume \"%s\" on %s device %s\n" -msgstr "" -"Escribió etiqueta de volumen \"%s\" pre-etiquetada en el dispositivo %s\n" +#~ msgid "Could not unserialize Volume label: ERR=%s\n" +#~ msgstr "No se pudo unserialize etiqueta del Volumen: ERR=%s\n" -#: src/stored/label.c:940 -#, fuzzy, c-format -msgid "Bad Volume session label request=%d\n" -msgstr "Mala etiqueta de Volumen de sesión = %d\n" +#~ msgid "Volume Header Id bad: %s\n" +#~ msgstr "Malo Id de cabecera de Volumen: %s\n" -#: src/stored/label.c:1004 -#, c-format -msgid "Expecting Volume Label, got FI=%s Stream=%s len=%d\n" -msgstr "Esperando Etiqueta de Volumen, obtuvo FI=%s Stream=%s len=%d\n" +#, fuzzy +#~ msgid "Volume on %s device %s has wrong Bacula version. Wanted %d got %d\n" +#~ msgstr "" +#~ "Volumen en %s tiene la versión incorrecta de Bacula. Busco %d tiene %d\n" -#: src/stored/label.c:1144 -#, c-format -msgid "Unknown %d" -msgstr "Desconocido %d" +#, fuzzy +#~ msgid "Volume on %s device %s has bad Bacula label type: %x\n" +#~ msgstr "Volumen en %s tiene una malo tipo de etiqueta Bacula: %x\n" -#: src/stored/label.c:1148 -#, fuzzy, c-format -msgid "" -"\n" -"Volume Label:\n" -"Adata : %d\n" -"Id : %sVerNo : %d\n" -"VolName : %s\n" -"PrevVolName : %s\n" -"VolFile : %d\n" -"LabelType : %s\n" -"LabelSize : %d\n" -"PoolName : %s\n" -"MediaType : %s\n" -"PoolType : %s\n" -"HostName : %s\n" -msgstr "" -"\n" -"Volumen Label:\n" -"Id : %sVerNo : %d\n" -"VolName : %s\n" -"PrevVolName : %s\n" -"VolFile : %d\n" -"LabelType : %s\n" -"LabelSize : %d\n" -"PoolName : %s\n" -"MediaType : %s\n" -"PoolType : %s\n" -"HostName : %s\n" - -#: src/stored/label.c:1172 -#, c-format -msgid "Date label written: %s\n" -msgstr "Fecha de etiqueta escrito: %s\n" +#, fuzzy +#~ msgid "" +#~ "Got Aligned or File type Volume %s on Dedup device %s. Wanted File.\n" +#~ msgstr "Etiquetada nuevo Volumen \"%s\" en el dispositivo %s.\n" -#: src/stored/label.c:1178 -#, c-format -msgid "Date label written: %04d-%02d-%02d at %02d:%02d\n" -msgstr "Fecha de etiqueta escrito: %04d-%02d-%02d at %02d:%02d\n" +#, fuzzy +#~ msgid "" +#~ "Got Aligned or Dedup type Volume %s on File device %s. Wanted File.\n" +#~ msgstr "Etiquetada nuevo Volumen \"%s\" en el dispositivo %s.\n" -#: src/stored/label.c:1198 -#, c-format -msgid "" -"\n" -"%s Record:\n" -"JobId : %d\n" -"VerNum : %d\n" -"PoolName : %s\n" -"PoolType : %s\n" -"JobName : %s\n" -"ClientName : %s\n" -msgstr "" -"\n" -"%s Registro:\n" -"JobId : %d\n" -"VerNum : %d\n" -"Nombre Pool : %s\n" -"Tipo del Pool : %s\n" -"Nombre del Job : %s\n" -"Nombre del Cliente : %s\n" - -#: src/stored/label.c:1211 -#, c-format -msgid "" -"Job (unique name) : %s\n" -"FileSet : %s\n" -"JobType : %c\n" -"JobLevel : %c\n" -msgstr "" -"Job (nombre único) : %s\n" -"FileSet : %s\n" -"Tipo de Job : %c\n" -"JobLevel : %c\n" +#, fuzzy +#~ msgid "" +#~ "Got File or Dedup type Volume %s on Aligned device %s. Wanted Aligned.\n" +#~ msgstr "" +#~ "Escribió etiqueta de volumen \"%s\" pre-etiquetada en el dispositivo %s\n" -#: src/stored/label.c:1220 -#, c-format -msgid "" -"JobFiles : %s\n" -"JobBytes : %s\n" -"StartBlock : %s\n" -"EndBlock : %s\n" -"StartFile : %s\n" -"EndFile : %s\n" -"JobErrors : %s\n" -"JobStatus : %c\n" -msgstr "" -"JobFiles : %s\n" -"JobBytes : %s\n" -"StartBlock : %s\n" -"EndBlock : %s\n" -"StartFile : %s\n" -"EndFile : %s\n" -"JobErrors : %s\n" -"JobStatus : %c\n" - -#: src/stored/label.c:1241 -#, c-format -msgid "Date written : %s\n" -msgstr "Fecha escrito: %s\n" +#, fuzzy +#~ msgid "Could not reserve volume %s on %s device %s\n" +#~ msgstr "No es posible reservar volumen %s en %s\n" -#: src/stored/label.c:1246 -#, c-format -msgid "Date written : %04d-%02d-%02d at %02d:%02d\n" -msgstr "Fecha escrito: %04d-%02d-%02d at %02d:%02d\n" +#, fuzzy +#~ msgid "Cannot write Volume label to block for %s device %s\n" +#~ msgstr "" +#~ "No se puede escribir la etiqueta de volumen para bloquear el dispositivo " +#~ "%s\n" -#: src/stored/label.c:1258 -msgid "***** ERROR ****** : Found error with the JobId\n" -msgstr "" +#, fuzzy +#~ msgid "Open %s device %s Volume \"%s\" failed: ERR=%s\n" +#~ msgstr "Fallo al abrir dispositivo %s Volumen \"%s\": ERR=%s\n" -#: src/stored/label.c:1278 -msgid "***** ERROR ****** : Found error with the JobLevel\n" -msgstr "" +#, fuzzy +#~ msgid "Rewind error on %s device %s: ERR=%s\n" +#~ msgstr "Error de rebobinado en el dispositivo %s: ERR=%s\n" -#: src/stored/label.c:1298 -msgid "***** ERROR ****** : Found error with the JobType\n" -msgstr "" +#, fuzzy +#~ msgid "Truncate error on %s device %s: ERR=%s\n" +#~ msgstr "Error al truncar en el dispositivo %s :ERR=%s\n" -#: src/stored/label.c:1305 -#, c-format -msgid "***** ERROR ****** : Found error with the Job name %s\n" -msgstr "" +#, fuzzy +#~ msgid "Failed to re-open DVD after truncate on %s device %s: ERR=%s\n" +#~ msgstr "" +#~ "No se ha podido re-abrir el DVD después de truncar el dispositivo %s: ERR=" +#~ "%s\n" -#: src/stored/label.c:1326 -msgid "Fresh Volume" -msgstr "Volumen fresco" +#, fuzzy +#~ msgid "Unable to write %s device %s: ERR=%s\n" +#~ msgstr "No es posible escribir el dispositivo %s: ERR=%s\n" -#: src/stored/label.c:1329 -msgid "Volume" -msgstr "Volumen" +#, fuzzy +#~ msgid "Recycled volume \"%s\" on %s device %s, all previous data lost.\n" +#~ msgstr "" +#~ "Volumen \"%s\" reciclado en el dispositivo %s, todos los datos anteriores " +#~ "perdidos.\n" -#: src/stored/label.c:1338 src/stored/read_records.c:406 -msgid "End of Media" -msgstr "Fin de la Media" +#, fuzzy +#~ msgid "Wrote label to prelabeled Volume \"%s\" on %s device %s\n" +#~ msgstr "" +#~ "Escribió etiqueta de volumen \"%s\" pre-etiquetada en el dispositivo %s\n" -#: src/stored/label.c:1341 -msgid "End of Tape" -msgstr "Fin de la Cinta" +#, fuzzy +#~ msgid "Bad Volume session label request=%d\n" +#~ msgstr "Mala etiqueta de Volumen de sesión = %d\n" -#: src/stored/label.c:1360 src/stored/label.c:1368 src/stored/label.c:1407 -#, c-format -msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d DataLen=%d\n" -msgstr "" -"%s Registro: Archivo:blk=%u:%u SessId=%d SessTime=%d JobId=%d DataLen=%d\n" +#~ msgid "Expecting Volume Label, got FI=%s Stream=%s len=%d\n" +#~ msgstr "Esperando Etiqueta de Volumen, obtuvo FI=%s Stream=%s len=%d\n" -#: src/stored/label.c:1365 -msgid "Bacula \"End of Tape\" label found.\n" -msgstr "" +#~ msgid "Unknown %d" +#~ msgstr "Desconocido %d" -#: src/stored/label.c:1380 src/stored/label.c:1392 -#, c-format -msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d\n" -msgstr "Registro %s: Archivo:blk=%u:%u SessId=%d SessTime=%d JobId=%d\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Volume Label:\n" +#~ "Adata : %d\n" +#~ "Id : %sVerNo : %d\n" +#~ "VolName : %s\n" +#~ "PrevVolName : %s\n" +#~ "VolFile : %d\n" +#~ "LabelType : %s\n" +#~ "LabelSize : %d\n" +#~ "PoolName : %s\n" +#~ "MediaType : %s\n" +#~ "PoolType : %s\n" +#~ "HostName : %s\n" +#~ msgstr "" +#~ "\n" +#~ "Volumen Label:\n" +#~ "Id : %sVerNo : %d\n" +#~ "VolName : %s\n" +#~ "PrevVolName : %s\n" +#~ "VolFile : %d\n" +#~ "LabelType : %s\n" +#~ "LabelSize : %d\n" +#~ "PoolName : %s\n" +#~ "MediaType : %s\n" +#~ "PoolType : %s\n" +#~ "HostName : %s\n" + +#~ msgid "Date label written: %s\n" +#~ msgstr "Fecha de etiqueta escrito: %s\n" + +#~ msgid "Date label written: %04d-%02d-%02d at %02d:%02d\n" +#~ msgstr "Fecha de etiqueta escrito: %04d-%02d-%02d at %02d:%02d\n" -#: src/stored/label.c:1382 -#, c-format -msgid " Job=%s Date=%s Level=%c Type=%c\n" -msgstr "Job=%s Fecha=%s Nivel=%c Tipo=%c\n" +#~ msgid "" +#~ "\n" +#~ "%s Record:\n" +#~ "JobId : %d\n" +#~ "VerNum : %d\n" +#~ "PoolName : %s\n" +#~ "PoolType : %s\n" +#~ "JobName : %s\n" +#~ "ClientName : %s\n" +#~ msgstr "" +#~ "\n" +#~ "%s Registro:\n" +#~ "JobId : %d\n" +#~ "VerNum : %d\n" +#~ "Nombre Pool : %s\n" +#~ "Tipo del Pool : %s\n" +#~ "Nombre del Job : %s\n" +#~ "Nombre del Cliente : %s\n" -#: src/stored/label.c:1394 -#, c-format -msgid " Date=%s Level=%c Type=%c Files=%s Bytes=%s Errors=%d Status=%c\n" -msgstr "Fecha=%s Nivel=%c Tipo=%c Archivos=%s Bytes=%s Errores=%d Estado=%c\n" +#~ msgid "" +#~ "Job (unique name) : %s\n" +#~ "FileSet : %s\n" +#~ "JobType : %c\n" +#~ "JobLevel : %c\n" +#~ msgstr "" +#~ "Job (nombre único) : %s\n" +#~ "FileSet : %s\n" +#~ "Tipo de Job : %c\n" +#~ "JobLevel : %c\n" -#: src/stored/lock.c:266 src/stored/lock.c:299 -#, c-format -msgid "pthread_cond_wait failure. ERR=%s\n" -msgstr "pthread_cond_wait fallido. ERR=%s\n" +#~ msgid "" +#~ "JobFiles : %s\n" +#~ "JobBytes : %s\n" +#~ "StartBlock : %s\n" +#~ "EndBlock : %s\n" +#~ "StartFile : %s\n" +#~ "EndFile : %s\n" +#~ "JobErrors : %s\n" +#~ "JobStatus : %c\n" +#~ msgstr "" +#~ "JobFiles : %s\n" +#~ "JobBytes : %s\n" +#~ "StartBlock : %s\n" +#~ "EndBlock : %s\n" +#~ "StartFile : %s\n" +#~ "EndFile : %s\n" +#~ "JobErrors : %s\n" +#~ "JobStatus : %c\n" -#: src/stored/lock.c:608 -msgid "unknown blocked code" -msgstr "Código desconocido bloqueado" +#~ msgid "Date written : %s\n" +#~ msgstr "Fecha escrito: %s\n" -#: src/stored/mount.c:89 -#, fuzzy, c-format -msgid "Too many errors trying to mount %s device %s.\n" -msgstr "Demasiados errores tratando de montar el dispositivo %s.\n" +#~ msgid "Date written : %04d-%02d-%02d at %02d:%02d\n" +#~ msgstr "Fecha escrito: %04d-%02d-%02d at %02d:%02d\n" -#: src/stored/mount.c:97 -#, c-format -msgid "Job %d canceled.\n" -msgstr "Job %d cancelado.\n" +#~ msgid "Fresh Volume" +#~ msgstr "Volumen fresco" -#: src/stored/mount.c:218 -#, fuzzy, c-format -msgid "Open of %s device %s Volume \"%s\" failed: ERR=%s\n" -msgstr "Fallo al abrir dispositivo %s Volumen \"%s\": ERR=%s\n" +#~ msgid "Volume" +#~ msgstr "Volumen" -#: src/stored/mount.c:296 -#, c-format -msgid "Volume \"%s\" previously written, moving to end of data.\n" -msgstr "Volumen \"%s\" previamente escrito, moviendo a finales de los datos.\n" +#~ msgid "End of Media" +#~ msgstr "Fin de la Media" -#: src/stored/mount.c:302 -#, fuzzy, c-format -msgid "Unable to position to end of data on %s device %s: ERR=%s\n" -msgstr "" -"No se puede posicionar al final los datos en el dispositivo %s: ERR=%s\n" +#~ msgid "End of Tape" +#~ msgstr "Fin de la Cinta" -#: src/stored/mount.c:446 src/stored/mount.c:835 -#, fuzzy, c-format -msgid "Volume \"%s\" not loaded on %s device %s.\n" -msgstr "Volumen \"%s\" no en dispositivo %s.\n" +#~ msgid "" +#~ "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d DataLen=%d\n" +#~ msgstr "" +#~ "%s Registro: Archivo:blk=%u:%u SessId=%d SessTime=%d JobId=%d DataLen=%d\n" -#: src/stored/mount.c:482 -#, c-format -msgid "" -"Director wanted Volume \"%s\".\n" -" Current Volume \"%s\" not acceptable because:\n" -" %s" -msgstr "" -"Director quería Volumen \"%s\".\n" -" Volumen actual \"%s\" no es aceptable porque:\n" -" %s" +#~ msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d\n" +#~ msgstr "Registro %s: Archivo:blk=%u:%u SessId=%d SessTime=%d JobId=%d\n" -#: src/stored/mount.c:660 -#, c-format -msgid "Ready to append to end of Volume \"%s\" part=%d size=%s\n" -msgstr "Listo para anexar al final del Volumen \"%s\" parte=%d tamaño=%s\n" +#~ msgid " Job=%s Date=%s Level=%c Type=%c\n" +#~ msgstr "Job=%s Fecha=%s Nivel=%c Tipo=%c\n" -#: src/stored/mount.c:664 -#, c-format -msgid "" -"Bacula cannot write on DVD Volume \"%s\" because: The sizes do not match! " -"Volume=%s Catalog=%s\n" -msgstr "" -"Bacula no puedo escribir en el volumen DVD \"%s\" porque: Los tamaños no " -"coinciden! Volumen=%s Catálogo=%s\n" +#~ msgid " Date=%s Level=%c Type=%c Files=%s Bytes=%s Errors=%d Status=%c\n" +#~ msgstr "" +#~ "Fecha=%s Nivel=%c Tipo=%c Archivos=%s Bytes=%s Errores=%d Estado=%c\n" -#: src/stored/mount.c:678 -#, c-format -msgid "Ready to append to end of Volume \"%s\" at file=%d.\n" -msgstr "Listo para anexar al final del volumen \"%s\" en el archivo=%d\n" +#~ msgid "pthread_cond_wait failure. ERR=%s\n" +#~ msgstr "pthread_cond_wait fallido. ERR=%s\n" -#: src/stored/mount.c:681 -#, fuzzy, c-format -msgid "" -"For Volume \"%s\":\n" -"The number of files mismatch! Volume=%u Catalog=%u\n" -"Correcting Catalog\n" -msgstr "" -"Bacula no puede escribir en el Volumen de cinta \"%s\" porque:\n" -"El número de archivos de desfasa! Volumen=%u Catalogo=%u\n" +#~ msgid "unknown blocked code" +#~ msgstr "Código desconocido bloqueado" -#: src/stored/mount.c:688 src/stored/mount.c:747 #, fuzzy -msgid "Error updating Catalog\n" -msgstr "Error abriendo archivo de datos %s\n" +#~ msgid "Too many errors trying to mount %s device %s.\n" +#~ msgstr "Demasiados errores tratando de montar el dispositivo %s.\n" -#: src/stored/mount.c:693 -#, c-format -msgid "" -"Bacula cannot write on tape Volume \"%s\" because:\n" -"The number of files mismatch! Volume=%u Catalog=%u\n" -msgstr "" -"Bacula no puede escribir en el Volumen de cinta \"%s\" porque:\n" -"El número de archivos de desfasa! Volumen=%u Catalogo=%u\n" +#~ msgid "Job %d canceled.\n" +#~ msgstr "Job %d cancelado.\n" -#: src/stored/mount.c:717 -#, fuzzy, c-format -msgid "Ready to append to end of Volumes \"%s\" ameta size=%s adata size=%s\n" -msgstr "Listo para anexar al final del Volumen \"%s\" parte=%d tamaño=%s\n" +#, fuzzy +#~ msgid "Open of %s device %s Volume \"%s\" failed: ERR=%s\n" +#~ msgstr "Fallo al abrir dispositivo %s Volumen \"%s\": ERR=%s\n" -#: src/stored/mount.c:722 -#, c-format -msgid "Ready to append to end of Volume \"%s\" size=%s\n" -msgstr "Listo para anexar al final del volumen \"%s\" tamaño=%s\n" +#~ msgid "Volume \"%s\" previously written, moving to end of data.\n" +#~ msgstr "" +#~ "Volumen \"%s\" previamente escrito, moviendo a finales de los datos.\n" -#: src/stored/mount.c:729 -#, fuzzy, c-format -msgid "" -"For Volume \"%s\":\n" -" The sizes do not match! Metadata Volume=%s Catalog=%s\n" -" Correcting Catalog\n" -msgstr "" -"Bacula no puedo escribir en el volumen DVD \"%s\" porque: Los tamaños no " -"coinciden! Volumen=%s Catálogo=%s\n" +#, fuzzy +#~ msgid "Unable to position to end of data on %s device %s: ERR=%s\n" +#~ msgstr "" +#~ "No se puede posicionar al final los datos en el dispositivo %s: ERR=%s\n" -#: src/stored/mount.c:736 -#, fuzzy, c-format -msgid "" -"For aligned Volume \"%s\":\n" -" Aligned sizes do not match! Aligned Volume=%s Catalog=%s\n" -" Correcting Catalog\n" -msgstr "" -"Bacula no puedo escribir en el volumen DVD \"%s\" porque: Los tamaños no " -"coinciden! Volumen=%s Catálogo=%s\n" +#, fuzzy +#~ msgid "Volume \"%s\" not loaded on %s device %s.\n" +#~ msgstr "Volumen \"%s\" no en dispositivo %s.\n" -#: src/stored/mount.c:752 -#, c-format -msgid "" -"Bacula cannot write on disk Volume \"%s\" because: The sizes do not match! " -"Volume=%s Catalog=%s\n" -msgstr "" -"Bacula no puede escribir en el Volumen de cinta \"%s\" porque:Los tamaños no " -"coinciden! Volumen=%s Catalogo=%s\n" +#~ msgid "" +#~ "Director wanted Volume \"%s\".\n" +#~ " Current Volume \"%s\" not acceptable because:\n" +#~ " %s" +#~ msgstr "" +#~ "Director quería Volumen \"%s\".\n" +#~ " Volumen actual \"%s\" no es aceptable porque:\n" +#~ " %s" -#: src/stored/mount.c:818 -#, fuzzy, c-format -msgid "Labeled new Volume \"%s\" on %s device %s.\n" -msgstr "Etiquetada nuevo Volumen \"%s\" en el dispositivo %s.\n" +#~ msgid "Ready to append to end of Volume \"%s\" part=%d size=%s\n" +#~ msgstr "Listo para anexar al final del Volumen \"%s\" parte=%d tamaño=%s\n" -#: src/stored/mount.c:829 -#, fuzzy, c-format -msgid "%s device %s not configured to autolabel Volumes.\n" -msgstr "Dispositivo %s no configurado para volúmenes autolabel.\n" +#~ msgid "" +#~ "Bacula cannot write on DVD Volume \"%s\" because: The sizes do not match! " +#~ "Volume=%s Catalog=%s\n" +#~ msgstr "" +#~ "Bacula no puedo escribir en el volumen DVD \"%s\" porque: Los tamaños no " +#~ "coinciden! Volumen=%s Catálogo=%s\n" -#: src/stored/mount.c:853 -#, c-format -msgid "Marking Volume \"%s\" in Error in Catalog.\n" -msgstr "Marcado volumen \"%s\" en Error en el Catálogo.\n" +#~ msgid "Ready to append to end of Volume \"%s\" at file=%d.\n" +#~ msgstr "Listo para anexar al final del volumen \"%s\" en el archivo=%d\n" -#: src/stored/mount.c:870 -#, c-format -msgid "" -"Autochanger Volume \"%s\" not found in slot %d.\n" -" Setting InChanger to zero in catalog.\n" -msgstr "" -"Volumen auto-cambiador \"%s\" no se encuentra en la ranura %d\n" -"Estableciendo InChanger a cero en el catálogo.\n" +#, fuzzy +#~ msgid "" +#~ "For Volume \"%s\":\n" +#~ "The number of files mismatch! Volume=%u Catalog=%u\n" +#~ "Correcting Catalog\n" +#~ msgstr "" +#~ "Bacula no puede escribir en el Volumen de cinta \"%s\" porque:\n" +#~ "El número de archivos de desfasa! Volumen=%u Catalogo=%u\n" -#: src/stored/mount.c:889 -msgid "Hey!!!!! WroteVol non-zero !!!!!\n" -msgstr "Hey !!!!! No WroteVol cero !!!!!\n" +#, fuzzy +#~ msgid "Error updating Catalog\n" +#~ msgstr "Error abriendo archivo de datos %s\n" -#: src/stored/mount.c:939 -#, c-format -msgid "" -"Invalid tape position on volume \"%s\" on device %s. Expected %d, got %d\n" -msgstr "" -"Posición de la cinta no válida en el volumen \"%s\" en el dispositivo %s. " -"Esperaba %d, obtuvo %d\n" +#~ msgid "" +#~ "Bacula cannot write on tape Volume \"%s\" because:\n" +#~ "The number of files mismatch! Volume=%u Catalog=%u\n" +#~ msgstr "" +#~ "Bacula no puede escribir en el Volumen de cinta \"%s\" porque:\n" +#~ "El número de archivos de desfasa! Volumen=%u Catalogo=%u\n" -#: src/stored/mount.c:980 -#, fuzzy, c-format -msgid "Cannot open %s Dev=%s, Vol=%s for reading.\n" -msgstr "No se puede abrir Dev=%s, Vol=%s\n" +#, fuzzy +#~ msgid "" +#~ "Ready to append to end of Volumes \"%s\" ameta size=%s adata size=%s\n" +#~ msgstr "Listo para anexar al final del Volumen \"%s\" parte=%d tamaño=%s\n" -#: src/stored/os.c:126 -#, c-format -msgid "Unable to set eotmodel on device %s: ERR=%s\n" -msgstr "No se puede establecer eotmodel en el dispositivo %s: ERR=%s\n" +#~ msgid "Ready to append to end of Volume \"%s\" size=%s\n" +#~ msgstr "Listo para anexar al final del volumen \"%s\" tamaño=%s\n" -#: src/stored/os.c:180 -msgid " Bacula status:" -msgstr "Estado del Bacula:" +#, fuzzy +#~ msgid "" +#~ "For Volume \"%s\":\n" +#~ " The sizes do not match! Metadata Volume=%s Catalog=%s\n" +#~ " Correcting Catalog\n" +#~ msgstr "" +#~ "Bacula no puedo escribir en el volumen DVD \"%s\" porque: Los tamaños no " +#~ "coinciden! Volumen=%s Catálogo=%s\n" -#: src/stored/os.c:181 src/stored/os.c:264 src/stored/os.c:266 -#, c-format -msgid " file=%d block=%d\n" -msgstr "archivo=%d bloque=%d\n" +#, fuzzy +#~ msgid "" +#~ "For aligned Volume \"%s\":\n" +#~ " Aligned sizes do not match! Aligned Volume=%s Catalog=%s\n" +#~ " Correcting Catalog\n" +#~ msgstr "" +#~ "Bacula no puedo escribir en el volumen DVD \"%s\" porque: Los tamaños no " +#~ "coinciden! Volumen=%s Catálogo=%s\n" -#: src/stored/os.c:185 src/stored/tape_dev.c:345 -#, c-format -msgid "ioctl MTIOCGET error on %s. ERR=%s.\n" -msgstr "ioctl MTIOCGET error en %s. ERR=%s.\n" +#~ msgid "" +#~ "Bacula cannot write on disk Volume \"%s\" because: The sizes do not " +#~ "match! Volume=%s Catalog=%s\n" +#~ msgstr "" +#~ "Bacula no puede escribir en el Volumen de cinta \"%s\" porque:Los tamaños " +#~ "no coinciden! Volumen=%s Catalogo=%s\n" -#: src/stored/os.c:189 -msgid " Device status:" -msgstr "Estado del Dispositivo:" +#, fuzzy +#~ msgid "Labeled new Volume \"%s\" on %s device %s.\n" +#~ msgstr "Etiquetada nuevo Volumen \"%s\" en el dispositivo %s.\n" -#: src/stored/os.c:365 -#, c-format -msgid "unknown func code %d" -msgstr "código de función %d desconocido" +#, fuzzy +#~ msgid "%s device %s not configured to autolabel Volumes.\n" +#~ msgstr "Dispositivo %s no configurado para volúmenes autolabel.\n" -#: src/stored/os.c:371 -#, c-format -msgid "I/O function \"%s\" not supported on this device.\n" -msgstr "I/O función \"%s\" no es compatible con este dispositivo. \n" +#~ msgid "Marking Volume \"%s\" in Error in Catalog.\n" +#~ msgstr "Marcado volumen \"%s\" en Error en el Catálogo.\n" -#: src/stored/parse_bsr.c:116 -#, c-format -msgid "Cannot open bootstrap file %s: %s\n" -msgstr "No se puede abrir el archivo bootstrap %s: %s\n" +#~ msgid "" +#~ "Autochanger Volume \"%s\" not found in slot %d.\n" +#~ " Setting InChanger to zero in catalog.\n" +#~ msgstr "" +#~ "Volumen auto-cambiador \"%s\" no se encuentra en la ranura %d\n" +#~ "Estableciendo InChanger a cero en el catálogo.\n" -#: src/stored/parse_bsr.c:220 -#, c-format -msgid "Device \"%s\" in bsr at inappropriate place.\n" -msgstr "Dispositivo %s en BSR en el lugar inadecuado.\n" +#~ msgid "Hey!!!!! WroteVol non-zero !!!!!\n" +#~ msgstr "Hey !!!!! No WroteVol cero !!!!!\n" -#: src/stored/parse_bsr.c:283 -#, c-format -msgid "REGEX '%s' compile error. ERR=%s\n" -msgstr "error de compilación REGEX '%s'. ERR=%s\n" +#~ msgid "" +#~ "Invalid tape position on volume \"%s\" on device %s. Expected %d, got %d\n" +#~ msgstr "" +#~ "Posición de la cinta no válida en el volumen \"%s\" en el dispositivo %s. " +#~ "Esperaba %d, obtuvo %d\n" -#: src/stored/parse_bsr.c:326 -msgid "JobType not yet implemented\n" -msgstr "JobType aún no se han implementado\n" +#, fuzzy +#~ msgid "Cannot open %s Dev=%s, Vol=%s for reading.\n" +#~ msgstr "No se puede abrir Dev=%s, Vol=%s\n" -#: src/stored/parse_bsr.c:334 -msgid "JobLevel not yet implemented\n" -msgstr "JobLevel aún no se han implementado\n" +#~ msgid "Unable to set eotmodel on device %s: ERR=%s\n" +#~ msgstr "No se puede establecer eotmodel en el dispositivo %s: ERR=%s\n" -#: src/stored/parse_bsr.c:379 -#, c-format -msgid "MediaType %s in bsr at inappropriate place.\n" -msgstr "MediaType %s en BSR en el lugar inadecuado.\n" +#~ msgid " Bacula status:" +#~ msgstr "Estado del Bacula:" -#: src/stored/parse_bsr.c:684 -#, c-format -msgid "Slot %d in bsr at inappropriate place.\n" -msgstr "Ranura %d en BSR en el lugar inadecuado.\n" +#~ msgid " file=%d block=%d\n" +#~ msgstr "archivo=%d bloque=%d\n" -#: src/stored/parse_bsr.c:708 -#, c-format -msgid "VolFile : %u-%u\n" -msgstr "VolFile : %u-%u\n" +#~ msgid "ioctl MTIOCGET error on %s. ERR=%s.\n" +#~ msgstr "ioctl MTIOCGET error en %s. ERR=%s.\n" -#: src/stored/parse_bsr.c:716 -#, c-format -msgid "VolBlock : %u-%u\n" -msgstr "VolBlock : %u-%u\n" +#~ msgid " Device status:" +#~ msgstr "Estado del Dispositivo:" -#: src/stored/parse_bsr.c:724 -#, c-format -msgid "VolAddr : %llu-%llu\n" -msgstr "VolAddr : %llu-%llu\n" +#~ msgid "unknown func code %d" +#~ msgstr "código de función %d desconocido" -#: src/stored/parse_bsr.c:733 -#, c-format -msgid "FileIndex : %u\n" -msgstr "FileIndex : %u\n" +#~ msgid "I/O function \"%s\" not supported on this device.\n" +#~ msgstr "I/O función \"%s\" no es compatible con este dispositivo. \n" -#: src/stored/parse_bsr.c:735 -#, c-format -msgid "FileIndex : %u-%u\n" -msgstr "FileIndex : %u-%u\n" +#~ msgid "Cannot open bootstrap file %s: %s\n" +#~ msgstr "No se puede abrir el archivo bootstrap %s: %s\n" -#: src/stored/parse_bsr.c:745 -#, c-format -msgid "JobId : %u\n" -msgstr "JobId : %u\n" +#~ msgid "Device \"%s\" in bsr at inappropriate place.\n" +#~ msgstr "Dispositivo %s en BSR en el lugar inadecuado.\n" -#: src/stored/parse_bsr.c:747 -#, c-format -msgid "JobId : %u-%u\n" -msgstr "JobId : %u-%u\n" +#~ msgid "REGEX '%s' compile error. ERR=%s\n" +#~ msgstr "error de compilación REGEX '%s'. ERR=%s\n" -#: src/stored/parse_bsr.c:757 -#, c-format -msgid "SessId : %u\n" -msgstr "SessId : %u\n" +#~ msgid "JobType not yet implemented\n" +#~ msgstr "JobType aún no se han implementado\n" -#: src/stored/parse_bsr.c:759 -#, c-format -msgid "SessId : %u-%u\n" -msgstr "SessId : %u-%u\n" +#~ msgid "JobLevel not yet implemented\n" +#~ msgstr "JobLevel aún no se han implementado\n" -#: src/stored/parse_bsr.c:768 -#, c-format -msgid "VolumeName : %s\n" -msgstr "VolumeName : %s\n" +#~ msgid "MediaType %s in bsr at inappropriate place.\n" +#~ msgstr "MediaType %s en BSR en el lugar inadecuado.\n" -#: src/stored/parse_bsr.c:769 -#, c-format -msgid " MediaType : %s\n" -msgstr "MediaType : %s\n" +#~ msgid "Slot %d in bsr at inappropriate place.\n" +#~ msgstr "Ranura %d en BSR en el lugar inadecuado.\n" -#: src/stored/parse_bsr.c:770 -#, c-format -msgid " Device : %s\n" -msgstr "Dispositivo : %s\n" +#~ msgid "VolFile : %u-%u\n" +#~ msgstr "VolFile : %u-%u\n" -#: src/stored/parse_bsr.c:771 -#, c-format -msgid " Slot : %d\n" -msgstr "Ranura : %d\n" +#~ msgid "VolBlock : %u-%u\n" +#~ msgstr "VolBlock : %u-%u\n" -#: src/stored/parse_bsr.c:780 -#, c-format -msgid "Client : %s\n" -msgstr "Cliente : %s\n" +#~ msgid "VolAddr : %llu-%llu\n" +#~ msgstr "VolAddr : %llu-%llu\n" -#: src/stored/parse_bsr.c:788 -#, c-format -msgid "Job : %s\n" -msgstr "Job : %s\n" +#~ msgid "FileIndex : %u\n" +#~ msgstr "FileIndex : %u\n" -#: src/stored/parse_bsr.c:796 -#, c-format -msgid "SessTime : %u\n" -msgstr "SessTime : %u\n" +#~ msgid "FileIndex : %u-%u\n" +#~ msgstr "FileIndex : %u-%u\n" -#: src/stored/parse_bsr.c:807 -msgid "BSR is NULL\n" -msgstr "BSR is NULL\n" +#~ msgid "JobId : %u\n" +#~ msgstr "JobId : %u\n" -#: src/stored/parse_bsr.c:811 -#, c-format -msgid "Next : 0x%x\n" -msgstr "Siguiente : 0x%x\n" +#~ msgid "JobId : %u-%u\n" +#~ msgstr "JobId : %u-%u\n" -#: src/stored/parse_bsr.c:812 -#, c-format -msgid "Root bsr : 0x%x\n" -msgstr "Root bsr : 0x%x\n" +#~ msgid "SessId : %u\n" +#~ msgstr "SessId : %u\n" -#: src/stored/parse_bsr.c:824 -#, c-format -msgid "count : %u\n" -msgstr "contado : %u\n" +#~ msgid "SessId : %u-%u\n" +#~ msgstr "SessId : %u-%u\n" -#: src/stored/parse_bsr.c:825 -#, c-format -msgid "found : %u\n" -msgstr "encontrado : %u\n" +#~ msgid "VolumeName : %s\n" +#~ msgstr "VolumeName : %s\n" -#: src/stored/parse_bsr.c:828 -#, c-format -msgid "done : %s\n" -msgstr "realizado : %s\n" +#~ msgid " MediaType : %s\n" +#~ msgstr "MediaType : %s\n" -#: src/stored/parse_bsr.c:829 -#, c-format -msgid "positioning : %d\n" -msgstr "posicionamiento : %d\n" +#~ msgid " Device : %s\n" +#~ msgstr "Dispositivo : %s\n" -#: src/stored/parse_bsr.c:830 -#, c-format -msgid "fast_reject : %d\n" -msgstr "fast_reject : %d\n" +#~ msgid " Slot : %d\n" +#~ msgstr "Ranura : %d\n" -#: src/stored/parse_bsr.c:1054 src/stored/parse_bsr.c:1058 -#, c-format -msgid "" -"Bootstrap file error: %s\n" -" : Line %d, col %d of file %s\n" -"%s\n" -msgstr "" -"Error archivo Bootstrap: %s\n" -" : Linea %d, columna %d del archivo %s\n" -"%s\n" +#~ msgid "Client : %s\n" +#~ msgstr "Cliente : %s\n" -#: src/stored/read.c:56 -msgid "No Volume names found for restore.\n" -msgstr "Nombres de Volumen no encontrados para restaurar.\n" +#~ msgid "Job : %s\n" +#~ msgstr "Job : %s\n" -#: src/stored/read.c:201 src/stored/read.c:360 -#, c-format -msgid ">filed: Error Hdr=%s\n" -msgstr ">filed: Error Hdr=%s\n" +#~ msgid "SessTime : %u\n" +#~ msgstr "SessTime : %u\n" -#: src/stored/read.c:202 -#, fuzzy, c-format -msgid "Error sending header to Client. ERR=%s\n" -msgstr "Error escribiendo encabezado para archivo de cola. ERR=%s\n" +#~ msgid "BSR is NULL\n" +#~ msgstr "BSR is NULL\n" -#: src/stored/read.c:248 src/stored/read.c:376 -#, c-format -msgid "Error sending to FD. ERR=%s\n" -msgstr "Error enviando para FD. ERR=%s\n" +#~ msgid "Next : 0x%x\n" +#~ msgstr "Siguiente : 0x%x\n" -#: src/stored/read.c:249 -#, fuzzy, c-format -msgid "Error sending data to Client. ERR=%s\n" -msgstr "Error enviando para FD. ERR=%s\n" +#~ msgid "Root bsr : 0x%x\n" +#~ msgstr "Root bsr : 0x%x\n" -#: src/stored/read.c:332 src/stored/read.c:361 src/stored/read.c:377 -#, c-format -msgid "Error sending to File daemon. ERR=%s\n" -msgstr "Error enviando para demonio File. ERR=%s\n" +#~ msgid "count : %u\n" +#~ msgstr "contado : %u\n" -#: src/stored/read_records.c:79 -#, c-format -msgid "End of Volume at file %u on device %s, Volume \"%s\"\n" -msgstr "Fin del Volumen en archivo %u en dispositivo %s, Volumen \"%s\"\n" +#~ msgid "found : %u\n" +#~ msgstr "encontrado : %u\n" -#: src/stored/read_records.c:83 -msgid "End of all volumes.\n" -msgstr "Fin de todos los volúmenes.\n" +#~ msgid "done : %s\n" +#~ msgstr "realizado : %s\n" -#: src/stored/read_records.c:133 -msgid "Did fsr in attemp to skip bad record.\n" -msgstr "fsr hizo en un intento para saltar malo registro.\n" +#~ msgid "positioning : %d\n" +#~ msgstr "posicionamiento : %d\n" -#: src/stored/read_records.c:375 -#, c-format -msgid "Forward spacing Volume \"%s\" to file:block %u:%u.\n" -msgstr "Espaciando hacia adelante Volumen \"%s\" para archivo:bloque %u:%u.\n" +#~ msgid "fast_reject : %d\n" +#~ msgstr "fast_reject : %d\n" -#: src/stored/read_records.c:399 -msgid "Begin Session" -msgstr "Inicio de Sesión" +#~ msgid "" +#~ "Bootstrap file error: %s\n" +#~ " : Line %d, col %d of file %s\n" +#~ "%s\n" +#~ msgstr "" +#~ "Error archivo Bootstrap: %s\n" +#~ " : Linea %d, columna %d del archivo %s\n" +#~ "%s\n" -#: src/stored/read_records.c:403 -msgid "End Session" -msgstr "Fin de Sesión" +#~ msgid "No Volume names found for restore.\n" +#~ msgstr "Nombres de Volumen no encontrados para restaurar.\n" -#: src/stored/read_records.c:409 -#, c-format -msgid "Unknown code %d\n" -msgstr "Código desconocido %d\n" +#~ msgid ">filed: Error Hdr=%s\n" +#~ msgstr ">filed: Error Hdr=%s\n" -#: src/stored/record_util.c:62 -#, c-format -msgid "unknown: %d" -msgstr "desconocido: %d" +#, fuzzy +#~ msgid "Error sending header to Client. ERR=%s\n" +#~ msgstr "Error escribiendo encabezado para archivo de cola. ERR=%s\n" -#: src/stored/reserve.c:65 -#, c-format -msgid "Unable to initialize reservation lock. ERR=%s\n" -msgstr "No se puede inicializar bloqueo de reserva. ERR=%s\n" +#~ msgid "Error sending to FD. ERR=%s\n" +#~ msgstr "Error enviando para FD. ERR=%s\n" -#: src/stored/reserve.c:145 -#, c-format -msgid "Hey! num_writers=%d!!!!\n" -msgstr "Hey! num_writers=%d!!!!\n" +#, fuzzy +#~ msgid "Error sending data to Client. ERR=%s\n" +#~ msgstr "Error enviando para FD. ERR=%s\n" -#: src/stored/reserve.c:260 -msgid "3939 Could not get dcr\n" -msgstr "3939 No se pudo obtener DCR\n" +#~ msgid "Error sending to File daemon. ERR=%s\n" +#~ msgstr "Error enviando para demonio File. ERR=%s\n" -#: src/stored/reserve.c:369 -#, c-format -msgid "Device reservation failed for JobId=%d: %s\n" -msgstr "Reservación del Dispositivo fallida para JobId=%d: %s\n" +#~ msgid "End of Volume at file %u on device %s, Volume \"%s\"\n" +#~ msgstr "Fin del Volumen en archivo %u en dispositivo %s, Volumen \"%s\"\n" -#: src/stored/reserve.c:378 -#, c-format -msgid "Failed command: %s\n" -msgstr "Comando fallido: %s\n" +#~ msgid "End of all volumes.\n" +#~ msgstr "Fin de todos los volúmenes.\n" -#: src/stored/reserve.c:654 -#, fuzzy, c-format -msgid "" -"\n" -" Device \"%s\" requested by DIR is disabled.\n" -msgstr "" -"\n" -"Dispositivo \"%s\" solicitado por el DIR no se pudo abrir o no existe.\n" +#~ msgid "Did fsr in attemp to skip bad record.\n" +#~ msgstr "fsr hizo en un intento para saltar malo registro.\n" -#: src/stored/reserve.c:669 -#, c-format -msgid "3926 Could not get dcr for device: %s\n" -msgstr "3926 No se pudo obtener dcr para el dispositivo: %s\n" +#~ msgid "Forward spacing Volume \"%s\" to file:block %u:%u.\n" +#~ msgstr "" +#~ "Espaciando hacia adelante Volumen \"%s\" para archivo:bloque %u:%u.\n" -#: src/stored/reserve.c:809 -#, fuzzy, c-format -msgid "3603 JobId=%u %s device %s is busy reading.\n" -msgstr "3603 JobId=%u dispositivo %s está ocupado leyendo.\n" +#~ msgid "Begin Session" +#~ msgstr "Inicio de Sesión" -#: src/stored/reserve.c:818 -#, fuzzy, c-format -msgid "3604 JobId=%u %s device %s is BLOCKED due to user unmount.\n" -msgstr "" -"3604 JobId=%u dispositivo %s está BLOQUEADO debido al desmonte de usuario.\n" +#~ msgid "End Session" +#~ msgstr "Fin de Sesión" -#: src/stored/reserve.c:866 -#, fuzzy, c-format -msgid "3601 JobId=%u %s device %s is BLOCKED due to user unmount.\n" -msgstr "" -"3601 JobId=%u dispositivo %s está BLOQUEADO debido al desmontar por el " -"usuario.\n" +#~ msgid "Unknown code %d\n" +#~ msgstr "Código desconocido %d\n" -#: src/stored/reserve.c:874 -#, fuzzy, c-format -msgid "" -"3602 JobId=%u %s device %s is busy (already reading/writing). read=%d, " -"writers=%d reserved=%d\n" -msgstr "3602 JobId=%u dispositivo %s está ocupado (ya leyendo/escribiendo).\n" +#~ msgid "unknown: %d" +#~ msgstr "desconocido: %d" -#: src/stored/reserve.c:913 -#, fuzzy, c-format -msgid "3609 JobId=%u Max concurrent jobs=%d exceeded on %s device %s.\n" -msgstr "3609 JobId=%u Máximo trabajos simultáneos superado en la unidad %s.\n" +#~ msgid "Unable to initialize reservation lock. ERR=%s\n" +#~ msgstr "No se puede inicializar bloqueo de reserva. ERR=%s\n" -#: src/stored/reserve.c:931 -#, fuzzy, c-format -msgid "" -"3610 JobId=%u Aligned volume max bytes does not allow concurrency on drive " -"%s.\n" -msgstr "3610 JobId=%u máximo volumen jobs excedido en la unidad %s.\n" +#~ msgid "Hey! num_writers=%d!!!!\n" +#~ msgstr "Hey! num_writers=%d!!!!\n" -#: src/stored/reserve.c:941 -#, fuzzy, c-format -msgid "3611 JobId=%u Volume max jobs=%d exceeded on %s device %s.\n" -msgstr "3610 JobId=%u máximo volumen jobs excedido en la unidad %s.\n" +#~ msgid "3939 Could not get dcr\n" +#~ msgstr "3939 No se pudo obtener DCR\n" -#: src/stored/reserve.c:966 -#, fuzzy, c-format -msgid "" -"3608 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" nreserve=%d on %s " -"device %s.\n" -msgstr "" -"3608 JobId=%u requiere Pool=\"%s\", pero hay Pool=\"%s\" nreserve=%d en la " -"unidad %s.\n" +#~ msgid "Device reservation failed for JobId=%d: %s\n" +#~ msgstr "Reservación del Dispositivo fallida para JobId=%d: %s\n" -#: src/stored/reserve.c:1018 -#, fuzzy, c-format -msgid "3605 JobId=%u wants free drive but %s device %s is busy.\n" -msgstr "" -"3605 JobId=%u requiere la unidad disponible, pero el dispositivo %s está " -"ocupado.\n" +#~ msgid "Failed command: %s\n" +#~ msgstr "Comando fallido: %s\n" -#: src/stored/reserve.c:1027 -#, fuzzy, c-format -msgid "3606 JobId=%u prefers mounted drives, but %s device %s has no Volume.\n" -msgstr "" -"3606 JobId=%u prefiere unidades montadas, pero la unidad %s no tiene " -"Volumen.\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ " Device \"%s\" requested by DIR is disabled.\n" +#~ msgstr "" +#~ "\n" +#~ "Dispositivo \"%s\" solicitado por el DIR no se pudo abrir o no existe.\n" -#: src/stored/reserve.c:1049 -#, fuzzy, c-format -msgid "3607 JobId=%u wants Vol=\"%s\" drive has Vol=\"%s\" on %s device %s.\n" -msgstr "" -"3607 JobId=%u quiere Vol=\"%s\" la unidad tiene Vol=\"%s\" en la unidad %s.\n" +#~ msgid "3926 Could not get dcr for device: %s\n" +#~ msgstr "3926 No se pudo obtener dcr para el dispositivo: %s\n" -#: src/stored/reserve.c:1104 -#, c-format -msgid "Logic error!!!! JobId=%u Should not get here.\n" -msgstr "Error lógico!! JobId=%u No debería llegar hasta aquí.\n" +#, fuzzy +#~ msgid "3603 JobId=%u %s device %s is busy reading.\n" +#~ msgstr "3603 JobId=%u dispositivo %s está ocupado leyendo.\n" -#: src/stored/reserve.c:1105 -#, fuzzy, c-format -msgid "3910 JobId=%u Logic error!!!! %s device %s Should not get here.\n" -msgstr "" -"3910 JobId=%u Error de lógica!!! la unidad %s no debería llegar aquí.\n" +#, fuzzy +#~ msgid "3604 JobId=%u %s device %s is BLOCKED due to user unmount.\n" +#~ msgstr "" +#~ "3604 JobId=%u dispositivo %s está BLOQUEADO debido al desmonte de " +#~ "usuario.\n" -#: src/stored/reserve.c:1108 -msgid "Logic error!!!! Should not get here.\n" -msgstr "Error lógico!!! No debe llegar aquí.\n" +#, fuzzy +#~ msgid "3601 JobId=%u %s device %s is BLOCKED due to user unmount.\n" +#~ msgstr "" +#~ "3601 JobId=%u dispositivo %s está BLOQUEADO debido al desmontar por el " +#~ "usuario.\n" -#: src/stored/reserve.c:1111 -#, fuzzy, c-format -msgid "3911 JobId=%u failed reserve %s device %s.\n" -msgstr "3911 JobId=%u fallo al reservar unidad %s.\n" +#, fuzzy +#~ msgid "" +#~ "3602 JobId=%u %s device %s is busy (already reading/writing). read=%d, " +#~ "writers=%d reserved=%d\n" +#~ msgstr "" +#~ "3602 JobId=%u dispositivo %s está ocupado (ya leyendo/escribiendo).\n" -#: src/stored/spool.c:72 -msgid "Spooling statistics:\n" -msgstr "Estadísticas de cola:\n" +#, fuzzy +#~ msgid "3609 JobId=%u Max concurrent jobs=%d exceeded on %s device %s.\n" +#~ msgstr "" +#~ "3609 JobId=%u Máximo trabajos simultáneos superado en la unidad %s.\n" -#: src/stored/spool.c:75 -#, c-format -msgid "" -"Data spooling: %u active jobs, %s bytes; %u total jobs, %s max bytes/job.\n" -msgstr "" -"Encolando datos: %u jobs activos, %s bytes; %u total de jobs, %s máximo " -"bytes/job.\n" +#, fuzzy +#~ msgid "" +#~ "3610 JobId=%u Aligned volume max bytes does not allow concurrency on " +#~ "drive %s.\n" +#~ msgstr "3610 JobId=%u máximo volumen jobs excedido en la unidad %s.\n" -#: src/stored/spool.c:83 -#, c-format -msgid "Attr spooling: %u active jobs, %s bytes; %u total jobs, %s max bytes.\n" -msgstr "" -"Encolando Atributos: %u jobs activos, %s bytes; %u jobs total, %s bytes " -"máximos.\n" +#, fuzzy +#~ msgid "3611 JobId=%u Volume max jobs=%d exceeded on %s device %s.\n" +#~ msgstr "3610 JobId=%u máximo volumen jobs excedido en la unidad %s.\n" -#: src/stored/spool.c:104 -msgid "Spooling data ...\n" -msgstr "Datos en cola ...\n" +#, fuzzy +#~ msgid "" +#~ "3608 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" nreserve=%d on %s " +#~ "device %s.\n" +#~ msgstr "" +#~ "3608 JobId=%u requiere Pool=\"%s\", pero hay Pool=\"%s\" nreserve=%d en " +#~ "la unidad %s.\n" -#: src/stored/spool.c:130 -#, c-format -msgid "Bad return from despool WroteVol=%d\n" -msgstr "Mal retorno de despool WroteVol=%d\n" +#, fuzzy +#~ msgid "3605 JobId=%u wants free drive but %s device %s is busy.\n" +#~ msgstr "" +#~ "3605 JobId=%u requiere la unidad disponible, pero el dispositivo %s está " +#~ "ocupado.\n" -#: src/stored/spool.c:163 -#, c-format -msgid "Open data spool file %s failed: ERR=%s\n" -msgstr "Fallo al abrir archivo %s de datos de cola: ERR=%s\n" +#, fuzzy +#~ msgid "" +#~ "3606 JobId=%u prefers mounted drives, but %s device %s has no Volume.\n" +#~ msgstr "" +#~ "3606 JobId=%u prefiere unidades montadas, pero la unidad %s no tiene " +#~ "Volumen.\n" -#: src/stored/spool.c:191 -msgid "Despooling zero bytes. Your disk is probably FULL!\n" -msgstr "Desencolando cero bytes. El disco probablemente esta LLENO!\n" +#, fuzzy +#~ msgid "" +#~ "3607 JobId=%u wants Vol=\"%s\" drive has Vol=\"%s\" on %s device %s.\n" +#~ msgstr "" +#~ "3607 JobId=%u quiere Vol=\"%s\" la unidad tiene Vol=\"%s\" en la unidad " +#~ "%s.\n" -#: src/stored/spool.c:200 -#, c-format -msgid "Committing spooled data to Volume \"%s\". Despooling %s bytes ...\n" -msgstr "" -"Perpetrando datos encolados al volumen \"%s\". Desencolando %s bytes ...\n" +#~ msgid "Logic error!!!! JobId=%u Should not get here.\n" +#~ msgstr "Error lógico!! JobId=%u No debería llegar hasta aquí.\n" -#: src/stored/spool.c:205 -#, c-format -msgid "Writing spooled data to Volume. Despooling %s bytes ...\n" -msgstr "Escribiendo datos encolados al volumen. Desencolando %s bytes ...\n" +#, fuzzy +#~ msgid "3910 JobId=%u Logic error!!!! %s device %s Should not get here.\n" +#~ msgstr "" +#~ "3910 JobId=%u Error de lógica!!! la unidad %s no debería llegar aquí.\n" -#: src/stored/spool.c:295 -#, c-format -msgid "" -"Despooling elapsed time = %02d:%02d:%02d, Transfer rate = %s Bytes/second\n" -msgstr "" -"Tiempo transcurrido desencolando = %02d:%02d:%02d, Tasa de transferencia = " -"%s Bytes/segundo\n" +#~ msgid "Logic error!!!! Should not get here.\n" +#~ msgstr "Error lógico!!! No debe llegar aquí.\n" -#: src/stored/spool.c:304 src/stored/spool.c:505 src/stored/spool.c:551 -#, c-format -msgid "Ftruncate spool file failed: ERR=%s\n" -msgstr "Fallo ftruncate archivo de cola: ERR=%s\n" +#, fuzzy +#~ msgid "3911 JobId=%u failed reserve %s device %s.\n" +#~ msgstr "3911 JobId=%u fallo al reservar unidad %s.\n" -#: src/stored/spool.c:363 -#, c-format -msgid "Spool header read error. ERR=%s\n" -msgstr "Error de lectura de la cola. ERR=%s\n" +#~ msgid "Spooling statistics:\n" +#~ msgstr "Estadísticas de cola:\n" -#: src/stored/spool.c:366 -#, c-format -msgid "Spool read error. Wanted %u bytes, got %d\n" -msgstr "Error de lectura de la cola. Esperaba %u bytes, obtuvo %d\n" +#~ msgid "" +#~ "Data spooling: %u active jobs, %s bytes; %u total jobs, %s max bytes/" +#~ "job.\n" +#~ msgstr "" +#~ "Encolando datos: %u jobs activos, %s bytes; %u total de jobs, %s máximo " +#~ "bytes/job.\n" -#: src/stored/spool.c:367 -#, c-format -msgid "Spool header read error. Wanted %u bytes, got %d\n" -msgstr "" -"Error de lectura de cabecera de la cola. Esperaba %u bytes, obtuvo %d\n" +#~ msgid "" +#~ "Attr spooling: %u active jobs, %s bytes; %u total jobs, %s max bytes.\n" +#~ msgstr "" +#~ "Encolando Atributos: %u jobs activos, %s bytes; %u jobs total, %s bytes " +#~ "máximos.\n" -#: src/stored/spool.c:374 src/stored/spool.c:375 -#, c-format -msgid "Spool block too big. Max %u bytes, got %u\n" -msgstr "Bloque de la cola demasiado grande. Máximo %u bytes, obtuvo %u\n" +#~ msgid "Spooling data ...\n" +#~ msgstr "Datos en cola ...\n" -#: src/stored/spool.c:381 src/stored/spool.c:382 -#, c-format -msgid "Spool data read error. Wanted %u bytes, got %d\n" -msgstr "Error de lectura de datos de la cola. Esperaba %u bytes, obtuvo %d\n" +#~ msgid "Bad return from despool WroteVol=%d\n" +#~ msgstr "Mal retorno de despool WroteVol=%d\n" -#: src/stored/spool.c:436 -#, fuzzy, c-format -msgid "" -"User specified Job spool size reached: JobSpoolSize=%s MaxJobSpoolSize=%s\n" -msgstr "Tamaño de cola especificada por el usuario alcanzado.\n" +#~ msgid "Open data spool file %s failed: ERR=%s\n" +#~ msgstr "Fallo al abrir archivo %s de datos de cola: ERR=%s\n" -#: src/stored/spool.c:441 -#, fuzzy, c-format -msgid "" -"User specified Device spool size reached: DevSpoolSize=%s MaxDevSpoolSize=" -"%s\n" -msgstr "Tamaño de cola especificada por el usuario alcanzado.\n" +#~ msgid "Despooling zero bytes. Your disk is probably FULL!\n" +#~ msgstr "Desencolando cero bytes. El disco probablemente esta LLENO!\n" -#: src/stored/spool.c:448 -msgid "Bad return from despool in write_block.\n" -msgstr "Malo retorno desde despool en write_block.\n" +#~ msgid "Committing spooled data to Volume \"%s\". Despooling %s bytes ...\n" +#~ msgstr "" +#~ "Perpetrando datos encolados al volumen \"%s\". Desencolando %s bytes ...\n" -#: src/stored/spool.c:456 -msgid "Spooling data again ...\n" -msgstr "Encolando datos de nuevo ...\n" +#~ msgid "Writing spooled data to Volume. Despooling %s bytes ...\n" +#~ msgstr "Escribiendo datos encolados al volumen. Desencolando %s bytes ...\n" -#: src/stored/spool.c:488 -#, c-format -msgid "Error writing header to spool file. ERR=%s\n" -msgstr "Error escribiendo encabezado para archivo de cola. ERR=%s\n" +#~ msgid "" +#~ "Despooling elapsed time = %02d:%02d:%02d, Transfer rate = %s Bytes/" +#~ "second\n" +#~ msgstr "" +#~ "Tiempo transcurrido desencolando = %02d:%02d:%02d, Tasa de transferencia " +#~ "= %s Bytes/segundo\n" -#: src/stored/spool.c:493 -#, c-format -msgid "" -"Error writing header to spool file. Disk probably full. Attempting recovery. " -"Wanted to write=%d got=%d\n" -msgstr "" -"Error al escribir encabezado al archivo de cola. Probablemente disco lleno. " -"Intentando recuperación. Esperaba escribir=%d tiene=%d\n" +#~ msgid "Ftruncate spool file failed: ERR=%s\n" +#~ msgstr "Fallo ftruncate archivo de cola: ERR=%s\n" -#: src/stored/spool.c:511 src/stored/spool.c:557 -msgid "Fatal despooling error." -msgstr "Error fatal desencolando." +#~ msgid "Spool header read error. ERR=%s\n" +#~ msgstr "Error de lectura de la cola. ERR=%s\n" -#: src/stored/spool.c:519 -msgid "Retrying after header spooling error failed.\n" -msgstr "Fallido reintento después de error encolando encabezado.\n" +#~ msgid "Spool read error. Wanted %u bytes, got %d\n" +#~ msgstr "Error de lectura de la cola. Esperaba %u bytes, obtuvo %d\n" -#: src/stored/spool.c:535 -#, c-format -msgid "Error writing data to spool file. ERR=%s\n" -msgstr "Error escribiendo datos en archivo de cola. ERR=%s\n" +#~ msgid "Spool header read error. Wanted %u bytes, got %d\n" +#~ msgstr "" +#~ "Error de lectura de cabecera de la cola. Esperaba %u bytes, obtuvo %d\n" -#: src/stored/spool.c:568 -msgid "Retrying after data spooling error failed.\n" -msgstr "Fallido reintento después de error encolando dato.\n" +#~ msgid "Spool block too big. Max %u bytes, got %u\n" +#~ msgstr "Bloque de la cola demasiado grande. Máximo %u bytes, obtuvo %u\n" -#: src/stored/spool.c:655 -msgid "Network error on BlastAttributes.\n" -msgstr "Error de red en BlastAttributes.\n" +#~ msgid "Spool data read error. Wanted %u bytes, got %d\n" +#~ msgstr "" +#~ "Error de lectura de datos de la cola. Esperaba %u bytes, obtuvo %d\n" -#: src/stored/spool.c:679 src/stored/spool.c:703 -#, c-format -msgid "Fseek on attributes file failed: ERR=%s\n" -msgstr "Fallo fseek en los atributos de archivo: ERR=%s\n" +#, fuzzy +#~ msgid "" +#~ "User specified Job spool size reached: JobSpoolSize=%s MaxJobSpoolSize=" +#~ "%s\n" +#~ msgstr "Tamaño de cola especificada por el usuario alcanzado.\n" -#: src/stored/spool.c:691 -#, fuzzy, c-format -msgid "Truncate on attributes file failed: ERR=%s\n" -msgstr "Fallo fseek en los atributos de archivo: ERR=%s\n" +#, fuzzy +#~ msgid "" +#~ "User specified Device spool size reached: DevSpoolSize=%s MaxDevSpoolSize=" +#~ "%s\n" +#~ msgstr "Tamaño de cola especificada por el usuario alcanzado.\n" -#: src/stored/spool.c:715 -#, c-format -msgid "Sending spooled attrs to the Director. Despooling %s bytes ...\n" -msgstr "Enviando attrs encolados al Director. Desencolando %s bytes ...\n" +#~ msgid "Bad return from despool in write_block.\n" +#~ msgstr "Malo retorno desde despool en write_block.\n" -#: src/stored/spool.c:741 -#, c-format -msgid "fopen attr spool file %s failed: ERR=%s\n" -msgstr "Fallo fopen en archivo %s de atributo de cola: ERR=%s\n" +#~ msgid "Spooling data again ...\n" +#~ msgstr "Encolando datos de nuevo ...\n" -#: src/stored/status.c:86 -msgid "Used Volume status:\n" -msgstr "Estado de Volumen Usados:\n" +#~ msgid "Error writing header to spool file. ERR=%s\n" +#~ msgstr "Error escribiendo encabezado para archivo de cola. ERR=%s\n" -#: src/stored/status.c:108 -msgid "" -"\n" -"SD Resources:\n" -msgstr "" +#~ msgid "" +#~ "Error writing header to spool file. Disk probably full. Attempting " +#~ "recovery. Wanted to write=%d got=%d\n" +#~ msgstr "" +#~ "Error al escribir encabezado al archivo de cola. Probablemente disco " +#~ "lleno. Intentando recuperación. Esperaba escribir=%d tiene=%d\n" -#: src/stored/status.c:144 -#, fuzzy, c-format -msgid "3900 missing args in .status command: %s\n" -msgstr "Comando .status malo: %s\n" +#~ msgid "Fatal despooling error." +#~ msgstr "Error fatal desencolando." -#: src/stored/status.c:149 -msgid "" -"\n" -"SD Shared Storage:\n" -msgstr "" +#~ msgid "Retrying after header spooling error failed.\n" +#~ msgstr "Fallido reintento después de error encolando encabezado.\n" -#: src/stored/status.c:294 -#, fuzzy, c-format -msgid "" -"\n" -"Device \"%s\" is not open or does not exist.\n" -msgstr "Dispositivo \"%s\" no está abierto o no existe.\n" +#~ msgid "Error writing data to spool file. ERR=%s\n" +#~ msgstr "Error escribiendo datos en archivo de cola. ERR=%s\n" -#: src/stored/status.c:303 -#, fuzzy, c-format -msgid "" -"\n" -"Device %s is %s %s:\n" -" Volume: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" -"Dispositivo %s está montado con:\n" -" Volumen: %s\n" -" Pool: %s\n" -" Tipo de Media: %s\n" +#~ msgid "Retrying after data spooling error failed.\n" +#~ msgstr "Fallido reintento después de error encolando dato.\n" -#: src/stored/status.c:308 -#, fuzzy -msgid "waiting for" -msgstr "Esperando por montaje" +#~ msgid "Network error on BlastAttributes.\n" +#~ msgstr "Error de red en BlastAttributes.\n" -#: src/stored/status.c:308 -msgid "mounted with" -msgstr "" +#~ msgid "Fseek on attributes file failed: ERR=%s\n" +#~ msgstr "Fallo fseek en los atributos de archivo: ERR=%s\n" -#: src/stored/status.c:310 #, fuzzy -msgid "*unknown*" -msgstr "desconocido" +#~ msgid "Truncate on attributes file failed: ERR=%s\n" +#~ msgstr "Fallo fseek en los atributos de archivo: ERR=%s\n" -#: src/stored/status.c:314 -#, fuzzy, c-format -msgid "" -"\n" -"Device %s: %s open but no Bacula volume is currently mounted.\n" -msgstr "Dispositivo %s abierto, pero volumen actual montado no es Bacula.\n" +#~ msgid "Sending spooled attrs to the Director. Despooling %s bytes ...\n" +#~ msgstr "Enviando attrs encolados al Director. Desencolando %s bytes ...\n" -#: src/stored/status.c:325 -#, c-format -msgid " Total Bytes=%s Blocks=%s Bytes/block=%s\n" -msgstr "Total de Bytes=%s Bloques=%s Bytes/bloques=%s\n" +#~ msgid "fopen attr spool file %s failed: ERR=%s\n" +#~ msgstr "Fallo fopen en archivo %s de atributo de cola: ERR=%s\n" -#: src/stored/status.c:340 -#, c-format -msgid " Total Bytes Read=%s Blocks Read=%s Bytes/block=%s\n" -msgstr "Total de Bytes Leídos=%s Bloques Leídos=%s Bytes/bloque=%s\n" +#~ msgid "Used Volume status:\n" +#~ msgstr "Estado de Volumen Usados:\n" -#: src/stored/status.c:346 -#, c-format -msgid " Positioned at File=%s Block=%s\n" -msgstr "Situado en el archivo=%s Bloque=%s\n" +#, fuzzy +#~ msgid "3900 missing args in .status command: %s\n" +#~ msgstr "Comando .status malo: %s\n" -#: src/stored/status.c:352 -#, fuzzy, c-format -msgid "" -"\n" -"Device %s: %s is not open.\n" -msgstr "Dispositivo %s no está abierto.\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Device \"%s\" is not open or does not exist.\n" +#~ msgstr "Dispositivo \"%s\" no está abierto o no existe.\n" -#: src/stored/status.c:366 -#, fuzzy, c-format -msgid " Available Space=%sB\n" -msgstr "Archivos examinados=%s\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Device %s is %s %s:\n" +#~ " Volume: %s\n" +#~ " Pool: %s\n" +#~ " Media type: %s\n" +#~ msgstr "" +#~ "Dispositivo %s está montado con:\n" +#~ " Volumen: %s\n" +#~ " Pool: %s\n" +#~ " Tipo de Media: %s\n" -#: src/stored/status.c:374 -#, c-format -msgid "" -" shstore=%d registered=%d locked=%d blockedbySD=%s\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "waiting for" +#~ msgstr "Esperando por montaje" -#: src/stored/status.c:425 -#, c-format -msgid "Autochanger \"%s\" with devices:\n" -msgstr "Auto-cambiador \"%s\" con los dispositivos:\n" +#, fuzzy +#~ msgid "*unknown*" +#~ msgstr "desconocido" -#: src/stored/status.c:449 -msgid "" -"\n" -"Device status:\n" -msgstr "" -"\n" -"Estado del dispositivo:\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Device %s: %s open but no Bacula volume is currently mounted.\n" +#~ msgstr "Dispositivo %s abierto, pero volumen actual montado no es Bacula.\n" -#: src/stored/status.c:506 -#, fuzzy, c-format -msgid "Daemon started %s. Jobs: run=%d, running=%d.\n" -msgstr "Demonio iniciado %s, %d Job ejecutando desde el inicio.\n" +#~ msgid " Total Bytes=%s Blocks=%s Bytes/block=%s\n" +#~ msgstr "Total de Bytes=%s Bloques=%s Bytes/bloques=%s\n" -#: src/stored/status.c:521 -#, c-format -msgid " Res: ndevices=%d nautochgr=%d\n" -msgstr "" +#~ msgid " Total Bytes Read=%s Blocks Read=%s Bytes/block=%s\n" +#~ msgstr "Total de Bytes Leídos=%s Bloques Leídos=%s Bytes/bloque=%s\n" -#: src/stored/status.c:534 -msgid "" -"No DEVICE structure.\n" -"\n" -msgstr "" -"Ninguna estructura del DISPOSITIVO.\n" -"\n" +#~ msgid " Positioned at File=%s Block=%s\n" +#~ msgstr "Situado en el archivo=%s Bloque=%s\n" -#: src/stored/status.c:540 -#, fuzzy, c-format -msgid " Device is BLOCKED by another SD=%s\n" -msgstr "Dispositivo está BLOQUEADO. Usuario desmontado.\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Device %s: %s is not open.\n" +#~ msgstr "Dispositivo %s no está abierto.\n" -#: src/stored/status.c:545 #, fuzzy -msgid " Device is disabled. User command.\n" -msgstr "Dispositivo está BLOQUEADO. Usuario desmontado.\n" +#~ msgid " Available Space=%sB\n" +#~ msgstr "Archivos examinados=%s\n" -#: src/stored/status.c:550 -msgid " Device is BLOCKED. User unmounted.\n" -msgstr "Dispositivo está BLOQUEADO. Usuario desmontado.\n" +#~ msgid "Autochanger \"%s\" with devices:\n" +#~ msgstr "Auto-cambiador \"%s\" con los dispositivos:\n" -#: src/stored/status.c:554 -msgid " Device is BLOCKED. User unmounted during wait for media/mount.\n" -msgstr "" -" Dispositivo está BLOQUEADO. Usuario desmontado durante espera por media/" -"mount.\n" +#~ msgid "" +#~ "\n" +#~ "Device status:\n" +#~ msgstr "" +#~ "\n" +#~ "Estado del dispositivo:\n" -#: src/stored/status.c:565 -#, c-format -msgid "" -" Device is BLOCKED waiting for mount of volume \"%s\",\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" -"Dispositivo está BLOQUEADO esperando por montaje de volumen \"%s\",\n" -" Pool: %s\n" -" Tipo de Media: %s\n" +#, fuzzy +#~ msgid "Daemon started %s. Jobs: run=%d, running=%d.\n" +#~ msgstr "Demonio iniciado %s, %d Job ejecutando desde el inicio.\n" -#: src/stored/status.c:574 -#, c-format -msgid "" -" Device is BLOCKED waiting to create a volume for:\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" -"Dispositivo está BLOQUEADO esperando para crear un volumen para:\n" -" Pool: %s\n" -" Tipo de Media: %s\n" +#~ msgid "" +#~ "No DEVICE structure.\n" +#~ "\n" +#~ msgstr "" +#~ "Ninguna estructura del DISPOSITIVO.\n" +#~ "\n" -#: src/stored/status.c:586 -msgid " Device is BLOCKED waiting for media.\n" -msgstr "Dispositivo está bloqueado esperando por medios.\n" +#, fuzzy +#~ msgid " Device is BLOCKED by another SD=%s\n" +#~ msgstr "Dispositivo está BLOQUEADO. Usuario desmontado.\n" -#: src/stored/status.c:592 -msgid " Device is being initialized.\n" -msgstr "Dispositivo se está inicializando.\n" +#, fuzzy +#~ msgid " Device is disabled. User command.\n" +#~ msgstr "Dispositivo está BLOQUEADO. Usuario desmontado.\n" -#: src/stored/status.c:596 -msgid " Device is blocked labeling a Volume.\n" -msgstr "El dispositivo está bloqueado etiquetando un volumen.\n" +#~ msgid " Device is BLOCKED. User unmounted.\n" +#~ msgstr "Dispositivo está BLOQUEADO. Usuario desmontado.\n" -#: src/stored/status.c:605 -#, fuzzy, c-format -msgid " Slot %d %s loaded in drive %d.\n" -msgstr "Ranura %d esta cargado en la unidad %d.\n" +#~ msgid " Device is BLOCKED. User unmounted during wait for media/mount.\n" +#~ msgstr "" +#~ " Dispositivo está BLOQUEADO. Usuario desmontado durante espera por " +#~ "media/mount.\n" -#: src/stored/status.c:609 -#, c-format -msgid " Drive %d is not loaded.\n" -msgstr "Unidad %d no está cargada.\n" +#~ msgid "" +#~ " Device is BLOCKED waiting for mount of volume \"%s\",\n" +#~ " Pool: %s\n" +#~ " Media type: %s\n" +#~ msgstr "" +#~ "Dispositivo está BLOQUEADO esperando por montaje de volumen \"%s\",\n" +#~ " Pool: %s\n" +#~ " Tipo de Media: %s\n" + +#~ msgid "" +#~ " Device is BLOCKED waiting to create a volume for:\n" +#~ " Pool: %s\n" +#~ " Media type: %s\n" +#~ msgstr "" +#~ "Dispositivo está BLOQUEADO esperando para crear un volumen para:\n" +#~ " Pool: %s\n" +#~ " Tipo de Media: %s\n" -#: src/stored/status.c:644 -msgid "Device state:\n" -msgstr "Estado del dispositivo:\n" +#~ msgid " Device is BLOCKED waiting for media.\n" +#~ msgstr "Dispositivo está bloqueado esperando por medios.\n" -#: src/stored/status.c:660 -#, fuzzy, c-format -msgid " num_writers=%d reserves=%d block=%d enabled=%d\n" -msgstr "" -"num_writers=%d reservado=%d bloque=%d\n" -"\n" +#~ msgid " Device is being initialized.\n" +#~ msgstr "Dispositivo se está inicializando.\n" + +#~ msgid " Device is blocked labeling a Volume.\n" +#~ msgstr "El dispositivo está bloqueado etiquetando un volumen.\n" -#: src/stored/status.c:664 #, fuzzy -msgid "Attached JobIds: " -msgstr "" -"\n" -"Scheduled Jobs:\n" +#~ msgid " Slot %d %s loaded in drive %d.\n" +#~ msgstr "Ranura %d esta cargado en la unidad %d.\n" -#: src/stored/status.c:684 -#, fuzzy, c-format -msgid " Archive name: %s Device name: %s\n" -msgstr "Nombre del archivo: %s Nombre del dispositivo: %s\n" +#~ msgid " Drive %d is not loaded.\n" +#~ msgstr "Unidad %d no está cargada.\n" -#: src/stored/status.c:687 -#, fuzzy, c-format -msgid " File=%u block=%u\n" -msgstr "Archivo=%u bloque=%u\n" +#~ msgid "Device state:\n" +#~ msgstr "Estado del dispositivo:\n" -#: src/stored/status.c:689 -#, fuzzy, c-format -msgid " Min block=%u Max block=%u\n" -msgstr "Bloque Min=%u Bloque Max=%u\n" +#, fuzzy +#~ msgid " num_writers=%d reserves=%d block=%d enabled=%d\n" +#~ msgstr "" +#~ "num_writers=%d reservado=%d bloque=%d\n" +#~ "\n" -#: src/stored/status.c:821 -#, c-format -msgid "%s Job %s waiting for Client connection.\n" -msgstr "%s Job %s esperando por conexión de cliente.\n" +#, fuzzy +#~ msgid "Attached JobIds: " +#~ msgstr "" +#~ "\n" +#~ "Scheduled Jobs:\n" -#: src/stored/status.c:837 -#, c-format -msgid "" -"Reading: %s %s job %s JobId=%d Volume=\"%s\"\n" -" pool=\"%s\" device=%s\n" -msgstr "" -"Leyendo: %s %s trabajo %s JobId=%d Volumen=\"%s\"\n" -" pool=\"%s\" dispositivo=%s\n" +#, fuzzy +#~ msgid " Archive name: %s Device name: %s\n" +#~ msgstr "Nombre del archivo: %s Nombre del dispositivo: %s\n" -#: src/stored/status.c:850 -#, c-format -msgid "" -"Writing: %s %s job %s JobId=%d Volume=\"%s\"\n" -" pool=\"%s\" device=%s\n" -msgstr "" -"Escribiendo: %s %s trabajo %s JobId=%d Volumen=\"%s\"\n" -" pool=\"%s\" dispositivo=%s\n" +#, fuzzy +#~ msgid " File=%u block=%u\n" +#~ msgstr "Archivo=%u bloque=%u\n" -#: src/stored/status.c:861 -#, c-format -msgid " spooling=%d despooling=%d despool_wait=%d\n" -msgstr "encolando=%d desencolando=%d despool_wait=%d\n" +#, fuzzy +#~ msgid " Min block=%u Max block=%u\n" +#~ msgstr "Bloque Min=%u Bloque Max=%u\n" -#: src/stored/status.c:885 -#, fuzzy, c-format -msgid " Files=%s Bytes=%s AveBytes/sec=%s LastBytes/sec=%s\n" -msgstr "Archivos=%s Bytes=%s Bytes/sec=%s\n" +#~ msgid "%s Job %s waiting for Client connection.\n" +#~ msgstr "%s Job %s esperando por conexión de cliente.\n" -#: src/stored/status.c:900 -#, c-format -msgid " FDReadSeqNo=%s in_msg=%u out_msg=%d fd=%d\n" -msgstr " FDReadSeqNo=%s in_msg=%u out_msg=%d fd=%d\n" +#~ msgid "" +#~ "Reading: %s %s job %s JobId=%d Volume=\"%s\"\n" +#~ " pool=\"%s\" device=%s\n" +#~ msgstr "" +#~ "Leyendo: %s %s trabajo %s JobId=%d Volumen=\"%s\"\n" +#~ " pool=\"%s\" dispositivo=%s\n" -#: src/stored/status.c:906 -msgid " FDSocket closed\n" -msgstr "FDSocket cerrado\n" +#~ msgid "" +#~ "Writing: %s %s job %s JobId=%d Volume=\"%s\"\n" +#~ " pool=\"%s\" device=%s\n" +#~ msgstr "" +#~ "Escribiendo: %s %s trabajo %s JobId=%d Volumen=\"%s\"\n" +#~ " pool=\"%s\" dispositivo=%s\n" -#: src/stored/status.c:927 -msgid "" -"\n" -"Jobs waiting to reserve a drive:\n" -msgstr "" -"\n" -"Jobs esperando para reservar una unidad:\n" +#~ msgid " spooling=%d despooling=%d despool_wait=%d\n" +#~ msgstr "encolando=%d desencolando=%d despool_wait=%d\n" -#: src/stored/status.c:1007 -#, fuzzy, c-format -msgid "3900 No arg in .status command: %s\n" -msgstr "Comando .status malo: %s\n" +#, fuzzy +#~ msgid " Files=%s Bytes=%s AveBytes/sec=%s LastBytes/sec=%s\n" +#~ msgstr "Archivos=%s Bytes=%s Bytes/sec=%s\n" -#: src/stored/status.c:1076 -msgid "3900 dedupengine is disabled: not compiled in this version.\n" -msgstr "" +#~ msgid " FDReadSeqNo=%s in_msg=%u out_msg=%d fd=%d\n" +#~ msgstr " FDReadSeqNo=%s in_msg=%u out_msg=%d fd=%d\n" -#: src/stored/status.c:1089 -#, fuzzy, c-format -msgid "3900 Unknown arg in .status command: %s\n" -msgstr "Comando .status malo: %s\n" +#~ msgid " FDSocket closed\n" +#~ msgstr "FDSocket cerrado\n" -#: src/stored/stored.c:79 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bacula-sd [options] [-c config_file] [config_file]\n" -" -c use as configuration file\n" -" -d [,] set debug level to , debug tags to \n" -" -dt print timestamp in debug output\n" -" -f run in foreground (for debugging)\n" -" -g set groupid to group\n" -" -m print kaboom output (for debugging)\n" -" -p proceed despite I/O errors\n" -" -s no signals (for debugging)\n" -" -t test - read config and exit\n" -" -u userid to \n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Versión: %s (%s)\n" -"\n" -"Utilice: stored [opciones] [-c archivo_configuración] " -"[archivo_configuración]\n" -" -c usar como archivo de configuración\n" -" -d establecer el nivel de depuración para \n" -" -dt imprimir timestamp en salida de depuración\n" -" -f ejecutar en primer plano (para depuración)\n" -" -g establecer groupid para grupo\n" -" -m imprimir salida kaboom para depuración)\n" -" -p continuar a pesar de errores de E/S\n" -" -s sin señales (para depuración)\n" -" -t prueba - leer la configuración y salir\n" -" -u establecer userid para \n" -" -v mensajes de usuario detallados\n" -" -? imprimir este mensaje.\n" -"\n" +#~ msgid "" +#~ "\n" +#~ "Jobs waiting to reserve a drive:\n" +#~ msgstr "" +#~ "\n" +#~ "Jobs esperando para reservar una unidad:\n" -#: src/stored/stored.c:273 -msgid "Volume Session Time is ZERO!\n" -msgstr "Tiempo de Sesión de Volumen es CERO!\n" +#, fuzzy +#~ msgid "3900 No arg in .status command: %s\n" +#~ msgstr "Comando .status malo: %s\n" -#: src/stored/stored.c:282 -#, c-format -msgid "Unable to create thread. ERR=%s\n" -msgstr "No se puede crear hilo. ERR=%s\n" +#, fuzzy +#~ msgid "3900 Unknown arg in .status command: %s\n" +#~ msgstr "Comando .status malo: %s\n" -#: src/stored/stored.c:592 -#, fuzzy, c-format -msgid "Unable to stat ControlDevice %s: ERR=%s\n" -msgstr "No se puede stat dispositivo %s: ERR=%s\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bacula-sd [options] [-c config_file] [config_file]\n" +#~ " -c use as configuration file\n" +#~ " -d [,] set debug level to , debug tags to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -f run in foreground (for debugging)\n" +#~ " -g set groupid to group\n" +#~ " -m print kaboom output (for debugging)\n" +#~ " -p proceed despite I/O errors\n" +#~ " -s no signals (for debugging)\n" +#~ " -t test - read config and exit\n" +#~ " -u userid to \n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Versión: %s (%s)\n" +#~ "\n" +#~ "Utilice: stored [opciones] [-c archivo_configuración] " +#~ "[archivo_configuración]\n" +#~ " -c usar como archivo de configuración\n" +#~ " -d establecer el nivel de depuración para \n" +#~ " -dt imprimir timestamp en salida de depuración\n" +#~ " -f ejecutar en primer plano (para depuración)\n" +#~ " -g establecer groupid para grupo\n" +#~ " -m imprimir salida kaboom para depuración)\n" +#~ " -p continuar a pesar de errores de E/S\n" +#~ " -s sin señales (para depuración)\n" +#~ " -t prueba - leer la configuración y salir\n" +#~ " -u establecer userid para \n" +#~ " -v mensajes de usuario detallados\n" +#~ " -? imprimir este mensaje.\n" +#~ "\n" -#: src/stored/stored.c:598 -msgid "No plugin directory configured for SAN shared storage\n" -msgstr "" +#~ msgid "Volume Session Time is ZERO!\n" +#~ msgstr "Tiempo de Sesión de Volumen es CERO!\n" -#: src/stored/stored.c:619 -#, c-format -msgid "Could not open device %s\n" -msgstr "No se pudo abrir el dispositivo %s\n" +#~ msgid "Unable to create thread. ERR=%s\n" +#~ msgstr "No se puede crear hilo. ERR=%s\n" -#: src/stored/stored.c:637 -#, c-format -msgid "Could not mount device %s\n" -msgstr "No se pudo montar el dispositivo %s\n" +#, fuzzy +#~ msgid "Unable to stat ControlDevice %s: ERR=%s\n" +#~ msgstr "No se puede stat dispositivo %s: ERR=%s\n" -#: src/stored/stored_conf.c:237 -#, c-format -msgid "Expected a Device Type keyword, got: %s" -msgstr "Esperaba una palabra clave Tipo Device, obtuvo: %s" +#~ msgid "Could not open device %s\n" +#~ msgstr "No se pudo abrir el dispositivo %s\n" -#: src/stored/stored_conf.c:251 -#, c-format -msgid "" -"Maximum Block Size configured value %u is greater than allowed maximum: %u" -msgstr "" -"Valor máximo de tamaño bloque configurado %u es mayor de lo máximo " -"permitido: %u" +#~ msgid "Could not mount device %s\n" +#~ msgstr "No se pudo montar el dispositivo %s\n" -#: src/stored/stored_conf.c:264 -#, c-format -msgid "Warning: no \"%s\" resource (%d) defined.\n" -msgstr "Advertencia: Recurso \"%s\" (%d) no definido.\n" +#~ msgid "Expected a Device Type keyword, got: %s" +#~ msgstr "Esperaba una palabra clave Tipo Device, obtuvo: %s" -#: src/stored/stored_conf.c:267 -#, c-format -msgid "dump_resource type=%d\n" -msgstr "dump_resource tipo=%d\n" +#~ msgid "" +#~ "Maximum Block Size configured value %u is greater than allowed maximum: %u" +#~ msgstr "" +#~ "Valor máximo de tamaño bloque configurado %u es mayor de lo máximo " +#~ "permitido: %u" -#: src/stored/stored_conf.c:391 -#, c-format -msgid "Warning: unknown resource type %d\n" -msgstr "Advertencia: Tipo de recurso %d desconocido\n" +#~ msgid "Warning: no \"%s\" resource (%d) defined.\n" +#~ msgstr "Advertencia: Recurso \"%s\" (%d) no definido.\n" -#: src/stored/stored_conf.c:601 -#, c-format -msgid "\"%s\" item is required in \"%s\" resource, but not found.\n" -msgstr "ítem \"%s\" es necesario en recurso \"%s\", pero no se encuentra.\n" +#~ msgid "dump_resource type=%d\n" +#~ msgstr "dump_resource tipo=%d\n" -#: src/stored/stored_conf.c:607 -#, c-format -msgid "Too many items in \"%s\" resource\n" -msgstr "Demasiados elementos en recursos \"%s\"\n" +#~ msgid "Warning: unknown resource type %d\n" +#~ msgstr "Advertencia: Tipo de recurso %d desconocido\n" -#: src/stored/stored_conf.c:641 -#, c-format -msgid "Cannot find AutoChanger resource %s\n" -msgstr "No puede encontrar recurso Auto-cambiador %s\n" +#~ msgid "\"%s\" item is required in \"%s\" resource, but not found.\n" +#~ msgstr "ítem \"%s\" es necesario en recurso \"%s\", pero no se encuentra.\n" -#: src/stored/stored_conf.c:657 -#, fuzzy, c-format -msgid "Unable to init lock: ERR=%s\n" -msgstr "No se puede iniciar mutex: ERR=%s\n" +#~ msgid "Too many items in \"%s\" resource\n" +#~ msgstr "Demasiados elementos en recursos \"%s\"\n" -#: src/stored/tape_dev.c:227 -#, c-format -msgid "No tape loaded or drive offline on %s.\n" -msgstr "Ninguna cinta cargada o unidad offline en %s.\n" +#~ msgid "Cannot find AutoChanger resource %s\n" +#~ msgstr "No puede encontrar recurso Auto-cambiador %s\n" -#: src/stored/tape_dev.c:237 -#, c-format -msgid "Rewind error on %s. ERR=%s.\n" -msgstr "Rebobinar error en %s. ERR=%s.\n" +#, fuzzy +#~ msgid "Unable to init lock: ERR=%s\n" +#~ msgstr "No se puede iniciar mutex: ERR=%s\n" -#: src/stored/tape_dev.c:262 -#, c-format -msgid "Bad call to eod. Device %s not open\n" -msgstr "Mala llamada para eod. Dispositivo %s no abierto\n" +#~ msgid "No tape loaded or drive offline on %s.\n" +#~ msgstr "Ninguna cinta cargada o unidad offline en %s.\n" -#: src/stored/tape_dev.c:334 -#, c-format -msgid "ioctl MTEOM error on %s. ERR=%s.\n" -msgstr "ioctl MTEOM error en %s. ERR=%s.\n" +#~ msgid "Rewind error on %s. ERR=%s.\n" +#~ msgstr "Rebobinar error en %s. ERR=%s.\n" -#: src/stored/tape_dev.c:429 -msgid "Bad call to load_dev. Device not open\n" -msgstr "Mala llamada a load_dev. Dispositivo no abierto\n" +#~ msgid "Bad call to eod. Device %s not open\n" +#~ msgstr "Mala llamada para eod. Dispositivo %s no abierto\n" -#: src/stored/tape_dev.c:440 src/stored/tape_dev.c:453 -#, c-format -msgid "ioctl MTLOAD error on %s. ERR=%s.\n" -msgstr "ioctl MTLOAD error en %s. ERR=%s.\n" +#~ msgid "ioctl MTEOM error on %s. ERR=%s.\n" +#~ msgstr "ioctl MTEOM error en %s. ERR=%s.\n" -#: src/stored/tape_dev.c:484 -#, c-format -msgid "ioctl MTOFFL error on %s. ERR=%s.\n" -msgstr "ioctl MTOFFL error en %s. ERR=%s.\n" +#~ msgid "Bad call to load_dev. Device not open\n" +#~ msgstr "Mala llamada a load_dev. Dispositivo no abierto\n" -#: src/stored/tape_dev.c:525 -msgid "Bad call to fsf. Device not open\n" -msgstr "Mala llamada a fsf. Dispositivo no abierto\n" +#~ msgid "ioctl MTLOAD error on %s. ERR=%s.\n" +#~ msgstr "ioctl MTLOAD error en %s. ERR=%s.\n" -#: src/stored/tape_dev.c:536 src/stored/tape_dev.c:663 -#, c-format -msgid "Device %s at End of Tape.\n" -msgstr "Dispositivo %s en el final de la cinta.\n" +#~ msgid "ioctl MTOFFL error on %s. ERR=%s.\n" +#~ msgstr "ioctl MTOFFL error en %s. ERR=%s.\n" -#: src/stored/tape_dev.c:567 src/stored/tape_dev.c:643 -#, c-format -msgid "ioctl MTFSF error on %s. ERR=%s.\n" -msgstr "ioctl MTFSF error en %s. ERR=%s.\n" +#~ msgid "Bad call to fsf. Device not open\n" +#~ msgstr "Mala llamada a fsf. Dispositivo no abierto\n" -#: src/stored/tape_dev.c:692 -msgid "Bad call to bsf. Device not open\n" -msgstr "Mala llamada a bsf. Dispositivo no abierto\n" +#~ msgid "Device %s at End of Tape.\n" +#~ msgstr "Dispositivo %s en el final de la cinta.\n" -#: src/stored/tape_dev.c:698 -#, c-format -msgid "Device %s cannot BSF because it is not a tape.\n" -msgstr "Dispositivo %s no puede BSF, porque no es una cinta.\n" +#~ msgid "ioctl MTFSF error on %s. ERR=%s.\n" +#~ msgstr "ioctl MTFSF error en %s. ERR=%s.\n" -#: src/stored/tape_dev.c:715 -#, c-format -msgid "ioctl MTBSF error on %s. ERR=%s.\n" -msgstr "ioctl MTBSF error en %s. ERR=%s.\n" +#~ msgid "Bad call to bsf. Device not open\n" +#~ msgstr "Mala llamada a bsf. Dispositivo no abierto\n" -#: src/stored/tape_dev.c:734 -msgid "Bad call to fsr. Device not open\n" -msgstr "Mala llamada a FSR. El dispositivo no abre\n" +#~ msgid "Device %s cannot BSF because it is not a tape.\n" +#~ msgstr "Dispositivo %s no puede BSF, porque no es una cinta.\n" -#: src/stored/tape_dev.c:744 -#, c-format -msgid "ioctl MTFSR not permitted on %s.\n" -msgstr "ioctl MTFSR no permitido en %s.\n" +#~ msgid "ioctl MTBSF error on %s. ERR=%s.\n" +#~ msgstr "ioctl MTBSF error en %s. ERR=%s.\n" -#: src/stored/tape_dev.c:772 -#, c-format -msgid "ioctl MTFSR %d error on %s. ERR=%s.\n" -msgstr "ioctl MTFSR %d error en %s. ERR=%s.\n" +#~ msgid "Bad call to fsr. Device not open\n" +#~ msgstr "Mala llamada a FSR. El dispositivo no abre\n" -#: src/stored/tape_dev.c:790 -msgid "Bad call to bsr_dev. Device not open\n" -msgstr "Mala llamada a bsr_dev. El dispositivo no abre\n" +#~ msgid "ioctl MTFSR not permitted on %s.\n" +#~ msgstr "ioctl MTFSR no permitido en %s.\n" -#: src/stored/tape_dev.c:800 -#, c-format -msgid "ioctl MTBSR not permitted on %s.\n" -msgstr "ioctl MTBSR no permitido en %s.\n" +#~ msgid "ioctl MTFSR %d error on %s. ERR=%s.\n" +#~ msgstr "ioctl MTFSR %d error en %s. ERR=%s.\n" -#: src/stored/tape_dev.c:814 -#, c-format -msgid "ioctl MTBSR error on %s. ERR=%s.\n" -msgstr "ioctl MTBSR error en %s. ERR=%s.\n" +#~ msgid "Bad call to bsr_dev. Device not open\n" +#~ msgstr "Mala llamada a bsr_dev. El dispositivo no abre\n" -#: src/stored/tape_dev.c:920 -msgid "Bad call to weof_dev. Device not open\n" -msgstr "Mala llamada a weof_dev. El dispositivo no abre\n" +#~ msgid "ioctl MTBSR not permitted on %s.\n" +#~ msgstr "ioctl MTBSR no permitido en %s.\n" -#: src/stored/tape_dev.c:930 -msgid "Attempt to WEOF on non-appendable Volume\n" -msgstr "Intento de WEOF en Volumen no-appendable\n" +#~ msgid "ioctl MTBSR error on %s. ERR=%s.\n" +#~ msgstr "ioctl MTBSR error en %s. ERR=%s.\n" -#: src/stored/tape_dev.c:948 -#, c-format -msgid "ioctl MTWEOF error on %s. ERR=%s.\n" -msgstr "ioctl MTWEOF error en %s. ERR=%s.\n" +#~ msgid "Bad call to weof_dev. Device not open\n" +#~ msgstr "Mala llamada a weof_dev. El dispositivo no abre\n" -#: src/stored/vbackup.c:68 -msgid "Read and write devices not properly initialized.\n" -msgstr "" -"Dispositivos de lectura y escritura no se han iniciado correctamente.\n" +#~ msgid "Attempt to WEOF on non-appendable Volume\n" +#~ msgstr "Intento de WEOF en Volumen no-appendable\n" -#: src/stored/vbackup.c:74 -#, c-format -msgid "No Volume names found for %s.\n" -msgstr "Nombres de Volúmenes no encontrados para %s.\n" +#~ msgid "ioctl MTWEOF error on %s. ERR=%s.\n" +#~ msgstr "ioctl MTWEOF error en %s. ERR=%s.\n" -#: src/stored/vol_mgr.c:81 -#, c-format -msgid "Unable to initialize volume list lock. ERR=%s\n" -msgstr "No se puede inicializar la lista de bloqueo de volumen. ERR=%s\n" +#~ msgid "Read and write devices not properly initialized.\n" +#~ msgstr "" +#~ "Dispositivos de lectura y escritura no se han iniciado correctamente.\n" -#: src/stored/vol_mgr.c:371 -#, fuzzy, c-format -msgid "Could not reserve volume \"%s\", because job canceled.\n" -msgstr "No es posible reservar volumen %s en %s\n" +#~ msgid "No Volume names found for %s.\n" +#~ msgstr "Nombres de Volúmenes no encontrados para %s.\n" -#: src/stored/vol_mgr.c:382 -#, fuzzy, c-format -msgid "Could not reserve volume \"%s\" for append, because it will be read.\n" -msgstr "No es posible reservar volumen %s en %s\n" +#~ msgid "Unable to initialize volume list lock. ERR=%s\n" +#~ msgstr "No se puede inicializar la lista de bloqueo de volumen. ERR=%s\n" -#: src/stored/vol_mgr.c:415 -#, fuzzy, c-format -msgid "Cannot free Volume \"%s\", because it is reserved by someone else.\n" -msgstr "No se puede podar Volumen \"%s\", porque el esta archivo.\n" +#, fuzzy +#~ msgid "Could not reserve volume \"%s\", because job canceled.\n" +#~ msgstr "No es posible reservar volumen %s en %s\n" -#: src/stored/vol_mgr.c:516 -#, c-format -msgid "Volume %s is busy swapping from %s to %s\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Could not reserve volume \"%s\" for append, because it will be read.\n" +#~ msgstr "No es posible reservar volumen %s en %s\n" -#: src/stored/vol_mgr.c:519 src/stored/vol_mgr.c:526 -#, fuzzy, c-format -msgid "Volume %s is busy swapping.\n" -msgstr "3936 Dispositivo %s está ocupado leyendo.\n" +#, fuzzy +#~ msgid "Cannot free Volume \"%s\", because it is reserved by someone else.\n" +#~ msgstr "No se puede podar Volumen \"%s\", porque el esta archivo.\n" -#: src/stored/vol_mgr.c:523 -#, fuzzy, c-format -msgid "%s device %s is busy.\n" -msgstr "3936 Dispositivo %s está ocupado leyendo.\n" +#, fuzzy +#~ msgid "Volume %s is busy swapping.\n" +#~ msgstr "3936 Dispositivo %s está ocupado leyendo.\n" -#: src/stored/wait.c:122 -#, c-format -msgid "pthread timedwait error. ERR=%s\n" -msgstr "error timedwait pthread. ERR=%s\n" +#, fuzzy +#~ msgid "%s device %s is busy.\n" +#~ msgstr "3936 Dispositivo %s está ocupado leyendo.\n" -#: src/stored/wait.c:228 -#, c-format -msgid "JobId=%s, Job %s waiting to reserve a device.\n" -msgstr "JobId=%s, Job %s esperando para reservar un dispositivo.\n" +#~ msgid "pthread timedwait error. ERR=%s\n" +#~ msgstr "error timedwait pthread. ERR=%s\n" -#: src/stored/wait.c:274 -#, fuzzy, c-format -msgid "JobId=%s, Job %s waiting device %s.\n" -msgstr "JobId=%s, Job %s esperando para reservar un dispositivo.\n" +#~ msgid "JobId=%s, Job %s waiting to reserve a device.\n" +#~ msgstr "JobId=%s, Job %s esperando para reservar un dispositivo.\n" -#: src/tools/bbatch.c:65 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"Example : bbatch -w /path/to/workdir -h localhost -f dat1 -f dat -f datx\n" -" will start 3 thread and load dat1, dat and datx in your catalog\n" -"See bbatch.c to generate datafile\n" -"\n" -"Usage: bbatch [ options ] -w working/dir -f datafile\n" -" -b with batch mode\n" -" -B without batch mode\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database host (default NULL)\n" -" -w specify working directory\n" -" -r call restore code with given jobids\n" -" -v verbose\n" -" -f specify data file\n" -" -? print this message\n" -"\n" -msgstr "" -"\n" -"Versión: %s (%s)\n" -"Ejemplo : bbatch -w /ruta/para/directorio/trabajo -h localhost -f dat1 -f " -"dat -f datx\n" -" inicializará 3 hilos y cargará dat1, dat y datx en su catalogo\n" -"Vea bbatch.c para generar archivos de datos\n" -"\n" -"Utilice: bbatch [opciones] -w directorio/trabajo -f archivo_de_datos\n" -" -d establece nivel de depuración para \n" -" -dt imprime timestamp en salida de depuración\n" -" -n especifica el nombre de la base de datos (por defecto bacula)\n" -" -u especifica el nombre de usuario de la base de datos (por " -"defecto bacula)\n" -" -P especifica la contraseña de la base de datos (por defecto " -"none)\n" -" -h especifica servidor de la base de datos (por defecto NULL)\n" -" -w especifica el directorio de trabajo\n" -" -v detallado\n" -" -f especifica archivo de datos\n" -" -? imprime esta mensaje\n" -"\n" +#, fuzzy +#~ msgid "JobId=%s, Job %s waiting device %s.\n" +#~ msgstr "JobId=%s, Job %s esperando para reservar un dispositivo.\n" -#: src/tools/bbatch.c:187 src/tools/bbatch.c:236 src/tools/bvfs_test.c:203 -msgid "Could not init Bacula database\n" -msgstr "No se pudo iniciar base de datos de Bacula\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "Example : bbatch -w /path/to/workdir -h localhost -f dat1 -f dat -f datx\n" +#~ " will start 3 thread and load dat1, dat and datx in your catalog\n" +#~ "See bbatch.c to generate datafile\n" +#~ "\n" +#~ "Usage: bbatch [ options ] -w working/dir -f datafile\n" +#~ " -b with batch mode\n" +#~ " -B without batch mode\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -n specify the database name (default bacula)\n" +#~ " -u specify database user name (default bacula)\n" +#~ " -P specify database host (default NULL)\n" +#~ " -w specify working directory\n" +#~ " -r call restore code with given jobids\n" +#~ " -v verbose\n" +#~ " -f specify data file\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Versión: %s (%s)\n" +#~ "Ejemplo : bbatch -w /ruta/para/directorio/trabajo -h localhost -f dat1 -f " +#~ "dat -f datx\n" +#~ " inicializará 3 hilos y cargará dat1, dat y datx en su catalogo\n" +#~ "Vea bbatch.c para generar archivos de datos\n" +#~ "\n" +#~ "Utilice: bbatch [opciones] -w directorio/trabajo -f archivo_de_datos\n" +#~ " -d establece nivel de depuración para \n" +#~ " -dt imprime timestamp en salida de depuración\n" +#~ " -n especifica el nombre de la base de datos (por defecto " +#~ "bacula)\n" +#~ " -u especifica el nombre de usuario de la base de datos (por " +#~ "defecto bacula)\n" +#~ " -P especifica la contraseña de la base de datos (por " +#~ "defecto none)\n" +#~ " -h especifica servidor de la base de datos (por defecto " +#~ "NULL)\n" +#~ " -w especifica el directorio de trabajo\n" +#~ " -v detallado\n" +#~ " -f especifica archivo de datos\n" +#~ " -? imprime esta mensaje\n" +#~ "\n" -#: src/tools/bbatch.c:197 -#, c-format -msgid "Computing file list for jobid=%s files=%lld secs=%d\n" -msgstr "" +#~ msgid "Could not init Bacula database\n" +#~ msgstr "No se pudo iniciar base de datos de Bacula\n" -#: src/tools/bbatch.c:301 -#, c-format -msgid "Error opening datafile %s\n" -msgstr "Error abriendo archivo de datos %s\n" +#~ msgid "Error opening datafile %s\n" +#~ msgstr "Error abriendo archivo de datos %s\n" -#: src/tools/bbatch.c:311 -msgid "Error while inserting file\n" -msgstr "Error insertando el archivo\n" +#~ msgid "Error while inserting file\n" +#~ msgstr "Error insertando el archivo\n" -#: src/tools/bregex.c:142 src/tools/bregtest.c:126 src/tools/bwild.c:111 -#, c-format -msgid "Could not open data file: %s\n" -msgstr "No se pudo abrir el archivo de datos: %s\n" +#~ msgid "Could not open data file: %s\n" +#~ msgstr "No se pudo abrir el archivo de datos: %s\n" -#: src/tools/bsmtp.c:119 -#, c-format -msgid "Fatal malformed reply from %s: %s\n" -msgstr "Fatal malformación de respuesta desde %s: %s\n" +#~ msgid "Fatal malformed reply from %s: %s\n" +#~ msgstr "Fatal malformación de respuesta desde %s: %s\n" -#: src/tools/bsmtp.c:127 -#, c-format -msgid "Fatal fgets error: ERR=%s\n" -msgstr "fgets fatal error: ERR=%s\n" +#~ msgid "Fatal fgets error: ERR=%s\n" +#~ msgstr "fgets fatal error: ERR=%s\n" -#: src/tools/bsmtp.c:163 -#, fuzzy, c-format -msgid "" -"\n" -"Usage: %s [-f from] [-h mailhost] [-s subject] [-c copy] [recipient ...]\n" -" -4 forces bsmtp to use IPv4 addresses only.\n" -" -6 forces bsmtp to use IPv6 addresses only.\n" -" -8 set charset to UTF-8\n" -" -a use any ip protocol for address resolution\n" -" -c set the Cc: field\n" -" -d set debug level to \n" -" -dt print a timestamp in debug output\n" -" -f set the From: field\n" -" -h use mailhost:port as the SMTP server\n" -" -s set the Subject: field\n" -" -r set the Reply-To: field\n" -" -l set the maximum number of lines to send (default: " -"unlimited)\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Utilice: %s [-f desde] [-h servidor de correo] [-s asunto] [-c con copia] " -"[destinatario ...]\n" -" -8 conjunto charset a UTF-8\n" -" -c establece el campo Cc:\n" -" -d establece el nivel de depuración para \n" -" -dt imprime un timestamp en salida de depuración\n" -" -f establece el campo Desde:\n" -" -h use servidor de correo:puerto como servidor SMTP\n" -" -s establece el campo Asunto:\n" -" -r establece el campo Responder-Para:\n" -" -l establece el número máximo de líneas a enviar (por defecto: sin límite)\n" -" -? imprimir este mensaje.\n" -"\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Usage: %s [-f from] [-h mailhost] [-s subject] [-c copy] [recipient ...]\n" +#~ " -4 forces bsmtp to use IPv4 addresses only.\n" +#~ " -6 forces bsmtp to use IPv6 addresses only.\n" +#~ " -8 set charset to UTF-8\n" +#~ " -a use any ip protocol for address resolution\n" +#~ " -c set the Cc: field\n" +#~ " -d set debug level to \n" +#~ " -dt print a timestamp in debug output\n" +#~ " -f set the From: field\n" +#~ " -h use mailhost:port as the SMTP server\n" +#~ " -s set the Subject: field\n" +#~ " -r set the Reply-To: field\n" +#~ " -l set the maximum number of lines to send (default: " +#~ "unlimited)\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Utilice: %s [-f desde] [-h servidor de correo] [-s asunto] [-c con copia] " +#~ "[destinatario ...]\n" +#~ " -8 conjunto charset a UTF-8\n" +#~ " -c establece el campo Cc:\n" +#~ " -d establece el nivel de depuración para \n" +#~ " -dt imprime un timestamp en salida de depuración\n" +#~ " -f establece el campo Desde:\n" +#~ " -h use servidor de correo:puerto como servidor SMTP\n" +#~ " -s establece el campo Asunto:\n" +#~ " -r establece el campo Responder-Para:\n" +#~ " -l establece el número máximo de líneas a enviar (por defecto: sin " +#~ "límite)\n" +#~ " -? imprimir este mensaje.\n" +#~ "\n" -#: src/tools/bsmtp.c:350 -msgid "Fatal error: no recipient given.\n" -msgstr "Fatal error: destinatario no determinado.\n" +#~ msgid "Fatal error: no recipient given.\n" +#~ msgstr "Fatal error: destinatario no determinado.\n" -#: src/tools/bsmtp.c:378 -#, c-format -msgid "Fatal gethostname error: ERR=%s\n" -msgstr "gethostname fatal error: ERR=%s\n" +#~ msgid "Fatal gethostname error: ERR=%s\n" +#~ msgstr "gethostname fatal error: ERR=%s\n" -#: src/tools/bsmtp.c:389 -#, fuzzy, c-format -msgid "Fatal getaddrinfo for myself failed \"%s\": ERR=%s\n" -msgstr "Fallo fatal gethostbyname para mi mismo \"%s\": ERR=%s\n" +#, fuzzy +#~ msgid "Fatal getaddrinfo for myself failed \"%s\": ERR=%s\n" +#~ msgstr "Fallo fatal gethostbyname para mi mismo \"%s\": ERR=%s\n" -#: src/tools/bsmtp.c:397 -#, c-format -msgid "Fatal gethostbyname for myself failed \"%s\": ERR=%s\n" -msgstr "Fallo fatal gethostbyname para mi mismo \"%s\": ERR=%s\n" +#~ msgid "Fatal gethostbyname for myself failed \"%s\": ERR=%s\n" +#~ msgstr "Fallo fatal gethostbyname para mi mismo \"%s\": ERR=%s\n" -#: src/tools/bsmtp.c:457 src/tools/bsmtp.c:492 -#, c-format -msgid "Error unknown mail host \"%s\": ERR=%s\n" -msgstr "Error servidor de correo \"%s\" desconocido: ERR=%s\n" +#~ msgid "Error unknown mail host \"%s\": ERR=%s\n" +#~ msgstr "Error servidor de correo \"%s\" desconocido: ERR=%s\n" -#: src/tools/bsmtp.c:460 src/tools/bsmtp.c:495 -msgid "Retrying connection using \"localhost\".\n" -msgstr "Reintentando la conexión usando \"localhost\".\n" +#~ msgid "Retrying connection using \"localhost\".\n" +#~ msgstr "Reintentando la conexión usando \"localhost\".\n" -#: src/tools/bsmtp.c:485 -#, fuzzy, c-format -msgid "Failed to connect to mailhost %s\n" -msgstr "Fallo al conectar con el cliente.\n" +#, fuzzy +#~ msgid "Failed to connect to mailhost %s\n" +#~ msgstr "Fallo al conectar con el cliente.\n" -#: src/tools/bsmtp.c:503 -#, c-format -msgid "Fatal error: Unknown address family for smtp host: %d\n" -msgstr "" -"Fatal error: Desconocida familia de direcciones para servidor smtp: %d\n" +#~ msgid "Fatal error: Unknown address family for smtp host: %d\n" +#~ msgstr "" +#~ "Fatal error: Desconocida familia de direcciones para servidor smtp: %d\n" -#: src/tools/bsmtp.c:512 src/tools/bsmtp.c:517 -#, c-format -msgid "Fatal socket error: ERR=%s\n" -msgstr "Fatal error de socket: ERR=%s\n" +#~ msgid "Fatal socket error: ERR=%s\n" +#~ msgstr "Fatal error de socket: ERR=%s\n" -#: src/tools/bsmtp.c:522 -#, c-format -msgid "Fatal connect error to %s: ERR=%s\n" -msgstr "Fatal error de conexión para %s: ERR=%s\n" +#~ msgid "Fatal connect error to %s: ERR=%s\n" +#~ msgstr "Fatal error de conexión para %s: ERR=%s\n" -#: src/tools/bsmtp.c:531 -#, c-format -msgid "Fatal _open_osfhandle error: ERR=%s\n" -msgstr "Fatal error _open_osfhandle: ERR=%s\n" +#~ msgid "Fatal _open_osfhandle error: ERR=%s\n" +#~ msgstr "Fatal error _open_osfhandle: ERR=%s\n" -#: src/tools/bsmtp.c:538 src/tools/bsmtp.c:542 src/tools/bsmtp.c:551 -#: src/tools/bsmtp.c:555 -#, c-format -msgid "Fatal fdopen error: ERR=%s\n" -msgstr "Fatal error fdopen: ERR=%s\n" +#~ msgid "Fatal fdopen error: ERR=%s\n" +#~ msgstr "Fatal error fdopen: ERR=%s\n" -#: src/tools/bsmtp.c:547 -#, c-format -msgid "Fatal dup error: ERR=%s\n" -msgstr "Fatal error dup: ERR=%s\n" +#~ msgid "Fatal dup error: ERR=%s\n" +#~ msgstr "Fatal error dup: ERR=%s\n" -#: src/tools/bsnapshot.c:47 -#, fuzzy, c-format -msgid "" -"ERROR %s\n" -"\n" -msgstr "\n" +#, fuzzy +#~ msgid "" +#~ "ERROR %s\n" +#~ "\n" +#~ msgstr "\n" -#: src/tools/bsnapshot.c:51 -#, c-format -msgid "" -"Bacula Systems SA(R) %s (%s)\n" -"\n" -"Usage: bsnapshot\n" -" -d level Set debug level\n" -" -v Verbose\n" -" -s Use sudo\n" -" -o logfile send debug to logfile\n" -" -V volume volume\n" -" -T type volume type\n" -" -t check compatibility\n" -" -c specify configuration file\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to open -p argument for reading" +#~ msgstr "No se puede abrir el archivo de parámetros de DH" -#: src/tools/bsnapshot.c:1876 #, fuzzy -msgid "Unable to open -p argument for reading" -msgstr "No se puede abrir el archivo de parámetros de DH" +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -n specify the database name (default bacula)\n" +#~ " -u specify database user name (default bacula)\n" +#~ " -P specify database host (default NULL)\n" +#~ " -w specify working directory\n" +#~ " -j specify jobids\n" +#~ " -p specify path\n" +#~ " -f specify file\n" +#~ " -l maximum tuple to fetch\n" +#~ " -T truncate cache table before starting\n" +#~ " -v verbose\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Versión: %s (%s)\n" +#~ " -d establece nivel de depuración para \n" +#~ " -dt imprime timestamp en salida de depuración\n" +#~ " -n especifica el nombre de la base de datos (por defecto " +#~ "bacula)\n" +#~ " -u especifica el nombre de usuario de la base de datos (por " +#~ "defecto bacula)\n" +#~ " -P especifica la contraseña de la base de datos (por " +#~ "defecto none)\n" +#~ " -h especifica servidor de la base de datos (por defecto " +#~ "NULL)\n" +#~ " -w especifica el directorio de trabajo\n" +#~ " -j especifica jobids\n" +#~ " -p especifica la ruta\n" +#~ " -f especifica el archivo\n" +#~ " -l tupla máxima a buscar\n" +#~ " -T Truncar tabla de caché antes de empezar\n" +#~ " -v detallado\n" +#~ " -? imprime esta mensaje\n" +#~ "\n" -#: src/tools/bvfs_test.c:44 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database host (default NULL)\n" -" -w specify working directory\n" -" -j specify jobids\n" -" -p specify path\n" -" -f specify file\n" -" -l maximum tuple to fetch\n" -" -T truncate cache table before starting\n" -" -v verbose\n" -" -? print this message\n" -"\n" -msgstr "" -"\n" -"Versión: %s (%s)\n" -" -d establece nivel de depuración para \n" -" -dt imprime timestamp en salida de depuración\n" -" -n especifica el nombre de la base de datos (por defecto bacula)\n" -" -u especifica el nombre de usuario de la base de datos (por " -"defecto bacula)\n" -" -P especifica la contraseña de la base de datos (por defecto " -"none)\n" -" -h especifica servidor de la base de datos (por defecto NULL)\n" -" -w especifica el directorio de trabajo\n" -" -j especifica jobids\n" -" -p especifica la ruta\n" -" -f especifica el archivo\n" -" -l tupla máxima a buscar\n" -" -T Truncar tabla de caché antes de empezar\n" -" -v detallado\n" -" -? imprime esta mensaje\n" -"\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -n specify the database name (default bacula)\n" +#~ " -u specify database user name (default bacula)\n" +#~ " -P specify database host (default NULL)\n" +#~ " -w specify working directory\n" +#~ " -p specify path\n" +#~ " -f specify file\n" +#~ " -l maximum tuple to fetch\n" +#~ " -q print only errors\n" +#~ " -v verbose\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Versión: %s (%s)\n" +#~ " -d establece nivel de depuración para \n" +#~ " -dt imprime timestamp en salida de depuración\n" +#~ " -n especifica el nombre de la base de datos (por defecto " +#~ "bacula)\n" +#~ " -u especifica el nombre de usuario de la base de datos (por " +#~ "defecto bacula)\n" +#~ " -P especifica la contraseña de la base de datos (por " +#~ "defecto none)\n" +#~ " -h especifica servidor de la base de datos (por defecto " +#~ "NULL)\n" +#~ " -w especifica el directorio de trabajo\n" +#~ " -j especifica jobids\n" +#~ " -p especifica la ruta\n" +#~ " -f especifica el archivo\n" +#~ " -l tupla máxima a buscar\n" +#~ " -T Truncar tabla de caché antes de empezar\n" +#~ " -v detallado\n" +#~ " -? imprime esta mensaje\n" +#~ "\n" -#: src/tools/cats_test.c:47 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database host (default NULL)\n" -" -w specify working directory\n" -" -p specify path\n" -" -f specify file\n" -" -l maximum tuple to fetch\n" -" -q print only errors\n" -" -v verbose\n" -" -? print this message\n" -"\n" -msgstr "" -"\n" -"Versión: %s (%s)\n" -" -d establece nivel de depuración para \n" -" -dt imprime timestamp en salida de depuración\n" -" -n especifica el nombre de la base de datos (por defecto bacula)\n" -" -u especifica el nombre de usuario de la base de datos (por " -"defecto bacula)\n" -" -P especifica la contraseña de la base de datos (por defecto " -"none)\n" -" -h especifica servidor de la base de datos (por defecto NULL)\n" -" -w especifica el directorio de trabajo\n" -" -j especifica jobids\n" -" -p especifica la ruta\n" -" -f especifica el archivo\n" -" -l tupla máxima a buscar\n" -" -T Truncar tabla de caché antes de empezar\n" -" -v detallado\n" -" -? imprime esta mensaje\n" -"\n" +#, fuzzy +#~ msgid "Could not open, database \"%s\".\n" +#~ msgstr "No se puede abrir la base de datos \"%s\".\n" -#: src/tools/cats_test.c:363 -#, fuzzy, c-format -msgid "Could not open, database \"%s\".\n" -msgstr "No se puede abrir la base de datos \"%s\".\n" +#~ msgid "" +#~ "Warning skipping the additional parameters for working directory/dbname/" +#~ "user/password/host.\n" +#~ msgstr "" +#~ "Advertencia, saltando los parámetros adicionales para el directorio de " +#~ "trabajo/dbname/usuario/contraseña/maquina.\n" -#: src/tools/dbcheck.c:178 -msgid "" -"Warning skipping the additional parameters for working directory/dbname/user/" -"password/host.\n" -msgstr "" -"Advertencia, saltando los parámetros adicionales para el directorio de " -"trabajo/dbname/usuario/contraseña/maquina.\n" +#~ msgid "" +#~ "Error can not find the Catalog name[%s] in the given config file [%s]\n" +#~ msgstr "" +#~ "Error, no puede encontrar el nombre del Catálogo [%s] en el archivo [%s] " +#~ "de configuración dado\n" -#: src/tools/dbcheck.c:196 -#, c-format -msgid "Error can not find the Catalog name[%s] in the given config file [%s]\n" -msgstr "" -"Error, no puede encontrar el nombre del Catálogo [%s] en el archivo [%s] de " -"configuración dado\n" +#~ msgid "Error there is no Catalog section in the given config file [%s]\n" +#~ msgstr "" +#~ "Error, no hay una sección de Catálogo en el archivo de configuración dado " +#~ "[% s]\n" -#: src/tools/dbcheck.c:198 -#, c-format -msgid "Error there is no Catalog section in the given config file [%s]\n" -msgstr "" -"Error, no hay una sección de Catálogo en el archivo de configuración dado " -"[% s]\n" +#~ msgid "Error no Director resource defined.\n" +#~ msgstr "Error, recurso Director no definido.\n" -#: src/tools/dbcheck.c:207 -msgid "Error no Director resource defined.\n" -msgstr "Error, recurso Director no definido.\n" +#~ msgid "Wrong number of arguments.\n" +#~ msgstr "Número incorrecto de argumentos.\n" -#: src/tools/dbcheck.c:231 -msgid "Wrong number of arguments.\n" -msgstr "Número incorrecto de argumentos.\n" +#~ msgid "Working directory not supplied.\n" +#~ msgstr "Directorio de trabajo no suministrado.\n" -#: src/tools/dbcheck.c:236 -msgid "Working directory not supplied.\n" -msgstr "Directorio de trabajo no suministrado.\n" +#~ msgid "Database port must be a numeric value.\n" +#~ msgstr "Puerto de la BD debe ser un valor numérico.\n" -#: src/tools/dbcheck.c:272 -msgid "Database port must be a numeric value.\n" -msgstr "Puerto de la BD debe ser un valor numérico.\n" +#~ msgid "Database port must be a int value.\n" +#~ msgstr "Puerto de la BD debe ser un valor entero.\n" -#: src/tools/dbcheck.c:275 -msgid "Database port must be a int value.\n" -msgstr "Puerto de la BD debe ser un valor entero.\n" +#~ msgid "Hello, this is the database check/correct program.\n" +#~ msgstr "" +#~ "Hola, este es el programa de comprobación/corrección de la base de " +#~ "datos.\n" -#: src/tools/dbcheck.c:346 -#, c-format -msgid "Hello, this is the database check/correct program.\n" -msgstr "" -"Hola, este es el programa de comprobación/corrección de la base de datos.\n" +#~ msgid "Modify database is on." +#~ msgstr "Modificación de base de datos esta activada." -#: src/tools/dbcheck.c:348 -#, c-format -msgid "Modify database is on." -msgstr "Modificación de base de datos esta activada." +#~ msgid "Modify database is off." +#~ msgstr "Modificación base de datos esta desactivada." -#: src/tools/dbcheck.c:350 -#, c-format -msgid "Modify database is off." -msgstr "Modificación base de datos esta desactivada." +#~ msgid " Verbose is on.\n" +#~ msgstr "Detallado esta activado.\n" -#: src/tools/dbcheck.c:352 src/tools/dbcheck.c:407 -#, c-format -msgid " Verbose is on.\n" -msgstr "Detallado esta activado.\n" +#~ msgid " Verbose is off.\n" +#~ msgstr "Detallado está apagado.\n" -#: src/tools/dbcheck.c:354 src/tools/dbcheck.c:409 -#, c-format -msgid " Verbose is off.\n" -msgstr "Detallado está apagado.\n" +#~ msgid "Please select the function you want to perform.\n" +#~ msgstr "Por favor seleccione la función que desea realizar.\n" -#: src/tools/dbcheck.c:356 -#, c-format -msgid "Please select the function you want to perform.\n" -msgstr "Por favor seleccione la función que desea realizar.\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ " 1) Toggle modify database flag\n" +#~ " 2) Toggle verbose flag\n" +#~ " 3) Repair bad Path records\n" +#~ " 4) Eliminate duplicate Path records\n" +#~ " 5) Eliminate orphaned Jobmedia records\n" +#~ " 6) Eliminate orphaned File records\n" +#~ " 7) Eliminate orphaned Path records\n" +#~ " 8) Eliminate orphaned FileSet records\n" +#~ " 9) Eliminate orphaned Client records\n" +#~ " 10) Eliminate orphaned Job records\n" +#~ " 11) Eliminate all Admin records\n" +#~ " 12) Eliminate all Restore records\n" +#~ " 13) All (3-12)\n" +#~ " 14) Quit\n" +#~ msgstr "" +#~ "\n" +#~ " 1) Activar bandera modificar base de datos\n" +#~ " 2) Activar bandera detallado\n" +#~ " 3) Reparar malos registros de Nombre de Archivo\n" +#~ " 4) Reparar malos registros de Rutas\n" +#~ " 5) Eliminar registros de Nombre de Archivo duplicados\n" +#~ " 6) Eliminar registros de Rutas duplicados\n" +#~ " 7) Eliminar registros de Jobmedia huérfanos\n" +#~ " 8) Eliminar registros de Archivo huérfanos\n" +#~ " 9) Eliminar registros de Rutas huérfanos\n" +#~ " 10) Eliminar registros de nombre de archivo huérfanos\n" +#~ " 11) Eliminar registros de FileSet huérfanos\n" +#~ " 12) Eliminar registros de Cliente huérfanos\n" +#~ " 13) Eliminar registros de Job huérfanos\n" +#~ " 14) Eliminar todos los registros de Administración\n" +#~ " 15) Eliminar todos los registros de Restauración\n" +#~ " 16) Todos (3-15)\n" +#~ " 17) Salir\n" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ " 1) Toggle modify database flag\n" +#~ " 2) Toggle verbose flag\n" +#~ " 3) Check for bad Path records\n" +#~ " 4) Check for duplicate Path records\n" +#~ " 5) Check for orphaned Jobmedia records\n" +#~ " 6) Check for orphaned File records\n" +#~ " 7) Check for orphaned Path records\n" +#~ " 8) Check for orphaned FileSet records\n" +#~ " 9) Check for orphaned Client records\n" +#~ " 10) Check for orphaned Job records\n" +#~ " 11) Check for all Admin records\n" +#~ " 12) Check for all Restore records\n" +#~ " 13) All (3-12)\n" +#~ " 14) Quit\n" +#~ msgstr "" +#~ "\n" +#~ " 1) Activar bandera modificar base de datos\n" +#~ " 2) Activar bandera detallado\n" +#~ " 3) Verificar malos registros de Nombre de Archivo\n" +#~ " 4) Verificar malos registros de Rutas\n" +#~ " 5) Verificar registros de Nombre de Archivo duplicados\n" +#~ " 6) Verificar registros de Rutas duplicados\n" +#~ " 7) Verificar registros de Jobmedia huérfanos\n" +#~ " 8) Verificar registros de Archivo huérfanos\n" +#~ " 9) Verificar registros de Rutas huérfanos\n" +#~ " 10) Verificar registros de nombre de archivo huérfanos\n" +#~ " 11) Verificar registros de FileSet huérfanos\n" +#~ " 12) Verificar registros de Cliente huérfanos\n" +#~ " 13) Verificar registros de Job huérfanos\n" +#~ " 14) Verificar todos los registros de Administración\n" +#~ " 15) Verificar todos los registros de Restauración\n" +#~ " 16) Todos (3-15)\n" +#~ " 17) Salir\n" -#: src/tools/dbcheck.c:360 -#, fuzzy, c-format -msgid "" -"\n" -" 1) Toggle modify database flag\n" -" 2) Toggle verbose flag\n" -" 3) Repair bad Path records\n" -" 4) Eliminate duplicate Path records\n" -" 5) Eliminate orphaned Jobmedia records\n" -" 6) Eliminate orphaned File records\n" -" 7) Eliminate orphaned Path records\n" -" 8) Eliminate orphaned FileSet records\n" -" 9) Eliminate orphaned Client records\n" -" 10) Eliminate orphaned Job records\n" -" 11) Eliminate all Admin records\n" -" 12) Eliminate all Restore records\n" -" 13) All (3-12)\n" -" 14) Quit\n" -msgstr "" -"\n" -" 1) Activar bandera modificar base de datos\n" -" 2) Activar bandera detallado\n" -" 3) Reparar malos registros de Nombre de Archivo\n" -" 4) Reparar malos registros de Rutas\n" -" 5) Eliminar registros de Nombre de Archivo duplicados\n" -" 6) Eliminar registros de Rutas duplicados\n" -" 7) Eliminar registros de Jobmedia huérfanos\n" -" 8) Eliminar registros de Archivo huérfanos\n" -" 9) Eliminar registros de Rutas huérfanos\n" -" 10) Eliminar registros de nombre de archivo huérfanos\n" -" 11) Eliminar registros de FileSet huérfanos\n" -" 12) Eliminar registros de Cliente huérfanos\n" -" 13) Eliminar registros de Job huérfanos\n" -" 14) Eliminar todos los registros de Administración\n" -" 15) Eliminar todos los registros de Restauración\n" -" 16) Todos (3-15)\n" -" 17) Salir\n" - -#: src/tools/dbcheck.c:376 -#, fuzzy, c-format -msgid "" -"\n" -" 1) Toggle modify database flag\n" -" 2) Toggle verbose flag\n" -" 3) Check for bad Path records\n" -" 4) Check for duplicate Path records\n" -" 5) Check for orphaned Jobmedia records\n" -" 6) Check for orphaned File records\n" -" 7) Check for orphaned Path records\n" -" 8) Check for orphaned FileSet records\n" -" 9) Check for orphaned Client records\n" -" 10) Check for orphaned Job records\n" -" 11) Check for all Admin records\n" -" 12) Check for all Restore records\n" -" 13) All (3-12)\n" -" 14) Quit\n" -msgstr "" -"\n" -" 1) Activar bandera modificar base de datos\n" -" 2) Activar bandera detallado\n" -" 3) Verificar malos registros de Nombre de Archivo\n" -" 4) Verificar malos registros de Rutas\n" -" 5) Verificar registros de Nombre de Archivo duplicados\n" -" 6) Verificar registros de Rutas duplicados\n" -" 7) Verificar registros de Jobmedia huérfanos\n" -" 8) Verificar registros de Archivo huérfanos\n" -" 9) Verificar registros de Rutas huérfanos\n" -" 10) Verificar registros de nombre de archivo huérfanos\n" -" 11) Verificar registros de FileSet huérfanos\n" -" 12) Verificar registros de Cliente huérfanos\n" -" 13) Verificar registros de Job huérfanos\n" -" 14) Verificar todos los registros de Administración\n" -" 15) Verificar todos los registros de Restauración\n" -" 16) Todos (3-15)\n" -" 17) Salir\n" - -#: src/tools/dbcheck.c:393 -msgid "Select function number: " -msgstr "Seleccione número de función:" - -#: src/tools/dbcheck.c:400 -#, c-format -msgid "Database will be modified.\n" -msgstr "Base de datos será modificada.\n" +#~ msgid "Select function number: " +#~ msgstr "Seleccione número de función:" -#: src/tools/dbcheck.c:402 -#, c-format -msgid "Database will NOT be modified.\n" -msgstr "Base de datos NO será modificada.\n" +#~ msgid "Database will be modified.\n" +#~ msgstr "Base de datos será modificada.\n" -#: src/tools/dbcheck.c:481 -#, c-format -msgid "JobId=%s Name=\"%s\" StartTime=%s\n" -msgstr "JobId=%s Nombre=\"%s\" HoraInicio=%s\n" +#~ msgid "Database will NOT be modified.\n" +#~ msgstr "Base de datos NO será modificada.\n" -#: src/tools/dbcheck.c:488 -#, c-format -msgid "Orphaned JobMediaId=%s JobId=%s Volume=\"%s\"\n" -msgstr "Huérfanos JobMediaId=%s JobId=%s Volumen=\"%s\"\n" +#~ msgid "JobId=%s Name=\"%s\" StartTime=%s\n" +#~ msgstr "JobId=%s Nombre=\"%s\" HoraInicio=%s\n" -#: src/tools/dbcheck.c:495 -#, c-format -msgid "Orphaned FileId=%s JobId=%s Volume=\"%s\"\n" -msgstr "Huérfanos FileId=%s JobId=%s Volumen=\"%s\"\n" +#~ msgid "Orphaned JobMediaId=%s JobId=%s Volume=\"%s\"\n" +#~ msgstr "Huérfanos JobMediaId=%s JobId=%s Volumen=\"%s\"\n" -#: src/tools/dbcheck.c:502 -#, c-format -msgid "Orphaned FileSetId=%s FileSet=\"%s\" MD5=%s\n" -msgstr "Huérfanos FileSetId=%s FileSet=\"%s\" MD5=%s\n" +#~ msgid "Orphaned FileId=%s JobId=%s Volume=\"%s\"\n" +#~ msgstr "Huérfanos FileId=%s JobId=%s Volumen=\"%s\"\n" -#: src/tools/dbcheck.c:509 -#, c-format -msgid "Orphaned ClientId=%s Name=\"%s\"\n" -msgstr "Huérfanos ClientId=%s Nombre=\"%s\"\n" +#~ msgid "Orphaned FileSetId=%s FileSet=\"%s\" MD5=%s\n" +#~ msgstr "Huérfanos FileSetId=%s FileSet=\"%s\" MD5=%s\n" -#: src/tools/dbcheck.c:562 -#, c-format -msgid "Deleting: %s\n" -msgstr "Eliminando: %s\n" +#~ msgid "Orphaned ClientId=%s Name=\"%s\"\n" +#~ msgstr "Huérfanos ClientId=%s Nombre=\"%s\"\n" -#: src/tools/dbcheck.c:634 -#, c-format -msgid "Checking for duplicate Path entries.\n" -msgstr "Comprobando entradas Path duplicadas.\n" +#~ msgid "Deleting: %s\n" +#~ msgstr "Eliminando: %s\n" -#: src/tools/dbcheck.c:645 -#, c-format -msgid "Found %d duplicate Path records.\n" -msgstr "Encontrados %d registros de Rutas duplicados.\n" +#~ msgid "Checking for duplicate Path entries.\n" +#~ msgstr "Comprobando entradas Path duplicadas.\n" -#: src/tools/dbcheck.c:646 src/tools/dbcheck.c:708 src/tools/dbcheck.c:754 -#: src/tools/dbcheck.c:822 src/tools/dbcheck.c:864 src/tools/dbcheck.c:906 -#: src/tools/dbcheck.c:948 src/tools/dbcheck.c:985 src/tools/dbcheck.c:1018 -#: src/tools/dbcheck.c:1052 -msgid "Print them? (yes/no): " -msgstr "Imprimirlos? (sí/no):" +#~ msgid "Found %d duplicate Path records.\n" +#~ msgstr "Encontrados %d registros de Rutas duplicados.\n" -#: src/tools/dbcheck.c:669 -#, c-format -msgid "Found %d for: %s\n" -msgstr "Encontrados %d para: %s\n" +#~ msgid "Print them? (yes/no): " +#~ msgstr "Imprimirlos? (sí/no):" -#: src/tools/dbcheck.c:699 -#, c-format -msgid "Checking for orphaned JobMedia entries.\n" -msgstr "Comprobando entradas JobMedia huérfanas.\n" +#~ msgid "Found %d for: %s\n" +#~ msgstr "Encontrados %d para: %s\n" -#: src/tools/dbcheck.c:707 -#, c-format -msgid "Found %d orphaned JobMedia records.\n" -msgstr "Encontrados %d registros JobMedia huérfanos.\n" +#~ msgid "Checking for orphaned JobMedia entries.\n" +#~ msgstr "Comprobando entradas JobMedia huérfanas.\n" -#: src/tools/dbcheck.c:725 -#, c-format -msgid "Deleting %d orphaned JobMedia records.\n" -msgstr "Eliminando %d registros JobMedia huérfanos.\n" +#~ msgid "Found %d orphaned JobMedia records.\n" +#~ msgstr "Encontrados %d registros JobMedia huérfanos.\n" -#: src/tools/dbcheck.c:742 -#, c-format -msgid "Checking for orphaned File entries. This may take some time!\n" -msgstr "Comprobando entradas Files huérfanas. Esto puede tomar algún tiempo.\n" +#~ msgid "Deleting %d orphaned JobMedia records.\n" +#~ msgstr "Eliminando %d registros JobMedia huérfanos.\n" -#: src/tools/dbcheck.c:753 -#, c-format -msgid "Found %d orphaned File records.\n" -msgstr "Encontrados %d registros File huérfanos.\n" +#~ msgid "Checking for orphaned File entries. This may take some time!\n" +#~ msgstr "" +#~ "Comprobando entradas Files huérfanas. Esto puede tomar algún tiempo.\n" -#: src/tools/dbcheck.c:770 -#, c-format -msgid "Deleting %d orphaned File records.\n" -msgstr "Eliminando %d registros File huérfanos.\n" +#~ msgid "Found %d orphaned File records.\n" +#~ msgstr "Encontrados %d registros File huérfanos.\n" -#: src/tools/dbcheck.c:789 -#, c-format -msgid "Pruning orphaned Path entries isn't possible when using BVFS.\n" -msgstr "" +#~ msgid "Deleting %d orphaned File records.\n" +#~ msgstr "Eliminando %d registros File huérfanos.\n" -#: src/tools/dbcheck.c:798 -msgid "Create temporary index? (yes/no): " -msgstr "Crear índice temporal? (sí/no):" +#~ msgid "Create temporary index? (yes/no): " +#~ msgstr "Crear índice temporal? (sí/no):" -#: src/tools/dbcheck.c:810 -#, c-format -msgid "Checking for orphaned Path entries. This may take some time!\n" -msgstr "" -"Comprobando de entradas huérfanas de Ruta. Esto puede tomar algún tiempo!\n" +#~ msgid "Checking for orphaned Path entries. This may take some time!\n" +#~ msgstr "" +#~ "Comprobando de entradas huérfanas de Ruta. Esto puede tomar algún " +#~ "tiempo!\n" -#: src/tools/dbcheck.c:821 -#, c-format -msgid "Found %d orphaned Path records.\n" -msgstr "Se han encontrado %d registros huérfanos de Ruta.\n" +#~ msgid "Found %d orphaned Path records.\n" +#~ msgstr "Se han encontrado %d registros huérfanos de Ruta.\n" -#: src/tools/dbcheck.c:834 -#, c-format -msgid "Deleting %d orphaned Path records.\n" -msgstr "Eliminando %d registros huérfanos de Ruta.\n" +#~ msgid "Deleting %d orphaned Path records.\n" +#~ msgstr "Eliminando %d registros huérfanos de Ruta.\n" -#: src/tools/dbcheck.c:853 -#, c-format -msgid "Checking for orphaned FileSet entries. This takes some time!\n" -msgstr "" -"Comprobando de entradas FileSet huérfanos. Esto puede tomar algún tiempo!\n" +#~ msgid "Checking for orphaned FileSet entries. This takes some time!\n" +#~ msgstr "" +#~ "Comprobando de entradas FileSet huérfanos. Esto puede tomar algún " +#~ "tiempo!\n" -#: src/tools/dbcheck.c:863 -#, c-format -msgid "Found %d orphaned FileSet records.\n" -msgstr "Se han encontrado %d registros FileSet huérfanos.\n" +#~ msgid "Found %d orphaned FileSet records.\n" +#~ msgstr "Se han encontrado %d registros FileSet huérfanos.\n" -#: src/tools/dbcheck.c:878 -#, c-format -msgid "Deleting %d orphaned FileSet records.\n" -msgstr "Eliminando %d registros FileSet huérfanos.\n" +#~ msgid "Deleting %d orphaned FileSet records.\n" +#~ msgstr "Eliminando %d registros FileSet huérfanos.\n" -#: src/tools/dbcheck.c:887 -#, c-format -msgid "Checking for orphaned Client entries.\n" -msgstr "" -"Comprobando entradas de Clientes huérfanos. Esto puede tomar algún tiempo!\n" +#~ msgid "Checking for orphaned Client entries.\n" +#~ msgstr "" +#~ "Comprobando entradas de Clientes huérfanos. Esto puede tomar algún " +#~ "tiempo!\n" -#: src/tools/dbcheck.c:905 -#, c-format -msgid "Found %d orphaned Client records.\n" -msgstr "Se han encontrado %d registros de Clientes huérfanos.\n" +#~ msgid "Found %d orphaned Client records.\n" +#~ msgstr "Se han encontrado %d registros de Clientes huérfanos.\n" -#: src/tools/dbcheck.c:920 -#, c-format -msgid "Deleting %d orphaned Client records.\n" -msgstr "Eliminando %d registros de Clientes huérfanos.\n" +#~ msgid "Deleting %d orphaned Client records.\n" +#~ msgstr "Eliminando %d registros de Clientes huérfanos.\n" -#: src/tools/dbcheck.c:929 -#, c-format -msgid "Checking for orphaned Job entries.\n" -msgstr "" -"Comprobando entradas de Job huérfanos. Esto puede tomar algún tiempo!\n" +#~ msgid "Checking for orphaned Job entries.\n" +#~ msgstr "" +#~ "Comprobando entradas de Job huérfanos. Esto puede tomar algún tiempo!\n" -#: src/tools/dbcheck.c:947 -#, c-format -msgid "Found %d orphaned Job records.\n" -msgstr "Se han encontrado %d registros de Job huérfanos.\n" +#~ msgid "Found %d orphaned Job records.\n" +#~ msgstr "Se han encontrado %d registros de Job huérfanos.\n" -#: src/tools/dbcheck.c:962 -#, c-format -msgid "Deleting %d orphaned Job records.\n" -msgstr "Eliminando %d registros de Job huérfanos.\n" +#~ msgid "Deleting %d orphaned Job records.\n" +#~ msgstr "Eliminando %d registros de Job huérfanos.\n" -#: src/tools/dbcheck.c:964 -#, c-format -msgid "Deleting JobMedia records of orphaned Job records.\n" -msgstr "Eliminando registros JobMedia de registros de Job huérfanos.\n" +#~ msgid "Deleting JobMedia records of orphaned Job records.\n" +#~ msgstr "Eliminando registros JobMedia de registros de Job huérfanos.\n" -#: src/tools/dbcheck.c:966 -#, c-format -msgid "Deleting Log records of orphaned Job records.\n" -msgstr "Eliminando registros Log de registros de Job huérfanos.\n" +#~ msgid "Deleting Log records of orphaned Job records.\n" +#~ msgstr "Eliminando registros Log de registros de Job huérfanos.\n" -#: src/tools/dbcheck.c:975 -#, c-format -msgid "Checking for Admin Job entries.\n" -msgstr "Comprobando entradas para Job Administrativo.\n" +#~ msgid "Checking for Admin Job entries.\n" +#~ msgstr "Comprobando entradas para Job Administrativo.\n" -#: src/tools/dbcheck.c:984 -#, c-format -msgid "Found %d Admin Job records.\n" -msgstr "Se han encontrado %d registros de Job Administrativo.\n" +#~ msgid "Found %d Admin Job records.\n" +#~ msgstr "Se han encontrado %d registros de Job Administrativo.\n" -#: src/tools/dbcheck.c:999 -#, c-format -msgid "Deleting %d Admin Job records.\n" -msgstr "Eliminando %d registros de Job Administrativo.\n" +#~ msgid "Deleting %d Admin Job records.\n" +#~ msgstr "Eliminando %d registros de Job Administrativo.\n" -#: src/tools/dbcheck.c:1008 -#, c-format -msgid "Checking for Restore Job entries.\n" -msgstr "Comprobando entradas para Job de Restauración.\n" +#~ msgid "Checking for Restore Job entries.\n" +#~ msgstr "Comprobando entradas para Job de Restauración.\n" -#: src/tools/dbcheck.c:1017 -#, c-format -msgid "Found %d Restore Job records.\n" -msgstr "Se han encontrado %d registros de Job de Restauración.\n" +#~ msgid "Found %d Restore Job records.\n" +#~ msgstr "Se han encontrado %d registros de Job de Restauración.\n" -#: src/tools/dbcheck.c:1032 -#, c-format -msgid "Deleting %d Restore Job records.\n" -msgstr "Eliminando %d registros de Job de Restauración.\n" +#~ msgid "Deleting %d Restore Job records.\n" +#~ msgstr "Eliminando %d registros de Job de Restauración.\n" -#: src/tools/dbcheck.c:1042 -#, c-format -msgid "Checking for Paths without a trailing slash\n" -msgstr "Comprobando Rutas sin una barra diagonal\n" +#~ msgid "Checking for Paths without a trailing slash\n" +#~ msgstr "Comprobando Rutas sin una barra diagonal\n" -#: src/tools/dbcheck.c:1051 -#, c-format -msgid "Found %d bad Path records.\n" -msgstr "Se han encontrado %d malos registros de Rutas.\n" +#~ msgid "Found %d bad Path records.\n" +#~ msgstr "Se han encontrado %d malos registros de Rutas.\n" -#: src/tools/dbcheck.c:1068 -#, c-format -msgid "Reparing %d bad Filename records.\n" -msgstr "Reparando %d malos registros de Nombre de Archivo.\n" +#~ msgid "Reparing %d bad Filename records.\n" +#~ msgstr "Reparando %d malos registros de Nombre de Archivo.\n" -#: src/tools/dbcheck.c:1214 -#, c-format -msgid "" -"Ok. Index over the %s column already exists and dbcheck will work faster.\n" -msgstr "" -"Listo. Índice sobre la columna %s ya existe y dbcheck funcionará más " -"rápido.\n" +#~ msgid "" +#~ "Ok. Index over the %s column already exists and dbcheck will work " +#~ "faster.\n" +#~ msgstr "" +#~ "Listo. Índice sobre la columna %s ya existe y dbcheck funcionará más " +#~ "rápido.\n" -#: src/tools/dbcheck.c:1217 -#, c-format -msgid "" -"Note. Index over the %s column not found, that can greatly slow down " -"dbcheck.\n" -msgstr "" -"Nota. Índice sobre la columna %s no encontrado, esto puede en gran medida " -"ralentizar dbcheck.\n" +#~ msgid "" +#~ "Note. Index over the %s column not found, that can greatly slow down " +#~ "dbcheck.\n" +#~ msgstr "" +#~ "Nota. Índice sobre la columna %s no encontrado, esto puede en gran medida " +#~ "ralentizar dbcheck.\n" -#: src/tools/dbcheck.c:1232 -#, c-format -msgid "Create temporary index... This may take some time!\n" -msgstr "Crear índice temporal... Esto puede tomar algún tiempo!\n" +#~ msgid "Create temporary index... This may take some time!\n" +#~ msgstr "Crear índice temporal... Esto puede tomar algún tiempo!\n" -#: src/tools/dbcheck.c:1240 -#, c-format -msgid "Temporary index created.\n" -msgstr "Índice temporal creado.\n" +#~ msgid "Temporary index created.\n" +#~ msgstr "Índice temporal creado.\n" -#: src/tools/dbcheck.c:1255 -#, c-format -msgid "Drop temporary index.\n" -msgstr "Eliminar índice temporal.\n" +#~ msgid "Drop temporary index.\n" +#~ msgstr "Eliminar índice temporal.\n" -#: src/tools/dbcheck.c:1265 -#, c-format -msgid "Temporary index %s deleted.\n" -msgstr "Índice temporal %s eliminado.\n" +#~ msgid "Temporary index %s deleted.\n" +#~ msgstr "Índice temporal %s eliminado.\n" -#: src/tools/drivetype.c:29 -#, fuzzy, c-format -msgid "" -"\n" -"Usage: drivetype [-v] path ...\n" -"\n" -" Print the drive type a given file/directory is on.\n" -" The following options are supported:\n" -"\n" -" -l print local fixed hard drive\n" -" -a display information on all drives\n" -" -v print both path and file system type.\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Utilice: drivetype [-v] ruta ...\n" -"\n" -" Imprime el tipo de unidad dado a archivo/directorio esta activada.\n" -" Las siguientes opciones están soportados:\n" -"\n" -" -v imprime ambos tipos de rutas y archivo de sistemas.\n" -" -? imprime esta mensaje.\n" -"\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Usage: drivetype [-v] path ...\n" +#~ "\n" +#~ " Print the drive type a given file/directory is on.\n" +#~ " The following options are supported:\n" +#~ "\n" +#~ " -l print local fixed hard drive\n" +#~ " -a display information on all drives\n" +#~ " -v print both path and file system type.\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Utilice: drivetype [-v] ruta ...\n" +#~ "\n" +#~ " Imprime el tipo de unidad dado a archivo/directorio esta activada.\n" +#~ " Las siguientes opciones están soportados:\n" +#~ "\n" +#~ " -v imprime ambos tipos de rutas y archivo de sistemas.\n" +#~ " -? imprime esta mensaje.\n" +#~ "\n" -#: src/tools/drivetype.c:60 -#, c-format -msgid "%s: unknown\n" -msgstr "%s: desconocido\n" +#~ msgid "%s: unknown\n" +#~ msgstr "%s: desconocido\n" -#: src/tools/fstype.c:29 -#, fuzzy, c-format -msgid "" -"\n" -"Usage: fstype [-v] path ...\n" -"\n" -" Print the file system type for each file/directory argument given.\n" -" The following options are supported:\n" -"\n" -" -l print all file system types in mtab.\n" -" -m print full entries in mtab.\n" -" -v print both path and file system type of each argument.\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Utilice: drivetype [-v] ruta ...\n" -"\n" -" Imprime el tipo de unidad dado a archivo/directorio esta activada.\n" -" Las siguientes opciones están soportados:\n" -"\n" -" -v imprime ambos tipos de rutas y archivo de sistemas.\n" -" -? imprime esta mensaje.\n" -"\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Usage: fstype [-v] path ...\n" +#~ "\n" +#~ " Print the file system type for each file/directory argument " +#~ "given.\n" +#~ " The following options are supported:\n" +#~ "\n" +#~ " -l print all file system types in mtab.\n" +#~ " -m print full entries in mtab.\n" +#~ " -v print both path and file system type of each argument.\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Utilice: drivetype [-v] ruta ...\n" +#~ "\n" +#~ " Imprime el tipo de unidad dado a archivo/directorio esta activada.\n" +#~ " Las siguientes opciones están soportados:\n" +#~ "\n" +#~ " -v imprime ambos tipos de rutas y archivo de sistemas.\n" +#~ " -? imprime esta mensaje.\n" +#~ "\n" -#: src/tools/fstype.c:163 -#, fuzzy, c-format -msgid "%s: unknown file system type\n" -msgstr "Tipo de archivo desconocido %d: %s\n" +#, fuzzy +#~ msgid "%s: unknown file system type\n" +#~ msgstr "Tipo de archivo desconocido %d: %s\n" -#: src/tools/testfind.c:57 -#, c-format -msgid "" -"\n" -"Usage: testfind [-d debug_level] [-] [pattern1 ...]\n" -" -a print extended attributes (Win32 debug)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -c specify config file containing FileSet resources\n" -" -f specify which FileSet to use\n" -" -? print this message.\n" -"\n" -"Patterns are used for file inclusion -- normally directories.\n" -"Debug level >= 1 prints each file found.\n" -"Debug level >= 10 prints path/file for catalog.\n" -"Errors are always printed.\n" -"Files/paths truncated is the number of files/paths with len > 255.\n" -"Truncation is only in the catalog.\n" -"\n" -msgstr "" -"\n" -"Utilice: testfind [-d nivel_ depuración] [-] [patrón1 ...]\n" -" -a imprime atributos extendidos (depuración de Win32)\n" -" -d establece nivel de depuración para \n" -" -dt imprime timestamp en salida de depuración\n" -" -c especifica archivo de conteniendo recursos FileSet\n" -" -f especifica cual FileSet para usar\n" -" -? imprime esta mensaje.\n" -"\n" -"Los patrones son archivos de inclusión - normalmente directorios.\n" -"Nivel de depuración >= 1 imprime cada archivo encontrado.\n" -"Nivel de depuración >= 10 imprime ruta/archivo para catalogo.\n" -"Los errores siempre se imprimen.\n" -"Archivos/rutas truncados es numero con longitud > 255.\n" -"Truncamiento es sólo en catálogo..\n" -"\n" +#~ msgid "" +#~ "\n" +#~ "Usage: testfind [-d debug_level] [-] [pattern1 ...]\n" +#~ " -a print extended attributes (Win32 debug)\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -c specify config file containing FileSet resources\n" +#~ " -f specify which FileSet to use\n" +#~ " -? print this message.\n" +#~ "\n" +#~ "Patterns are used for file inclusion -- normally directories.\n" +#~ "Debug level >= 1 prints each file found.\n" +#~ "Debug level >= 10 prints path/file for catalog.\n" +#~ "Errors are always printed.\n" +#~ "Files/paths truncated is the number of files/paths with len > 255.\n" +#~ "Truncation is only in the catalog.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Utilice: testfind [-d nivel_ depuración] [-] [patrón1 ...]\n" +#~ " -a imprime atributos extendidos (depuración de Win32)\n" +#~ " -d establece nivel de depuración para \n" +#~ " -dt imprime timestamp en salida de depuración\n" +#~ " -c especifica archivo de conteniendo recursos FileSet\n" +#~ " -f especifica cual FileSet para usar\n" +#~ " -? imprime esta mensaje.\n" +#~ "\n" +#~ "Los patrones son archivos de inclusión - normalmente directorios.\n" +#~ "Nivel de depuración >= 1 imprime cada archivo encontrado.\n" +#~ "Nivel de depuración >= 10 imprime ruta/archivo para catalogo.\n" +#~ "Los errores siempre se imprimen.\n" +#~ "Archivos/rutas truncados es numero con longitud > 255.\n" +#~ "Truncamiento es sólo en catálogo..\n" +#~ "\n" -#: src/tools/testfind.c:223 -#, c-format -msgid "" -"\n" -"Total files : %d\n" -"Max file length: %d\n" -"Max path length: %d\n" -"Files truncated: %d\n" -"Paths truncated: %d\n" -"Hard links : %d\n" -msgstr "" -"\n" -"Total de Archivos : %d\n" -"Longitud máxima de archivo: %d\n" -"Longitud máxima de ruta: %d\n" -"Archivos truncados: %d\n" -"Rutas truncadas: %d\n" -"Enlaces duros : %d\n" - -#: src/tools/testfind.c:264 -#, c-format -msgid "Reg: %s\n" -msgstr "Reg: %s\n" +#~ msgid "" +#~ "\n" +#~ "Total files : %d\n" +#~ "Max file length: %d\n" +#~ "Max path length: %d\n" +#~ "Files truncated: %d\n" +#~ "Paths truncated: %d\n" +#~ "Hard links : %d\n" +#~ msgstr "" +#~ "\n" +#~ "Total de Archivos : %d\n" +#~ "Longitud máxima de archivo: %d\n" +#~ "Longitud máxima de ruta: %d\n" +#~ "Archivos truncados: %d\n" +#~ "Rutas truncadas: %d\n" +#~ "Enlaces duros : %d\n" -#: src/tools/testfind.c:286 -msgid "\t[will not descend: recursion turned off]" -msgstr "\t[no descenderá: recursividad desactivado]" +#~ msgid "Reg: %s\n" +#~ msgstr "Reg: %s\n" -#: src/tools/testfind.c:288 -msgid "\t[will not descend: file system change not allowed]" -msgstr "\t[no descenderá: no permitido cambio de sistema de archivo]" +#~ msgid "\t[will not descend: recursion turned off]" +#~ msgstr "\t[no descenderá: recursividad desactivado]" -#: src/tools/testfind.c:290 -msgid "\t[will not descend: disallowed file system]" -msgstr "\t[no descenderá: sistema de archivo no permitido]" +#~ msgid "\t[will not descend: file system change not allowed]" +#~ msgstr "\t[no descenderá: no permitido cambio de sistema de archivo]" -#: src/tools/testfind.c:292 -msgid "\t[will not descend: disallowed drive type]" -msgstr "\t[no descenderá: tipo de unidad no permitido]" +#~ msgid "\t[will not descend: disallowed file system]" +#~ msgstr "\t[no descenderá: sistema de archivo no permitido]" -#: src/tools/testfind.c:308 src/tools/testls.c:203 -#, c-format -msgid "Err: Could not access %s: %s\n" -msgstr "Err: No es posible acceder %s: %s\n" +#~ msgid "\t[will not descend: disallowed drive type]" +#~ msgstr "\t[no descenderá: tipo de unidad no permitido]" -#: src/tools/testfind.c:311 src/tools/testls.c:206 -#, c-format -msgid "Err: Could not follow ff->link %s: %s\n" -msgstr "Err: no podía seguir ff->link %s: %s\n" +#~ msgid "Err: Could not access %s: %s\n" +#~ msgstr "Err: No es posible acceder %s: %s\n" -#: src/tools/testfind.c:314 src/tools/testls.c:209 -#, c-format -msgid "Err: Could not stat %s: %s\n" -msgstr "Err: no se pudo stat %s: %s\n" +#~ msgid "Err: Could not follow ff->link %s: %s\n" +#~ msgstr "Err: no podía seguir ff->link %s: %s\n" -#: src/tools/testfind.c:317 src/tools/testls.c:212 -#, c-format -msgid "Skip: File not saved. No change. %s\n" -msgstr "Saltar: Archivo no guardado. Sin cambios. %s\n" +#~ msgid "Err: Could not stat %s: %s\n" +#~ msgstr "Err: no se pudo stat %s: %s\n" -#: src/tools/testfind.c:320 src/tools/testls.c:215 -#, c-format -msgid "Err: Attempt to backup archive. Not saved. %s\n" -msgstr "Err: Intento de copia de seguridad. No guardado. %s\n" +#~ msgid "Skip: File not saved. No change. %s\n" +#~ msgstr "Saltar: Archivo no guardado. Sin cambios. %s\n" -#: src/tools/testfind.c:323 src/tools/testls.c:224 -#, c-format -msgid "Err: Could not open directory %s: %s\n" -msgstr "Err: no se pudo abrir el directorio %s: %s\n" +#~ msgid "Err: Attempt to backup archive. Not saved. %s\n" +#~ msgstr "Err: Intento de copia de seguridad. No guardado. %s\n" -#: src/tools/testfind.c:326 src/tools/testls.c:227 -#, c-format -msgid "Err: Unknown file ff->type %d: %s\n" -msgstr "Err: Archivo desconocido ff->tipo %d: %s\n" +#~ msgid "Err: Could not open directory %s: %s\n" +#~ msgstr "Err: no se pudo abrir el directorio %s: %s\n" -#: src/tools/testfind.c:376 -#, c-format -msgid "===== Filename truncated to 255 chars: %s\n" -msgstr "===== Nombre de Archivo truncado para 255 caracteres: %s\n" +#~ msgid "Err: Unknown file ff->type %d: %s\n" +#~ msgstr "Err: Archivo desconocido ff->tipo %d: %s\n" -#: src/tools/testfind.c:393 -#, c-format -msgid "========== Path name truncated to 255 chars: %s\n" -msgstr "========== Nombre de Ruta truncado para 255 caracteres: %s\n" +#~ msgid "===== Filename truncated to 255 chars: %s\n" +#~ msgstr "===== Nombre de Archivo truncado para 255 caracteres: %s\n" -#: src/tools/testfind.c:402 -#, c-format -msgid "========== Path length is zero. File=%s\n" -msgstr "========== La longitud de la ruta es nula. Archivo=%s\n" +#~ msgid "========== Path name truncated to 255 chars: %s\n" +#~ msgstr "========== Nombre de Ruta truncado para 255 caracteres: %s\n" -#: src/tools/testfind.c:405 -#, c-format -msgid "Path: %s\n" -msgstr "Ruta: %s\n" +#~ msgid "========== Path length is zero. File=%s\n" +#~ msgstr "========== La longitud de la ruta es nula. Archivo=%s\n" -#: src/tools/testls.c:47 -#, fuzzy, c-format -msgid "" -"\n" -"Usage: testls [-d debug_level] [-] [pattern1 ...]\n" -" -a print extended attributes (Win32 debug)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -e specify file of exclude patterns\n" -" -i specify file of include patterns\n" -" -q quiet, don't print filenames (debug)\n" -" - read pattern(s) from stdin\n" -" -? print this message.\n" -"\n" -"Patterns are file inclusion -- normally directories.\n" -"Debug level >= 1 prints each file found.\n" -"Debug level >= 10 prints path/file for catalog.\n" -"Errors always printed.\n" -"Files/paths truncated is number with len > 255.\n" -"Truncation is only in catalog.\n" -"\n" -msgstr "" -"\n" -"Utilice: testls [-d nivel_ depuración] [-] [patrón1 ...]\n" -" -a imprime atributos extendidos (depuración de Win32)\n" -" -d establece nivel de depuración para \n" -" -dt imprime timestamp en salida de depuración\n" -" -e especifica archivo de exclusión de patrones\n" -" -i especifica archivo de inclusión de patrones\n" -" - leer patrón(es) desde stdin\n" +#~ msgid "Path: %s\n" +#~ msgstr "Ruta: %s\n" -#: src/tools/testls.c:143 -#, c-format -msgid "Could not open include file: %s\n" -msgstr "No se pudo abrir el archivo incluir: %s\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Usage: testls [-d debug_level] [-] [pattern1 ...]\n" +#~ " -a print extended attributes (Win32 debug)\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -e specify file of exclude patterns\n" +#~ " -i specify file of include patterns\n" +#~ " -q quiet, don't print filenames (debug)\n" +#~ " - read pattern(s) from stdin\n" +#~ " -? print this message.\n" +#~ "\n" +#~ "Patterns are file inclusion -- normally directories.\n" +#~ "Debug level >= 1 prints each file found.\n" +#~ "Debug level >= 10 prints path/file for catalog.\n" +#~ "Errors always printed.\n" +#~ "Files/paths truncated is number with len > 255.\n" +#~ "Truncation is only in catalog.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Utilice: testls [-d nivel_ depuración] [-] [patrón1 ...]\n" +#~ " -a imprime atributos extendidos (depuración de Win32)\n" +#~ " -d establece nivel de depuración para \n" +#~ " -dt imprime timestamp en salida de depuración\n" +#~ " -e especifica archivo de exclusión de patrones\n" +#~ " -i especifica archivo de inclusión de patrones\n" +#~ " - leer patrón(es) desde stdin\n" -#: src/tools/testls.c:156 -#, c-format -msgid "Could not open exclude file: %s\n" -msgstr "No se pudo abrir el archivo excluir: %s\n" +#~ msgid "Could not open include file: %s\n" +#~ msgstr "No se pudo abrir el archivo incluir: %s\n" -#: src/tools/testls.c:170 -#, c-format -msgid "Files seen = %d\n" -msgstr "" +#~ msgid "Could not open exclude file: %s\n" +#~ msgstr "No se pudo abrir el archivo excluir: %s\n" -#: src/tools/testls.c:218 -#, c-format -msgid "Recursion turned off. Directory not entered. %s\n" -msgstr "Recursión deshabilitada. No entró al directorio. %s\n" +#~ msgid "Recursion turned off. Directory not entered. %s\n" +#~ msgstr "Recursión deshabilitada. No entró al directorio. %s\n" -#: src/tools/testls.c:221 -#, c-format -msgid "Skip: File system change prohibited. Directory not entered. %s\n" -msgstr "" -"Saltar: Cambio de sistema de archivos prohibido. No entró al directorio. %s\n" +#~ msgid "Skip: File system change prohibited. Directory not entered. %s\n" +#~ msgstr "" +#~ "Saltar: Cambio de sistema de archivos prohibido. No entró al directorio. " +#~ "%s\n" -#: src/win32/compat/compat.cpp:2855 -msgid "" -"\n" -"\n" -"Bacula ERROR: " -msgstr "" -"\n" -"\n" -"Bacula ERROR: " +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "Bacula ERROR: " +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "Bacula ERROR: " -#: src/win32/filed/plugins/vssapi.c:1428 -#, fuzzy, c-format -msgid "Unable to resolve parent path for %ls\n" -msgstr "No se pudo obtener registro de Job. ERR=%s\n" +#, fuzzy +#~ msgid "Unable to resolve parent path for %ls\n" +#~ msgstr "No se pudo obtener registro de Job. ERR=%s\n" -#: src/win32/filed/plugins/vssfs.c:226 src/win32/filed/plugins/vssfs.c:238 #, fuzzy -msgid "Unable to parse user supplied restore configuration\n" -msgstr "No es posible leer el archivo de configuración" +#~ msgid "Unable to parse user supplied restore configuration\n" +#~ msgstr "No es posible leer el archivo de configuración" -#: src/win32/libwin32/main.cpp:226 -msgid "Bad Command Line Option" -msgstr "Mala Opción de Línea de Comandos" +#~ msgid "Bad Command Line Option" +#~ msgstr "Mala Opción de Línea de Comandos" -#: src/win32/libwin32/service.cpp:96 -msgid "RegisterServiceCtlHandler failed" -msgstr "RegisterServiceCtlHandler fallido" +#~ msgid "RegisterServiceCtlHandler failed" +#~ msgstr "RegisterServiceCtlHandler fallido" -#: src/win32/libwin32/service.cpp:97 -msgid "Failure contacting the Service Handler" -msgstr "Error al contactar con el Manejador de Servicio" +#~ msgid "Failure contacting the Service Handler" +#~ msgstr "Error al contactar con el Manejador de Servicio" -#: src/win32/libwin32/service.cpp:108 -msgid "Service start report failed" -msgstr "Fallo en inicio de Servicio de Reporte" +#~ msgid "Service start report failed" +#~ msgstr "Fallo en inicio de Servicio de Reporte" -#: src/win32/libwin32/service.cpp:161 -msgid "StartServiceCtrlDispatcher failed." -msgstr "StartServiceCtrlDispatcher fallido." +#~ msgid "StartServiceCtrlDispatcher failed." +#~ msgstr "StartServiceCtrlDispatcher fallido." -#: src/win32/libwin32/service.cpp:168 -msgid "KERNEL32.DLL not found: Bacula service not started" -msgstr "KERNEL32.DLL no encontrado: Servicio Bacula no iniciado" +#~ msgid "KERNEL32.DLL not found: Bacula service not started" +#~ msgstr "KERNEL32.DLL no encontrado: Servicio Bacula no iniciado" -#: src/win32/libwin32/service.cpp:178 -msgid "Registry service not found: Bacula service not started" -msgstr "Servicio Registry no encontrado: Servicio Bacula no iniciado" +#~ msgid "Registry service not found: Bacula service not started" +#~ msgstr "Servicio Registry no encontrado: Servicio Bacula no iniciado" -#: src/win32/libwin32/service.cpp:180 -msgid "Registry service entry point not found" -msgstr "Registro de servicio no se encuentra punto de entrada" +#~ msgid "Registry service entry point not found" +#~ msgstr "Registro de servicio no se encuentra punto de entrada" -#: src/win32/libwin32/service.cpp:201 -msgid "Report Service failure" -msgstr "Reporte de Servicio fallido" +#~ msgid "Report Service failure" +#~ msgstr "Reporte de Servicio fallido" -#: src/win32/libwin32/service.cpp:232 -msgid "Unable to install the service" -msgstr "No se puede instalar el servicio" +#~ msgid "Unable to install the service" +#~ msgstr "No se puede instalar el servicio" -#: src/win32/libwin32/service.cpp:240 -msgid "Service command length too long" -msgstr "Longitud de comandos de servicio demasiado largo" +#~ msgid "Service command length too long" +#~ msgstr "Longitud de comandos de servicio demasiado largo" -#: src/win32/libwin32/service.cpp:241 -msgid "Service command length too long. Service not registered." -msgstr "" -"Longitud de comandos de servicio demasiado largo. Servicio no registrado." +#~ msgid "Service command length too long. Service not registered." +#~ msgstr "" +#~ "Longitud de comandos de servicio demasiado largo. Servicio no registrado." -#: src/win32/libwin32/service.cpp:254 -msgid "" -"The Service Control Manager could not be contacted - the service was not " -"installed" -msgstr "" -"El Manejador de Control de Servicios no puede ser contactado - el servicio " -"no fue instalado" +#~ msgid "" +#~ "The Service Control Manager could not be contacted - the service was not " +#~ "installed" +#~ msgstr "" +#~ "El Manejador de Control de Servicios no puede ser contactado - el " +#~ "servicio no fue instalado" -#: src/win32/libwin32/service.cpp:277 src/win32/libwin32/service.cpp:306 -#: src/win32/libwin32/service.cpp:352 src/win32/libwin32/service.cpp:359 -#: src/win32/libwin32/service.cpp:363 -msgid "The Bacula service: " -msgstr "El servicio Bacula:" +#~ msgid "The Bacula service: " +#~ msgstr "El servicio Bacula:" -#: src/win32/libwin32/service.cpp:284 -msgid "" -"Provides file backup and restore services. Bacula -- the network backup " -"solution." -msgstr "" -"Proporciona servicios de copia de seguridad y restauración. Bacula - la " -"solución de copia de seguridad de red." +#~ msgid "" +#~ "Provides file backup and restore services. Bacula -- the network backup " +#~ "solution." +#~ msgstr "" +#~ "Proporciona servicios de copia de seguridad y restauración. Bacula - la " +#~ "solución de copia de seguridad de red." -#: src/win32/libwin32/service.cpp:295 -msgid "Cannot write System Registry for " -msgstr "No se puede escribir Registro de Sistema para" +#~ msgid "Cannot write System Registry for " +#~ msgstr "No se puede escribir Registro de Sistema para" -#: src/win32/libwin32/service.cpp:296 -msgid "" -"The System Registry could not be updated - the Bacula service was not " -"installed" -msgstr "" -"El Registro del Sistema no ha podido ser actualizado - el servicio Bacula no " -"se ha instalado" +#~ msgid "" +#~ "The System Registry could not be updated - the Bacula service was not " +#~ "installed" +#~ msgstr "" +#~ "El Registro del Sistema no ha podido ser actualizado - el servicio Bacula " +#~ "no se ha instalado" -#: src/win32/libwin32/service.cpp:305 -msgid "Cannot add Bacula key to System Registry" -msgstr "No se puede agregar clave Bacula al Registro del Sistema" +#~ msgid "Cannot add Bacula key to System Registry" +#~ msgstr "No se puede agregar clave Bacula al Registro del Sistema" -#: src/win32/libwin32/service.cpp:316 -msgid "The " -msgstr "El" +#~ msgid "The " +#~ msgstr "El" -#: src/win32/libwin32/service.cpp:370 #, fuzzy -msgid "An existing Bacula service: " -msgstr "Un servicio Bacula existente:" +#~ msgid "An existing Bacula service: " +#~ msgstr "Un servicio Bacula existente:" -#: src/win32/libwin32/service.cpp:378 -msgid "" -"The service Manager could not be contacted - the Bacula service was not " -"removed" -msgstr "" -"El Administrador de Servicio no puedo ser contactado - El Servicio Bacula no " -"se elimino" +#~ msgid "" +#~ "The service Manager could not be contacted - the Bacula service was not " +#~ "removed" +#~ msgstr "" +#~ "El Administrador de Servicio no puedo ser contactado - El Servicio Bacula " +#~ "no se elimino" -#: src/win32/libwin32/service.cpp:391 -msgid "" -"Could not find registry entry.\n" -"Service probably not registerd - the Bacula service was not removed" -msgstr "" -"No se pudo encontrar la entrada del Registro.\n" -"Servicio probablemente no Registrado - el servicio de Bacula no se ha quitado" +#~ msgid "" +#~ "Could not find registry entry.\n" +#~ "Service probably not registerd - the Bacula service was not removed" +#~ msgstr "" +#~ "No se pudo encontrar la entrada del Registro.\n" +#~ "Servicio probablemente no Registrado - el servicio de Bacula no se ha " +#~ "quitado" -#: src/win32/libwin32/service.cpp:398 -msgid "Could not delete Registry key for " -msgstr "No se pudo borrar la clave del Registro para" +#~ msgid "Could not delete Registry key for " +#~ msgstr "No se pudo borrar la clave del Registro para" -#: src/win32/libwin32/service.cpp:408 -msgid "Bacula could not be contacted, probably not running" -msgstr "Bacula no pudo ser contactado, probablemente no se está ejecutando" +#~ msgid "Bacula could not be contacted, probably not running" +#~ msgstr "Bacula no pudo ser contactado, probablemente no se está ejecutando" -#: src/win32/libwin32/service.cpp:415 -msgid "The Bacula service has been removed" -msgstr "El servicio Bacula se ha eliminado" +#~ msgid "The Bacula service has been removed" +#~ msgstr "El servicio Bacula se ha eliminado" -#: src/win32/libwin32/service.cpp:456 -msgid "SetServiceStatus failed" -msgstr "SetServiceStatus fallido" +#~ msgid "SetServiceStatus failed" +#~ msgstr "SetServiceStatus fallido" -#: src/win32/libwin32/service.cpp:482 -#, c-format -msgid "" -"\n" -"\n" -"%s error: %ld at %s:%d" -msgstr "" -"\n" -"\n" -"%s error: %ld en %s:%d" +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "%s error: %ld at %s:%d" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "%s error: %ld en %s:%d" -#: src/win32/libwin32/service.cpp:558 -#, c-format -msgid "Locked by: %s, duration: %ld seconds\n" -msgstr "Bloqueado por: %s, duración: %ld segundos\n" +#~ msgid "Locked by: %s, duration: %ld seconds\n" +#~ msgstr "Bloqueado por: %s, duración: %ld segundos\n" -#: src/win32/libwin32/service.cpp:562 -#, c-format -msgid "No longer locked\n" -msgstr "Ya no está bloqueado\n" +#~ msgid "No longer locked\n" +#~ msgstr "Ya no está bloqueado\n" -#: src/win32/libwin32/service.cpp:566 -msgid "Could not lock database" -msgstr "No se pudo bloquear la base de datos" +#~ msgid "Could not lock database" +#~ msgstr "No se pudo bloquear la base de datos" #~ msgid "" #~ "\n" diff --git a/bacula/po/es_AR.po b/bacula/po/es_AR.po index 6cf12cb964..a83038d172 100644 --- a/bacula/po/es_AR.po +++ b/bacula/po/es_AR.po @@ -1,7 +1,7 @@ # Spanish translations for branch package # Traducciones al español para el paquete branch. -# Copyright (C) 2000-1015 Kern Sibbald -# License: BSD 2-Clause +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # msgid "" msgstr "" @@ -597,7 +597,7 @@ msgstr "" #: src/console/console.c:102 #, c-format msgid "" -"Copyright (C) 2000-2005 Kern Sibbald\n" +"Copyright (C) 2000-2015 Kern Sibbald "\n" "Version: " msgstr "" @@ -1204,7 +1204,7 @@ msgstr "" #: src/dird/dird.c:71 #, c-format msgid "" -"Copyright (C) 2000-2005 Kern Sibbald.\n" +"Copyright (C) 2000-2015 Kern Sibbald "\n" "Version: %s (%s)\n" "\n" @@ -5443,7 +5443,7 @@ msgstr "" #: src/filed/filed.c:62 #, c-format msgid "" -"Copyright (C) 2000-2005 Kern Sibbald\n" +"Copyright (C) 2000-2015 Kern Sibbald "\n" "Version: %s (%s)\n" "\n" @@ -6279,7 +6279,7 @@ msgstr "" #: src/gnome2-console/console.c:88 #, c-format msgid "" -"Copyright (C) 2002-2005 Kern Sibbald\n" +"Copyright (C) 2000-2015 Kern Sibbald "\n" "Version: %s (%s) %s %s %s\n" "\n" @@ -8852,7 +8852,7 @@ msgstr "" #: src/stored/bcopy.c:58 #, c-format msgid "" -"Copyright (C) 2002-2005 Kern Sibbald.\n" +"Copyright (C) 2000-2015 Kern Sibbald "\n" "Version: %s (%s)\n" "\n" @@ -8923,7 +8923,7 @@ msgstr "" #: src/stored/bextract.c:70 #, c-format msgid "" -"Copyright (C) 2000-2005 Kern Sibbald.\n" +"Copyright (C) 2000-2015 Kern Sibbald "\n" "Version: %s (%s)\n" "\n" @@ -9170,7 +9170,7 @@ msgstr "" #: src/stored/bls.c:68 #, c-format msgid "" -"Copyright (C) 2000-2005 Kern Sibbald.\n" +"Copyright (C) 2000-2015 Kern Sibbald "\n" "Version: %s (%s)\n" "\n" @@ -9266,7 +9266,7 @@ msgstr "" #: src/stored/bscan.c:109 #, c-format msgid "" -"Copyright (C) 2001-2005 Kern Sibbald.\n" +"Copyright (C) 2000-2015 Kern Sibbald "\n" "Version: %s (%s)\n" "\n" @@ -10883,7 +10883,7 @@ msgstr "" #: src/stored/btape.c:2596 #, c-format msgid "" -"Copyright (C) 2000-2005 Kern Sibbald.\n" +"Copyright (C) 2000-2015 Kern Sibbald "\n" "Version: %s (%s)\n" "\n" @@ -12489,7 +12489,7 @@ msgstr "" #: src/stored/stored.c:65 #, c-format msgid "" -"Copyright (C) 2000-2005 Kern Sibbald.\n" +"Copyright (C) 2000-2015 Kern Sibbald "\n" "Version: %s (%s)\n" "\n" @@ -13220,7 +13220,7 @@ msgstr "" #: src/tray-monitor/tray-monitor.c:102 #, c-format msgid "" -"Copyright (C) 2000-2004 Kern Sibbald and John Walker\n" +"Copyright (C) 2000-2015 Kern Sibbald "Written by Nicolas Boichat (2004)\n" "\n" "Version: %s (%s) %s %s %s\n" @@ -13321,7 +13321,7 @@ msgstr "" #: src/tray-monitor/tray-monitor.c:503 src/tray-monitor/tray-monitor.c:513 msgid "" -"Copyright (C) 2004-2005 Kern Sibbald\n" +"Copyright (C) 2000-2015 Kern Sibbald "Written by Nicolas Boichat\n" msgstr "" diff --git a/bacula/po/fi.po b/bacula/po/fi.po index ebe23a2986..15ad48aa2d 100644 --- a/bacula/po/fi.po +++ b/bacula/po/fi.po @@ -1,6 +1,6 @@ # Finnish translations for branch package. -# Copyright (C) 2000-1015 Kern Sibbald -# License: BSD 2-Clause +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # msgid "" msgstr "" diff --git a/bacula/po/fr.po b/bacula/po/fr.po index b2cfa73b39..95520270b9 100644 --- a/bacula/po/fr.po +++ b/bacula/po/fr.po @@ -2,13 +2,13 @@ # Traduction anglaise du package Bacula. # Copyright (C) 2000-2015 Kern Sibbald # Nicolas Boichat , 2005. -# License: BSD 2-Clause +# License: BSD 2-Clause; see file LICENSE-FOSS # msgid "" msgstr "" "Project-Id-Version: Bacula 1.38\n" "Report-Msgid-Bugs-To: bacula-devel@lists.sourceforge.net\n" -"POT-Creation-Date: 2015-05-21 11:42+0200\n" +"POT-Creation-Date: 2015-08-09 15:05+0200\n" "PO-Revision-Date: 2009-10-18 14:04+0000\n" "Last-Translator: Eric Bollengier \n" "Language-Team: French \n" @@ -18,19961 +18,8473 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: examples/nagios/check_bacula/check_bacula.c:57 -#, c-format -msgid "" -"Copyright (C) 2005 Christian Masopust\n" -"Written by Christian Masopust (2005)\n" -"\n" -"Version: " -msgstr "" - -#: src/baconfig.h:61 src/baconfig.h:62 src/baconfig.h:67 src/baconfig.h:68 -#: src/baconfig.h:79 src/baconfig.h:80 +#: src/baconfig.h:64 src/baconfig.h:65 src/baconfig.h:70 src/baconfig.h:71 +#: src/baconfig.h:82 src/baconfig.h:83 #, c-format msgid "Failed ASSERT: %s\n" msgstr "" -#: src/baconfig.h:88 src/dird/ua_dotcmds.c:1675 src/dird/ua_dotcmds.c:1683 -#: src/dird/ua_run.c:810 src/dird/ua_run.c:1863 src/dird/ua_run.c:1890 -#: src/dird/ua_run.c:1921 src/dird/ua_run.c:1948 src/dird/ua_run.c:1986 -#: src/dird/ua_select.c:622 src/dird/ua_select.c:642 src/dird/ua_update.c:364 +#: src/baconfig.h:91 msgid "*None*" msgstr "" -#: src/cats/cats.c:132 src/cats/mysql.c:408 src/cats/postgresql.c:529 -#: src/cats/postgresql.c:579 src/cats/sqlite.c:478 -#, c-format -msgid "Query failed: %s: ERR=%s\n" -msgstr "" - -#: src/cats/cats_null.c:30 -msgid "Please replace this null libbaccats library with a proper one.\n" -msgstr "" - -#: src/cats/mysql.c:91 -msgid "A user name for MySQL must be supplied.\n" -msgstr "Un nom d'utilisateur MySQL doit être fourni.\n" - -#: src/cats/mysql.c:178 src/cats/postgresql.c:232 src/cats/sqlite.c:177 -#, c-format -msgid "Unable to initialize DB lock. ERR=%s\n" -msgstr "Impossible d'initialiser le verrou sur la base. ERR=%s\n" - -#: src/cats/mysql.c:221 -#, c-format +#: src/lib/status.h:78 msgid "" -"Unable to connect to MySQL server.\n" -"Database=%s User=%s\n" -"MySQL connect failed either server not running or your authorization is " -"incorrect.\n" -msgstr "" -"Impossible de se connecter au serveur MySQL.\n" -"Base=%s Utilisateur=%s\n" -"Le serveur n'est pas démarré ou bien votre password est invalide.\n" - -#: src/cats/mysql.c:385 src/cats/postgresql.c:476 src/cats/sqlite.c:402 -#: src/dird/fd_cmds.c:926 src/dird/fd_cmds.c:987 -#, c-format -msgid "Attribute create error. %s" +"\n" +"Terminated Jobs:\n" msgstr "" +"\n" +"Job terminés :\n" -#: src/cats/postgresql.c:103 -msgid "A user name for PostgreSQL must be supplied.\n" -msgstr "Un nom d'utilisateur PostgreSQL doit être fourni.\n" +#: src/lib/status.h:85 +msgid " JobId Level Files Bytes Status Finished Name \n" +msgstr " JobId Type Fichiers Octets Statut Terminé Nom\n" -#: src/cats/postgresql.c:187 src/cats/sql.c:336 src/cats/sql.c:343 -#: src/cats/sql_create.c:550 src/cats/sql_get.c:199 src/cats/sql_get.c:570 -#: src/cats/sql_get.c:780 src/cats/sql_get.c:1096 src/cats/sql_get.c:1468 -#, c-format -msgid "error fetching row: %s\n" -msgstr "" +#: src/lib/status.h:87 +msgid "===================================================================\n" +msgstr "===================================================================\n" -#: src/cats/postgresql.c:203 -#, c-format -msgid "Encoding error for database \"%s\". Wanted SQL_ASCII, got %s\n" -msgstr "" +#: src/lib/status.h:107 +msgid "Created" +msgstr "Crée" -#: src/cats/postgresql.c:268 -#, fuzzy, c-format -msgid "" -"Unable to connect to PostgreSQL server. Database=%s User=%s\n" -"Possible causes: SQL server not running; password incorrect; max_connections " -"exceeded.\n" -msgstr "" -"Impossible de se connecter au serveur PostgreSQL.\n" -"Base=%s Utilisateur=%s\n" -"Le serveur n'est pas démarré ou bien votre password est invalide.\n" +#: src/lib/status.h:111 +msgid "Error" +msgstr "Erreur" -#: src/cats/postgresql.c:372 -msgid "PQescapeStringConn returned non-zero.\n" +#: src/lib/status.h:114 +msgid "Diffs" msgstr "" -#: src/cats/postgresql.c:390 -msgid "PQescapeByteaConn returned NULL.\n" -msgstr "" +#: src/lib/status.h:117 +msgid "Cancel" +msgstr "Annulé" -#: src/cats/postgresql.c:421 -msgid "PQunescapeByteaConn returned NULL.\n" -msgstr "" +#: src/lib/status.h:120 +msgid "OK" +msgstr "OK" -#: src/cats/postgresql.c:536 -#, fuzzy, c-format -msgid "Fetch failed: ERR=%s\n" -msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" +#: src/lib/status.h:123 +msgid "OK -- with warnings" +msgstr "OK -- avec des avertissements" -#: src/cats/postgresql.c:839 -#, c-format -msgid "error fetching currval: %s\n" +#: src/lib/status.h:126 +msgid "Incomplete" msgstr "" -#: src/cats/postgresql.c:1030 -#, fuzzy, c-format -msgid "error starting batch mode: %s" -msgstr "erreur en terminant le mode batch: %s\n" - -#: src/cats/postgresql.c:1059 src/cats/postgresql.c:1066 -#, fuzzy, c-format -msgid "error ending batch mode: %s" -msgstr "erreur en terminant le mode batch: %s\n" +#: src/lib/status.h:129 +msgid "Other" +msgstr "Autre" -#: src/cats/postgresql.c:1115 +#: src/lib/status.h:141 #, fuzzy, c-format -msgid "error copying in batch mode: %s" -msgstr "erreur en terminant le mode batch: %s\n" +msgid "%6d\t%-6s\t%8s\t%10s\t%-7s\t%-8s\t%s\n" +msgstr "%6d %-6s %8s %10s %-7s %-8s %s\n" -#: src/cats/sql.c:185 +#: src/lib/status.h:149 #, c-format -msgid "" -"Potential performance problem:\n" -"max_connections=%d set for %s database \"%s\" should be larger than " -"Director's MaxConcurrentJobs=%d\n" -msgstr "" +msgid "%6d %-6s %8s %10s %-7s %-8s %s\n" +msgstr "%6d %-6s %8s %10s %-7s %-8s %s\n" -#: src/cats/sql.c:229 -#, c-format -msgid "" -"query %s failed:\n" -"%s\n" -msgstr "" +#: src/lib/status.h:178 src/lib/status.h:189 src/lib/status.h:203 +#: src/lib/status.h:207 src/lib/status.h:211 +msgid "Bacula " +msgstr "Bacula " -#: src/cats/sql.c:250 +#: src/qt-console/bat_conf.cpp:133 #, c-format -msgid "" -"insert %s failed:\n" -"%s\n" +msgid "No record for %d %s\n" msgstr "" -#: src/cats/sql.c:262 +#: src/qt-console/bat_conf.cpp:142 #, c-format -msgid "Insertion problem: affected_rows=%s\n" +msgid "Director: name=%s address=%s DIRport=%d\n" msgstr "" -#: src/cats/sql.c:280 +#: src/qt-console/bat_conf.cpp:146 +#, fuzzy, c-format +msgid "Console: name=%s\n" +msgstr "Console connecté à %s\n" + +#: src/qt-console/bat_conf.cpp:149 +#: src/qt-console/tray-monitor/tray_conf.cpp:187 #, c-format -msgid "" -"update %s failed:\n" -"%s\n" +msgid "ConsoleFont: name=%s font face=%s\n" msgstr "" -#: src/cats/sql.c:290 +#: src/qt-console/bat_conf.cpp:153 src/qt-console/bat_conf.cpp:234 +#: src/qt-console/bat_conf.cpp:284 src/qt-console/bat_conf.cpp:314 #, c-format -msgid "Update failed: affected_rows=%s for %s\n" +msgid "Unknown resource type %d\n" msgstr "" -#: src/cats/sql.c:310 +#: src/qt-console/bat_conf.cpp:262 +#: src/qt-console/tray-monitor/tray_conf.cpp:280 #, c-format -msgid "" -"delete %s failed:\n" -"%s\n" +msgid "%s item is required in %s resource, but not found.\n" msgstr "" -#: src/cats/sql.c:396 +#: src/qt-console/bat_conf.cpp:331 +#: src/qt-console/tray-monitor/tray_conf.cpp:364 #, c-format -msgid "Path length is zero. File=%s\n" +msgid "Attempt to define second %s resource named \"%s\" is not permitted.\n" msgstr "" -#: src/cats/sql.c:610 -msgid "No results to list.\n" -msgstr "Liste vide.\n" - -#: src/cats/sql.c:751 -#, fuzzy -msgid "Could not init database batch connection\n" -msgstr "Impossible d'initialiser le Python\n" +#: src/qt-console/bcomm/dircomm.cpp:89 +#, fuzzy, c-format +msgid "Already connected\"%s\".\n" +msgstr "Console connecté à %s\n" -#: src/cats/sql.c:757 +#: src/qt-console/bcomm/dircomm.cpp:100 +#: src/qt-console/tray-monitor/tray-monitor.cpp:353 #, fuzzy, c-format -msgid "Could not open database \"%s\": ERR=%s\n" -msgstr "Impossible d'ouvrir la base de données \"%s\".\n" +msgid "Connecting to Director %s:%d" +msgstr "Connexion au Director %s:%d\n" -#: src/cats/sql.c:857 +#: src/qt-console/bcomm/dircomm.cpp:102 +#, fuzzy, c-format msgid "" -"Your database is no longer functional. This is most likely due to\n" -"the fact that your Bacula Enterprise Edition period has expired.\n" -"You can continue testing by re-initializing the catalog database orcontact " -"Bacula Systems to order a subscription.\n" -msgstr "" - -#: src/cats/sql_create.c:82 -#, c-format -msgid "Create DB Job record %s failed. ERR=%s\n" -msgstr "" +"Connecting to Director %s:%d\n" +"\n" +msgstr "Connexion au Director %s:%d\n" -#: src/cats/sql_create.c:125 +#: src/qt-console/bcomm/dircomm.cpp:154 #, c-format -msgid "Create JobMedia record %s failed: ERR=%s\n" -msgstr "" +msgid "Failed to initialize TLS context for Console \"%s\".\n" +msgstr "Impossible d'initialiser le contexte TLS pour la Console \"%s\".\n" -#: src/cats/sql_create.c:134 +#: src/qt-console/bcomm/dircomm.cpp:177 #, c-format -msgid "Update Media record %s failed: ERR=%s\n" -msgstr "" +msgid "Failed to initialize TLS context for Director \"%s\".\n" +msgstr "Impossible d'initialiser le contexte TLS pour le Director \"%s\".\n" -#: src/cats/sql_create.c:164 -#, c-format -msgid "pool record %s already exists\n" -msgstr "Le pool %s existe déjà en base\n" +#: src/qt-console/bcomm/dircomm.cpp:199 +#: src/qt-console/tray-monitor/tray-monitor.cpp:358 +#, fuzzy +msgid "Director daemon" +msgstr "Director" -#: src/cats/sql_create.c:196 -#, c-format -msgid "Create db Pool record %s failed: ERR=%s\n" +#: src/qt-console/bcomm/dircomm.cpp:237 +msgid "Initializing ..." msgstr "" -#: src/cats/sql_create.c:225 -#, c-format -msgid "Device record %s already exists\n" -msgstr "Le device %s existe déjà en base\n" +#: src/qt-console/bcomm/dircomm.cpp:253 src/qt-console/console/console.cpp:134 +#, fuzzy +msgid "Connected" +msgstr "Connexion...\n" -#: src/cats/sql_create.c:241 -#, c-format -msgid "Create db Device record %s failed: ERR=%s\n" -msgstr "" +#: src/qt-console/bcomm/dircomm.cpp:377 +#, fuzzy +msgid "Command completed ..." +msgstr "Commande annulée.\n" -#: src/cats/sql_create.c:274 -#, c-format -msgid "More than one Storage record!: %d\n" +#: src/qt-console/bcomm/dircomm.cpp:384 src/qt-console/console/console.cpp:371 +msgid "Processing command ..." msgstr "" -#: src/cats/sql_create.c:279 -#, c-format -msgid "error fetching Storage row: %s\n" +#: src/qt-console/bcomm/dircomm.cpp:391 +msgid "At main prompt waiting for input ..." msgstr "" -#: src/cats/sql_create.c:299 -#, c-format -msgid "Create DB Storage record %s failed. ERR=%s\n" +#: src/qt-console/bcomm/dircomm.cpp:398 src/qt-console/bcomm/dircomm.cpp:408 +msgid "At prompt waiting for input ..." msgstr "" -#: src/cats/sql_create.c:330 -#, c-format -msgid "mediatype record %s already exists\n" -msgstr "" +#: src/qt-console/bcomm/dircomm.cpp:416 +#, fuzzy +msgid "Command failed." +msgstr "Commande annulée.\n" -#: src/cats/sql_create.c:346 -#, c-format -msgid "Create db mediatype record %s failed: ERR=%s\n" -msgstr "" +#: src/qt-console/bcomm/dircomm.cpp:488 +#, fuzzy +msgid "Director disconnected." +msgstr "Connexion du director le %s\n" -#: src/cats/sql_create.c:384 -#, c-format -msgid "Volume \"%s\" already exists.\n" -msgstr "Le volume \"%s\" existe déjà en base.\n" +#: src/qt-console/bcomm/dircomm_auth.cpp:111 +#, fuzzy, c-format +msgid "Director authorization problem at \"%s:%d\"\n" +msgstr "Pas d'enregistrement trouvé en base pour : %s\n" -#: src/cats/sql_create.c:429 +#: src/qt-console/bcomm/dircomm_auth.cpp:118 #, c-format -msgid "Create DB Media record %s failed. ERR=%s\n" +msgid "" +"Authorization problem: Remote server at \"%s:%d\" did not advertise required " +"TLS support.\n" msgstr "" -#: src/cats/sql_create.c:478 +#: src/qt-console/bcomm/dircomm_auth.cpp:126 #, c-format -msgid "More than one Client!: %d\n" +msgid "" +"Authorization problem with Director at \"%s:%d\": Remote server requires " +"TLS.\n" msgstr "" -#: src/cats/sql_create.c:483 -#, c-format -msgid "error fetching Client row: %s\n" -msgstr "" +#: src/qt-console/bcomm/dircomm_auth.cpp:137 +#, fuzzy, c-format +msgid "TLS negotiation failed with Director at \"%s:%d\"\n" +msgstr "Négociation TLS échouée avec le SD \"%s:%d\".\n" -#: src/cats/sql_create.c:510 -#, c-format -msgid "Create DB Client record %s failed. ERR=%s\n" -msgstr "" +#: src/qt-console/bcomm/dircomm_auth.cpp:149 +#, fuzzy, c-format +msgid "" +"Bad response to Hello command: ERR=%s\n" +"The Director at \"%s:%d\" is probably not running.\n" +msgstr "Mauvaise réponse à la commande Hello : ERR=%s\n" -#: src/cats/sql_create.c:543 src/cats/sql_get.c:192 -#, c-format -msgid "More than one Path!: %s for path: %s\n" -msgstr "" +#: src/qt-console/bcomm/dircomm_auth.cpp:158 +#, fuzzy, c-format +msgid "Director at \"%s:%d\" rejected Hello command\n" +msgstr "Le File Daemon \"%s:%d\" a rejeté la commande Hello\n" -#: src/cats/sql_create.c:576 -#, c-format -msgid "Create db Path record %s failed. ERR=%s\n" +#: src/qt-console/bcomm/dircomm_auth.cpp:173 +#, fuzzy, c-format +msgid "" +"Authorization problem with Director at \"%s:%d\"\n" +"Most likely the passwords do not agree.\n" +"If you are using TLS, there may have been a certificate validation error " +"during the TLS handshake.\n" +"For help, please see " msgstr "" +"Problème d'authentification avec le director.\n" +"Le plus souvent, les mots de pass ne correspondent pas.\n" +"Si vous utilisez TLS, il peut y avoir une erreur de validation du " +"certificat\n" +"pendant l'initialisation de la connexion TLS.\n" +"Vous trouverez de l'aide sur\n" +"http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors\n" -#: src/cats/sql_create.c:621 -#, c-format -msgid "Create DB Counters record %s failed. ERR=%s\n" +#: src/qt-console/main.cpp:159 +msgid "Cryptography library initialization failed.\n" msgstr "" -#: src/cats/sql_create.c:657 +#: src/qt-console/main.cpp:163 #, c-format -msgid "More than one FileSet!: %d\n" +msgid "Please correct configuration file: %s\n" +msgstr "Merci de corriger le fichier de configuration : %s\n" + +#: src/qt-console/main.cpp:187 +#, fuzzy, c-format +msgid "" +"\n" +"Version: %s (%s) %s %s %s\n" +"\n" +"Usage: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" +" -c set configuration file to file\n" +" -dnn set debug level to nn\n" +" -s no signals\n" +" -t test - read configuration and exit\n" +" -? print this message.\n" +"\n" msgstr "" +") %s %s %s\n" +"\n" +"Usage : bconsole [-s] [-c config_file] [-d niveau_debug]\n" +" -c set configuration file to file\n" +" -dnn set debug level to nn\n" +" -s no signals\n" +" -t test - lecture de la configuration et sortie\n" +"\n" -#: src/cats/sql_create.c:662 -#, c-format -msgid "error fetching FileSet row: ERR=%s\n" +#: src/qt-console/main.cpp:220 src/qt-console/main.cpp:250 +msgid "TLS required but not configured in Bacula.\n" msgstr "" -#: src/cats/sql_create.c:692 +#: src/qt-console/main.cpp:228 #, c-format -msgid "Create DB FileSet record %s failed. ERR=%s\n" +msgid "" +"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " +"Director \"%s\" in %s. At least one CA certificate store is required.\n" msgstr "" -#: src/cats/sql_create.c:930 +#: src/qt-console/main.cpp:237 #, c-format -msgid "Create db File record %s failed. ERR=%s" +msgid "" +"No Director resource defined in %s\n" +"Without that I don't how to speak to the Director :-(\n" msgstr "" +"Pas de director défini pour %s\n" +"Sans cette définition, il n'est pas possible de se connecter à celui-ci.\n" -#: src/cats/sql_create.c:953 +#: src/qt-console/main.cpp:258 #, c-format -msgid "Attempt to put non-attributes into catalog. Stream=%d\n" +msgid "" +"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " +"Console \"%s\" in %s.\n" msgstr "" -#: src/cats/sql_create.c:969 -msgid "Cannot Copy/Migrate job using BaseJob.\n" +#: src/qt-console/tray-monitor/authenticate.cpp:79 +#, fuzzy +msgid "" +"Director authorization problem.\n" +"Most likely the passwords do not agree.\n" +"For help, please see " msgstr "" +"Problème d'authentification avec le director.\n" +"Le plus souvent, les mots de pass ne correspondent pas.\n" +"Vous trouverez de l'aide sur\n" +"http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors\n" -#: src/cats/sql_create.c:1069 src/cats/sql_get.c:1196 -msgid "ERR=JobIds are empty\n" -msgstr "" +#: src/qt-console/tray-monitor/authenticate.cpp:88 +#, c-format +msgid "Bad response to Hello command: ERR=%s\n" +msgstr "Mauvaise réponse à la commande Hello : ERR=%s\n" -#: src/cats/sql_create.c:1122 -#, fuzzy, c-format -msgid "Create db Object record %s failed. ERR=%s" -msgstr "fopen %s en erreur : ERR=%s\n" +#: src/qt-console/tray-monitor/authenticate.cpp:95 +msgid "Director rejected Hello command\n" +msgstr "Le director a rejeté la commande Hello\n" -#: src/cats/sql_delete.c:60 +#: src/qt-console/tray-monitor/authenticate.cpp:123 #, c-format -msgid "No pool record %s exists\n" +msgid "Error sending Hello to Storage daemon. ERR=%s\n" msgstr "" -#: src/cats/sql_delete.c:65 -#, c-format -msgid "Expecting one pool record, got %d\n" +#: src/qt-console/tray-monitor/authenticate.cpp:129 +#, fuzzy +msgid "" +"Director and Storage daemon passwords or names not the same.\n" +"For help, please see " msgstr "" +"Le mot de passe ou le nom du Director et du Client ne sont pas identiques.\n" -#: src/cats/sql_delete.c:71 -#, c-format -msgid "Error fetching row %s\n" +#: src/qt-console/tray-monitor/authenticate.cpp:136 +#, fuzzy, c-format +msgid "bdird set configuration file to file\n" +" -d set debug level to \n" +" -dt print timestamp in debug output\n" +" -t test - read configuration and exit\n" +" -? print this message.\n" +"\n" msgstr "" +") %s %s %s\n" +"\n" +"Usage : bconsole [-s] [-c config_file] [-d niveau_debug]\n" +" -c set configuration file to file\n" +" -dnn set debug level to nn\n" +" -s no signals\n" +" -t test - lecture de la configuration et sortie\n" +"\n" -#: src/cats/sql_get.c:155 +#: src/qt-console/tray-monitor/tray-monitor.cpp:210 #, c-format -msgid "File record for PathId=%s Filename=%s not found.\n" +msgid "" +"Error: %d Monitor resources defined in %s. You must define one and only one " +"Monitor resource.\n" msgstr "" -#: src/cats/sql_get.c:161 -msgid "File record not found in Catalog.\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:242 +#, fuzzy, c-format +msgid "" +"No Client, Storage or Director resource defined in %s\n" +"Without that I don't how to get status from the File, Storage or Director " +"Daemon :-(\n" msgstr "" +"Pas de director défini pour %s\n" +"Sans cette définition, il n'est pas possible de se connecter à celui-ci.\n" -#: src/cats/sql_get.c:203 +#: src/qt-console/tray-monitor/tray-monitor.cpp:257 #, c-format -msgid "Get DB path record %s found bad record: %s\n" +msgid "" +"Invalid refresh interval defined in %s\n" +"This value must be greater or equal to 1 second and less or equal to 10 " +"minutes (read value: %d).\n" msgstr "" -#: src/cats/sql_get.c:216 +#: src/qt-console/tray-monitor/tray-monitor.cpp:325 #, c-format -msgid "Path record: %s not found.\n" +msgid "Error, currentitem is not a Client or a Storage..\n" msgstr "" -#: src/cats/sql_get.c:220 -#, c-format -msgid "Path record: %s not found in Catalog.\n" -msgstr "" +#: src/qt-console/tray-monitor/tray-monitor.cpp:363 +#, fuzzy, c-format +msgid "Connecting to Client %s:%d" +msgstr "Connexion au client %s (%s:%d)\n" -#: src/cats/sql_get.c:259 -#, c-format -msgid "No Job found for JobId %s\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:368 +msgid "File daemon" msgstr "" -#: src/cats/sql_get.c:330 src/cats/sql_get.c:385 -#, c-format -msgid "No volumes found for JobId=%d\n" -msgstr "" +#: src/qt-console/tray-monitor/tray-monitor.cpp:373 +#, fuzzy, c-format +msgid "Connecting to Storage %s:%d" +msgstr "Connexion au Director %s:%d\n" -#: src/cats/sql_get.c:336 src/cats/sql_get.c:396 -#, c-format -msgid "Error fetching row %d: ERR=%s\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:378 +msgid "Storage daemon" msgstr "" -#: src/cats/sql_get.c:350 +#: src/qt-console/tray-monitor/tray-monitor.cpp:382 +#: src/qt-console/tray-monitor/tray-monitor.cpp:412 #, c-format -msgid "No Volume for JobId %d found in Catalog.\n" +msgid "Error, currentitem is not a Client, a Storage or a Director..\n" msgstr "" -#: src/cats/sql_get.c:489 -#, c-format -msgid "Pool id select failed: ERR=%s\n" -msgstr "" +#: src/qt-console/tray-monitor/tray-monitor.cpp:387 +#, fuzzy +msgid "Cannot connect to daemon." +msgstr "Impossible de se connecter au démon Storage\n" -#: src/cats/sql_get.c:526 -#, c-format -msgid "Client id select failed: ERR=%s\n" -msgstr "" +#: src/qt-console/tray-monitor/tray-monitor.cpp:396 +#, fuzzy, c-format +msgid "Authentication error : %s" +msgstr "Erreur sur l'autochangeur : ERR=%s\n" -#: src/cats/sql_get.c:565 -#, c-format -msgid "More than one Pool! Num=%s\n" -msgstr "" +#: src/qt-console/tray-monitor/tray-monitor.cpp:403 +#, fuzzy +msgid "Opened connection with Director daemon." +msgstr "Impossible de se connecter au Storage daemon.\n" -#: src/cats/sql_get.c:628 -msgid "Pool record not found in Catalog.\n" -msgstr "" +#: src/qt-console/tray-monitor/tray-monitor.cpp:406 +#, fuzzy +msgid "Opened connection with File daemon." +msgstr "Impossible de se connecter au client.\n" -#: src/cats/sql_get.c:691 -#, c-format -msgid "Error got %s RestoreObjects but expected only one!\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:409 +#, fuzzy +msgid "Opened connection with Storage daemon." +msgstr "Impossible de se connecter au Storage daemon.\n" + +#: src/qt-console/tray-monitor/tray-monitor.cpp:460 +msgid "Error : BNET_HARDEOF or BNET_ERROR" msgstr "" -#: src/cats/sql_get.c:696 -#, fuzzy, c-format -msgid "RestoreObject record \"%d\" not found.\n" -msgstr "le client \"%s\" est introuvable.\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:469 +#, fuzzy +msgid "Error : Connection closed." +msgstr "Connexion...\n" -#: src/cats/sql_get.c:721 src/dird/ua_run.c:703 +#: src/qt-console/tray-monitor/tray_conf.cpp:160 #, c-format -msgid "Decompression failed. Len wanted=%d got=%d. Object=%s\n" +msgid "No %s resource defined\n" msgstr "" -#: src/cats/sql_get.c:739 -msgid "RestoreObject record not found in Catalog.\n" +#: src/qt-console/tray-monitor/tray_conf.cpp:169 +#, c-format +msgid "Monitor: name=%s FDtimeout=%s SDtimeout=%s\n" msgstr "" -#: src/cats/sql_get.c:775 +#: src/qt-console/tray-monitor/tray_conf.cpp:175 #, c-format -msgid "More than one Client!: %s\n" +msgid "Director: name=%s address=%s FDport=%d\n" msgstr "" -#: src/cats/sql_get.c:792 src/cats/sql_get.c:796 -msgid "Client record not found in Catalog.\n" -msgstr "" +#: src/qt-console/tray-monitor/tray_conf.cpp:179 +#, fuzzy, c-format +msgid "Client: name=%s address=%s FDport=%d\n" +msgstr "Client \"%s\" adresse positionné à %s\n" -#: src/cats/sql_get.c:821 +#: src/qt-console/tray-monitor/tray_conf.cpp:183 #, c-format -msgid "More than one Counter!: %d\n" +msgid "Storage: name=%s address=%s SDport=%d\n" msgstr "" -#: src/cats/sql_get.c:826 +#: src/qt-console/tray-monitor/tray_conf.cpp:191 #, c-format -msgid "error fetching Counter row: %s\n" +msgid "Unknown resource type %d in dump_resource.\n" msgstr "" -#: src/cats/sql_get.c:846 +#: src/qt-console/tray-monitor/tray_conf.cpp:249 #, c-format -msgid "Counter record: %s not found in Catalog.\n" +msgid "Unknown resource type %d in free_resource.\n" msgstr "" -#: src/cats/sql_get.c:884 +#: src/qt-console/tray-monitor/tray_conf.cpp:286 #, c-format -msgid "Error got %s FileSets but expected only one!\n" -msgstr "" +msgid "Too many items in %s resource\n" +msgstr "Trop d'élément dans la ressource %s\n" -#: src/cats/sql_get.c:889 +#: src/qt-console/tray-monitor/tray_conf.cpp:306 +#: src/qt-console/tray-monitor/tray_conf.cpp:344 #, c-format -msgid "FileSet record \"%s\" not found.\n" +msgid "Unknown resource type %d in save_resource.\n" msgstr "" -#: src/cats/sql_get.c:899 -msgid "FileSet record not found in Catalog.\n" -msgstr "" +#~ msgid "A user name for MySQL must be supplied.\n" +#~ msgstr "Un nom d'utilisateur MySQL doit être fourni.\n" -#: src/cats/sql_get.c:998 -#, c-format -msgid "Media id select failed: ERR=%s\n" -msgstr "" +#~ msgid "Unable to initialize DB lock. ERR=%s\n" +#~ msgstr "Impossible d'initialiser le verrou sur la base. ERR=%s\n" -#: src/cats/sql_get.c:1036 -#, fuzzy, c-format -msgid "query dbids failed: ERR=%s\n" -msgstr "fopen %s en erreur : ERR=%s\n" +#~ msgid "" +#~ "Unable to connect to MySQL server.\n" +#~ "Database=%s User=%s\n" +#~ "MySQL connect failed either server not running or your authorization is " +#~ "incorrect.\n" +#~ msgstr "" +#~ "Impossible de se connecter au serveur MySQL.\n" +#~ "Base=%s Utilisateur=%s\n" +#~ "Le serveur n'est pas démarré ou bien votre password est invalide.\n" -#: src/cats/sql_get.c:1091 -#, c-format -msgid "More than one Volume!: %s\n" -msgstr "" +#~ msgid "A user name for PostgreSQL must be supplied.\n" +#~ msgstr "Un nom d'utilisateur PostgreSQL doit être fourni.\n" -#: src/cats/sql_get.c:1150 -#, fuzzy, c-format -msgid "Media record with MediaId=%s not found.\n" -msgstr "%s ressource %s introuvable.\n" +#, fuzzy +#~ msgid "" +#~ "Unable to connect to PostgreSQL server. Database=%s User=%s\n" +#~ "Possible causes: SQL server not running; password incorrect; " +#~ "max_connections exceeded.\n" +#~ msgstr "" +#~ "Impossible de se connecter au serveur PostgreSQL.\n" +#~ "Base=%s Utilisateur=%s\n" +#~ "Le serveur n'est pas démarré ou bien votre password est invalide.\n" -#: src/cats/sql_get.c:1153 -#, fuzzy, c-format -msgid "Media record for Volume name \"%s\" not found.\n" -msgstr "Le nouveau volume \"%s\" existe déjà en base.\n" +#, fuzzy +#~ msgid "Fetch failed: ERR=%s\n" +#~ msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" -#: src/cats/sql_get.c:1160 -#, c-format -msgid "Media record for MediaId=%u not found in Catalog.\n" -msgstr "" +#, fuzzy +#~ msgid "error starting batch mode: %s" +#~ msgstr "erreur en terminant le mode batch: %s\n" -#: src/cats/sql_get.c:1163 -#, fuzzy, c-format -msgid "Media record for Volume Name \"%s\" not found in Catalog.\n" -msgstr "Le nouveau volume \"%s\" existe déjà en base.\n" +#, fuzzy +#~ msgid "error ending batch mode: %s" +#~ msgstr "erreur en terminant le mode batch: %s\n" -#: src/cats/sql_get.c:1463 -#, c-format -msgid "More than one Snapshot!: %s\n" -msgstr "" +#, fuzzy +#~ msgid "error copying in batch mode: %s" +#~ msgstr "erreur en terminant le mode batch: %s\n" -#: src/cats/sql_get.c:1492 src/cats/sql_get.c:1502 -#, fuzzy, c-format -msgid "Snapshot record with SnapshotId=%s not found.\n" -msgstr "%s ressource %s introuvable.\n" +#~ msgid "No results to list.\n" +#~ msgstr "Liste vide.\n" -#: src/cats/sql_get.c:1495 src/cats/sql_get.c:1505 -#, fuzzy, c-format -msgid "Snapshot record for Snapshot name \"%s\" not found.\n" -msgstr "Le nouveau volume \"%s\" existe déjà en base.\n" +#, fuzzy +#~ msgid "Could not init database batch connection\n" +#~ msgstr "Impossible d'initialiser le Python\n" -#: src/cats/sql_list.c:45 -#, c-format -msgid "Query failed: %s\n" -msgstr "Erreur sur la requête : %s\n" +#, fuzzy +#~ msgid "Could not open database \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir la base de données \"%s\".\n" -#: src/cats/sql_list.c:314 -msgid "These JobIds have copies as follows:\n" -msgstr "" +#~ msgid "pool record %s already exists\n" +#~ msgstr "Le pool %s existe déjà en base\n" -#: src/cats/sql_list.c:316 -msgid "The catalog contains copies as follows:\n" -msgstr "" +#~ msgid "Device record %s already exists\n" +#~ msgstr "Le device %s existe déjà en base\n" -#: src/cats/sqlite.c:192 -#, c-format -msgid "Database %s does not exist, please create it.\n" -msgstr "" +#~ msgid "Volume \"%s\" already exists.\n" +#~ msgstr "Le volume \"%s\" existe déjà en base.\n" -#: src/cats/sqlite.c:214 -#, c-format -msgid "Unable to open Database=%s. ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Create db Object record %s failed. ERR=%s" +#~ msgstr "fopen %s en erreur : ERR=%s\n" -#: src/cats/sqlite.c:215 -msgid "unknown" -msgstr "inconnu" +#~ msgid "No prior Full backup Job record found.\n" +#~ msgstr "Pas de précédent backup Full en base.\n" -#: src/console/authenticate.c:119 src/dird/authenticate.c:122 -msgid "" -"Authorization problem: Remote server did not advertise required TLS " -"support.\n" -msgstr "" +#~ msgid "Unknown Job level=%d\n" +#~ msgstr "Niveau de job inconnu %d\n" -#: src/console/authenticate.c:126 src/dird/authenticate.c:129 -#: src/filed/authenticate.c:102 src/filed/authenticate.c:208 -#: src/stored/authenticate.c:94 src/stored/authenticate.c:187 -#: src/stored/authenticate.c:295 -msgid "Authorization problem: Remote server requires TLS.\n" -msgstr "" +#~ msgid "No Job found for: %s.\n" +#~ msgstr "Pas de job trouvé pour : %s.\n" -#: src/console/authenticate.c:135 -msgid "TLS negotiation failed\n" -msgstr "" +#~ msgid "No Job found for: %s\n" +#~ msgstr "Pas de job trouvé pour %s\n" -#: src/console/authenticate.c:149 -#: src/qt-console/tray-monitor/authenticate.cpp:85 -#, c-format -msgid "Bad response to Hello command: ERR=%s\n" -msgstr "Mauvaise réponse à la commande Hello : ERR=%s\n" +#, fuzzy +#~ msgid "Request for Volume item %d greater than max %d or less than 1\n" +#~ msgstr "Le slot %d est ignoré car il est supérieur au maximum %d.\n" -#: src/console/authenticate.c:156 -#: src/qt-console/tray-monitor/authenticate.cpp:92 -msgid "Director rejected Hello command\n" -msgstr "Le director a rejeté la commande Hello\n" +#~ msgid "No Volume record found for item %d.\n" +#~ msgstr "Pas de volume trouvé en base pour l'objet %d.\n" -#: src/console/authenticate.c:174 #, fuzzy -msgid "" -"Director authorization problem.\n" -"Most likely the passwords do not agree.\n" -"If you are using TLS, there may have been a certificate validation error " -"during the TLS handshake.\n" -"For help, please see " -msgstr "" -"Problème d'authentification avec le director.\n" -"Le plus souvent, les mots de pass ne correspondent pas.\n" -"Si vous utilisez TLS, il peut y avoir une erreur de validation du " -"certificat\n" -"pendant l'initialisation de la connexion TLS.\n" -"Vous trouverez de l'aide sur\n" -"http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors\n" - -#: src/console/bbconsjson.c:79 src/console/console.c:118 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: " -msgstr "" -"\n" -"Version : " +#~ msgid "RestoreObject record \"%d\" not found.\n" +#~ msgstr "le client \"%s\" est introuvable.\n" -#: src/console/bbconsjson.c:152 src/dird/bdirjson.c:141 -#: src/filed/bfdjson.c:116 src/stored/bsdjson.c:126 -#, fuzzy, c-format -msgid "Please use valid -l argument: %s\n" -msgstr "FileSet" - -#: src/console/bbconsjson.c:213 src/console/console.c:1157 -#: src/dird/bdirjson.c:235 src/dird/dird.c:283 src/dird/dird.c:311 -#: src/dird/dird.c:548 src/dird/dird.c:551 src/filed/bfdjson.c:199 -#: src/filed/filed.c:210 src/qt-console/main.cpp:161 src/stored/bsdjson.c:211 -#: src/stored/stored.c:236 -#, c-format -msgid "Please correct configuration file: %s\n" -msgstr "Merci de corriger le fichier de configuration : %s\n" +#, fuzzy +#~ msgid "query dbids failed: ERR=%s\n" +#~ msgstr "fopen %s en erreur : ERR=%s\n" -#: src/console/bbconsjson.c:430 src/console/bbconsjson.c:461 -#: src/console/console.c:1347 src/console/console.c:1377 -#: src/dird/bdirjson.c:1163 src/dird/bdirjson.c:1201 src/dird/bdirjson.c:1256 -#: src/dird/dird.c:688 src/dird/dird.c:906 src/dird/dird.c:961 -#: src/dird/dird.c:1168 src/filed/bfdjson.c:483 src/filed/bfdjson.c:526 -#: src/filed/filed.c:379 src/filed/filed.c:579 src/qt-console/main.cpp:218 -#: src/qt-console/main.cpp:248 src/stored/bsdjson.c:494 -#: src/stored/stored.c:362 -msgid "TLS required but not configured in Bacula.\n" -msgstr "" +#, fuzzy +#~ msgid "Media record with MediaId=%s not found.\n" +#~ msgstr "%s ressource %s introuvable.\n" -#: src/console/bbconsjson.c:439 src/console/console.c:1355 -#: src/qt-console/main.cpp:226 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Director \"%s\" in %s. At least one CA certificate store is required.\n" -msgstr "" +#, fuzzy +#~ msgid "Media record for Volume name \"%s\" not found.\n" +#~ msgstr "Le nouveau volume \"%s\" existe déjà en base.\n" -#: src/console/bbconsjson.c:448 src/console/console.c:1364 -#: src/qt-console/main.cpp:235 -#, c-format -msgid "" -"No Director resource defined in %s\n" -"Without that I don't how to speak to the Director :-(\n" -msgstr "" -"Pas de director défini pour %s\n" -"Sans cette définition, il n'est pas possible de se connecter à celui-ci.\n" +#, fuzzy +#~ msgid "Media record for Volume Name \"%s\" not found in Catalog.\n" +#~ msgstr "Le nouveau volume \"%s\" existe déjà en base.\n" -#: src/console/bbconsjson.c:468 src/console/console.c:1384 -#: src/qt-console/main.cpp:256 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Console \"%s\" in %s.\n" -msgstr "" +#, fuzzy +#~ msgid "Snapshot record with SnapshotId=%s not found.\n" +#~ msgstr "%s ressource %s introuvable.\n" -#: src/console/console.c:170 -msgid "input from file" -msgstr "" +#, fuzzy +#~ msgid "Snapshot record for Snapshot name \"%s\" not found.\n" +#~ msgstr "Le nouveau volume \"%s\" existe déjà en base.\n" -#: src/console/console.c:171 -msgid "output to file" -msgstr "" +#~ msgid "Query failed: %s\n" +#~ msgstr "Erreur sur la requête : %s\n" -#: src/console/console.c:172 -msgid "quit" -msgstr "quit" +#~ msgid "unknown" +#~ msgstr "inconnu" -#: src/console/console.c:173 -msgid "output to file and terminal" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Director authorization problem.\n" +#~ "Most likely the passwords do not agree.\n" +#~ "If you are using TLS, there may have been a certificate validation error " +#~ "during the TLS handshake.\n" +#~ "For help, please see " +#~ msgstr "" +#~ "Problème d'authentification avec le director.\n" +#~ "Le plus souvent, les mots de pass ne correspondent pas.\n" +#~ "Si vous utilisez TLS, il peut y avoir une erreur de validation du " +#~ "certificat\n" +#~ "pendant l'initialisation de la connexion TLS.\n" +#~ "Vous trouverez de l'aide sur\n" +#~ "http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors\n" -#: src/console/console.c:174 -msgid "sleep specified time" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: " +#~ msgstr "" +#~ "\n" +#~ "Version : " -#: src/console/console.c:175 -msgid "print current time" -msgstr "affiche la date courante" +#, fuzzy +#~ msgid "Please use valid -l argument: %s\n" +#~ msgstr "FileSet" -#: src/console/console.c:176 -msgid "print Console's version" -msgstr "" +#~ msgid "quit" +#~ msgstr "quit" -#: src/console/console.c:177 -msgid "echo command string" -msgstr "" +#~ msgid "print current time" +#~ msgstr "affiche la date courante" -#: src/console/console.c:178 #, fuzzy -msgid "encode command string" -msgstr "Erreur sur la commande : %s\n" - -#: src/console/console.c:179 -msgid "execute an external command" -msgstr "" +#~ msgid "encode command string" +#~ msgstr "Erreur sur la commande : %s\n" -#: src/console/console.c:180 -msgid "exit = quit" -msgstr "exit = quit" +#~ msgid "exit = quit" +#~ msgstr "exit = quit" -#: src/console/console.c:181 #, fuzzy -msgid "send a file to the director" -msgstr "Impossible de se connecter au Director\n" - -#: src/console/console.c:182 -msgid "zed_keys = use zed keys instead of bash keys" -msgstr "" +#~ msgid "send a file to the director" +#~ msgstr "Impossible de se connecter au Director\n" -#: src/console/console.c:183 -msgid "help listing" -msgstr "" +#~ msgid ": is an invalid command\n" +#~ msgstr "%s : est une commande invalide.\n" -#: src/console/console.c:185 -msgid "set command separator" -msgstr "" +#, fuzzy +#~ msgid "Illegal separator character.\n" +#~ msgstr "Caractère illégal \"%c\" dans le nom.\n" -#: src/console/console.c:219 -msgid ": is an invalid command\n" -msgstr "%s : est une commande invalide.\n" +#, fuzzy +#~ msgid "Command logic problem\n" +#~ msgstr "Commande annulée.\n" -#: src/console/console.c:714 #, fuzzy -msgid "Illegal separator character.\n" -msgstr "Caractère illégal \"%c\" dans le nom.\n" +#~ msgid "Can't find %s in Director list\n" +#~ msgstr "Impossible de trouver la ressource Director \"%s\"\n" -#: src/console/console.c:747 #, fuzzy -msgid "Command logic problem\n" -msgstr "Commande annulée.\n" +#~ msgid "%s is not a number. You must enter a number between 1 and %d\n" +#~ msgstr "Vous devez saisir un nombre entre 1 et %d\n" -#: src/console/console.c:962 -#, fuzzy, c-format -msgid "Can't find %s in Director list\n" -msgstr "Impossible de trouver la ressource Director \"%s\"\n" +#~ msgid "You must enter a number between 1 and %d\n" +#~ msgstr "Vous devez saisir un nombre entre 1 et %d\n" -#: src/console/console.c:970 -msgid "Available Directors:\n" -msgstr "" +#~ msgid "Connecting to Director %s:%d\n" +#~ msgstr "Connexion au Director %s:%d\n" -#: src/console/console.c:974 -#, c-format -msgid "%2d: %s at %s:%d\n" -msgstr "" +#~ msgid "Enter a period to cancel a command.\n" +#~ msgstr "Tapez un point (.) pour annuler une commande.\n" -#: src/console/console.c:978 -msgid "Select Director by entering a number: " -msgstr "" +#~ msgid "Too many arguments on input command.\n" +#~ msgstr "Trop d'arguments sur la commande.\n" -#: src/console/console.c:985 -#, fuzzy, c-format -msgid "%s is not a number. You must enter a number between 1 and %d\n" -msgstr "Vous devez saisir un nombre entre 1 et %d\n" +#~ msgid "First argument to input command must be a filename.\n" +#~ msgstr "Le premier argument de la commande doit être un fichier.\n" -#: src/console/console.c:992 -#, c-format -msgid "You must enter a number between 1 and %d\n" -msgstr "Vous devez saisir un nombre entre 1 et %d\n" +#~ msgid "Cannot open file %s for input. ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s pour lecture. ERR=%s\n" -#: src/console/console.c:1153 src/dird/dird.c:279 src/filed/filed.c:205 -#: src/qt-console/main.cpp:157 src/stored/stored.c:232 -#: src/stored/test-dedup.c:836 src/stored/tune-dde.c:330 -msgid "Cryptography library initialization failed.\n" -msgstr "" +#~ msgid "Cannot open file %s for output. ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s pour la sortie. ERR=%s\n" -#: src/console/console.c:1188 -#, c-format -msgid "Connecting to Director %s:%d\n" -msgstr "Connexion au Director %s:%d\n" +#~ msgid "Too many arguments. Enclose command in double quotes.\n" +#~ msgstr "" +#~ "Trop d'arguments sur la commande. Essayez d'utiliser des \"\"\" autour " +#~ "des commandes\n" -#: src/console/console.c:1205 src/qt-console/bcomm/dircomm.cpp:151 -#, c-format -msgid "Failed to initialize TLS context for Console \"%s\".\n" -msgstr "Impossible d'initialiser le contexte TLS pour la Console \"%s\".\n" +#, fuzzy +#~ msgid "Cannot popen(\"%s\", \"r\"): ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/console/console.c:1225 src/qt-console/bcomm/dircomm.cpp:174 -#, c-format -msgid "Failed to initialize TLS context for Director \"%s\".\n" -msgstr "Impossible d'initialiser le contexte TLS pour le Director \"%s\".\n" +#, fuzzy +#~ msgid "@exec error: ERR=%s\n" +#~ msgstr "erreur de fermeture : ERR=%s\n" -#: src/console/console.c:1259 -msgid "Enter a period to cancel a command.\n" -msgstr "Tapez un point (.) pour annuler une commande.\n" +#, fuzzy +#~ msgid "Error getting Job record for Job report: ERR=%s" +#~ msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" -#: src/console/console.c:1410 -msgid "Too many arguments on input command.\n" -msgstr "Trop d'arguments sur la commande.\n" +#~ msgid "Admin OK" +#~ msgstr "Admin OK" -#: src/console/console.c:1414 -msgid "First argument to input command must be a filename.\n" -msgstr "Le premier argument de la commande doit être un fichier.\n" +#~ msgid "*** Admin Error ***" +#~ msgstr "*** Admin en Erreur ***" -#: src/console/console.c:1420 -#, c-format -msgid "Cannot open file %s for input. ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier %s pour lecture. ERR=%s\n" +#~ msgid "Admin Canceled" +#~ msgstr "Admin Annulé" -#: src/console/console.c:1452 -msgid "Too many arguments on output/tee command.\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Director unable to authenticate with Storage daemon at \"%s:%d\". " +#~ "Possible causes:\n" +#~ "Passwords or names not the same or\n" +#~ "Maximum Concurrent Jobs exceeded on the SD or\n" +#~ "SD networking messed up (restart daemon).\n" +#~ "For help, please see: " +#~ msgstr "" +#~ "Le Director a rencontré un problème d'authentification avec le Storage " +#~ "Daemon \"%s:%d\".\n" +#~ "Les causes possibles sont :\n" +#~ "- Les mots de pass ne correspondent pas ;\n" +#~ "- Le nombre maximum de job concurrent est atteint sur le SD ;\n" +#~ "- La connexion réseau du SD est tombée (il faut le redémarrer).\n" +#~ "Vous trouverez de l'aide sur\n" +#~ "http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors\n" -#: src/console/console.c:1469 -#, c-format -msgid "Cannot open file %s for output. ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier %s pour la sortie. ERR=%s\n" +#, fuzzy +#~ msgid "TLS negotiation failed with SD at \"%s:%d\"\n" +#~ msgstr "Négociation TLS échouée avec le SD \"%s:%d\".\n" -#: src/console/console.c:1488 -msgid "Too many arguments. Enclose command in double quotes.\n" -msgstr "" -"Trop d'arguments sur la commande. Essayez d'utiliser des \"\"\" autour des " -"commandes\n" +#~ msgid "bdird get resource type \n" +#~ " -n get resource \n" +#~ " -l get only directives matching dirs (use with -r)\n" +#~ " -D get only data\n" +#~ " -R do not apply JobDefs to Job\n" +#~ " -c set configuration file to file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -t test - read configuration and exit\n" +#~ " -s output in show text format\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Version : %s (%s)\n" +#~ "\n" +#~ "Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c utilise fich comme fichier de configuration\n" +#~ " -d positionne le niveau de debug à nn\n" +#~ " -dt affiche un timestamp devant chaque ligne de debug\n" +#~ " -f reste en avant-plan (pour debugger)\n" +#~ " -g groupid\n" +#~ " -r lance maintenant\n" +#~ " -s pas de signaux\n" +#~ " -t test - lit seulement le fichier de configuration\n" +#~ " -u userid\n" +#~ " -v affiche les messages utilisateurs\n" +#~ " -? affiche ce message.\n" +#~ "\n" -#: src/dird/authenticate.c:260 -#, fuzzy, c-format -msgid "TLS negotiation failed with FD at \"%s:%d\".\n" -msgstr "Négociation TLS échouée avec le FD \"%s:%d\".\n" +#~ msgid "No storage specified in Job \"%s\" nor in Pool.\n" +#~ msgstr "Pas de Storage spécifié dans le job \"%s\" ni dans le Pool.\n" -#: src/dird/authenticate.c:272 -#: src/qt-console/tray-monitor/authenticate.cpp:179 -#, c-format -msgid "Bad response from File daemon to Hello command: ERR=%s\n" -msgstr "" +#~ msgid "Unable to create bootstrap file %s. ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/dird/authenticate.c:274 -#, fuzzy, c-format -msgid "Bad response from File daemon at \"%s:%d\" to Hello command: ERR=%s\n" -msgstr "" -"Mauvaise réponse du File Daemon \"%s:%d\" à la commande Hello : ERR=%s\n" +#, fuzzy +#~ msgid "No files found to read. No bootstrap file written.\n" +#~ msgstr "" +#~ "Aucun fichier trouvé pour la restauration/migration. Pas de fichier " +#~ "Bootstrap écrit.\n" -#: src/dird/authenticate.c:283 -#: src/qt-console/tray-monitor/authenticate.cpp:186 -msgid "File daemon rejected Hello command\n" -msgstr "Le Client a rejeté la commande Hello\\n\n" +#~ msgid "Error writing bsr file.\n" +#~ msgstr "Erreur pendant l'écriture du fichier bsr.\n" -#: src/dird/authenticate.c:284 -#, fuzzy, c-format -msgid "File daemon at \"%s:%d\" rejected Hello command\n" -msgstr "Le File Daemon \"%s:%d\" a rejeté la commande Hello\n" +#, fuzzy +#~ msgid "" +#~ "The Job will require the following (*=>InChanger):\n" +#~ " Volume(s) Storage(s) SD Device(s)\n" +#~ "===========================================================================\n" +#~ msgstr "" +#~ "Ce job va utiliser les éléments suivants :\n" +#~ " Volume(s) Storage(s) SD Device(s)\n" +#~ "===========================================================================\n" -#: src/dird/authenticate.c:316 -#, c-format -msgid "UA Hello from %s:%s:%d is invalid. Len=%d\n" -msgstr "" +#~ msgid "No Volumes found to restore.\n" +#~ msgstr "Aucun volume trouvé pour la restauration.\n" -#: src/dird/authenticate.c:324 -#, c-format -msgid "UA Hello from %s:%s:%d is invalid. Got: %s\n" -msgstr "" +#~ msgid "1990 Invalid Catalog Request: %s" +#~ msgstr "1990 Requête sur le Catalogue Invalide : %s" -#: src/dird/authenticate.c:398 -msgid "" -"Authorization problem: Remote client did not advertise required TLS " -"support.\n" -msgstr "" +#~ msgid "Invalid Catalog request; DB not open: %s" +#~ msgstr "Requête sur le Catalogue invalide ; la base n'est pas ouverte : %s" -#: src/dird/authenticate.c:406 -msgid "Authorization problem: Remote client requires TLS.\n" -msgstr "" +#, fuzzy +#~ msgid "Pool \"%s\" not found for SD find media request.\n" +#~ msgstr "La ressource Pool \"%s\" est introuvable pour le volume \"%s\"\n" -#: src/dird/authenticate.c:421 src/filed/authenticate.c:111 -#: src/filed/authenticate.c:217 src/stored/authenticate.c:304 -msgid "TLS negotiation failed.\n" -msgstr "" +#~ msgid "1901 No Media.\n" +#~ msgstr "1901 Pas de Media.\n" -#: src/dird/authenticate.c:435 -#, c-format -msgid "Unable to authenticate console \"%s\" at %s:%s:%d.\n" -msgstr "" +#~ msgid "not in Pool" +#~ msgstr "non présent dans le Pool" -#: src/dird/authenticate.c:440 -#, fuzzy, c-format -msgid "1000 OK: %d %s %sVersion: %s (%s)\n" -msgstr "1000 OK: %s Version: %s (%s)\n" +#~ msgid "is not Enabled" +#~ msgstr "n'est pas activé (Enabled)" -#: src/dird/autoprune.c:65 -msgid "" -"End auto prune.\n" -"\n" -msgstr "" -"Fin de la purge automatique.\n" -"\n" +#, fuzzy +#~ msgid "1998 Volume \"%s\" catalog status is %s, %s.\n" +#~ msgstr "1998 Le statut du Volume \"%s\" est %s, %s.\n" -#: src/dird/backup.c:97 src/dird/job.c:199 src/dird/job.c:1220 -#: src/dird/job.c:1497 src/dird/job.c:1544 src/dird/job.c:1568 -#: src/dird/mac.c:216 src/dird/mac.c:217 src/dird/vbackup.c:78 -msgid "Pool resource" -msgstr "Ressource Pool" +#~ msgid "1997 Volume \"%s\" not in catalog.\n" +#~ msgstr "1997 le Volume \"%s\" n'est pas dans le catalogue.\n" -#: src/dird/backup.c:100 -msgid "No Storage specification found in Job or Pool.\n" -msgstr "Pas de Storage défini dans le Job ou le Pool.\n" +#~ msgid "Unable to get Media record for Volume %s: ERR=%s\n" +#~ msgstr "" +#~ "Impossible de récupérer les informations du Media pour le Volume %s : ERR=" +#~ "%s\n" -#: src/dird/backup.c:261 -#, fuzzy, c-format -msgid "Using BaseJobId(s): %s\n" -msgstr "Migration utilisant JobId=%s Job=%s\n" +#~ msgid "1993 Update Media error\n" +#~ msgstr "1993 Erreur sur la mise à jour du Media\n" -#: src/dird/backup.c:271 #, fuzzy -msgid "Cannot find previous jobids.\n" -msgstr "Impossible de trouver la ressource Job \"%s\"\n" +#~ msgid "1992 Create JobMedia error\n" +#~ msgstr "1991 Erreur sur la mise à jour du JobMedia\n" -#: src/dird/backup.c:286 -msgid "Sending Accurate information to the FD.\n" -msgstr "" +#, fuzzy +#~ msgid "Attribute create error: ERR=%s" +#~ msgstr "Erreur sur l'autochangeur : ERR=%s\n" -#: src/dird/backup.c:444 -#, fuzzy, c-format -msgid "Restart Incomplete Backup JobId %s, Job=%s\n" -msgstr "Démarrage du backup JobId %s, Job=%s\n" +#, fuzzy +#~ msgid "Restore object create error. %s" +#~ msgstr "Restauration annulée" -#: src/dird/backup.c:447 -#, c-format -msgid "Start Backup JobId %s, Job=%s\n" -msgstr "Démarrage du backup JobId %s, Job=%s\n" +#, fuzzy +#~ msgid "1994 Invalid Catalog Update: %s" +#~ msgstr "1990 Requête sur le Catalogue Invalide : %s" -#: src/dird/backup.c:463 -#, c-format -msgid "Found %ld files from prior incomplete Job.\n" -msgstr "" +#, fuzzy +#~ msgid "fread attr spool error. ERR=%s\n" +#~ msgstr "Erreur pendant l'écriture des attributs dans le spool. ERR=%s\n" -#: src/dird/backup.c:557 src/dird/restore.c:409 src/dird/verify.c:276 -msgid "The File daemon does not support SDCallsClient.\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bacula-dir [-f -s] [-c config_file] [-d debug_level] " +#~ "[config_file]\n" +#~ " -c set configuration file to file\n" +#~ " -d [,] set debug level to , debug tags to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -T set trace on\n" +#~ " -f run in foreground (for debugging)\n" +#~ " -g groupid\n" +#~ " -m print kaboom output (for debugging)\n" +#~ " -r run now\n" +#~ " -s no signals\n" +#~ " -t test - read configuration and exit\n" +#~ " -u userid\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Version : %s (%s)\n" +#~ "\n" +#~ "Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c utilise fich comme fichier de configuration\n" +#~ " -d positionne le niveau de debug à nn\n" +#~ " -dt affiche un timestamp devant chaque ligne de debug\n" +#~ " -f reste en avant-plan (pour debugger)\n" +#~ " -g groupid\n" +#~ " -r lance maintenant\n" +#~ " -s pas de signaux\n" +#~ " -t test - lit seulement le fichier de configuration\n" +#~ " -u userid\n" +#~ " -v affiche les messages utilisateurs\n" +#~ " -? affiche ce message.\n" +#~ "\n" -#: src/dird/backup.c:690 -#, c-format -msgid "Unexpected Client Job message: %s\n" -msgstr "" +#~ msgid "Resetting previous configuration.\n" +#~ msgstr "Retour à la dernière configuration.\n" -#: src/dird/backup.c:703 -#, c-format -msgid "Network error with FD during %s: ERR=%s\n" -msgstr "" +#~ msgid "Could not open Catalog \"%s\", database \"%s\".\n" +#~ msgstr "" +#~ "Impossible d'ouvrir le catalogue \"%s\", sur la base de données \"%s\".\n" -#: src/dird/backup.c:739 -msgid "No Job status returned from FD.\n" -msgstr "Impossible de récupérer le statut du Job depuis le FD.\n" +#~ msgid "%s" +#~ msgstr "%s" -#: src/dird/backup.c:808 src/dird/vbackup.c:369 -#, fuzzy, c-format -msgid "Error getting Client record for Job report: ERR=%s" -msgstr "Impossible de mettre à jour les informations du Volume : ERR=%s" +#, fuzzy +#~ msgid "Could not create storage record for %s\n" +#~ msgstr "Impossible de trouver la ressource Storage \"%s\"\n" -#: src/dird/backup.c:814 src/dird/mac.c:749 src/dird/vbackup.c:375 -#, c-format -msgid "Error getting Media record for Volume \"%s\": ERR=%s" -msgstr "" +#, fuzzy +#~ msgid "Could not update storage record for %s\n" +#~ msgstr "Impossible de trouver la ressource Storage \"%s\"\n" -#: src/dird/backup.c:824 src/dird/backup.c:833 src/dird/vbackup.c:385 -#: src/stored/bscan.c:1199 -msgid "Backup OK -- with warnings" -msgstr "Backup OK -- avec des erreurs" +#, fuzzy +#~ msgid "Could not compile regex pattern \"%s\" ERR=%s\n" +#~ msgstr "Impossible d'ouvrir %s : ERR=%s\n" -#: src/dird/backup.c:826 src/dird/vbackup.c:387 src/stored/bscan.c:1196 -msgid "Backup OK" -msgstr "Backup OK" +#, fuzzy +#~ msgid "Client: Name=%s Enabled=%d Address=%s FDport=%d MaxJobs=%u\n" +#~ msgstr "Client \"%s\" adresse positionné à %s\n" -#: src/dird/backup.c:830 -msgid "Backup failed -- incomplete" -msgstr "" +#~ msgid "Job" +#~ msgstr "Job" -#: src/dird/backup.c:837 src/dird/vbackup.c:392 src/stored/bscan.c:1203 -msgid "*** Backup Error ***" -msgstr "*** Backup en erreur ***" +#~ msgid "JobDefs" +#~ msgstr "JobDefs" -#: src/dird/backup.c:847 src/dird/vbackup.c:402 src/stored/bscan.c:1206 -msgid "Backup Canceled" -msgstr "Backup annulé" +#~ msgid " --> RegexWhere=%s\n" +#~ msgstr " --> RegexWhere=%s\n" -#: src/dird/backup.c:916 -#, c-format -msgid " Base files/Used files: %lld/%lld (%.2f%%)\n" -msgstr "" +#, fuzzy +#~ msgid " --> PluginOptions=%s\n" +#~ msgstr " --> RunOnSuccess=%u\n" -#: src/dird/backup.c:923 src/dird/mac.c:822 -#, c-format -msgid "meta: %s (%sB) aligned: %s (%sB)" -msgstr "" +#~ msgid " --> MaxRunTime=%u\n" +#~ msgstr " --> MaxRunTime=%u\n" -#: src/dird/backup.c:929 src/dird/mac.c:828 -#, fuzzy, c-format -msgid "%s (%sB)" -msgstr "Nouveau Fichier : %s\n" +#~ msgid " --> MaxWaitTime=%u\n" +#~ msgstr " --> MaxWaitTime=%u\n" -#: src/dird/backup.c:936 -#, fuzzy, c-format -msgid "" -"%s %s %s (%s):\n" -" Build OS: %s %s %s\n" -" JobId: %d\n" -" Job: %s\n" -" Backup Level: %s%s\n" -" Client: \"%s\" %s\n" -" FileSet: \"%s\" %s\n" -" Pool: \"%s\" (From %s)\n" -" Catalog: \"%s\" (From %s)\n" -" Storage: \"%s\" (From %s)\n" -" Scheduled time: %s\n" -" Start time: %s\n" -" End time: %s\n" -" Elapsed time: %s\n" -" Priority: %d\n" -" FD Files Written: %s\n" -" SD Files Written: %s\n" -" FD Bytes Written: %s (%sB)\n" -" SD Bytes Written: %s (%sB)\n" -" Rate: %.1f KB/s\n" -" Software Compression: %s\n" -" Comm Line Compression: %s\n" -"%s Snapshot/VSS: %s\n" -" Encryption: %s\n" -" Accurate: %s\n" -" Volume name(s): %s\n" -" Volume Session Id: %d\n" -" Volume Session Time: %d\n" -" Last Volume Bytes: %s\n" -" Non-fatal FD errors: %d\n" -" SD Errors: %d\n" -" FD termination status: %s\n" -" SD termination status: %s\n" -" Termination: %s\n" -"\n" -msgstr "" -"%s %s %s (%s): %s\n" -" Build OS : %s %s %s\n" -" JobId : %d\n" -" Job : %s\n" -" Niveau de backup : %s%s\n" -" Client : \"%s\" %s\n" -" FileSet : \"%s\" %s\n" -" Pool : \"%s\" (Depuis %s)\n" -" Catalog: \"%s\" (Depuis %s)\n" -" Storage : \"%s\" (Depuis %s)\n" -" Date prévue : %s\n" -" Date de début : %s\n" -" Date de fin : %s\n" -" Temps écoulé : %s\n" -" Priorité : %d\n" -" Fichiers écrits FD : %s\n" -" Fichiers écrits SD : %s\n" -" Octets écrits FD : %s (%so)\n" -" Octets écrits SD : %s (%so)\n" -" Débit : %.1f Ko/s\n" -" Compression logicielle : %s\n" -" VSS : %s\n" -" Cryptage : %s\n" -" Accurate : %s\n" -" Nom des Volumes : %s\n" -" Volume Session Id : %d\n" -" Volume Session date : %d\n" -" Taille du volume : %s (%so)\n" -" Erreurs FD non fatales : %d\n" -" Erreurs du SD : %d\n" -" Statut de fin du FD : %s\n" -" Statut de fin du SD : %s\n" -" Statut de fin : %s\n" -"\n" +#~ msgid " --> MaxStartDelay=%u\n" +#~ msgstr " --> MaxStartDelay=%u\n" -#: src/dird/backup.c:996 src/dird/backup.c:997 src/dird/backup.c:998 -#: src/dird/ua_input.c:142 src/dird/ua_run.c:188 src/dird/ua_run.c:833 -#: src/dird/ua_update.c:256 src/dird/ua_update.c:276 src/dird/ua_update.c:698 -#: src/stored/parse_bsr.c:828 src/tools/dbcheck.c:1124 -msgid "yes" -msgstr "oui" - -#: src/dird/backup.c:996 src/dird/backup.c:997 src/dird/backup.c:998 -#: src/dird/ua_input.c:146 src/dird/ua_run.c:191 src/dird/ua_run.c:837 -#: src/dird/ua_update.c:256 src/dird/ua_update.c:276 src/dird/ua_update.c:698 -#: src/stored/parse_bsr.c:828 -msgid "no" -msgstr "non" - -#: src/dird/backup.c:1039 -#, c-format -msgid "Could not get Job Volume Parameters to update Bootstrap file. ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid " --> MaxRunSchedTime=%u\n" +#~ msgstr " --> MaxRunTime=%u\n" -#: src/dird/backup.c:1075 -#, c-format -msgid "" -"Could not open WriteBootstrap file:\n" -"%s: ERR=%s\n" -msgstr "" -"Impossible d'ouvrir le fichier bootstrap (WriteBootstrap) :\n" -"%s : ERR=%s\n" +#, fuzzy +#~ msgid " --> Base %s\n" +#~ msgstr " --> Target=%s\n" -#: src/dird/bdirjson.c:69 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bdirjson [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -r get resource type \n" -" -n get resource \n" -" -l get only directives matching dirs (use with -r)\n" -" -D get only data\n" -" -R do not apply JobDefs to Job\n" -" -c set configuration file to file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -t test - read configuration and exit\n" -" -s output in show text format\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Version : %s (%s)\n" -"\n" -"Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c utilise fich comme fichier de configuration\n" -" -d positionne le niveau de debug à nn\n" -" -dt affiche un timestamp devant chaque ligne de debug\n" -" -f reste en avant-plan (pour debugger)\n" -" -g groupid\n" -" -r lance maintenant\n" -" -s pas de signaux\n" -" -t test - lit seulement le fichier de configuration\n" -" -u userid\n" -" -v affiche les messages utilisateurs\n" -" -? affiche ce message.\n" -"\n" +#~ msgid " --> RunScript\n" +#~ msgstr " --> RunScript\n" -#: src/dird/bdirjson.c:1141 src/dird/dird.c:666 -#, c-format -msgid "" -"No Director resource defined in %s\n" -"Without that I don't know who I am :-(\n" -msgstr "" +#~ msgid " --> Command=%s\n" +#~ msgstr " --> Command=%s\n" -#: src/dird/bdirjson.c:1149 src/dird/dird.c:674 src/filed/bfdjson.c:476 -#: src/filed/filed.c:341 -#, c-format -msgid "No Messages resource defined in %s\n" -msgstr "" +#~ msgid " --> Target=%s\n" +#~ msgstr " --> Target=%s\n" -#: src/dird/bdirjson.c:1154 src/dird/dird.c:679 -#, c-format -msgid "Only one Director resource permitted in %s\n" -msgstr "" +#~ msgid " --> RunOnSuccess=%u\n" +#~ msgstr " --> RunOnSuccess=%u\n" -#: src/dird/bdirjson.c:1171 src/dird/dird.c:696 src/filed/bfdjson.c:536 -#: src/filed/filed.c:589 src/stored/bsdjson.c:533 src/stored/stored.c:418 -#, c-format -msgid "\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n" -msgstr "" +#~ msgid " --> RunOnFailure=%u\n" +#~ msgstr " --> RunOnFailure=%u\n" -#: src/dird/bdirjson.c:1177 src/dird/dird.c:702 src/filed/bfdjson.c:542 -#: src/filed/filed.c:595 src/stored/bsdjson.c:539 src/stored/stored.c:424 -#, c-format -msgid "\"TLS Key\" file not defined for Director \"%s\" in %s.\n" -msgstr "" +#~ msgid " --> RunWhen=%u\n" +#~ msgstr " --> RunWhen=%u\n" -#: src/dird/bdirjson.c:1184 src/dird/dird.c:709 src/filed/bfdjson.c:548 -#: src/filed/filed.c:601 src/stored/bsdjson.c:545 src/stored/stored.c:430 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Director \"%s\" in %s. At least one CA certificate store is required when " -"using \"TLS Verify Peer\".\n" -msgstr "" +#, fuzzy +#~ msgid " --> IncrementalBackup" +#~ msgstr "Incrémental" -#: src/dird/bdirjson.c:1210 src/dird/dird.c:915 -#, c-format -msgid "\"TLS Certificate\" file not defined for Console \"%s\" in %s.\n" -msgstr "" +#, fuzzy +#~ msgid " --> DifferentialBackup" +#~ msgstr "Différentiel" -#: src/dird/bdirjson.c:1216 src/dird/dird.c:921 -#, c-format -msgid "\"TLS Key\" file not defined for Console \"%s\" in %s.\n" -msgstr "" +#, fuzzy +#~ msgid " MaxRunSchedTime=%u\n" +#~ msgstr " --> MaxRunTime=%u\n" -#: src/dird/bdirjson.c:1223 src/dird/dird.c:928 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Console \"%s\" in %s. At least one CA certificate store is required when " -"using \"TLS Verify Peer\".\n" -msgstr "" +#, fuzzy +#~ msgid " Priority=%u\n" +#~ msgstr "Priorité" -#: src/dird/bdirjson.c:1240 src/dird/dird.c:945 src/dird/dird.c:985 -#: src/filed/filed.c:404 -#, c-format -msgid "Failed to initialize TLS context for File daemon \"%s\" in %s.\n" -msgstr "" +#, fuzzy +#~ msgid " ScratchPool=%s\n" +#~ msgstr "Utilisation du Catalogue \"%s\"\n" -#: src/dird/bdirjson.c:1263 src/dird/dird.c:968 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"File daemon \"%s\" in %s.\n" -msgstr "" +#, fuzzy +#~ msgid " Catalog=%s\n" +#~ msgstr "Utilisation du Catalogue \"%s\"\n" -#: src/dird/bdirjson.c:1272 src/dird/dird.c:736 -#, c-format -msgid "No Job records defined in %s\n" -msgstr "" +#~ msgid "Cannot find Pool resource %s\n" +#~ msgstr "Impossible de trouver la ressource Pool \"%s\"\n" -#: src/dird/bdirjson.c:1339 src/dird/bdirjson.c:1352 src/dird/dird.c:805 -#: src/dird/dird.c:818 -#, c-format -msgid "Hey something is wrong. p=0x%lu\n" -msgstr "" +#~ msgid "Cannot find Console resource %s\n" +#~ msgstr "Impossible de trouver la ressource Console \"%s\"\n" -#: src/dird/bdirjson.c:1413 src/dird/dird.c:880 -#, c-format -msgid "\"%s\" directive in Job \"%s\" resource is required, but not found.\n" -msgstr "" +#~ msgid "Cannot find Director resource %s\n" +#~ msgstr "Impossible de trouver la ressource Director \"%s\"\n" -#: src/dird/bdirjson.c:1420 src/dird/dird.c:887 -msgid "Too many items in Job resource\n" -msgstr "" +#~ msgid "Cannot find Storage resource %s\n" +#~ msgstr "Impossible de trouver la ressource Storage \"%s\"\n" -#: src/dird/bdirjson.c:1424 src/dird/dird.c:891 -#, c-format -msgid "No storage specified in Job \"%s\" nor in Pool.\n" -msgstr "Pas de Storage spécifié dans le job \"%s\" ni dans le Pool.\n" +#~ msgid "Cannot find Job resource %s\n" +#~ msgstr "Impossible de trouver la ressource Job \"%s\"\n" -#: src/dird/bsr.c:190 -#, c-format -msgid "Unable to get Job record. ERR=%s\n" -msgstr "" +#~ msgid "Cannot find Counter resource %s\n" +#~ msgstr "Impossible de trouver la ressource Counter \"%s\"\n" -#: src/dird/bsr.c:201 -#, c-format -msgid "Unable to get Job Volume Parameters. ERR=%s\n" -msgstr "" +#~ msgid "Cannot find Client resource %s\n" +#~ msgstr "Impossible de trouver la ressource Client \"%s\"\n" -#: src/dird/bsr.c:249 -#, c-format -msgid "Unable to create bootstrap file %s. ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" +#~ msgid "Cannot find Schedule resource %s\n" +#~ msgstr "Impossible de trouver la ressource Schedule \"%s\"\n" -#: src/dird/bsr.c:258 #, fuzzy -msgid "No files found to read. No bootstrap file written.\n" -msgstr "" -"Aucun fichier trouvé pour la restauration/migration. Pas de fichier " -"Bootstrap écrit.\n" +#~ msgid "Expected one of: %s, got: %s" +#~ msgstr "Attendait %s, a pas : %s" -#: src/dird/bsr.c:262 -msgid "Error writing bsr file.\n" -msgstr "Erreur pendant l'écriture du fichier bsr.\n" +#, fuzzy +#~ msgid "Could not find Storage Resource %s referenced on line %d : %s\n" +#~ msgstr "Impossible de trouver la ressource \"%s\" utilisée ligne %d : %s\n" -#: src/dird/bsr.c:313 #, fuzzy -msgid "" -"The Job will require the following (*=>InChanger):\n" -" Volume(s) Storage(s) SD Device(s)\n" -"===========================================================================\n" -msgstr "" -"Ce job va utiliser les éléments suivants :\n" -" Volume(s) Storage(s) SD Device(s)\n" -"===========================================================================\n" +#~ msgid "" +#~ "Attempt to redefine Storage resource \"%s\" referenced on line %d : %s\n" +#~ msgstr "Impossible de trouver la ressource \"%s\" utilisée ligne %d : %s\n" -#: src/dird/bsr.c:333 -msgid "No Volumes found to restore.\n" -msgstr "Aucun volume trouvé pour la restauration.\n" +#~ msgid "Expected a Migration Job Type keyword, got: %s" +#~ msgstr "Attendait un type de Job de Migration, eu : %s" -#: src/dird/bsr.c:335 -msgid "" -"\n" -"Volumes marked with \"*\" are in the Autochanger.\n" -msgstr "" +#~ msgid "Expected a Job Level keyword, got: %s" +#~ msgstr "Attendait un niveau de sauvegarde, eu : %s" -#: src/dird/catreq.c:128 src/dird/catreq.c:382 -#, c-format -msgid "1990 Invalid Catalog Request: %s" -msgstr "1990 Requête sur le Catalogue Invalide : %s" +#~ msgid "Expected a Restore replacement option, got: %s" +#~ msgstr "Attendait un niveau de remplacement, eu : %s" -#: src/dird/catreq.c:129 -#, c-format -msgid "Invalid Catalog request; DB not open: %s" -msgstr "Requête sur le Catalogue invalide ; la base n'est pas ouverte : %s" +#~ msgid "Expect %s, got: %s" +#~ msgstr "Attendait %s, a pas : %s" -#: src/dird/catreq.c:150 -#, fuzzy, c-format -msgid "Pool \"%s\" not found for SD find media request.\n" -msgstr "La ressource Pool \"%s\" est introuvable pour le volume \"%s\"\n" +#~ msgid "Expecting open brace. Got %s" +#~ msgstr "Attendait {, eu : %s" -#: src/dird/catreq.c:159 -msgid "1901 No Media.\n" -msgstr "1901 Pas de Media.\n" +#~ msgid "Expecting keyword, got: %s\n" +#~ msgstr "Attendait un mot clef, eu : %s\n" -#: src/dird/catreq.c:191 -msgid "not in Pool" -msgstr "non présent dans le Pool" +#~ msgid "expected an equals, got: %s" +#~ msgstr "attendait un égale, eu : %s" -#: src/dird/catreq.c:193 -msgid "not correct MediaType" -msgstr "" +#, fuzzy +#~ msgid "Client: " +#~ msgstr "Client" -#: src/dird/catreq.c:203 -msgid "is not Enabled" -msgstr "n'est pas activé (Enabled)" +#~ msgid ", since=" +#~ msgstr ", depuis=" -#: src/dird/catreq.c:212 -#, fuzzy, c-format -msgid "1998 Volume \"%s\" catalog status is %s, %s.\n" -msgstr "1998 Le statut du Volume \"%s\" est %s, %s.\n" +#~ msgid "" +#~ "No prior or suitable Full backup found in catalog. Doing FULL backup.\n" +#~ msgstr "" +#~ "Pas de précédent backup Full utilisable. Lancement d'un backup FULL.\n" -#: src/dird/catreq.c:217 -#, c-format -msgid "1997 Volume \"%s\" not in catalog.\n" -msgstr "1997 le Volume \"%s\" n'est pas dans le catalogue.\n" +#~ msgid " (upgraded from %s)" +#~ msgstr " (à la place de %s)" -#: src/dird/catreq.c:244 -#, c-format -msgid "Unable to get Media record for Volume %s: ERR=%s\n" -msgstr "" -"Impossible de récupérer les informations du Media pour le Volume %s : ERR=" -"%s\n" +#, fuzzy +#~ msgid "" +#~ "No prior or suitable Differential backup found in catalog. Doing " +#~ "Differential backup.\n" +#~ msgstr "" +#~ "Pas de précédent backup Full utilisable. Lancement d'un backup FULL.\n" -#: src/dird/catreq.c:246 -#, c-format -msgid "1991 Catalog Request for vol=%s failed: %s" -msgstr "" +#~ msgid "Prior failed job found in catalog. Upgrading to %s.\n" +#~ msgstr "Le job précédent était en erreur. Passage au type %s.\n" -#: src/dird/catreq.c:273 -#, c-format -msgid "Attempt to set Volume Files from %u to %u for Volume \"%s\". Ignored.\n" -msgstr "" +#~ msgid "Cannot run program: %s. ERR=%s\n" +#~ msgstr "Impossible de lancer la commande : %s. ERR=%s\n" -#: src/dird/catreq.c:332 -#, c-format -msgid "Catalog error updating Media record. %s" -msgstr "" +#~ msgid "Error running program: %s. ERR=%s\n" +#~ msgstr "Erreur dans l'exécution de la commande : %s. ERR=%s\n" -#: src/dird/catreq.c:334 -msgid "1993 Update Media error\n" -msgstr "1993 Erreur sur la mise à jour du Media\n" +#~ msgid "Cannot open included file: %s. ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier inclus : %s. ERR=%s\n" -#: src/dird/catreq.c:361 -#, c-format -msgid "Catalog error creating JobMedia record. %s" -msgstr "" +#, fuzzy +#~ msgid "Client \"%s\" RunScript failed.\n" +#~ msgstr "le client \"%s\" est introuvable.\n" -#: src/dird/catreq.c:363 #, fuzzy -msgid "1992 Create JobMedia error\n" -msgstr "1991 Erreur sur la mise à jour du JobMedia\n" +#~ msgid "RestoreObject failed.\n" +#~ msgstr "restauration de fichier" -#: src/dird/catreq.c:383 -#, c-format -msgid "Invalid Catalog request: %s" -msgstr "" +#, fuzzy +#~ msgid "ComponentInfo failed.\n" +#~ msgstr "Commande annulée.\n" -#: src/dird/catreq.c:470 -#, fuzzy, c-format -msgid "Attribute create error: ERR=%s" -msgstr "Erreur sur l'autochangeur : ERR=%s\n" +#~ msgid "bget_dirmsg: unknown bnet signal %d\n" +#~ msgstr "bget_dirmsg : signal bnet inconnu %d\n" -#: src/dird/catreq.c:567 -#, fuzzy, c-format -msgid "Restore object create error. %s" -msgstr "Restauration annulée" +#~ msgid "Malformed message: %s\n" +#~ msgstr "Message mal formé : %s\n" -#: src/dird/catreq.c:574 -#, c-format -msgid "%s not same File=%d as attributes=%d\n" -msgstr "" +#~ msgid "Bad response to %s command: wanted %s, got %s\n" +#~ msgstr "Mauvaise réponse à la commande %s : voulait %s, pas %s\n" -#: src/dird/catreq.c:601 -#, c-format -msgid "Catalog error updating file digest. Unsupported digest stream type: %d" -msgstr "" +#~ msgid "Socket error on %s command: ERR=%s\n" +#~ msgstr "Erreur de socket sur la commande %s : ERR=%s\n" -#: src/dird/catreq.c:616 -#, c-format -msgid "attribute create error. %s" -msgstr "" +#, fuzzy +#~ msgid "Expected a strip path positive integer, got:%s:" +#~ msgstr "Attendait un entier positif, pas : %s\n" -#: src/dird/catreq.c:622 -#, c-format -msgid "Catalog error updating file digest. %s" -msgstr "" +#~ msgid "Expected a FileSet option keyword, got:%s:" +#~ msgstr "Attendait une option de FileSet, eu : %s:" -#: src/dird/catreq.c:645 -#, fuzzy, c-format -msgid "1994 Invalid Catalog Update: %s" -msgstr "1990 Requête sur le Catalogue Invalide : %s" +#~ msgid "Expected a filename, got: %s" +#~ msgstr "Attendait un nom de fichier, eu : %s" -#: src/dird/catreq.c:646 -#, c-format -msgid "Invalid Catalog Update; DB not open: %s" -msgstr "" +#~ msgid "Expected a FileSet keyword, got: %s" +#~ msgstr "Attendait le mot clef FileSet, eu : %s" -#: src/dird/catreq.c:702 src/dird/catreq.c:717 -#, fuzzy, c-format -msgid "fread attr spool error. ERR=%s\n" -msgstr "Erreur pendant l'écriture des attributs dans le spool. ERR=%s\n" +#~ msgid "Could not open database \"%s\".\n" +#~ msgstr "Impossible d'ouvrir la base de données \"%s\".\n" -#: src/dird/dir_plugins.c:170 src/filed/fd_plugins.c:1129 -#: src/stored/sd_plugins.c:221 -#, c-format -msgid "Loaded plugin: %s\n" -msgstr "" +#~ msgid "unknown source" +#~ msgstr "source inconnue" -#: src/dird/dir_plugins.c:190 src/filed/fd_plugins.c:1150 -#: src/stored/sd_plugins.c:241 -#, c-format -msgid "Plugin magic wrong. Plugin=%s wanted=%s got=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Job resource" +#~ msgstr "Pool à partir de sa définition" -#: src/dird/dir_plugins.c:198 src/filed/fd_plugins.c:1158 -#: src/stored/sd_plugins.c:249 -#, c-format -msgid "Plugin version incorrect. Plugin=%s wanted=%d got=%d\n" -msgstr "" +#, fuzzy +#~ msgid "Job canceled because max run sched time exceeded.\n" +#~ msgstr "" +#~ "Temps d'exécution maximum depuis la planification atteind. Abandon du " +#~ "job.\n" -#: src/dird/dir_plugins.c:207 src/filed/fd_plugins.c:1168 -#: src/stored/sd_plugins.c:258 -#, c-format -msgid "Plugin license incompatible. Plugin=%s license=%s\n" -msgstr "" +#~ msgid "Failed to connect to File daemon.\n" +#~ msgstr "Impossible de se connecter au client.\n" -#: src/dird/dir_plugins.c:215 src/filed/fd_plugins.c:1176 -#: src/stored/sd_plugins.c:266 -#, c-format -msgid "Plugin size incorrect. Plugin=%s wanted=%d got=%d\n" -msgstr "" +#, fuzzy +#~ msgid "Failed to select Storage daemon.\n" +#~ msgstr "Impossible de se connecter au Storage daemon.\n" -#: src/dird/dird.c:121 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bacula-dir [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c set configuration file to file\n" -" -d [,] set debug level to , debug tags to \n" -" -dt print timestamp in debug output\n" -" -T set trace on\n" -" -f run in foreground (for debugging)\n" -" -g groupid\n" -" -m print kaboom output (for debugging)\n" -" -r run now\n" -" -s no signals\n" -" -t test - read configuration and exit\n" -" -u userid\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Version : %s (%s)\n" -"\n" -"Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c utilise fich comme fichier de configuration\n" -" -d positionne le niveau de debug à nn\n" -" -dt affiche un timestamp devant chaque ligne de debug\n" -" -f reste en avant-plan (pour debugger)\n" -" -g groupid\n" -" -r lance maintenant\n" -" -s pas de signaux\n" -" -t test - lit seulement le fichier de configuration\n" -" -u userid\n" -" -v affiche les messages utilisateurs\n" -" -? affiche ce message.\n" -"\n" +#~ msgid "Failed to connect to Storage daemon.\n" +#~ msgstr "Impossible de se connecter au Storage daemon.\n" -#: src/dird/dird.c:502 -msgid "Already doing a reload request, request ignored.\n" -msgstr "" +#, fuzzy +#~ msgid "Client resource \"%s\" does not exist.\n" +#~ msgstr "Erreur : le client %s n'est pas définie.\n" -#: src/dird/dird.c:526 -msgid "Too many open reload requests. Request ignored.\n" -msgstr "" +#, fuzzy +#~ msgid "canceled" +#~ msgstr "Annulé" -#: src/dird/dird.c:549 -msgid "Out of reload table entries. Giving up.\n" -msgstr "" +#, fuzzy +#~ msgid "JobId %s, Job %s marked to be %s.\n" +#~ msgstr "JobId %s, Job %s marqué pour être annulé.\n" -#: src/dird/dird.c:552 -msgid "Resetting previous configuration.\n" -msgstr "Retour à la dernière configuration.\n" +#~ msgid "Max wait time exceeded. Job canceled.\n" +#~ msgstr "Temps d'attente maximum dépassé. Abandon du job.\n" -#: src/dird/dird.c:728 src/filed/filed.c:620 src/stored/stored.c:449 -#, c-format -msgid "Failed to initialize TLS context for Director \"%s\" in %s.\n" -msgstr "" +#~ msgid "Max run time exceeded. Job canceled.\n" +#~ msgstr "Temps d'exécution maximum atteind. Abandon du job.\n" -#: src/dird/dird.c:1044 src/dird/dird.c:1046 src/stored/bscan.c:287 -#: src/stored/bscan.c:294 -#, c-format -msgid "Could not open Catalog \"%s\", database \"%s\".\n" -msgstr "" -"Impossible d'ouvrir le catalogue \"%s\", sur la base de données \"%s\".\n" +#, fuzzy +#~ msgid "Max run sched time exceeded. Job canceled.\n" +#~ msgstr "Temps d'exécution maximum atteind. Abandon du job.\n" -#: src/dird/dird.c:1049 src/stored/bscan.c:290 src/tools/cats_test.c:364 -#, c-format -msgid "%s" -msgstr "%s" +#, fuzzy +#~ msgid "Cannot create pool \"%s\" in database. ERR=%s" +#~ msgstr "Pool %s introuvable en base. %s" -#: src/dird/dird.c:1149 -#, fuzzy, c-format -msgid "Could not create storage record for %s\n" -msgstr "Impossible de trouver la ressource Storage \"%s\"\n" +#, fuzzy +#~ msgid "Created database record for Pool \"%s\".\n" +#~ msgstr "Pas d'enregistrement trouvé en base pour : %s\n" -#: src/dird/dird.c:1157 -#, fuzzy, c-format -msgid "Could not update storage record for %s\n" -msgstr "Impossible de trouver la ressource Storage \"%s\"\n" +#, fuzzy +#~ msgid "Job's NextPool resource" +#~ msgstr "Sélectionnez le Pool" -#: src/dird/dird.c:1176 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Storage \"%s\" in %s.\n" -msgstr "" +#, fuzzy +#~ msgid "Job Pool's NextPool resource" +#~ msgstr "Sélectionnez le Pool" -#: src/dird/dird.c:1192 src/stored/stored.c:402 -#, c-format -msgid "Failed to initialize TLS context for Storage \"%s\" in %s.\n" -msgstr "" +#, fuzzy +#~ msgid "Pool's NextPool resource" +#~ msgstr "Sélectionnez le Pool" -#: src/dird/dird.c:1306 src/dird/mac_sql.c:548 src/stored/stored.c:505 -#, fuzzy, c-format -msgid "Could not compile regex pattern \"%s\" ERR=%s\n" -msgstr "Impossible d'ouvrir %s : ERR=%s\n" +#, fuzzy +#~ msgid "No Client specified.\n" +#~ msgstr "Le client est déjà spécifié.\n" -#: src/dird/dird_conf.c:579 src/qt-console/tray-monitor/tray_conf.cpp:158 -#, c-format -msgid "No %s resource defined\n" -msgstr "" +#, fuzzy +#~ msgid "Client resource" +#~ msgstr "Pas de ressource \"Restore Job\" trouvée !\n" -#: src/dird/dird_conf.c:588 -#, c-format -msgid "Director: name=%s MaxJobs=%d FDtimeout=%s SDtimeout=%s\n" -msgstr "" +#~ msgid "No storage specified.\n" +#~ msgstr "Pas de storage sélectionné.\n" -#: src/dird/dird_conf.c:593 -#, c-format -msgid " query_file=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Could not start clone job: \"%s\".\n" +#~ msgstr "Impossible d'ouvrir la base de données \"%s\".\n" -#: src/dird/dird_conf.c:596 src/dird/dird_conf.c:616 src/dird/dird_conf.c:641 -#: src/dird/dird_conf.c:733 src/dird/dird_conf.c:737 src/dird/dird_conf.c:741 -#: src/dird/dird_conf.c:774 src/dird/dird_conf.c:797 src/dird/dird_conf.c:813 -#: src/dird/dird_conf.c:826 src/dird/dird_conf.c:1069 -#: src/dird/dird_conf.c:1076 -msgid " --> " -msgstr "" +#~ msgid "Could not get or create a Pool record.\n" +#~ msgstr "Impossible de récupérer ou de créer un Pool dans le catalogue.\n" -#: src/dird/dird_conf.c:601 -#, c-format -msgid "Console: name=%s SSL=%d\n" -msgstr "" +#, fuzzy +#~ msgid "Could not get or create the FileSet record.\n" +#~ msgstr "Impossible de créer la structure BSOCK cliente.\n" -#: src/dird/dird_conf.c:606 -#, c-format -msgid "Counter: name=%s min=%d max=%d cur=%d wrapcntr=%s\n" -msgstr "" +#, fuzzy +#~ msgid "No previous Job found to %s.\n" +#~ msgstr "Aucun Job trouvé pour la migration.\n" -#: src/dird/dird_conf.c:611 -#, c-format -msgid "Counter: name=%s min=%d max=%d\n" -msgstr "" +#, fuzzy +#~ msgid "Create bootstrap file failed.\n" +#~ msgstr "Impossible de restaurer sans un fichier bootstrap.\n" -#: src/dird/dird_conf.c:625 -#, fuzzy, c-format -msgid "Client: Name=%s Enabled=%d Address=%s FDport=%d MaxJobs=%u\n" -msgstr "Client \"%s\" adresse positionné à %s\n" +#, fuzzy +#~ msgid "Previous Job has no data to %s.\n" +#~ msgstr "Aucun volume trouvé pour la restauration.\n" -#: src/dird/dird_conf.c:629 -#, c-format -msgid " JobRetention=%s FileRetention=%s AutoPrune=%d\n" -msgstr "" +#, fuzzy +#~ msgid "Job resource not found for \"%s\".\n" +#~ msgstr "La ressource Pool \"%s\" est introuvable !\n" -#: src/dird/dird_conf.c:637 src/dird/dird_conf.c:726 -#, c-format -msgid " MaximumBandwidth=%lld\n" -msgstr "" +#, fuzzy +#~ msgid "Previous Job resource not found for \"%s\".\n" +#~ msgstr "La ressource Pool \"%s\" est introuvable !\n" -#: src/dird/dird_conf.c:649 -#, c-format -msgid "" -"Device: name=%s ok=%d num_writers=%d max_writers=%d\n" -" reserved=%d open=%d append=%d read=%d labeled=%d offline=%d autochgr=" -"%d\n" -" poolid=%s volname=%s MediaType=%s\n" -msgstr "" +#, fuzzy +#~ msgid "setup job failed.\n" +#~ msgstr "Job échoué.\n" -#: src/dird/dird_conf.c:664 -#, c-format -msgid "" -"%s: name=%s address=%s SDport=%d MaxJobs=%u\n" -" DeviceName=%s MediaType=%s StorageId=%s Autochanger=%d\n" -msgstr "" +#, fuzzy +#~ msgid "Could not get job record for JobId %s to %s. ERR=%s" +#~ msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" -#: src/dird/dird_conf.c:682 -msgid " Parent --> " -msgstr "" +#, fuzzy +#~ msgid "Start %s JobId %s, Job=%s\n" +#~ msgstr "Démarrage du backup JobId %s, Job=%s\n" -#: src/dird/dird_conf.c:687 -msgid " Shared --> " -msgstr "" +#, fuzzy +#~ msgid "Could not start migration/copy job.\n" +#~ msgstr "Impossible d'ouvrir la base de données \"%s\".\n" -#: src/dird/dird_conf.c:696 -#, c-format -msgid "" -"Catalog: name=%s address=%s DBport=%d db_name=%s\n" -" db_driver=%s db_user=%s MutliDBConn=%d\n" -msgstr "" +#, fuzzy +#~ msgid "%s JobId %d started.\n" +#~ msgstr "Le job %d est annulé.\n" -#: src/dird/dird_conf.c:709 -#, c-format -msgid "%s: name=%s JobType=%d level=%s Priority=%d Enabled=%d\n" -msgstr "" +#~ msgid "%s OK -- with warnings" +#~ msgstr "%s OK -- avec des avertissements" -#: src/dird/dird_conf.c:710 src/dird/ua_prune.c:603 src/dird/ua_run.c:1013 -#: src/dird/ua_select.c:292 src/dird/ua_select.c:315 src/dird/ua_select.c:356 -#: src/dird/ua_select.c:1453 -msgid "Job" -msgstr "Job" +#~ msgid "*** %s Error ***" +#~ msgstr "*** %s Erreur ***" -#: src/dird/dird_conf.c:710 -msgid "JobDefs" -msgstr "JobDefs" +#~ msgid "%s Canceled" +#~ msgstr "%s Annulé" -#: src/dird/dird_conf.c:714 -#, c-format -msgid "" -" MaxJobs=%u Resched=%d Times=%d Interval=%s Spool=%d WritePartAfterJob=" -"%d\n" -msgstr "" +#, fuzzy +#~ msgid "%s -- no files to %s" +#~ msgstr "Aucun volume trouvé pour la restauration.\n" -#: src/dird/dird_conf.c:720 -#, c-format -msgid " SpoolSize=%s\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "%s %s %s (%s):\n" +#~ " Build OS: %s %s %s\n" +#~ " Prev Backup JobId: %s\n" +#~ " Prev Backup Job: %s\n" +#~ " New Backup JobId: %s\n" +#~ " Current JobId: %s\n" +#~ " Current Job: %s\n" +#~ " Backup Level: %s%s\n" +#~ " Client: %s\n" +#~ " FileSet: \"%s\" %s\n" +#~ " Read Pool: \"%s\" (From %s)\n" +#~ " Read Storage: \"%s\" (From %s)\n" +#~ " Write Pool: \"%s\" (From %s)\n" +#~ " Write Storage: \"%s\" (From %s)\n" +#~ " Catalog: \"%s\" (From %s)\n" +#~ " Start time: %s\n" +#~ " End time: %s\n" +#~ " Elapsed time: %s\n" +#~ " Priority: %d\n" +#~ " SD Files Written: %s\n" +#~ " SD Bytes Written: %s (%sB)\n" +#~ " Rate: %.1f KB/s\n" +#~ " Volume name(s): %s\n" +#~ " Volume Session Id: %d\n" +#~ " Volume Session Time: %d\n" +#~ " Last Volume Bytes: %s\n" +#~ " SD Errors: %d\n" +#~ " SD termination status: %s\n" +#~ " Termination: %s\n" +#~ "\n" +#~ msgstr "" +#~ "%s %s %s (%s): %s\n" +#~ " Build OS : %s %s %s\n" +#~ " Prec Backup JobId : %s\n" +#~ " Prec Backup Job : %s\n" +#~ " Nouveau JobId : %s\n" +#~ " JobId courrant : %s\n" +#~ " Job courrant : %s\n" +#~ " Niveau de backup : %s%s\n" +#~ " Client : %s\n" +#~ " FileSet : \"%s\" %s\n" +#~ " Pool de lecture : \"%s\" (Depuis %s)\n" +#~ " Storage de lecture : \"%s\" (Depuis %s)\n" +#~ " Pool d'écriture : \"%s\" (Depuis %s)\n" +#~ " Storage d'écriture : \"%s\" (Depuis %s)\n" +#~ " Catalogue : \"%s\" (Depuis %s)\n" +#~ " Date de début : %s\n" +#~ " Date de fin : %s\n" +#~ " Temps écoulé : %s\n" +#~ " Priorité : %d\n" +#~ " Fichiers écrits SD : %s\n" +#~ " Octets écrits SD : %s (%so)\n" +#~ " Débit : %.1f Ko/s\n" +#~ " Nom des Volumes : %s\n" +#~ " Volume Session Id : %d\n" +#~ " Volume Session date : %d\n" +#~ " Taille du volume : %s (%so)\n" +#~ " Erreurs du SD : %d\n" +#~ " Statut de fin du SD : %s\n" +#~ " Statut de fin : %s\n" -#: src/dird/dird_conf.c:723 -#, c-format -msgid " Accurate=%d\n" -msgstr "" +#, fuzzy +#~ msgid "No %s SQL selection pattern specified.\n" +#~ msgstr "Pas de storage sélectionné.\n" -#: src/dird/dird_conf.c:730 -#, c-format -msgid " SelectionType=%d\n" -msgstr "" +#, fuzzy +#~ msgid "SQL failed. ERR=%s\n" +#~ msgstr "fopen %s en erreur : ERR=%s\n" -#: src/dird/dird_conf.c:745 -#, c-format -msgid " --> Where=%s\n" -msgstr "" +#, fuzzy +#~ msgid "No Volumes found to %s.\n" +#~ msgstr "Aucun volume trouvé pour la restauration.\n" -#: src/dird/dird_conf.c:748 -#, c-format -msgid " --> RegexWhere=%s\n" -msgstr " --> RegexWhere=%s\n" +#, fuzzy +#~ msgid "Invalid JobId found.\n" +#~ msgstr "Période invalide.\n" -#: src/dird/dird_conf.c:751 -#, c-format -msgid " --> Bootstrap=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unknown %s Selection Type.\n" +#~ msgstr "Job du Type=%d inconnu\n" -#: src/dird/dird_conf.c:754 -#, c-format -msgid " --> WriteBootstrap=%s\n" -msgstr "" +#, fuzzy +#~ msgid "No JobIds found to %s.\n" +#~ msgstr "Pas de job trouvé pour : %s.\n" -#: src/dird/dird_conf.c:757 -#, fuzzy, c-format -msgid " --> PluginOptions=%s\n" -msgstr " --> RunOnSuccess=%u\n" +#, fuzzy +#~ msgid "The following %u JobId%s chosen to be %s: %s\n" +#~ msgstr "Les fichiers suivants sont absents :\n" -#: src/dird/dird_conf.c:760 -#, c-format -msgid " --> MaxRunTime=%u\n" -msgstr " --> MaxRunTime=%u\n" +#, fuzzy +#~ msgid "%s using JobId=%s Job=%s\n" +#~ msgstr "Migration utilisant JobId=%s Job=%s\n" -#: src/dird/dird_conf.c:763 -#, c-format -msgid " --> MaxWaitTime=%u\n" -msgstr " --> MaxWaitTime=%u\n" +#, fuzzy +#~ msgid "No %ss found to %s.\n" +#~ msgstr "Aucun volume trouvé pour la restauration.\n" -#: src/dird/dird_conf.c:766 -#, c-format -msgid " --> MaxStartDelay=%u\n" -msgstr " --> MaxStartDelay=%u\n" +#, fuzzy +#~ msgid "SQL to get uncopied jobs failed. ERR=%s\n" +#~ msgstr "fopen %s en erreur : ERR=%s\n" -#: src/dird/dird_conf.c:769 -#, fuzzy, c-format -msgid " --> MaxRunSchedTime=%u\n" -msgstr " --> MaxRunTime=%u\n" +#, fuzzy +#~ msgid "No %s %s selection pattern specified.\n" +#~ msgstr "Pas de storage sélectionné.\n" -#: src/dird/dird_conf.c:781 -#, fuzzy, c-format -msgid " --> Base %s\n" -msgstr " --> Target=%s\n" +#, fuzzy +#~ msgid "SQL to get %s failed. ERR=%s\n" +#~ msgstr "fopen %s en erreur : ERR=%s\n" -#: src/dird/dird_conf.c:787 src/lib/runscript.c:286 -msgid " --> RunScript\n" -msgstr " --> RunScript\n" +#, fuzzy +#~ msgid "No %s found to %s.\n" +#~ msgstr "Aucun volume trouvé pour la restauration.\n" -#: src/dird/dird_conf.c:788 src/lib/runscript.c:287 -#, c-format -msgid " --> Command=%s\n" -msgstr " --> Command=%s\n" +#~ msgid "Connecting to Storage daemon %s at %s:%d ...\n" +#~ msgstr "Connexion au Storage Daemon %s (%s:%d)...\n" -#: src/dird/dird_conf.c:789 src/lib/runscript.c:288 -#, c-format -msgid " --> Target=%s\n" -msgstr " --> Target=%s\n" +#, fuzzy +#~ msgid "Using Device \"%s\" to read.\n" +#~ msgstr "Using Device \"%s\"\n" -#: src/dird/dird_conf.c:790 src/lib/runscript.c:289 -#, c-format -msgid " --> RunOnSuccess=%u\n" -msgstr " --> RunOnSuccess=%u\n" +#, fuzzy +#~ msgid "Using Device \"%s\" to write.\n" +#~ msgstr "Using Device \"%s\"\n" -#: src/dird/dird_conf.c:791 src/lib/runscript.c:290 -#, c-format -msgid " --> RunOnFailure=%u\n" -msgstr " --> RunOnFailure=%u\n" +#~ msgid "Could not open bootstrap file %s: ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier bootstrap %s : ERR=%s\n" -#: src/dird/dird_conf.c:792 src/lib/runscript.c:291 -#, c-format -msgid " --> FailJobOnError=%u\n" -msgstr "" +#~ msgid "Illegal character in Volume name \"%s\"\n" +#~ msgstr "Caractère interdit dans le nom du Volume \"%s\"\n" -#: src/dird/dird_conf.c:793 src/lib/runscript.c:292 -#, c-format -msgid " --> RunWhen=%u\n" -msgstr " --> RunWhen=%u\n" +#, fuzzy +#~ msgid "" +#~ "Created new Volume=\"%s\", Pool=\"%s\", MediaType=\"%s\" in catalog.\n" +#~ msgstr "Le Volume \"%s\" a été créé dans le catalogue.\n" -#: src/dird/dird_conf.c:801 -msgid " --> FullBackup" -msgstr "" +#, fuzzy +#~ msgid "SQL failed, but ignored. ERR=%s\n" +#~ msgstr "fopen %s en erreur : ERR=%s\n" + +#~ msgid "" +#~ "Wanted to create Volume \"%s\", but it already exists. Trying again.\n" +#~ msgstr "Impossible de créer le volume \"%s\" car il existe déjà.\n" + +#~ msgid "Too many failures. Giving up creating Volume name.\n" +#~ msgstr "Trop d'erreurs. Abandon de la création du volume.\n" + +#~ msgid "Purging oldest volume \"%s\"\n" +#~ msgstr "Purge du plus ancien volume \"%s\"\n" + +#~ msgid "Pruning oldest volume \"%s\"\n" +#~ msgstr "Prunning du plus ancien volume \"%s\"\n" -#: src/dird/dird_conf.c:805 #, fuzzy -msgid " --> IncrementalBackup" -msgstr "Incrémental" +#~ msgid "Max Volume bytes=%s exceeded. Marking Volume \"%s\" as Full.\n" +#~ msgstr "" +#~ "Nombre maximum de job sur le volume atteind. Marquage du volume \"%s\" " +#~ "comme Used.\n" + +#~ msgid "Volume used once. Marking Volume \"%s\" as Used.\n" +#~ msgstr "Volume utilisé une fois. Marquage du volume \"%s\" comme Used.\n" -#: src/dird/dird_conf.c:809 #, fuzzy -msgid " --> DifferentialBackup" -msgstr "Différentiel" +#~ msgid "Max Volume jobs=%s exceeded. Marking Volume \"%s\" as Used.\n" +#~ msgstr "" +#~ "Nombre maximum de job sur le volume atteind. Marquage du volume \"%s\" " +#~ "comme Used.\n" -#: src/dird/dird_conf.c:819 -#, c-format -msgid " --> Run=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Max Volume files=%s exceeded. Marking Volume \"%s\" as Used.\n" +#~ msgstr "" +#~ "Nombre de fichier maximum atteind. Marquage du volume \"%s\" comme Used.\n" -#: src/dird/dird_conf.c:823 -#, c-format -msgid " --> SelectionPattern=%s\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Max configured use duration=%s sec. exceeded. Marking Volume \"%s\" as " +#~ "Used.\n" +#~ msgstr "" +#~ "Nombre maximum de job sur le volume atteind. Marquage du volume \"%s\" " +#~ "comme Used.\n" -#: src/dird/dird_conf.c:837 -#, c-format -msgid "FileSet: name=%s\n" -msgstr "" +#~ msgid "volume has expired" +#~ msgstr "le volume a expiré" -#: src/dird/dird_conf.c:931 -#, c-format -msgid "Schedule: Name=%s Enabled=%d\n" -msgstr "" +#~ msgid "but should be Append, Purged or Recycle" +#~ msgstr "mais doit être Append, Purged ou bien Recycle" -#: src/dird/dird_conf.c:937 -#, c-format -msgid " --> Run Level=%s\n" -msgstr "" +#~ msgid "volume has recycling disabled" +#~ msgstr "le recyclage du volume est désactivé" -#: src/dird/dird_conf.c:939 -#, fuzzy, c-format -msgid " MaxRunSchedTime=%u\n" -msgstr " --> MaxRunTime=%u\n" +#~ msgid "Unable to get Pool record: ERR=%s" +#~ msgstr "Impossible de récupérer le Pool depuis le catalogue : ERR=%s" -#: src/dird/dird_conf.c:942 -#, fuzzy, c-format -msgid " Priority=%u\n" -msgstr "Priorité" +#~ msgid "Unable add Scratch Volume, Pool \"%s\" full MaxVols=%d\n" +#~ msgstr "" +#~ "Impossible d'ajouter un volume du Scratch, le Pool \"%s\" est plein. " +#~ "MaxVols=%d\n" -#: src/dird/dird_conf.c:944 -msgid " hour=" -msgstr "" +#~ msgid "Failed to move Scratch Volume. ERR=%s\n" +#~ msgstr "Impossible de déplacer un Volume du Scratch. ERR=%s\n" -#: src/dird/dird_conf.c:953 -msgid " mday=" -msgstr "" +#~ msgid "Using Volume \"%s\" from 'Scratch' pool.\n" +#~ msgstr "Utilisation du Volume \"%s\" du pool \"Scratch\".\n" -#: src/dird/dird_conf.c:962 -msgid " month=" -msgstr "" +#~ msgid "Recycled volume \"%s\"\n" +#~ msgstr "Volume recyclé \"%s\"\n" -#: src/dird/dird_conf.c:971 -msgid " wday=" -msgstr "" +#, fuzzy +#~ msgid "Could not get storage resource '%s'.\n" +#~ msgstr "Impossible de trouver la ressource Storage \"%s\"\n" -#: src/dird/dird_conf.c:980 -msgid " wom=" -msgstr "" +#, fuzzy +#~ msgid "Could not acquire read storage lock for \"%s\"" +#~ msgstr "Impossible de trouver la ressource Storage \"%s\"\n" -#: src/dird/dird_conf.c:989 -msgid " woy=" -msgstr "" +#~ msgid "Start Restore Job %s\n" +#~ msgstr "Démarrage du Job de restauration %s\n" -#: src/dird/dird_conf.c:998 -#, c-format -msgid " mins=%d\n" -msgstr "" +#~ msgid "Restore OK -- warning file count mismatch" +#~ msgstr "Restauration Ok -- attention le nombre de fichier ne correspond pas" -#: src/dird/dird_conf.c:1000 src/dird/dird_conf.c:1004 -#: src/dird/dird_conf.c:1008 -msgid " --> " -msgstr "" +#~ msgid "Restore OK" +#~ msgstr "Restauration OK" -#: src/dird/dird_conf.c:1017 -#, c-format -msgid "Schedule: name=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Restore OK -- with warnings" +#~ msgstr "Backup OK -- avec des erreurs" -#: src/dird/dird_conf.c:1025 -#, c-format -msgid "Pool: name=%s PoolType=%s\n" -msgstr "" +#~ msgid "*** Restore Error ***" +#~ msgstr "*** Restauration en erreur ***" -#: src/dird/dird_conf.c:1027 -#, c-format -msgid " use_cat=%d use_once=%d cat_files=%d\n" -msgstr "" +#~ msgid "Restore Canceled" +#~ msgstr "Restauration annulée" -#: src/dird/dird_conf.c:1030 -#, c-format -msgid " max_vols=%d auto_prune=%d VolRetention=%s\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "%s %s %s (%s):\n" +#~ " Build OS: %s %s %s\n" +#~ " JobId: %d\n" +#~ " Job: %s\n" +#~ " Restore Client: %s\n" +#~ " Start time: %s\n" +#~ " End time: %s\n" +#~ " Files Expected: %s\n" +#~ " Files Restored: %s\n" +#~ " Bytes Restored: %s\n" +#~ " Rate: %.1f KB/s\n" +#~ " FD Errors: %d\n" +#~ " FD termination status: %s\n" +#~ " SD termination status: %s\n" +#~ " Termination: %s\n" +#~ "\n" +#~ msgstr "" +#~ "%s %s %s (%s): %s\n" +#~ " Build OS: %s %s %s\n" +#~ " JobId : %d\n" +#~ " Job : %s\n" +#~ " Client : %s\n" +#~ " Début : %s\n" +#~ " Fin : %s\n" +#~ " Fichiers attendus : %s\n" +#~ " Fichiers restaurés : %s\n" +#~ " Octets restaurés : %s\n" +#~ " Débit : %.1f Ko/s\n" +#~ " Erreurs du FD : %d\n" +#~ " Statut de fin du FD : %s\n" +#~ " Statut de fin du SD : %s\n" +#~ " Etat : %s\n" -#: src/dird/dird_conf.c:1033 -#, c-format -msgid " VolUse=%s recycle=%d LabelFormat=%s\n" -msgstr "" +#~ msgid "Expected an equals, got: %s" +#~ msgstr "Attendait un égale, pas : %s" -#: src/dird/dird_conf.c:1037 -#, c-format -msgid " CleaningPrefix=%s LabelType=%d\n" -msgstr "" +#~ msgid "Expect a YES or NO, got: %s" +#~ msgstr "Attendait Oui ou Non, eu : %s" -#: src/dird/dird_conf.c:1039 -#, c-format -msgid " RecyleOldest=%d PurgeOldest=%d ActionOnPurge=%d\n" -msgstr "" +#~ msgid "Job %s not found\n" +#~ msgstr "Job %s non trouvé\n" -#: src/dird/dird_conf.c:1043 -#, c-format -msgid " MaxVolJobs=%d MaxVolFiles=%d MaxVolBytes=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Bad response from SD to %s command. Wanted %s, got %s len=%ld\n" +#~ msgstr "Mauvaise réponse à la commande %s : voulait %s, pas %s\n" -#: src/dird/dird_conf.c:1047 -#, c-format -msgid " MigTime=%s MigHiBytes=%s MigLoBytes=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Snapshot not found\n" +#~ msgstr "Le Storage \"%s\" est introuvable.\n" -#: src/dird/dird_conf.c:1051 -#, c-format -msgid " JobRetention=%s FileRetention=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Client resource not found\n" +#~ msgstr "Pas de ressource \"Restore Job\" trouvée !\n" -#: src/dird/dird_conf.c:1055 -#, c-format -msgid " NextPool=%s\n" -msgstr "" +#~ msgid "Connecting to Client %s at %s:%d\n" +#~ msgstr "Connexion au client %s (%s:%d)\n" -#: src/dird/dird_conf.c:1058 -#, c-format -msgid " RecyclePool=%s\n" -msgstr "" +#~ msgid "Failed to connect to Client.\n" +#~ msgstr "Impossible de se connecter au Client.\n" -#: src/dird/dird_conf.c:1061 -#, fuzzy, c-format -msgid " ScratchPool=%s\n" -msgstr "Utilisation du Catalogue \"%s\"\n" +#, fuzzy +#~ msgid "Snapshot \"%s\" deleted from client %s\n" +#~ msgstr "L'ancien volume \"%s\" a été supprimé du catalogue.\n" -#: src/dird/dird_conf.c:1064 -#, fuzzy, c-format -msgid " Catalog=%s\n" -msgstr "Utilisation du Catalogue \"%s\"\n" +#, fuzzy +#~ msgid "Snapshot \"%s\" deleted from catalog\n" +#~ msgstr "L'ancien volume \"%s\" a été supprimé du catalogue.\n" -#: src/dird/dird_conf.c:1084 -#, c-format -msgid "Messages: name=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Snapshot \"%s\" on Client %s\n" +#~ msgstr "est en attente du client %s" -#: src/dird/dird_conf.c:1086 -#, c-format -msgid " mailcmd=%s\n" -msgstr "" +#, fuzzy +#~ msgid "No snapshot found\n" +#~ msgstr "Job %s non trouvé\n" -#: src/dird/dird_conf.c:1088 -#, c-format -msgid " opcmd=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Snapshot choice: \n" +#~ msgstr "Elément à mettre à jour :\n" -#: src/dird/dird_conf.c:1092 src/qt-console/tray-monitor/tray_conf.cpp:189 -#, c-format -msgid "Unknown resource type %d in dump_resource.\n" -msgstr "" +#, fuzzy +#~ msgid "List snapshots in Catalog" +#~ msgstr "purge les enregistrements du catalogue" -#: src/dird/dird_conf.c:1437 src/qt-console/tray-monitor/tray_conf.cpp:247 -#, c-format -msgid "Unknown resource type %d in free_resource.\n" -msgstr "" +#, fuzzy +#~ msgid "List snapshots on Client" +#~ msgstr "est en attente du client %s" -#: src/dird/dird_conf.c:1472 src/lib/parse_conf.c:259 -#: src/qt-console/tray-monitor/tray_conf.cpp:280 -#, c-format -msgid "Too many items in %s resource\n" -msgstr "Trop d'élément dans la ressource %s\n" +#~ msgid "Done" +#~ msgstr "Fin" -#: src/dird/dird_conf.c:1512 -#, c-format -msgid "Cannot find Pool resource %s\n" -msgstr "Impossible de trouver la ressource Pool \"%s\"\n" +#~ msgid "Selection terminated.\n" +#~ msgstr "Sélection terminée.\n" -#: src/dird/dird_conf.c:1523 -#, c-format -msgid "Cannot find Console resource %s\n" -msgstr "Impossible de trouver la ressource Console \"%s\"\n" +#, fuzzy +#~ msgid "Enter a SnapshotId: " +#~ msgstr "Saisissez le nouveau slot : " -#: src/dird/dird_conf.c:1529 src/filed/filed_conf.c:467 -#: src/stored/stored_conf.c:628 -#, c-format -msgid "Cannot find Director resource %s\n" -msgstr "Impossible de trouver la ressource Director \"%s\"\n" +#, fuzzy +#~ msgid "Unable to get Snapshot record.\n" +#~ msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" -#: src/dird/dird_conf.c:1538 src/stored/stored_conf.c:634 -#, c-format -msgid "Cannot find Storage resource %s\n" -msgstr "Impossible de trouver la ressource Storage \"%s\"\n" +#~ msgid "Invalid retention period specified: %s\n" +#~ msgstr "Période de rétention invalide : %s\n" -#: src/dird/dird_conf.c:1554 -#, c-format -msgid "Cannot find Job resource %s\n" -msgstr "Impossible de trouver la ressource Job \"%s\"\n" +#~ msgid "New retention period is: %s\n" +#~ msgstr "La nouvelle période de rétention est : %s\n" -#: src/dird/dird_conf.c:1605 -#, c-format -msgid "Cannot find Counter resource %s\n" -msgstr "Impossible de trouver la ressource Counter \"%s\"\n" +#, fuzzy +#~ msgid "New Comment is: %s\n" +#~ msgstr "Le nouveau pool est : %s\n" -#: src/dird/dird_conf.c:1613 src/filed/filed_conf.c:474 -#, c-format -msgid "Cannot find Client resource %s\n" -msgstr "Impossible de trouver la ressource Client \"%s\"\n" +#~ msgid "Parameters to modify:\n" +#~ msgstr "Paramètre à modifier :\n" -#: src/dird/dird_conf.c:1626 -#, c-format -msgid "Cannot find Schedule resource %s\n" -msgstr "Impossible de trouver la ressource Schedule \"%s\"\n" +#, fuzzy +#~ msgid "Snapshot Retention Period" +#~ msgstr "Période de rétention d'un volume" -#: src/dird/dird_conf.c:1631 src/dird/dird_conf.c:1697 -#: src/qt-console/tray-monitor/tray_conf.cpp:300 -#: src/qt-console/tray-monitor/tray_conf.cpp:338 -#, c-format -msgid "Unknown resource type %d in save_resource.\n" -msgstr "" +#~ msgid "Select parameter to modify" +#~ msgstr "Sélectionnez le paramètre à modifier" -#: src/dird/dird_conf.c:1714 -#, fuzzy, c-format -msgid "Expected one of: %s, got: %s" -msgstr "Attendait %s, a pas : %s" +#, fuzzy +#~ msgid "Updating Snapshot \"%s\" on \"%s\"\n" +#~ msgstr "Mise à jour du Volume \"%s\"\n" -#: src/dird/dird_conf.c:1753 -#, fuzzy, c-format -msgid "Could not find Storage Resource %s referenced on line %d : %s\n" -msgstr "Impossible de trouver la ressource \"%s\" utilisée ligne %d : %s\n" +#~ msgid "Current retention period is: %s\n" +#~ msgstr "La période de rétention actuelle est : %s\n" -#: src/dird/dird_conf.c:1758 -#, fuzzy, c-format -msgid "" -"Attempt to redefine Storage resource \"%s\" referenced on line %d : %s\n" -msgstr "Impossible de trouver la ressource \"%s\" utilisée ligne %d : %s\n" +#, fuzzy +#~ msgid "Enter Snapshot Retention period: " +#~ msgstr "Saisissez une nouvelle période de rétention : " -#: src/dird/dird_conf.c:1833 -#, c-format -msgid "Expected a Migration Job Type keyword, got: %s" -msgstr "Attendait un type de Job de Migration, eu : %s" +#, fuzzy +#~ msgid "Current comment is: %s\n" +#~ msgstr "Le pool courant est : %s\n" -#: src/dird/dird_conf.c:1859 -#, c-format -msgid "Expected a Job Type keyword, got: %s" -msgstr "" +#, fuzzy +#~ msgid "Enter Snapshot comment: " +#~ msgstr "Exécuter une requête SQL : " -#: src/dird/dird_conf.c:1883 -#, c-format -msgid "Expected a Job Level keyword, got: %s" -msgstr "Attendait un niveau de sauvegarde, eu : %s" +#, fuzzy +#~ msgid "Add media to a pool" +#~ msgstr "ajouter un média dans un pool" -#: src/dird/dird_conf.c:1903 -#, c-format -msgid "Expected a Restore replacement option, got: %s" -msgstr "Attendait un niveau de remplacement, eu : %s" +#, fuzzy +#~ msgid "Autodisplay console messages" +#~ msgstr "autodisplay [on|off] -- messages de la console" -#: src/dird/dird_conf.c:1955 src/dird/dird_conf.c:2071 src/lib/ini.c:636 -#: src/lib/parse_conf.c:828 src/lib/parse_conf.c:844 -#, c-format -msgid "Expect %s, got: %s" -msgstr "Attendait %s, a pas : %s" +#, fuzzy +#~ msgid "Cancel a job" +#~ msgstr "Annulé" -#: src/dird/dird_conf.c:1977 src/lib/parse_conf.c:537 -#, c-format -msgid "Could not find config Resource %s referenced on line %d : %s\n" -msgstr "" +#, fuzzy +#~ msgid "Create DB Pool from resource" +#~ msgstr "Pool à partir de sa définition" -#: src/dird/dird_conf.c:2111 src/dird/inc_conf.c:701 -#, c-format -msgid "Expecting open brace. Got %s" -msgstr "Attendait {, eu : %s" +#, fuzzy +#~ msgid "Delete volume, pool or job" +#~ msgstr "met à jour un volume, un pool ou bien des slots" -#: src/dird/dird_conf.c:2125 src/dird/inc_conf.c:370 src/dird/inc_conf.c:716 -#, c-format -msgid "Expecting keyword, got: %s\n" -msgstr "Attendait un mot clef, eu : %s\n" +#, fuzzy +#~ msgid "Performs FileSet estimate, listing gives full listing" +#~ msgstr "" +#~ "estimate -- estime un FileSet (listing donne la liste des " +#~ "fichiers)" -#: src/dird/dird_conf.c:2131 src/dird/inc_conf.c:378 src/dird/inc_conf.c:722 -#: src/lib/parse_conf.c:1037 -#, c-format -msgid "expected an equals, got: %s" -msgstr "attendait un égale, eu : %s" +#, fuzzy +#~ msgid "Non-interactive gui mode" +#~ msgstr "gui [on|off] -- mode non interactif (pour interface graphique)" -#: src/dird/dird_conf.c:2142 src/dird/inc_conf.c:388 src/dird/inc_conf.c:731 -#, c-format -msgid "Keyword %s not permitted in this resource" -msgstr "" +#, fuzzy +#~ msgid "Print help on specific command" +#~ msgstr "affiche cette commande" -#: src/dird/expand.c:244 -#, c-format -msgid "Count not update counter %s: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Label a tape" +#~ msgstr "labéliser une bande" -#: src/dird/expand.c:416 -#, c-format -msgid "Cannot create var context: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "List objects from catalog" +#~ msgstr "purge les enregistrements du catalogue" -#: src/dird/expand.c:421 -#, c-format -msgid "Cannot set var callback: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Display pending messages" +#~ msgstr "Message de Bacula" -#: src/dird/expand.c:427 -#, c-format -msgid "Cannot set var operate: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Print current memory usage" +#~ msgstr "affiche la consommation mémoire courante" -#: src/dird/expand.c:433 src/dird/expand.c:448 -#, c-format -msgid "Cannot unescape string: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Mount storage" +#~ msgstr "unmount -- démonte un lecteur" -#: src/dird/expand.c:441 -#, c-format -msgid "Cannot expand expression \"%s\": ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Prune expired records from catalog" +#~ msgstr "purge les entrées expirées du catalogue" -#: src/dird/expand.c:459 -#, c-format -msgid "Cannot destroy var context: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Purge records from catalog" +#~ msgstr "purge les enregistrements du catalogue" -#: src/dird/fd_cmds.c:81 -msgid "File daemon not defined for current Job\n" -msgstr "" +#, fuzzy +#~ msgid "Query catalog" +#~ msgstr "interroger le catalogue" -#: src/dird/fd_cmds.c:98 #, fuzzy -msgid "Client: " -msgstr "Client" +#~ msgid "Restore files" +#~ msgstr "restauration de fichier" -#: src/dird/fd_cmds.c:134 -#, c-format -msgid "File daemon \"%s\" rejected Job command: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Relabel a tape" +#~ msgstr "re-labélise une bande" -#: src/dird/fd_cmds.c:147 -#, c-format -msgid "Error updating Client record. ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Release storage" +#~ msgstr "Restaurer" -#: src/dird/fd_cmds.c:152 -#, c-format -msgid "FD gave bad response to JobId command: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Reload conf file" +#~ msgstr "recharge la configuration" -#: src/dird/fd_cmds.c:181 src/dird/fd_cmds.c:269 -msgid ", since=" -msgstr ", depuis=" +#, fuzzy +#~ msgid "Run a job" +#~ msgstr "Job en cours :\n" -#: src/dird/fd_cmds.c:246 -msgid "No prior or suitable Full backup found in catalog. Doing FULL backup.\n" -msgstr "Pas de précédent backup Full utilisable. Lancement d'un backup FULL.\n" +#, fuzzy +#~ msgid "Restart a job" +#~ msgstr "Sélectionnez le Job de restauration" -#: src/dird/fd_cmds.c:247 src/dird/fd_cmds.c:253 src/dird/fd_cmds.c:262 -#, c-format -msgid " (upgraded from %s)" -msgstr " (à la place de %s)" +#, fuzzy +#~ msgid "Resume a job" +#~ msgstr "Job en cours :\n" -#: src/dird/fd_cmds.c:252 #, fuzzy -msgid "" -"No prior or suitable Differential backup found in catalog. Doing " -"Differential backup.\n" -msgstr "Pas de précédent backup Full utilisable. Lancement d'un backup FULL.\n" +#~ msgid "Report status" +#~ msgstr "Statut :\n" -#: src/dird/fd_cmds.c:260 -#, c-format -msgid "Prior failed job found in catalog. Upgrading to %s.\n" -msgstr "Le job précédent était en erreur. Passage au type %s.\n" +#, fuzzy +#~ msgid "Stop a job" +#~ msgstr "Job en cours :\n" -#: src/dird/fd_cmds.c:338 -#, c-format -msgid "Unimplemented backup level %d %c\n" -msgstr "" +#, fuzzy +#~ msgid "Sets debug level" +#~ msgstr "positionne le niveau de debug" -#: src/dird/fd_cmds.c:420 -msgid "" -"FD compression disabled for this Job because AllowCompress=No in Storage " -"resource.\n" -msgstr "" +#, fuzzy +#~ msgid "Show resource records" +#~ msgstr "Pool à partir de sa définition" -#: src/dird/fd_cmds.c:520 src/filed/job.c:1094 -#, c-format -msgid "Cannot run program: %s. ERR=%s\n" -msgstr "Impossible de lancer la commande : %s. ERR=%s\n" +#, fuzzy +#~ msgid "Use SQL to query catalog" +#~ msgstr "passer des commandes SQL pour interroger le catalogue" -#: src/dird/fd_cmds.c:532 src/dird/fd_cmds.c:558 src/dird/fd_cmds.c:572 -msgid ">filed: write error on socket\n" -msgstr "" +#, fuzzy +#~ msgid "Print current time" +#~ msgstr "affiche la date courante" -#: src/dird/fd_cmds.c:538 -#, c-format -msgid "Error running program: %s. ERR=%s\n" -msgstr "Erreur dans l'exécution de la commande : %s. ERR=%s\n" +#, fuzzy +#~ msgid "Turn on/off trace to file" +#~ msgstr "active/désactive le fichier de trace" -#: src/dird/fd_cmds.c:547 -#, c-format -msgid "Cannot open included file: %s. ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier inclus : %s. ERR=%s\n" +#, fuzzy +#~ msgid "Unmount storage" +#~ msgstr "unmount -- démonte un lecteur" -#: src/dird/fd_cmds.c:720 -#, fuzzy, c-format -msgid "Client \"%s\" RunScript failed.\n" -msgstr "le client \"%s\" est introuvable.\n" +#, fuzzy +#~ msgid "Umount - for old-time Unix guys, see unmount" +#~ msgstr "umount -- démonte un lecteur" -#: src/dird/fd_cmds.c:743 -#, c-format -msgid "" -"Client \"%s\" may not be used to restore this job. Please upgrade your " -"client.\n" -msgstr "" +#, fuzzy +#~ msgid "Update volume, pool or stats" +#~ msgstr "met à jour un volume, un pool ou bien des slots" -#: src/dird/fd_cmds.c:824 #, fuzzy -msgid "RestoreObject failed.\n" -msgstr "restauration de fichier" +#~ msgid "Use catalog xxx" +#~ msgstr "interroger le catalogue" -#: src/dird/fd_cmds.c:861 #, fuzzy -msgid "ComponentInfo failed.\n" -msgstr "Commande annulée.\n" +#~ msgid "Print Director version" +#~ msgstr "affiche la version du Director" -#: src/dird/fd_cmds.c:906 -#, c-format -msgid "" -"fixed name. Max=%d: " +#~ msgstr "Entrez le nombre de Volume à créer. 0=>nom fixé. Max=%d : " -#: src/dird/getmsg.c:370 src/stored/fd_cmds.c:441 -#, c-format -msgid "Bad response to %s command: wanted %s, got %s\n" -msgstr "Mauvaise réponse à la commande %s : voulait %s, pas %s\n" +#~ msgid "The number must be between 0 and %d\n" +#~ msgstr "Le nombre doit être entre 0 et %d\n" -#: src/dird/getmsg.c:375 src/stored/fd_cmds.c:445 -#, c-format -msgid "Socket error on %s command: ERR=%s\n" -msgstr "Erreur de socket sur la commande %s : ERR=%s\n" +#~ msgid "Enter Volume name: " +#~ msgstr "Entrez le nom du Volume : " -#: src/dird/inc_conf.c:289 -#, fuzzy, c-format -msgid "Expected a strip path positive integer, got:%s:" -msgstr "Attendait un entier positif, pas : %s\n" +#~ msgid "Enter base volume name: " +#~ msgstr "Entrez le nom de base du volume : " -#: src/dird/inc_conf.c:309 -#, c-format -msgid "Expected a FileSet option keyword, got:%s:" -msgstr "Attendait une option de FileSet, eu : %s:" +#~ msgid "Volume name too long.\n" +#~ msgstr "Nom de Volume trop long.\n" -#: src/dird/inc_conf.c:342 -msgid "Old style Include/Exclude not supported\n" -msgstr "" +#~ msgid "Volume name must be at least one character long.\n" +#~ msgstr "Le nom du volume doit comporter au moins un caractère\n" -#: src/dird/inc_conf.c:441 -#, c-format -msgid "Regex compile error. ERR=%s\n" -msgstr "" +#~ msgid "Enter the starting number: " +#~ msgstr "Entrez le nombre de départ : " -#: src/dird/inc_conf.c:462 -#, c-format -msgid "Expected a regex string, got: %s\n" -msgstr "" +#~ msgid "Start number must be greater than zero.\n" +#~ msgstr "Le nombre de départ doit être supérieur à zéro.\n" -#: src/dird/inc_conf.c:536 -#, c-format -msgid "Expected a wild-card string, got: %s\n" -msgstr "" +#~ msgid "Enter slot (0 for none): " +#~ msgstr "Saisissez le slot (0 pour aucun) : " -#: src/dird/inc_conf.c:571 -msgid "ExcludeDirContaining directive not permitted in Exclude.\n" -msgstr "" +#~ msgid "InChanger? yes/no: " +#~ msgstr "InChanger ? oui/non : " -#: src/dird/inc_conf.c:621 src/dird/inc_conf.c:664 -#, c-format -msgid "Backslash found. Use forward slashes or quote the string.: %s\n" -msgstr "" +#~ msgid "%d Volumes created in pool %s\n" +#~ msgstr "%d Volumes créés dans le pool %s\n" -#: src/dird/inc_conf.c:636 src/dird/inc_conf.c:679 -#, c-format -msgid "Expected a filename, got: %s" -msgstr "Attendait un nom de fichier, eu : %s" +#~ msgid "Turn on or off? " +#~ msgstr "Activer ou désactiver ? (on/off) " -#: src/dird/inc_conf.c:653 -msgid "Plugin directive not permitted in Exclude\n" -msgstr "" +#~ msgid "" +#~ "Error: Pool %s already exists.\n" +#~ "Use update to change it.\n" +#~ msgstr "" +#~ "Erreur : Pool %s est déjà défini.\n" +#~ "Utilisez update pour le changer\n" -#: src/dird/inc_conf.c:696 -msgid "Options section not permitted in Exclude\n" -msgstr "" +#~ msgid "Pool %s created.\n" +#~ msgstr "Pool %s créé.\n" -#: src/dird/inc_conf.c:763 -#, c-format -msgid "Expected a FileSet keyword, got: %s" -msgstr "Attendait le mot clef FileSet, eu : %s" +#, fuzzy +#~ msgid "Failed to set bandwidth limit to Client.\n" +#~ msgstr "Impossible de se connecter au Client.\n" -#: src/dird/job.c:51 -#, c-format -msgid "Could not init job queue: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Running Job" +#~ msgstr "" +#~ "\n" +#~ "Job en cours :\n" -#: src/dird/job.c:83 src/dird/job.c:398 -#, c-format -msgid "Could not add job queue: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Enter new bandwidth limit kb/s: " +#~ msgstr "Saisissez la valeur du nombre maximum de Job : " -#: src/dird/job.c:110 src/dird/job.c:282 src/dird/jobq.c:209 -#: src/filed/job.c:286 src/stored/dircmd.c:189 src/stored/stored.c:575 -#, c-format -msgid "Unable to init job cond variable: ERR=%s\n" -msgstr "" +#~ msgid "Unauthorized command from this console.\n" +#~ msgstr "Commande interdite depuis cette console.\n" -#: src/dird/job.c:130 src/dird/job.c:301 src/dird/ua_output.c:879 -#: src/tools/cats_test.c:362 -#, c-format -msgid "Could not open database \"%s\".\n" -msgstr "Impossible d'ouvrir la base de données \"%s\".\n" +#~ msgid "Client \"%s\" not found.\n" +#~ msgstr "le client \"%s\" est introuvable.\n" -#: src/dird/job.c:157 src/dird/job.c:161 src/dird/job.c:167 src/dird/job.c:316 -#: src/dird/job.c:320 src/dird/ua_cmds.c:923 src/dird/ua_cmds.c:1705 -#: src/dird/ua_dotcmds.c:1083 src/dird/ua_status.c:408 -msgid "unknown source" -msgstr "source inconnue" +#~ msgid "Client \"%s\" address set to %s\n" +#~ msgstr "Client \"%s\" adresse positionné à %s\n" -#: src/dird/job.c:197 src/dird/job.c:574 src/dird/job.c:576 src/dird/job.c:794 -#: src/dird/job.c:796 src/dird/job.c:1500 src/dird/job.c:1542 -#: src/dird/job.c:1553 #, fuzzy -msgid "Job resource" -msgstr "Pool à partir de sa définition" +#~ msgid "Client \"%s\" %sabled\n" +#~ msgstr "le client \"%s\" est introuvable.\n" -#: src/dird/job.c:244 src/dird/job.c:376 src/dird/job.c:512 -#, c-format -msgid "Unimplemented job type: %d\n" -msgstr "" +#~ msgid "Connecting to Storage daemon %s at %s:%d\n" +#~ msgstr "Connexion au Storage Daemon %s (%s:%d)\n" -#: src/dird/job.c:436 -msgid "Job canceled because max start delay time exceeded.\n" -msgstr "" +#~ msgid "Connected to storage daemon\n" +#~ msgstr "Connecté au Storage Daemon\n" -#: src/dird/job.c:441 -#, fuzzy -msgid "Job canceled because max run sched time exceeded.\n" -msgstr "" -"Temps d'exécution maximum depuis la planification atteind. Abandon du job.\n" +#~ msgid "Enter new debug level: " +#~ msgstr "Saisissez le nouveau niveau de debug : " -#: src/dird/job.c:554 -msgid "Failed to connect to File daemon.\n" -msgstr "Impossible de se connecter au client.\n" +#~ msgid "Available daemons are: \n" +#~ msgstr "Les démons disponibles sont :\n" -#: src/dird/job.c:589 -#, fuzzy -msgid "Failed to select Storage daemon.\n" -msgstr "Impossible de se connecter au Storage daemon.\n" +#~ msgid "Director" +#~ msgstr "Director" -#: src/dird/job.c:594 src/dird/msgchan.c:70 src/dird/ua_cmds.c:929 -#: src/dird/ua_cmds.c:1730 src/dird/ua_dotcmds.c:1089 -msgid "Failed to connect to Storage daemon.\n" -msgstr "Impossible de se connecter au Storage daemon.\n" +#~ msgid "Storage" +#~ msgstr "Stockage" -#: src/dird/job.c:646 -#, fuzzy, c-format -msgid "Client resource \"%s\" does not exist.\n" -msgstr "Erreur : le client %s n'est pas définie.\n" +#~ msgid "Client" +#~ msgstr "Client" + +#~ msgid "Select daemon type to set debug level" +#~ msgstr "Sélectionnez le composant a mettre à jour" -#: src/dird/job.c:697 #, fuzzy -msgid "canceled" -msgstr "Annulé" +#~ msgid "No authorization for Client \"%s\"\n" +#~ msgstr "Pas d'enregistrement trouvé en base pour : %s\n" -#: src/dird/job.c:701 -msgid "stopped" -msgstr "" +#~ msgid "Job \"%s\" not found.\n" +#~ msgstr "Job \"%s\" non trouvé.\n" -#: src/dird/job.c:717 -#, fuzzy, c-format -msgid "JobId %s, Job %s marked to be %s.\n" -msgstr "JobId %s, Job %s marqué pour être annulé.\n" +#, fuzzy +#~ msgid "Fileset \"%s\" not found.\n" +#~ msgstr "Le FileSet \"%s\" est introuvable.\n" -#: src/dird/job.c:856 -msgid "Max wait time exceeded. Job canceled.\n" -msgstr "Temps d'attente maximum dépassé. Abandon du job.\n" +#, fuzzy +#~ msgid "No authorization for FileSet \"%s\"\n" +#~ msgstr "Pas d'enregistrement trouvé en base pour : %s\n" -#: src/dird/job.c:861 -msgid "Max run time exceeded. Job canceled.\n" -msgstr "Temps d'exécution maximum atteind. Abandon du job.\n" +#, fuzzy +#~ msgid "Level \"%s\" not valid.\n" +#~ msgstr "Le type %s est invalide.\n" -#: src/dird/job.c:866 #, fuzzy -msgid "Max run sched time exceeded. Job canceled.\n" -msgstr "Temps d'exécution maximum atteind. Abandon du job.\n" +#~ msgid "Invalid value for accurate. It must be yes or no.\n" +#~ msgstr "Saisie invalide. Veuillez répondre oui ou non.\n" -#: src/dird/job.c:988 -#, fuzzy, c-format -msgid "Cannot create pool \"%s\" in database. ERR=%s" -msgstr "Pool %s introuvable en base. %s" +#, fuzzy +#~ msgid "Accurate value missing.\n" +#~ msgstr "La valeur actuelle est : %s\n" -#: src/dird/job.c:992 -#, fuzzy, c-format -msgid "Created database record for Pool \"%s\".\n" -msgstr "Pas d'enregistrement trouvé en base pour : %s\n" +#~ msgid "No job specified.\n" +#~ msgstr "Pas de job sélectionné.\n" -#: src/dird/job.c:1066 src/dird/job.c:1102 -#, c-format -msgid "JobId %d already running. Duplicate job not allowed.\n" -msgstr "" +#~ msgid "Error sending include list.\n" +#~ msgstr "Erreur pendant l'envoi de la liste d'inclusion.\n" -#: src/dird/job.c:1092 -#, c-format -msgid "Cancelling duplicate JobId=%d.\n" -msgstr "" +#~ msgid "Error sending exclude list.\n" +#~ msgstr "Erreur pendant l'envoi de la liste d'exclusion.\n" -#: src/dird/job.c:1128 src/dird/job.c:1129 src/dird/job.c:1130 -msgid "Run NextPool override" -msgstr "" +#~ msgid "" +#~ "In general it is not a good idea to delete either a\n" +#~ "Pool or a Volume since they may contain data.\n" +#~ "\n" +#~ msgstr "" +#~ "Généralement supprimer un pool ou bien un volume\n" +#~ "n'est pas une bonne idée car ils peuvent contenir des données.\n" +#~ "\n" -#: src/dird/job.c:1134 src/dird/job.c:1135 src/dird/job.c:1136 -#: src/dird/job.c:1557 -#, fuzzy -msgid "Job's NextPool resource" -msgstr "Sélectionnez le Pool" +#~ msgid "Choose catalog item to delete" +#~ msgstr "Choisissez l'objet du catalogue à supprimer" + +#~ msgid "Nothing done.\n" +#~ msgstr "Rien de fait.\n" -#: src/dird/job.c:1144 src/dird/job.c:1145 src/dird/job.c:1561 #, fuzzy -msgid "Job Pool's NextPool resource" -msgstr "Sélectionnez le Pool" +#~ msgid "Are you sure you want to delete %d JobIds ? (yes/no): " +#~ msgstr "Êtes vous certain de vouloir supprimer ce Pool ? (oui/non) : " + +#~ msgid "Enter JobId to delete: " +#~ msgstr "Saisissez le JobId à supprimer : " -#: src/dird/job.c:1146 #, fuzzy -msgid "Pool's NextPool resource" -msgstr "Sélectionnez le Pool" +#~ msgid "Jobid %s and associated records deleted from the catalog.\n" +#~ msgstr "" +#~ "Le Job %s et les enregistrements associés ont été supprimés du " +#~ "catalogue.\n" -#: src/dird/job.c:1177 -msgid "Run Pool override" -msgstr "" +#~ msgid "" +#~ "\n" +#~ "This command will delete volume %s\n" +#~ "and all Jobs saved on that volume from the Catalog\n" +#~ msgstr "" +#~ "\n" +#~ "Cette commande va supprimer le Volume %s\n" +#~ "et tous les Jobs sauvegardés sur celui-ci du Catalogue\n" -#: src/dird/job.c:1188 -msgid "Run FullPool override" -msgstr "" +#, fuzzy +#~ msgid "Are you sure you want to delete Volume \"%s\"? (yes/no): " +#~ msgstr "Êtes vous certain de vouloir supprimer ce Volume ? (oui/non) : " -#: src/dird/job.c:1190 -msgid "Job FullPool override" -msgstr "" +#, fuzzy +#~ msgid "Are you sure you want to delete Pool \"%s\"? (yes/no): " +#~ msgstr "Êtes vous certain de vouloir supprimer ce Pool ? (oui/non) : " -#: src/dird/job.c:1199 -msgid "Run IncPool override" -msgstr "" +#, fuzzy +#~ msgid "Invalid device name. %s" +#~ msgstr "Option d'écrasement (Replace) invalide : %s\n" -#: src/dird/job.c:1201 -msgid "Job IncPool override" -msgstr "" +#~ msgid "Using Catalog name=%s DB=%s\n" +#~ msgstr "Utilisation du Catalogue name=%s DB=%s\n" -#: src/dird/job.c:1210 -msgid "Run DiffPool override" -msgstr "" +#~ msgid "ERR: Job was not found\n" +#~ msgstr "ERR: Job %s non trouvé\n" -#: src/dird/job.c:1212 -msgid "Job DiffPool override" -msgstr "" +#, fuzzy +#~ msgid "" +#~ " Command Description\n" +#~ " ======= ===========\n" +#~ msgstr "" +#~ " Commande Description\n" +#~ " ======== ===========\n" -#: src/dird/job.c:1233 #, fuzzy -msgid "No Client specified.\n" -msgstr "Le client est déjà spécifié.\n" +#~ msgid " %-13s %s\n" +#~ msgstr " %-10s %s\n" -#: src/dird/job.c:1246 src/stored/bscan.c:1041 -#, c-format -msgid "Could not create Client record. ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Can't find %s command.\n" +#~ "\n" +#~ msgstr ": est une commande invalide.\n" -#: src/dird/job.c:1283 -msgid "FileSet MD5 digest not found.\n" -msgstr "" +#~ msgid "" +#~ "\n" +#~ "When at a prompt, entering a period cancels the command.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Sur une question, tapez un point (.) pour annuler la commande en cours.\n" -#: src/dird/job.c:1288 -#, c-format -msgid "Could not create FileSet \"%s\" record. ERR=%s\n" -msgstr "" +#~ msgid "Could not find a Catalog resource\n" +#~ msgstr "Impossible de trouver un Catalogue\n" -#: src/dird/job.c:1330 -#, c-format -msgid "Error updating job record. %s" -msgstr "" +#~ msgid "Could not open catalog database \"%s\".\n" +#~ msgstr "Impossible d'ouvrir le catalogue \"%s\".\n" -#: src/dird/job.c:1487 -msgid "Run pool override" -msgstr "" +#~ msgid "Using Catalog \"%s\"\n" +#~ msgstr "Utilisation du Catalogue \"%s\"\n" -#: src/dird/job.c:1492 -msgid "Run storage override" -msgstr "" +#, fuzzy +#~ msgid "List Media failed: ERR=%s\n" +#~ msgstr "fopen %s en erreur : ERR=%s\n" -#: src/dird/job.c:1571 #, fuzzy -msgid "Client resource" -msgstr "Pas de ressource \"Restore Job\" trouvée !\n" +#~ msgid "Command line" +#~ msgstr "Erreur sur la commande : %s\n" -#: src/dird/job.c:1627 src/dird/ua_run.c:429 -msgid "No storage specified.\n" -msgstr "Pas de storage sélectionné.\n" +#, fuzzy +#~ msgid "Invalid keyword found: %s\n" +#~ msgstr "Argument invalide : %s\n" -#: src/dird/job.c:1788 -#, fuzzy, c-format -msgid "Could not start clone job: \"%s\".\n" -msgstr "Impossible d'ouvrir la base de données \"%s\".\n" +#, fuzzy +#~ msgid "Display data files usage" +#~ msgstr "Message de Bacula" -#: src/dird/job.c:1791 -#, c-format -msgid "Clone JobId %d started.\n" -msgstr "" +#, fuzzy +#~ msgid "Select action to perform on Dedup Engine" +#~ msgstr "Sélectionnez le composant a tuer" -#: src/dird/jobq.c:63 -#, c-format -msgid "pthread_attr_init: ERR=%s\n" -msgstr "" +#~ msgid ": is an invalid command.\n" +#~ msgstr ": est une commande invalide.\n" -#: src/dird/jobq.c:72 -#, c-format -msgid "pthread_mutex_init: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Failed to send command to Client.\n" +#~ msgstr "Impossible de se connecter au Client.\n" -#: src/dird/jobq.c:78 -#, c-format -msgid "pthread_cond_init: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to get Job record for Job=%s\n" +#~ msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" -#: src/dird/jobq.c:120 -#, c-format -msgid "pthread_cond_broadcast: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to get last Job record for Job=%s\n" +#~ msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" -#: src/dird/jobq.c:128 -#, c-format -msgid "pthread_cond_wait: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to get Client record for Client=%s\n" +#~ msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" -#: src/dird/jobq.c:169 -#, c-format -msgid "Job %s waiting %d seconds for scheduled start time.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to get last Job record for Client=%s\n" +#~ msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" -#: src/dird/jobq.c:231 -#, c-format -msgid "pthread_thread_create: ERR=%s\n" -msgstr "" +#~ msgid "Unable to get Job record for JobId=%s: ERR=%s\n" +#~ msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" -#: src/dird/jobq.c:341 -#, c-format -msgid "pthread_cond_signal: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unknown command: %s\n" +#~ msgstr "Erreur inconnue." -#: src/dird/jobq.c:352 -#, c-format -msgid "pthread_create: ERR=%s\n" -msgstr "" +#~ msgid "Select daemon type to make die" +#~ msgstr "Sélectionnez le composant a tuer" -#: src/dird/jobq.c:640 -#, c-format -msgid "Rescheduled Job %s at %s to re-run in %d seconds (%s).\n" -msgstr "" +#, fuzzy +#~ msgid "query keyword not found.\n" +#~ msgstr "%s ressource %s introuvable.\n" -#: src/dird/jobq.c:704 src/dird/jobq.c:709 -msgid "previous Job" -msgstr "" +#, fuzzy +#~ msgid "List MediaType failed: ERR=%s\n" +#~ msgstr "fopen %s en erreur : ERR=%s\n" -#: src/dird/jobq.c:746 -#, c-format -msgid "" -"Job canceled. Attempt to read and write same device.\n" -" Read storage \"%s\" (From %s) -- Write storage \"%s\" (From %s)\n" -msgstr "" +#, fuzzy +#~ msgid "List Location failed: ERR=%s\n" +#~ msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" -#: src/dird/mac.c:98 src/dird/vbackup.c:65 -msgid "Could not get or create a Pool record.\n" -msgstr "Impossible de récupérer ou de créer un Pool dans le catalogue.\n" +#~ msgid "Enter slot" +#~ msgstr "Saisissez le slot" -#: src/dird/mac.c:113 src/dird/vbackup.c:242 -#, fuzzy -msgid "Could not get or create the FileSet record.\n" -msgstr "Impossible de créer la structure BSOCK cliente.\n" +#~ msgid "Expected a positive integer, got: %s\n" +#~ msgstr "Attendait un entier positif, pas : %s\n" -#: src/dird/mac.c:131 src/dird/mac.c:145 -#, fuzzy, c-format -msgid "No previous Job found to %s.\n" -msgstr "Aucun Job trouvé pour la migration.\n" +#~ msgid "Invalid response. You must answer yes or no.\n" +#~ msgstr "Réponse invalide. Vous devez répondre oui ou non.\n" -#: src/dird/mac.c:137 #, fuzzy -msgid "Create bootstrap file failed.\n" -msgstr "Impossible de restaurer sans un fichier bootstrap.\n" - -#: src/dird/mac.c:147 -#, fuzzy, c-format -msgid "Previous Job has no data to %s.\n" -msgstr "Aucun volume trouvé pour la restauration.\n" +#~ msgid "Invalid Enabled value, it must be yes, no, archived, 0, 1, or 2\n" +#~ msgstr "Saisie invalide. Veuillez répondre oui ou non.\n" -#: src/dird/mac.c:164 -#, fuzzy, c-format -msgid "Job resource not found for \"%s\".\n" -msgstr "La ressource Pool \"%s\" est introuvable !\n" +#, fuzzy +#~ msgid "Illegal character \"%c\" in a comment.\n" +#~ msgstr "Caractère illégal \"%c\" dans le nom.\n" -#: src/dird/mac.c:168 -#, fuzzy, c-format -msgid "Previous Job resource not found for \"%s\".\n" -msgstr "La ressource Pool \"%s\" est introuvable !\n" +#, fuzzy +#~ msgid "Comment too long.\n" +#~ msgstr "Nom trop long.\n" -#: src/dird/mac.c:191 #, fuzzy -msgid "setup job failed.\n" -msgstr "Job échoué.\n" +#~ msgid "Comment must be at least one character long.\n" +#~ msgstr "Le nom du volume doit comporter au moins un caractère\n" -#: src/dird/mac.c:247 -#, c-format -msgid "Pool for JobId %s not in database. ERR=%s\n" -msgstr "" +#~ msgid "Negative numbers not permitted\n" +#~ msgstr "Les nombres négatifs ne sont pas autorisés\n" -#: src/dird/mac.c:255 -#, c-format -msgid "Pool resource \"%s\" not found.\n" -msgstr "" +#~ msgid "Input value is not an integer.\n" +#~ msgstr "La valeur saisie n'est pas un nombre.\n" -#: src/dird/mac.c:330 src/dird/mac_sql.c:422 -#, fuzzy, c-format -msgid "Could not get job record for JobId %s to %s. ERR=%s" -msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" +#~ msgid "Values must be be greater than zero.\n" +#~ msgstr "Les valeurs doivent être supérieurs à zéro.\n" -#: src/dird/mac.c:341 -#, c-format -msgid "JobId %s already %s probably by another Job. %s stopped.\n" -msgstr "" +#~ msgid "Slot too large.\n" +#~ msgstr "Slot trop grand.\n" -#: src/dird/mac.c:351 -#, fuzzy, c-format -msgid "Start %s JobId %s, Job=%s\n" -msgstr "Démarrage du backup JobId %s, Job=%s\n" +#~ msgid "No slots in changer to scan.\n" +#~ msgstr "Pas de slot dans le magasin à scanner.\n" -#: src/dird/mac.c:491 -msgid "The Storage daemon does not support SDCallsClient.\n" -msgstr "" +#~ msgid "No Volumes found to label, or no barcodes.\n" +#~ msgstr "Pas de volume à labéliser ou pas de codebar.\n" -#: src/dird/mac.c:605 -#, fuzzy -msgid "Could not start migration/copy job.\n" -msgstr "Impossible d'ouvrir la base de données \"%s\".\n" +#~ msgid "Slot %d greater than max %d ignored.\n" +#~ msgstr "Le slot %d est ignoré car il est supérieur au maximum %d.\n" -#: src/dird/mac.c:607 -#, fuzzy, c-format -msgid "%s JobId %d started.\n" -msgstr "Le job %d est annulé.\n" +#~ msgid "No VolName for Slot=%d InChanger set to zero.\n" +#~ msgstr "Pas de volume sur le Slot %d. Mise à zéro de InChanger.\n" -#: src/dird/mac.c:757 -#, c-format -msgid "%s OK -- with warnings" -msgstr "%s OK -- avec des avertissements" +#~ msgid "Catalog record for Volume \"%s\" updated to reference slot %d.\n" +#~ msgstr "" +#~ "Mise à jour des informations du volume \"%s\" dans le catalogue (Slot=" +#~ "%d).\n" -#: src/dird/mac.c:759 -#, c-format -msgid "%s OK" -msgstr "" +#~ msgid "Catalog record for Volume \"%s\" is up to date.\n" +#~ msgstr "Le volume \"%s\" est à jour dans le catalogue.\n" -#: src/dird/mac.c:764 -#, c-format -msgid "*** %s Error ***" -msgstr "*** %s Erreur ***" +#~ msgid "Volume \"%s\" not found in catalog. Slot=%d InChanger set to zero.\n" +#~ msgstr "" +#~ "Volume \"%s\" absent du catalogue. mise à zéro de InChanger pour le Slot=" +#~ "%d.\n" -#: src/dird/mac.c:780 -#, c-format -msgid "%s Canceled" -msgstr "%s Annulé" +#~ msgid "" +#~ "Volume \"%s\" has VolStatus %s. It must be Purged or Recycled before " +#~ "relabeling.\n" +#~ msgstr "" +#~ "Le volume \"%s\" (VolStatus) a le statut \"%s\". Il doit être purgé ou " +#~ "bien\n" +#~ "recyclé avant de pouvoir le re-labéliser.\n" -#: src/dird/mac.c:795 -#, c-format -msgid "Inappropriate %s term code" -msgstr "" +#~ msgid "Enter new Volume name: " +#~ msgstr "Saisissez le nouveau nom du Volume : " -#: src/dird/mac.c:805 -#, fuzzy, c-format -msgid "%s -- no files to %s" -msgstr "Aucun volume trouvé pour la restauration.\n" +#~ msgid "Media record for new Volume \"%s\" already exists.\n" +#~ msgstr "Le nouveau volume \"%s\" existe déjà en base.\n" -#: src/dird/mac.c:833 -#, fuzzy, c-format -msgid "" -"%s %s %s (%s):\n" -" Build OS: %s %s %s\n" -" Prev Backup JobId: %s\n" -" Prev Backup Job: %s\n" -" New Backup JobId: %s\n" -" Current JobId: %s\n" -" Current Job: %s\n" -" Backup Level: %s%s\n" -" Client: %s\n" -" FileSet: \"%s\" %s\n" -" Read Pool: \"%s\" (From %s)\n" -" Read Storage: \"%s\" (From %s)\n" -" Write Pool: \"%s\" (From %s)\n" -" Write Storage: \"%s\" (From %s)\n" -" Catalog: \"%s\" (From %s)\n" -" Start time: %s\n" -" End time: %s\n" -" Elapsed time: %s\n" -" Priority: %d\n" -" SD Files Written: %s\n" -" SD Bytes Written: %s (%sB)\n" -" Rate: %.1f KB/s\n" -" Volume name(s): %s\n" -" Volume Session Id: %d\n" -" Volume Session Time: %d\n" -" Last Volume Bytes: %s\n" -" SD Errors: %d\n" -" SD termination status: %s\n" -" Termination: %s\n" -"\n" -msgstr "" -"%s %s %s (%s): %s\n" -" Build OS : %s %s %s\n" -" Prec Backup JobId : %s\n" -" Prec Backup Job : %s\n" -" Nouveau JobId : %s\n" -" JobId courrant : %s\n" -" Job courrant : %s\n" -" Niveau de backup : %s%s\n" -" Client : %s\n" -" FileSet : \"%s\" %s\n" -" Pool de lecture : \"%s\" (Depuis %s)\n" -" Storage de lecture : \"%s\" (Depuis %s)\n" -" Pool d'écriture : \"%s\" (Depuis %s)\n" -" Storage d'écriture : \"%s\" (Depuis %s)\n" -" Catalogue : \"%s\" (Depuis %s)\n" -" Date de début : %s\n" -" Date de fin : %s\n" -" Temps écoulé : %s\n" -" Priorité : %d\n" -" Fichiers écrits SD : %s\n" -" Octets écrits SD : %s (%so)\n" -" Débit : %.1f Ko/s\n" -" Nom des Volumes : %s\n" -" Volume Session Id : %d\n" -" Volume Session date : %d\n" -" Taille du volume : %s (%so)\n" -" Erreurs du SD : %d\n" -" Statut de fin du SD : %s\n" -" Statut de fin : %s\n" - -#: src/dird/mac.c:903 src/dird/mac.c:906 -#, c-format -msgid "No Next Pool specification found in Pool \"%s\".\n" -msgstr "" +#~ msgid "Enter slot (0 or Enter for none): " +#~ msgstr "Saisissez le slot (0 ou Entrée pour aucun) : " -#: src/dird/mac.c:913 -#, c-format -msgid "No Storage specification found in Next Pool \"%s\".\n" -msgstr "" +#~ msgid "Delete of Volume \"%s\" failed. ERR=%s" +#~ msgstr "Impossible de supprimer le volume \"%s\". ERR=%s" -#: src/dird/mac_sql.c:236 -#, fuzzy, c-format -msgid "No %s SQL selection pattern specified.\n" -msgstr "Pas de storage sélectionné.\n" +#~ msgid "Old volume \"%s\" deleted from catalog.\n" +#~ msgstr "L'ancien volume \"%s\" a été supprimé du catalogue.\n" -#: src/dird/mac_sql.c:243 src/dird/mac_sql.c:262 src/dird/mac_sql.c:283 -#: src/dird/mac_sql.c:319 src/dird/mac_sql.c:346 src/dird/mac_sql.c:465 -#: src/dird/mac_sql.c:594 src/dird/mac_sql.c:622 -#, fuzzy, c-format -msgid "SQL failed. ERR=%s\n" -msgstr "fopen %s en erreur : ERR=%s\n" +#~ msgid "Requesting to mount %s ...\n" +#~ msgstr "Demande pour monter %s...\n" -#: src/dird/mac_sql.c:266 src/dird/mac_sql.c:273 src/dird/mac_sql.c:287 -#: src/dird/mac_sql.c:350 -#, fuzzy, c-format -msgid "No Volumes found to %s.\n" -msgstr "Aucun volume trouvé pour la restauration.\n" +#~ msgid "Do not forget to mount the drive!!!\n" +#~ msgstr "N'oubliez pas de monter le lecteur.\n" + +#~ msgid "" +#~ "The following Volumes will be labeled:\n" +#~ "Slot Volume\n" +#~ "==============\n" +#~ msgstr "" +#~ "Les volumes suivants vont être labélisés :\n" +#~ "Slot Volume\n" +#~ "==============\n" -#: src/dird/mac_sql.c:301 src/dird/mac_sql.c:390 src/dird/mac_sql.c:410 #, fuzzy -msgid "Invalid JobId found.\n" -msgstr "Période invalide.\n" +#~ msgid "Do you want to label these Volumes? (yes|no): " +#~ msgstr "" +#~ "\n" +#~ "Voulez vous restaurer tous les fichiers ? (oui|non) : " -#: src/dird/mac_sql.c:361 -#, fuzzy, c-format -msgid "Unknown %s Selection Type.\n" -msgstr "Job du Type=%d inconnu\n" +#~ msgid "Error setting InChanger: ERR=%s" +#~ msgstr "Impossible de positionner le flag InChanger : ERR=%s" -#: src/dird/mac_sql.c:372 src/dird/mac_sql.c:393 src/dird/mac_sql.c:413 -#, fuzzy, c-format -msgid "No JobIds found to %s.\n" -msgstr "Pas de job trouvé pour : %s.\n" +#~ msgid "Maximum pool Volumes=%d reached.\n" +#~ msgstr "Le nombre maximum de volume (%d) pour ce pool est atteint.\n" -#: src/dird/mac_sql.c:376 -#, fuzzy, c-format -msgid "The following %u JobId%s chosen to be %s: %s\n" -msgstr "Les fichiers suivants sont absents :\n" +#~ msgid "Illegal character \"%c\" in a volume name.\n" +#~ msgstr "Caractères \"%c\" interdits dans le nom d'un volume.\n" -#: src/dird/mac_sql.c:377 -msgid " was" -msgstr "" +#~ msgid "Sending relabel command from \"%s\" to \"%s\" ...\n" +#~ msgstr "Envoie de la commande pour re-labéliser de \"%s\" à \"%s\"...\n" -#: src/dird/mac_sql.c:377 -msgid "s were" -msgstr "" +#~ msgid "Sending label command for Volume \"%s\" Slot %d ...\n" +#~ msgstr "Demande de labélisation du volume \"%s\" Slot %d...\n" -#: src/dird/mac_sql.c:429 -#, fuzzy, c-format -msgid "%s using JobId=%s Job=%s\n" -msgstr "Migration utilisant JobId=%s Job=%s\n" +#~ msgid "Label command failed for Volume %s.\n" +#~ msgstr "Impossible de labéliser le volume %s.\n" -#: src/dird/mac_sql.c:469 src/dird/mac_sql.c:599 -#, fuzzy, c-format -msgid "No %ss found to %s.\n" -msgstr "Aucun volume trouvé pour la restauration.\n" +#~ msgid "Could not open SD socket.\n" +#~ msgstr "Impossible d'ouvrir la socket avec le SD.\n" -#: src/dird/mac_sql.c:491 -msgid "Selection Type 'pooluncopiedjobs' only applies to Copy Jobs" -msgstr "" +#~ msgid "Invalid Slot number: %s\n" +#~ msgstr "Numéro de slot invalide : %s\n" -#: src/dird/mac_sql.c:500 -#, fuzzy, c-format -msgid "SQL to get uncopied jobs failed. ERR=%s\n" -msgstr "fopen %s en erreur : ERR=%s\n" +#, fuzzy +#~ msgid "Invalid Volume name: %s. Volume skipped.\n" +#~ msgstr "Nom de Volume invalide : %s\n" -#: src/dird/mac_sql.c:523 -#, fuzzy, c-format -msgid "No %s %s selection pattern specified.\n" -msgstr "Pas de storage sélectionné.\n" +#~ msgid "Device \"%s\" has %d slots.\n" +#~ msgstr "Le Device \"%s\" a %d slots.\n" -#: src/dird/mac_sql.c:534 -#, fuzzy, c-format -msgid "SQL to get %s failed. ERR=%s\n" -msgstr "fopen %s en erreur : ERR=%s\n" +#~ msgid "Pool \"%s\" resource not found for volume \"%s\"!\n" +#~ msgstr "La ressource Pool \"%s\" est introuvable pour le volume \"%s\"\n" -#: src/dird/mac_sql.c:539 -#, c-format -msgid "Query of Pool \"%s\" returned no Jobs to %s.\n" -msgstr "" +#, fuzzy +#~ msgid "No Volumes found, or no barcodes.\n" +#~ msgstr "Pas de volume à labéliser ou pas de codebar.\n" -#: src/dird/mac_sql.c:577 -#, c-format -msgid "Regex pattern matched no Jobs to %s.\n" -msgstr "" +#~ msgid "ON or OFF keyword missing.\n" +#~ msgstr "Mot clef ON ou OFF manquant.\n" -#: src/dird/mac_sql.c:626 -#, fuzzy, c-format -msgid "No %s found to %s.\n" -msgstr "Aucun volume trouvé pour la restauration.\n" +#, fuzzy +#~ msgid "Disabled Jobs:\n" +#~ msgstr "est bloqué" -#: src/dird/mac_sql.c:630 -#, c-format -msgid "SQL error. Expected 1 MediaId got %d\n" -msgstr "" +#, fuzzy +#~ msgid "No disabled Jobs.\n" +#~ msgstr "Pas de job programmé.\n" -#: src/dird/msgchan.c:67 -#, c-format -msgid "Connecting to Storage daemon %s at %s:%d ...\n" -msgstr "Connexion au Storage Daemon %s (%s:%d)...\n" +#~ msgid "%s resource %s not found.\n" +#~ msgstr "%s ressource %s introuvable.\n" -#: src/dird/msgchan.c:122 src/filed/job.c:1990 -#: src/qt-console/tray-monitor/tray-monitor.cpp:376 src/stored/dircmd.c:367 -msgid "Storage daemon" -msgstr "" +#~ msgid "Resource %s not found\n" +#~ msgstr "Ressource %s introuvable\n" -#: src/dird/msgchan.c:235 -#, c-format -msgid "Storage daemon rejected Job command: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Invalid jobid argument\n" +#~ msgstr "argument invalide" -#: src/dird/msgchan.c:243 -#, c-format -msgid " -- estime un FileSet (listing donne la liste des fichiers)" +#~ msgid "Job \"%s\" not found\n" +#~ msgstr "Le job \"%s\" est introuvable\n" -#: src/dird/ua_cmds.c:109 src/dird/ua_cmds.c:134 -msgid "Terminate Bconsole session" -msgstr "" +#~ msgid "A job name must be specified.\n" +#~ msgstr "Un nom de Job doit être spécifié.\n" -#: src/dird/ua_cmds.c:110 -#, fuzzy -msgid "Non-interactive gui mode" -msgstr "gui [on|off] -- mode non interactif (pour interface graphique)" +#~ msgid "Pool \"%s\" not found.\n" +#~ msgstr "Le pool \"%s\" est introuvable.\n" -#: src/dird/ua_cmds.c:111 #, fuzzy -msgid "Print help on specific command" -msgstr "affiche cette commande" +#~ msgid "NextPool \"%s\" not found.\n" +#~ msgstr "Le pool \"%s\" est introuvable.\n" -#: src/dird/ua_cmds.c:117 #, fuzzy -msgid "Label a tape" -msgstr "labéliser une bande" +#~ msgid "No authorization. NextPool \"%s\".\n" +#~ msgstr "Pas d'enregistrement trouvé en base pour : %s\n" -#: src/dird/ua_cmds.c:118 #, fuzzy -msgid "List objects from catalog" -msgstr "purge les enregistrements du catalogue" - -#: src/dird/ua_cmds.c:122 -msgid "Full or long list like list command" -msgstr "" +#~ msgid "Restore Client \"%s\" not found.\n" +#~ msgstr "le client \"%s\" est introuvable.\n" -#: src/dird/ua_cmds.c:125 -#, fuzzy -msgid "Display pending messages" -msgstr "Message de Bacula" +#~ msgid "FileSet \"%s\" not found.\n" +#~ msgstr "Le FileSet \"%s\" est introuvable.\n" -#: src/dird/ua_cmds.c:126 -#, fuzzy -msgid "Print current memory usage" -msgstr "affiche la consommation mémoire courante" +#~ msgid "Storage \"%s\" not found.\n" +#~ msgstr "Le Storage \"%s\" est introuvable.\n" -#: src/dird/ua_cmds.c:127 #, fuzzy -msgid "Mount storage" -msgstr "unmount -- démonte un lecteur" +#~ msgid "No JobId specified.\n" +#~ msgstr "Pas de job sélectionné.\n" -#: src/dird/ua_cmds.c:130 #, fuzzy -msgid "Prune expired records from catalog" -msgstr "purge les entrées expirées du catalogue" +#~ msgid "Invalid or no Job name specified.\n" +#~ msgstr "Le job est déjà spécifié.\n" -#: src/dird/ua_cmds.c:133 #, fuzzy -msgid "Purge records from catalog" -msgstr "purge les enregistrements du catalogue" +#~ msgid "Enter the JobId list to select: " +#~ msgstr "Entrez le JobId à sélectionner : " -#: src/dird/ua_cmds.c:135 #, fuzzy -msgid "Query catalog" -msgstr "interroger le catalogue" +#~ msgid "Could not get job record for selected JobId=%d. ERR=%s" +#~ msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" -#: src/dird/ua_cmds.c:136 -msgid "Manage Global Deduplication Engine" -msgstr "" +#~ msgid "You have the following choices:\n" +#~ msgstr "Vous avez les choix suivants :\n" -#: src/dird/ua_cmds.c:138 #, fuzzy -msgid "Restore files" -msgstr "restauration de fichier" +#~ msgid "Select termination code: " +#~ msgstr "Sélection terminée.\n" -#: src/dird/ua_cmds.c:143 #, fuzzy -msgid "Relabel a tape" -msgstr "re-labélise une bande" +#~ msgid "Unable to use current plugin configuration, discarding it." +#~ msgstr "Impossible de lire le certificat à partir du fichier" -#: src/dird/ua_cmds.c:146 #, fuzzy -msgid "Release storage" -msgstr "Restaurer" +#~ msgid "Plugin Restore Options\n" +#~ msgstr "Sélectionnez le Job de restauration" -#: src/dird/ua_cmds.c:147 #, fuzzy -msgid "Reload conf file" -msgstr "recharge la configuration" +#~ msgid "Use above plugin configuration? (yes/mod/no): " +#~ msgstr "Continuer ? (oui/mod/non) : " -#: src/dird/ua_cmds.c:148 -#, fuzzy -msgid "Run a job" -msgstr "Job en cours :\n" +#~ msgid "mod" +#~ msgstr "mod" -#: src/dird/ua_cmds.c:153 #, fuzzy -msgid "Restart a job" -msgstr "Sélectionnez le Job de restauration" +#~ msgid "Please enter a value for %s: " +#~ msgstr "Saisissez le JobId pour la restauration : " -#: src/dird/ua_cmds.c:157 #, fuzzy -msgid "Resume a job" -msgstr "Job en cours :\n" +#~ msgid "Plugins to configure:\n" +#~ msgstr "Plugin=%s non trouvé.\n" -#: src/dird/ua_cmds.c:161 #, fuzzy -msgid "Report status" -msgstr "Statut :\n" +#~ msgid "Select plugin to configure" +#~ msgstr "TLS actif mais non configuré.\n" -#: src/dird/ua_cmds.c:167 #, fuzzy -msgid "Stop a job" -msgstr "Job en cours :\n" +#~ msgid "Can't configure %32s\n" +#~ msgstr "Impossible d'ouvrir le fichier de configuration \"%s\" : %s\n" + +#~ msgid "Level" +#~ msgstr "Type" -#: src/dird/ua_cmds.c:168 #, fuzzy -msgid "Sets debug level" -msgstr "positionne le niveau de debug" +#~ msgid "Restore Client" +#~ msgstr "Restauration annulée" -#: src/dird/ua_cmds.c:171 -msgid "Sets bandwidth" -msgstr "" +#~ msgid "When" +#~ msgstr "Quand" -#: src/dird/ua_cmds.c:175 -msgid "Handle snapshots" -msgstr "" +#~ msgid "Priority" +#~ msgstr "Priorité" -#: src/dird/ua_cmds.c:178 -msgid "Sets new client address -- if authorized" -msgstr "" +#~ msgid "Pool" +#~ msgstr "Pool" -#: src/dird/ua_cmds.c:179 #, fuzzy -msgid "Show resource records" -msgstr "Pool à partir de sa définition" +#~ msgid "NextPool" +#~ msgstr "Pool" -#: src/dird/ua_cmds.c:182 -#, fuzzy -msgid "Use SQL to query catalog" -msgstr "passer des commandes SQL pour interroger le catalogue" +#~ msgid "Verify Job" +#~ msgstr "Job de vérification" -#: src/dird/ua_cmds.c:183 -#, fuzzy -msgid "Print current time" -msgstr "affiche la date courante" +#~ msgid "Bootstrap" +#~ msgstr "Bootstrap" -#: src/dird/ua_cmds.c:184 -#, fuzzy -msgid "Turn on/off trace to file" -msgstr "active/désactive le fichier de trace" +#~ msgid "Where" +#~ msgstr "Destination" -#: src/dird/ua_cmds.c:185 -msgid "Truncate one or more Volumes" -msgstr "" +#~ msgid "Replace" +#~ msgstr "Ecrasement" -#: src/dird/ua_cmds.c:186 -#, fuzzy -msgid "Unmount storage" -msgstr "unmount -- démonte un lecteur" +#~ msgid "JobId" +#~ msgstr "JobId" -#: src/dird/ua_cmds.c:189 -#, fuzzy -msgid "Umount - for old-time Unix guys, see unmount" -msgstr "umount -- démonte un lecteur" +#~ msgid "" +#~ "Please enter desired start time as YYYY-MM-DD HH:MM:SS (return for now): " +#~ msgstr "" +#~ "Saisissez la date de lancement (YYYY-MM-DD HH:MM:SS) (ou maintenant) : " -#: src/dird/ua_cmds.c:192 -#, fuzzy -msgid "Update volume, pool or stats" -msgstr "met à jour un volume, un pool ou bien des slots" +#~ msgid "Enter new Priority: " +#~ msgstr "Saisissez la nouvelle priorité : " -#: src/dird/ua_cmds.c:199 -#, fuzzy -msgid "Use catalog xxx" -msgstr "interroger le catalogue" +#~ msgid "Priority must be a positive integer.\n" +#~ msgstr "La priorité doit être un entier positif.\n" -#: src/dird/ua_cmds.c:200 -msgid "Does variable expansion" -msgstr "" +#~ msgid "Please enter the Bootstrap file name: " +#~ msgstr "Saisissez le nom du fichier Bootstrap : " -#: src/dird/ua_cmds.c:201 -#, fuzzy -msgid "Print Director version" -msgstr "affiche la version du Director" +# Impossible d'ouvrir %s : ERR=%s +#~ msgid "Warning cannot open %s: ERR=%s\n" +#~ msgstr "Impossible d'ouvrir %s : ERR=%s\n" -#: src/dird/ua_cmds.c:202 #, fuzzy -msgid "Wait until no jobs are running" -msgstr "Aucun de vos jobs ne sont en cours.\n" +#~ msgid "Please enter the full path prefix for restore (/ for none): " +#~ msgstr "Saisissez le chemin (prefix) pour la restauration (/ pour aucun) : " -#: src/dird/ua_cmds.c:244 src/dird/ua_dotcmds.c:160 -#, c-format -msgid "Can't use %s command in a runscript" -msgstr "" - -#: src/dird/ua_cmds.c:255 -#, c-format -msgid "%s: is an invalid command.\n" -msgstr "%s : est une commande invalide.\n" +#~ msgid "Replace:\n" +#~ msgstr "Ecrasement :\n" -#: src/dird/ua_cmds.c:296 -msgid "" -"You probably don't want to be using this command since it\n" -"creates database records without labeling the Volumes.\n" -"You probably want to use the \"label\" command.\n" -"\n" -msgstr "" +#~ msgid "Select replace option" +#~ msgstr "Saisissez l'option d'écrasement" -#: src/dird/ua_cmds.c:314 -#, c-format -msgid "Pool already has maximum volumes=%d\n" -msgstr "Le pool a déjà atteint le nombre maximum de volume=%d\n" +#~ msgid "" +#~ "You must set the bootstrap file to NULL to be able to specify a JobId.\n" +#~ msgstr "" +#~ "Vous ne devez pas spécifié de fichier bootstrap pour pouvoir utiliser un " +#~ "JobId.\n" -#: src/dird/ua_cmds.c:315 -msgid "Enter new maximum (zero for unlimited): " -msgstr "Entrez le nouveau maximum (zéro pour illimité) : " +#, fuzzy +#~ msgid "Please Plugin Options string: " +#~ msgstr "Saisissez le début du chemin (prefix) à enlever : " -#: src/dird/ua_cmds.c:335 -#, c-format -msgid "Enter number of Volumes to create. 0=>fixed name. Max=%d: " -msgstr "Entrez le nombre de Volume à créer. 0=>nom fixé. Max=%d : " +#, fuzzy +#~ msgid "Command input" +#~ msgstr "Erreur sur la commande : %s\n" -#: src/dird/ua_cmds.c:341 -#, c-format -msgid "The number must be between 0 and %d\n" -msgstr "Le nombre doit être entre 0 et %d\n" +#~ msgid "Invalid replace option: %s\n" +#~ msgstr "Option d'écrasement (Replace) invalide : %s\n" -#: src/dird/ua_cmds.c:349 -msgid "Enter Volume name: " -msgstr "Entrez le nom du Volume : " +#, fuzzy +#~ msgid "Please enter the path prefix to strip: " +#~ msgstr "Saisissez le début du chemin (prefix) à enlever : " -#: src/dird/ua_cmds.c:353 -msgid "Enter base volume name: " -msgstr "Entrez le nom de base du volume : " +#, fuzzy +#~ msgid "Please enter the path prefix to add (/ for none): " +#~ msgstr "Saisissez le chemin (prefix) à ajouter (/ pour aucun) : " -#: src/dird/ua_cmds.c:362 src/dird/ua_label.c:652 -msgid "Volume name too long.\n" -msgstr "Nom de Volume trop long.\n" +#, fuzzy +#~ msgid "Please enter the file suffix to add: " +#~ msgstr "Saisissez une extention à ajouter aux fichiers : " -#: src/dird/ua_cmds.c:366 src/dird/ua_label.c:658 src/lib/edit.c:514 -msgid "Volume name must be at least one character long.\n" -msgstr "Le nom du volume doit comporter au moins un caractère\n" +#~ msgid "Please enter a valid regexp (!from!to!): " +#~ msgstr "Saisissez une regexp valide (!rechercher!remplacer!) : " -#: src/dird/ua_cmds.c:377 -msgid "Enter the starting number: " -msgstr "Entrez le nombre de départ : " +#~ msgid "Cannot use your regexp\n" +#~ msgstr "Impossible d'utiliser votre regexp\n" -#: src/dird/ua_cmds.c:382 -msgid "Start number must be greater than zero.\n" -msgstr "Le nombre de départ doit être supérieur à zéro.\n" +#~ msgid "Please enter filename to test: " +#~ msgstr "Saisissez un nom de fichier à tester : " -#: src/dird/ua_cmds.c:393 -msgid "Enter slot (0 for none): " -msgstr "Saisissez le slot (0 pour aucun) : " +#~ msgid "%s -> %s\n" +#~ msgstr "%s -> %s\n" -#: src/dird/ua_cmds.c:397 -msgid "InChanger? yes/no: " -msgstr "InChanger ? oui/non : " +#~ msgid "Cannot use your regexp.\n" +#~ msgstr "Impossible d'utiliser votre regexp.\n" -#: src/dird/ua_cmds.c:425 -#, c-format -msgid "%d Volumes created in pool %s\n" -msgstr "%d Volumes créés dans le pool %s\n" +#~ msgid "Levels:\n" +#~ msgstr "Types :\n" -#: src/dird/ua_cmds.c:441 src/dird/ua_cmds.c:1241 -msgid "Turn on or off? " -msgstr "Activer ou désactiver ? (on/off) " +#~ msgid "Full" +#~ msgstr "Full" -#: src/dird/ua_cmds.c:569 -#, c-format -msgid "" -"Can't set %s RecyclePool to %s, %s is not in database.\n" -"Try to update it with 'update pool=%s'\n" -msgstr "" +#~ msgid "Incremental" +#~ msgstr "Incrémental" -#: src/dird/ua_cmds.c:587 -#, c-format -msgid "" -"Can't set %s ScratchPool to %s, %s is not in database.\n" -"Try to update it with 'update pool=%s'\n" -msgstr "" +#~ msgid "Differential" +#~ msgstr "Différentiel" -#: src/dird/ua_cmds.c:654 -#, c-format -msgid "" -"Error: Pool %s already exists.\n" -"Use update to change it.\n" -msgstr "" -"Erreur : Pool %s est déjà défini.\n" -"Utilisez update pour le changer\n" +#~ msgid "Since" +#~ msgstr "Depuis" -#: src/dird/ua_cmds.c:665 -#, c-format -msgid "Pool %s created.\n" -msgstr "Pool %s créé.\n" +#~ msgid "Select level" +#~ msgstr "Saisissez le type" -#: src/dird/ua_cmds.c:696 -#, fuzzy -msgid "Failed to set bandwidth limit to Client.\n" -msgstr "Impossible de se connecter au Client.\n" +#~ msgid "Initialize Catalog" +#~ msgstr "Initialisez le catalogue" -#: src/dird/ua_cmds.c:700 -#, c-format -msgid "2000 OK Limiting bandwidth to %lldkb/s %s\n" -msgstr "" +#~ msgid "Verify Volume Data (not yet implemented)" +#~ msgstr "Vérification des données sur le volume (pas encore implémenté)" -#: src/dird/ua_cmds.c:701 -msgid "on running and future jobs" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Run Admin Job\n" +#~ "JobName: %s\n" +#~ "FileSet: %s\n" +#~ "Client: %s\n" +#~ "Storage: %s\n" +#~ "When: %s\n" +#~ "Priority: %d\n" +#~ msgstr "" +#~ "Lancement du job %s\n" +#~ "JobName : %s\n" +#~ "FileSet : %s\n" +#~ "Client : %s\n" +#~ "Storage : %s\n" +#~ "Quand : %s\n" +#~ "Priorité : %d\n" -#: src/dird/ua_cmds.c:725 -msgid "Set Bandwidth choice:\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Run Backup job\n" +#~ "JobName: %s\n" +#~ "Level: %s\n" +#~ "Client: %s\n" +#~ "FileSet: %s\n" +#~ "Pool: %s (From %s)\n" +#~ "%sStorage: %s (From %s)\n" +#~ "When: %s\n" +#~ "Priority: %d\n" +#~ "%s%s%s" +#~ msgstr "" +#~ "Lancement du job %s\n" +#~ "JobName : %s\n" +#~ "Niveau : %s\n" +#~ "Client : %s\n" +#~ "FileSet : %s\n" +#~ "Pool : %s (Depuis %s)\n" +#~ "Storage : %s (Depuis %s)\n" +#~ "Quand : %s\n" +#~ "Priorité : %d\n" -#: src/dird/ua_cmds.c:726 #, fuzzy -msgid "Running Job" -msgstr "" -"\n" -"Job en cours :\n" +#~ msgid "Could not get job record for selected JobId. ERR=%s" +#~ msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" -#: src/dird/ua_cmds.c:727 -msgid "Running and future Jobs for a Client" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Run Verify Job\n" +#~ "JobName: %s\n" +#~ "Level: %s\n" +#~ "Client: %s\n" +#~ "FileSet: %s\n" +#~ "Pool: %s (From %s)\n" +#~ "Storage: %s (From %s)\n" +#~ "Verify Job: %s\n" +#~ "Verify List: %s\n" +#~ "When: %s\n" +#~ "Priority: %d\n" +#~ msgstr "" +#~ "Lancement du job %s\n" +#~ "JobName : %s\n" +#~ "Niveau : %s\n" +#~ "Client : %s\n" +#~ "FileSet : %s\n" +#~ "Pool : %s (Depuis %s)\n" +#~ "Storage : %s (Depuis %s)\n" +#~ "Verify Job : %s\n" +#~ "Verify List: %s\n" +#~ "Quand : %s\n" +#~ "Priorité : %d\n" -#: src/dird/ua_cmds.c:728 -msgid "Choose where to limit the bandwidth" -msgstr "" +#~ msgid "Please enter a JobId for restore: " +#~ msgstr "Saisissez le JobId pour la restauration : " -#: src/dird/ua_cmds.c:740 #, fuzzy -msgid "Enter new bandwidth limit kb/s: " -msgstr "Saisissez la valeur du nombre maximum de Job : " +#~ msgid "User specified" +#~ msgstr "Pas de storage sélectionné.\n" -#: src/dird/ua_cmds.c:777 src/dird/ua_cmds.c:840 src/dird/ua_cmds.c:862 -#: src/dird/ua_cmds.c:884 -msgid "Unauthorized command from this console.\n" -msgstr "Commande interdite depuis cette console.\n" +#, fuzzy +#~ msgid "" +#~ "Run Restore job\n" +#~ "JobName: %s\n" +#~ "Bootstrap: %s\n" +#~ "RegexWhere: %s\n" +#~ "Replace: %s\n" +#~ "FileSet: %s\n" +#~ "Backup Client: %s\n" +#~ "Restore Client: %s\n" +#~ "Storage: %s\n" +#~ "When: %s\n" +#~ "Catalog: %s\n" +#~ "Priority: %d\n" +#~ "Plugin Options: %s\n" +#~ msgstr "" +#~ "Lancement de la restauration\n" +#~ "JobName : %s\n" +#~ "Bootstrap : %s\n" +#~ "RegexWhere : %s\n" +#~ "Ecrasement : %s\n" +#~ "FileSet : %s\n" +#~ "Backup Client : %s\n" +#~ "Restore Client : %s\n" +#~ "Storage : %s\n" +#~ "Quand : %s\n" +#~ "Catalogue : %s\n" +#~ "Priorité : %d\n" -#: src/dird/ua_cmds.c:784 src/dird/ua_cmds.c:1292 src/dird/ua_dotcmds.c:201 -#: src/dird/ua_run.c:343 -#, c-format -msgid "Client \"%s\" not found.\n" -msgstr "le client \"%s\" est introuvable.\n" +#~ msgid "" +#~ "Run Restore job\n" +#~ "JobName: %s\n" +#~ "Bootstrap: %s\n" +#~ "Where: %s\n" +#~ "Replace: %s\n" +#~ "FileSet: %s\n" +#~ "Backup Client: %s\n" +#~ "Restore Client: %s\n" +#~ "Storage: %s\n" +#~ "When: %s\n" +#~ "Catalog: %s\n" +#~ "Priority: %d\n" +#~ "Plugin Options: %s\n" +#~ msgstr "" +#~ "Lancement de la restauration\n" +#~ "JobName : %s\n" +#~ "Bootstrap : %s\n" +#~ "Déplacement : %s\n" +#~ "Ecrasement : %s\n" +#~ "FileSet : %s\n" +#~ "Backup Client : %s\n" +#~ "Restore Client : %s\n" +#~ "Storage : %s\n" +#~ "Quand : %s\n" +#~ "Catalogue : %s\n" +#~ "Priorité : %d\n" +#~ "Options Plugins: %s\n" -#: src/dird/ua_cmds.c:794 -#, c-format -msgid "Client \"%s\" address set to %s\n" -msgstr "Client \"%s\" adresse positionné à %s\n" +#~ msgid "" +#~ "Run Restore job\n" +#~ "JobName: %s\n" +#~ "Bootstrap: %s\n" +#~ msgstr "" +#~ "Lancement de la restauration\n" +#~ "JobName : %s\n" +#~ "Bootstrap : %s\n" -#: src/dird/ua_cmds.c:813 -#, c-format -msgid "Job Attributes Insertion %sabled\n" -msgstr "" +#~ msgid "Where: %s\n" +#~ msgstr "Where : %s\n" -#: src/dird/ua_cmds.c:844 -#, c-format -msgid "Job \"%s\" %sabled\n" -msgstr "" +#~ msgid "" +#~ "Replace: %s\n" +#~ "Client: %s\n" +#~ "Storage: %s\n" +#~ "JobId: %s\n" +#~ "When: %s\n" +#~ "Catalog: %s\n" +#~ "Priority: %d\n" +#~ "Plugin Options: %s\n" +#~ msgstr "" +#~ "Ecrasement : %s\n" +#~ "Client : %s\n" +#~ "Storage : %s\n" +#~ "JobId : %s\n" +#~ "Quand : %s\n" +#~ "Catalogue : %s\n" +#~ "Priorité : %d\n" +#~ "Options Plugins : %s\n" -#: src/dird/ua_cmds.c:866 -#, fuzzy, c-format -msgid "Client \"%s\" %sabled\n" -msgstr "le client \"%s\" est introuvable.\n" +#, fuzzy +#~ msgid "Run Copy job\n" +#~ msgstr "Sélectionnez le Job de restauration" -#: src/dird/ua_cmds.c:888 -#, c-format -msgid "Schedule \"%s\" %sabled\n" -msgstr "" +#, fuzzy +#~ msgid "Run Migration job\n" +#~ msgstr "Sélectionnez le Job de restauration" -#: src/dird/ua_cmds.c:897 -msgid "" -"You must enter one of the following keywords: job, client, schedule, or " -"storage.\n" -msgstr "" +#~ msgid "Unknown Job Type=%d\n" +#~ msgstr "Job du Type=%d inconnu\n" -#: src/dird/ua_cmds.c:926 src/dird/ua_dotcmds.c:1086 src/dird/ua_status.c:411 -#, c-format -msgid "Connecting to Storage daemon %s at %s:%d\n" -msgstr "Connexion au Storage Daemon %s (%s:%d)\n" +#~ msgid "JobId specified twice.\n" +#~ msgstr "Le JobId est déjà spécifié.\n" -#: src/dird/ua_cmds.c:932 src/dird/ua_dotcmds.c:1092 -msgid "Connected to storage daemon\n" -msgstr "Connecté au Storage Daemon\n" +#~ msgid "Client specified twice.\n" +#~ msgstr "Le client est déjà spécifié.\n" -#: src/dird/ua_cmds.c:1103 -msgid "Enter new debug level: " -msgstr "Saisissez le nouveau niveau de debug : " +#~ msgid "FileSet specified twice.\n" +#~ msgstr "Le FileSet est déjà spécifié.\n" -#: src/dird/ua_cmds.c:1116 -#, c-format -msgid "Incorrect tags found on command line %s\n" -msgstr "" +#~ msgid "Level specified twice.\n" +#~ msgstr "Le type (Level) est déjà spécifié.\n" -#: src/dird/ua_cmds.c:1199 src/dird/ua_dotcmds.c:1194 -msgid "Available daemons are: \n" -msgstr "Les démons disponibles sont :\n" +#~ msgid "Storage specified twice.\n" +#~ msgstr "Le Storage est déjà spécifié.\n" -#: src/dird/ua_cmds.c:1200 src/dird/ua_dotcmds.c:1195 -msgid "Director" -msgstr "Director" +#~ msgid "RegexWhere or Where specified twice.\n" +#~ msgstr "RegexWhere ou Where est déjà spécifiée.\n" -#: src/dird/ua_cmds.c:1201 src/dird/ua_dotcmds.c:1196 src/dird/ua_run.c:1012 -#: src/dird/ua_select.c:189 -msgid "Storage" -msgstr "Stockage" +#, fuzzy +#~ msgid "No authorization for \"regexwhere\" specification.\n" +#~ msgstr "La destination (Where) est déjà spécifiée.\n" -#: src/dird/ua_cmds.c:1202 src/dird/ua_dotcmds.c:1197 src/dird/ua_run.c:1018 -#: src/dird/ua_select.c:383 src/dird/ua_select.c:407 src/dird/ua_select.c:544 -msgid "Client" -msgstr "Client" +#~ msgid "Where or RegexWhere specified twice.\n" +#~ msgstr "RegexWhere ou Where est déjà spécifiée.\n" -#: src/dird/ua_cmds.c:1203 -msgid "All" -msgstr "" +#, fuzzy +#~ msgid "No authoriztion for \"where\" specification.\n" +#~ msgstr "Pas d'enregistrement trouvé en base pour : %s\n" -#: src/dird/ua_cmds.c:1204 -msgid "Select daemon type to set debug level" -msgstr "Sélectionnez le composant a mettre à jour" +#~ msgid "Bootstrap specified twice.\n" +#~ msgstr "Le bootstrap est déjà spécifié.\n" -#: src/dird/ua_cmds.c:1296 src/dird/ua_cmds.c:2119 src/dird/ua_dotcmds.c:205 -#: src/dird/ua_status.c:462 -#, fuzzy, c-format -msgid "No authorization for Client \"%s\"\n" -msgstr "Pas d'enregistrement trouvé en base pour : %s\n" +#~ msgid "Replace specified twice.\n" +#~ msgstr "L'option d'écrasement (Replace) est déjà spécifié.\n" -#: src/dird/ua_cmds.c:1301 src/dird/ua_dotcmds.c:210 -msgid "Client name missing.\n" -msgstr "" +#~ msgid "When specified twice.\n" +#~ msgstr "La planification (When) est déjà spécifiée.\n" -#: src/dird/ua_cmds.c:1309 src/dird/ua_select.c:1471 src/dird/ua_select.c:1478 -#, c-format -msgid "Job \"%s\" not found.\n" -msgstr "Job \"%s\" non trouvé.\n" +#~ msgid "Priority specified twice.\n" +#~ msgstr "La priorité (Priority) est déjà spécifiée.\n" -#: src/dird/ua_cmds.c:1313 src/dird/ua_cmds.c:1380 src/dird/ua_cmds.c:2141 -#, c-format -msgid "No authorization for Job \"%s\"\n" -msgstr "" +#~ msgid "Priority must be positive nonzero setting it to 10.\n" +#~ msgstr "" +#~ "La priorité doit être supérieure à zéro. Utilisation d'une priorité de " +#~ "10.\n" -#: src/dird/ua_cmds.c:1318 -msgid "Job name missing.\n" -msgstr "" +#~ msgid "Pool specified twice.\n" +#~ msgstr "Le pool est déjà spécifié.\n" -#: src/dird/ua_cmds.c:1327 -#, fuzzy, c-format -msgid "Fileset \"%s\" not found.\n" -msgstr "Le FileSet \"%s\" est introuvable.\n" +#, fuzzy +#~ msgid "Restore Client specified twice.\n" +#~ msgstr "Le client est déjà spécifié.\n" -#: src/dird/ua_cmds.c:1331 -#, fuzzy, c-format -msgid "No authorization for FileSet \"%s\"\n" -msgstr "Pas d'enregistrement trouvé en base pour : %s\n" +#, fuzzy +#~ msgid "Plugin Options not yet implemented.\n" +#~ msgstr "Le client est déjà spécifié.\n" -#: src/dird/ua_cmds.c:1336 -msgid "Fileset name missing.\n" -msgstr "" +#, fuzzy +#~ msgid "Plugin Options specified twice.\n" +#~ msgstr "Le client est déjà spécifié.\n" -#: src/dird/ua_cmds.c:1347 src/dird/ua_run.c:1402 -#, fuzzy, c-format -msgid "Level \"%s\" not valid.\n" -msgstr "Le type %s est invalide.\n" +#, fuzzy +#~ msgid "No authoriztion for \"PluginOptions\" specification.\n" +#~ msgstr "Pas d'enregistrement trouvé en base pour : %s\n" -#: src/dird/ua_cmds.c:1351 -msgid "Level value missing.\n" -msgstr "" +#, fuzzy +#~ msgid "Spool flag specified twice.\n" +#~ msgstr "Le pool est déjà spécifié.\n" -#: src/dird/ua_cmds.c:1358 #, fuzzy -msgid "Invalid value for accurate. It must be yes or no.\n" -msgstr "Saisie invalide. Veuillez répondre oui ou non.\n" +#~ msgid "Invalid spooldata flag.\n" +#~ msgstr "Période invalide.\n" -#: src/dird/ua_cmds.c:1363 #, fuzzy -msgid "Accurate value missing.\n" -msgstr "La valeur actuelle est : %s\n" +#~ msgid "IgnoreDuplicateCheck flag specified twice.\n" +#~ msgstr "Le pool est déjà spécifié.\n" -#: src/dird/ua_cmds.c:1376 -msgid "No job specified.\n" -msgstr "Pas de job sélectionné.\n" +#, fuzzy +#~ msgid "Invalid ignoreduplicatecheck flag.\n" +#~ msgstr "Période invalide.\n" -#: src/dird/ua_cmds.c:1436 -msgid "Error sending include list.\n" -msgstr "Erreur pendant l'envoi de la liste d'inclusion.\n" +#, fuzzy +#~ msgid "Accurate flag specified twice.\n" +#~ msgstr "Le pool est déjà spécifié.\n" -#: src/dird/ua_cmds.c:1441 -msgid "Error sending exclude list.\n" -msgstr "Erreur pendant l'envoi de la liste d'exclusion.\n" +#, fuzzy +#~ msgid "Invalid accurate flag.\n" +#~ msgstr "Période invalide.\n" -#: src/dird/ua_cmds.c:1535 -msgid "" -"In general it is not a good idea to delete either a\n" -"Pool or a Volume since they may contain data.\n" -"\n" -msgstr "" -"Généralement supprimer un pool ou bien un volume\n" -"n'est pas une bonne idée car ils peuvent contenir des données.\n" -"\n" +#~ msgid "Job name specified twice.\n" +#~ msgstr "Le job est déjà spécifié.\n" -#: src/dird/ua_cmds.c:1538 -msgid "Choose catalog item to delete" -msgstr "Choisissez l'objet du catalogue à supprimer" +#, fuzzy +#~ msgid "Media Type specified twice.\n" +#~ msgstr "L'option d'écrasement (Replace) est déjà spécifié.\n" -#: src/dird/ua_cmds.c:1552 -msgid "Nothing done.\n" -msgstr "Rien de fait.\n" +#, fuzzy +#~ msgid "NextPool specified twice.\n" +#~ msgstr "Le pool est déjà spécifié.\n" -#: src/dird/ua_cmds.c:1580 -#, fuzzy, c-format -msgid "Are you sure you want to delete %d JobIds ? (yes/no): " -msgstr "Êtes vous certain de vouloir supprimer ce Pool ? (oui/non) : " +#~ msgid "Invalid keyword: %s\n" +#~ msgstr "Argument invalide : %s\n" -#: src/dird/ua_cmds.c:1590 -msgid "Enter JobId to delete: " -msgstr "Saisissez le JobId à supprimer : " +#~ msgid "Catalog \"%s\" not found\n" +#~ msgstr "Le catalogue \"%s\" est introuvable\n" -#: src/dird/ua_cmds.c:1608 -#, fuzzy, c-format -msgid "Jobid %s and associated records deleted from the catalog.\n" -msgstr "" -"Le Job %s et les enregistrements associés ont été supprimés du catalogue.\n" +#~ msgid "The current %s retention period is: %s\n" +#~ msgstr "La période de rétention courante %s est : %s\n" -#: src/dird/ua_cmds.c:1623 -#, c-format -msgid "" -"\n" -"This command will delete volume %s\n" -"and all Jobs saved on that volume from the Catalog\n" -msgstr "" -"\n" -"Cette commande va supprimer le Volume %s\n" -"et tous les Jobs sauvegardés sur celui-ci du Catalogue\n" +#, fuzzy +#~ msgid "Continue? (yes/no): " +#~ msgstr "Continuer ? (oui/mod/non) : " -#: src/dird/ua_cmds.c:1630 -#, fuzzy, c-format -msgid "Are you sure you want to delete Volume \"%s\"? (yes/no): " -msgstr "Êtes vous certain de vouloir supprimer ce Volume ? (oui/non) : " +#~ msgid "Continue? (yes/mod/no): " +#~ msgstr "Continuer ? (oui/mod/non) : " -#: src/dird/ua_cmds.c:1643 -msgid "Can't list jobs on this volume\n" -msgstr "" +#~ msgid "Enter new retention period: " +#~ msgstr "Saisissez une nouvelle période de rétention : " -#: src/dird/ua_cmds.c:1668 -#, fuzzy, c-format -msgid "Are you sure you want to delete Pool \"%s\"? (yes/no): " -msgstr "Êtes vous certain de vouloir supprimer ce Pool ? (oui/non) : " +#~ msgid "Invalid period.\n" +#~ msgstr "Période invalide.\n" -#: src/dird/ua_cmds.c:1714 -#, fuzzy, c-format -msgid "Invalid device name. %s" -msgstr "Option d'écrasement (Replace) invalide : %s\n" +#~ msgid "The defined Storage resources are:\n" +#~ msgstr "Les ressources de Stockage définies sont :\n" -#: src/dird/ua_cmds.c:1791 -#, c-format -msgid "Using Catalog name=%s DB=%s\n" -msgstr "Utilisation du Catalogue name=%s DB=%s\n" +#~ msgid "Select Storage resource" +#~ msgstr "Sélectionnez la ressource de Stockage" -#: src/dird/ua_cmds.c:1859 -msgid "ERR: Can't open db\n" -msgstr "" +#~ msgid "The defined Catalog resources are:\n" +#~ msgstr "Les Catalogues définis sont :\n" -#: src/dird/ua_cmds.c:1906 -msgid "Wait on mount timed out\n" -msgstr "" +#~ msgid "Catalog" +#~ msgstr "Catalogue" -#: src/dird/ua_cmds.c:1916 -msgid "ERR: Job was not found\n" -msgstr "ERR: Job %s non trouvé\n" +#~ msgid "Select Catalog resource" +#~ msgstr "Sélectionnez le Catalogue" -#: src/dird/ua_cmds.c:1992 #, fuzzy -msgid "" -" Command Description\n" -" ======= ===========\n" -msgstr "" -" Commande Description\n" -" ======== ===========\n" - -#: src/dird/ua_cmds.c:1996 -#, c-format -msgid "" -" %-13s %s\n" -"\n" -"Arguments:\n" -"\t%s\n" -msgstr "" - -#: src/dird/ua_cmds.c:2001 -#, fuzzy, c-format -msgid " %-13s %s\n" -msgstr " %-10s %s\n" - -#: src/dird/ua_cmds.c:2005 -#, fuzzy, c-format -msgid "" -"\n" -"Can't find %s command.\n" -"\n" -msgstr ": est une commande invalide.\n" +#~ msgid "The disabled Job resources are:\n" +#~ msgstr "Les Job définis sont :\n" -#: src/dird/ua_cmds.c:2007 -msgid "" -"\n" -"When at a prompt, entering a period cancels the command.\n" -"\n" -msgstr "" -"\n" -"Sur une question, tapez un point (.) pour annuler la commande en cours.\n" +#, fuzzy +#~ msgid "The enabled Job resources are:\n" +#~ msgstr "Les Job définis sont :\n" -#: src/dird/ua_cmds.c:2043 -#, c-format -msgid "%s Version: %s (%s) %s %s %s %s\n" -msgstr "" +#~ msgid "Select Job resource" +#~ msgstr "Sélectionnez le Job" -#: src/dird/ua_cmds.c:2102 src/dird/ua_cmds.c:2129 src/dird/ua_cmds.c:2151 -#, c-format -msgid "No authorization for Catalog \"%s\"\n" -msgstr "" +#~ msgid "The defined Job resources are:\n" +#~ msgstr "Les Job définis sont :\n" -#: src/dird/ua_cmds.c:2187 src/dird/ua_select.c:242 -msgid "Could not find a Catalog resource\n" -msgstr "Impossible de trouver un Catalogue\n" +#, fuzzy +#~ msgid "Error: Restore Job resource \"%s\" does not exist.\n" +#~ msgstr "Erreur : le Pool \"%s\" n'existe pas.\n" -#: src/dird/ua_cmds.c:2208 -#, c-format -msgid "Could not open catalog database \"%s\".\n" -msgstr "Impossible d'ouvrir le catalogue \"%s\".\n" +#~ msgid "The defined Restore Job resources are:\n" +#~ msgstr "Les Job de restauration sont :\n" -#: src/dird/ua_cmds.c:2227 -#, c-format -msgid "Using Catalog \"%s\"\n" -msgstr "Utilisation du Catalogue \"%s\"\n" +#~ msgid "Select Restore Job" +#~ msgstr "Sélectionnez le Job de restauration" -#: src/dird/ua_dde.c:62 src/dird/ua_dotcmds.c:1594 -#, fuzzy, c-format -msgid "List Media failed: ERR=%s\n" -msgstr "fopen %s en erreur : ERR=%s\n" +#~ msgid "The defined Client resources are:\n" +#~ msgstr "Les clients définis sont :\n" -#: src/dird/ua_dde.c:110 #, fuzzy -msgid "Command line" -msgstr "Erreur sur la commande : %s\n" - -#: src/dird/ua_dde.c:211 -#, fuzzy, c-format -msgid "Invalid keyword found: %s\n" -msgstr "Argument invalide : %s\n" - -#: src/dird/ua_dde.c:216 -msgid "Dedup Engine choice: \n" -msgstr "" +#~ msgid "Select Client resource" +#~ msgstr "Sélectionnez le FileSet" -#: src/dird/ua_dde.c:217 -msgid "Vacuum data files" -msgstr "" +#~ msgid "Select Client (File daemon) resource" +#~ msgstr "Sélectionnez le client (File daemon)" -#: src/dird/ua_dde.c:218 -msgid "Cancel running vacuum" -msgstr "" +#~ msgid "Error: Client resource %s does not exist.\n" +#~ msgstr "Erreur : le client %s n'est pas définie.\n" -#: src/dird/ua_dde.c:219 #, fuzzy -msgid "Display data files usage" -msgstr "Message de Bacula" +#~ msgid "The defined Schedule resources are:\n" +#~ msgstr "Les clients définis sont :\n" -#: src/dird/ua_dde.c:223 #, fuzzy -msgid "Select action to perform on Dedup Engine" -msgstr "Sélectionnez le composant a tuer" - -#: src/dird/ua_dotcmds.c:180 -msgid ": is an invalid command.\n" -msgstr ": est une commande invalide.\n" - -#: src/dird/ua_dotcmds.c:219 -msgid "path name missing.\n" -msgstr "" +#~ msgid "Schedule" +#~ msgstr "" +#~ "\n" +#~ "Jobs planifiés :\n" -#: src/dird/ua_dotcmds.c:238 #, fuzzy -msgid "Failed to send command to Client.\n" -msgstr "Impossible de se connecter au Client.\n" +#~ msgid "Select Schedule resource" +#~ msgstr "Sélectionnez le Pool" -#: src/dird/ua_dotcmds.c:894 -#, fuzzy, c-format -msgid "Unable to get Job record for Job=%s\n" -msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" +#~ msgid "Could not find Client %s: ERR=%s" +#~ msgstr "Impossible de trouver le client %s : ERR=%s" -#: src/dird/ua_dotcmds.c:909 -#, fuzzy, c-format -msgid "Unable to get last Job record for Job=%s\n" -msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" +#~ msgid "Could not find Client \"%s\": ERR=%s" +#~ msgstr "Impossible de trouver le client \"%s\" : ERR=%s" -#: src/dird/ua_dotcmds.c:925 -#, fuzzy, c-format -msgid "Unable to get Client record for Client=%s\n" -msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" +#~ msgid "Error obtaining client ids. ERR=%s\n" +#~ msgstr "Erreur pendant l'obtention de l'identifiant du Client. ERR=%s\n" -#: src/dird/ua_dotcmds.c:941 -#, fuzzy, c-format -msgid "Unable to get last Job record for Client=%s\n" -msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" +#~ msgid "No clients defined. You must run a job before using this command.\n" +#~ msgstr "" +#~ "Pas de client défini. Vous devez lancer une sauvegarde avant d'utiliser " +#~ "cette commande.\n" -#: src/dird/ua_dotcmds.c:952 src/dird/ua_restore.c:960 -#: src/dird/ua_restore.c:1003 src/dird/vbackup.c:142 -#, c-format -msgid "Unable to get Job record for JobId=%s: ERR=%s\n" -msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" +#~ msgid "Defined Clients:\n" +#~ msgstr "Clients définis :\n" -#: src/dird/ua_dotcmds.c:1156 src/dird/ua_dotcmds.c:1250 -#, fuzzy, c-format -msgid "Unknown command: %s\n" -msgstr "Erreur inconnue." +#~ msgid "Select the Client" +#~ msgstr "Sélectionnez le client" -#: src/dird/ua_dotcmds.c:1198 -msgid "Select daemon type to make die" -msgstr "Sélectionnez le composant a tuer" +#~ msgid "Could not find Pool \"%s\": ERR=%s" +#~ msgstr "Impossible de trouver le Pool \"%s\" : ERR=%s" -#: src/dird/ua_dotcmds.c:1224 -msgid "The Director will generate a deadlock.\n" -msgstr "" +#~ msgid "No pools defined. Use the \"create\" command to create one.\n" +#~ msgstr "" +#~ "Pas de Pool défini. Utilisez la commande \"create\" pour en créer un.\n" -#: src/dird/ua_dotcmds.c:1228 -msgid "The Director will segment fault.\n" -msgstr "" +#~ msgid "Defined Pools:\n" +#~ msgstr "Pools définis :\n" -#: src/dird/ua_dotcmds.c:1509 -msgid "Access to specified Client or FileSet not allowed.\n" -msgstr "" +#~ msgid "Select the Pool" +#~ msgstr "Sélectionnez le Pool" -#: src/dird/ua_dotcmds.c:1514 src/dird/ua_dotcmds.c:1558 -#: src/dird/ua_restore.c:1121 src/dird/ua_restore.c:1149 -#: src/dird/ua_restore.c:1170 -#, c-format -msgid "Query failed: %s. ERR=%s\n" -msgstr "" +#~ msgid "No access to Pool \"%s\"\n" +#~ msgstr "Pas d'accès au Pool \"%s\"\n" -#: src/dird/ua_dotcmds.c:1553 #, fuzzy -msgid "query keyword not found.\n" -msgstr "%s ressource %s introuvable.\n" - -#: src/dird/ua_dotcmds.c:1580 -#, fuzzy, c-format -msgid "List MediaType failed: ERR=%s\n" -msgstr "fopen %s en erreur : ERR=%s\n" +#~ msgid "Enter a Volume name or *MediaId: " +#~ msgstr "Entrez le nom du Volume : " -#: src/dird/ua_dotcmds.c:1608 -#, fuzzy, c-format -msgid "List Location failed: ERR=%s\n" -msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" +#~ msgid "The defined Pool resources are:\n" +#~ msgstr "Les Pools définis sont :\n" -#: src/dird/ua_input.c:114 -msgid "Enter slot" -msgstr "Saisissez le slot" +#~ msgid "Select Pool resource" +#~ msgstr "Sélectionnez le Pool" -#: src/dird/ua_input.c:118 src/dird/ua_input.c:124 -#, c-format -msgid "Expected a positive integer, got: %s\n" -msgstr "Attendait un entier positif, pas : %s\n" +#~ msgid "Enter the JobId to select: " +#~ msgstr "Entrez le JobId à sélectionner : " -#: src/dird/ua_input.c:181 -msgid "Invalid response. You must answer yes or no.\n" -msgstr "Réponse invalide. Vous devez répondre oui ou non.\n" +#~ msgid "Could not find Job \"%s\": ERR=%s" +#~ msgstr "Impossible de trouver le Job \"%s\" : ERR=%s" -#: src/dird/ua_input.c:204 -#, fuzzy -msgid "Invalid Enabled value, it must be yes, no, archived, 0, 1, or 2\n" -msgstr "Saisie invalide. Veuillez répondre oui ou non.\n" +#~ msgid "Automatically selected %s: %s\n" +#~ msgstr "Sélection automatique %s : %s\n" -#: src/dird/ua_input.c:231 -#, fuzzy, c-format -msgid "Illegal character \"%c\" in a comment.\n" -msgstr "Caractère illégal \"%c\" dans le nom.\n" +#~ msgid "Selection list for \"%s\" is empty!\n" +#~ msgstr "La sélection pour \"%s\" est vide !\n" -#: src/dird/ua_input.c:238 -#, fuzzy -msgid "Comment too long.\n" -msgstr "Nom trop long.\n" +#~ msgid "Automatically selected: %s\n" +#~ msgstr "Sélection automatique : %s\n" -#: src/dird/ua_input.c:244 -#, fuzzy -msgid "Comment must be at least one character long.\n" -msgstr "Le nom du volume doit comporter au moins un caractère\n" +#~ msgid "Selection aborted, nothing done.\n" +#~ msgstr "Sélection annulée, rien de fait.\n" -#: src/dird/ua_label.c:93 -msgid "Negative numbers not permitted\n" -msgstr "Les nombres négatifs ne sont pas autorisés\n" +#~ msgid "Please enter a number between 1 and %d\n" +#~ msgstr "Merci de saisir un nombre entre 1 et %d\n" -#: src/dird/ua_label.c:99 src/lib/sellist.c:65 -msgid "Range end is not integer.\n" -msgstr "" +#~ msgid "Expecting jobid=nn command, got: %s\n" +#~ msgstr "Attendait l'option jobid=nn, pas : %s\n" -#: src/dird/ua_label.c:104 src/lib/sellist.c:70 -msgid "Range start is not an integer.\n" -msgstr "" +#~ msgid "JobId %s is not running.\n" +#~ msgstr "JobId %s n'est pas en cours.\n" -#: src/dird/ua_label.c:110 src/lib/sellist.c:77 -msgid "Range end not bigger than start.\n" -msgstr "" +#~ msgid "Expecting job=xxx, got: %s.\n" +#~ msgstr "Attendait l'option job=xxx, pas : %s\n" -#: src/dird/ua_label.c:116 src/lib/sellist.c:95 -msgid "Input value is not an integer.\n" -msgstr "La valeur saisie n'est pas un nombre.\n" +#~ msgid "Job \"%s\" is not running.\n" +#~ msgstr "Job \"%s\" n'est pas en cours.\n" -#: src/dird/ua_label.c:122 -msgid "Values must be be greater than zero.\n" -msgstr "Les valeurs doivent être supérieurs à zéro.\n" +#~ msgid "Expecting ujobid=xxx, got: %s.\n" +#~ msgstr "Attendait l'option ujobid=xxx, pas : %s\n" -#: src/dird/ua_label.c:126 -msgid "Slot too large.\n" -msgstr "Slot trop grand.\n" +#~ msgid "Storage resource \"%s\": not found\n" +#~ msgstr "Storage resource \"%s\" : non trouvé\n" -#: src/dird/ua_label.c:178 src/dird/ua_label.c:356 src/dird/ua_label.c:1191 -#: src/dird/ua_run.c:417 -msgid "command line" -msgstr "" +#~ msgid "Enter autochanger drive[0]: " +#~ msgstr "Saisissez le numéro du lecteur de l'autochanger [0] : " -#: src/dird/ua_label.c:196 src/dird/ua_label.c:520 src/dird/ua_label.c:1198 -msgid "No slots in changer to scan.\n" -msgstr "Pas de slot dans le magasin à scanner.\n" +#~ msgid "Enter autochanger slot: " +#~ msgstr "Saisissez le slot de l'autochanger [0] : " -#: src/dird/ua_label.c:208 src/dird/ua_label.c:531 -msgid "No Volumes found to label, or no barcodes.\n" -msgstr "Pas de volume à labéliser ou pas de codebar.\n" +#~ msgid "Select the Media Type" +#~ msgstr "Choisissez le type de Media" -#: src/dird/ua_label.c:218 src/dird/ua_label.c:1219 -#, c-format -msgid "Slot %d greater than max %d ignored.\n" -msgstr "Le slot %d est ignoré car il est supérieur au maximum %d.\n" +#~ msgid "No Jobs running.\n" +#~ msgstr "Pas de job en cours.\n" -#: src/dird/ua_label.c:256 -#, c-format -msgid "No VolName for Slot=%d InChanger set to zero.\n" -msgstr "Pas de volume sur le Slot %d. Mise à zéro de InChanger.\n" +#~ msgid "None of your jobs are running.\n" +#~ msgstr "Aucun de vos jobs ne sont en cours.\n" -#: src/dird/ua_label.c:277 -#, c-format -msgid "Catalog record for Volume \"%s\" updated to reference slot %d.\n" -msgstr "" -"Mise à jour des informations du volume \"%s\" dans le catalogue (Slot=%d).\n" +#, fuzzy +#~ msgid "Unauthorized command from this console for JobId=%d.\n" +#~ msgstr "Commande interdite depuis cette console.\n" -#: src/dird/ua_label.c:281 -#, c-format -msgid "Catalog record for Volume \"%s\" is up to date.\n" -msgstr "Le volume \"%s\" est à jour dans le catalogue.\n" +#, fuzzy +#~ msgid "Warning Job JobId=%d is not running.\n" +#~ msgstr "Attention le Job %s n'est pas en cours. Continuons quand même...\n" -#: src/dird/ua_label.c:287 -#, c-format -msgid "Volume \"%s\" not found in catalog. Slot=%d InChanger set to zero.\n" -msgstr "" -"Volume \"%s\" absent du catalogue. mise à zéro de InChanger pour le Slot=" -"%d.\n" +#, fuzzy +#~ msgid "Confirm %s of %d Job%s (yes/no): " +#~ msgstr "Confirmez l'annulation (oui/non) : " -#: src/dird/ua_label.c:385 -#, c-format -msgid "" -"Volume \"%s\" has VolStatus %s. It must be Purged or Recycled before " -"relabeling.\n" -msgstr "" -"Le volume \"%s\" (VolStatus) a le statut \"%s\". Il doit être purgé ou bien\n" -"recyclé avant de pouvoir le re-labéliser.\n" +#, fuzzy +#~ msgid "Unauthorized command from this console for job=%s.\n" +#~ msgstr "Commande interdite depuis cette console.\n" -#: src/dird/ua_label.c:401 -msgid "Enter new Volume name: " -msgstr "Saisissez le nouveau nom du Volume : " +#, fuzzy +#~ msgid "Warning Job %s is not running.\n" +#~ msgstr "JobId %s n'est pas en cours.\n" -#: src/dird/ua_label.c:414 -#, c-format -msgid "Media record for new Volume \"%s\" already exists.\n" -msgstr "Le nouveau volume \"%s\" existe déjà en base.\n" +#, fuzzy +#~ msgid "Unauthorized command from this console for ujobid=%s.\n" +#~ msgstr "Commande interdite depuis cette console.\n" -#: src/dird/ua_label.c:432 -msgid "Enter slot (0 or Enter for none): " -msgstr "Saisissez le slot (0 ou Entrée pour aucun) : " +#, fuzzy +#~ msgid "Select Job(s):\n" +#~ msgstr "Sélectionnez le Job :\n" -#: src/dird/ua_label.c:460 -#, c-format -msgid "Delete of Volume \"%s\" failed. ERR=%s" -msgstr "Impossible de supprimer le volume \"%s\". ERR=%s" +#~ msgid "JobId=%s Job=%s" +#~ msgstr "JobId=%s Job=%s" -#: src/dird/ua_label.c:463 -#, c-format -msgid "Old volume \"%s\" deleted from catalog.\n" -msgstr "L'ancien volume \"%s\" a été supprimé du catalogue.\n" +#, fuzzy +#~ msgid "Choose Job list to %s" +#~ msgstr "Sélectionnez le Job à annuler" -#: src/dird/ua_label.c:474 -#, c-format -msgid "Requesting to mount %s ...\n" -msgstr "Demande pour monter %s...\n" +#~ msgid "You have messages.\n" +#~ msgstr "Vous avez des messages.\n" -#: src/dird/ua_label.c:496 -msgid "Do not forget to mount the drive!!!\n" -msgstr "N'oubliez pas de monter le lecteur.\n" +#~ msgid "Status available for:\n" +#~ msgstr "Statut disponible pour :\n" -#: src/dird/ua_label.c:536 -msgid "" -"The following Volumes will be labeled:\n" -"Slot Volume\n" -"==============\n" -msgstr "" -"Les volumes suivants vont être labélisés :\n" -"Slot Volume\n" -"==============\n" +#~ msgid "Select daemon type for status" +#~ msgstr "Saisissez le composant à afficher" -#: src/dird/ua_label.c:545 #, fuzzy -msgid "Do you want to label these Volumes? (yes|no): " -msgstr "" -"\n" -"Voulez vous restaurer tous les fichiers ? (oui|non) : " - -#: src/dird/ua_label.c:565 -#, c-format -msgid "Media record for Slot %d Volume \"%s\" already exists.\n" -msgstr "" +#~ msgid "%s %sVersion: %s (%s) %s %s %s\n" +#~ msgstr "%s Version : %s (%s) %s %s %s\n" -#: src/dird/ua_label.c:571 -#, c-format -msgid "Error setting InChanger: ERR=%s" -msgstr "Impossible de positionner le flag InChanger : ERR=%s" +#, fuzzy +#~ msgid "Daemon started %s, conf reloaded %s\n" +#~ msgstr "Démon démarré depuis %s, 1 job lancé depuis cette date.\n" -#: src/dird/ua_label.c:594 -#, c-format -msgid "Maximum pool Volumes=%d reached.\n" -msgstr "Le nombre maximum de volume (%d) pour ce pool est atteint.\n" +#, fuzzy +#~ msgid " Jobs: run=%d, running=%d mode=%d,%d\n" +#~ msgstr "Démon démarré depuis %s, %d jobs lancés depuis cette date.\n" -#: src/dird/ua_label.c:602 -#, c-format -msgid "Catalog record for cleaning tape \"%s\" successfully created.\n" -msgstr "" +#, fuzzy +#~ msgid " Heap: heap=%s smbytes=%s max_bytes=%s bufs=%s max_bufs=%s\n" +#~ msgstr " Heap: bytes=%s smbytes=%s max_bytes=%s bufs=%s max_bufs=%s\n" -#: src/dird/ua_label.c:609 -#, c-format -msgid "Catalog error on cleaning tape: %s" -msgstr "" +#, fuzzy +#~ msgid "No authorization for Storage \"%s\"\n" +#~ msgstr "Pas d'enregistrement trouvé en base pour : %s\n" -#: src/dird/ua_label.c:645 -#, c-format -msgid "Illegal character \"%c\" in a volume name.\n" -msgstr "Caractères \"%c\" interdits dans le nom d'un volume.\n" - -#: src/dird/ua_label.c:693 -#, c-format -msgid "Sending relabel command from \"%s\" to \"%s\" ...\n" -msgstr "Envoie de la commande pour re-labéliser de \"%s\" à \"%s\"...\n" - -#: src/dird/ua_label.c:700 -#, c-format -msgid "Sending label command for Volume \"%s\" Slot %d ...\n" -msgstr "Demande de labélisation du volume \"%s\" Slot %d...\n" - -#: src/dird/ua_label.c:738 -#, c-format -msgid "Catalog record for Volume \"%s\", Slot %d successfully created.\n" -msgstr "" +#~ msgid "" +#~ "\n" +#~ "Failed to connect to Storage daemon %s.\n" +#~ "====\n" +#~ msgstr "" +#~ "\n" +#~ "Impossible de se connecter au Storage Daemon %s.\n" +#~ "====\n" -#: src/dird/ua_label.c:751 -#, c-format -msgid "Label command failed for Volume %s.\n" -msgstr "Impossible de labéliser le volume %s.\n" +#~ msgid "" +#~ "Failed to connect to Client %s.\n" +#~ "====\n" +#~ msgstr "" +#~ "Impossible de se connecter au client %s.\n" +#~ "====\n" -#: src/dird/ua_label.c:765 -msgid "Could not open SD socket.\n" -msgstr "Impossible d'ouvrir la socket avec le SD.\n" +#~ msgid "Connected to file daemon\n" +#~ msgstr "Connecté avec le File Daemon\n" -#: src/dird/ua_label.c:837 src/dird/ua_label.c:847 -#, c-format -msgid "Invalid Slot number: %s\n" -msgstr "Numéro de slot invalide : %s\n" +#~ msgid "" +#~ "\n" +#~ "Scheduled Jobs:\n" +#~ msgstr "" +#~ "\n" +#~ "Jobs planifiés :\n" -#: src/dird/ua_label.c:856 -#, fuzzy, c-format -msgid "Invalid Volume name: %s. Volume skipped.\n" -msgstr "Nom de Volume invalide : %s\n" +#, fuzzy +#~ msgid "" +#~ "Level Type Pri Scheduled Job Name " +#~ "Volume\n" +#~ msgstr "" +#~ "Type Action Pri Planification Nom " +#~ "Volume\n" -#: src/dird/ua_label.c:950 -#, c-format -msgid "Device \"%s\" has %d slots.\n" -msgstr "Le Device \"%s\" a %d slots.\n" +#, fuzzy +#~ msgid "" +#~ "Level Type Pri Scheduled Job Name " +#~ "Schedule\n" +#~ msgstr "" +#~ "Type Action Pri Planification Nom " +#~ "Volume\n" -#: src/dird/ua_label.c:996 -#, c-format -msgid "Pool \"%s\" resource not found for volume \"%s\"!\n" -msgstr "La ressource Pool \"%s\" est introuvable pour le volume \"%s\"\n" +#, fuzzy +#~ msgid "=====================================================================================\n" +#~ msgstr "========================================================================\n" -#: src/dird/ua_label.c:1210 #, fuzzy -msgid "No Volumes found, or no barcodes.\n" -msgstr "Pas de volume à labéliser ou pas de codebar.\n" +#~ msgid "%-14s\t%-8s\t%3d\t%-18s\t%-18s\t%s\n" +#~ msgstr "%-14s %-8s %3d %-18s %-18s %s\n" -#: src/dird/ua_label.c:1213 -msgid "" -" Slot | Volume Name | Status | Media Type | " -"Pool |\n" -msgstr "" +#~ msgid "%-14s %-8s %3d %-18s %-18s %s\n" +#~ msgstr "%-14s %-8s %3d %-18s %-18s %s\n" -#: src/dird/ua_label.c:1214 -msgid "" -"------+------------------+-----------+----------------------" -"+--------------------|\n" -msgstr "" +#~ msgid "No Scheduled Jobs.\n" +#~ msgstr "Pas de job programmé.\n" -#: src/dird/ua_output.c:56 src/dird/ua_output.c:80 -msgid "ON or OFF keyword missing.\n" -msgstr "Mot clef ON ou OFF manquant.\n" +#~ msgid "" +#~ "\n" +#~ "Running Jobs:\n" +#~ msgstr "" +#~ "\n" +#~ "Job en cours :\n" -#: src/dird/ua_output.c:100 #, fuzzy -msgid "Disabled Jobs:\n" -msgstr "est bloqué" +#~ msgid "Console connected %sat %s\n" +#~ msgstr "Console connecté à %s\n" + +#~ msgid "" +#~ "No Jobs running.\n" +#~ "====\n" +#~ msgstr "" +#~ "Pas de job en cours.\n" +#~ "====\n" -#: src/dird/ua_output.c:106 #, fuzzy -msgid "No disabled Jobs.\n" -msgstr "Pas de job programmé.\n" +#~ msgid " JobId Type Level Files Bytes Name Status\n" +#~ msgstr " JobId Type Nom Statut\n" -#: src/dird/ua_output.c:208 -msgid "Keywords for the show command are:\n" -msgstr "" +#~ msgid "======================================================================\n" +#~ msgstr "======================================================================\n" -#: src/dird/ua_output.c:215 -#, c-format -msgid "%s resource %s not found.\n" -msgstr "%s ressource %s introuvable.\n" +#~ msgid "is waiting execution" +#~ msgstr "est en attente d'exécution" -#: src/dird/ua_output.c:219 -#, c-format -msgid "Resource %s not found\n" -msgstr "Ressource %s introuvable\n" +#~ msgid "is running" +#~ msgstr "est en cours" -#: src/dird/ua_output.c:360 -msgid "Hey! DB is NULL\n" -msgstr "" +#~ msgid "is blocked" +#~ msgstr "est bloqué" + +#~ msgid "has terminated" +#~ msgstr "est terminé" -#: src/dird/ua_output.c:522 #, fuzzy -msgid "Invalid jobid argument\n" -msgstr "argument invalide" +#~ msgid "has terminated with warnings" +#~ msgstr "Job terminés :\n" -#: src/dird/ua_output.c:546 -#, fuzzy, c-format -msgid "Unknown ObjectType %s\n" -msgstr "Mot clef inconnu : %s\n" +#, fuzzy +#~ msgid "has terminated in incomplete state" +#~ msgstr "Job terminés :\n" -#: src/dird/ua_output.c:556 -msgid "list pluginrestoreconf requires jobid argument\n" -msgstr "" +#~ msgid "has errors" +#~ msgstr "est en erreur" -#: src/dird/ua_output.c:594 -#, c-format -msgid "Jobid %d used %d Volume(s): %s\n" -msgstr "JobId %d a utilisé %d volume(s) : %s\n" +#~ msgid "has a fatal error" +#~ msgstr "est en erreur (fatale)" -#: src/dird/ua_output.c:613 -msgid "No Pool specified.\n" -msgstr "Pas de Pool spécifié.\n" +#~ msgid "has been canceled" +#~ msgstr "a été annulé" -#: src/dird/ua_output.c:624 src/dird/ua_select.c:612 src/dird/ua_update.c:435 -#, c-format -msgid "Error obtaining pool ids. ERR=%s\n" -msgstr "Erreur pendant lors de la récupération du pool. ERR=%s\n" +#, fuzzy +#~ msgid "is waiting on Client" +#~ msgstr "est en attente du client %s" -#: src/dird/ua_output.c:634 -#, c-format -msgid "Pool: %s\n" -msgstr "Pool : %s\n" +#~ msgid "is waiting on Client %s" +#~ msgstr "est en attente du client %s" -#: src/dird/ua_output.c:650 -msgid "Ignoring invalid value for days. Max is 50.\n" -msgstr "" +#, fuzzy +#~ msgid "is waiting on Storage \"%s\"" +#~ msgstr "est en attente du Storage %s" -#: src/dird/ua_output.c:679 -#, c-format -msgid "Unknown list keyword: %s\n" -msgstr "" +#, fuzzy +#~ msgid "is waiting on Storage" +#~ msgstr "est en attente du Storage %s" -#: src/dird/ua_output.c:704 -#, c-format -msgid "%s is not a job name.\n" -msgstr "%s n'est pas un nom de job.\n" +#, fuzzy +#~ msgid "is waiting for its start time (%s)" +#~ msgstr "attend son heure de démarrage" -#: src/dird/ua_output.c:718 -#, fuzzy, c-format -msgid "Could not find Pool for Job %s\n" -msgstr "Impossible d'ouvrir le device %s\n" +#~ msgid "is waiting for higher priority jobs to finish" +#~ msgstr "attend qu'un job plus prioritaire se termine" -#: src/dird/ua_output.c:731 -#, fuzzy, c-format -msgid "Could not find next Volume for Job %s (Pool=%s, Level=%s).\n" -msgstr "Impossible de trouver le prochain Volume pour le Job %s (%s, %s).\n" +#, fuzzy +#~ msgid "is waiting for a Shared Storage device" +#~ msgstr "est en attente du Storage %s" -#: src/dird/ua_output.c:735 -#, fuzzy, c-format -msgid "" -"The next Volume to be used by Job \"%s\" (Pool=%s, Level=%s) will be %s\n" -msgstr "Le prochain Volume utilisé par le Job \"%s\" (%s, %s) sera %s\n" +#, fuzzy +#~ msgid "SD despooling Data" +#~ msgstr "Spooling des données...\n" -#: src/dird/ua_output.c:746 -#, c-format -msgid "Could not find next Volume for Job %s.\n" -msgstr "Impossible de trouver le prochain volume pour le Job %s.\n" +#, fuzzy +#~ msgid "SD despooling Attributes" +#~ msgstr "Spooling des données...\n" -#: src/dird/ua_output.c:892 -#, c-format -msgid "Pool %s not in database. %s" -msgstr "Pool %s introuvable en base. %s" +#~ msgid "is in unknown state %c" +#~ msgstr "est dans un état inconnu %c" -#: src/dird/ua_output.c:900 -#, c-format -msgid "Pool %s created in database.\n" -msgstr "Pool %s créé en base.\n" +#~ msgid "is waiting for a mount request" +#~ msgstr "est en attente d'un montage" -#: src/dird/ua_output.c:956 -msgid "You have no messages.\n" -msgstr "Vous n'avez pas de messages.\n" +#~ msgid "is waiting for an appendable Volume" +#~ msgstr "est en attente d'un volume libre" -#: src/dird/ua_output.c:1036 -msgid "Message too long to display.\n" -msgstr "" +#, fuzzy +#~ msgid "is waiting for Client to connect to Storage daemon" +#~ msgstr "attend que le client %s se connecte au Storage %s" -#: src/dird/ua_prune.c:118 -msgid "Choose item to prune" -msgstr "Que voulez vous purger du catalogue (prune)" +#~ msgid "is waiting for Client %s to connect to Storage %s" +#~ msgstr "attend que le client %s se connecte au Storage %s" -#: src/dird/ua_prune.c:174 -#, c-format -msgid "Cannot prune Volume \"%s\" because it is archived.\n" -msgstr "Impossible de pruner le Volume \"%s\" car il est archivé.\n" +#, fuzzy +#~ msgid "%6d\t%-6s\t%-20s\t%s\t%s\n" +#~ msgstr "%6d %-6s %-20s %s\n" -#: src/dird/ua_prune.c:219 #, fuzzy -msgid "Pruned Jobs from JobHisto catalog.\n" -msgstr "Purge du catalogue (prune) de %d %s du client %s.\n" +#~ msgid "%6d %-4s %-3s %10s %10s %-17s %s\n" +#~ msgstr "%6d %-6s %8s %10s %-7s %-8s %s\n" + +#~ msgid "No Terminated Jobs.\n" +#~ msgstr "Pas de job terminé.\n" + +#~ msgid "====================================================================\n" +#~ msgstr "=====================================================================\n" + +#~ msgid "\n" +#~ msgstr "\n" -#: src/dird/ua_prune.c:307 #, fuzzy -msgid "Begin pruning Files.\n" -msgstr "Début de purge des fichiers du catalogue (prune).\n" +#~ msgid "add dir/file to be restored recursively, wildcards allowed" +#~ msgstr "" +#~ "marque récursivement les fichiers/répertoires pour être restaurés, les " +#~ "jokers (*) fonctionnent" -#: src/dird/ua_prune.c:322 -msgid "No Files found to prune.\n" -msgstr "Pas de fichier trouvé pour la purge du catalogue (prune).\n" +#~ msgid "change current directory" +#~ msgstr "change le répertoire courant" -#: src/dird/ua_prune.c:345 -#, c-format -msgid "Pruned Files from %s Jobs for client %s from catalog.\n" -msgstr "" -"Purge du catalogue des fichiers (prune) de %s Jobs pour le client %s.\n" +#~ msgid "count marked files in and below the cd" +#~ msgstr "compte le nombre de fichiers marqués à partir du répertoire courant" -#: src/dird/ua_prune.c:491 -#, fuzzy, c-format -msgid "Begin pruning Jobs older than %s.\n" -msgstr "Début de purge des Jobs du catalogue (prune).\n" +#, fuzzy +#~ msgid "delete dir/file to be restored recursively in dir" +#~ msgstr "dé-sélectionne les fichiers/répertoires récursivement" -#: src/dird/ua_prune.c:602 -#, c-format -msgid "Pruned %d %s for client %s from catalog.\n" -msgstr "Purge du catalogue (prune) de %d %s du client %s.\n" +#~ msgid "long list current directory, wildcards allowed" +#~ msgstr "liste détaillée du répertoire courant, les jocker (*) fonctionnent" -#: src/dird/ua_prune.c:603 -msgid "Jobs" -msgstr "Jobs" +#~ msgid "leave file selection mode" +#~ msgstr "sort de la sélection des fichiers" -#: src/dird/ua_prune.c:605 -msgid "No Jobs found to prune.\n" -msgstr "Pas de job trouvé pour la purge du catalogue (prune).\n" +#~ msgid "estimate restore size" +#~ msgstr "estime la taille de la restauration" -#: src/dird/ua_prune.c:666 -msgid "Expecting limit argument as integer\n" -msgstr "" +#~ msgid "same as done command" +#~ msgstr "synonyme de la commande \"done\"" -#: src/dird/ua_prune.c:679 -#, fuzzy, c-format -msgid "Volume \"%s\"" -msgstr "Fichiers du Volume" +#~ msgid "find files, wildcards allowed" +#~ msgstr "recherche des fichiers, les jokers (*) fonctionnent" -#: src/dird/ua_purge.c:85 -#, fuzzy -msgid "" -"\n" -"This command can be DANGEROUS!!!\n" -"\n" -"It purges (deletes) all Files from a Job,\n" -"JobId, Client or Volume; or it purges (deletes)\n" -"all Jobs from a Client or Volume without regard\n" -"to retention periods. Normally you should use the\n" -"PRUNE command, which respects retention periods.\n" -msgstr "" -"\n" -"Cette commande peut être DANGEUREUSE !\n" -"\n" -"Elle supprime tous les enregistrements des fichiers d'un job, \n" -"d'un client ou d'un volume ; ou bien elle supprime tous les jobs\n" -"d'un client ou d'un volume sans s'occuper des périodes de rétention.\n" -"\n" -"Normalement vous devez utiliser la commande PRUNE qui respecte les périodes\n" -"de rétention.\n" +#~ msgid "print help" +#~ msgstr "affiche l'aide" -#: src/dird/ua_purge.c:153 -msgid "Choose item to purge" -msgstr "Choisissez l'élément à purger" +#~ msgid "list current directory, wildcards allowed" +#~ msgstr "" +#~ "affiche le contenu du répertoire courant, les jokers (*) fonctionnent" -#: src/dird/ua_purge.c:200 -#, c-format -msgid "Begin purging files for Client \"%s\"\n" -msgstr "Début de la purge des fichiers du client \"%s\"\n" +#, fuzzy +#~ msgid "list subdir in current directory, wildcards allowed" +#~ msgstr "" +#~ "affiche le contenu du répertoire courant, les jokers (*) fonctionnent" -#: src/dird/ua_purge.c:209 src/dird/ua_purge.c:259 -#, c-format -msgid "No Files found for client %s to purge from %s catalog.\n" -msgstr "Pas de fichier à purger pour le client \"%s\" dans le catalogue %s.\n" +#~ msgid "list the marked files in and below the cd" +#~ msgstr "liste les fichiers marqués à partir du répertoire courant" -#: src/dird/ua_purge.c:212 -#, c-format -msgid "Files for %d Jobs for client \"%s\" purged from %s catalog.\n" -msgstr "Fichiers de %d jobs du client \"%s\" purgé du catalogue %s.\n" +#, fuzzy +#~ msgid "list the marked files in" +#~ msgstr "liste les fichiers marqués à partir du répertoire courant" -#: src/dird/ua_purge.c:250 -#, c-format -msgid "Begin purging jobs from Client \"%s\"\n" -msgstr "Début de purge des jobs du client \"%s\"\n" +#~ msgid "mark dir/file to be restored recursively, wildcards allowed" +#~ msgstr "" +#~ "marque récursivement les fichiers/répertoires pour être restaurés, les " +#~ "jokers (*) fonctionnent" -#: src/dird/ua_purge.c:262 -#, c-format -msgid "%d Jobs for client %s purged from %s catalog.\n" -msgstr "%d jobs du client \"%s\" purgé du catalogue %s.\n" +#~ msgid "mark directory name to be restored (no files)" +#~ msgstr "marque un répertoire (seulement) pour la restauration" -#: src/dird/ua_purge.c:466 -#, c-format -msgid "" -"\n" -"Volume \"%s\" has VolStatus \"%s\" and cannot be purged.\n" -"The VolStatus must be: Append, Full, Used, or Error to be purged.\n" -msgstr "" -"\n" -"Le volume \"%s\" est en état \"%s\" et il ne peut pas être purgé.\n" -"Son statut doit être : Append, Full, Used ou Error pour être purgé.\n" +#~ msgid "print current working directory" +#~ msgstr "affiche le répertoire courant" -#: src/dird/ua_purge.c:494 -#, c-format -msgid "%d File%s on Volume \"%s\" purged from catalog.\n" -msgstr "%d fichier%s du volume \"%s\" purgé du catalogue.\n" +#~ msgid "unmark dir/file to be restored recursively in dir" +#~ msgstr "dé-sélectionne les fichiers/répertoires récursivement" -#: src/dird/ua_purge.c:544 -#, c-format -msgid "" -"There are no more Jobs associated with Volume \"%s\". Marking it purged.\n" -msgstr "" -"Il n'y a plus de job associé avec le volume \"%s\". Il est marqué purgé.\n" +#~ msgid "unmark directory name only no recursion" +#~ msgstr "dé-sélectionne seulement un répertoire" -#: src/dird/ua_purge.c:617 -#, fuzzy -msgid "Can't update volume size in the catalog\n" -msgstr "Le Volume \"%s\" a été créé dans le catalogue.\n" +#~ msgid "quit and do not do restore" +#~ msgstr "quitte et annule la restauration" -#: src/dird/ua_purge.c:619 -#, c-format -msgid "The volume \"%s\" has been truncated\n" -msgstr "" +#~ msgid "" +#~ "\n" +#~ "You are now entering file selection mode where you add (mark) and\n" +#~ "remove (unmark) files to be restored. No files are initially added, " +#~ "unless\n" +#~ "you used the \"all\" keyword on the command line.\n" +#~ "Enter \"done\" to leave this mode.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Vous êtes dans le mode de sélection des fichiers ou vous devez ajouter " +#~ "(mark)\n" +#~ "et supprimez (unmark) les fichiers à restaurer. Aucun fichier n'est " +#~ "sélectionné\n" +#~ "par défaut sauf si vous avez utilisé l'option \"all\" dans la commande.\n" +#~ "Terminez votre saisie par \"done\"\n" +#~ "\n" -#: src/dird/ua_purge.c:621 -#, fuzzy, c-format -msgid "Unable to truncate volume \"%s\"\n" -msgstr "Impossible d'écrire le marqueur EOF. ERR=%s\n" +#~ msgid "cwd is: %s\n" +#~ msgstr "Le répertoire courant est : %s\n" -#: src/dird/ua_purge.c:714 #, fuzzy -msgid "No Volumes found to perform \"truncate\" command.\n" -msgstr "Pas de volume à labéliser ou pas de codebar.\n" +#~ msgid "Invalid command \"%s\". Enter \"done\" to exit.\n" +#~ msgstr "Commande invalide. Tapez \"done\" pour quitter.\n" -#: src/dird/ua_purge.c:781 -#, c-format -msgid "Unable move recycled Volume in full Pool \"%s\" MaxVols=%d\n" -msgstr "" -"Impossible de déplacer le volume recyclé, le Pool \"%s\" est plein. MaxVols=" -"%d\n" - -#: src/dird/ua_purge.c:795 -#, c-format -msgid "All records pruned from Volume \"%s\"; marking it \"Purged\"\n" -msgstr "" -"Il n'y a pas de job associé avec le volume \"%s\". Il est marqué comme " -"Purged.\n" +#~ msgid "No files marked.\n" +#~ msgstr "Aucun fichier sélectionné.\n" -#: src/dird/ua_purge.c:800 -#, c-format -msgid "Cannot purge Volume with VolStatus=%s\n" -msgstr "Impossible de purger un volume dans l'état (VolStatus) %s\n" +#~ msgid "1 file marked.\n" +#~ msgstr "1 fichier sélectionné.\n" -#: src/dird/ua_query.c:62 src/findlib/create_file.c:283 -#: src/findlib/create_file.c:385 -#, c-format -msgid "Could not open %s: ERR=%s\n" -msgstr "Impossible d'ouvrir %s : ERR=%s\n" +#~ msgid "%s files marked.\n" +#~ msgstr "%s fichiers sélectionnés.\n" -#: src/dird/ua_query.c:67 -msgid "Available queries:\n" -msgstr "Requêtes disponibles :\n" +#~ msgid "No directories marked.\n" +#~ msgstr "Pas de répertoire sélectionné.\n" -#: src/dird/ua_query.c:74 -msgid "Choose a query" -msgstr "Choisissez une requête" +#~ msgid "1 directory marked.\n" +#~ msgstr "1 répertoire sélectionné.\n" -#: src/dird/ua_query.c:88 -msgid "Could not find query.\n" -msgstr "Impossible de trouver la requête.\n" +#~ msgid "%s directories marked.\n" +#~ msgstr "%s répertoires sélectionnés.\n" -#: src/dird/ua_query.c:106 -msgid "Too many prompts in query, max is 9.\n" -msgstr "" +#~ msgid "%s total files/dirs. %s marked to be restored.\n" +#~ msgstr "" +#~ "%s fichiers/répertoires au total. %s sélectionné pour la restauration.\n" -#: src/dird/ua_query.c:209 -#, c-format -msgid "Warning prompt %d missing.\n" -msgstr "" +#~ msgid "Node %s has no children.\n" +#~ msgstr "Le noeud %s n'a pas de fils.\n" -#: src/dird/ua_query.c:254 -msgid "" -"Entering SQL query mode.\n" -"Terminate each query with a semicolon.\n" -"Terminate query mode with a blank line.\n" -msgstr "" +#~ msgid "%d total files; %d marked to be restored; %s bytes.\n" +#~ msgstr "" +#~ "%d fichiers en tout ; %d marqués pour la restauration ; %s octets.\n" -#: src/dird/ua_query.c:257 src/dird/ua_query.c:273 -msgid "Enter SQL query: " -msgstr "Saisissez votre requête SQL : " +#~ msgid "" +#~ " Command Description\n" +#~ " ======= ===========\n" +#~ msgstr "" +#~ " Commande Description\n" +#~ " ======== ===========\n" -#: src/dird/ua_query.c:275 -msgid "Add to SQL query: " -msgstr "" +#~ msgid "Too few or too many arguments. Try using double quotes.\n" +#~ msgstr "" +#~ "Trop ou pas assez d'arguments sur la commande. Essayez d'utiliser des " +#~ "\"\"\"\n" -#: src/dird/ua_query.c:278 -msgid "End query mode.\n" -msgstr "" +#~ msgid "No files unmarked.\n" +#~ msgstr "Pas de fichier dé-sélectionné.\n" -#: src/dird/ua_restore.c:295 -msgid "\"RegexWhere\" specification not authorized.\n" -msgstr "" +#~ msgid "1 file unmarked.\n" +#~ msgstr "1 fichier dé-sélectionné.\n" -#: src/dird/ua_restore.c:302 -msgid "\"where\" specification not authorized.\n" -msgstr "" +#~ msgid "%s files unmarked.\n" +#~ msgstr "%s fichiers dé-sélectionnés.\n" -#: src/dird/ua_restore.c:320 -msgid "" -"No Restore Job Resource found in bacula-dir.conf.\n" -"You must create at least one before running this command.\n" -msgstr "" +#~ msgid "No directories unmarked.\n" +#~ msgstr "Pas de répertoire dé-sélectionné\n" -#: src/dird/ua_restore.c:337 -msgid "Restore not done.\n" -msgstr "Restauration non effectuée.\n" +#~ msgid "1 directory unmarked.\n" +#~ msgstr "1 répertoire dé-sélectionné\n" -#: src/dird/ua_restore.c:348 -msgid "Unable to construct a valid BSR. Cannot continue.\n" -msgstr "Impossible de générer un fichier bootstrap valide. Abandon.\n" +#~ msgid "%d directories unmarked.\n" +#~ msgstr "%d répertoires dé-sélectionnés.\n" -#: src/dird/ua_restore.c:352 src/dird/ua_restore.c:366 -msgid "No files selected to be restored.\n" -msgstr "Aucun fichier sélectionné pour la restauration.\n" +#~ msgid "Update choice:\n" +#~ msgstr "Elément à mettre à jour :\n" -#: src/dird/ua_restore.c:356 -#, c-format -msgid "Bootstrap records written to %s\n" -msgstr "Fichier bootstrap écrit sur %s\n" +#~ msgid "Volume parameters" +#~ msgstr "Paramètres d'un volume" -#: src/dird/ua_restore.c:360 -msgid "" -"\n" -"1 file selected to be restored.\n" -"\n" -msgstr "" -"\n" -"1 fichier sélectionne pour la restauration.\n" -"\n" +#~ msgid "Pool from resource" +#~ msgstr "Pool à partir de sa définition" -#: src/dird/ua_restore.c:362 -#, c-format -msgid "" -"\n" -"%s files selected to be restored.\n" -"\n" -msgstr "" -"\n" -"%s fichiers sélectionnés pour la restauration.\n" +#~ msgid "Slots from autochanger" +#~ msgstr "Slots d'un autochangeur" -#: src/dird/ua_restore.c:381 #, fuzzy -msgid "No Client resource found!\n" -msgstr "Pas de ressource \"Restore Job\" trouvée !\n" +#~ msgid "Long term statistics" +#~ msgstr "Spooling des données...\n" -#: src/dird/ua_restore.c:499 #, fuzzy -msgid "The restore will use the following job(s) as Base\n" -msgstr "Le job va utiliser les volumes suivants :\n" +#~ msgid "Snapshot parameters" +#~ msgstr "Paramètres d'un volume" -#: src/dird/ua_restore.c:532 -#, c-format -msgid "Missing value for keyword: %s\n" -msgstr "" +#~ msgid "item" +#~ msgstr "item" -#: src/dird/ua_restore.c:612 -msgid "List last 20 Jobs run" -msgstr "Afficher les 20 derniers jobs lancés" +#~ msgid "Choose catalog item to update" +#~ msgstr "Choisissez l'élément à mettre à jour" -#: src/dird/ua_restore.c:613 -msgid "List Jobs where a given File is saved" -msgstr "Afficher les jobs où un fichier donné a été sauvegardé" +#~ msgid "New Volume status is: %s\n" +#~ msgstr "Le statut du volume est : %s\n" -#: src/dird/ua_restore.c:614 -msgid "Enter list of comma separated JobIds to select" -msgstr "Saisir une liste de JobIds à sélectionner (ex : 12,4,3)" +#~ msgid "Invalid use duration specified: %s\n" +#~ msgstr "Durée d'utilisation invalide : %s\n" -#: src/dird/ua_restore.c:615 -msgid "Enter SQL list command" -msgstr "Exécuter une requête SQL" +#~ msgid "New use duration is: %s\n" +#~ msgstr "La nouvelle durée d'utilisation est : %s\n" -#: src/dird/ua_restore.c:616 -msgid "Select the most recent backup for a client" -msgstr "Sélectionner la sauvegarde la plus récente pour un client" - -#: src/dird/ua_restore.c:617 -msgid "Select backup for a client before a specified time" -msgstr "" -"Sélectionner la dernière sauvegarde pour un client avant une certaine date" +#~ msgid "Invalid value. It must be yes or no.\n" +#~ msgstr "Saisie invalide. Veuillez répondre oui ou non.\n" -#: src/dird/ua_restore.c:618 -msgid "Enter a list of files to restore" -msgstr "Saisir la liste des fichiers à restaurer" +#~ msgid "Invalid slot, it must be between 0 and MaxVols=%d\n" +#~ msgstr "Slot invalide, il doit être compris entre 0 et MaxVols=%d\n" -#: src/dird/ua_restore.c:619 -msgid "Enter a list of files to restore before a specified time" -msgstr "Saisir la liste des fichiers à restaurer avant une certaine date" +#~ msgid "New Slot is: %d\n" +#~ msgstr "Le nouveau slot est : %d\n" -#: src/dird/ua_restore.c:620 -msgid "Find the JobIds of the most recent backup for a client" -msgstr "Afficher les JobIds de sauvegarde les plus récents pour un client" +#~ msgid "New Pool is: %s\n" +#~ msgstr "Le nouveau pool est : %s\n" -#: src/dird/ua_restore.c:621 -msgid "Find the JobIds for a backup for a client before a specified time" -msgstr "Afficher les JobIds de sauvegarde avant une certaine date" +#~ msgid "New RecyclePool is: %s\n" +#~ msgstr "Le nouveau RecyclePool est : %s\n" -#: src/dird/ua_restore.c:622 -msgid "Enter a list of directories to restore for found JobIds" -msgstr "Saisir la liste des répertoires à restaurer (pour un JobId)" +#, fuzzy +#~ msgid "Error updating media record Enabled: ERR=%s" +#~ msgstr "Impossible de mettre à jour les informations du Volume : ERR=%s" -#: src/dird/ua_restore.c:623 #, fuzzy -msgid "Select full restore to a specified Job date" -msgstr "" -"Sélectionner la dernière sauvegarde pour un client avant une certaine date" +#~ msgid "New Enabled is: %d\n" +#~ msgstr "Le nouveau flag Enabled est : %d\n" -#: src/dird/ua_restore.c:624 src/dird/ua_status.c:1213 src/lib/status.h:120 -msgid "Cancel" -msgstr "Annulé" +#, fuzzy +#~ msgid "Error updating media record ActionOnPurge: ERR=%s" +#~ msgstr "Impossible de mettre à jour les informations du Volume : ERR=%s" -#: src/dird/ua_restore.c:671 -#, c-format -msgid "Unknown keyword: %s\n" -msgstr "Mot clef inconnu : %s\n" +#, fuzzy +#~ msgid "New ActionOnPurge is: %s\n" +#~ msgstr "La nouvelle durée d'utilisation est : %s\n" -#: src/dird/ua_restore.c:700 src/dird/ua_update.c:947 -#, c-format -msgid "Improper date format: %s\n" -msgstr "Format de date invalide : %s\n" +#~ msgid "Volume Status" +#~ msgstr "Statut d'un volume" -#: src/dird/ua_restore.c:735 src/dird/ua_select.c:770 -#, c-format -msgid "Error: Pool resource \"%s\" does not exist.\n" -msgstr "Erreur : le Pool \"%s\" n'existe pas.\n" +#~ msgid "Volume Retention Period" +#~ msgstr "Période de rétention d'un volume" -#: src/dird/ua_restore.c:740 -#, c-format -msgid "Error: Pool resource \"%s\" access not allowed.\n" -msgstr "Erreur : l'utilisation du Pool \"%s\" n'est pas autorisé.\n" +#~ msgid "Volume Use Duration" +#~ msgstr "Durée d'utilisation d'un volume" -#: src/dird/ua_restore.c:756 -msgid "" -"\n" -"First you select one or more JobIds that contain files\n" -"to be restored. You will be presented several methods\n" -"of specifying the JobIds. Then you will be allowed to\n" -"select which files from those JobIds are to be restored.\n" -"\n" -msgstr "" -"\n" -"\n" -"D'abord, vous devez sélectionner un ou plusieurs jobs (par leur JobId) qui\n" -"contiennent les fichiers à restaurer. Il vous est présenté plusieurs " -"méthodes\n" -"pour choisir le bon JobId. Après, vous pourrez sélectionner les fichiers à\n" -"restaurer parmi la liste totale des fichiers présents dans les jobs\n" -"sélectionnés.\n" - -#: src/dird/ua_restore.c:769 -msgid "To select the JobIds, you have the following choices:\n" -msgstr "Pour sélectionner les JobIds, vous avez les possibilités suivantes :\n" - -#: src/dird/ua_restore.c:774 -msgid "Select item: " -msgstr "Choix : " - -#: src/dird/ua_restore.c:779 src/dird/ua_restore.c:814 -msgid "SQL query not authorized.\n" -msgstr "" +#~ msgid "Maximum Volume Jobs" +#~ msgstr "Nombre maximum de job sur un volume" -#: src/dird/ua_restore.c:792 -msgid "Enter Filename (no path):" -msgstr "Saisissez le nom du fichier (sans le chemin) : " +#~ msgid "Maximum Volume Files" +#~ msgstr "Nombre maximum de fichier sur un volume" -#: src/dird/ua_restore.c:807 src/dird/ua_restore.c:915 -msgid "Enter JobId(s), comma separated, to restore: " -msgstr "Saisissez le ou les JobIds à restaurer (ex : id1,id2,id3) : " +#~ msgid "Maximum Volume Bytes" +#~ msgstr "Taille maximum d'un volume" -#: src/dird/ua_restore.c:817 -msgid "Enter SQL list command: " -msgstr "Exécuter une requête SQL : " +#~ msgid "Recycle Flag" +#~ msgstr "Flag de recyclage" -#: src/dird/ua_restore.c:851 src/dird/ua_restore.c:874 -msgid "" -"Enter file names with paths, or < to enter a filename\n" -"containing a list of file names with paths, and terminate\n" -"them with a blank line.\n" -msgstr "" -"Saisissez les répertoires complets ou bien < pour saisir le nom d'un\n" -"fichier contenant la liste des répertoires et\n" -"terminez la saisie par une ligne vide.\n" +#~ msgid "InChanger Flag" +#~ msgstr "Flag InChanger" -#: src/dird/ua_restore.c:855 src/dird/ua_restore.c:878 -msgid "Enter full filename: " -msgstr "Saisissez le nom complet du fichier : " +#~ msgid "Volume Files" +#~ msgstr "Fichiers du Volume" -#: src/dird/ua_restore.c:913 -#, c-format -msgid "You have already selected the following JobIds: %s\n" -msgstr "Vous avez déjà sélectionné les JobIds suivants : %s\n" +#~ msgid "RecyclePool" +#~ msgstr "RecyclePool" -#: src/dird/ua_restore.c:931 -msgid "" -"Enter full directory names or start the name\n" -"with a < to indicate it is a filename containing a list\n" -"of directories and terminate them with a blank line.\n" -msgstr "" -"Saisissez les répertoires complets ou bien le nom d'un\n" -"fichier (commençant par <) contenant la liste des répertoires et\n" -"terminez la saisie par une ligne vide.\n" +#~ msgid "Updating Volume \"%s\"\n" +#~ msgstr "Mise à jour du Volume \"%s\"\n" -#: src/dird/ua_restore.c:935 -msgid "Enter directory name: " -msgstr "Saisissez le nom d'un répertoire : " +#~ msgid "Current Volume status is: %s\n" +#~ msgstr "Le statut actuel du volume (Volume status) est : %s\n" -#: src/dird/ua_restore.c:951 -#, fuzzy -msgid "Enter JobId to get the state to restore: " -msgstr "Saisissez le JobId à supprimer : " +#~ msgid "Possible Values are:\n" +#~ msgstr "Les valeurs possibles sont :\n" -#: src/dird/ua_restore.c:964 src/dird/vbackup.c:146 -#, c-format -msgid "Selecting jobs to build the Full state at %s\n" -msgstr "" +#~ msgid "Choose new Volume Status" +#~ msgstr "Saisissez le nouveau statut du volume (Volume Status)" -#: src/dird/ua_restore.c:990 -msgid "Invalid JobId in list.\n" -msgstr "" +#~ msgid "Enter Volume Retention period: " +#~ msgstr "Saisissez la période de rétention du volume : " -#: src/dird/ua_restore.c:1009 -#, c-format -msgid "Access to JobId=%s (Job \"%s\") not authorized. Not selected.\n" -msgstr "" +#~ msgid "Current use duration is: %s\n" +#~ msgstr "La durée d'utilisation actuelle est : %s\n" -#: src/dird/ua_restore.c:1022 -msgid "No Jobs selected.\n" -msgstr "Pas de job sélectionné.\n" +#~ msgid "Enter Volume Use Duration: " +#~ msgstr "Saisissez la durée d'utilisation du volume : " -#: src/dird/ua_restore.c:1027 -#, c-format -msgid "You have selected the following JobIds: %s\n" -msgstr "Vous avez sélectionné les JobIds suivants : %s\n" +#~ msgid "Current max jobs is: %u\n" +#~ msgstr "Le nombre maximum de Job actuel est : %u\n" -#: src/dird/ua_restore.c:1029 -#, c-format -msgid "You have selected the following JobId: %s\n" -msgstr "Vous avez sélectionné le JobId suivant : %s\n" +#~ msgid "Enter new Maximum Jobs: " +#~ msgstr "Saisissez la valeur du nombre maximum de Job : " -#: src/dird/ua_restore.c:1039 -msgid "" -"The restored files will the most current backup\n" -"BEFORE the date you specify below.\n" -"\n" -msgstr "" +#~ msgid "Current max files is: %u\n" +#~ msgstr "Le nombre maximum de fichier actuel est : %u\n" -#: src/dird/ua_restore.c:1042 -msgid "Enter date as YYYY-MM-DD HH:MM:SS :" -msgstr "Saisissez la date au format YYYY-MM-DD HH:MM:SS : " +#~ msgid "Enter new Maximum Files: " +#~ msgstr "Saisissez la valeur du nombre maximum de fichier (Maximum Files) : " -#: src/dird/ua_restore.c:1048 -msgid "Improper date format.\n" -msgstr "Format de date invalide.\n" +#~ msgid "Current value is: %s\n" +#~ msgstr "La valeur actuelle est : %s\n" -#: src/dird/ua_restore.c:1069 -#, c-format -msgid "Cannot open file %s: ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" +#~ msgid "Enter new Maximum Bytes: " +#~ msgstr "Saisissez la nouvelle taille maximum (octets) : " -#: src/dird/ua_restore.c:1077 src/dird/ua_restore.c:1081 -#, c-format -msgid "Error occurred on line %d of file \"%s\"\n" -msgstr "Une erreur est survenue à la ligne %d de \"%s\"\n" +#~ msgid "Current recycle flag is: %s\n" +#~ msgstr "Le flag de recyclage courant est : %s\n" -#: src/dird/ua_restore.c:1125 src/dird/ua_restore.c:1153 -#, c-format -msgid "No database record found for: %s\n" -msgstr "Pas d'enregistrement trouvé en base pour : %s\n" +#~ msgid "Current Slot is: %d\n" +#~ msgstr "Le slot courant est : %d\n" -#: src/dird/ua_restore.c:1141 -msgid "No JobId specified cannot continue.\n" -msgstr "" +#~ msgid "Enter new Slot: " +#~ msgstr "Saisissez le nouveau slot : " -#: src/dird/ua_restore.c:1174 -#, c-format -msgid "No table found: %s\n" -msgstr "" +#~ msgid "Current InChanger flag is: %d\n" +#~ msgstr "Le flag InChanger courant est : %d\n" -#: src/dird/ua_restore.c:1232 -msgid "" -"\n" -"\n" -"For one or more of the JobIds selected, no files were found,\n" -"so file selection is not possible.\n" -"Most likely your retention policy pruned the files.\n" -msgstr "" +#, fuzzy +#~ msgid "Set InChanger flag for Volume \"%s\": yes/no: " +#~ msgstr "Positionner le flag InChanger ? oui/non : " -#: src/dird/ua_restore.c:1235 -msgid "" -"\n" -"Do you want to restore all the files? (yes|no): " -msgstr "" -"\n" -"Voulez vous restaurer tous les fichiers ? (oui|non) : " +#~ msgid "New InChanger flag is: %d\n" +#~ msgstr "Le nouveau flag InChanger est : %d\n" -#: src/dird/ua_restore.c:1238 -msgid "" -"\n" -"Regexp matching files to restore? (empty to abort): " -msgstr "" +#~ msgid "" +#~ "Warning changing Volume Files can result\n" +#~ "in loss of data on your Volume\n" +#~ "\n" +#~ msgstr "" +#~ "Attention, changer le nombre de fichier du Volume peut\n" +#~ "vous faire perdre des données du Volume\n" +#~ "\n" -#: src/dird/ua_restore.c:1254 -#, fuzzy, c-format -msgid "Regex compile error: %s\n" -msgstr "erreur sockopt : %s\n" +#~ msgid "Current Volume Files is: %u\n" +#~ msgstr "Le nombre courant de fichier sur le Volume est : %u\n" -#: src/dird/ua_restore.c:1297 -#, fuzzy, c-format -msgid "Unable to create component file %s. ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" +#~ msgid "Enter new number of Files for Volume: " +#~ msgstr "Saisissez le nouveau nombre de fichiers du Volume : " -#: src/dird/ua_restore.c:1304 -#, fuzzy, c-format -msgid "Unable to fdopen component file %s. ERR=%s\n" -msgstr "3910 Impossible d'ouvrir le device %s : ERR=%s\n" +#~ msgid "Normally, you should only increase Volume Files by one!\n" +#~ msgstr "" +#~ "Logiquement, vous devez augmenter le nombre de fichier du Volume d'un !\n" -#: src/dird/ua_restore.c:1311 #, fuzzy -msgid "Error writing component file.\n" -msgstr "Erreur pendant l'écriture du fichier bsr.\n" +#~ msgid "Increase Volume Files? (yes/no): " +#~ msgstr "Le nouveau nombre de fichier du Volume est : %u\n" -#: src/dird/ua_restore.c:1356 -#, fuzzy, c-format -msgid "" -"\n" -"Building directory tree for JobId(s) %s ... " -msgstr "" -"\n" -"Analyse des répertoires pour le JobId %s..." +#~ msgid "New Volume Files is: %u\n" +#~ msgstr "Le nouveau nombre de fichier du Volume est : %u\n" -#: src/dird/ua_restore.c:1426 -#, fuzzy, c-format -msgid "" -"\n" -"%s files inserted into the tree and marked for extraction.\n" -msgstr "" -"\n" -"1 Job, %s fichiers analysés et sélectionnés pour la restauration.\n" +#~ msgid "Current Pool is: %s\n" +#~ msgstr "Le pool courant est : %s\n" -#: src/dird/ua_restore.c:1429 -#, fuzzy, c-format -msgid "" -"\n" -"%s files inserted into the tree.\n" -msgstr "" -"\n" -"1 Job, %s fichiers analysés\n" +#~ msgid "Enter new Pool name: " +#~ msgstr "Saisissez le nouveau nom pour ce pool : " -#: src/dird/ua_restore.c:1517 -#, c-format -msgid "Error getting FileSet \"%s\": ERR=%s\n" -msgstr "" +#~ msgid "Current Enabled is: %d\n" +#~ msgstr "La valeur actuelle de Enabled est : %d\n" -#: src/dird/ua_restore.c:1522 -#, fuzzy, c-format -msgid "FileSet argument: %s\n" -msgstr "FileSet" +#~ msgid "Enter new Enabled: " +#~ msgstr "Saisissez la nouvelle valeur pour Enabled : " -#: src/dird/ua_restore.c:1528 src/dird/ua_select.c:204 -msgid "The defined FileSet resources are:\n" -msgstr "Les FileSet définis sont :\n" +#~ msgid "Current RecyclePool is: %s\n" +#~ msgstr "Le RecyclePool courant est : %s\n" -#: src/dird/ua_restore.c:1532 src/dird/ua_run.c:1014 src/dird/ua_select.c:212 -msgid "FileSet" -msgstr "FileSet" +#~ msgid "No current RecyclePool\n" +#~ msgstr "Pas de RecyclePool courant\n" -#: src/dird/ua_restore.c:1532 src/dird/ua_select.c:212 -msgid "Select FileSet resource" -msgstr "Sélectionnez le FileSet" +#, fuzzy +#~ msgid "Current ActionOnPurge is: %s\n" +#~ msgstr "La valeur actuelle est : %s\n" -#: src/dird/ua_restore.c:1534 -#, fuzzy, c-format -msgid "No FileSet found for client \"%s\".\n" -msgstr "Pas d'enregistrement trouvé en base pour : %s\n" +#~ msgid "db_update_pool_record returned %d. ERR=%s\n" +#~ msgstr "db_update_pool_record a retourné %d. ERR=%s\n" -#: src/dird/ua_restore.c:1540 -#, c-format -msgid "Error getting FileSet record: %s\n" -msgstr "" +#~ msgid "Pool DB record updated from resource.\n" +#~ msgstr "" +#~ "Les paramètres du Pool en base ont été mis à jour depuis la " +#~ "configuration.\n" -#: src/dird/ua_restore.c:1541 -msgid "" -"This probably means you modified the FileSet.\n" -"Continuing anyway.\n" -msgstr "" +#, fuzzy +#~ msgid "Expect JobId keyword, not found.\n" +#~ msgstr "%s ressource %s introuvable.\n" -#: src/dird/ua_restore.c:1556 -#, c-format -msgid "Pool \"%s\" not found, using any pool.\n" -msgstr "" +#, fuzzy +#~ msgid "Neither Client nor StartTime specified.\n" +#~ msgstr "Pas de storage sélectionné.\n" -#: src/dird/ua_restore.c:1583 src/dird/ua_restore.c:1599 -#, c-format -msgid "No Full backup before %s found.\n" -msgstr "Pas de backup Full trouvé avant %s.\n" +#, fuzzy +#~ msgid "Start Virtual Backup JobId %s, Job=%s\n" +#~ msgstr "Démarrage du backup JobId %s, Job=%s\n" -#: src/dird/ua_restore.c:1628 -msgid "No jobs found.\n" -msgstr "Pas de jobs trouvé.\n" +#, fuzzy +#~ msgid "No valid Jobs found from user selection.\n" +#~ msgstr "Pas de job trouvé pour : %s.\n" -#: src/dird/ua_restore.c:1763 -#, fuzzy, c-format -msgid "" -"\n" -"Warning Storage is overridden by \"%s\" on the command line.\n" -msgstr "" -"Attention, le storage par défaut est remplacé par \"%s\" en ligne de " -"commande.\n" +#, fuzzy +#~ msgid "Using user supplied JobIds=%s\n" +#~ msgstr "Migration utilisant JobId=%s Job=%s\n" -#: src/dird/ua_restore.c:1768 -#, c-format -msgid "" -"This may not work because of two different MediaTypes:\n" -" Storage MediaType=\"%s\"\n" -" Volume MediaType=\"%s\".\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "No previous Jobs found.\n" +#~ msgstr "Aucun Job trouvé pour la migration.\n" -#: src/dird/ua_restore.c:1787 -#, fuzzy, c-format -msgid "Using Storage \"%s\" from MediaType \"%s\".\n" -msgstr "" -"Le Storage \"%s\" est introuvable, utilisation du Storage \"%s\" du " -"MediaType \"%s\".\n" +#, fuzzy +#~ msgid "Error getting Job record for previous Job: ERR=%s" +#~ msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" -#: src/dird/ua_restore.c:1790 -#, c-format -msgid "Storage \"%s\" not found, using Storage \"%s\" from MediaType \"%s\".\n" -msgstr "" -"Le Storage \"%s\" est introuvable, utilisation du Storage \"%s\" du " -"MediaType \"%s\".\n" +#, fuzzy +#~ msgid "" +#~ "%s %s %s (%s):\n" +#~ " Build OS: %s %s %s\n" +#~ " JobId: %d\n" +#~ " Job: %s\n" +#~ " Backup Level: Virtual Full\n" +#~ " Client: \"%s\" %s\n" +#~ " FileSet: \"%s\" %s\n" +#~ " Pool: \"%s\" (From %s)\n" +#~ " Catalog: \"%s\" (From %s)\n" +#~ " Storage: \"%s\" (From %s)\n" +#~ " Scheduled time: %s\n" +#~ " Start time: %s\n" +#~ " End time: %s\n" +#~ " Elapsed time: %s\n" +#~ " Priority: %d\n" +#~ " SD Files Written: %s\n" +#~ " SD Bytes Written: %s (%sB)\n" +#~ " Rate: %.1f KB/s\n" +#~ " Volume name(s): %s\n" +#~ " Volume Session Id: %d\n" +#~ " Volume Session Time: %d\n" +#~ " Last Volume Bytes: %s (%sB)\n" +#~ " SD Errors: %d\n" +#~ " SD termination status: %s\n" +#~ " Termination: %s\n" +#~ "\n" +#~ msgstr "" +#~ "Bacula %s %s (%s): %s\n" +#~ " Build OS : %s %s %s\n" +#~ " JobId : %d\n" +#~ " Job : %s\n" +#~ " Niveau de backup : %s%s\n" +#~ " Client : \"%s\" %s\n" +#~ " FileSet : \"%s\" %s\n" +#~ " Pool : \"%s\" (Depuis %s)\n" +#~ " Storage : \"%s\" (Depuis %s)\n" +#~ " Date prévue : %s\n" +#~ " Date de début : %s\n" +#~ " Date de fin : %s\n" +#~ " Temps écoulé : %s\n" +#~ " Priorité : %d\n" +#~ " Fichiers écrits FD : %s\n" +#~ " Fichiers écrits SD : %s\n" +#~ " Octets écrits FD : %s (%so)\n" +#~ " Octets écrits SD : %s (%so)\n" +#~ " Débit : %.1f Ko/s\n" +#~ " Compression logicielle : %s\n" +#~ " Nom des Volumes : %s\n" +#~ " Volume Session Id : %d\n" +#~ " Volume Session date : %d\n" +#~ " Taille du volume : %s (%so)\n" +#~ " Erreurs FD non fatales : %d\n" +#~ " Erreurs du SD : %d\n" +#~ " Statut de fin du FD : %s\n" +#~ " Statut de fin du SD : %s\n" +#~ " Statut de fin : %s\n" -#: src/dird/ua_restore.c:1799 -#, c-format -msgid "" -"\n" -"Unable to find Storage resource for\n" -"MediaType \"%s\", needed by the Jobs you selected.\n" -msgstr "" +#~ msgid "" +#~ "Unable to find JobId of previous InitCatalog Job.\n" +#~ "Please run a Verify with Level=InitCatalog before\n" +#~ "running the current Job.\n" +#~ msgstr "" +#~ "Impossible de trouvé JobId d'un précédent Job \"InitCatalog.\n" +#~ "Il faut lancer un Job Verify avec l'option Level=InitCatalog avant\n" +#~ "de lancer le Job courant.\n" -#: src/dird/ua_run.c:165 -msgid "OK to run? (yes/mod/no): " -msgstr "OK pour le lancement ? (oui/mod/non) : " +#~ msgid "Unable to find JobId of previous Job for this client.\n" +#~ msgstr "Impossible de trouver JobId d'un précédent Job pour ce client.\n" -#: src/dird/ua_run.c:194 -#, fuzzy, c-format -msgid "" -"\n" -"Bad response: %s. You must answer yes, mod, or no.\n" -"\n" -msgstr "Réponse invalide. Vous devez répondre oui ou non.\n" +#~ msgid "Last Job %d did not terminate normally. JobStatus=%c\n" +#~ msgstr "Le dernier job %d ne s'est pas terminé correctement. JobStatus=%c\n" -#: src/dird/ua_run.c:198 -msgid "Job not run.\n" -msgstr "Job non lancé.\n" +#~ msgid "Verify OK" +#~ msgstr "Vérification OK" -#: src/dird/ua_run.c:237 -msgid "Job failed.\n" -msgstr "Job échoué.\n" +#~ msgid "*** Verify Error ***" +#~ msgstr "*** Erreur de Vérification ***" -#: src/dird/ua_run.c:240 -#, c-format -msgid "Job queued. JobId=%s\n" -msgstr "Job mis en queue. JobId=%s\n" +#~ msgid "Verify Canceled" +#~ msgstr "Vérification annulée" -#: src/dird/ua_run.c:258 -#, c-format -msgid "Job \"%s\" not found\n" -msgstr "Le job \"%s\" est introuvable\n" +#, fuzzy +#~ msgid "" +#~ "%s %s %s (%s):\n" +#~ " Build OS: %s %s %s\n" +#~ " JobId: %d\n" +#~ " Job: %s\n" +#~ " FileSet: %s\n" +#~ " Verify Level: %s\n" +#~ " Client: %s\n" +#~ " Verify JobId: %d\n" +#~ " Verify Job: %s\n" +#~ " Start time: %s\n" +#~ " End time: %s\n" +#~ " Files Expected: %s\n" +#~ " Files Examined: %s\n" +#~ " Non-fatal FD errors: %d\n" +#~ " FD termination status: %s\n" +#~ " SD termination status: %s\n" +#~ " Termination: %s\n" +#~ "\n" +#~ msgstr "" +#~ "%s %s %s (%s): %s\n" +#~ " Build OS: %s %s %s\n" +#~ " JobId : %d\n" +#~ " Job : %s\n" +#~ " FileSet: %s\n" +#~ " Client : %s\n" +#~ " Début : %s\n" +#~ " Fin : %s\n" +#~ " Fichiers attendus : %s\n" +#~ " Fichiers restaurés : %s\n" +#~ " Octets restaurés : %s\n" +#~ " Débit : %.1f Ko/s\n" +#~ " Erreurs du FD : %d\n" +#~ " Statut de fin du FD : %s\n" +#~ " Statut de fin du SD : %s\n" +#~ " Etat : %s\n" -#: src/dird/ua_run.c:265 -msgid "A job name must be specified.\n" -msgstr "Un nom de Job doit être spécifié.\n" +#, fuzzy +#~ msgid "" +#~ "%s %s %s (%s):\n" +#~ " Build: %s %s %s\n" +#~ " JobId: %d\n" +#~ " Job: %s\n" +#~ " FileSet: %s\n" +#~ " Verify Level: %s\n" +#~ " Client: %s\n" +#~ " Verify JobId: %d\n" +#~ " Verify Job: %s\n" +#~ " Start time: %s\n" +#~ " End time: %s\n" +#~ " Files Examined: %s\n" +#~ " Non-fatal FD errors: %d\n" +#~ " FD termination status: %s\n" +#~ " Termination: %s\n" +#~ "\n" +#~ msgstr "" +#~ "%s %s (%s) : %s\n" +#~ " Build: %s %s %s\\n\"\n" +#~ " JobId : %d\n" +#~ " Job : %s\n" +#~ " FileSet : %s\n" +#~ " Client : %s\n" +#~ " Début : %s\n" +#~ " Fin : %s\n" +#~ " Fichiers attendus : %s\n" +#~ " Fichiers restaurés : %s\n" +#~ " Octets restaurés : %s\n" +#~ " Débit : %.1f Ko/s\n" +#~ " Erreurs du FD : %d\n" +#~ " Statut de fin du FD : %s\n" +#~ " Statut de fin du SD : %s\n" +#~ " Etat : %s\n" + +#~ msgid "New file: %s\n" +#~ msgstr "Nouveau Fichier : %s\n" -#: src/dird/ua_run.c:271 -#, c-format -msgid "No authorization. Job \"%s\".\n" -msgstr "" +#~ msgid "File not in catalog: %s\n" +#~ msgstr "Fichier absent du catalogue : %s\n" -#: src/dird/ua_run.c:289 -#, c-format -msgid "Pool \"%s\" not found.\n" -msgstr "Le pool \"%s\" est introuvable.\n" +#, fuzzy +#~ msgid "The following files are in the Catalog but not on %s:\n" +#~ msgstr "" +#~ "Les fichiers suivants sont dans le catalogue mais absents du disque :\n" -#: src/dird/ua_run.c:299 -#, c-format -msgid "No authorization. Pool \"%s\".\n" -msgstr "" +#~ msgid "File: %s\n" +#~ msgstr "Fichier : %s\n" -#: src/dird/ua_run.c:313 -#, fuzzy, c-format -msgid "NextPool \"%s\" not found.\n" -msgstr "Le pool \"%s\" est introuvable.\n" +#, fuzzy +#~ msgid "Cannot verify checksum for %s\n" +#~ msgstr "Impossible de trouver la ressource Schedule \"%s\"\n" -#: src/dird/ua_run.c:322 -#, fuzzy, c-format -msgid "No authorization. NextPool \"%s\".\n" -msgstr "Pas d'enregistrement trouvé en base pour : %s\n" +#, fuzzy +#~ msgid "2991 Bad accurate command\n" +#~ msgstr "2991 Erreur dans la commande setdebug : %s\n" -#: src/dird/ua_run.c:353 src/dird/ua_run.c:373 -#, c-format -msgid "No authorization. Client \"%s\".\n" -msgstr "" +#, fuzzy +#~ msgid "aclx_get error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:363 -#, fuzzy, c-format -msgid "Restore Client \"%s\" not found.\n" -msgstr "le client \"%s\" est introuvable.\n" +#, fuzzy +#~ msgid "Unknown acl type encountered on file \"%s\": %ld\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/dird/ua_run.c:392 -#, c-format -msgid "FileSet \"%s\" not found.\n" -msgstr "Le FileSet \"%s\" est introuvable.\n" +#, fuzzy +#~ msgid "Failed to convert acl into text on file \"%s\"\n" +#~ msgstr "Impossible de lire le certificat à partir du fichier" -#: src/dird/ua_run.c:401 -#, c-format -msgid "No authorization. FileSet \"%s\".\n" -msgstr "" +#, fuzzy +#~ msgid "aclx_scanStr error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:420 -#, c-format -msgid "Storage \"%s\" not found.\n" -msgstr "Le Storage \"%s\" est introuvable.\n" +#, fuzzy +#~ msgid "aclx_put error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:423 src/dird/ua_run.c:1054 -msgid "user selection" -msgstr "" +#, fuzzy +#~ msgid "acl_to_text error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:432 -#, c-format -msgid "No authorization. Storage \"%s\".\n" -msgstr "" +#, fuzzy +#~ msgid "acl_get_file error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:456 #, fuzzy -msgid "No JobId specified.\n" -msgstr "Pas de job sélectionné.\n" +#~ msgid "" +#~ "acl_delete_def_file error on file \"%s\": filesystem doesn't support " +#~ "ACLs\n" +#~ msgstr "" +#~ "Impossible de récupérer les informations du Media pour le Volume %s : ERR=" +#~ "%s\n" -#: src/dird/ua_run.c:470 #, fuzzy -msgid "Invalid or no Job name specified.\n" -msgstr "Le job est déjà spécifié.\n" +#~ msgid "acl_delete_def_file error on file \"%s\": ERR=%s\n" +#~ msgstr "" +#~ "Impossible de récupérer les informations du Media pour le Volume %s : ERR=" +#~ "%s\n" -#: src/dird/ua_run.c:485 #, fuzzy -msgid "Enter the JobId list to select: " -msgstr "Entrez le JobId à sélectionner : " +#~ msgid "acl_from_text error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:501 -#, c-format -msgid "JobId=%d entered is not in the list.\n" -msgstr "" +#, fuzzy +#~ msgid "acl_valid error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:525 -#, fuzzy, c-format -msgid "Could not get job record for selected JobId=%d. ERR=%s" -msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" +#, fuzzy +#~ msgid "acl_set_file error on file \"%s\": filesystem doesn't support ACLs\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:593 src/dird/ua_run.c:846 src/dird/ua_select.c:154 -msgid "You have the following choices:\n" -msgstr "Vous avez les choix suivants :\n" +#, fuzzy +#~ msgid "acl_set_file error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:597 #, fuzzy -msgid "Select termination code: " -msgstr "Sélection terminée.\n" +#~ msgid "pathconf error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:781 #, fuzzy -msgid "Unable to use current plugin configuration, discarding it." -msgstr "Impossible de lire le certificat à partir du fichier" +#~ msgid "getacl error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:796 #, fuzzy -msgid "Plugin Restore Options\n" -msgstr "Sélectionnez le Job de restauration" +#~ msgid "acltostr error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:807 -msgid "*None, but required*" -msgstr "" +#, fuzzy +#~ msgid "strtoacl error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:827 #, fuzzy -msgid "Use above plugin configuration? (yes/mod/no): " -msgstr "Continuer ? (oui/mod/non) : " +#~ msgid "setacl error on file \"%s\": filesystem doesn't support ACLs\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:845 src/dird/ua_run.c:1007 src/dird/ua_select.c:73 -msgid "mod" -msgstr "mod" +#, fuzzy +#~ msgid "setacl error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:869 -#, fuzzy, c-format -msgid "Please enter a value for %s: " -msgstr "Saisissez le JobId pour la restauration : " +#, fuzzy +#~ msgid "acl_get error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:943 -msgid "No plugin to configure\n" -msgstr "" +#, fuzzy +#~ msgid "acl_fromtext error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:951 #, fuzzy -msgid "Plugins to configure:\n" -msgstr "Plugin=%s non trouvé.\n" +#~ msgid "acl_set error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:960 #, fuzzy -msgid "Select plugin to configure" -msgstr "TLS actif mais non configuré.\n" +#~ msgid "acltotext error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:976 -#, fuzzy, c-format -msgid "Can't configure %32s\n" -msgstr "Impossible d'ouvrir le fichier de configuration \"%s\" : %s\n" +#, fuzzy +#~ msgid "aclfromtext error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:1011 -msgid "Level" -msgstr "Type" +#, fuzzy +#~ msgid "acl(SETACL) error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:1016 #, fuzzy -msgid "Restore Client" -msgstr "Restauration annulée" +#~ msgid "pioctl VIOCGETAL error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:1020 -msgid "When" -msgstr "Quand" +#, fuzzy +#~ msgid "pioctl VIOCSETAL error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:1021 -msgid "Priority" -msgstr "Priorité" +#, fuzzy +#~ msgid "Unable to stat file \"%s\": ERR=%s\n" +#~ msgstr "3910 Impossible d'ouvrir le device %s : ERR=%s\n" -#: src/dird/ua_run.c:1026 src/dird/ua_select.c:633 src/dird/ua_select.c:746 -#: src/dird/ua_update.c:615 -msgid "Pool" -msgstr "Pool" +#~ msgid "Incorrect password given by Director at %s.\n" +#~ msgstr "Password incorrect donné par le Director à %s.\n" -#: src/dird/ua_run.c:1031 #, fuzzy -msgid "NextPool" -msgstr "Pool" +#~ msgid "Had %ld acl errors while doing backup\n" +#~ msgstr "Saisir la liste des fichiers à restaurer" -#: src/dird/ua_run.c:1033 -msgid "Verify Job" -msgstr "Job de vérification" +#, fuzzy +#~ msgid "Had %ld xattr errors while doing backup\n" +#~ msgstr "Saisir la liste des fichiers à restaurer" -#: src/dird/ua_run.c:1036 -msgid "Bootstrap" -msgstr "Bootstrap" +#~ msgid " Could not access \"%s\": ERR=%s\n" +#~ msgstr " Impossible d'acceder à \"%s\" : ERR=%s\n" -#: src/dird/ua_run.c:1037 -msgid "Where" -msgstr "Destination" +#~ msgid " Could not follow link \"%s\": ERR=%s\n" +#~ msgstr " Impossible de suivre le lien \"%s\" : ERR=%s\n" -#: src/dird/ua_run.c:1038 -msgid "File Relocation" -msgstr "" +#~ msgid " Could not stat \"%s\": ERR=%s\n" +#~ msgstr " Impossible d'acceder à \"%s\" : ERR=%s\\n\n" -#: src/dird/ua_run.c:1039 -msgid "Replace" -msgstr "Ecrasement" +#~ msgid " Could not open directory \"%s\": ERR=%s\n" +#~ msgstr " Impossible d'ouvrir le répertoire \"%s\" : ERR=%s\n" -#: src/dird/ua_run.c:1040 -msgid "JobId" -msgstr "JobId" +#~ msgid " Unknown file type %d; not saved: %s\n" +#~ msgstr " Type de fichier inconnu %d ; non sauvé : %s\n" -#: src/dird/ua_run.c:1043 -msgid "Plugin Options" -msgstr "" +#~ msgid " Cannot open \"%s\": ERR=%s.\n" +#~ msgstr " Impossible d'ouvrir \"%s\" : ERR=%s.\n" -#: src/dird/ua_run.c:1086 -msgid "" -"Please enter desired start time as YYYY-MM-DD HH:MM:SS (return for now): " -msgstr "" -"Saisissez la date de lancement (YYYY-MM-DD HH:MM:SS) (ou maintenant) : " +#, fuzzy +#~ msgid "Network send error to SD. Data=%s ERR=%s\n" +#~ msgstr "Erreur dans l'exécution de la commande : %s. ERR=%s\n" -#: src/dird/ua_run.c:1094 src/dird/ua_run.c:1311 -msgid "Invalid time, using current time.\n" -msgstr "" +#, fuzzy +#~ msgid " Cannot open resource fork for \"%s\": ERR=%s.\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:1101 -msgid "Enter new Priority: " -msgstr "Saisissez la nouvelle priorité : " +#, fuzzy +#~ msgid "Compression LZO error: %d\n" +#~ msgstr "Erreur de décompression. ERR=%d\n" -#: src/dird/ua_run.c:1105 -msgid "Priority must be a positive integer.\n" -msgstr "La priorité doit être un entier positif.\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bfdjson [-c config_file] [-d debug_level]\n" +#~ " -r get resource type \n" +#~ " -n get resource \n" +#~ " -l get only directives matching dirs (use with -r)\n" +#~ " -D get only data\n" +#~ " -c use as configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print a timestamp in debug output\n" +#~ " -t test configuration file and exit\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Version : %s (%s)\n" +#~ "\n" +#~ "Usage : bacula-fd [-f -s] [-c config_file] [-d debug_level]\n" +#~ " -c utilise fich comme fichier de configuration\n" +#~ " -d positionne le niveau de debug à nn\n" +#~ " -dt affiche un timestamp sur chaque ligne de debug\n" +#~ " -f reste en avant-plan (pour debugger)\n" +#~ " -g groupid\n" +#~ " -s pas de signaux\n" +#~ " -t test - lit seulement le fichier de configuration\n" +#~ " -u userid\n" +#~ " -v affiche les messages utilisateurs\n" +#~ " -? affiche ce message.\n" +#~ "\n" -#: src/dird/ua_run.c:1126 -msgid "Please enter the Bootstrap file name: " -msgstr "Saisissez le nom du fichier Bootstrap : " +#, fuzzy +#~ msgid "Failed to initialize encryption context.\n" +#~ msgstr "Impossible d'initialiser le contexte TLS pour la Console \"%s\".\n" -# Impossible d'ouvrir %s : ERR=%s -#: src/dird/ua_run.c:1138 -#, c-format -msgid "Warning cannot open %s: ERR=%s\n" -msgstr "Impossible d'ouvrir %s : ERR=%s\n" +#, fuzzy +#~ msgid "Unsupported cipher on this system.\n" +#~ msgstr "Le cipher spécifié est non supporté\n" -#: src/dird/ua_run.c:1168 #, fuzzy -msgid "Please enter the full path prefix for restore (/ for none): " -msgstr "Saisissez le chemin (prefix) pour la restauration (/ pour aucun) : " +#~ msgid "Failed to allocate memory for crypto signature.\n" +#~ msgstr "Impossible de se connecter au Director\n" -#: src/dird/ua_run.c:1190 -msgid "Replace:\n" -msgstr "Ecrasement :\n" +#, fuzzy +#~ msgid "An error occurred while adding signer the stream.\n" +#~ msgstr "Impossible d'ouvrir le fichier de données %s.\n" -#: src/dird/ua_run.c:1194 -msgid "Select replace option" -msgstr "Saisissez l'option d'écrasement" +#, fuzzy +#~ msgid "Plugin save packet not found.\n" +#~ msgstr "le client \"%s\" est introuvable.\n" -#: src/dird/ua_run.c:1205 -msgid "" -"You must set the bootstrap file to NULL to be able to specify a JobId.\n" -msgstr "" -"Vous ne devez pas spécifié de fichier bootstrap pour pouvoir utiliser un " -"JobId.\n" +#~ msgid "Plugin=%s not found.\n" +#~ msgstr "Plugin=%s non trouvé.\n" -#: src/dird/ua_run.c:1217 #, fuzzy -msgid "Please Plugin Options string: " -msgstr "Saisissez le début du chemin (prefix) à enlever : " +#~ msgid "Error while creating command string %s.\n" +#~ msgstr "Erreur pendant l'initialisation du contexte SSL" -#: src/dird/ua_run.c:1260 src/dird/ua_run.c:1265 #, fuzzy -msgid "Command input" -msgstr "Erreur sur la commande : %s\n" +#~ msgid "Error while executing \"%s\" %s. %s %s\n" +#~ msgstr "Entrez le nombre de départ : " -#: src/dird/ua_run.c:1262 src/dird/ua_run.c:1267 src/dird/ua_run.c:1287 -msgid "User input" -msgstr "" +#, fuzzy +#~ msgid "Unable to create snapshot record. ERR=%s\n" +#~ msgstr "Impossible de récupérer le Pool depuis le catalogue : ERR=%s" -#: src/dird/ua_run.c:1350 -#, c-format -msgid "Invalid replace option: %s\n" -msgstr "Option d'écrasement (Replace) invalide : %s\n" +#, fuzzy +#~ msgid "Unable to create snapshot record, got %s\n" +#~ msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" -#: src/dird/ua_run.c:1449 -#, c-format -msgid "strip_prefix=%s add_prefix=%s add_suffix=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to delete snapshot record. ERR=%s\n" +#~ msgstr "Impossible de récupérer le Pool depuis le catalogue : ERR=%s" -#: src/dird/ua_run.c:1452 -msgid "This will replace your current Where value\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to delete snapshot record, got %s\n" +#~ msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" -#: src/dird/ua_run.c:1453 -msgid "Strip prefix" -msgstr "" +#, fuzzy +#~ msgid "Unable to get snapshot record. ERR=%s\n" +#~ msgstr "Impossible de récupérer le Pool depuis le catalogue : ERR=%s" -#: src/dird/ua_run.c:1454 -msgid "Add prefix" -msgstr "" +#, fuzzy +#~ msgid "Unable to get snapshot record, got %s\n" +#~ msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" -#: src/dird/ua_run.c:1455 -msgid "Add file suffix" -msgstr "" +#, fuzzy +#~ msgid "Unable to parse command output\n" +#~ msgstr "Impossible de se connecter au Client.\n" -#: src/dird/ua_run.c:1456 -msgid "Enter a regexp" -msgstr "" +#, fuzzy +#~ msgid " Unable to delete snapshot of %s ERR=%s\n" +#~ msgstr "Impossible de se connecter à %s sur %s:%d. ERR=%s\n" -#: src/dird/ua_run.c:1457 -msgid "Test filename manipulation" -msgstr "" +#, fuzzy +#~ msgid " Create Snapshot for %s\n" +#~ msgstr "Erreur durant la création des snapshots VSS.\n" -#: src/dird/ua_run.c:1458 -msgid "Use this ?" -msgstr "" +#, fuzzy +#~ msgid " Unable to create snapshot of %s ERR=%s\n" +#~ msgstr "Impossible de se connecter à %s sur %s:%d. ERR=%s\n" -#: src/dird/ua_run.c:1463 #, fuzzy -msgid "Please enter the path prefix to strip: " -msgstr "Saisissez le début du chemin (prefix) à enlever : " +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bacula-fd [-f -s] [-c config_file] [-d debug_level]\n" +#~ " -c use as configuration file\n" +#~ " -d [,] set debug level to , debug tags to \n" +#~ " -dt print a timestamp in debug output\n" +#~ " -f run in foreground (for debugging)\n" +#~ " -g groupid\n" +#~ " -k keep readall capabilities\n" +#~ " -m print kaboom output (for debugging)\n" +#~ " -s no signals (for debugging)\n" +#~ " -t test configuration file and exit\n" +#~ " -T set trace on\n" +#~ " -u userid\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Version : %s (%s)\n" +#~ "\n" +#~ "Usage : bacula-fd [-f -s] [-c config_file] [-d debug_level]\n" +#~ " -c utilise fich comme fichier de configuration\n" +#~ " -d positionne le niveau de debug à nn\n" +#~ " -dt affiche un timestamp sur chaque ligne de debug\n" +#~ " -f reste en avant-plan (pour debugger)\n" +#~ " -g groupid\n" +#~ " -s pas de signaux\n" +#~ " -t test - lit seulement le fichier de configuration\n" +#~ " -u userid\n" +#~ " -v affiche les messages utilisateurs\n" +#~ " -? affiche ce message.\n" +#~ "\n" -#: src/dird/ua_run.c:1471 #, fuzzy -msgid "Please enter the path prefix to add (/ for none): " -msgstr "Saisissez le chemin (prefix) à ajouter (/ pour aucun) : " +#~ msgid "Disable Command \"%s\" not found.\n" +#~ msgstr "le client \"%s\" est introuvable.\n" -#: src/dird/ua_run.c:1482 #, fuzzy -msgid "Please enter the file suffix to add: " -msgstr "Saisissez une extention à ajouter aux fichiers : " +#~ msgid "Failed to allocate a new keypair object.\n" +#~ msgstr "Impossible de se connecter au Director\n" -#: src/dird/ua_run.c:1489 -msgid "Please enter a valid regexp (!from!to!): " -msgstr "Saisissez une regexp valide (!rechercher!remplacer!) : " +#, fuzzy +#~ msgid "Expected a Cipher Type keyword, got: %s" +#~ msgstr "Attendait le mot clef FileSet, eu : %s" -#: src/dird/ua_run.c:1502 -#, c-format -msgid "regexwhere=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Bad Hello command from Director at %s. Len=%d.\n" +#~ msgstr "Connexion invalide. Len=%d\n" -#: src/dird/ua_run.c:1508 -#, c-format -msgid "strip_prefix=%s add_prefix=%s add_suffix=%s result=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Bad Hello command from Director at %s: %s\n" +#~ msgstr "Début de purge des jobs du client \"%s\"\n" -#: src/dird/ua_run.c:1515 -msgid "Cannot use your regexp\n" -msgstr "Impossible d'utiliser votre regexp\n" +#~ msgid "Connection from unknown Director %s at %s rejected.\n" +#~ msgstr "" +#~ "Connexion d'un Director inconnu %s à %s rejeté.\n" +#~ "\n" -#: src/dird/ua_run.c:1518 -msgid "Enter a period (.) to stop this test\n" -msgstr "" +#, fuzzy +#~ msgid "SD connect failed: Bad Hello command\n" +#~ msgstr "Le director a rejeté la commande Hello\n" -#: src/dird/ua_run.c:1519 -msgid "Please enter filename to test: " -msgstr "Saisissez un nom de fichier à tester : " +#, fuzzy +#~ msgid "SD connect failed: Job name not found: %s\n" +#~ msgstr "Job non trouvé : %s\n" -#: src/dird/ua_run.c:1521 -#, c-format -msgid "%s -> %s\n" -msgstr "%s -> %s\n" +#, fuzzy +#~ msgid "SD \"%s\" tried to connect two times.\n" +#~ msgstr "Impossible de se connecter au Client.\n" -#: src/dird/ua_run.c:1565 -msgid "Cannot use your regexp.\n" -msgstr "Impossible d'utiliser votre regexp.\n" +#, fuzzy +#~ msgid "Recv caps from SD failed. ERR=%s\n" +#~ msgstr "fopen %s en erreur : ERR=%s\n" -#: src/dird/ua_run.c:1578 src/dird/ua_run.c:1608 -msgid "Levels:\n" -msgstr "Types :\n" +#, fuzzy +#~ msgid "Bad caps from SD: %s.\n" +#~ msgstr "Début de purge des jobs du client \"%s\"\n" -#: src/dird/ua_run.c:1580 src/lib/util.c:505 src/lib/util.c:551 -msgid "Full" -msgstr "Full" +#, fuzzy +#~ msgid "Bad caps from SD: %s\n" +#~ msgstr "Début de purge des jobs du client \"%s\"\n" -#: src/dird/ua_run.c:1581 src/lib/util.c:508 -msgid "Incremental" -msgstr "Incrémental" +#, fuzzy +#~ msgid "Command: \"%s\" is disabled.\n" +#~ msgstr "Commande annulée.\n" -#: src/dird/ua_run.c:1582 src/lib/util.c:511 -msgid "Differential" -msgstr "Différentiel" +#, fuzzy +#~ msgid "Bad command from %s. Len=%d.\n" +#~ msgstr "Connexion invalide. Len=%d\n" -#: src/dird/ua_run.c:1583 src/lib/util.c:514 -msgid "Since" -msgstr "Depuis" +#~ msgid "2902 Error scanning cancel command.\n" +#~ msgstr "2902 Erreur dans le décodage de la commande d'annulation.\n" -#: src/dird/ua_run.c:1584 -msgid "VirtualFull" -msgstr "" +#~ msgid "2901 Job %s not found.\n" +#~ msgstr "2901 Le job %s est introuvable.\n" -#: src/dird/ua_run.c:1585 src/dird/ua_run.c:1614 -msgid "Select level" -msgstr "Saisissez le type" +#, fuzzy +#~ msgid "2001 Job \"%s\" marked to be %s.\n" +#~ msgstr "2001 Le job %s va être annulé.\n" -#: src/dird/ua_run.c:1609 -msgid "Initialize Catalog" -msgstr "Initialisez le catalogue" +#, fuzzy +#~ msgid "2991 Bad setbandwidth command: %s\n" +#~ msgstr "2991 Erreur dans la commande setdebug : %s\n" -#: src/dird/ua_run.c:1610 src/lib/util.c:517 -msgid "Verify Catalog" -msgstr "" +#~ msgid "2991 Bad setdebug command: %s\n" +#~ msgstr "2991 Erreur dans la commande setdebug : %s\n" -#: src/dird/ua_run.c:1611 src/lib/util.c:523 -msgid "Verify Volume to Catalog" -msgstr "" +#~ msgid "Bad RunScript command: %s\n" +#~ msgstr "Erreur dans la commande RunScript : %s\n" -#: src/dird/ua_run.c:1612 src/lib/util.c:526 -msgid "Verify Disk to Catalog" -msgstr "" +#~ msgid "2905 Bad RunScript command.\n" +#~ msgstr "2905 Erreur sur la commande RunScript.\n" -#: src/dird/ua_run.c:1613 -msgid "Verify Volume Data (not yet implemented)" -msgstr "Vérification des données sur le volume (pas encore implémenté)" +#, fuzzy +#~ msgid "Bad RestoreObject command: %s\n" +#~ msgstr "Erreur dans la commande RunScript : %s\n" -#: src/dird/ua_run.c:1634 -msgid "Level not appropriate for this Job. Cannot be changed.\n" -msgstr "" +#, fuzzy +#~ msgid "2909 Bad RestoreObject command.\n" +#~ msgstr "2905 Erreur sur la commande RunScript.\n" -#: src/dird/ua_run.c:1665 -#, fuzzy, c-format -msgid "" -"Run Admin Job\n" -"JobName: %s\n" -"FileSet: %s\n" -"Client: %s\n" -"Storage: %s\n" -"When: %s\n" -"Priority: %d\n" -msgstr "" -"Lancement du job %s\n" -"JobName : %s\n" -"FileSet : %s\n" -"Client : %s\n" -"Storage : %s\n" -"Quand : %s\n" -"Priorité : %d\n" - -#: src/dird/ua_run.c:1723 -#, fuzzy, c-format -msgid "" -"Run Backup job\n" -"JobName: %s\n" -"Level: %s\n" -"Client: %s\n" -"FileSet: %s\n" -"Pool: %s (From %s)\n" -"%sStorage: %s (From %s)\n" -"When: %s\n" -"Priority: %d\n" -"%s%s%s" -msgstr "" -"Lancement du job %s\n" -"JobName : %s\n" -"Niveau : %s\n" -"Client : %s\n" -"FileSet : %s\n" -"Pool : %s (Depuis %s)\n" -"Storage : %s (Depuis %s)\n" -"Quand : %s\n" -"Priorité : %d\n" - -#: src/dird/ua_run.c:1756 -#, fuzzy, c-format -msgid "Could not get job record for selected JobId. ERR=%s" -msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" +#~ msgid "Error running program: %s. stat=%d: ERR=%s\n" +#~ msgstr "Erreur dans l'exécution de la commande : %s. stat=%d: ERR=%s\n" -#: src/dird/ua_run.c:1795 -#, fuzzy, c-format -msgid "" -"Run Verify Job\n" -"JobName: %s\n" -"Level: %s\n" -"Client: %s\n" -"FileSet: %s\n" -"Pool: %s (From %s)\n" -"Storage: %s (From %s)\n" -"Verify Job: %s\n" -"Verify List: %s\n" -"When: %s\n" -"Priority: %d\n" -msgstr "" -"Lancement du job %s\n" -"JobName : %s\n" -"Niveau : %s\n" -"Client : %s\n" -"FileSet : %s\n" -"Pool : %s (Depuis %s)\n" -"Storage : %s (Depuis %s)\n" -"Verify Job : %s\n" -"Verify List: %s\n" -"Quand : %s\n" -"Priorité : %d\n" - -#: src/dird/ua_run.c:1824 -msgid "Please enter a JobId for restore: " -msgstr "Saisissez le JobId pour la restauration : " - -#: src/dird/ua_run.c:1863 src/dird/ua_run.c:1890 src/dird/ua_run.c:1921 -#: src/dird/ua_run.c:1948 src/dird/ua_run.c:1986 -#, fuzzy -msgid "User specified" -msgstr "Pas de storage sélectionné.\n" - -#: src/dird/ua_run.c:1865 -#, fuzzy, c-format -msgid "" -"Run Restore job\n" -"JobName: %s\n" -"Bootstrap: %s\n" -"RegexWhere: %s\n" -"Replace: %s\n" -"FileSet: %s\n" -"Backup Client: %s\n" -"Restore Client: %s\n" -"Storage: %s\n" -"When: %s\n" -"Catalog: %s\n" -"Priority: %d\n" -"Plugin Options: %s\n" -msgstr "" -"Lancement de la restauration\n" -"JobName : %s\n" -"Bootstrap : %s\n" -"RegexWhere : %s\n" -"Ecrasement : %s\n" -"FileSet : %s\n" -"Backup Client : %s\n" -"Restore Client : %s\n" -"Storage : %s\n" -"Quand : %s\n" -"Catalogue : %s\n" -"Priorité : %d\n" - -#: src/dird/ua_run.c:1923 -#, c-format -msgid "" -"Run Restore job\n" -"JobName: %s\n" -"Bootstrap: %s\n" -"Where: %s\n" -"Replace: %s\n" -"FileSet: %s\n" -"Backup Client: %s\n" -"Restore Client: %s\n" -"Storage: %s\n" -"When: %s\n" -"Catalog: %s\n" -"Priority: %d\n" -"Plugin Options: %s\n" -msgstr "" -"Lancement de la restauration\n" -"JobName : %s\n" -"Bootstrap : %s\n" -"Déplacement : %s\n" -"Ecrasement : %s\n" -"FileSet : %s\n" -"Backup Client : %s\n" -"Restore Client : %s\n" -"Storage : %s\n" -"Quand : %s\n" -"Catalogue : %s\n" -"Priorité : %d\n" -"Options Plugins: %s\n" - -#: src/dird/ua_run.c:1955 -#, c-format -msgid "" -"Run Restore job\n" -"JobName: %s\n" -"Bootstrap: %s\n" -msgstr "" -"Lancement de la restauration\n" -"JobName : %s\n" -"Bootstrap : %s\n" +#, fuzzy +#~ msgid "" +#~ "DIR and FD clocks differ by %lld seconds, FD automatically compensating.\n" +#~ msgstr "" +#~ "L'horloge du client et du director ont %d secondes d'écart, le client " +#~ "s'est ajusté automatiquement.\n" -#: src/dird/ua_run.c:1963 -#, c-format -msgid "RegexWhere: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Failed connect from Storage daemon. SD bsock=NULL.\n" +#~ msgstr "Impossible de se connecter au Storage daemon.\n" -#: src/dird/ua_run.c:1966 -#, c-format -msgid "Where: %s\n" -msgstr "Where : %s\n" +#~ msgid "Cannot contact Storage daemon\n" +#~ msgstr "Impossible de se connecter au démon Storage\n" -#: src/dird/ua_run.c:1970 -#, c-format -msgid "" -"Replace: %s\n" -"Client: %s\n" -"Storage: %s\n" -"JobId: %s\n" -"When: %s\n" -"Catalog: %s\n" -"Priority: %d\n" -"Plugin Options: %s\n" -msgstr "" -"Ecrasement : %s\n" -"Client : %s\n" -"Storage : %s\n" -"JobId : %s\n" -"Quand : %s\n" -"Catalogue : %s\n" -"Priorité : %d\n" -"Options Plugins : %s\n" +#, fuzzy +#~ msgid "Generate VSS snapshots. Driver=\"%s\"\n" +#~ msgstr "Création des snapshot VSS. Driver=\"%s\", Lecteur(s)=\"%s\"\n" -#: src/dird/ua_run.c:2028 #, fuzzy -msgid "Run Copy job\n" -msgstr "Sélectionnez le Job de restauration" +#~ msgid "VSS CreateSnapshots failed. ERR=%s\n" +#~ msgstr "Erreur durant la création des snapshots VSS.\n" -#: src/dird/ua_run.c:2030 #, fuzzy -msgid "Run Migration job\n" -msgstr "Sélectionnez le Job de restauration" +#~ msgid "VSS was not initialized properly. ERR=%s\n" +#~ msgstr "Impossible d'initialiser le verrou sur la base. ERR=%s\n" -#: src/dird/ua_run.c:2062 -#, c-format -msgid "Unknown Job Type=%d\n" -msgstr "Job du Type=%d inconnu\n" +#, fuzzy +#~ msgid "Bad status %d %c returned from Storage Daemon.\n" +#~ msgstr "Impossible de récupérer le statut du Job depuis le FD.\n" -#: src/dird/ua_run.c:2136 -#, c-format -msgid "Value missing for keyword %s\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Bad response from SD to %s command. Wanted %s, got len=%ld msg=\"%s\"\n" +#~ msgstr "Mauvaise réponse à la commande %s : voulait %s, pas %s\n" -#: src/dird/ua_run.c:2146 -msgid "JobId specified twice.\n" -msgstr "Le JobId est déjà spécifié.\n" +#, fuzzy +#~ msgid "Could not set Finder Info on %s\n" +#~ msgstr "Impossible d'ouvrir le device %s\n" -#: src/dird/ua_run.c:2155 src/dird/ua_run.c:2295 -msgid "Client specified twice.\n" -msgstr "Le client est déjà spécifié.\n" +#, fuzzy +#~ msgid "LZO init failed\n" +#~ msgstr "Impossible de Rembobiner.\n" -#: src/dird/ua_run.c:2163 -msgid "FileSet specified twice.\n" -msgstr "Le FileSet est déjà spécifié.\n" +#, fuzzy +#~ msgid "Could not create digest.\n" +#~ msgstr "Impossible de créer la structure BSOCK cliente.\n" -#: src/dird/ua_run.c:2171 -msgid "Level specified twice.\n" -msgstr "Le type (Level) est déjà spécifié.\n" +#~ msgid "Decrypt of the session key failed.\n" +#~ msgstr "Impossible de décrypter la clef de session.\n" -#: src/dird/ua_run.c:2180 -msgid "Storage specified twice.\n" -msgstr "Le Storage est déjà spécifié.\n" +#, fuzzy +#~ msgid "Signer not found. Decryption failed.\n" +#~ msgstr "La création de la signature a échouée" -#: src/dird/ua_run.c:2188 -msgid "RegexWhere or Where specified twice.\n" -msgstr "RegexWhere ou Where est déjà spécifiée.\n" +#, fuzzy +#~ msgid "Unsupported digest algorithm. Decrypt failed.\n" +#~ msgstr "Le digest spécifié n'est pas supporté : %d\n" -#: src/dird/ua_run.c:2193 #, fuzzy -msgid "No authorization for \"regexwhere\" specification.\n" -msgstr "La destination (Where) est déjà spécifiée.\n" +#~ msgid "Unsupported encryption algorithm. Decrypt failed.\n" +#~ msgstr "contentEncryptionAlgorithm non supporté : %d\n" -#: src/dird/ua_run.c:2200 -msgid "Where or RegexWhere specified twice.\n" -msgstr "RegexWhere ou Where est déjà spécifiée.\n" +#, fuzzy +#~ msgid "" +#~ "An error=%d occurred while decoding encrypted session data stream: ERR=" +#~ "%s\n" +#~ msgstr "Impossible d'ouvrir le fichier de données %s.\n" -#: src/dird/ua_run.c:2205 #, fuzzy -msgid "No authoriztion for \"where\" specification.\n" -msgstr "Pas d'enregistrement trouvé en base pour : %s\n" +#~ msgid "Cannot open resource fork for %s.\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:2212 -msgid "Bootstrap specified twice.\n" -msgstr "Le bootstrap est déjà spécifié.\n" +#, fuzzy +#~ msgid "Encountered %ld acl errors while doing restore\n" +#~ msgstr "Saisir la liste des fichiers à restaurer" -#: src/dird/ua_run.c:2220 -msgid "Replace specified twice.\n" -msgstr "L'option d'écrasement (Replace) est déjà spécifié.\n" +#, fuzzy +#~ msgid "%d non-supported crypto streams ignored.\n" +#~ msgstr "contentEncryptionAlgorithm non supporté : %d\n" -#: src/dird/ua_run.c:2228 -msgid "When specified twice.\n" -msgstr "La planification (When) est déjà spécifiée.\n" +#, fuzzy +#~ msgid "%d non-supported xattr streams ignored.\n" +#~ msgstr "contentEncryptionAlgorithm non supporté : %d\n" -#: src/dird/ua_run.c:2236 -msgid "Priority specified twice.\n" -msgstr "La priorité (Priority) est déjà spécifiée.\n" +#, fuzzy +#~ msgid "Signature validation failed for file %s: ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s : ERR=%s\n" -#: src/dird/ua_run.c:2241 -msgid "Priority must be positive nonzero setting it to 10.\n" -msgstr "" -"La priorité doit être supérieure à zéro. Utilisation d'une priorité de 10.\n" +#, fuzzy +#~ msgid "Digest one file failed for file: %s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s : ERR=%s\n" -#: src/dird/ua_run.c:2251 -msgid "Verify Job specified twice.\n" -msgstr "" +#, fuzzy +#~ msgid "LZO uncompression error on file %s. ERR=%d\n" +#~ msgstr "Erreur de décompression. ERR=%d\n" -#: src/dird/ua_run.c:2279 -msgid "Migration Job specified twice.\n" -msgstr "" +#, fuzzy +#~ msgid "Write write error on %s: ERR=%s\n" +#~ msgstr "erreur de déplacement (lseek) sur %s : ERR=%s\n" -#: src/dird/ua_run.c:2287 -msgid "Pool specified twice.\n" -msgstr "Le pool est déjà spécifié.\n" +#, fuzzy +#~ msgid "Wrong write size error at %lld block=%d wanted=%d wrote=%d\n" +#~ msgstr "Erreur d'écriture à %u:%u sur le device %s. ERR=%s\n" -#: src/dird/ua_run.c:2303 #, fuzzy -msgid "Restore Client specified twice.\n" -msgstr "Le client est déjà spécifié.\n" +#~ msgid "" +#~ "Write write error at %lld block=%d write_len=%d lerror=%d on %s: ERR=%s\n" +#~ msgstr "Erreur d'écriture à %u:%u sur le device %s. ERR=%s\n" -#: src/dird/ua_run.c:2310 #, fuzzy -msgid "Plugin Options not yet implemented.\n" -msgstr "Le client est déjà spécifié.\n" +#~ msgid "%s %sVersion: %s (%s) %s %s %s %s\n" +#~ msgstr "%s Version : %s (%s) %s %s %s\n" -#: src/dird/ua_run.c:2313 #, fuzzy -msgid "Plugin Options specified twice.\n" -msgstr "Le client est déjà spécifié.\n" +#~ msgid "Daemon started %s. Jobs: run=%d running=%d.\n" +#~ msgstr "Démon démarré depuis %s, %d jobs lancés depuis cette date.\n" -#: src/dird/ua_run.c:2318 #, fuzzy -msgid "No authoriztion for \"PluginOptions\" specification.\n" -msgstr "Pas d'enregistrement trouvé en base pour : %s\n" +#~ msgid "Director connected %sat: %s\n" +#~ msgstr "Connexion du director le %s\n" -#: src/dird/ua_run.c:2325 #, fuzzy -msgid "Spool flag specified twice.\n" -msgstr "Le pool est déjà spécifié.\n" +#~ msgid " %s%s %s Job started: %s\n" +#~ msgstr "Le job %d est annulé.\n" -#: src/dird/ua_run.c:2332 #, fuzzy -msgid "Invalid spooldata flag.\n" -msgstr "Période invalide.\n" +#~ msgid "" +#~ " Files=%s Bytes=%s AveBytes/sec=%s LastBytes/sec=%s Errors=%d\n" +#~ " Bwlimit=%s ReadBytes=%s\n" +#~ msgstr " Fichiers=%s Octets=%s Octets/sec=%s Erreurs=%d\n" + +#~ msgid "====\n" +#~ msgstr "====\n" -#: src/dird/ua_run.c:2341 #, fuzzy -msgid "IgnoreDuplicateCheck flag specified twice.\n" -msgstr "Le pool est déjà spécifié.\n" +#~ msgid "WriteEncryptedFileRaw failure: ERR=%s\n" +#~ msgstr "fopen %s en erreur : ERR=%s\n" -#: src/dird/ua_run.c:2348 #, fuzzy -msgid "Invalid ignoreduplicatecheck flag.\n" -msgstr "Période invalide.\n" +#~ msgid "llistea error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:2353 #, fuzzy -msgid "Accurate flag specified twice.\n" -msgstr "Le pool est déjà spécifié.\n" +#~ msgid "lgetea error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:2360 #, fuzzy -msgid "Invalid accurate flag.\n" -msgstr "Période invalide.\n" +#~ msgid "Failed to serialize extended attributes on file \"%s\"\n" +#~ msgstr "Impossible d'initialiser le contexte TLS pour la Console \"%s\".\n" -#: src/dird/ua_run.c:2365 -msgid "Job name specified twice.\n" -msgstr "Le job est déjà spécifié.\n" +#, fuzzy +#~ msgid "lsetea error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:2373 #, fuzzy -msgid "Media Type specified twice.\n" -msgstr "L'option d'écrasement (Replace) est déjà spécifié.\n" +#~ msgid "attr_list error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:2381 #, fuzzy -msgid "NextPool specified twice.\n" -msgstr "Le pool est déjà spécifié.\n" +#~ msgid "Received illegal xattr named %s on file \"%s\"\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/dird/ua_run.c:2406 -#, c-format -msgid "Invalid keyword: %s\n" -msgstr "Argument invalide : %s\n" +#, fuzzy +#~ msgid "attr_set error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:2421 -#, c-format -msgid "Catalog \"%s\" not found\n" -msgstr "Le catalogue \"%s\" est introuvable\n" +#, fuzzy +#~ msgid "llistxattr error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:2425 -#, c-format -msgid "No authorization. Catalog \"%s\".\n" -msgstr "" +#, fuzzy +#~ msgid "lgetxattr error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:2459 -#, c-format -msgid "Verify Job \"%s\" not found.\n" -msgstr "" +#, fuzzy +#~ msgid "lsetxattr error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_run.c:2469 -#, c-format -msgid "Migration Job \"%s\" not found.\n" -msgstr "" +#, fuzzy +#~ msgid "extattr_list_link error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_select.c:39 src/dird/ua_select.c:65 -#, c-format -msgid "The current %s retention period is: %s\n" -msgstr "La période de rétention courante %s est : %s\n" +#, fuzzy +#~ msgid "Failed to convert %d into namespace on file \"%s\"\n" +#~ msgstr "Impossible de lire le certificat à partir du fichier" -#: src/dird/ua_select.c:44 #, fuzzy -msgid "Continue? (yes/no): " -msgstr "Continuer ? (oui/mod/non) : " +#~ msgid "extattr_get_link error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_select.c:70 -msgid "Continue? (yes/mod/no): " -msgstr "Continuer ? (oui/mod/non) : " +#, fuzzy +#~ msgid "Failed to split %s into namespace and name part on file \"%s\"\n" +#~ msgstr "" +#~ "Impossible de se positionner à la fin du média sur le device %s : ERR=%s\n" -#: src/dird/ua_select.c:74 -msgid "Enter new retention period: " -msgstr "Saisissez une nouvelle période de rétention : " +#, fuzzy +#~ msgid "Failed to convert %s into namespace on file \"%s\"\n" +#~ msgstr "Impossible de lire le certificat à partir du fichier" -#: src/dird/ua_select.c:78 -msgid "Invalid period.\n" -msgstr "Période invalide.\n" +#, fuzzy +#~ msgid "extattr_set_link error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_select.c:177 -msgid "The defined Storage resources are:\n" -msgstr "Les ressources de Stockage définies sont :\n" +#, fuzzy +#~ msgid "getproplist error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_select.c:189 -msgid "Select Storage resource" -msgstr "Sélectionnez la ressource de Stockage" +#, fuzzy +#~ msgid "Unable create proper proplist to restore xattrs on file \"%s\"\n" +#~ msgstr "Impossible de lire le certificat à partir du fichier" -#: src/dird/ua_select.c:245 -msgid "You must specify a \"use \" command before continuing.\n" -msgstr "" +#, fuzzy +#~ msgid "setproplist error on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_select.c:251 -msgid "The defined Catalog resources are:\n" -msgstr "Les Catalogues définis sont :\n" +#, fuzzy +#~ msgid "Unable to get acl on xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/dird/ua_select.c:259 -msgid "Catalog" -msgstr "Catalogue" +#, fuzzy +#~ msgid "Unable to get acl text on xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/dird/ua_select.c:259 -msgid "Select Catalog resource" -msgstr "Sélectionnez le Catalogue" +#, fuzzy +#~ msgid "Unable to get status on xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/dird/ua_select.c:278 #, fuzzy -msgid "The disabled Job resources are:\n" -msgstr "Les Job définis sont :\n" +#~ msgid "Unable to open xattr %s on \"%s\": ERR=%s\n" +#~ msgstr "Impossible de se connecter à %s sur %s:%d. ERR=%s\n" -#: src/dird/ua_select.c:280 #, fuzzy -msgid "The enabled Job resources are:\n" -msgstr "Les Job définis sont :\n" +#~ msgid "Unable to read symlin %s on \"%s\": ERR=%s\n" +#~ msgstr "Impossible de se connecter à %s sur %s:%d. ERR=%s\n" -#: src/dird/ua_select.c:292 src/dird/ua_select.c:315 -msgid "Select Job resource" -msgstr "Sélectionnez le Job" +#, fuzzy +#~ msgid "Unable to read content of xattr %s on file \"%s\"\n" +#~ msgstr "Impossible de lire le certificat à partir du fichier" -#: src/dird/ua_select.c:307 -msgid "The defined Job resources are:\n" -msgstr "Les Job définis sont :\n" +#, fuzzy +#~ msgid "Unable to chdir to xattr space of file \"%s\": ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/dird/ua_select.c:334 -#, fuzzy, c-format -msgid "Error: Restore Job resource \"%s\" does not exist.\n" -msgstr "Erreur : le Pool \"%s\" n'existe pas.\n" +#, fuzzy +#~ msgid "Unable to open file \"%s\": ERR=%s\n" +#~ msgstr "3910 Impossible d'ouvrir le device %s : ERR=%s\n" -#: src/dird/ua_select.c:348 -msgid "The defined Restore Job resources are:\n" -msgstr "Les Job de restauration sont :\n" +#, fuzzy +#~ msgid "Unable to open xattr space %s on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/dird/ua_select.c:356 -msgid "Select Restore Job" -msgstr "Sélectionnez le Job de restauration" +#, fuzzy +#~ msgid "Unable to chdir to xattr space on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/dird/ua_select.c:372 src/dird/ua_select.c:399 -msgid "The defined Client resources are:\n" -msgstr "Les clients définis sont :\n" +#, fuzzy +#~ msgid "Unable to list the xattr space on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/dird/ua_select.c:383 #, fuzzy -msgid "Select Client resource" -msgstr "Sélectionnez le FileSet" +#~ msgid "Unable to convert acl from text on file \"%s\"\n" +#~ msgstr "Impossible de lire le certificat à partir du fichier" -#: src/dird/ua_select.c:407 -msgid "Select Client (File daemon) resource" -msgstr "Sélectionnez le client (File daemon)" +#, fuzzy +#~ msgid "Unable to restore acl of xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/dird/ua_select.c:434 -#, c-format -msgid "Error: Client resource %s does not exist.\n" -msgstr "Erreur : le client %s n'est pas définie.\n" +#, fuzzy +#~ msgid "Unable to open xattr space on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/dird/ua_select.c:450 #, fuzzy -msgid "The defined Schedule resources are:\n" -msgstr "Les clients définis sont :\n" +#~ msgid "Unable to open xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/dird/ua_select.c:461 #, fuzzy -msgid "Schedule" -msgstr "" -"\n" -"Jobs planifiés :\n" +#~ msgid "Unable to chdir to xattr space %s on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/dird/ua_select.c:461 #, fuzzy -msgid "Select Schedule resource" -msgstr "Sélectionnez le Pool" +#~ msgid "Unable to mkfifo xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/dird/ua_select.c:487 -#, c-format -msgid "Could not find Client %s: ERR=%s" -msgstr "Impossible de trouver le client %s : ERR=%s" +#, fuzzy +#~ msgid "Unable to mknod xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/dird/ua_select.c:497 src/dird/ua_select.c:551 -#, c-format -msgid "Could not find Client \"%s\": ERR=%s" -msgstr "Impossible de trouver le client \"%s\" : ERR=%s" +#, fuzzy +#~ msgid "Unable to mkdir xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_select.c:526 -#, c-format -msgid "Error obtaining client ids. ERR=%s\n" -msgstr "Erreur pendant l'obtention de l'identifiant du Client. ERR=%s\n" +#, fuzzy +#~ msgid "Unable to link xattr %s to %s on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible de se connecter à %s sur %s:%d. ERR=%s\n" -#: src/dird/ua_select.c:530 -msgid "No clients defined. You must run a job before using this command.\n" -msgstr "" -"Pas de client défini. Vous devez lancer une sauvegarde avant d'utiliser " -"cette commande.\n" +#, fuzzy +#~ msgid "Unable to restore data of xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/dird/ua_select.c:534 -msgid "Defined Clients:\n" -msgstr "Clients définis :\n" +#, fuzzy +#~ msgid "Unable to symlink xattr %s to %s on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/dird/ua_select.c:544 -msgid "Select the Client" -msgstr "Sélectionnez le client" +#, fuzzy +#~ msgid "Unable to restore owner of xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_select.c:577 src/dird/ua_select.c:601 src/dird/ua_select.c:646 -#, c-format -msgid "Could not find Pool \"%s\": ERR=%s" -msgstr "Impossible de trouver le Pool \"%s\" : ERR=%s" +#, fuzzy +#~ msgid "Unable to restore filetimes of xattr %s on file \"%s\": ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s : ERR=%s\n" -#: src/dird/ua_select.c:616 -msgid "No pools defined. Use the \"create\" command to create one.\n" -msgstr "" -"Pas de Pool défini. Utilisez la commande \"create\" pour en créer un.\n" +#, fuzzy +#~ msgid "Failed to restore extended attributes on file \"%s\"\n" +#~ msgstr "" +#~ "Impossible de se positionner à la fin du média sur le device %s : ERR=%s\n" -#: src/dird/ua_select.c:620 -msgid "Defined Pools:\n" -msgstr "Pools définis :\n" +#, fuzzy +#~ msgid "Plugin Name" +#~ msgstr "Saisissez un nom de Volume : " -#: src/dird/ua_select.c:633 -msgid "Select the Pool" -msgstr "Sélectionnez le Pool" +#, fuzzy +#~ msgid "Restore Object" +#~ msgstr "Restauration OK" -#: src/dird/ua_select.c:671 -#, c-format -msgid "No access to Pool \"%s\"\n" -msgstr "Pas d'accès au Pool \"%s\"\n" +#, fuzzy +#~ msgid "Could not restore file flags for file %s: ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s : ERR=%s\n" -#: src/dird/ua_select.c:703 #, fuzzy -msgid "Enter a Volume name or *MediaId: " -msgstr "Entrez le nom du Volume : " +#~ msgid "Could not reset file flags for file %s: ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s : ERR=%s\n" -#: src/dird/ua_select.c:738 -msgid "The defined Pool resources are:\n" -msgstr "Les Pools définis sont :\n" +#, fuzzy +#~ msgid "Plugin: \"%s\" not found.\n" +#~ msgstr "Plugin=%s non trouvé.\n" -#: src/dird/ua_select.c:746 -msgid "Select Pool resource" -msgstr "Sélectionnez le Pool" +#, fuzzy +#~ msgid "Cannot stat file %s: ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_select.c:781 -msgid "Enter the JobId to select: " -msgstr "Entrez le JobId à sélectionner : " +#, fuzzy +#~ msgid "%s exists but is not a directory.\n" +#~ msgstr "%s doit être un répertoire.\n" -#: src/dird/ua_select.c:819 -#, c-format -msgid "Could not find Job \"%s\": ERR=%s" -msgstr "Impossible de trouver le Job \"%s\" : ERR=%s" +#, fuzzy +#~ msgid "%c: is not a valid drive.\n" +#~ msgstr "%s : est une commande invalide.\n" -#: src/dird/ua_select.c:910 src/dird/ua_select.c:1006 -#, c-format -msgid "Automatically selected %s: %s\n" -msgstr "Sélection automatique %s : %s\n" +#, fuzzy +#~ msgid "Cannot open current directory: ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier inclus : %s. ERR=%s\n" -#: src/dird/ua_select.c:921 src/dird/ua_select.c:1017 -#, c-format -msgid "" -"Your request has multiple choices for \"%s\". Selection is not possible in " -"batch mode.\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot get current directory: ERR=%s\n" +#~ msgstr "change le répertoire courant" -#: src/dird/ua_select.c:939 src/dird/ua_select.c:999 -#, c-format -msgid "Selection list for \"%s\" is empty!\n" -msgstr "La sélection pour \"%s\" est vide !\n" +#, fuzzy +#~ msgid "Cannot reset current directory: ERR=%s\n" +#~ msgstr "change le répertoire courant" -#: src/dird/ua_select.c:945 -#, c-format -msgid "Automatically selected: %s\n" -msgstr "Sélection automatique : %s\n" +#~ msgid "Only ipv4 and ipv6 are supported (%d)\n" +#~ msgstr "Seulement l'ipv4 et l'ipv6 sont supportés (%d)\n" -#: src/dird/ua_select.c:957 -msgid "Selection aborted, nothing done.\n" -msgstr "Sélection annulée, rien de fait.\n" +#~ msgid "Only ipv4 is supported (%d)\n" +#~ msgstr "Seulement l'ipv4 est supporté (%d)\n" -#: src/dird/ua_select.c:962 src/dird/ua_select.c:1051 -#, c-format -msgid "Please enter a number between 1 and %d\n" -msgstr "Merci de saisir un nombre entre 1 et %d\n" +#, fuzzy +#~ msgid "Can't add default IPv4 address (%s)\n" +#~ msgstr "Impossible d'ajouter l'adresse par défaut (%s)\n" -#: src/dird/ua_select.c:1105 -msgid "Storage name given twice.\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot resolve service(%s)" +#~ msgstr "impossible de trouver une correspondance pour le service (%s)" -#: src/dird/ua_select.c:1122 -#, c-format -msgid "Expecting jobid=nn command, got: %s\n" -msgstr "Attendait l'option jobid=nn, pas : %s\n" +#, fuzzy +#~ msgid "Cannot resolve hostname(%s) %s" +#~ msgstr "impossible de résoudre le hostname (%s) %s" -#: src/dird/ua_select.c:1126 -#, c-format -msgid "JobId %s is not running.\n" -msgstr "JobId %s n'est pas en cours.\n" +#, fuzzy +#~ msgid "Expected a block to begin with { but got: %s" +#~ msgstr "Attendait un début de bloc {, pas : %s" -#: src/dird/ua_select.c:1136 -#, c-format -msgid "Expecting job=xxx, got: %s.\n" -msgstr "Attendait l'option job=xxx, pas : %s\n" +#, fuzzy +#~ msgid "Expected a string but got: %s" +#~ msgstr "Attendait une chaîne, pas : %s" -#: src/dird/ua_select.c:1140 -#, c-format -msgid "Job \"%s\" is not running.\n" -msgstr "Job \"%s\" n'est pas en cours.\n" +#, fuzzy +#~ msgid "Expected a string [ip|ipv4|ipv6] but got: %s" +#~ msgstr "Attentait la chaîne [ip|ipv4|ipv6], pas : %s" -#: src/dird/ua_select.c:1148 -#, c-format -msgid "Expecting ujobid=xxx, got: %s.\n" -msgstr "Attendait l'option ujobid=xxx, pas : %s\n" +#, fuzzy +#~ msgid "Expected a string [ip|ipv4] but got: %s" +#~ msgstr "Attendait la chaîne [ip|ipv4], pas : %s" -#: src/dird/ua_select.c:1169 -#, c-format -msgid "Storage resource \"%s\": not found\n" -msgstr "Storage resource \"%s\" : non trouvé\n" +#, fuzzy +#~ msgid "Expected an equal = but got: %s" +#~ msgstr "Attendait un égal =, pas : %s" -#: src/dird/ua_select.c:1201 -msgid "Enter autochanger drive[0]: " -msgstr "Saisissez le numéro du lecteur de l'autochanger [0] : " +#, fuzzy +#~ msgid "Expected an identifier [addr|port] but got: %s" +#~ msgstr "Attendait un identifiant [addr|port], pas : %s" -#: src/dird/ua_select.c:1222 -msgid "Enter autochanger slot: " -msgstr "Saisissez le slot de l'autochanger [0] : " +#~ msgid "Only one port per address block" +#~ msgstr "Seulement un port par bloc d'adresse" -#: src/dird/ua_select.c:1252 -msgid "Media Types defined in conf file:\n" -msgstr "" +#~ msgid "Only one addr per address block" +#~ msgstr "Seulement une adresse par bloc d'adresse" -#: src/dird/ua_select.c:1258 -msgid "Media Type" -msgstr "" +#, fuzzy +#~ msgid "Expected a identifier [addr|port] but got: %s" +#~ msgstr "Attendait un identifiant [addr|port], pas : %s" -#: src/dird/ua_select.c:1258 -msgid "Select the Media Type" -msgstr "Choisissez le type de Media" +#~ msgid "Expected a equal =, got: %s" +#~ msgstr "Attendait un égal =, pas : %s" -#: src/dird/ua_select.c:1296 src/filed/status.c:322 src/stored/status.c:915 -msgid "No Jobs running.\n" -msgstr "Pas de job en cours.\n" +#, fuzzy +#~ msgid "Expected a number or a string but got: %s" +#~ msgstr "Attendait un nombre ou une chaîne, pas : %s" -#: src/dird/ua_select.c:1298 -msgid "None of your jobs are running.\n" -msgstr "Aucun de vos jobs ne sont en cours.\n" +#, fuzzy +#~ msgid "Expected an IP number or a hostname but got: %s" +#~ msgstr "Attendait une adresse IP ou un nom de machine, pas : %s" -#: src/dird/ua_select.c:1326 -msgid "No value given for \"jobid\".\n" -msgstr "" +#, fuzzy +#~ msgid "Expected a end of block with } but got: %s" +#~ msgstr "Attendait une fin de bloc }, pas : %s" -#: src/dird/ua_select.c:1338 -#, fuzzy, c-format -msgid "Unauthorized command from this console for JobId=%d.\n" -msgstr "Commande interdite depuis cette console.\n" +#, fuzzy +#~ msgid "Cannot add hostname(%s) and port(%s) to addrlist (%s)" +#~ msgstr "" +#~ "Impossible d'ajouter le hostname (%s) et le port (%s) à la liste " +#~ "d'adresse (%s)" -#: src/dird/ua_select.c:1342 -#, fuzzy, c-format -msgid "Warning Job JobId=%d is not running.\n" -msgstr "Attention le Job %s n'est pas en cours. Continuons quand même...\n" +#, fuzzy +#~ msgid "Expected an end of block with } but got: %s" +#~ msgstr "Attendait une fin de bloc }, pas : %s" -#: src/dird/ua_select.c:1367 src/dird/ua_select.c:1462 -#, fuzzy, c-format -msgid "Confirm %s of %d Job%s (yes/no): " -msgstr "Confirmez l'annulation (oui/non) : " +#~ msgid "Expected an IP number or a hostname, got: %s" +#~ msgstr "Attendait une adresse IP ou un nom de machine, pas : %s" -#: src/dird/ua_select.c:1380 -msgid "No value given for \"job\".\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot add port (%s) to (%s)" +#~ msgstr "impossible d'ajouter le port (%s) à (%s)" -#: src/dird/ua_select.c:1390 -#, fuzzy, c-format -msgid "Unauthorized command from this console for job=%s.\n" -msgstr "Commande interdite depuis cette console.\n" +#~ msgid "Expected a port number or string, got: %s" +#~ msgstr "Attendait un numéro de port ou une chaîne, pas : %s" -#: src/dird/ua_select.c:1396 src/dird/ua_select.c:1421 -#, fuzzy, c-format -msgid "Warning Job %s is not running.\n" -msgstr "JobId %s n'est pas en cours.\n" +#~ msgid "Error scanning attributes: %s\n" +#~ msgstr "Erreur pendant la lecture des attributs : %s\n" -#: src/dird/ua_select.c:1405 -msgid "No value given for \"ujobid\".\n" -msgstr "" +#~ msgid "Child died from signal %d: %s" +#~ msgstr "Le processus fils est mort par le signal %d : %s" -#: src/dird/ua_select.c:1415 -#, fuzzy, c-format -msgid "Unauthorized command from this console for ujobid=%s.\n" -msgstr "Commande interdite depuis cette console.\n" +#~ msgid "Status OK\n" +#~ msgstr "Statut OK\n" -#: src/dird/ua_select.c:1441 #, fuzzy -msgid "Select Job(s):\n" -msgstr "Sélectionnez le Job :\n" +#~ msgid "Attr spool write error. wrote=%d wanted=%d bytes. ERR=%s\n" +#~ msgstr "Erreur pendant l'écriture des attributs dans le spool. ERR=%s\n" -#: src/dird/ua_select.c:1447 -#, c-format -msgid "JobId=%s Job=%s" -msgstr "JobId=%s Job=%s" +#~ msgid "TLS connection initialization failed.\n" +#~ msgstr "Initialisation de la connexion TLS échouée.\n" -#: src/dird/ua_select.c:1451 -#, fuzzy, c-format -msgid "Choose Job list to %s" -msgstr "Sélectionnez le Job à annuler" +#~ msgid "TLS Negotiation failed.\n" +#~ msgstr "Négociation TLS échouée.\n" -#: src/dird/ua_server.c:57 -#, c-format -msgid "Cannot create UA thread: %s\n" -msgstr "" +#~ msgid "TLS enabled but not configured.\n" +#~ msgstr "TLS activé mais non configuré.\n" -#: src/dird/ua_server.c:147 -msgid "You have messages.\n" -msgstr "Vous avez des messages.\n" +#~ msgid "TLS enable but not configured.\n" +#~ msgstr "TLS actif mais non configuré.\n" -#: src/dird/ua_status.c:171 -msgid "Status available for:\n" -msgstr "Statut disponible pour :\n" +#~ msgid "No problem." +#~ msgstr "Pas de problème." -#: src/dird/ua_status.c:178 -msgid "Select daemon type for status" -msgstr "Saisissez le composant à afficher" +#~ msgid "Unknown error." +#~ msgstr "Erreur inconnue." -#: src/dird/ua_status.c:324 src/stored/status.c:499 -#, fuzzy, c-format -msgid "%s %sVersion: %s (%s) %s %s %s\n" -msgstr "%s Version : %s (%s) %s %s %s\n" +#~ msgid "Unknown sig %d" +#~ msgstr "sig inconnu %d" -#: src/dird/ua_status.c:328 -#, fuzzy, c-format -msgid "Daemon started %s, conf reloaded %s\n" -msgstr "Démon démarré depuis %s, 1 job lancé depuis cette date.\n" +#~ msgid "Cannot set SO_REUSEADDR on socket: %s\n" +#~ msgstr "" +#~ "Impossible de positionner l'option SO_REUSEADDR sur la socket : %s\n" -#: src/dird/ua_status.c:329 -#, fuzzy, c-format -msgid " Jobs: run=%d, running=%d mode=%d,%d\n" -msgstr "Démon démarré depuis %s, %d jobs lancés depuis cette date.\n" - -#: src/dird/ua_status.c:331 src/filed/status.c:175 src/stored/status.c:509 -#, fuzzy, c-format -msgid " Heap: heap=%s smbytes=%s max_bytes=%s bufs=%s max_bufs=%s\n" -msgstr " Heap: bytes=%s smbytes=%s max_bytes=%s bufs=%s max_bufs=%s\n" +#~ msgid "Cannot bind port %d: ERR=%s: Retrying ...\n" +#~ msgstr "Impossible de s'attacher au port %d : ERR=%s : Réessaie...\n" -#: src/dird/ua_status.c:337 -#, c-format -msgid "" -" Res: njobs=%d nclients=%d nstores=%d npools=%d ncats=%d nfsets=%d nscheds=" -"%d\n" -msgstr "" +#~ msgid "Cannot bind port %d: ERR=%s.\n" +#~ msgstr "Impossible de s'attacher au port %d : ERR=%s.\n" -#: src/dird/ua_status.c:394 -#, fuzzy, c-format -msgid "No authorization for Storage \"%s\"\n" -msgstr "Pas d'enregistrement trouvé en base pour : %s\n" +#, fuzzy +#~ msgid "No addr/port found to listen on.\n" +#~ msgstr "Aucun volume trouvé pour la restauration.\n" -#: src/dird/ua_status.c:404 -msgid "Restricted Client or Job does not permit access to Storage daemons\n" -msgstr "" +#~ msgid "Could not init client queue: ERR=%s\n" +#~ msgstr "Impossible d'initialiser la queue cliente : ERR=%s\n" -#: src/dird/ua_status.c:414 -#, c-format -msgid "" -"\n" -"Failed to connect to Storage daemon %s.\n" -"====\n" -msgstr "" -"\n" -"Impossible de se connecter au Storage Daemon %s.\n" -"====\n" +#~ msgid "Error in select: %s\n" +#~ msgstr "Erreur sur le select : %s\n" -#: src/dird/ua_status.c:429 -msgid "Must have three aguments\n" -msgstr "" +#~ msgid "Connection from %s:%d refused by hosts.access\n" +#~ msgstr "Connexion depuis %s:%d refusée par hosts.access\n" -#: src/dird/ua_status.c:478 -#, c-format -msgid "" -"Failed to connect to Client %s.\n" -"====\n" -msgstr "" -"Impossible de se connecter au client %s.\n" -"====\n" +#~ msgid "Cannot set SO_KEEPALIVE on socket: %s\n" +#~ msgstr "Impossible de positionner SO_KEEPALIVE sur la socket : %s\n" -#: src/dird/ua_status.c:483 -msgid "Connected to file daemon\n" -msgstr "Connecté avec le File Daemon\n" +#~ msgid "Could not create client BSOCK.\n" +#~ msgstr "Impossible de créer la structure BSOCK cliente.\n" -#: src/dird/ua_status.c:502 src/dird/ua_status.c:511 -msgid "" -"\n" -"Scheduled Jobs:\n" -msgstr "" -"\n" -"Jobs planifiés :\n" +#~ msgid "Could not add job to client queue: ERR=%s\n" +#~ msgstr "Impossible d'ajouter le job à la queue cliente : ERR=%s\n" -#: src/dird/ua_status.c:503 -#, fuzzy -msgid "" -"Level Type Pri Scheduled Job Name Volume\n" -msgstr "" -"Type Action Pri Planification Nom Volume\n" +#~ msgid "Could not destroy client queue: ERR=%s\n" +#~ msgstr "Impossible de détruire la queue cliente : ERR=%s\n" -#: src/dird/ua_status.c:504 -msgid "===================================================================================\n" -msgstr "" +#~ msgid "" +#~ "Could not connect to %s on %s:%d. ERR=%s\n" +#~ "Retrying ...\n" +#~ msgstr "" +#~ "Impossible de se connecter à %s sur %s:%d. ERR=%s\n" +#~ "Réessaie...\n" -#: src/dird/ua_status.c:512 -#, fuzzy -msgid "" -"Level Type Pri Scheduled Job Name Schedule\n" -msgstr "" -"Type Action Pri Planification Nom Volume\n" +#~ msgid "Unable to connect to %s on %s:%d. ERR=%s\n" +#~ msgstr "Impossible de se connecter à %s sur %s:%d. ERR=%s\n" -#: src/dird/ua_status.c:513 #, fuzzy -msgid "=====================================================================================\n" -msgstr "========================================================================\n" - -#: src/dird/ua_status.c:570 src/dird/ua_status.c:753 -#, fuzzy, c-format -msgid "%-14s\t%-8s\t%3d\t%-18s\t%-18s\t%s\n" -msgstr "%-14s %-8s %3d %-18s %-18s %s\n" +#~ msgid "gethostbyname() for host \"%s\" failed: ERR=%s\n" +#~ msgstr "Impossible de supprimer le volume \"%s\". ERR=%s" -#: src/dird/ua_status.c:591 src/dird/ua_status.c:757 -#, c-format -msgid "%-14s %-8s %3d %-18s %-18s %s\n" -msgstr "%-14s %-8s %3d %-18s %-18s %s\n" +#~ msgid "Socket open error. proto=%d port=%d. ERR=%s\n" +#~ msgstr "Ouverture de la socket en erreur. proto=%d port=%d. ERR=%s\n" -#: src/dird/ua_status.c:627 -msgid "Ignoring invalid value for days. Max is 3000.\n" -msgstr "" +#, fuzzy +#~ msgid "Source address bind error. proto=%d. ERR=%s\n" +#~ msgstr "Ouverture de la socket en erreur. proto=%d port=%d. ERR=%s\n" -#: src/dird/ua_status.c:638 -msgid "Ignoring invalid value for limit. Max is 2000.\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot set TCP_KEEPIDLE on socket: %s\n" +#~ msgstr "Impossible de positionner SO_KEEPALIVE sur la socket : %s\n" -#: src/dird/ua_status.c:649 -msgid "Ignoring invalid time.\n" -msgstr "" +#, fuzzy +#~ msgid "Could not init bsock read mutex. ERR=%s\n" +#~ msgstr "Impossible d'initialiser la queue cliente : ERR=%s\n" -#: src/dird/ua_status.c:772 src/dird/ua_status.c:877 -msgid "No Scheduled Jobs.\n" -msgstr "Pas de job programmé.\n" +#, fuzzy +#~ msgid "Could not init bsock write mutex. ERR=%s\n" +#~ msgstr "Impossible d'initialiser la queue cliente : ERR=%s\n" -#: src/dird/ua_status.c:824 -msgid "Ignoring invalid value for days. Max is 500.\n" -msgstr "" +#, fuzzy +#~ msgid "Write error sending %d bytes to %s:%s:%d: ERR=%s\n" +#~ msgstr "Erreur de lecture de %s:%s:%d : ERR=%s\n" -#: src/dird/ua_status.c:903 src/filed/status.c:228 src/stored/status.c:816 -msgid "" -"\n" -"Running Jobs:\n" -msgstr "" -"\n" -"Job en cours :\n" +#~ msgid "Read expected %d got %d from %s:%s:%d\n" +#~ msgstr "Attendait %d en lecture, eu %d de %s:%s:%d\n" -#: src/dird/ua_status.c:911 -#, fuzzy, c-format -msgid "Console connected %sat %s\n" -msgstr "Console connecté à %s\n" +#~ msgid "Read error from %s:%s:%d: ERR=%s\n" +#~ msgstr "Erreur de lecture de %s:%s:%d : ERR=%s\n" -#: src/dird/ua_status.c:912 src/filed/status.c:240 -msgid "using TLS " -msgstr "" +#, fuzzy +#~ msgid "fread attr spool error. Wanted=%d got=%d bytes. ERR=%s\n" +#~ msgstr "Erreur pendant l'écriture des attributs dans le spool. ERR=%s\n" -#: src/dird/ua_status.c:922 -msgid "" -"No Jobs running.\n" -"====\n" -msgstr "" -"Pas de job en cours.\n" -"====\n" +#, fuzzy +#~ msgid "fread attr spool I/O error.\n" +#~ msgstr "Erreur pendant l'écriture des attributs dans le spool. ERR=%s\n" -#: src/dird/ua_status.c:929 #, fuzzy -msgid " JobId Type Level Files Bytes Name Status\n" -msgstr " JobId Type Nom Statut\n" +#~ msgid "Could not malloc BSOCK data buffer\n" +#~ msgstr "Impossible d'ouvrir la base de données \"%s\".\n" -#: src/dird/ua_status.c:930 -msgid "======================================================================\n" -msgstr "======================================================================\n" +#~ msgid "sockopt error: %s\n" +#~ msgstr "erreur sockopt : %s\n" -#: src/dird/ua_status.c:945 -msgid "is waiting execution" -msgstr "est en attente d'exécution" +#, fuzzy +#~ msgid "fcntl F_GETFL error. ERR=%s\n" +#~ msgstr "erreur de fermeture : ERR=%s\n" -#: src/dird/ua_status.c:948 -msgid "is running" -msgstr "est en cours" +#, fuzzy +#~ msgid "fcntl F_SETFL error. ERR=%s\n" +#~ msgstr "erreur de fermeture : ERR=%s\n" -#: src/dird/ua_status.c:951 -msgid "is blocked" -msgstr "est bloqué" +#, fuzzy +#~ msgid "Director authorization error at \"%s:%d\"\n" +#~ msgstr "Pas d'enregistrement trouvé en base pour : %s\n" -#: src/dird/ua_status.c:954 -msgid "has terminated" -msgstr "est terminé" +#, fuzzy +#~ msgid "" +#~ "Bad errmsg to Hello command: ERR=%s\n" +#~ "The Director at \"%s:%d\" may not be running.\n" +#~ msgstr "Mauvaise réponse à la commande Hello : ERR=%s\n" -#: src/dird/ua_status.c:957 #, fuzzy -msgid "has terminated with warnings" -msgstr "Job terminés :\n" +#~ msgid "" +#~ "Authorization error with Director at \"%s:%d\"\n" +#~ "Most likely the passwords do not agree.\n" +#~ "If you are using TLS, there may have been a certificate validation error " +#~ "during the TLS handshake.\n" +#~ "For help, please see: " +#~ msgstr "" +#~ "Problème d'authentification avec le director.\n" +#~ "Le plus souvent, les mots de pass ne correspondent pas.\n" +#~ "Si vous utilisez TLS, il peut y avoir une erreur de validation du " +#~ "certificat\n" +#~ "pendant l'initialisation de la connexion TLS.\n" +#~ "Vous trouverez de l'aide sur\n" +#~ "http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors\n" -#: src/dird/ua_status.c:960 #, fuzzy -msgid "has terminated in incomplete state" -msgstr "Job terminés :\n" +#~ msgid "safe_unlink could not compile regex pattern \"%s\" ERR=%s\n" +#~ msgstr "Impossible d'ouvrir %s : ERR=%s\n" -#: src/dird/ua_status.c:963 -msgid "has erred" -msgstr "" +#~ msgid "Out of memory: ERR=%s\n" +#~ msgstr "Plus de mémoire : ERR=%s\n" -#: src/dird/ua_status.c:966 -msgid "has errors" -msgstr "est en erreur" +#~ msgid "Buffer overflow.\n" +#~ msgstr "Buffer overflow.\n" -#: src/dird/ua_status.c:969 -msgid "has a fatal error" -msgstr "est en erreur (fatale)" +#~ msgid "Bad errno" +#~ msgstr "Mauvais errno" -#: src/dird/ua_status.c:972 -msgid "has verify differences" -msgstr "" +#, fuzzy +#~ msgid "Cannot open %s file. %s ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier contenant le pid. %s ERR=%s\n" -#: src/dird/ua_status.c:975 -msgid "has been canceled" -msgstr "a été annulé" +#, fuzzy +#~ msgid "Could not open %s file. %s ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier pid. %s ERR=%s\n" -#: src/dird/ua_status.c:980 #, fuzzy -msgid "is waiting on Client" -msgstr "est en attente du client %s" +#~ msgid "Cannot lock %s file. %s ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier contenant le pid. %s ERR=%s\n" -#: src/dird/ua_status.c:982 -#, c-format -msgid "is waiting on Client %s" -msgstr "est en attente du client %s" +#, fuzzy +#~ msgid "Cannot not open %s file. %s ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier contenant le pid. %s ERR=%s\n" -#: src/dird/ua_status.c:990 src/dird/ua_status.c:992 -#, fuzzy, c-format -msgid "is waiting on Storage \"%s\"" -msgstr "est en attente du Storage %s" +#~ msgid "Could not create state file. %s ERR=%s\n" +#~ msgstr "Impossible de créer le fichier d'état. %s ERR=%s\n" -#: src/dird/ua_status.c:994 -#, fuzzy -msgid "is waiting on Storage" -msgstr "est en attente du Storage %s" +#~ msgid "Unable to open certificate file" +#~ msgstr "Impossible d'ouvrir de fichier de certificat" -#: src/dird/ua_status.c:1000 -msgid "is waiting on max Storage jobs" -msgstr "" +#~ msgid "Unable to read certificate from file" +#~ msgstr "Impossible de lire le certificat à partir du fichier" -#: src/dird/ua_status.c:1003 -msgid "is waiting on max Client jobs" -msgstr "" +#~ msgid "Unable to extract public key from certificate" +#~ msgstr "Impossible d'extraire la clef publique à partir du certificat" -#: src/dird/ua_status.c:1006 -msgid "is waiting on max Job jobs" -msgstr "" +#~ msgid "" +#~ "Provided certificate does not include the required subjectKeyIdentifier " +#~ "extension." +#~ msgstr "" +#~ "Le certificat fournis n'inclus pas l'extension subjectKeyIdentifier " +#~ "requise" -#: src/dird/ua_status.c:1009 -msgid "is waiting on max total jobs" -msgstr "" +#~ msgid "Unsupported key type provided: %d\n" +#~ msgstr "Type de clef fourni non supporté : %d\n" -#: src/dird/ua_status.c:1013 -#, fuzzy, c-format -msgid "is waiting for its start time (%s)" -msgstr "attend son heure de démarrage" +#~ msgid "Unable to open private key file" +#~ msgstr "Impossible d'ouvrir le fichier de clef privée" -#: src/dird/ua_status.c:1019 -msgid "is waiting for higher priority jobs to finish" -msgstr "attend qu'un job plus prioritaire se termine" +#~ msgid "Unable to read private key from file" +#~ msgstr "Impossible de lire la clef privée à partir du fichier" -#: src/dird/ua_status.c:1022 -#, fuzzy -msgid "is waiting for a Shared Storage device" -msgstr "est en attente du Storage %s" +#~ msgid "Unsupported digest type: %d\n" +#~ msgstr "Le digest spécifié n'est pas supporté : %d\n" -#: src/dird/ua_status.c:1025 src/dird/ua_status.c:1076 src/lib/util.c:317 -msgid "SD committing Data" -msgstr "" +#~ msgid "OpenSSL digest finalize failed" +#~ msgstr "Initialisation du digest OpenSSL à échoué" -#: src/dird/ua_status.c:1028 src/dird/ua_status.c:1079 src/lib/util.c:320 #, fuzzy -msgid "SD despooling Data" -msgstr "Spooling des données...\n" +#~ msgid "OpenSSL digest Verify final failed" +#~ msgstr "Initialisation du contexte clef/IV du cipher OpenSSL à échoué" -#: src/dird/ua_status.c:1031 src/dird/ua_status.c:1082 src/lib/util.c:323 #, fuzzy -msgid "SD despooling Attributes" -msgstr "Spooling des données...\n" - -#: src/dird/ua_status.c:1034 src/dird/ua_status.c:1085 src/lib/util.c:326 -msgid "Dir inserting Attributes" -msgstr "" +#~ msgid "No signers found for crypto verify.\n" +#~ msgstr "Aucun volume trouvé pour la restauration.\n" -#: src/dird/ua_status.c:1039 -#, c-format -msgid "is in unknown state %c" -msgstr "est dans un état inconnu %c" +#~ msgid "Signature creation failed" +#~ msgstr "La création de la signature a échouée" -#: src/dird/ua_status.c:1053 -msgid "is waiting for a mount request" -msgstr "est en attente d'un montage" +#~ msgid "Signature decoding failed" +#~ msgstr "Le décodage de la signature a échoué" -#: src/dird/ua_status.c:1060 -msgid "is waiting for an appendable Volume" -msgstr "est en attente d'un volume libre" +#~ msgid "Unsupported cipher type specified\n" +#~ msgstr "Le cipher spécifié est non supporté\n" -#: src/dird/ua_status.c:1068 -#, fuzzy -msgid "is waiting for Client to connect to Storage daemon" -msgstr "attend que le client %s se connecte au Storage %s" +#~ msgid "CryptoData decoding failed" +#~ msgstr "Le décodage du CryptoData a échoué" -#: src/dird/ua_status.c:1070 -#, c-format -msgid "is waiting for Client %s to connect to Storage %s" -msgstr "attend que le client %s se connecte au Storage %s" +#~ msgid "Failure decrypting the session key" +#~ msgstr "Impossible de décrypter la clef de session" -#: src/dird/ua_status.c:1101 -#, fuzzy, c-format -msgid "%6d\t%-6s\t%-20s\t%s\t%s\n" -msgstr "%6d %-6s %-20s %s\n" +#~ msgid "Unsupported contentEncryptionAlgorithm: %d\n" +#~ msgstr "contentEncryptionAlgorithm non supporté : %d\n" -#: src/dird/ua_status.c:1133 -#, fuzzy, c-format -msgid "%6d %-4s %-3s %10s %10s %-17s %s\n" -msgstr "%6d %-6s %8s %10s %-7s %-8s %s\n" +#~ msgid "OpenSSL cipher context initialization failed" +#~ msgstr "Initialisation du contexte clef/IV du cipher OpenSSL à échoué" -#: src/dird/ua_status.c:1161 -msgid "No Terminated Jobs.\n" -msgstr "Pas de job terminé.\n" +#, fuzzy +#~ msgid "Unsupported digest type=%d specified\n" +#~ msgstr "Le cipher spécifié est non supporté\n" -#: src/dird/ua_status.c:1167 src/lib/status.h:77 -msgid "" -"\n" -"Terminated Jobs:\n" -msgstr "" -"\n" -"Job terminés :\n" +#~ msgid "No error" +#~ msgstr "Pas d'erreur" -#: src/dird/ua_status.c:1168 src/lib/status.h:84 -msgid " JobId Level Files Bytes Status Finished Name \n" -msgstr " JobId Type Fichiers Octets Statut Terminé Nom\n" +#, fuzzy +#~ msgid "Signer not found" +#~ msgstr "Le Storage \"%s\" est introuvable.\n" -#: src/dird/ua_status.c:1169 -msgid "====================================================================\n" -msgstr "=====================================================================\n" +#, fuzzy +#~ msgid "Recipient not found" +#~ msgstr "Ressource %s introuvable\n" -#: src/dird/ua_status.c:1203 src/lib/status.h:110 src/lib/util.c:256 -msgid "Created" -msgstr "Crée" +#, fuzzy +#~ msgid "Unsupported digest algorithm" +#~ msgstr "Le digest spécifié n'est pas supporté : %d\n" -#: src/dird/ua_status.c:1210 src/lib/status.h:117 -msgid "Diffs" -msgstr "" +#, fuzzy +#~ msgid "Unsupported encryption algorithm" +#~ msgstr "contentEncryptionAlgorithm non supporté : %d\n" -#: src/dird/ua_status.c:1219 src/lib/status.h:126 src/lib/util.c:278 -#: src/lib/util.c:400 src/lib/util.c:406 -msgid "OK -- with warnings" -msgstr "OK -- avec des avertissements" +#, fuzzy +#~ msgid "Signature is invalid" +#~ msgstr "La création de la signature a échouée" -#: src/dird/ua_status.c:1222 src/lib/status.h:129 -msgid "Incomplete" -msgstr "" +#~ msgid "Internal error" +#~ msgstr "Erreur interne" -#: src/dird/ua_status.c:1225 src/lib/status.h:132 -msgid "Other" -msgstr "Autre" +#~ msgid "Unknown error" +#~ msgstr "Erreur inconnue." -#: src/dird/ua_status.c:1229 src/lib/status.h:144 -#, fuzzy, c-format -msgid "%6d\t%-6s\t%8s\t%10s\t%-7s\t%-8s\t%s\n" -msgstr "%6d %-6s %8s %10s %-7s %-8s %s\n" +#, fuzzy +#~ msgid "Cannot fork to become daemon: ERR=%s\n" +#~ msgstr "Impossible de forker pour passer en mode démon : %s\n" -#: src/dird/ua_status.c:1255 src/lib/status.h:173 -#, c-format -msgid "%6d %-6s %8s %10s %-7s %-8s %s\n" -msgstr "%6d %-6s %8s %10s %-7s %-8s %s\n" +#~ msgid "Illegal character \"%c\" in name.\n" +#~ msgstr "Caractère illégal \"%c\" dans le nom.\n" -#: src/dird/ua_status.c:1265 -msgid "\n" -msgstr "\n" +#~ msgid "Name too long.\n" +#~ msgstr "Nom trop long.\n" -#: src/dird/ua_tree.c:63 #, fuzzy -msgid "add dir/file to be restored recursively, wildcards allowed" -msgstr "" -"marque récursivement les fichiers/répertoires pour être restaurés, les " -"jokers (*) fonctionnent" - -#: src/dird/ua_tree.c:64 -msgid "change current directory" -msgstr "change le répertoire courant" - -#: src/dird/ua_tree.c:65 -msgid "count marked files in and below the cd" -msgstr "compte le nombre de fichiers marqués à partir du répertoire courant" +#~ msgid "" +#~ "Config file error: %s\n" +#~ " : Line %d, col %d of file %s\n" +#~ "%s\n" +#~ msgstr "" +#~ "Erreur de config : %s\n" +#~ " : ligne %d, col %d du fichier %s\n" +#~ "%s\n" +#~ "%s" -#: src/dird/ua_tree.c:66 #, fuzzy -msgid "delete dir/file to be restored recursively in dir" -msgstr "dé-sélectionne les fichiers/répertoires récursivement" +#~ msgid "Cannot open config file %s: %s\n" +#~ msgstr "Impossible d'ouvrir le fichier de configuration \"%s\" : %s\n" -#: src/dird/ua_tree.c:67 src/dird/ua_tree.c:68 -msgid "long list current directory, wildcards allowed" -msgstr "liste détaillée du répertoire courant, les jocker (*) fonctionnent" +#, fuzzy +#~ msgid "Cannot open lex\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/dird/ua_tree.c:69 -msgid "leave file selection mode" -msgstr "sort de la sélection des fichiers" +#~ msgid "Backup" +#~ msgstr "Backup" -#: src/dird/ua_tree.c:70 -msgid "estimate restore size" -msgstr "estime la taille de la restauration" +#~ msgid "Verifying" +#~ msgstr "Vérification" -#: src/dird/ua_tree.c:71 -msgid "same as done command" -msgstr "synonyme de la commande \"done\"" +#~ msgid "Restoring" +#~ msgstr "Restauration" -#: src/dird/ua_tree.c:72 -msgid "find files, wildcards allowed" -msgstr "recherche des fichiers, les jokers (*) fonctionnent" +#~ msgid "Archiving" +#~ msgstr "Archivage" -#: src/dird/ua_tree.c:73 src/dird/ua_tree.c:86 src/dird/ua_tree.c:87 -msgid "print help" -msgstr "affiche l'aide" +#~ msgid "Copying" +#~ msgstr "Copier" -#: src/dird/ua_tree.c:74 src/dird/ua_tree.c:75 -msgid "list current directory, wildcards allowed" -msgstr "affiche le contenu du répertoire courant, les jokers (*) fonctionnent" +#~ msgid "Migration" +#~ msgstr "Migrer" -#: src/dird/ua_tree.c:76 #, fuzzy -msgid "list subdir in current directory, wildcards allowed" -msgstr "affiche le contenu du répertoire courant, les jokers (*) fonctionnent" - -#: src/dird/ua_tree.c:77 -msgid "list the marked files in and below the cd" -msgstr "liste les fichiers marqués à partir du répertoire courant" +#~ msgid "Scanning" +#~ msgstr "En cours" -#: src/dird/ua_tree.c:78 -#, fuzzy -msgid "list the marked files in" -msgstr "liste les fichiers marqués à partir du répertoire courant" +#~ msgid "Unknown operation" +#~ msgstr "Opération inconnue" -#: src/dird/ua_tree.c:79 -msgid "mark dir/file to be restored recursively, wildcards allowed" -msgstr "" -"marque récursivement les fichiers/répertoires pour être restaurés, les " -"jokers (*) fonctionnent" +#~ msgid "backup" +#~ msgstr "backup" -#: src/dird/ua_tree.c:80 -msgid "mark directory name to be restored (no files)" -msgstr "marque un répertoire (seulement) pour la restauration" +#~ msgid "verified" +#~ msgstr "vérifié" -#: src/dird/ua_tree.c:81 src/dird/ua_tree.c:82 -msgid "print current working directory" -msgstr "affiche le répertoire courant" +#~ msgid "verify" +#~ msgstr "Vérifier" -#: src/dird/ua_tree.c:83 -msgid "unmark dir/file to be restored recursively in dir" -msgstr "dé-sélectionne les fichiers/répertoires récursivement" +#~ msgid "restored" +#~ msgstr "Restauré" -#: src/dird/ua_tree.c:84 -msgid "unmark directory name only no recursion" -msgstr "dé-sélectionne seulement un répertoire" +#~ msgid "restore" +#~ msgstr "restaurer" -#: src/dird/ua_tree.c:85 -msgid "quit and do not do restore" -msgstr "quitte et annule la restauration" +#~ msgid "archived" +#~ msgstr "archivé" -#: src/dird/ua_tree.c:107 -msgid "" -"\n" -"You are now entering file selection mode where you add (mark) and\n" -"remove (unmark) files to be restored. No files are initially added, unless\n" -"you used the \"all\" keyword on the command line.\n" -"Enter \"done\" to leave this mode.\n" -"\n" -msgstr "" -"\n" -"Vous êtes dans le mode de sélection des fichiers ou vous devez ajouter " -"(mark)\n" -"et supprimez (unmark) les fichiers à restaurer. Aucun fichier n'est " -"sélectionné\n" -"par défaut sauf si vous avez utilisé l'option \"all\" dans la commande.\n" -"Terminez votre saisie par \"done\"\n" -"\n" +#~ msgid "archive" +#~ msgstr "archiver" -#: src/dird/ua_tree.c:118 src/dird/ua_tree.c:848 -#, c-format -msgid "cwd is: %s\n" -msgstr "Le répertoire courant est : %s\n" +#~ msgid "copied" +#~ msgstr "copié" -#: src/dird/ua_tree.c:127 src/dird/ua_tree.c:146 -#, fuzzy, c-format -msgid "Invalid command \"%s\". Enter \"done\" to exit.\n" -msgstr "Commande invalide. Tapez \"done\" pour quitter.\n" +#~ msgid "copy" +#~ msgstr "copier" -#: src/dird/ua_tree.c:218 -#, c-format -msgid "" -"Something is wrong with the Delta sequence of %s, skiping new parts. Current " -"sequence is %d\n" -msgstr "" +#~ msgid "migrated" +#~ msgstr "migrer" -#: src/dird/ua_tree.c:390 src/dird/ua_tree.c:402 src/dird/ua_tree.c:419 -msgid "No files marked.\n" -msgstr "Aucun fichier sélectionné.\n" +#~ msgid "migrate" +#~ msgstr "migré" -#: src/dird/ua_tree.c:404 -msgid "1 file marked.\n" -msgstr "1 fichier sélectionné.\n" +#~ msgid "scanned" +#~ msgstr "scanné" -#: src/dird/ua_tree.c:406 -#, c-format -msgid "%s files marked.\n" -msgstr "%s fichiers sélectionnés.\n" +#~ msgid "scan" +#~ msgstr "scanner" -#: src/dird/ua_tree.c:434 -msgid "No directories marked.\n" -msgstr "Pas de répertoire sélectionné.\n" +#~ msgid "unknown action" +#~ msgstr "action inconnue" -#: src/dird/ua_tree.c:436 -msgid "1 directory marked.\n" -msgstr "1 répertoire sélectionné.\n" +#~ msgid "pthread key create failed: ERR=%s\n" +#~ msgstr "erreur sur pthread_key_create. ERR=%s\n" -#: src/dird/ua_tree.c:438 -#, c-format -msgid "%s directories marked.\n" -msgstr "%s répertoires sélectionnés.\n" +#~ msgid "pthread_once failed. ERR=%s\n" +#~ msgstr "erreur sur pthread_once. ERR=%s\n" -#: src/dird/ua_tree.c:459 -#, c-format -msgid "%s total files/dirs. %s marked to be restored.\n" -msgstr "" -"%s fichiers/répertoires au total. %s sélectionné pour la restauration.\n" +#, fuzzy +#~ msgid "Could not init msg_queue mutex. ERR=%s\n" +#~ msgstr "Impossible d'initialiser la queue cliente : ERR=%s\n" -#: src/dird/ua_tree.c:470 -msgid "No file specification given.\n" -msgstr "" +#~ msgid "NULL jcr.\n" +#~ msgstr "NULL jcr.\n" -#: src/dird/ua_tree.c:691 -#, c-format -msgid "Node %s has no children.\n" -msgstr "Le noeud %s n'a pas de fils.\n" +#, fuzzy +#~ msgid "pthread_setspecific failed: ERR=%s\n" +#~ msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" -#: src/dird/ua_tree.c:784 -#, c-format -msgid "%d total files; %d marked to be restored; %s bytes.\n" -msgstr "%d fichiers en tout ; %d marqués pour la restauration ; %s octets.\n" +#~ msgid "" +#~ "Watchdog sending kill after %d secs to thread stalled reading Storage " +#~ "daemon.\n" +#~ msgstr "" +#~ "Le watchdog a envoyé un signal après %d secs au thread bloqué en écoute " +#~ "du SD.\n" -#: src/dird/ua_tree.c:795 src/stored/btape.c:2948 -#, c-format -msgid "" -" Command Description\n" -" ======= ===========\n" -msgstr "" -" Commande Description\n" -" ======== ===========\n" +#~ msgid "" +#~ "Watchdog sending kill after %d secs to thread stalled reading File " +#~ "daemon.\n" +#~ msgstr "" +#~ "Le watchdog a envoyé un signal après %d secs au thread bloqué en écoute " +#~ "du FD.\n" -#: src/dird/ua_tree.c:818 -msgid "Too few or too many arguments. Try using double quotes.\n" -msgstr "" -"Trop ou pas assez d'arguments sur la commande. Essayez d'utiliser des " -"\"\"\"\n" +#~ msgid "" +#~ "Watchdog sending kill after %d secs to thread stalled reading Director.\n" +#~ msgstr "" +#~ "Le watchdog a envoyé un signal après %d secs au thread bloqué en écoute " +#~ "du Director.\n" -#: src/dird/ua_tree.c:831 -msgid "Invalid path given.\n" -msgstr "" +#~ msgid "Problem probably begins at line %d.\n" +#~ msgstr "Le problème commence sûrement au début de la ligne %d.\n" -#: src/dird/ua_tree.c:867 src/dird/ua_tree.c:879 -msgid "No files unmarked.\n" -msgstr "Pas de fichier dé-sélectionné.\n" +#~ msgid "" +#~ "Config error: %s\n" +#~ " : line %d, col %d of file %s\n" +#~ "%s\n" +#~ "%s" +#~ msgstr "" +#~ "Erreur de config : %s\n" +#~ " : ligne %d, col %d du fichier %s\n" +#~ "%s\n" +#~ "%s" -#: src/dird/ua_tree.c:881 -msgid "1 file unmarked.\n" -msgstr "1 fichier dé-sélectionné.\n" +#~ msgid "Config error: %s\n" +#~ msgstr "Erreur de config : %s\n" -#: src/dird/ua_tree.c:884 -#, c-format -msgid "%s files unmarked.\n" -msgstr "%s fichiers dé-sélectionnés.\n" +#~ msgid "Config token too long, file: %s, line %d, begins at line %d\n" +#~ msgstr "Config token trop long, fichier : %s, ligne %d, débutant ligne %d\n" -#: src/dird/ua_tree.c:895 src/dird/ua_tree.c:912 -msgid "No directories unmarked.\n" -msgstr "Pas de répertoire dé-sélectionné\n" +#~ msgid "none" +#~ msgstr "none" -#: src/dird/ua_tree.c:914 -msgid "1 directory unmarked.\n" -msgstr "1 répertoire dé-sélectionné\n" +#~ msgid "comment" +#~ msgstr "comment" -#: src/dird/ua_tree.c:916 -#, c-format -msgid "%d directories unmarked.\n" -msgstr "%d répertoires dé-sélectionnés.\n" +#~ msgid "number" +#~ msgstr "number" -#: src/dird/ua_update.c:92 -msgid "Update choice:\n" -msgstr "Elément à mettre à jour :\n" +#~ msgid "ip_addr" +#~ msgstr "ip_addr" -#: src/dird/ua_update.c:93 -msgid "Volume parameters" -msgstr "Paramètres d'un volume" +# identifiant +#~ msgid "identifier" +#~ msgstr "identifier" -#: src/dird/ua_update.c:94 -msgid "Pool from resource" -msgstr "Pool à partir de sa définition" +#~ msgid "string" +#~ msgstr "string" -#: src/dird/ua_update.c:95 -msgid "Slots from autochanger" -msgstr "Slots d'un autochangeur" +#~ msgid "quoted_string" +#~ msgstr "quoted_string" -#: src/dird/ua_update.c:96 #, fuzzy -msgid "Long term statistics" -msgstr "Spooling des données...\n" +#~ msgid "include" +#~ msgstr "Depuis" -#: src/dird/ua_update.c:97 #, fuzzy -msgid "Snapshot parameters" -msgstr "Paramètres d'un volume" - -#: src/dird/ua_update.c:98 -msgid "item" -msgstr "item" +#~ msgid "include_quoted_string" +#~ msgstr "quoted_string" -#: src/dird/ua_update.c:98 -msgid "Choose catalog item to update" -msgstr "Choisissez l'élément à mettre à jour" +#~ msgid "expected a positive integer number, got: %s" +#~ msgstr "attendait un nombre entier positif, pas : %s" -#: src/dird/ua_update.c:144 -#, c-format -msgid "Invalid VolStatus specified: %s\n" -msgstr "" +#~ msgid "Cannot open included config file %s: %s\n" +#~ msgstr "Impossible d'ouvrir le fichier de configuration inclus %s : %s\n" -#: src/dird/ua_update.c:153 -#, c-format -msgid "New Volume status is: %s\n" -msgstr "Le statut du volume est : %s\n" +#~ msgid "expected an integer or a range, got %s: %s" +#~ msgstr "attendait un entier ou bien un intervalle, pas %s : %s" -#: src/dird/ua_update.c:182 -#, c-format -msgid "Invalid use duration specified: %s\n" -msgstr "Durée d'utilisation invalide : %s\n" +#~ msgid "expected an integer number, got %s: %s" +#~ msgstr "attendait un nombre entier, pas %s : %s" -#: src/dird/ua_update.c:190 -#, c-format -msgid "New use duration is: %s\n" -msgstr "La nouvelle durée d'utilisation est : %s\n" +#~ msgid "expected a name, got %s: %s" +#~ msgstr "attendait un nom, pas %s : %s" -#: src/dird/ua_update.c:204 -#, c-format -msgid "New max jobs is: %s\n" -msgstr "" +#~ msgid "name %s length %d too long, max is %d\n" +#~ msgstr "la longueur du nom %s (%d) est trop grande, le max est %d\n" -#: src/dird/ua_update.c:217 -#, c-format -msgid "New max files is: %s\n" -msgstr "" +#~ msgid "expected a string, got %s: %s" +#~ msgstr "attendait une chaîne, pas %s : %s" -#: src/dird/ua_update.c:228 -#, c-format -msgid "Invalid max. bytes specification: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Mutex lock failure. ERR=%s\n" +#~ msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" -#: src/dird/ua_update.c:236 -#, c-format -msgid "New Max bytes is: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Mutex unlock failure. ERR=%s\n" +#~ msgstr "rwl_writeunlock en échec sur %s:%d :. ERR=%s\n" -#: src/dird/ua_update.c:247 src/dird/ua_update.c:267 -msgid "Invalid value. It must be yes or no.\n" -msgstr "Saisie invalide. Veuillez répondre oui ou non.\n" +#, fuzzy +#~ msgid "pthread_create failed: ERR=%s\n" +#~ msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" -#: src/dird/ua_update.c:255 -#, c-format -msgid "New Recycle flag is: %s\n" -msgstr "" +#~ msgid "Out of memory requesting %d bytes\n" +#~ msgstr "Plus de mémoire à l'allocation de %d octets\n" -#: src/dird/ua_update.c:275 -#, c-format -msgid "New InChanger flag is: %s\n" -msgstr "" +#~ msgid "Bacula Message" +#~ msgstr "Message de Bacula" -#: src/dird/ua_update.c:293 -#, c-format -msgid "Invalid slot, it must be between 0 and MaxVols=%d\n" -msgstr "Slot invalide, il doit être compris entre 0 et MaxVols=%d\n" +#~ msgid "close error: ERR=%s\n" +#~ msgstr "erreur de fermeture : ERR=%s\n" -#: src/dird/ua_update.c:303 src/dird/ua_update.c:727 -#, c-format -msgid "Error updating media record Slot: ERR=%s" -msgstr "" +#~ msgid "" +#~ "Mail program terminated in error.\n" +#~ "CMD=%s\n" +#~ "ERR=%s\n" +#~ msgstr "" +#~ "La commande mail s'est terminée en erreur.\n" +#~ "CMD=%s\n" +#~ "ERR=%s\n" -#: src/dird/ua_update.c:305 -#, c-format -msgid "New Slot is: %d\n" -msgstr "Le nouveau slot est : %d\n" +#~ msgid "fopen %s failed: ERR=%s\n" +#~ msgstr "fopen %s en erreur : ERR=%s\n" -#: src/dird/ua_update.c:330 -#, c-format -msgid "New Pool is: %s\n" -msgstr "Le nouveau pool est : %s\n" +#, fuzzy +#~ msgid "" +#~ "Msg delivery error: Operator mail program terminated in error.\n" +#~ "CMD=%s\n" +#~ "ERR=%s\n" +#~ msgstr "" +#~ "La commande mail s'est terminée en erreur.\n" +#~ "CMD=%s\n" +#~ "ERR=%s\n" -#: src/dird/ua_update.c:373 -#, c-format -msgid "New RecyclePool is: %s\n" -msgstr "Le nouveau RecyclePool est : %s\n" +#, fuzzy +#~ msgid "Msg delivery error: fopen %s failed: ERR=%s\n" +#~ msgstr "fopen %s en erreur : ERR=%s\n" -#: src/dird/ua_update.c:393 -#, c-format -msgid "Error updating Volume record: ERR=%s" -msgstr "" +#~ msgid "%s: Fatal Error because: " +#~ msgstr "%s : Erreur Fatale car : " -#: src/dird/ua_update.c:395 -#, c-format -msgid "Volume defaults updated from \"%s\" Pool record.\n" -msgstr "" +#~ msgid "%s: Fatal Error at %s:%d because:\n" +#~ msgstr "%s : Erreur Fatale à %s:%d car :\n" -#: src/dird/ua_update.c:418 src/dird/ua_update.c:450 -#, c-format -msgid "Error updating Volume records: ERR=%s" -msgstr "" +#~ msgid "%s: ERROR: " +#~ msgstr "%s : ERREUR : " -#: src/dird/ua_update.c:420 src/dird/ua_update.c:452 -#, c-format -msgid "All Volume defaults updated from \"%s\" Pool record.\n" -msgstr "" +#~ msgid "%s: ERROR in %s:%d " +#~ msgstr "%s : ERREUR dans %s:%d " -#: src/dird/ua_update.c:442 -#, c-format -msgid "Updating all pools, but skipped PoolId=%d. ERR=%s\n" -msgstr "" +#~ msgid "%s: Warning: " +#~ msgstr "%s : Attention : " -#: src/dird/ua_update.c:468 -#, fuzzy, c-format -msgid "Error updating media record Enabled: ERR=%s" -msgstr "Impossible de mettre à jour les informations du Volume : ERR=%s" +#, fuzzy +#~ msgid "%s JobId %u: Fatal error: " +#~ msgstr "%s : %s Erreur fatale : " -#: src/dird/ua_update.c:471 -#, fuzzy, c-format -msgid "New Enabled is: %d\n" -msgstr "Le nouveau flag Enabled est : %d\n" +#, fuzzy +#~ msgid "%s JobId %u: Error: " +#~ msgstr "%s : %s Erreur : " -#: src/dird/ua_update.c:486 -#, fuzzy, c-format -msgid "Error updating media record ActionOnPurge: ERR=%s" -msgstr "Impossible de mettre à jour les informations du Volume : ERR=%s" +#, fuzzy +#~ msgid "%s JobId %u: Warning: " +#~ msgstr "%s : Attention : " -#: src/dird/ua_update.c:489 -#, fuzzy, c-format -msgid "New ActionOnPurge is: %s\n" -msgstr "La nouvelle durée d'utilisation est : %s\n" +#~ msgid "Unable to init mutex: ERR=%s\n" +#~ msgstr "Impossible d'initialiser le muxtex : ERR=%s\n" -#: src/dird/ua_update.c:605 -msgid "Volume Status" -msgstr "Statut d'un volume" +#~ msgid "Unable to destroy mutex: ERR=%s\n" +#~ msgstr "Impossible de détruire le mutex : ERR=%s\n" -#: src/dird/ua_update.c:606 -msgid "Volume Retention Period" -msgstr "Période de rétention d'un volume" +#~ msgid "Unable to init OpenSSL threading: ERR=%s\n" +#~ msgstr "Impossible d'initialiser le thread OpenSSL : ERR=%s\n" -#: src/dird/ua_update.c:607 -msgid "Volume Use Duration" -msgstr "Durée d'utilisation d'un volume" +#~ msgid "Failed to save OpenSSL PRNG\n" +#~ msgstr "Impossible de sauvegarder le PRNG OpenSSL\n" -#: src/dird/ua_update.c:608 -msgid "Maximum Volume Jobs" -msgstr "Nombre maximum de job sur un volume" +#~ msgid "expected an =, got: %s" +#~ msgstr "attendait un =, eu : %s" -#: src/dird/ua_update.c:609 -msgid "Maximum Volume Files" -msgstr "Nombre maximum de fichier sur un volume" +#~ msgid "Could not find config Resource \"%s\" referenced on line %d : %s\n" +#~ msgstr "Impossible de trouver la ressource \"%s\" utilisée ligne %d : %s\n" -#: src/dird/ua_update.c:610 -msgid "Maximum Volume Bytes" -msgstr "Taille maximum d'un volume" +#~ msgid "Missing config Resource \"%s\" referenced on line %d : %s\n" +#~ msgstr "Impossible de trouver la ressource \"%s\" utilisée ligne %d : %s\n" -#: src/dird/ua_update.c:611 -msgid "Recycle Flag" -msgstr "Flag de recyclage" +#~ msgid "expected a size number, got: %s" +#~ msgstr "attendait une taille, eu : %s" -#: src/dird/ua_update.c:612 -msgid "Slot" -msgstr "" +#, fuzzy +#~ msgid "expected a speed number, got: %s" +#~ msgstr "attendait une taille, eu : %s" -#: src/dird/ua_update.c:613 -msgid "InChanger Flag" -msgstr "Flag InChanger" +#, fuzzy +#~ msgid "expected a %s, got: %s" +#~ msgstr "attendait un =, eu : %s" -#: src/dird/ua_update.c:614 -msgid "Volume Files" -msgstr "Fichiers du Volume" +#~ msgid "Expected a Tape Label keyword, got: %s" +#~ msgstr "Attendait un Label de lecteur, a pas : %s" -#: src/dird/ua_update.c:616 -msgid "Volume from Pool" -msgstr "" +#, fuzzy +#~ msgid "Config filename too long.\n" +#~ msgstr "Nom de Volume trop long.\n" -#: src/dird/ua_update.c:617 -msgid "All Volumes from Pool" -msgstr "" +#~ msgid "Cannot open config file \"%s\": %s\n" +#~ msgstr "Impossible d'ouvrir le fichier de configuration \"%s\" : %s\n" -#: src/dird/ua_update.c:618 -msgid "All Volumes from all Pools" -msgstr "" +#~ msgid "Expected a Resource name identifier, got: %s" +#~ msgstr "Attendait un identifiant de Ressource, a pas : %s" -#: src/dird/ua_update.c:619 -msgid "Enabled" -msgstr "" +#~ msgid "expected resource name, got: %s" +#~ msgstr "attendait un nom de ressource, eu : %s" -#: src/dird/ua_update.c:620 -msgid "RecyclePool" -msgstr "RecyclePool" +#~ msgid "unexpected token %d %s in resource definition" +#~ msgstr "mot clés inattendu %d %s dans la définition de la ressource" -#: src/dird/ua_update.c:621 -msgid "Action On Purge" -msgstr "" +#, fuzzy +#~ msgid "Failed to open Plugin directory %s: ERR=%s\n" +#~ msgstr "3910 Impossible d'ouvrir le device %s : ERR=%s\n" -#: src/dird/ua_update.c:631 -#, c-format -msgid "Updating Volume \"%s\"\n" -msgstr "Mise à jour du Volume \"%s\"\n" +#, fuzzy +#~ msgid "dlopen plugin %s failed: ERR=%s\n" +#~ msgstr "fopen %s en erreur : ERR=%s\n" -#: src/dird/ua_update.c:636 -#, c-format -msgid "Current Volume status is: %s\n" -msgstr "Le statut actuel du volume (Volume status) est : %s\n" - -#: src/dird/ua_update.c:637 -msgid "Possible Values are:\n" -msgstr "Les valeurs possibles sont :\n" - -#: src/dird/ua_update.c:648 -msgid "Choose new Volume Status" -msgstr "Saisissez le nouveau statut du volume (Volume Status)" +#, fuzzy +#~ msgid "Lookup of loadPlugin in plugin %s failed: ERR=%s\n" +#~ msgstr "fopen %s en erreur : ERR=%s\n" -#: src/dird/ua_update.c:656 -msgid "Enter Volume Retention period: " -msgstr "Saisissez la période de rétention du volume : " +# Impossible d'ouvrir le fichier de spool des attributs : ERR=%s +#, fuzzy +#~ msgid "Lookup of unloadPlugin in plugin %s failed: ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier de spool des attributs %s : ERR=%s\n" -#: src/dird/ua_update.c:663 -#, c-format -msgid "Current use duration is: %s\n" -msgstr "La durée d'utilisation actuelle est : %s\n" +#~ msgid "Could not find userid=%s: ERR=%s\n" +#~ msgstr "Impossible de trouver le userid %s : ERR=%s\n" -#: src/dird/ua_update.c:665 -msgid "Enter Volume Use Duration: " -msgstr "Saisissez la durée d'utilisation du volume : " +#, fuzzy +#~ msgid "Could not find password entry. ERR=%s\n" +#~ msgstr "Impossible de trouver le client %s : ERR=%s\n" -#: src/dird/ua_update.c:672 -#, c-format -msgid "Current max jobs is: %u\n" -msgstr "Le nombre maximum de Job actuel est : %u\n" +#~ msgid "Could not find group=%s: ERR=%s\n" +#~ msgstr "Impossible de trouver le groupe=%s : ERR=%s\n" -#: src/dird/ua_update.c:673 -msgid "Enter new Maximum Jobs: " -msgstr "Saisissez la valeur du nombre maximum de Job : " +#~ msgid "Could not initgroups for group=%s, userid=%s: ERR=%s\n" +#~ msgstr "" +#~ "Impossible d'utiliser initgroups pour le groupe=%s, userid=%s: ERR=%s\n" +#~ "\n" -#: src/dird/ua_update.c:680 -#, c-format -msgid "Current max files is: %u\n" -msgstr "Le nombre maximum de fichier actuel est : %u\n" +#, fuzzy +#~ msgid "Could not initgroups for userid=%s: ERR=%s\n" +#~ msgstr "Impossible d'ouvrir %s : ERR=%s\n" -#: src/dird/ua_update.c:681 -msgid "Enter new Maximum Files: " -msgstr "Saisissez la valeur du nombre maximum de fichier (Maximum Files) : " +#, fuzzy +#~ msgid "Could not set group=%s: ERR=%s\n" +#~ msgstr "Impossible d'ouvrir %s : ERR=%s\n" -#: src/dird/ua_update.c:688 -#, c-format -msgid "Current value is: %s\n" -msgstr "La valeur actuelle est : %s\n" +#, fuzzy +#~ msgid "prctl failed: ERR=%s\n" +#~ msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" -#: src/dird/ua_update.c:689 -msgid "Enter new Maximum Bytes: " -msgstr "Saisissez la nouvelle taille maximum (octets) : " +#, fuzzy +#~ msgid "setreuid failed: ERR=%s\n" +#~ msgstr "fopen %s en erreur : ERR=%s\n" -#: src/dird/ua_update.c:697 -#, c-format -msgid "Current recycle flag is: %s\n" -msgstr "Le flag de recyclage courant est : %s\n" +#, fuzzy +#~ msgid "cap_from_text failed: ERR=%s\n" +#~ msgstr "fopen %s en erreur : ERR=%s\n" -#: src/dird/ua_update.c:699 -msgid "Enter new Recycle status: " -msgstr "" +#, fuzzy +#~ msgid "cap_set_proc failed: ERR=%s\n" +#~ msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" -#: src/dird/ua_update.c:706 -#, c-format -msgid "Current Slot is: %d\n" -msgstr "Le slot courant est : %d\n" +#~ msgid "Could not initialize Python\n" +#~ msgstr "Impossible d'initialiser le Python\n" -#: src/dird/ua_update.c:707 -msgid "Enter new Slot: " -msgstr "Saisissez le nouveau slot : " +#~ msgid "Could not Run Python string %s\n" +#~ msgstr "Impossible de lancer la commande Python %s\n" -#: src/dird/ua_update.c:714 -#, c-format -msgid "Current InChanger flag is: %d\n" -msgstr "Le flag InChanger courant est : %d\n" +#, fuzzy +#~ msgid "Unable to initialize the Python lock. ERR=%s\n" +#~ msgstr "Impossible d'initialiser le verrou sur la base. ERR=%s\n" -#: src/dird/ua_update.c:715 -#, fuzzy, c-format -msgid "Set InChanger flag for Volume \"%s\": yes/no: " -msgstr "Positionner le flag InChanger ? oui/non : " +#~ msgid "rwl_writelock failure at %s:%d: ERR=%s\n" +#~ msgstr "rwl_writelock en échec sur %s:%d : ERR=%s\n" -#: src/dird/ua_update.c:729 -#, c-format -msgid "New InChanger flag is: %d\n" -msgstr "Le nouveau flag InChanger est : %d\n" +#~ msgid "rwl_writeunlock failure at %s:%d:. ERR=%s\n" +#~ msgstr "rwl_writeunlock en échec sur %s:%d :. ERR=%s\n" -#: src/dird/ua_update.c:736 -msgid "" -"Warning changing Volume Files can result\n" -"in loss of data on your Volume\n" -"\n" -msgstr "" -"Attention, changer le nombre de fichier du Volume peut\n" -"vous faire perdre des données du Volume\n" -"\n" +#~ msgid "%s: run %s \"%s\"\n" +#~ msgstr "%s: exécution %s de la commande \"%s\"\n" -#: src/dird/ua_update.c:738 -#, c-format -msgid "Current Volume Files is: %u\n" -msgstr "Le nombre courant de fichier sur le Volume est : %u\n" +#~ msgid "Runscript: %s could not execute. ERR=%s\n" +#~ msgstr "Runscript : impossible d'exécuter %s. ERR=%s\n" -#: src/dird/ua_update.c:739 -msgid "Enter new number of Files for Volume: " -msgstr "Saisissez le nouveau nombre de fichiers du Volume : " +#~ msgid "%s: %s\n" +#~ msgstr "%s: %s\n" -#: src/dird/ua_update.c:744 -msgid "Normally, you should only increase Volume Files by one!\n" -msgstr "" -"Logiquement, vous devez augmenter le nombre de fichier du Volume d'un !\n" +#~ msgid "Runscript: %s returned non-zero status=%d. ERR=%s\n" +#~ msgstr "" +#~ "Runscript : %s s'est terminé avec un statut différent de 0 statut=%d. ERR=" +#~ "%s\n" -#: src/dird/ua_update.c:745 #, fuzzy -msgid "Increase Volume Files? (yes/no): " -msgstr "Le nouveau nombre de fichier du Volume est : %u\n" +#~ msgid "Negative numbers not permitted.\n" +#~ msgstr "Les nombres négatifs ne sont pas autorisés\n" -#: src/dird/ua_update.c:755 -#, c-format -msgid "New Volume Files is: %u\n" -msgstr "Le nouveau nombre de fichier du Volume est : %u\n" +#, fuzzy +#~ msgid "User cancel requested.\n" +#~ msgstr "Restauration annulée" -#: src/dird/ua_update.c:767 -#, c-format -msgid "Current Pool is: %s\n" -msgstr "Le pool courant est : %s\n" +#, fuzzy +#~ msgid "Selection items must be be greater than zero.\n" +#~ msgstr "Les valeurs doivent être supérieurs à zéro.\n" -#: src/dird/ua_update.c:768 -msgid "Enter new Pool name: " -msgstr "Saisissez le nouveau nom pour ce pool : " +#~ msgid "Bacula interrupted by signal %d: %s\n" +#~ msgstr "Bacula a reçu le signal %d : %s\n" -#: src/dird/ua_update.c:789 -#, c-format -msgid "Current Enabled is: %d\n" -msgstr "La valeur actuelle de Enabled est : %d\n" +#, fuzzy +#~ msgid "Kaboom! %s, %s got signal %d - %s at %s. Attempting traceback.\n" +#~ msgstr "" +#~ "Kaboom ! %s, %s a reçu le signal %d - %s. Tentative de dump des traces.\n" -#: src/dird/ua_update.c:790 -msgid "Enter new Enabled: " -msgstr "Saisissez la nouvelle valeur pour Enabled : " +#~ msgid "Kaboom! exepath=%s\n" +#~ msgstr "Kaboom ! exepath=%s\n" -#: src/dird/ua_update.c:800 -#, c-format -msgid "Current RecyclePool is: %s\n" -msgstr "Le RecyclePool courant est : %s\n" +#~ msgid "Fork error: ERR=%s\n" +#~ msgstr "Fork en erreur : ERR=%s\n" -#: src/dird/ua_update.c:802 -msgid "No current RecyclePool\n" -msgstr "Pas de RecyclePool courant\n" +#, fuzzy +#~ msgid "Calling: %s %s %s %s\n" +#~ msgstr "Exécution : %s %s %s\n" -#: src/dird/ua_update.c:812 -#, fuzzy, c-format -msgid "Current ActionOnPurge is: %s\n" -msgstr "La valeur actuelle est : %s\n" +#~ msgid "execv: %s failed: ERR=%s\n" +#~ msgstr "execv : %s en échec : ERR=%s\n" -#: src/dird/ua_update.c:814 -msgid "Enter new ActionOnPurge (one of: Truncate, None): " -msgstr "" +#~ msgid "BA_NSIG too small (%d) should be (%d)\n" +#~ msgstr "BA_NSIG trop petit (%d) devrait être (%d)\n" -#: src/dird/ua_update.c:842 -#, c-format -msgid "Updating %i job(s).\n" -msgstr "" +#~ msgid "UNKNOWN SIGNAL" +#~ msgstr "SIGNAL INCONNU" -#: src/dird/ua_update.c:874 -#, c-format -msgid "db_update_pool_record returned %d. ERR=%s\n" -msgstr "db_update_pool_record a retourné %d. ERR=%s\n" +#~ msgid "Hangup" +#~ msgstr "Hangup" -#: src/dird/ua_update.c:881 -msgid "Pool DB record updated from resource.\n" -msgstr "" -"Les paramètres du Pool en base ont été mis à jour depuis la configuration.\n" +#~ msgid "Quit" +#~ msgstr "Quit" -#: src/dird/ua_update.c:908 -#, fuzzy -msgid "Expect JobId keyword, not found.\n" -msgstr "%s ressource %s introuvable.\n" +#~ msgid "Abort" +#~ msgstr "Abort" -#: src/dird/ua_update.c:933 -#, fuzzy -msgid "Neither Client nor StartTime specified.\n" -msgstr "Pas de storage sélectionné.\n" +#~ msgid "IOT trap" +#~ msgstr "IOT trap" -#: src/dird/vbackup.c:122 -#, fuzzy, c-format -msgid "Start Virtual Backup JobId %s, Job=%s\n" -msgstr "Démarrage du backup JobId %s, Job=%s\n" +#~ msgid "BUS error" +#~ msgstr "BUS error" -#: src/dird/vbackup.c:126 -msgid "" -"This Job is not an Accurate backup so is not equivalent to a Full backup.\n" -msgstr "" +#~ msgid "Segmentation violation" +#~ msgstr "Erreur de segmentation" -#: src/dird/vbackup.c:172 -#, fuzzy -msgid "No valid Jobs found from user selection.\n" -msgstr "Pas de job trouvé pour : %s.\n" +#~ msgid "Broken pipe" +#~ msgstr "Tube brisé" -#: src/dird/vbackup.c:176 -#, fuzzy, c-format -msgid "Using user supplied JobIds=%s\n" -msgstr "Migration utilisant JobId=%s Job=%s\n" +#~ msgid "Alarm clock" +#~ msgstr "Alarm clock" -#: src/dird/vbackup.c:195 -msgid "No previous Full found in list, using Differential level\n" -msgstr "" +#~ msgid "Continue" +#~ msgstr "Continue" -#: src/dird/vbackup.c:200 -msgid "No previous Full found in list, using Incremental level\n" -msgstr "" +#~ msgid "Out of memory\n" +#~ msgstr "Plus de mémoire\n" -#: src/dird/vbackup.c:213 #, fuzzy -msgid "No previous Jobs found.\n" -msgstr "Aucun Job trouvé pour la migration.\n" +#~ msgid "sm_realloc %d at %p from %s:%d\n" +#~ msgstr "Attendait %d en lecture, eu %d de %s:%s:%d\n" -#: src/dird/vbackup.c:236 -#, fuzzy, c-format -msgid "Error getting Job record for previous Job: ERR=%s" -msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" +#~ msgid " NULL pointer.\n" +#~ msgstr " pointeur NULL.\n" -#: src/dird/vbackup.c:449 -#, fuzzy, c-format -msgid "" -"%s %s %s (%s):\n" -" Build OS: %s %s %s\n" -" JobId: %d\n" -" Job: %s\n" -" Backup Level: Virtual Full\n" -" Client: \"%s\" %s\n" -" FileSet: \"%s\" %s\n" -" Pool: \"%s\" (From %s)\n" -" Catalog: \"%s\" (From %s)\n" -" Storage: \"%s\" (From %s)\n" -" Scheduled time: %s\n" -" Start time: %s\n" -" End time: %s\n" -" Elapsed time: %s\n" -" Priority: %d\n" -" SD Files Written: %s\n" -" SD Bytes Written: %s (%sB)\n" -" Rate: %.1f KB/s\n" -" Volume name(s): %s\n" -" Volume Session Id: %d\n" -" Volume Session Time: %d\n" -" Last Volume Bytes: %s (%sB)\n" -" SD Errors: %d\n" -" SD termination status: %s\n" -" Termination: %s\n" -"\n" -msgstr "" -"Bacula %s %s (%s): %s\n" -" Build OS : %s %s %s\n" -" JobId : %d\n" -" Job : %s\n" -" Niveau de backup : %s%s\n" -" Client : \"%s\" %s\n" -" FileSet : \"%s\" %s\n" -" Pool : \"%s\" (Depuis %s)\n" -" Storage : \"%s\" (Depuis %s)\n" -" Date prévue : %s\n" -" Date de début : %s\n" -" Date de fin : %s\n" -" Temps écoulé : %s\n" -" Priorité : %d\n" -" Fichiers écrits FD : %s\n" -" Fichiers écrits SD : %s\n" -" Octets écrits FD : %s (%so)\n" -" Octets écrits SD : %s (%so)\n" -" Débit : %.1f Ko/s\n" -" Compression logicielle : %s\n" -" Nom des Volumes : %s\n" -" Volume Session Id : %d\n" -" Volume Session date : %d\n" -" Taille du volume : %s (%so)\n" -" Erreurs FD non fatales : %d\n" -" Erreurs du SD : %d\n" -" Statut de fin du FD : %s\n" -" Statut de fin du SD : %s\n" -" Statut de fin : %s\n" - -#: src/dird/verify.c:72 src/dird/verify.c:319 -#, c-format -msgid "Unimplemented Verify level %d(%c)\n" -msgstr "" +#~ msgid " Buffer address: %p\n" +#~ msgstr " Adresse du buffer : %p\n" -#: src/dird/verify.c:136 -msgid "" -"Unable to find JobId of previous InitCatalog Job.\n" -"Please run a Verify with Level=InitCatalog before\n" -"running the current Job.\n" -msgstr "" -"Impossible de trouvé JobId d'un précédent Job \"InitCatalog.\n" -"Il faut lancer un Job Verify avec l'option Level=InitCatalog avant\n" -"de lancer le Job courant.\n" +#~ msgid "Error initializing SSL context" +#~ msgstr "Erreur pendant l'initialisation du contexte SSL" -#: src/dird/verify.c:141 -msgid "Unable to find JobId of previous Job for this client.\n" -msgstr "Impossible de trouver JobId d'un précédent Job pour ce client.\n" +#~ msgid "Error loading certificate file" +#~ msgstr "Erreur dans le chargement du certificat" -#: src/dird/verify.c:158 -#, c-format -msgid "Could not get job record for previous Job. ERR=%s" -msgstr "" +#~ msgid "Error loading private key" +#~ msgstr "Erreur dans le chargement de la clef privée" -#: src/dird/verify.c:164 -#, c-format -msgid "Last Job %d did not terminate normally. JobStatus=%c\n" -msgstr "Le dernier job %d ne s'est pas terminé correctement. JobStatus=%c\n" +#~ msgid "Unable to open DH parameters file" +#~ msgstr "Impossible d'ouvrir le fichier de paramètre DH" -#: src/dird/verify.c:168 -#, c-format -msgid "Verifying against JobId=%d Job=%s\n" -msgstr "" +#~ msgid "Unable to load DH parameters from specified file" +#~ msgstr "" +#~ "Impossible de charger les paramètres DH à partir du fichier spécifié" -#: src/dird/verify.c:207 -#, c-format -msgid "Start Verify JobId=%s Level=%s Job=%s\n" -msgstr "" +#~ msgid "Failed to set TLS Diffie-Hellman parameters" +#~ msgstr "Impossible de positionner les paramètres TLS Diffie-Hellman" -#: src/dird/verify.c:306 -msgid "Deprecated feature ... use bootstrap.\n" -msgstr "" +#~ msgid "Error creating new SSL object" +#~ msgstr "Erreur pendant la création d'un nouvel objet SSL" -#: src/dird/verify.c:373 -#, c-format -msgid "Unimplemented verify level %d\n" -msgstr "" +#~ msgid "Connect failure" +#~ msgstr "Erreur de connexion" -#: src/dird/verify.c:422 -msgid "Verify OK" -msgstr "Vérification OK" +#~ msgid "Running" +#~ msgstr "En cours" -#: src/dird/verify.c:426 -msgid "*** Verify Error ***" -msgstr "*** Erreur de Vérification ***" +#~ msgid "Blocked" +#~ msgstr "Bloqué" -#: src/dird/verify.c:430 -msgid "Verify warnings" -msgstr "" +#, fuzzy +#~ msgid "Incomplete job" +#~ msgstr "valeur octal incomplète" -#: src/dird/verify.c:433 -msgid "Verify Canceled" -msgstr "Vérification annulée" +#~ msgid "Non-fatal error" +#~ msgstr "Erreur non fatale" -#: src/dird/verify.c:436 -msgid "Verify Differences" -msgstr "" +#~ msgid "Canceled" +#~ msgstr "Annulé" -#: src/dird/verify.c:441 -#, c-format -msgid "Inappropriate term code: %d %c\n" -msgstr "" +#~ msgid "Verify differences" +#~ msgstr "Vérification des différences" -#: src/dird/verify.c:455 -#, fuzzy, c-format -msgid "" -"%s %s %s (%s):\n" -" Build OS: %s %s %s\n" -" JobId: %d\n" -" Job: %s\n" -" FileSet: %s\n" -" Verify Level: %s\n" -" Client: %s\n" -" Verify JobId: %d\n" -" Verify Job: %s\n" -" Start time: %s\n" -" End time: %s\n" -" Files Expected: %s\n" -" Files Examined: %s\n" -" Non-fatal FD errors: %d\n" -" FD termination status: %s\n" -" SD termination status: %s\n" -" Termination: %s\n" -"\n" -msgstr "" -"%s %s %s (%s): %s\n" -" Build OS: %s %s %s\n" -" JobId : %d\n" -" Job : %s\n" -" FileSet: %s\n" -" Client : %s\n" -" Début : %s\n" -" Fin : %s\n" -" Fichiers attendus : %s\n" -" Fichiers restaurés : %s\n" -" Octets restaurés : %s\n" -" Débit : %.1f Ko/s\n" -" Erreurs du FD : %d\n" -" Statut de fin du FD : %s\n" -" Statut de fin du SD : %s\n" -" Etat : %s\n" - -#: src/dird/verify.c:490 -#, fuzzy, c-format -msgid "" -"%s %s %s (%s):\n" -" Build: %s %s %s\n" -" JobId: %d\n" -" Job: %s\n" -" FileSet: %s\n" -" Verify Level: %s\n" -" Client: %s\n" -" Verify JobId: %d\n" -" Verify Job: %s\n" -" Start time: %s\n" -" End time: %s\n" -" Files Examined: %s\n" -" Non-fatal FD errors: %d\n" -" FD termination status: %s\n" -" Termination: %s\n" -"\n" -msgstr "" -"%s %s (%s) : %s\n" -" Build: %s %s %s\\n\"\n" -" JobId : %d\n" -" Job : %s\n" -" FileSet : %s\n" -" Client : %s\n" -" Début : %s\n" -" Fin : %s\n" -" Fichiers attendus : %s\n" -" Fichiers restaurés : %s\n" -" Octets restaurés : %s\n" -" Débit : %.1f Ko/s\n" -" Erreurs du FD : %d\n" -" Statut de fin du FD : %s\n" -" Statut de fin du SD : %s\n" -" Etat : %s\n" - -#: src/dird/verify.c:569 -#, c-format -msgid "" -"birdSD.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to parse or to use plugin options, %s\n" +#~ msgstr "Impossible de se connecter à %s sur %s:%d. ERR=%s\n" -#: src/filed/backup.c:176 -msgid "The heartbeat didn't start in time.\n" -msgstr "" +#, fuzzy +#~ msgid "Unknown parameter or bad argument for %s.\n" +#~ msgstr "Mot clef inconnu : %s\n" -#: src/filed/backup.c:190 -#, fuzzy, c-format -msgid "Had %ld acl errors while doing backup\n" -msgstr "Saisir la liste des fichiers à restaurer" +#, fuzzy +#~ msgid "Can't get cluster configuration.\n" +#~ msgstr "La création de la signature a échouée" -#: src/filed/backup.c:196 -#, fuzzy, c-format -msgid "Had %ld xattr errors while doing backup\n" -msgstr "Saisir la liste des fichiers à restaurer" - -#: src/filed/backup.c:323 -#, c-format -msgid " Recursion turned off. Will not descend from %s into %s\n" -msgstr "" - -#: src/filed/backup.c:330 -#, c-format -msgid " %s is a different filesystem. Will not descend from %s into it.\n" -msgstr "" +#, fuzzy +#~ msgid "Can't determine the last WAL file\n" +#~ msgstr "Impossible d'écrire le marqueur EOF. ERR=%s\n" -#: src/filed/backup.c:336 -#, c-format -msgid " Disallowed filesystem. Will not descend from %s into %s\n" -msgstr "" +#, fuzzy +#~ msgid "Can't determine WAL directory\n" +#~ msgstr "Impossible d'ouvrir le fichier inclus : %s. ERR=%s\n" -#: src/filed/backup.c:341 -#, c-format -msgid " Disallowed drive type. Will not descend into %s\n" -msgstr "" +#, fuzzy +#~ msgid "Can't open WAL directory %s. ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier inclus : %s. ERR=%s\n" -#: src/filed/backup.c:352 -#, c-format -msgid " Socket file skipped: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to detect the PostgreSQL data_directory on this system.\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/filed/backup.c:365 -#, c-format -msgid " Could not access \"%s\": ERR=%s\n" -msgstr " Impossible d'acceder à \"%s\" : ERR=%s\n" +#, fuzzy +#~ msgid "Unable to find data_directory=%s on this system. ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/filed/backup.c:372 -#, c-format -msgid " Could not follow link \"%s\": ERR=%s\n" -msgstr " Impossible de suivre le lien \"%s\" : ERR=%s\n" +#, fuzzy +#~ msgid "Unable to start the PITR backup on this system.\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/filed/backup.c:379 -#, c-format -msgid " Could not stat \"%s\": ERR=%s\n" -msgstr " Impossible d'acceder à \"%s\" : ERR=%s\\n\n" +#, fuzzy +#~ msgid "Unable to determine the first WAL file on this system.\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/filed/backup.c:386 src/filed/verify.c:130 -#, c-format -msgid " Unchanged file skipped: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to analyse tablespaces %s on this system. ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/filed/backup.c:389 -#, c-format -msgid " Archive file not saved: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to analyse data_directory %s on this system. ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" -#: src/filed/backup.c:393 -#, c-format -msgid " Could not open directory \"%s\": ERR=%s\n" -msgstr " Impossible d'ouvrir le répertoire \"%s\" : ERR=%s\n" +#, fuzzy +#~ msgid "Can't create the %s file for recovery. ERR=%s\n" +#~ msgstr "Impossible de créer le fichier d'état : %s ERR=%s\n" -#: src/filed/backup.c:402 -#, c-format -msgid " Unknown file type %d; not saved: %s\n" -msgstr " Type de fichier inconnu %d ; non sauvé : %s\n" +#, fuzzy +#~ msgid "3612 JobId=%u waiting because device %s is reserved by: %s.\n" +#~ msgstr "" +#~ "3605 JobId=%u voulait libérer le lecteur, mais le device %s est occupé.\n" -#: src/filed/backup.c:511 -#, c-format -msgid " Cannot open \"%s\": ERR=%s.\n" -msgstr " Impossible d'ouvrir \"%s\" : ERR=%s.\n" +#, fuzzy +#~ msgid "" +#~ "3998 Bad return from storage \"%s\" command: ERR=%s.\n" +#~ "Results=%s\n" +#~ msgstr "" +#~ "3991 Erreur sur l'autochangeur \"loaded drive %d\" : ERR=%s.\n" +#~ "Resultat=%s\n" -#: src/filed/backup.c:690 src/filed/restore.c:1449 -msgid "Windows Encrypted data not supported on this OS.\n" -msgstr "" +#~ msgid "No volumes specified for reading. Job %s canceled.\n" +#~ msgstr "Pas de volume spécifié pour la lecture. Abandon du job %s.\n" -#: src/filed/backup.c:717 -#, c-format -msgid "Read error on file %s. ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Changing read device. Want Media Type=\"%s\" have=\"%s\"\n" +#~ " %s device=%s\n" +#~ msgstr "" +#~ "Changement du Device de lecture. Want Media Type=\"%s\" have=\"%s\"\n" +#~ " device=%s\n" -#: src/filed/backup.c:720 -#, c-format -msgid "Too many errors. JobErrors=%d.\n" -msgstr "" +#, fuzzy +#~ msgid "Job %s canceled.\n" +#~ msgstr "Le job %s est annulé.\n" -#: src/filed/backup.c:730 -msgid "Encryption padding error\n" -msgstr "" +#, fuzzy +#~ msgid "Read open %s device %s Volume \"%s\" failed: ERR=%s\n" +#~ msgstr "Impossible de supprimer le volume \"%s\". ERR=%s" -#: src/filed/backup.c:873 src/filed/backup.c:889 -msgid "Encryption error\n" -msgstr "" +#, fuzzy +#~ msgid "Ready to read from volume \"%s\" on %s device %s.\n" +#~ msgstr "Prêt à lire les données du volume \"%s\" depuis le device %s.\n" -#: src/filed/backup.c:910 -msgid "main thread is stopping because heartbeat thread stopped\n" -msgstr "" +#, fuzzy +#~ msgid "Could not ready %s device %s for append.\n" +#~ msgstr "Impossible d'ouvrir le device %s\n" -#: src/filed/backup.c:967 -msgid "Invalid file flags, no supported data stream type.\n" -msgstr "" +#~ msgid "Could not create JobMedia record for Volume=\"%s\" Job=%s\n" +#~ msgstr "Impossible de créer un JobMedia en base pour le Volume=%s Job=%s\n" -#: src/filed/backup.c:1007 -#, fuzzy, c-format -msgid "Network send error to SD. Data=%s ERR=%s\n" -msgstr "Erreur dans l'exécution de la commande : %s. ERR=%s\n" +#~ msgid "Alert: %s" +#~ msgstr "Alert: %s" -#: src/filed/backup.c:1148 -#, c-format -msgid "Compression deflateParams error: %d\n" -msgstr "" +#~ msgid "Could not initialize %s\n" +#~ msgstr "Impossible d'initialiser %s\n" -#: src/filed/backup.c:1201 -#, fuzzy, c-format -msgid " Cannot open resource fork for \"%s\": ERR=%s.\n" -msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" +#, fuzzy +#~ msgid "Error closing device %s. ERR=%s.\n" +#~ msgstr "Erreur de lecture de %s:%s:%d : ERR=%s\n" -#: src/filed/backup.c:1259 -#, c-format -msgid "Compression deflate error: %d\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot run free space command. Results=%s ERR=%s\n" +#~ msgstr "Impossible de lancer la commande : %s. ERR=%s\n" -#: src/filed/backup.c:1266 -#, c-format -msgid "Compression deflateReset error: %d\n" -msgstr "" +#, fuzzy +#~ msgid "Could not write ANSI VOL1 label. Wanted size=%d got=%d ERR=%s\n" +#~ msgstr "Impossible de créer le fichier d'état. %s ERR=%s\n" -#: src/filed/backup.c:1308 -#, fuzzy, c-format -msgid "Compression LZO error: %d\n" -msgstr "Erreur de décompression. ERR=%d\n" +#~ msgid "Write session label failed. ERR=%s\n" +#~ msgstr "Impossible d'écrire le label de session. ERR=%s\n" -#: src/filed/backup.c:1518 -#, c-format -msgid "VSS Writer (BackupComplete): %s\n" -msgstr "" +#, fuzzy +#~ msgid "Error reading data header from FD. n=%d msglen=%d ERR=%s\n" +#~ msgstr "" +#~ "Erreur pendant l'écriture des données vers le fichier de spool. ERR=%s\n" -#: src/filed/bfdjson.c:68 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bfdjson [-c config_file] [-d debug_level]\n" -" -r get resource type \n" -" -n get resource \n" -" -l get only directives matching dirs (use with -r)\n" -" -D get only data\n" -" -c use as configuration file\n" -" -d set debug level to \n" -" -dt print a timestamp in debug output\n" -" -t test configuration file and exit\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Version : %s (%s)\n" -"\n" -"Usage : bacula-fd [-f -s] [-c config_file] [-d debug_level]\n" -" -c utilise fich comme fichier de configuration\n" -" -d positionne le niveau de debug à nn\n" -" -dt affiche un timestamp sur chaque ligne de debug\n" -" -f reste en avant-plan (pour debugger)\n" -" -g groupid\n" -" -s pas de signaux\n" -" -t test - lit seulement le fichier de configuration\n" -" -u userid\n" -" -v affiche les messages utilisateurs\n" -" -? affiche ce message.\n" -"\n" +#, fuzzy +#~ msgid "Network error reading from FD. ERR=%s\n" +#~ msgstr "Erreur dans l'exécution de la commande : %s. ERR=%s\n" -#: src/filed/bfdjson.c:463 src/filed/filed.c:328 -#, c-format -msgid "" -"No File daemon resource defined in %s\n" -"Without that I don't know who I am :-(\n" -msgstr "" +#, fuzzy +#~ msgid "DDE commit failed. ERR=%s\n" +#~ msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" -#: src/filed/bfdjson.c:468 src/filed/filed.c:333 -#, c-format -msgid "Only one Client resource permitted in %s\n" -msgstr "" +#, fuzzy +#~ msgid "Error writing end session label. ERR=%s\n" +#~ msgstr "" +#~ "Erreur pendant l'écriture des données vers le fichier de spool. ERR=%s\n" -#: src/filed/bfdjson.c:492 src/filed/filed.c:388 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"File daemon in %s.\n" -msgstr "" +#, fuzzy +#~ msgid "Set ok=FALSE after write_final_block_to_device.\n" +#~ msgstr "Erreur pendant l'écriture du fichier bsr.\n" -#: src/filed/bfdjson.c:504 src/filed/filed.c:423 -#, c-format -msgid "" -"\"PKI Key Pair\" must be defined for File daemon \"%s\" in %s if either " -"\"PKI Sign\" or \"PKI Encrypt\" are enabled.\n" -msgstr "" +#, fuzzy +#~ msgid "Elapsed time=%02d:%02d:%02d, Transfer rate=%s Bytes/second\n" +#~ msgstr "" +#~ "Temps d'écriture du job = %02d:%02d:%02d, Taux de transfert = %s o/s\n" -#: src/filed/bfdjson.c:517 src/filed/filed.c:538 -#, c-format -msgid "No Director resource defined in %s\n" -msgstr "" +#~ msgid "Error getting Volume info: %s" +#~ msgstr "Erreur pendant la récupération des informations sur un Volume : %s" -#: src/filed/crypto.c:37 -msgid "Encrypting sparse or offset data not supported.\n" -msgstr "" +#~ msgid "Job %s canceled while waiting for mount on Storage Device \"%s\".\n" +#~ msgstr "" +#~ "Le job %s a été annulé alors qu'il attendait un montage sur le Storage " +#~ "Device \"%s\".\n" -#: src/filed/crypto.c:44 #, fuzzy -msgid "Failed to initialize encryption context.\n" -msgstr "Impossible d'initialiser le contexte TLS pour la Console \"%s\".\n" +#~ msgid "" +#~ "Job %s is waiting. Cannot find any appendable volumes.\n" +#~ "Please use the \"label\" command to create a new Volume for:\n" +#~ " Storage: %s\n" +#~ " Pool: %s\n" +#~ " Media type: %s\n" +#~ msgstr "" +#~ "Le Job %s est en attente. Bacula n'a pas pu trouver de media disponible.\n" +#~ "Merci de créer un nouveau volume via la commande \"label\" pour :\n" +#~ " Storage : %s\n" +#~ " Type du Media : %s\n" +#~ " Pool : %s\n" -#: src/filed/crypto.c:117 -#, c-format -msgid "%s signature digest initialization failed\n" -msgstr "" +#~ msgid "Job %s canceled while waiting for mount on Storage Device %s.\n" +#~ msgstr "" +#~ "Le Job %s a été annulé pendant qu'il attendait le montage sur le Storage " +#~ "Device %s.\n" -#: src/filed/crypto.c:147 #, fuzzy -msgid "Unsupported cipher on this system.\n" -msgstr "Le cipher spécifié est non supporté\n" - -#: src/filed/crypto.c:153 src/filed/crypto.c:162 -msgid "An error occurred while encrypting the stream.\n" -msgstr "" +#~ msgid "" +#~ "%sPlease mount append Volume \"%s\" or label a new one for:\n" +#~ " Job: %s\n" +#~ " Storage: %s\n" +#~ " Pool: %s\n" +#~ " Media type: %s\n" +#~ msgstr "" +#~ "Le Job %s est en attente. Bacula n'a pas pu trouver de media disponible.\n" +#~ "Merci de créer un nouveau volume via la commande \"label\" pour :\n" +#~ " Storage : %s\n" +#~ " Type du Media : %s\n" +#~ " Pool : %s\n" -#: src/filed/crypto.c:225 #, fuzzy -msgid "Failed to allocate memory for crypto signature.\n" -msgstr "Impossible de se connecter au Director\n" +#~ msgid "" +#~ "%sPlease mount read Volume \"%s\" for:\n" +#~ " Job: %s\n" +#~ " Storage: %s\n" +#~ " Pool: %s\n" +#~ " Media type: %s\n" +#~ msgstr "" +#~ "Le Job %s est en attente. Bacula n'a pas pu trouver de media disponible.\n" +#~ "Merci de créer un nouveau volume via la commande \"label\" pour :\n" +#~ " Storage : %s\n" +#~ " Type du Media : %s\n" +#~ " Pool : %s\n" -#: src/filed/crypto.c:230 #, fuzzy -msgid "An error occurred while adding signer the stream.\n" -msgstr "Impossible d'ouvrir le fichier de données %s.\n" +#~ msgid "" +#~ "Incorrect password given by Director.\n" +#~ "For help, please see: " +#~ msgstr "Password incorrect donné par le Director à %s.\n" -#: src/filed/crypto.c:236 src/filed/crypto.c:251 -msgid "An error occurred while signing the stream.\n" -msgstr "" +#, fuzzy +#~ msgid "TLS negotiation failed with DIR at \"%s:%d\"\n" +#~ msgstr "Négociation TLS échouée avec le SD \"%s:%d\".\n" -#: src/filed/crypto.c:275 -msgid "An error occurred finalizing signing the stream.\n" -msgstr "" +#, fuzzy +#~ msgid "TLS negotiation failed with FD at \"%s:%d\"\n" +#~ msgstr "Négociation TLS échouée avec le FD \"%s:%d\".\n" -#: src/filed/dedupfiled.c:88 -#, c-format -msgid "Quarantine, got ACK for unknown block #%08x\n" -msgstr "" +#, fuzzy +#~ msgid "No slot defined in catalog (slot=%d) for Volume \"%s\" on %s.\n" +#~ msgstr "Demande de labélisation du volume \"%s\" Slot %d...\n" -#: src/filed/dedupfiled.c:100 -#, c-format -msgid "Quarantine, got request for unknown block #%08x\n" -msgstr "" +#~ msgid "3304 Issuing autochanger \"load slot %d, drive %d\" command.\n" +#~ msgstr "" +#~ "3304 Envoi de la commande \"load slot %d, drive %d\" à l'autochangeur.\n" -#: src/filed/dedupfiled.c:130 -#, c-format -msgid "Quarantine, got unexpected command %d len=%d \"%s\" \n" -msgstr "" +#~ msgid "3305 Autochanger \"load slot %d, drive %d\", status is OK.\n" +#~ msgstr "3305 Autochangeur \"load slot %d, drive %d\", le résultat est OK.\n" -#: src/filed/dedupfiled.c:332 -#, c-format -msgid "DEDUP SD didn't found #%08x, use zeroes instead\n" -msgstr "" +#~ msgid "" +#~ "3992 Bad autochanger \"load slot %d, drive %d\": ERR=%s.\n" +#~ "Results=%s\n" +#~ msgstr "" +#~ "3992 Erreur sur l'autochangeur \"load slot %d, drive %d\" : ERR=%s.\n" +#~ "Resultat=%s\n" -#: src/filed/dedupfiled.c:338 -#, c-format -msgid "DEDUP got a BNET_CMD_UNK_HASH but don't know the hash #%08x.\n" -msgstr "" +#~ msgid "3301 Issuing autochanger \"loaded? drive %d\" command.\n" +#~ msgstr "3301 Envoi de la commande \"loaded? drive %d\" à l'autochangeur.\n" -#: src/filed/dedupfiled.c:368 -#, c-format -msgid "DEDUP got a BNET_CMD_STO_BLOCK but don't know the hash #%08x.\n" -msgstr "" +#~ msgid "3302 Autochanger \"loaded? drive %d\", result is Slot %d.\n" +#~ msgstr "3302 Autochangeur \"loaded drive %d\", le resultat est Slot %d.\n" -#: src/filed/fd_plugins.c:546 src/filed/fd_plugins.c:690 -#, c-format -msgid "Command plugin \"%s\": no type in startBackupFile packet.\n" -msgstr "" +#~ msgid "3302 Autochanger \"loaded? drive %d\", result: nothing loaded.\n" +#~ msgstr "3302 Autochangeur \"loaded drive %d\", résultat : lecteur vide.\n" -#: src/filed/fd_plugins.c:559 -#, c-format -msgid "Command plugin \"%s\": no object_name in startBackupFile packet.\n" -msgstr "" +#~ msgid "" +#~ "3991 Bad autochanger \"loaded? drive %d\" command: ERR=%s.\n" +#~ "Results=%s\n" +#~ msgstr "" +#~ "3991 Erreur sur l'autochangeur \"loaded drive %d\" : ERR=%s.\n" +#~ "Resultat=%s\n" -#: src/filed/fd_plugins.c:572 src/filed/fd_plugins.c:697 -#, c-format -msgid "Command plugin \"%s\": no fname in startBackupFile packet.\n" -msgstr "" +#, fuzzy +#~ msgid "Lock failure on autochanger. ERR=%s\n" +#~ msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" -#: src/filed/fd_plugins.c:771 #, fuzzy -msgid "Plugin save packet not found.\n" -msgstr "le client \"%s\" est introuvable.\n" +#~ msgid "Unlock failure on autochanger. ERR=%s\n" +#~ msgstr "rwl_writeunlock en échec sur %s:%d :. ERR=%s\n" -#: src/filed/fd_plugins.c:906 -#, c-format -msgid "Plugin=%s not found.\n" -msgstr "Plugin=%s non trouvé.\n" +#~ msgid "3307 Issuing autochanger \"unload slot %d, drive %d\" command.\n" +#~ msgstr "" +#~ "3307 Envoi de la commande \"unload slot %d, drive %d\" à l'autochangeur.\n" -#: src/filed/fd_plugins.c:973 -#, c-format -msgid "Plugin createFile call failed. Stat=%d file=%s\n" -msgstr "" +#~ msgid "" +#~ "3995 Bad autochanger \"unload slot %d, drive %d\": ERR=%s\n" +#~ "Results=%s\n" +#~ msgstr "" +#~ "3995 Erreur sur l'autochangeur \"unload slot %d, drive %d\" : ERR=%s.\n" +#~ "Resultat=%s\n" -#: src/filed/fd_plugins.c:978 -#, c-format -msgid "Plugin createFile call failed. Returned CF_ERROR file=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Volume \"%s\" wanted on %s is in use by device %s\n" +#~ msgstr "Le volume \"%s\" est utilisé par le device %s\n" -#: src/filed/fd_plugins.c:1008 src/findlib/create_file.c:220 -#, c-format -msgid "Could not create %s: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "3997 Bad autochanger \"unload slot %d, drive %d\": ERR=%s.\n" +#~ msgstr "" +#~ "3995 Erreur sur l'autochangeur \"unload slot %d, drive %d\" : ERR=%s.\n" -#: src/filed/fd_plugins.c:1875 -msgid "Command plugin: no fname in baculaCheckChanges packet.\n" -msgstr "" +#~ msgid "3993 Device %s not an autochanger device.\n" +#~ msgstr "3993 Le Device %s n'est pas un autochangeur.\n" -#: src/filed/fd_snapshot.c:939 -#, fuzzy, c-format -msgid "Error while creating command string %s.\n" -msgstr "Erreur pendant l'initialisation du contexte SSL" +#~ msgid "3306 Issuing autochanger \"%s\" command.\n" +#~ msgstr "3306 Envoi de la commande \"%s\" à l'autochangeur.\n" -#: src/filed/fd_snapshot.c:959 -#, fuzzy, c-format -msgid "Error while executing \"%s\" %s. %s %s\n" -msgstr "Entrez le nombre de départ : " +#~ msgid "Autochanger error: ERR=%s\n" +#~ msgstr "Erreur sur l'autochangeur : ERR=%s\n" -#: src/filed/fd_snapshot.c:970 -msgid "Unable to parse snapshot command output\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bcopy [-d debug_level] \n" +#~ " -b bootstrap specify a bootstrap file\n" +#~ " -c specify a Storage configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -i specify input Volume names (separated by |)\n" +#~ " -o specify output Volume names (separated by |)\n" +#~ " -p proceed inspite of errors\n" +#~ " -v verbose\n" +#~ " -w specify working directory (default /tmp)\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Version : %s (%s)\n" +#~ "\n" +#~ "Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c utilise fich comme fichier de configuration\n" +#~ " -dnn positionne le niveau de debug à nn\n" +#~ " -f reste en avant-plan (pour debugger)\n" +#~ " -g groupid\n" +#~ " -r lance maintenant\n" +#~ " -s pas de signaux\n" +#~ " -t test - lit seulement le fichier de configuration\n" +#~ " -u userid\n" +#~ " -v affiche les messages utilisateurs\n" +#~ " -? affiche ce message.\n" +#~ "\n" -#: src/filed/fd_snapshot.c:1104 -#, fuzzy, c-format -msgid "Unable to create snapshot record. ERR=%s\n" -msgstr "Impossible de récupérer le Pool depuis le catalogue : ERR=%s" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bextract \n" +#~ " -b specify a bootstrap file\n" +#~ " -c specify a Storage configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -T send debug traces to trace file\n" +#~ " -e exclude list\n" +#~ " -i include list\n" +#~ " -p proceed inspite of I/O errors\n" +#~ " -t read data from volume, do not write anything\n" +#~ " -v verbose\n" +#~ " -V specify Volume names (separated by |)\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "Copyright (C) 2000-2015 Kern Sibbald\n" +#~ "Version : %s (%s)\n" +#~ "\n" +#~ "Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c utilise fich comme fichier de configuration\n" +#~ " -dnn positionne le niveau de debug à nn\n" +#~ " -f reste en avant-plan (pour debugger)\n" +#~ " -g groupid\n" +#~ " -r lance maintenant\n" +#~ " -s pas de signaux\n" +#~ " -t test - lit seulement le fichier de configuration\n" +#~ " -u userid\n" +#~ " -v affiche les messages utilisateurs\n" +#~ " -? affiche ce message.\n" +#~ "\n" -#: src/filed/fd_snapshot.c:1108 -#, fuzzy, c-format -msgid "Unable to create snapshot record, got %s\n" -msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" +#~ msgid "%s must be a directory.\n" +#~ msgstr "%s doit être un répertoire.\n" -#: src/filed/fd_snapshot.c:1125 -#, fuzzy, c-format -msgid "Unable to delete snapshot record. ERR=%s\n" -msgstr "Impossible de récupérer le Pool depuis le catalogue : ERR=%s" +#~ msgid "%u files restored.\n" +#~ msgstr "%u fichiers restaurés.\n" -#: src/filed/fd_snapshot.c:1129 -#, fuzzy, c-format -msgid "Unable to delete snapshot record, got %s\n" -msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" +#, fuzzy +#~ msgid "Found %s error%s\n" +#~ msgstr "Erreur de config : %s\n" -#: src/filed/fd_snapshot.c:1153 -#, fuzzy, c-format -msgid "Unable to get snapshot record. ERR=%s\n" -msgstr "Impossible de récupérer le Pool depuis le catalogue : ERR=%s" +#, fuzzy +#~ msgid "%s was deleted.\n" +#~ msgstr "Pas de job sélectionné.\n" -#: src/filed/fd_snapshot.c:1157 -#, fuzzy, c-format -msgid "Unable to get snapshot record, got %s\n" -msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" +#~ msgid "Uncompression error. ERR=%d\n" +#~ msgstr "Erreur de décompression. ERR=%d\n" -#: src/filed/fd_snapshot.c:1162 #, fuzzy -msgid "Unable to parse command output\n" -msgstr "Impossible de se connecter au Client.\n" - -#: src/filed/fd_snapshot.c:1342 -msgid "Un-Quiescing applications\n" -msgstr "" +#~ msgid "LZO uncompression error. ERR=%d\n" +#~ msgstr "Erreur de décompression. ERR=%d\n" -#: src/filed/fd_snapshot.c:1354 -msgid "Quiescing applications\n" -msgstr "" +#, fuzzy +#~ msgid "Error writing final JobMedia record to catalog.\n" +#~ msgstr "Erreur pendant l'écriture du fichier bsr.\n" -#: src/filed/fd_snapshot.c:1391 -#, c-format -msgid " Delete Snapshot for %s\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot write block. Device at EOM. dev=%s\n" +#~ msgstr "Impossible d'écrire un bloc. Le Device est au bout EOM.\n" -#: src/filed/fd_snapshot.c:1394 -#, fuzzy, c-format -msgid " Unable to delete snapshot of %s ERR=%s\n" -msgstr "Impossible de se connecter à %s sur %s:%d. ERR=%s\n" +#~ msgid "Unable to write EOF. ERR=%s\n" +#~ msgstr "Impossible d'écrire le marqueur EOF. ERR=%s\n" -#: src/filed/fd_snapshot.c:1430 -#, fuzzy, c-format -msgid " Create Snapshot for %s\n" -msgstr "Erreur durant la création des snapshots VSS.\n" +#~ msgid "Write error at %u:%u on device %s. ERR=%s.\n" +#~ msgstr "Erreur d'écriture à %u:%u sur le device %s. ERR=%s\n" -#: src/filed/fd_snapshot.c:1438 -#, fuzzy, c-format -msgid " Unable to create snapshot of %s ERR=%s\n" -msgstr "Impossible de se connecter à %s sur %s:%d. ERR=%s\n" +#, fuzzy +#~ msgid "" +#~ "Out of freespace caused End of Volume \"%s\" at %u:%u on device %s. Write " +#~ "of %u bytes got %d.\n" +#~ msgstr "" +#~ "Fin du volume \"%s\" à %u:%u sur le device %s. Ecriture de %u octets, eu " +#~ "%d.\n" -#: src/filed/filed.c:52 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bacula-fd [-f -s] [-c config_file] [-d debug_level]\n" -" -c use as configuration file\n" -" -d [,] set debug level to , debug tags to \n" -" -dt print a timestamp in debug output\n" -" -f run in foreground (for debugging)\n" -" -g groupid\n" -" -k keep readall capabilities\n" -" -m print kaboom output (for debugging)\n" -" -s no signals (for debugging)\n" -" -t test configuration file and exit\n" -" -T set trace on\n" -" -u userid\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Version : %s (%s)\n" -"\n" -"Usage : bacula-fd [-f -s] [-c config_file] [-d debug_level]\n" -" -c utilise fich comme fichier de configuration\n" -" -d positionne le niveau de debug à nn\n" -" -dt affiche un timestamp sur chaque ligne de debug\n" -" -f reste en avant-plan (pour debugger)\n" -" -g groupid\n" -" -s pas de signaux\n" -" -t test - lit seulement le fichier de configuration\n" -" -u userid\n" -" -v affiche les messages utilisateurs\n" -" -? affiche ce message.\n" -"\n" +#~ msgid "" +#~ "End of Volume \"%s\" at %u:%u on device %s. Write of %u bytes got %d.\n" +#~ msgstr "" +#~ "Fin du volume \"%s\" à %u:%u sur le device %s. Ecriture de %u octets, eu " +#~ "%d.\n" -#: src/filed/filed.c:185 -msgid "-k option has no meaning without -u option.\n" -msgstr "" +#, fuzzy +#~ msgid "Job failed or canceled.\n" +#~ msgstr "Le job %d est annulé.\n" -#: src/filed/filed.c:361 src/filed/filed.c:560 -#, fuzzy, c-format -msgid "Disable Command \"%s\" not found.\n" -msgstr "le client \"%s\" est introuvable.\n" +#, fuzzy +#~ msgid "Unable to open device part=%d %s: ERR=%s\n" +#~ msgstr "3910 Impossible d'ouvrir le device %s : ERR=%s\n" -#: src/filed/filed.c:412 -msgid "PKI encryption/signing enabled but not compiled into Bacula.\n" -msgstr "" +#, fuzzy +#~ msgid "The Volume=%s on device=%s appears to be unlabeled.\n" +#~ msgstr "Le volume sur %s possède un mauvais label Bacula : %x\n" -#: src/filed/filed.c:435 src/filed/filed.c:466 src/filed/filed.c:516 #, fuzzy -msgid "Failed to allocate a new keypair object.\n" -msgstr "Impossible de se connecter au Director\n" +#~ msgid "Read zero %sbytes Vol=%s at %lld on device %s.\n" +#~ msgstr "Prêt à lire les données du volume \"%s\" depuis le device %s.\n" -#: src/filed/filed.c:439 -#, c-format -msgid "Failed to load public certificate for File daemon \"%s\" in %s.\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "User defined maximum volume size %s will be exceeded on device %s.\n" +#~ " Marking Volume \"%s\" as Full.\n" +#~ msgstr "" +#~ "Nombre maximum de job sur le volume atteind. Marquage du volume \"%s\" " +#~ "comme Used.\n" -#: src/filed/filed.c:445 -#, c-format -msgid "Failed to load private key for File daemon \"%s\" in %s.\n" -msgstr "" +#~ msgid "Re-read last block at EOT failed. ERR=%s" +#~ msgstr "Erreur sur la re-lecture du dernier bloc en EOT. ERR=%s" -#: src/filed/filed.c:475 -#, c-format -msgid "Failed to load private key from file %s for File daemon \"%s\" in %s.\n" -msgstr "" +#~ msgid "Re-read of last block succeeded.\n" +#~ msgstr "La re-lecture du dernier bloc écrit a réussi.\n" -#: src/filed/filed.c:482 -#, c-format -msgid "" -"Failed to load trusted signer certificate from file %s for File daemon \"%s" -"\" in %s.\n" -msgstr "" +#, fuzzy +#~ msgid "Error sending Volume info to Director.\n" +#~ msgstr "Erreur pendant la récupération des informations sur un Volume : %s" -#: src/filed/filed.c:522 -#, c-format -msgid "" -"Failed to load master key certificate from file %s for File daemon \"%s\" in " -"%s.\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bls [options] \n" +#~ " -b specify a bootstrap file\n" +#~ " -c specify a Storage configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -e exclude list\n" +#~ " -i include list\n" +#~ " -j list jobs\n" +#~ " -k list blocks\n" +#~ " (no j or k option) list saved files\n" +#~ " -L dump label\n" +#~ " -p proceed inspite of errors\n" +#~ " -v be verbose\n" +#~ " -V specify Volume names (separated by |)\n" +#~ " -E Check records to detect errors\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "Copyright (C) 2000-2015 Kern Sibbald\n" +#~ "Version : %s (%s)\n" +#~ "\n" +#~ "Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c utilise fich comme fichier de configuration\n" +#~ " -dnn positionne le niveau de debug à nn\n" +#~ " -f reste en avant-plan (pour debugger)\n" +#~ " -g groupid\n" +#~ " -r lance maintenant\n" +#~ " -s pas de signaux\n" +#~ " -t test - lit seulement le fichier de configuration\n" +#~ " -u userid\n" +#~ " -v affiche les messages utilisateurs\n" +#~ " -? affiche ce message.\n" +#~ "\n" -#: src/filed/filed_conf.c:200 src/filed/filed_conf.c:224 -#, fuzzy, c-format -msgid "Expected a Cipher Type keyword, got: %s" -msgstr "Attendait le mot clef FileSet, eu : %s" +#~ msgid "Block: %d size=%d\n" +#~ msgstr "Bloc : %d taille=%d\n" -#: src/filed/hello.c:79 src/stored/hello.c:102 -#, fuzzy, c-format -msgid "Bad Hello command from Director at %s. Len=%d.\n" -msgstr "Connexion invalide. Len=%d\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bscan [ options ] \n" +#~ " -b bootstrap specify a bootstrap file\n" +#~ " -c specify configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -m update media info in database\n" +#~ " -D specify the driver database name (default NULL)\n" +#~ " -n specify the database name (default bacula)\n" +#~ " -u specify database user name (default bacula)\n" +#~ " -P specify database password (default none)\n" +#~ " -h specify database host (default NULL)\n" +#~ " -t specify database port (default 0)\n" +#~ " -p proceed inspite of I/O errors\n" +#~ " -r list records\n" +#~ " -s synchronize or store in database\n" +#~ " -S show scan progress periodically\n" +#~ " -v verbose\n" +#~ " -V specify Volume names (separated by |)\n" +#~ " -w specify working directory (default from conf " +#~ "file)\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "Copyright (C) 2000-2015 Kern Sibbald\n" +#~ "Version : %s (%s)\n" +#~ "\n" +#~ "Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c utilise fich comme fichier de configuration\n" +#~ " -dnn positionne le niveau de debug à nn\n" +#~ " -f reste en avant-plan (pour debugger)\n" +#~ " -g groupid\n" +#~ " -r lance maintenant\n" +#~ " -s pas de signaux\n" +#~ " -t test - lit seulement le fichier de configuration\n" +#~ " -u userid\n" +#~ " -v affiche les messages utilisateurs\n" +#~ " -? affiche ce message.\n" +#~ "\n" -#: src/filed/hello.c:93 src/stored/hello.c:116 -#, fuzzy, c-format -msgid "Bad Hello command from Director at %s: %s\n" -msgstr "Début de purge des jobs du client \"%s\"\n" +#, fuzzy +#~ msgid "First Volume Size = %s\n" +#~ msgstr "Le nombre courant de fichier sur le Volume est : %u\n" -#: src/filed/hello.c:111 -#, c-format -msgid "Connection from unknown Director %s at %s rejected.\n" -msgstr "" -"Connexion d'un Director inconnu %s à %s rejeté.\n" -"\n" +#, fuzzy +#~ msgid "Could not get Client record. ERR=%s\n" +#~ msgstr "Impossible d'initialiser la queue cliente : ERR=%s\n" -#: src/filed/hello.c:145 #, fuzzy -msgid "SD connect failed: Bad Hello command\n" -msgstr "Le director a rejeté la commande Hello\n" +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bsdjson [options] [-c config_file] [config_file]\n" +#~ " -r get resource type \n" +#~ " -n get resource \n" +#~ " -l get only directives matching dirs (use with -r)\n" +#~ " -D get only data\n" +#~ " -c use as configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -t test - read config and exit\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Version : %s (%s)\n" +#~ "\n" +#~ "Usage : stored [options] [-c config_file] [config_file]\n" +#~ " -c utilise fich comme fichier de configuration\n" +#~ " -dnn positionne le niveau de debug à nn\n" +#~ " -dt affiche un timestamp devant chaque ligne de debug\n" +#~ " -f reste en avant-plan (pour debugger)\n" +#~ " -g groupid\n" +#~ " -p continue même en cas d'erreurs E/S\n" +#~ " -s pas de signaux\n" +#~ " -t test - lit seulement le fichier de configuration\n" +#~ " -u userid\n" +#~ " -v affiche les messages utilisateurs\n" +#~ " -? affiche ce message.\n" +#~ "\n" -#: src/filed/hello.c:153 -#, fuzzy, c-format -msgid "SD connect failed: Job name not found: %s\n" -msgstr "Job non trouvé : %s\n" +#~ msgid "Enter Volume Name: " +#~ msgstr "Saisissez un nom de Volume : " -#: src/filed/hello.c:164 -#, fuzzy, c-format -msgid "SD \"%s\" tried to connect two times.\n" -msgstr "Impossible de se connecter au Client.\n" +#~ msgid "Device open failed. ERR=%s\n" +#~ msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" -#: src/filed/hello.c:269 src/filed/hello.c:271 src/stored/hello.c:500 -#: src/stored/hello.c:502 -#, fuzzy, c-format -msgid "Recv caps from SD failed. ERR=%s\n" -msgstr "fopen %s en erreur : ERR=%s\n" +#~ msgid "Volume has no label.\n" +#~ msgstr "Le Volume n'a pas de label.\n" -#: src/filed/hello.c:277 src/stored/hello.c:508 -#, fuzzy, c-format -msgid "Bad caps from SD: %s.\n" -msgstr "Début de purge des jobs du client \"%s\"\n" +#, fuzzy +#~ msgid "Volume type error: ERR=%s\n" +#~ msgstr "erreur de fermeture : ERR=%s\n" -#: src/filed/hello.c:278 src/stored/hello.c:509 -#, fuzzy, c-format -msgid "Bad caps from SD: %s\n" -msgstr "Début de purge des jobs du client \"%s\"\n" +#~ msgid "Status:\n" +#~ msgstr "Statut :\n" -#: src/filed/job.c:322 -#, fuzzy, c-format -msgid "Command: \"%s\" is disabled.\n" -msgstr "Commande annulée.\n" +#~ msgid "Do you want to continue? (y/n): " +#~ msgstr "Voulez vous continuer ? (y/n) : " -#: src/filed/job.c:491 -#, fuzzy, c-format -msgid "Bad command from %s. Len=%d.\n" -msgstr "Connexion invalide. Len=%d\n" +#~ msgid "Command aborted.\n" +#~ msgstr "Commande annulée.\n" -#: src/filed/job.c:552 -msgid "2902 Error scanning cancel command.\n" -msgstr "2902 Erreur dans le décodage de la commande d'annulation.\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Error writing record to block.\n" +#~ msgstr "Erreur pendant l'écriture du fichier bsr.\n" -#: src/filed/job.c:556 src/filed/job.c:595 -#, c-format -msgid "2901 Job %s not found.\n" -msgstr "2901 Le job %s est introuvable.\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Error writing block to device.\n" +#~ msgstr "Erreur pendant l'écriture du fichier bsr.\n" -#: src/filed/job.c:566 -#, fuzzy, c-format -msgid "2001 Job \"%s\" marked to be %s.\n" -msgstr "2001 Le job %s va être annulé.\n" +#, fuzzy +#~ msgid "Wrote %d blocks of %d bytes.\n" +#~ msgstr "Ecriture de 1000 blocs de %d octets.\n" -#: src/filed/job.c:589 -#, fuzzy, c-format -msgid "2991 Bad setbandwidth command: %s\n" -msgstr "2991 Erreur dans la commande setdebug : %s\n" +#, fuzzy +#~ msgid "%d blocks re-read correctly.\n" +#~ msgstr "1000 blocs relus correctement.\n" -#: src/filed/job.c:645 -#, c-format -msgid "2991 Bad setdebug command: %s\n" -msgstr "2991 Erreur dans la commande setdebug : %s\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "This command simulates Bacula writing to a tape.\n" +#~ "It requires either one or two blank tapes, which it\n" +#~ "will label and write.\n" +#~ "\n" +#~ "If you have an autochanger configured, it will use\n" +#~ "the tapes that are in slots 1 and 2, otherwise, you will\n" +#~ "be prompted to insert the tapes when necessary.\n" +#~ "\n" +#~ "It will print a status approximately\n" +#~ "every 322 MB, and write an EOF every %s. If you have\n" +#~ "selected the simple test option, after writing the first tape\n" +#~ "it will rewind it and re-read the last block written.\n" +#~ "\n" +#~ "If you have selected the multiple tape test, when the first tape\n" +#~ "fills, it will ask for a second, and after writing a few more \n" +#~ "blocks, it will stop. Then it will begin re-reading the\n" +#~ "two tapes.\n" +#~ "\n" +#~ "This may take a long time -- hours! ...\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Cette commande simule l'écriture d'une bande par Bacula.\n" +#~ "Ce test requiert une ou deux bandes vierges qui vont être\n" +#~ "labélisées et écrites.\n" +#~ "\n" +#~ "Si vous avez configuré un autochangeur, il utilisera les bandes\n" +#~ "des slots 1 et 2, sinon, le programme vous demandera d'insérer\n" +#~ "les bandes quand cela sera nécessaire.\n" +#~ "\n" +#~ "L'état d'avancement sera affiché tous les 322 Mo, et un EOF sera \n" +#~ "écrit tous les 3,2 Go. Si vous avez choisi le test simple, après avoir\n" +#~ "rempli la bande, elle sera rembobinée et le dernier bloc écrit sera\n" +#~ "relu.\n" +#~ "\n" +#~ "Si vous avez choisi le test multi-bande, quand la première bande sera\n" +#~ "remplie vous devrez insérer la nouvelle et après l'écriture de quelques\n" +#~ "blocs les deux bandes seront relues.\n" +#~ "\n" +#~ "Ce test peut durer longtemps (voir des heures).\n" -#: src/filed/job.c:695 -#, c-format -msgid "Bad estimate command: %s" -msgstr "" +#~ msgid "" +#~ "Do you want to run the simplified test (s) with one tape\n" +#~ "or the complete multiple tape (m) test: (s/m) " +#~ msgstr "" +#~ "Voulez vous lancer le test simplifié (s) utilisant une seule bande\n" +#~ "ou bien le test multi-bande complet (m) : (s/m) " -#: src/filed/job.c:696 -msgid "2992 Bad estimate command.\n" -msgstr "" +#~ msgid "Simple test (single tape) selected.\n" +#~ msgstr "Sélection du test simplifié (utilisant une seule bande).\n" -#: src/filed/job.c:719 -#, c-format -msgid "Bad Job Command: %s" -msgstr "" +#~ msgid "Multiple tape test selected.\n" +#~ msgstr "Sélection du test multiple.\n" -#: src/filed/job.c:759 -#, c-format -msgid "Bad RunBeforeJob command: %s\n" -msgstr "" +#~ msgid "Wrote Start of Session label.\n" +#~ msgstr "Ecriture du label de début de session.\n" -#: src/filed/job.c:760 src/filed/job.c:779 -msgid "2905 Bad RunBeforeJob command.\n" -msgstr "" +#, fuzzy +#~ msgid "Flush block failed.\n" +#~ msgstr "Flush de %s blocs, écriture de EOF\n" -#: src/filed/job.c:790 -msgid "2905 Bad RunBeforeNow command.\n" -msgstr "" +#, fuzzy +#~ msgid "Wrote block=%u, file,blk=%u,%u VolBytes=%s rate=%sB/s\n" +#~ msgstr "Ecriture blk_block=%u, dev_blk_num=%u VolBytes=%s rate=%.1f KB/s\n" -#: src/filed/job.c:809 -#, c-format -msgid "Bad RunAfter command: %s\n" -msgstr "" +#~ msgid "%s Flush block, write EOF\n" +#~ msgstr "Flush de %s blocs, écriture de EOF\n" -#: src/filed/job.c:810 -msgid "2905 Bad RunAfterJob command.\n" -msgstr "" +#, fuzzy +#~ msgid "Wrote 1000 blocks on second tape. Done.\n" +#~ msgstr "Ecriture de 1000 blocs de %d octets.\n" -#: src/filed/job.c:846 -#, c-format -msgid "Bad RunScript command: %s\n" -msgstr "Erreur dans la commande RunScript : %s\n" +#, fuzzy +#~ msgid "Job canceled.\n" +#~ msgstr "Le job %s est annulé.\n" -#: src/filed/job.c:847 -msgid "2905 Bad RunScript command.\n" -msgstr "2905 Erreur sur la commande RunScript.\n" +#~ msgid "Wrote End of Session label.\n" +#~ msgstr "Ecriture du label de fin de session.\n" -#: src/filed/job.c:902 -#, fuzzy, c-format -msgid "Bad RestoreObject command: %s\n" -msgstr "Erreur dans la commande RunScript : %s\n" +#~ msgid "Wrote state file last_block_num1=%d last_block_num2=%d\n" +#~ msgstr "Ecriture du fichier d'état last_block_num1=%d last_block_num2=%d\n" + +#~ msgid "Could not create state file: %s ERR=%s\n" +#~ msgstr "Impossible de créer le fichier d'état : %s ERR=%s\n" -#: src/filed/job.c:967 #, fuzzy -msgid "2909 Bad RestoreObject command.\n" -msgstr "2905 Erreur sur la commande RunScript.\n" +#~ msgid "do_unfill failed.\n" +#~ msgstr "Job échoué.\n" -#: src/filed/job.c:1064 -#, c-format -msgid "Plugin Directory not defined. Cannot use plugin: \"%s\"\n" -msgstr "" +#, fuzzy +#~ msgid "%s: Error during test.\n" +#~ msgstr "Erreur pendant l'envoi de la liste d'inclusion.\n" -#: src/filed/job.c:1106 -#, c-format -msgid "Error running program: %s. stat=%d: ERR=%s\n" -msgstr "Erreur dans l'exécution de la commande : %s. stat=%d: ERR=%s\n" +#~ msgid "" +#~ "\n" +#~ "Could not find the state file: %s ERR=%s\n" +#~ "You must redo the fill command.\n" +#~ msgstr "" +#~ "\n" +#~ "Impossible de trouver le fichier d'état : %s ERR=%s\n" +#~ "Vous devez relancer la commande \"fill\".\n" -#: src/filed/job.c:1117 -#, c-format -msgid "Cannot open FileSet input file: %s. ERR=%s\n" -msgstr "" +#~ msgid "Mount first tape. Press enter when ready: " +#~ msgstr "Chargez la première bande et appuyez sur \"Entrée\" : " -#: src/filed/job.c:1271 -#, c-format -msgid "REGEX %s compile error. ERR=%s\n" -msgstr "" +#~ msgid "Rewinding.\n" +#~ msgstr "Rembobinage.\n" -#: src/filed/job.c:1422 -#, c-format -msgid "Invalid FileSet command: %s\n" -msgstr "" +#~ msgid "Reading the first 10000 records from %u:%u.\n" +#~ msgstr "Lecture des 10000 premiers enregistrements depuis %u:%u.\n" -#: src/filed/job.c:1708 src/findlib/match.c:205 src/tools/testfind.c:640 -#, c-format -msgid "Unknown include/exclude option: %c\n" -msgstr "" +#~ msgid "Reposition from %u:%u to %u:%u\n" +#~ msgstr "Re-positionnement de %u:%u à %u:%u\n" -#: src/filed/job.c:1862 -#, fuzzy, c-format -msgid "" -"DIR and FD clocks differ by %lld seconds, FD automatically compensating.\n" -msgstr "" -"L'horloge du client et du director ont %d secondes d'écart, le client s'est " -"ajusté automatiquement.\n" +#~ msgid "Reposition error. ERR=%s\n" +#~ msgstr "Erreur pendant le re-positionnement. ERR=%s\n" -#: src/filed/job.c:1871 -#, c-format -msgid "Unknown backup level: %s\n" -msgstr "" +#~ msgid "Reading block %u.\n" +#~ msgstr "Lecture du bloc %u.\n" -#: src/filed/job.c:1884 -#, c-format -msgid "Bad level command: %s\n" -msgstr "" +#~ msgid "Mount second tape. Press enter when ready: " +#~ msgstr "Chargez une deuxième bande et appuyez sur \"Entrée\" : " -#: src/filed/job.c:1906 -#, c-format -msgid "Bad session command: %s" -msgstr "" +#~ msgid "Reposition from %u:%u to 0:1\n" +#~ msgstr "Re-positionnement de %u:%u à 0:1\n" -#: src/filed/job.c:1965 src/stored/dircmd.c:348 -#, c-format -msgid "Bad storage command: %s" -msgstr "" +#~ msgid "Reading block %d.\n" +#~ msgstr "Lecture du bloc %d.\n" -#: src/filed/job.c:1993 src/stored/dircmd.c:370 -#, c-format -msgid "Failed to connect to Storage daemon: %s:%d\n" -msgstr "" +#~ msgid "10000 records read now at %d:%d\n" +#~ msgstr "10000 enregistrements lus maintenant à %d:%d\n" -#: src/filed/job.c:2034 -#, fuzzy -msgid "Failed connect from Storage daemon. SD bsock=NULL.\n" -msgstr "Impossible de se connecter au Storage daemon.\n" +#~ msgid "Last block written" +#~ msgstr "Dernier bloc écrit" -#: src/filed/job.c:2282 -msgid "ACL support not configured for your machine.\n" -msgstr "" +#~ msgid "Block not written" +#~ msgstr "Bloc non écrit" -#: src/filed/job.c:2286 -msgid "XATTR support not configured for your machine.\n" -msgstr "" +#, fuzzy +#~ msgid "End of tape %d:%d. Volume Bytes=%s. Write rate = %sB/s\n" +#~ msgstr "Fin de média sur le Volume \"%s\" Octets=%s Blocs=%s à %s.\n" -#: src/filed/job.c:2295 -msgid "Cannot contact Storage daemon\n" -msgstr "Impossible de se connecter au démon Storage\n" +#~ msgid "print this command" +#~ msgstr "affiche cette commande" -#: src/filed/job.c:2314 -#, c-format -msgid "Bad response to append open: %s\n" -msgstr "" +#~ msgid "rewind the tape" +#~ msgstr "rembobine la bande" -#: src/filed/job.c:2319 -msgid "Bad response from stored to open command\n" -msgstr "" +#~ msgid "Bacula read block by block to EOT and report" +#~ msgstr "Bacula lit bloc par bloc jusqu'à la fin de la bande (EOT) et résume" -#: src/filed/job.c:2350 -#, fuzzy, c-format -msgid "Generate VSS snapshots. Driver=\"%s\"\n" -msgstr "Création des snapshot VSS. Driver=\"%s\", Lecteur(s)=\"%s\"\n" +#~ msgid "General test Bacula tape functions" +#~ msgstr "test général des fonctions Bacula sur un lecteur de bande" -#: src/filed/job.c:2355 -#, fuzzy, c-format -msgid "VSS CreateSnapshots failed. ERR=%s\n" -msgstr "Erreur durant la création des snapshots VSS.\n" +#~ msgid "write an EOF on the tape" +#~ msgstr "écrit un EOF sur la bande" -#: src/filed/job.c:2361 -#, c-format -msgid "VSS Writer (PrepareForBackup): %s\n" -msgstr "" +#~ msgid "write a single Bacula block" +#~ msgstr "écrit un seul bloc bacula" -#: src/filed/job.c:2366 -msgid "No drive letters found for generating VSS snapshots.\n" -msgstr "" +#~ msgid "read a single record" +#~ msgstr "lit un seul enregistrement" -#: src/filed/job.c:2370 -#, fuzzy, c-format -msgid "VSS was not initialized properly. ERR=%s\n" -msgstr "Impossible d'initialiser le verrou sur la base. ERR=%s\n" +#~ msgid "read a single Bacula block" +#~ msgstr "lit un seul bloc bacula" -#: src/filed/job.c:2428 -msgid "Append Close with SD failed.\n" -msgstr "" +#~ msgid "\"%s\" is an invalid command\n" +#~ msgstr "\"%s\" est une commande invalide.\n" -#: src/filed/job.c:2433 -#, fuzzy, c-format -msgid "Bad status %d %c returned from Storage Daemon.\n" -msgstr "Impossible de récupérer le statut du Job depuis le FD.\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: btape \n" +#~ " -b specify bootstrap file\n" +#~ " -c set configuration file to file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -p proceed inspite of I/O errors\n" +#~ " -s turn off signals\n" +#~ " -v be verbose\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ ") %s %s %s\n" +#~ "\n" +#~ "Usage : bconsole [-s] [-c config_file] [-d niveau_debug]\n" +#~ " -c set configuration file to file\n" +#~ " -dnn set debug level to nn\n" +#~ " -s no signals\n" +#~ " -t test - lecture de la configuration et sortie\n" +#~ "\n" -#: src/filed/job.c:2463 -#, c-format -msgid "2994 Bad verify command: %s\n" -msgstr "" +#, fuzzy +#~ msgid "End of Volume \"%s\" %d records.\n" +#~ msgstr "Le volume \"%s\" existe déjà en base.\n" -#: src/filed/job.c:2478 src/filed/job.c:2519 -#, c-format -msgid "2994 Bad verify level: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Read block=%u, VolBytes=%s rate=%sB/s\n" +#~ msgstr "Ecriture blk_block=%u, dev_blk_num=%u VolBytes=%s rate=%.1f KB/s\n" -#: src/filed/job.c:2624 -#, c-format -msgid "Bad replace command. CMD=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Dedupengine status:\n" +#~ msgstr "" +#~ "\n" +#~ "Statut du Device :\n" -#: src/filed/job.c:2650 -#, c-format -msgid "Bad where regexp. where=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot create DedupDirectory: %s" +#~ msgstr "change le répertoire courant" -#: src/filed/job.c:2686 -#, c-format -msgid "VSS was not initialized properly. VSS support is disabled. ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot create DedupIndexDirectory: %s" +#~ msgstr "change le répertoire courant" -#: src/filed/job.c:2731 -#, c-format -msgid "VSS Writer (RestoreComplete): %s\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot create recovery directory: %s" +#~ msgstr "change le répertoire courant" -#: src/filed/job.c:2786 -msgid "Improper calling sequence.\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot delete temporary recovery directory: %s" +#~ msgstr "change le répertoire courant" -#: src/filed/job.c:2806 -#, c-format -msgid "Bad response to SD read open: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Socket error or stop during rehydration. ERR=%d\n" +#~ msgstr "Erreur de socket sur la commande %s : ERR=%s\n" -#: src/filed/job.c:2811 -msgid "Bad response from stored to read open command\n" -msgstr "" +#, fuzzy +#~ msgid "Unexpected message from FD, n=%d msglen=%d msg=%s\n" +#~ msgstr "" +#~ "Erreur pendant l'écriture des données vers le fichier de spool. ERR=%s\n" -#: src/filed/job.c:2900 -#, fuzzy, c-format -msgid "Bad response from SD to %s command. Wanted %s, got len=%ld msg=\"%s\"\n" -msgstr "Mauvaise réponse à la commande %s : voulait %s, pas %s\n" +#, fuzzy +#~ msgid "Error sending chunk request to client\n" +#~ msgstr "Erreur pendant lors de la récupération du pool. ERR=%s\n" -#: src/filed/restore.c:99 -#, c-format -msgid "Size of data or stream of %s not correct. Original %s, restored %s.\n" -msgstr "" +#~ msgid "Block size %u on device %s is too large, using default %u\n" +#~ msgstr "" +#~ "La taille de bloc %u sur le Device %s est trop grande, utilisation de la " +#~ "valeur par défaut %u\n" -#: src/filed/restore.c:119 -#, c-format -msgid "Invalid length of Finder Info (got %d, not 32)\n" -msgstr "" +#, fuzzy +#~ msgid "Max block size %u not multiple of device %s block size=%d.\n" +#~ msgstr "" +#~ "La taille du buffer réseau %d n'est pas un multiple de la taille de bloc " +#~ "du lecteur.\n" -#: src/filed/restore.c:124 -#, fuzzy, c-format -msgid "Could not set Finder Info on %s\n" -msgstr "Impossible d'ouvrir le device %s\n" +#, fuzzy +#~ msgid "Unable to init spool mutex: ERR=%s\n" +#~ msgstr "Impossible d'initialiser le muxtex : ERR=%s\n" -#: src/filed/restore.c:312 src/filed/restore.c:995 src/stored/bextract.c:696 -#, c-format -msgid "Unknown stream=%d ignored. This shouldn't happen!\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to init acquire mutex: ERR=%s\n" +#~ msgstr "Impossible d'initialiser le muxtex : ERR=%s\n" -#: src/filed/restore.c:410 #, fuzzy -msgid "LZO init failed\n" -msgstr "Impossible de Rembobiner.\n" +#~ msgid "Unable to init read acquire mutex: ERR=%s\n" +#~ msgstr "Impossible d'initialiser le muxtex : ERR=%s\n" -#: src/filed/restore.c:472 src/filed/verify_vol.c:95 -#, c-format -msgid "Record header scan error: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to init adata mutex: ERR=%s\n" +#~ msgstr "Impossible d'initialiser le muxtex : ERR=%s\n" -#: src/filed/restore.c:482 src/filed/verify_vol.c:105 -#, c-format -msgid "Data record error. ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to init volcat mutex: ERR=%s\n" +#~ msgstr "Impossible d'initialiser le muxtex : ERR=%s\n" -#: src/filed/restore.c:486 src/filed/verify_vol.c:109 -#, c-format -msgid "Actual data size %d not same as header %d\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to init dcrs mutex: ERR=%s\n" +#~ msgstr "Impossible d'initialiser le muxtex : ERR=%s\n" -#: src/filed/restore.c:548 src/stored/bextract.c:436 -#, c-format -msgid "%s stream not supported on this Client.\n" -msgstr "" +#~ msgid "lseek error on %s. ERR=%s.\n" +#~ msgstr "erreur de déplacement (lseek) sur %s : ERR=%s\n" -#: src/filed/restore.c:629 -msgid "Unexpected cryptographic session data stream.\n" -msgstr "" +#~ msgid "End of medium on Volume \"%s\" Bytes=%s Blocks=%s at %s.\n" +#~ msgstr "Fin de média sur le Volume \"%s\" Octets=%s Blocs=%s à %s.\n" -#: src/filed/restore.c:637 -msgid "" -"No private decryption keys have been defined to decrypt encrypted backup " -"data.\n" -msgstr "" +#~ msgid "New volume \"%s\" mounted on device %s at %s.\n" +#~ msgstr "Nouveau volume \"%s\" monté sur le device %s à %s.\n" -#: src/filed/restore.c:648 #, fuzzy -msgid "Could not create digest.\n" -msgstr "Impossible de créer la structure BSOCK cliente.\n" +#~ msgid "Connection request from %s failed.\n" +#~ msgstr "Demande de connexion échouée.\n" -#: src/filed/restore.c:662 -msgid "Missing private key required to decrypt encrypted backup data.\n" -msgstr "" - -#: src/filed/restore.c:665 -msgid "Decrypt of the session key failed.\n" -msgstr "Impossible de décrypter la clef de session.\n" - -#: src/filed/restore.c:668 #, fuzzy -msgid "Signer not found. Decryption failed.\n" -msgstr "La création de la signature a échouée" +#~ msgid "Bad client command: %s" +#~ msgstr "Erreur dans la commande RunScript : %s\n" -#: src/filed/restore.c:671 #, fuzzy -msgid "Unsupported digest algorithm. Decrypt failed.\n" -msgstr "Le digest spécifié n'est pas supporté : %d\n" +#~ msgid "Client daemon" +#~ msgstr "Director" -#: src/filed/restore.c:674 #, fuzzy -msgid "Unsupported encryption algorithm. Decrypt failed.\n" -msgstr "contentEncryptionAlgorithm non supporté : %d\n" +#~ msgid "Failed to connect to Client daemon: %s:%d\n" +#~ msgstr "Impossible de se connecter au client.\n" -#: src/filed/restore.c:678 -#, fuzzy, c-format -msgid "" -"An error=%d occurred while decoding encrypted session data stream: ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier de données %s.\n" +#, fuzzy +#~ msgid "3000 Deduplication vacuum marked to be canceled.\n" +#~ msgstr "3000 Job %s marqué pour être annulé.\n" -#: src/filed/restore.c:747 src/filed/restore.c:795 -#, c-format -msgid "Missing encryption session data stream for %s\n" -msgstr "" +#~ msgid "3904 Job %s not found.\n" +#~ msgstr "3904 Job %s non trouvé.\n" -#: src/filed/restore.c:755 src/filed/restore.c:802 -#, c-format -msgid "Failed to initialize decryption context for %s\n" -msgstr "" +#, fuzzy +#~ msgid "3000 JobId=%ld Job=\"%s\" marked to be %s.\n" +#~ msgstr "JobId %s, Job %s marqué pour être annulé.\n" -#: src/filed/restore.c:814 -#, fuzzy, c-format -msgid "Cannot open resource fork for %s.\n" -msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" +#, fuzzy +#~ msgid "3910 Unable to open device \"%s\": ERR=%s\n" +#~ msgstr "3910 Impossible d'ouvrir le device %s : ERR=%s\n" -#: src/filed/restore.c:956 -msgid "Unexpected cryptographic signature data stream.\n" -msgstr "" +#~ msgid "3920 Cannot label Volume because it is already labeled: \"%s\"\n" +#~ msgstr "" +#~ "3920 Impossible de labéliser le Volume car il possède déjà le label : \"%s" +#~ "\"\n" -#: src/filed/restore.c:962 -#, c-format -msgid "Failed to decode message signature for %s\n" -msgstr "" +#~ msgid "3921 Wrong volume mounted.\n" +#~ msgstr "3921 Mauvais volume monté.\n" -#: src/filed/restore.c:1033 -#, fuzzy, c-format -msgid "Encountered %ld acl errors while doing restore\n" -msgstr "Saisir la liste des fichiers à restaurer" +#~ msgid "3922 Cannot relabel an ANSI/IBM labeled Volume.\n" +#~ msgstr "3922 Impossible de re-labéliser un Volume ANSI/IBM.\n" -#: src/filed/restore.c:1037 -#, c-format -msgid "Encountered %ld xattr errors while doing restore\n" -msgstr "" +#~ msgid "3912 Failed to label Volume: ERR=%s\n" +#~ msgstr "3912 Impossible de labéliser le Volume : ERR=%s\n" -#: src/filed/restore.c:1041 -#, c-format -msgid "" -"%d non-supported data streams and %d non-supported attrib streams ignored.\n" -msgstr "" +#, fuzzy +#~ msgid "3915 Failed to label Volume: ERR=%s\n" +#~ msgstr "3912 Impossible de labéliser le Volume : ERR=%s\n" -#: src/filed/restore.c:1045 -#, c-format -msgid "%d non-supported resource fork streams ignored.\n" -msgstr "" +#, fuzzy +#~ msgid "3914 Failed to label Volume (no media): ERR=%s\n" +#~ msgstr "3912 Impossible de labéliser le Volume : ERR=%s\n" -#: src/filed/restore.c:1048 -#, c-format -msgid "%d non-supported Finder Info streams ignored.\n" -msgstr "" +#~ msgid "3001 Mounted Volume: %s\n" +#~ msgstr "3001 Volume monté : %s\n" -#: src/filed/restore.c:1051 -#, c-format -msgid "%d non-supported acl streams ignored.\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "3902 Cannot mount Volume on Storage Device \"%s\" because:\n" +#~ "%s" +#~ msgstr "" +#~ "3902 Impossible de monté le volume dans le storage device %s car :\n" +#~ "%s" -#: src/filed/restore.c:1054 -#, fuzzy, c-format -msgid "%d non-supported crypto streams ignored.\n" -msgstr "contentEncryptionAlgorithm non supporté : %d\n" +#, fuzzy +#~ msgid "Specified slot ignored. " +#~ msgstr "fopen %s en erreur : ERR=%s\n" -#: src/filed/restore.c:1057 -#, fuzzy, c-format -msgid "%d non-supported xattr streams ignored.\n" -msgstr "contentEncryptionAlgorithm non supporté : %d\n" +#, fuzzy +#~ msgid "3901 Unable to open device \"%s\": ERR=%s\n" +#~ msgstr "3910 Impossible d'ouvrir le device %s : ERR=%s\n" -#: src/filed/restore.c:1136 src/lib/util.c:488 -msgid "None" -msgstr "" +#, fuzzy +#~ msgid "3001 Device \"%s\" is mounted with Volume \"%s\"\n" +#~ msgstr "3001 Device %s est monté avec le volume \"%s\"\n" -#: src/filed/restore.c:1140 -msgid "Zlib errno" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "3905 Device \"%s\" open but no Bacula volume is mounted.\n" +#~ "If this is not a blank tape, try unmounting and remounting the Volume.\n" +#~ msgstr "" +#~ "3905 Le device %s est ouvert mais il n'y a pas de volume Bacula monté.\n" +#~ "Si ce n'est pas une cartouche vierge, essayer de la démonter puis de la " +#~ "remonter.\n" -#: src/filed/restore.c:1142 -msgid "Zlib stream error" -msgstr "" +#, fuzzy +#~ msgid "3001 Device \"%s\" is doing acquire.\n" +#~ msgstr "3902 Le Device %s est occupé en acquisition.\n" -#: src/filed/restore.c:1144 -msgid "Zlib data error" -msgstr "" +#, fuzzy +#~ msgid "3903 Device \"%s\" is being labeled.\n" +#~ msgstr "3934 Device %s est en cours d'initialisation.\n" -#: src/filed/restore.c:1146 -msgid "Zlib memory error" -msgstr "" +#, fuzzy +#~ msgid "3001 Device \"%s\" is already mounted with Volume \"%s\"\n" +#~ msgstr "3001 Device %s est déjà monté avec le volume \"%s\"\n" -#: src/filed/restore.c:1148 -msgid "Zlib buffer error" -msgstr "" +#, fuzzy +#~ msgid "3002 Device \"%s\" is mounted.\n" +#~ msgstr "3002 Le device %s est monté.\n" -#: src/filed/restore.c:1150 -msgid "Zlib version error" -msgstr "" +#~ msgid "3907 %s" +#~ msgstr "3907 %s" -#: src/filed/restore.c:1152 src/lib/util.c:832 src/lib/util.c:842 -#: src/lib/util.c:853 src/lib/util.c:860 src/lib/util.c:867 src/lib/util.c:881 -#: src/lib/util.c:891 src/lib/util.c:904 src/lib/util.c:915 -msgid "*none*" -msgstr "" +#, fuzzy +#~ msgid "3906 File device \"%s\" is always mounted.\n" +#~ msgstr "3906 Le device fichier %s est toujours monté.\n" -#: src/filed/restore.c:1189 -#, c-format -msgid "Missing cryptographic signature for %s\n" -msgstr "" +#, fuzzy +#~ msgid "3930 Device \"%s\" is being released.\n" +#~ msgstr "3934 Device %s est en cours d'initialisation.\n" -#: src/filed/restore.c:1219 src/filed/restore.c:1243 -#, fuzzy, c-format -msgid "Signature validation failed for file %s: ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s : ERR=%s\n" +#, fuzzy +#~ msgid "3905 Unknown wait state %d\n" +#~ msgstr "est dans un état inconnu %c" -#: src/filed/restore.c:1233 -#, fuzzy, c-format -msgid "Digest one file failed for file: %s\n" -msgstr "Impossible de créer le fichier bootstrap %s : ERR=%s\n" +#~ msgid "3909 Error scanning mount command: %s\n" +#~ msgstr "3909 Erreur pendant la lecture de la commande de montage : %s\n" -#: src/filed/restore.c:1264 -#, c-format -msgid "Signature validation failed for %s: %s\n" -msgstr "" +#, fuzzy +#~ msgid "3002 Device \"%s\" enabled.\n" +#~ msgstr "3022 Le device %s est libéré.\n" -#: src/filed/restore.c:1290 src/stored/bextract.c:531 -#: src/stored/bextract.c:596 -#, c-format -msgid "Seek to %s error on %s: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "3907 Error scanning \"enable\" command: %s\n" +#~ msgstr "3909 Erreur pendant la lecture de la commande de montage : %s\n" -#: src/filed/restore.c:1331 -#, c-format -msgid "Compressed header version error. Got=0x%x want=0x%x\n" -msgstr "" +#, fuzzy +#~ msgid "3002 Device \"%s\" disabled.\n" +#~ msgstr "3002 Le device %s est monté.\n" -#: src/filed/restore.c:1336 src/stored/bextract.c:625 -#, c-format -msgid "Compressed header size error. comp_len=%d, msglen=%d\n" -msgstr "" +#, fuzzy +#~ msgid "3907 Error scanning \"disable\" command: %s\n" +#~ msgstr "3909 Erreur pendant la lecture de la commande de montage : %s\n" -#: src/filed/restore.c:1359 -#, fuzzy, c-format -msgid "LZO uncompression error on file %s. ERR=%d\n" -msgstr "Erreur de décompression. ERR=%d\n" +#, fuzzy +#~ msgid "3002 Device \"%s\" unmounted.\n" +#~ msgstr "3002 Le device %s est démonté.\n" -#: src/filed/restore.c:1369 src/stored/bextract.c:660 -#, c-format -msgid "Compression algorithm 0x%x found, but not supported!\n" -msgstr "" +#, fuzzy +#~ msgid "3901 Device \"%s\" is already unmounted.\n" +#~ msgstr "3901 Le device %s est déjà démonté.\n" -#: src/filed/restore.c:1394 -#, c-format -msgid "Uncompression error on file %s. ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "3001 Device \"%s\" unmounted.\n" +#~ msgstr "3001 Le device %s est démonté.\n" -#: src/filed/restore.c:1403 src/stored/bextract.c:564 -msgid "GZIP data stream found, but GZIP not configured!\n" -msgstr "" +#, fuzzy +#~ msgid "3902 Device \"%s\" is busy in acquire.\n" +#~ msgstr "3902 Le Device %s est occupé en acquisition.\n" -#: src/filed/restore.c:1431 -#, c-format -msgid "Write error in Win32 Block Decomposition on %s: %s\n" -msgstr "" +#, fuzzy +#~ msgid "3916 Error scanning action_on_purge command\n" +#~ msgstr "2902 Erreur dans le décodage de la commande d'annulation.\n" -#: src/filed/restore.c:1439 src/filed/restore.c:1454 -#, fuzzy, c-format -msgid "Write write error on %s: ERR=%s\n" -msgstr "erreur de déplacement (lseek) sur %s : ERR=%s\n" +#, fuzzy +#~ msgid "3921 Device \"%s\" already released.\n" +#~ msgstr "3921 Le Device %s est déjà libéré.\n" -#: src/filed/restore.c:1482 -#, fuzzy, c-format -msgid "Wrong write size error at %lld block=%d wanted=%d wrote=%d\n" -msgstr "Erreur d'écriture à %u:%u sur le device %s. ERR=%s\n" +#, fuzzy +#~ msgid "3922 Device \"%s\" waiting for sysop.\n" +#~ msgstr "3922 Device %s est en attente d'une intervention sysop.\n" -#: src/filed/restore.c:1486 -#, fuzzy, c-format -msgid "" -"Write write error at %lld block=%d write_len=%d lerror=%d on %s: ERR=%s\n" -msgstr "Erreur d'écriture à %u:%u sur le device %s. ERR=%s\n" +#, fuzzy +#~ msgid "3922 Device \"%s\" waiting for mount.\n" +#~ msgstr "3922 Le Device %s est en atttente d'un montage.\n" -#: src/filed/restore.c:1543 -msgid "Decryption error\n" -msgstr "" +#, fuzzy +#~ msgid "3923 Device \"%s\" is busy in acquire.\n" +#~ msgstr "3902 Le Device %s est occupé en acquisition.\n" -#: src/filed/restore.c:1627 -msgid "Logic error: output file should be open\n" -msgstr "" +#, fuzzy +#~ msgid "3914 Device \"%s\" is being labeled.\n" +#~ msgstr "3934 Device %s est en cours d'initialisation.\n" -#: src/filed/restore.c:1663 -msgid "Logic error: output file should not be open\n" -msgstr "" +#, fuzzy +#~ msgid "3022 Device \"%s\" released.\n" +#~ msgstr "3022 Le device %s est libéré.\n" -#: src/filed/restore.c:1694 -#, c-format -msgid "Decryption error. buf_len=%d decrypt_len=%d on file %s\n" -msgstr "" +#~ msgid "Could not create bootstrap file %s: ERR=%s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s : ERR=%s\n" -#: src/filed/status.c:115 -#, fuzzy, c-format -msgid "%s %sVersion: %s (%s) %s %s %s %s\n" -msgstr "%s Version : %s (%s) %s %s %s\n" +#, fuzzy +#~ msgid "3998 Device \"%s\" is not an autochanger.\n" +#~ msgstr "3995 Le Device %s n'est pas un autochangeur.\n" -#: src/filed/status.c:120 -#, fuzzy, c-format -msgid "Daemon started %s. Jobs: run=%d running=%d.\n" -msgstr "Démon démarré depuis %s, %d jobs lancés depuis cette date.\n" +#, fuzzy +#~ msgid "3909 Error scanning autochanger drives/list/slots command: %s\n" +#~ msgstr "3909 Erreur pendant la lecture de la commande de montage : %s\n" -#: src/filed/status.c:182 -#, c-format -msgid "" -" Sizes: boffset_t=%d size_t=%d debug=%s trace=%d mode=%d,%d bwlimit=%skB/s\n" -msgstr "" +#~ msgid "3001 Volume=%s Slot=%d\n" +#~ msgstr "3001 Volume=%s Slot=%d\n" -#: src/filed/status.c:239 -#, fuzzy, c-format -msgid "Director connected %sat: %s\n" -msgstr "Connexion du director le %s\n" +#, fuzzy +#~ msgid "3931 Device \"%s\" is BLOCKED. user unmounted.\n" +#~ msgstr "3931 Device %s est BLOQUE, démonté par l'utilisateur.\n" -#: src/filed/status.c:243 -#, c-format -msgid "JobId %d Job %s is running.\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "3932 Device \"%s\" is BLOCKED. user unmounted during wait for media/" +#~ "mount.\n" +#~ msgstr "" +#~ "3932 Device %s est BLOQUE, démonté par l'utilisateur alors que bacula " +#~ "était en attente d'un média.\n" -#: src/filed/status.c:246 -#, fuzzy, c-format -msgid " %s%s %s Job started: %s\n" -msgstr "Le job %d est annulé.\n" +#, fuzzy +#~ msgid "3933 Device \"%s\" is BLOCKED waiting for media.\n" +#~ msgstr "3933 Device %s est bloqué en attente d'un media.\n" -#: src/filed/status.c:274 -#, fuzzy, c-format -msgid "" -" Files=%s Bytes=%s AveBytes/sec=%s LastBytes/sec=%s Errors=%d\n" -" Bwlimit=%s ReadBytes=%s\n" -msgstr " Fichiers=%s Octets=%s Octets/sec=%s Erreurs=%d\n" +#, fuzzy +#~ msgid "3934 Device \"%s\" is being initialized.\n" +#~ msgstr "3934 Device %s est en cours d'initialisation.\n" -#: src/filed/status.c:285 -#, c-format -msgid " Files: Restored=%s Expected=%s Completed=%d%%\n" -msgstr "" +#, fuzzy +#~ msgid "3935 Device \"%s\" is blocked labeling a Volume.\n" +#~ msgstr "3935 Device %s est bloqué par une labélisation de volume.\n" -#: src/filed/status.c:290 -#, c-format -msgid " Files: Examined=%s Backed up=%s\n" -msgstr "" +#, fuzzy +#~ msgid "3935 Device \"%s\" is blocked for unknown reason.\n" +#~ msgstr "3935 Device %s est bloqué pour une raison inconnue.\n" -#: src/filed/status.c:303 -#, c-format -msgid " Processing file: %s\n" -msgstr "" +#, fuzzy +#~ msgid "3936 Device \"%s\" is busy reading.\n" +#~ msgstr "3936 Device %s est occupé en lecture.\n" -#: src/filed/status.c:315 -msgid " SDSocket closed.\n" -msgstr "" +#, fuzzy +#~ msgid "3937 Device \"%s\" is busy with writers=%d reserved=%d.\n" +#~ msgstr "3937 Device %s est occupé avec %d flux en écriture.\n" -#: src/filed/status.c:325 -msgid "====\n" -msgstr "====\n" +#, fuzzy +#~ msgid "Error writing part %d to the DVD: ERR=%s\n" +#~ msgstr "Erreur dans l'exécution de la commande : %s. ERR=%s\n" -#: src/filed/status.c:458 src/filed/status.c:492 -#, c-format -msgid "Bad .status command: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to write last on %s: ERR=%s\n" +#~ msgstr "Impossible de se connecter à %s sur %s:%d. ERR=%s\n" -#: src/filed/status.c:459 -msgid "2900 Bad .status command, missing argument.\n" -msgstr "" +#, fuzzy +#~ msgid "FD command not found: %s\n" +#~ msgstr "Job non trouvé : %s\n" -#: src/filed/status.c:493 -msgid "2900 Bad .status command, wrong argument.\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot open session, received bad parameters.\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/filed/verify.c:40 -#, c-format -msgid "Cannot malloc %d network read buffer\n" -msgstr "" +#, fuzzy +#~ msgid "Could not open(%s,%s,0640): ERR=%s\n" +#~ msgstr "Impossible d'ouvrir %s : ERR=%s\n" -#: src/filed/verify.c:110 -#, c-format -msgid " Could not access %s: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Could not open aligned volume: %s, ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier pid. %s ERR=%s\n" -#: src/filed/verify.c:117 -#, c-format -msgid " Could not follow link %s: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to stat device %s. ERR=%s\n" +#~ msgstr "3910 Impossible d'ouvrir le device %s : ERR=%s\n" -#: src/filed/verify.c:124 -#, c-format -msgid " Could not stat %s: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Could not reopen: %s, ERR=%s\n" +#~ msgstr "Impossible d'ouvrir %s : ERR=%s\n" -#: src/filed/verify.c:133 -#, c-format -msgid " Archive file skipped: %s\n" -msgstr "" +#~ msgid "Device %s cannot be %smounted. ERR=%s\n" +#~ msgstr "Le Device %s ne peut pas être %smounted. ERR=%s\n" -#: src/filed/verify.c:136 -#, c-format -msgid " Recursion turned off. Directory skipped: %s\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Connection from unknown Director %s at %s rejected.\n" +#~ "Please see " +#~ msgstr "" +#~ "Connexion d'un Director inconnu %s à %s rejeté.\n" +#~ "\n" -#: src/filed/verify.c:140 -#, c-format -msgid " File system change prohibited. Directory skipped: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Invalid connection from %s. Len=%d\n" +#~ msgstr "Connexion invalide. Len=%d\n" -#: src/filed/verify.c:148 -#, c-format -msgid " Could not open directory %s: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Invalid Hello from %s. Len=%d\n" +#~ msgstr "Connexion invalide. Len=%d\n" -#: src/filed/verify.c:153 -#, c-format -msgid " Unknown file type %d: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Client connect failed: Job name not found: %s\n" +#~ msgstr "Job non trouvé : %s\n" -#: src/filed/verify.c:197 src/filed/verify_vol.c:205 -#, c-format -msgid "Network error in send to Director: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Client socket not open. Could not connect to Client.\n" +#~ msgstr "Impossible de se connecter au Client.\n" -#: src/filed/verify.c:291 -#, c-format -msgid " Cannot open %s: ERR=%s.\n" -msgstr "" +#, fuzzy +#~ msgid "Recv request to Client failed. ERR=%s\n" +#~ msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" -#: src/filed/verify.c:305 -#, c-format -msgid " Cannot open resource fork for %s: ERR=%s.\n" -msgstr "" +#, fuzzy +#~ msgid "Bad Hello from Client: %s.\n" +#~ msgstr "Début de purge des jobs du client \"%s\"\n" -#: src/filed/verify.c:367 -#, c-format -msgid "Error reading file %s: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Send caps to Client failed. ERR=%s\n" +#~ msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" -#: src/filed/verify_vol.c:52 -msgid "Storage command not issued before Verify.\n" -msgstr "" +#, fuzzy +#~ msgid "Recv caps from Client failed. ERR=%s\n" +#~ msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" -#: src/filed/verify_vol.c:142 -#, c-format -msgid "Error scanning record header: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Recv bad caps from Client: %s.\n" +#~ msgstr "Début de purge des jobs du client \"%s\"\n" -#: src/filed/win_efs.c:106 -#, c-format -msgid "Restore data %ld bytes too long for Microsoft buffer %ld bytes.\n" -msgstr "" +#, fuzzy +#~ msgid "Recv bad caps from Client %s\n" +#~ msgstr "Début de purge des jobs du client \"%s\"\n" -#: src/filed/win_efs.c:192 -#, c-format -msgid "Restore data %ld bytes too long for Microsoft buffer %lld bytes.\n" -msgstr "" +#, fuzzy +#~ msgid "Couldn't rewind %s device %s: ERR=%s\n" +#~ msgstr "Impossible de trouver le userid %s : ERR=%s\n" -#: src/filed/win_efs.c:227 -#, fuzzy, c-format -msgid "WriteEncryptedFileRaw failure: ERR=%s\n" -msgstr "fopen %s en erreur : ERR=%s\n" +#, fuzzy +#~ msgid "Wrong Volume mounted on %s device %s: Wanted %s have %s\n" +#~ msgstr "Nouveau volume \"%s\" monté sur le device %s à %s.\n" -#: src/filed/xattr.c:235 -#, c-format -msgid "Illegal xattr stream, no XATTR_MAGIC on file \"%s\"\n" -msgstr "" +#~ msgid "Could not read Volume label from block.\n" +#~ msgstr "Impossible de lire le label du Volume depuis le média.\n" -#: src/filed/xattr.c:249 -#, c-format -msgid "Illegal xattr stream, xattr name length <= 0 on file \"%s\"\n" -msgstr "" +#, fuzzy +#~ msgid "Volume on %s device %s has bad Bacula label type: %x\n" +#~ msgstr "Le volume sur %s possède un mauvais label Bacula : %x\n" -#: src/filed/xattr.c:371 src/filed/xattr.c:407 -#, fuzzy, c-format -msgid "llistea error on file \"%s\": ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" +#, fuzzy +#~ msgid "" +#~ "Got Aligned or File type Volume %s on Dedup device %s. Wanted File.\n" +#~ msgstr "Le nouveau volume \"%s\" a été labélisé sur le device %s.\n" -#: src/filed/xattr.c:457 src/filed/xattr.c:511 -#, fuzzy, c-format -msgid "lgetea error on file \"%s\": ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" +#, fuzzy +#~ msgid "" +#~ "Got Aligned or Dedup type Volume %s on File device %s. Wanted File.\n" +#~ msgstr "Le nouveau volume \"%s\" a été labélisé sur le device %s.\n" -#: src/filed/xattr.c:547 src/filed/xattr.c:869 src/filed/xattr.c:1344 -#: src/filed/xattr.c:1812 src/filed/xattr.c:2169 src/filed/xattr.c:2961 -#, c-format -msgid "Xattr stream on file \"%s\" exceeds maximum size of %d bytes\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Got File or Dedup type Volume %s on Aligned device %s. Wanted Aligned.\n" +#~ msgstr "" +#~ "Ecriture du label sur le Volume pré-labélisé \"%s\" sur le lecteur %s\n" -#: src/filed/xattr.c:567 src/filed/xattr.c:895 src/filed/xattr.c:1364 -#: src/filed/xattr.c:1842 src/filed/xattr.c:2186 -#, fuzzy, c-format -msgid "Failed to serialize extended attributes on file \"%s\"\n" -msgstr "Impossible d'initialiser le contexte TLS pour la Console \"%s\".\n" +#, fuzzy +#~ msgid "Could not reserve volume %s on %s device %s\n" +#~ msgstr "Impossible de trouver le prochain volume pour le Job %s.\n" -#: src/filed/xattr.c:634 -#, fuzzy, c-format -msgid "lsetea error on file \"%s\": ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" +#, fuzzy +#~ msgid "Cannot write Volume label to block for %s device %s\n" +#~ msgstr "Impossible d'écrire le label du Volume sur le Device %s\n" -#: src/filed/xattr.c:722 src/filed/xattr.c:760 src/filed/xattr.c:824 -#: src/filed/xattr.c:836 -#, fuzzy, c-format -msgid "attr_list error on file \"%s\": ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" +#, fuzzy +#~ msgid "Open %s device %s Volume \"%s\" failed: ERR=%s\n" +#~ msgstr "Impossible de supprimer le volume \"%s\". ERR=%s" -#: src/filed/xattr.c:960 -#, fuzzy, c-format -msgid "Received illegal xattr named %s on file \"%s\"\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" +#, fuzzy +#~ msgid "Rewind error on %s device %s: ERR=%s\n" +#~ msgstr "Erreur de lecture de %s:%s:%d : ERR=%s\n" -#: src/filed/xattr.c:993 src/filed/xattr.c:1003 -#, fuzzy, c-format -msgid "attr_set error on file \"%s\": ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" +#, fuzzy +#~ msgid "Truncate error on %s device %s: ERR=%s\n" +#~ msgstr "Erreur d'écriture à %u:%u sur le device %s. ERR=%s\n" -#: src/filed/xattr.c:1153 src/filed/xattr.c:1188 -#, fuzzy, c-format -msgid "llistxattr error on file \"%s\": ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" +#, fuzzy +#~ msgid "Failed to re-open DVD after truncate on %s device %s: ERR=%s\n" +#~ msgstr "" +#~ "Impossible de se positionner à la fin du média sur le device %s : ERR=%s\n" -#: src/filed/xattr.c:1256 src/filed/xattr.c:1308 -#, fuzzy, c-format -msgid "lgetxattr error on file \"%s\": ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" +#, fuzzy +#~ msgid "Unable to write %s device %s: ERR=%s\n" +#~ msgstr "Impossible de se connecter à %s sur %s:%d. ERR=%s\n" -#: src/filed/xattr.c:1427 -#, fuzzy, c-format -msgid "lsetxattr error on file \"%s\": ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" +#, fuzzy +#~ msgid "Recycled volume \"%s\" on %s device %s, all previous data lost.\n" +#~ msgstr "" +#~ "Recyclage du volume \"%s\" sur le lecteur %s, les précédentes données " +#~ "sont perdues.\n" -#: src/filed/xattr.c:1585 src/filed/xattr.c:1620 -#, fuzzy, c-format -msgid "extattr_list_link error on file \"%s\": ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" +#, fuzzy +#~ msgid "Wrote label to prelabeled Volume \"%s\" on %s device %s\n" +#~ msgstr "" +#~ "Ecriture du label sur le Volume pré-labélisé \"%s\" sur le lecteur %s\n" -#: src/filed/xattr.c:1640 -#, fuzzy, c-format -msgid "Failed to convert %d into namespace on file \"%s\"\n" -msgstr "Impossible de lire le certificat à partir du fichier" +#, fuzzy +#~ msgid "Bad Volume session label request=%d\n" +#~ msgstr "Le Volume n'a pas de label.\n" -#: src/filed/xattr.c:1720 src/filed/xattr.c:1775 -#, fuzzy, c-format -msgid "extattr_get_link error on file \"%s\": ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" +#, fuzzy +#~ msgid "pthread_cond_wait failure. ERR=%s\n" +#~ msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" -#: src/filed/xattr.c:1899 -#, fuzzy, c-format -msgid "Failed to split %s into namespace and name part on file \"%s\"\n" -msgstr "" -"Impossible de se positionner à la fin du média sur le device %s : ERR=%s\n" +#, fuzzy +#~ msgid "unknown blocked code" +#~ msgstr "source inconnue" -#: src/filed/xattr.c:1912 -#, fuzzy, c-format -msgid "Failed to convert %s into namespace on file \"%s\"\n" -msgstr "Impossible de lire le certificat à partir du fichier" +#, fuzzy +#~ msgid "Too many errors trying to mount %s device %s.\n" +#~ msgstr "Le volume \"%s\" n'est pas dans le device %s.\n" -#: src/filed/xattr.c:1933 -#, fuzzy, c-format -msgid "extattr_set_link error on file \"%s\": ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" +#~ msgid "Job %d canceled.\n" +#~ msgstr "Le job %d est annulé.\n" -#: src/filed/xattr.c:2036 src/filed/xattr.c:2061 -#, fuzzy, c-format -msgid "getproplist error on file \"%s\": ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" +#, fuzzy +#~ msgid "Open of %s device %s Volume \"%s\" failed: ERR=%s\n" +#~ msgstr "Impossible de supprimer le volume \"%s\". ERR=%s" -#: src/filed/xattr.c:2255 -#, fuzzy, c-format -msgid "Unable create proper proplist to restore xattrs on file \"%s\"\n" -msgstr "Impossible de lire le certificat à partir du fichier" +#~ msgid "Volume \"%s\" previously written, moving to end of data.\n" +#~ msgstr "" +#~ "Le volume \"%s\" contient des données, re-positionnement à la fin.\n" -#: src/filed/xattr.c:2284 -#, fuzzy, c-format -msgid "setproplist error on file \"%s\": ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" +#, fuzzy +#~ msgid "Unable to position to end of data on %s device %s: ERR=%s\n" +#~ msgstr "" +#~ "Impossible de se positionner à la fin du média sur le device %s : ERR=%s\n" -#: src/filed/xattr.c:2602 src/filed/xattr.c:2655 -#, fuzzy, c-format -msgid "Unable to get acl on xattr %s on file \"%s\": ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" +#, fuzzy +#~ msgid "Volume \"%s\" not loaded on %s device %s.\n" +#~ msgstr "Le volume \"%s\" n'est pas dans le device %s.\n" -#: src/filed/xattr.c:2672 -#, fuzzy, c-format -msgid "Unable to get acl text on xattr %s on file \"%s\": ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" +#~ msgid "" +#~ "Director wanted Volume \"%s\".\n" +#~ " Current Volume \"%s\" not acceptable because:\n" +#~ " %s" +#~ msgstr "" +#~ "Le director voulait utiliser le volume \"%s\".\n" +#~ " Le volume courant \"%s\" n'est pas utilisable car :\n" +#~ " %s" -#: src/filed/xattr.c:2746 -#, fuzzy, c-format -msgid "Unable to get status on xattr %s on file \"%s\": ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" +#~ msgid "Ready to append to end of Volume \"%s\" part=%d size=%s\n" +#~ msgstr "" +#~ "Prêt à ajouter des données à la fin du volume \"%s\" part=%d size=%s\n" +#~ "\n" -#: src/filed/xattr.c:2879 -#, fuzzy, c-format -msgid "Unable to open xattr %s on \"%s\": ERR=%s\n" -msgstr "Impossible de se connecter à %s sur %s:%d. ERR=%s\n" +#, fuzzy +#~ msgid "" +#~ "Bacula cannot write on DVD Volume \"%s\" because: The sizes do not match! " +#~ "Volume=%s Catalog=%s\n" +#~ msgstr "" +#~ "Impossible d'écrire sur le volume \"%s\" car :\n" +#~ "Les tailles ne correspondent pas. Volume=%s Catalogue=%s\n" -#: src/filed/xattr.c:2902 -#, fuzzy, c-format -msgid "Unable to read symlin %s on \"%s\": ERR=%s\n" -msgstr "Impossible de se connecter à %s sur %s:%d. ERR=%s\n" +#~ msgid "Ready to append to end of Volume \"%s\" at file=%d.\n" +#~ msgstr "Prêt à ajouter des données à la fin du volume \"%s\" file=%d.\n" -#: src/filed/xattr.c:2977 -#, fuzzy, c-format -msgid "Unable to read content of xattr %s on file \"%s\"\n" -msgstr "Impossible de lire le certificat à partir du fichier" +#, fuzzy +#~ msgid "" +#~ "For Volume \"%s\":\n" +#~ "The number of files mismatch! Volume=%u Catalog=%u\n" +#~ "Correcting Catalog\n" +#~ msgstr "" +#~ "Impossible d'écrire sur le volume \"%s\" \n" +#~ "car le nombre de fichiers ne correspond pas. Volume=%u Catalogue=%u\n" -#: src/filed/xattr.c:3017 -#, fuzzy, c-format -msgid "Unable to chdir to xattr space of file \"%s\": ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" +#, fuzzy +#~ msgid "Error updating Catalog\n" +#~ msgstr "Impossible d'ouvrir le fichier de données %s.\n" -#: src/filed/xattr.c:3074 src/filed/xattr.c:3323 -#, fuzzy, c-format -msgid "Unable to open file \"%s\": ERR=%s\n" -msgstr "3910 Impossible d'ouvrir le device %s : ERR=%s\n" +#, fuzzy +#~ msgid "" +#~ "Bacula cannot write on tape Volume \"%s\" because:\n" +#~ "The number of files mismatch! Volume=%u Catalog=%u\n" +#~ msgstr "" +#~ "Impossible d'écrire sur le volume \"%s\" \n" +#~ "car le nombre de fichiers ne correspond pas. Volume=%u Catalogue=%u\n" -#: src/filed/xattr.c:3102 src/filed/xattr.c:3384 -#, fuzzy, c-format -msgid "Unable to open xattr space %s on file \"%s\": ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" +#, fuzzy +#~ msgid "" +#~ "Ready to append to end of Volumes \"%s\" ameta size=%s adata size=%s\n" +#~ msgstr "" +#~ "Prêt à ajouter des données à la fin du volume \"%s\" part=%d size=%s\n" +#~ "\n" -#: src/filed/xattr.c:3118 src/filed/xattr.c:3348 -#, fuzzy, c-format -msgid "Unable to chdir to xattr space on file \"%s\": ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" +#, fuzzy +#~ msgid "Ready to append to end of Volume \"%s\" size=%s\n" +#~ msgstr "" +#~ "Prêt à ajouter des données à la fin du volume \"%s\" part=%d size=%s\n" +#~ "\n" -#: src/filed/xattr.c:3139 -#, fuzzy, c-format -msgid "Unable to list the xattr space on file \"%s\": ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" +#, fuzzy +#~ msgid "" +#~ "For Volume \"%s\":\n" +#~ " The sizes do not match! Metadata Volume=%s Catalog=%s\n" +#~ " Correcting Catalog\n" +#~ msgstr "" +#~ "Impossible d'écrire sur le volume \"%s\" car :\n" +#~ "Les tailles ne correspondent pas. Volume=%s Catalogue=%s\n" -#: src/filed/xattr.c:3231 -#, fuzzy, c-format -msgid "Unable to convert acl from text on file \"%s\"\n" -msgstr "Impossible de lire le certificat à partir du fichier" +#, fuzzy +#~ msgid "" +#~ "For aligned Volume \"%s\":\n" +#~ " Aligned sizes do not match! Aligned Volume=%s Catalog=%s\n" +#~ " Correcting Catalog\n" +#~ msgstr "" +#~ "Impossible d'écrire sur le volume \"%s\" car :\n" +#~ "Les tailles ne correspondent pas. Volume=%s Catalogue=%s\n" -#: src/filed/xattr.c:3241 src/filed/xattr.c:3264 -#, fuzzy, c-format -msgid "Unable to restore acl of xattr %s on file \"%s\": ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" +#, fuzzy +#~ msgid "" +#~ "Bacula cannot write on disk Volume \"%s\" because: The sizes do not " +#~ "match! Volume=%s Catalog=%s\n" +#~ msgstr "" +#~ "Impossible d'écrire sur le volume \"%s\" car :\n" +#~ "Les tailles ne correspondent pas. Volume=%s Catalogue=%s\n" -#: src/filed/xattr.c:3337 -#, fuzzy, c-format -msgid "Unable to open xattr space on file \"%s\": ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" +#, fuzzy +#~ msgid "Labeled new Volume \"%s\" on %s device %s.\n" +#~ msgstr "Le nouveau volume \"%s\" a été labélisé sur le device %s.\n" -#: src/filed/xattr.c:3367 src/filed/xattr.c:3529 -#, fuzzy, c-format -msgid "Unable to open xattr %s on file \"%s\": ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" +#, fuzzy +#~ msgid "%s device %s not configured to autolabel Volumes.\n" +#~ msgstr "" +#~ "Attention, le device %s n'est pas configuré pour labéliser " +#~ "automatiquement les volumes.\n" -#: src/filed/xattr.c:3401 -#, fuzzy, c-format -msgid "Unable to chdir to xattr space %s on file \"%s\": ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" +#~ msgid "Marking Volume \"%s\" in Error in Catalog.\n" +#~ msgstr "Le volume \"%s\" est marqué en Erreur dans le catalogue.\n" -#: src/filed/xattr.c:3441 -#, fuzzy, c-format -msgid "Unable to mkfifo xattr %s on file \"%s\": ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" +#, fuzzy +#~ msgid "" +#~ "Invalid tape position on volume \"%s\" on device %s. Expected %d, got %d\n" +#~ msgstr "" +#~ "Fin du volume \"%s\" à %u:%u sur le device %s. Ecriture de %u octets, eu " +#~ "%d.\n" -#: src/filed/xattr.c:3459 -#, fuzzy, c-format -msgid "Unable to mknod xattr %s on file \"%s\": ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" +#, fuzzy +#~ msgid "Cannot open %s Dev=%s, Vol=%s for reading.\n" +#~ msgstr "Impossible d'ouvrir le fichier %s pour lecture. ERR=%s\n" -#: src/filed/xattr.c:3477 -#, fuzzy, c-format -msgid "Unable to mkdir xattr %s on file \"%s\": ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" +#, fuzzy +#~ msgid "Unable to set eotmodel on device %s: ERR=%s\n" +#~ msgstr "3910 Impossible d'ouvrir le device %s : ERR=%s\n" -#: src/filed/xattr.c:3497 -#, fuzzy, c-format -msgid "Unable to link xattr %s to %s on file \"%s\": ERR=%s\n" -msgstr "Impossible de se connecter à %s sur %s:%d. ERR=%s\n" +#~ msgid " file=%d block=%d\n" +#~ msgstr " fichier=%d bloc=%d\n" -#: src/filed/xattr.c:3550 -#, c-format -msgid "" -"Unable to restore data of xattr %s on file \"%s\": Not all data available in " -"xattr stream\n" -msgstr "" +#, fuzzy +#~ msgid "REGEX '%s' compile error. ERR=%s\n" +#~ msgstr "erreur de fermeture : ERR=%s\n" -#: src/filed/xattr.c:3563 -#, fuzzy, c-format -msgid "Unable to restore data of xattr %s on file \"%s\": ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" +#, fuzzy +#~ msgid "Error sending header to Client. ERR=%s\n" +#~ msgstr "Erreur pendant lors de la récupération du pool. ERR=%s\n" -#: src/filed/xattr.c:3586 -#, fuzzy, c-format -msgid "Unable to symlink xattr %s to %s on file \"%s\": ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" +#, fuzzy +#~ msgid "Error sending data to Client. ERR=%s\n" +#~ msgstr "" +#~ "Erreur pendant l'écriture des données vers le fichier de spool. ERR=%s\n" -#: src/filed/xattr.c:3622 -#, fuzzy, c-format -msgid "Unable to restore owner of xattr %s on file \"%s\": ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" +#~ msgid "End of Volume at file %u on device %s, Volume \"%s\"\n" +#~ msgstr "Fin de Volume au fichier %u sur le Device %s, Volume \"%s\"\n" -#: src/filed/xattr.c:3650 -#, fuzzy, c-format -msgid "Unable to restore filetimes of xattr %s on file \"%s\": ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s : ERR=%s\n" +#~ msgid "End of all volumes.\n" +#~ msgstr "Fin de tous les Volumes.\n" -#: src/filed/xattr.c:3666 -#, c-format -msgid "Illegal xattr stream, failed to parse xattr stream on file \"%s\"\n" -msgstr "" +#~ msgid "Forward spacing Volume \"%s\" to file:block %u:%u.\n" +#~ msgstr "" +#~ "Postionnement en avant du Volume \"%s\" sur le fichier:bloc %u:%u.\n" -#: src/filed/xattr.c:3727 -#, c-format -msgid "Failed to restore extensible attributes on file \"%s\"\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to initialize reservation lock. ERR=%s\n" +#~ msgstr "Impossible d'initialiser le verrou sur la base. ERR=%s\n" -#: src/filed/xattr.c:3740 -#, fuzzy, c-format -msgid "Failed to restore extended attributes on file \"%s\"\n" -msgstr "" -"Impossible de se positionner à la fin du média sur le device %s : ERR=%s\n" +#, fuzzy +#~ msgid "3939 Could not get dcr\n" +#~ msgstr "Impossible de créer la structure BSOCK cliente.\n" -#: src/filed/xattr.c:3909 -#, c-format -msgid "" -"Can't restore Extended Attributes of %s - incompatible xattr stream " -"encountered - %d\n" -msgstr "" +#, fuzzy +#~ msgid "Device reservation failed for JobId=%d: %s\n" +#~ msgstr "Impossible de créer le fichier bootstrap %s : ERR=%s\n" -#: src/findlib/attribs.c:94 src/findlib/attribs.c:131 -#: src/findlib/attribs.c:613 -#, c-format -msgid "Unable to set file owner %s: ERR=%s\n" -msgstr "" +#~ msgid "Failed command: %s\n" +#~ msgstr "Erreur sur la commande : %s\n" -#: src/findlib/attribs.c:105 src/findlib/attribs.c:137 -#, c-format -msgid "Unable to set file modes %s: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ " Device \"%s\" requested by DIR is disabled.\n" +#~ msgstr "3934 Device %s est en cours d'initialisation.\n" -#: src/findlib/attribs.c:124 src/findlib/attribs.c:149 -#, c-format -msgid "Unable to set file times %s: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "3603 JobId=%u %s device %s is busy reading.\n" +#~ msgstr "3603 JobId=%u device %s est occupé en lecture.\n" -#: src/findlib/attribs.c:590 -#, c-format -msgid "File size of restored file %s not correct. Original %s, restored %s.\n" -msgstr "" +#, fuzzy +#~ msgid "3604 JobId=%u %s device %s is BLOCKED due to user unmount.\n" +#~ msgstr "" +#~ "3604 JobId=%u device %s est bloqué car il a été démonté par l'utilisateur " +#~ "(unmount).\n" -#: src/findlib/attribs.c:633 -#, c-format -msgid "Unable to set file flags %s: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "3601 JobId=%u %s device %s is BLOCKED due to user unmount.\n" +#~ msgstr "" +#~ "3601 JobId=%u device %s est BLOQUE car il a été demonté par " +#~ "l'utilisateur.\n" -#: src/findlib/attribs.c:920 -#, c-format -msgid "Error in %s file %s: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "3602 JobId=%u %s device %s is busy (already reading/writing). read=%d, " +#~ "writers=%d reserved=%d\n" +#~ msgstr "3602 JobId=%u device %s est occupé (à lire ou écrire).\n" -#: src/findlib/attribs.c:942 -#, c-format -msgid "Error in %s: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "3609 JobId=%u Max concurrent jobs=%d exceeded on %s device %s.\n" +#~ msgstr "" +#~ "3607 JobId=%u voulait Vol=\"%s\", c'est le Vol=\"%s\" qui est dans le " +#~ "drive %s.\n" -#: src/findlib/bfile.c:86 -msgid "Unix attributes" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "3610 JobId=%u Aligned volume max bytes does not allow concurrency on " +#~ "drive %s.\n" +#~ msgstr "" +#~ "3607 JobId=%u voulait Vol=\"%s\", c'est le Vol=\"%s\" qui est dans le " +#~ "drive %s.\n" -#: src/findlib/bfile.c:88 -msgid "File data" -msgstr "" +#, fuzzy +#~ msgid "3611 JobId=%u Volume max jobs=%d exceeded on %s device %s.\n" +#~ msgstr "" +#~ "3607 JobId=%u voulait Vol=\"%s\", c'est le Vol=\"%s\" qui est dans le " +#~ "drive %s.\n" -#: src/findlib/bfile.c:90 -msgid "MD5 digest" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "3608 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" nreserve=%d on %s " +#~ "device %s.\n" +#~ msgstr "" +#~ "3608 JobId=%u voulait le Pool=\"%s\", mais c'est le Pool=\"%s\" qui est " +#~ "dans le drive %s.\n" -#: src/findlib/bfile.c:92 -msgid "GZIP data" -msgstr "" +#, fuzzy +#~ msgid "3605 JobId=%u wants free drive but %s device %s is busy.\n" +#~ msgstr "" +#~ "3605 JobId=%u voulait libérer le lecteur, mais le device %s est occupé.\n" -#: src/findlib/bfile.c:94 -msgid "Compressed data" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "3606 JobId=%u prefers mounted drives, but %s device %s has no Volume.\n" +#~ msgstr "" +#~ "3606 JobId=%u voulait un lecteur monté, mais le lecteur %s est vide.\n" -#: src/findlib/bfile.c:96 -msgid "Extended attributes" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "3607 JobId=%u wants Vol=\"%s\" drive has Vol=\"%s\" on %s device %s.\n" +#~ msgstr "" +#~ "3607 JobId=%u voulait Vol=\"%s\", c'est le Vol=\"%s\" qui est dans le " +#~ "drive %s.\n" -#: src/findlib/bfile.c:98 -msgid "Sparse data" -msgstr "" +#, fuzzy +#~ msgid "3911 JobId=%u failed reserve %s device %s.\n" +#~ msgstr "" +#~ "3605 JobId=%u voulait libérer le lecteur, mais le device %s est occupé.\n" -#: src/findlib/bfile.c:100 -msgid "GZIP sparse data" -msgstr "" +#, fuzzy +#~ msgid "Spooling statistics:\n" +#~ msgstr "Spooling des données...\n" -#: src/findlib/bfile.c:102 -msgid "Compressed sparse data" -msgstr "" +#~ msgid "Spooling data ...\n" +#~ msgstr "Spooling des données...\n" -#: src/findlib/bfile.c:104 -msgid "Program names" -msgstr "" +#~ msgid "Open data spool file %s failed: ERR=%s\n" +#~ msgstr "Erreur pendant l'ouverture fichier de spool %s. ERR=%s\n" -#: src/findlib/bfile.c:106 -msgid "Program data" -msgstr "" +#~ msgid "Committing spooled data to Volume \"%s\". Despooling %s bytes ...\n" +#~ msgstr "" +#~ "Transfert des données spoolées sur le Volume \"%s\". Transfert de %s " +#~ "octets...\n" -#: src/findlib/bfile.c:108 -msgid "SHA1 digest" -msgstr "" +#~ msgid "Writing spooled data to Volume. Despooling %s bytes ...\n" +#~ msgstr "" +#~ "Ecriture des données spoolées sur le Volume. Transfert de %s octets...\n" -#: src/findlib/bfile.c:110 -msgid "Win32 data" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Despooling elapsed time = %02d:%02d:%02d, Transfer rate = %s Bytes/" +#~ "second\n" +#~ msgstr "" +#~ "Temps du transfert des données spoolées = %02d:%02d:%02d, Taux de " +#~ "transfert = %s o/s\n" -#: src/findlib/bfile.c:112 -msgid "Win32 GZIP data" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "User specified Job spool size reached: JobSpoolSize=%s MaxJobSpoolSize=" +#~ "%s\n" +#~ msgstr "Taille du spool spécifiée par l'utlisateur atteinte.\n" -#: src/findlib/bfile.c:114 -msgid "Win32 compressed data" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "User specified Device spool size reached: DevSpoolSize=%s MaxDevSpoolSize=" +#~ "%s\n" +#~ msgstr "Taille du spool spécifiée par l'utlisateur atteinte.\n" -#: src/findlib/bfile.c:116 -msgid "MacOS Fork data" -msgstr "" +#~ msgid "Spooling data again ...\n" +#~ msgstr "Reprise du spool des données...\n" -#: src/findlib/bfile.c:118 -msgid "HFS+ attribs" -msgstr "" +#~ msgid "Error writing data to spool file. ERR=%s\n" +#~ msgstr "" +#~ "Erreur pendant l'écriture des données vers le fichier de spool. ERR=%s\n" -#: src/findlib/bfile.c:120 -msgid "Standard Unix ACL attribs" -msgstr "" +# Impossible d'ouvrir le fichier de spool des attributs : ERR=%s +#, fuzzy +#~ msgid "Truncate on attributes file failed: ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier de spool des attributs %s : ERR=%s\n" -#: src/findlib/bfile.c:122 -msgid "Default Unix ACL attribs" -msgstr "" +#~ msgid "Sending spooled attrs to the Director. Despooling %s bytes ...\n" +#~ msgstr "" +#~ "Transfert des attributs spoolés au Director. Transfert de %s octets...\n" -#: src/findlib/bfile.c:124 -msgid "SHA256 digest" -msgstr "" +# Impossible d'ouvrir le fichier de spool des attributs : ERR=%s +#~ msgid "fopen attr spool file %s failed: ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier de spool des attributs %s : ERR=%s\n" -#: src/findlib/bfile.c:126 -msgid "SHA512 digest" -msgstr "" +#~ msgid "Used Volume status:\n" +#~ msgstr "Volume en cours d'utilisation :\n" -#: src/findlib/bfile.c:128 -msgid "Signed digest" -msgstr "" +#, fuzzy +#~ msgid "3900 missing args in .status command: %s\n" +#~ msgstr "3909 Erreur pendant la lecture de la commande de montage : %s\n" -#: src/findlib/bfile.c:130 -msgid "Encrypted File data" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Device \"%s\" is not open or does not exist.\n" +#~ msgstr "Le Device \"%s\" n'est pas ouvert ou il n'existe pas.\n" -#: src/findlib/bfile.c:132 -msgid "Encrypted Win32 data" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Device %s is %s %s:\n" +#~ " Volume: %s\n" +#~ " Pool: %s\n" +#~ " Media type: %s\n" +#~ msgstr "" +#~ "Le Device %s est monté avec :\n" +#~ " Volume : %s\n" +#~ " Pool : %s\n" +#~ " Type du Media : %s\n" -#: src/findlib/bfile.c:134 -msgid "Encrypted session data" -msgstr "" +#, fuzzy +#~ msgid "waiting for" +#~ msgstr "En attente d'un montage" -#: src/findlib/bfile.c:136 -msgid "Encrypted GZIP data" -msgstr "" +#, fuzzy +#~ msgid "*unknown*" +#~ msgstr "inconnu" -#: src/findlib/bfile.c:138 -msgid "Encrypted compressed data" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Device %s: %s open but no Bacula volume is currently mounted.\n" +#~ msgstr "" +#~ "Le Device %s est ouvert, mais il n'y a pas de Volume Bacula monté.\n" -#: src/findlib/bfile.c:140 -msgid "Encrypted Win32 GZIP data" -msgstr "" +#~ msgid " Total Bytes=%s Blocks=%s Bytes/block=%s\n" +#~ msgstr " Total Octets=%s Blocs=%s Octets/Bloc=%s\n" -#: src/findlib/bfile.c:142 -msgid "Encrypted Win32 Compressed data" -msgstr "" +#~ msgid " Total Bytes Read=%s Blocks Read=%s Bytes/block=%s\n" +#~ msgstr " Total des Octets lu=%s Blocs lu=%s Octets/Bloc=%s\n" -#: src/findlib/bfile.c:144 -msgid "Encrypted MacOS fork data" -msgstr "" +#~ msgid " Positioned at File=%s Block=%s\n" +#~ msgstr " Positionné sur Fichier=%s Bloc=%s\n" -#: src/findlib/bfile.c:146 #, fuzzy -msgid "Plugin Name" -msgstr "Saisissez un nom de Volume : " - -#: src/findlib/bfile.c:148 -msgid "Plugin Data" -msgstr "" +#~ msgid "" +#~ "\n" +#~ "Device %s: %s is not open.\n" +#~ msgstr "Le Device %s n'est pas ouvert.\n" -#: src/findlib/bfile.c:150 #, fuzzy -msgid "Restore Object" -msgstr "Restauration OK" - -#: src/findlib/bfile.c:152 -msgid "AIX ACL attribs" -msgstr "" +#~ msgid " Available Space=%sB\n" +#~ msgstr "Requêtes disponibles :\n" -#: src/findlib/bfile.c:154 -msgid "Darwin ACL attribs" -msgstr "" +#~ msgid "Autochanger \"%s\" with devices:\n" +#~ msgstr "Autochangeur \"%s\" avec les Devices :\n" -#: src/findlib/bfile.c:156 -msgid "FreeBSD Default ACL attribs" -msgstr "" +#~ msgid "" +#~ "\n" +#~ "Device status:\n" +#~ msgstr "" +#~ "\n" +#~ "Statut du Device :\n" -#: src/findlib/bfile.c:158 -msgid "FreeBSD Access ACL attribs" -msgstr "" +#, fuzzy +#~ msgid "Daemon started %s. Jobs: run=%d, running=%d.\n" +#~ msgstr "Démon démarré depuis %s, %d jobs lancés depuis cette date.\n" -#: src/findlib/bfile.c:160 -msgid "HPUX ACL attribs" -msgstr "" +#, fuzzy +#~ msgid " Device is BLOCKED by another SD=%s\n" +#~ msgstr " Le Device est BLOQUE. Démonté par l'utilisateur.\n" -#: src/findlib/bfile.c:162 -msgid "Irix Default ACL attribs" -msgstr "" +#, fuzzy +#~ msgid " Device is disabled. User command.\n" +#~ msgstr " Le Device est BLOQUE. Démonté par l'utilisateur.\n" -#: src/findlib/bfile.c:164 -msgid "Irix Access ACL attribs" -msgstr "" +#~ msgid " Device is BLOCKED. User unmounted.\n" +#~ msgstr " Le Device est BLOQUE. Démonté par l'utilisateur.\n" -#: src/findlib/bfile.c:166 -msgid "Linux Default ACL attribs" -msgstr "" +#~ msgid " Device is BLOCKED. User unmounted during wait for media/mount.\n" +#~ msgstr "" +#~ " Le Device est BLOQUE. Démonté par l'utilisateur à cause d'un " +#~ "chargement de média.\n" -#: src/findlib/bfile.c:168 -msgid "Linux Access ACL attribs" -msgstr "" +#~ msgid "" +#~ " Device is BLOCKED waiting for mount of volume \"%s\",\n" +#~ " Pool: %s\n" +#~ " Media type: %s\n" +#~ msgstr "" +#~ " Le Device est BLOQUE en attente du montage du volume \"%s\",\n" +#~ " Pool : %s\n" +#~ " Media type : %s\n" -#: src/findlib/bfile.c:170 -msgid "TRU64 Default ACL attribs" -msgstr "" +#~ msgid "" +#~ " Device is BLOCKED waiting to create a volume for:\n" +#~ " Pool: %s\n" +#~ " Media type: %s\n" +#~ msgstr "" +#~ " Le Device est BLOQUE en attente de création d'un volume :\n" +#~ " Pool : %s\n" +#~ " Media type : %s\n" -#: src/findlib/bfile.c:172 -msgid "TRU64 Access ACL attribs" -msgstr "" +#~ msgid " Device is BLOCKED waiting for media.\n" +#~ msgstr " Le Device est BLOQUE en attente d'un média.\n" -#: src/findlib/bfile.c:174 -msgid "Solaris POSIX ACL attribs" -msgstr "" +#~ msgid " Device is being initialized.\n" +#~ msgstr " Le Device est en cours d'initialisation.\n" -#: src/findlib/bfile.c:176 -msgid "Solaris NFSv4/ZFS ACL attribs" -msgstr "" +#~ msgid " Device is blocked labeling a Volume.\n" +#~ msgstr " Le Device est occupé à labéliser un Volume.\n" -#: src/findlib/bfile.c:178 -msgid "AFS ACL attribs" -msgstr "" +#, fuzzy +#~ msgid " Slot %d %s loaded in drive %d.\n" +#~ msgstr " Le slot %d est chargé dans le lecteur %d.\n" -#: src/findlib/bfile.c:180 -msgid "AIX POSIX ACL attribs" -msgstr "" +#~ msgid " Drive %d is not loaded.\n" +#~ msgstr " Le lecteur %d n'est pas chargé.\n" -#: src/findlib/bfile.c:182 -msgid "AIX NFSv4 ACL attribs" -msgstr "" +#, fuzzy +#~ msgid "Attached JobIds: " +#~ msgstr "" +#~ "\n" +#~ "Jobs planifiés :\n" -#: src/findlib/bfile.c:184 -msgid "FreeBSD NFSv4/ZFS ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:186 -msgid "GNU Hurd Default ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:188 -msgid "GNU Hurd Access ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:190 -msgid "GNU Hurd Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:192 -msgid "IRIX Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:194 -msgid "TRU64 Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:196 -msgid "AIX Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:198 -msgid "OpenBSD Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:200 -msgid "Solaris Extensible attribs or System Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:202 -msgid "Solaris Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:204 -msgid "Darwin Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:206 -msgid "FreeBSD Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:208 -msgid "Linux Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:210 -msgid "NetBSD Extended attribs" -msgstr "" - -#: src/findlib/create_file.c:118 -#, c-format -msgid "File skipped. Not newer: %s\n" -msgstr "" - -#: src/findlib/create_file.c:125 -#, c-format -msgid "File skipped. Not older: %s\n" -msgstr "" - -#: src/findlib/create_file.c:135 -#, c-format -msgid "File skipped. Already exists: %s\n" -msgstr "" - -#: src/findlib/create_file.c:161 -#, c-format -msgid "File %s already exists and could not be replaced. ERR=%s.\n" -msgstr "" - -#: src/findlib/create_file.c:212 src/findlib/create_file.c:276 -#: src/findlib/create_file.c:371 -#, c-format -msgid "bpkt already open fid=%d\n" -msgstr "" - -#: src/findlib/create_file.c:235 -#, c-format -msgid "Cannot make fifo %s: ERR=%s\n" -msgstr "" - -#: src/findlib/create_file.c:253 -#, c-format -msgid "Cannot make node %s: ERR=%s\n" -msgstr "" - -#: src/findlib/create_file.c:299 -#, c-format -msgid "Could not symlink %s -> %s: ERR=%s\n" -msgstr "" - -#: src/findlib/create_file.c:322 src/findlib/create_file.c:335 -#, fuzzy, c-format -msgid "Could not restore file flags for file %s: ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s : ERR=%s\n" - -#: src/findlib/create_file.c:326 src/findlib/create_file.c:343 -#, c-format -msgid "Could not hard link %s -> %s: ERR=%s\n" -msgstr "" - -#: src/findlib/create_file.c:339 -#, fuzzy, c-format -msgid "Could not reset file flags for file %s: ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s : ERR=%s\n" - -#: src/findlib/create_file.c:395 -#, c-format -msgid "Original file %s have been deleted: type=%d\n" -msgstr "" - -#: src/findlib/create_file.c:407 -#, c-format -msgid "Original file %s not saved: type=%d\n" -msgstr "" - -#: src/findlib/create_file.c:410 -#, c-format -msgid "Unknown file type %d; not restored: %s\n" -msgstr "" - -#: src/findlib/create_file.c:455 -#, c-format -msgid "Zero length filename: %s\n" -msgstr "" - -#: src/findlib/enable_priv.c:81 -msgid "AdjustTokenPrivileges set " -msgstr "" - -#: src/findlib/find.c:185 -#, fuzzy, c-format -msgid "Plugin: \"%s\" not found.\n" -msgstr "Plugin=%s non trouvé.\n" - -#: src/findlib/find_one.c:223 -#, c-format -msgid " NODUMP flag set - will not process %s\n" -msgstr "" - -#: src/findlib/find_one.c:244 -#, fuzzy, c-format -msgid "Cannot stat file %s: ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" - -#: src/findlib/find_one.c:249 -#, c-format -msgid "%s mtime changed during backup.\n" -msgstr "" - -#: src/findlib/find_one.c:256 -#, c-format -msgid "%s ctime changed during backup.\n" -msgstr "" - -#: src/findlib/find_one.c:263 -#, c-format -msgid "%s size of %lld changed during backup to %lld.n" -msgstr "" - -#: src/findlib/find_one.c:391 -#, c-format -msgid "Top level directory \"%s\" has unlisted fstype \"%s\"\n" -msgstr "" - -#: src/findlib/find_one.c:406 -#, c-format -msgid "Top level directory \"%s\" has an unlisted drive type \"%s\"\n" -msgstr "" - -#: src/findlib/mkpath.c:137 src/stored/dedupengine.c:250 -#, c-format -msgid "Cannot create directory %s: ERR=%s\n" -msgstr "" - -#: src/findlib/mkpath.c:141 src/findlib/mkpath.c:217 -#: src/stored/dedupengine.c:254 -#, fuzzy, c-format -msgid "%s exists but is not a directory.\n" -msgstr "%s doit être un répertoire.\n" - -#: src/findlib/mkpath.c:153 -#, c-format -msgid "Security problem!! We created directory %s, but it is a link.\n" -msgstr "" - -#: src/findlib/mkpath.c:179 -#, c-format -msgid "Cannot change owner and/or group of %s: ERR=%s\n" -msgstr "" - -#: src/findlib/mkpath.c:184 -#, c-format -msgid "Cannot change permissions of %s: ERR=%s\n" -msgstr "" - -#: src/findlib/mkpath.c:254 -#, fuzzy, c-format -msgid "%c: is not a valid drive.\n" -msgstr "%s : est une commande invalide.\n" - -#: src/findlib/mkpath.c:298 -msgid "Too many subdirectories. Some permissions not reset.\n" -msgstr "" - -#: src/findlib/savecwd.c:49 -#, fuzzy, c-format -msgid "Cannot open current directory: ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier inclus : %s. ERR=%s\n" - -#: src/findlib/savecwd.c:60 -#, fuzzy, c-format -msgid "Cannot get current directory: ERR=%s\n" -msgstr "change le répertoire courant" - -#: src/findlib/savecwd.c:84 src/findlib/savecwd.c:95 -#, fuzzy, c-format -msgid "Cannot reset current directory: ERR=%s\n" -msgstr "change le répertoire courant" - -#: src/lib/address_conf.c:51 -#, c-format -msgid "Only ipv4 and ipv6 are supported (%d)\n" -msgstr "Seulement l'ipv4 et l'ipv6 sont supportés (%d)\n" - -#: src/lib/address_conf.c:55 -#, c-format -msgid "Only ipv4 is supported (%d)\n" -msgstr "Seulement l'ipv4 est supporté (%d)\n" - -#: src/lib/address_conf.c:178 -#, c-format -msgid "You tried to assign a ipv6 address to an ipv4(%d)\n" -msgstr "" - -#: src/lib/address_conf.c:187 -#, c-format -msgid "You tried to assign an ipv4 address to an ipv6(%d)\n" -msgstr "" - -#: src/lib/address_conf.c:270 -#, fuzzy, c-format -msgid "Can't add default IPv4 address (%s)\n" -msgstr "Impossible d'ajouter l'adresse par défaut (%s)\n" - -#: src/lib/address_conf.c:301 -msgid "" -"Old style addresses cannot be mixed with new style. Try removing Port=nnn." -msgstr "" - -#: src/lib/address_conf.c:323 -#, fuzzy, c-format -msgid "Cannot resolve service(%s)" -msgstr "impossible de trouver une correspondance pour le service (%s)" - -#: src/lib/address_conf.c:333 -#, fuzzy, c-format -msgid "Cannot resolve hostname(%s) %s" -msgstr "impossible de résoudre le hostname (%s) %s" - -#: src/lib/address_conf.c:441 src/lib/address_conf.c:474 -#, fuzzy, c-format -msgid "Expected a block to begin with { but got: %s" -msgstr "Attendait un début de bloc {, pas : %s" - -#: src/lib/address_conf.c:446 -msgid "Empty addr block is not allowed" -msgstr "" - -#: src/lib/address_conf.c:450 -#, fuzzy, c-format -msgid "Expected a string but got: %s" -msgstr "Attendait une chaîne, pas : %s" - -#: src/lib/address_conf.c:461 -#, fuzzy, c-format -msgid "Expected a string [ip|ipv4|ipv6] but got: %s" -msgstr "Attentait la chaîne [ip|ipv4|ipv6], pas : %s" - -#: src/lib/address_conf.c:465 -#, fuzzy, c-format -msgid "Expected a string [ip|ipv4] but got: %s" -msgstr "Attendait la chaîne [ip|ipv4], pas : %s" - -#: src/lib/address_conf.c:470 -#, fuzzy, c-format -msgid "Expected an equal = but got: %s" -msgstr "Attendait un égal =, pas : %s" - -#: src/lib/address_conf.c:481 -#, fuzzy, c-format -msgid "Expected an identifier [addr|port] but got: %s" -msgstr "Attendait un identifiant [addr|port], pas : %s" - -#: src/lib/address_conf.c:486 -msgid "Only one port per address block" -msgstr "Seulement un port par bloc d'adresse" - -#: src/lib/address_conf.c:492 -msgid "Only one addr per address block" -msgstr "Seulement une adresse par bloc d'adresse" - -#: src/lib/address_conf.c:496 -#, fuzzy, c-format -msgid "Expected a identifier [addr|port] but got: %s" -msgstr "Attendait un identifiant [addr|port], pas : %s" - -#: src/lib/address_conf.c:500 -#, c-format -msgid "Expected a equal =, got: %s" -msgstr "Attendait un égal =, pas : %s" - -#: src/lib/address_conf.c:508 -#, fuzzy, c-format -msgid "Expected a number or a string but got: %s" -msgstr "Attendait un nombre ou une chaîne, pas : %s" - -#: src/lib/address_conf.c:514 -#, fuzzy, c-format -msgid "Expected an IP number or a hostname but got: %s" -msgstr "Attendait une adresse IP ou un nom de machine, pas : %s" - -#: src/lib/address_conf.c:520 -msgid "State machine missmatch" -msgstr "" - -#: src/lib/address_conf.c:526 -#, fuzzy, c-format -msgid "Expected a end of block with } but got: %s" -msgstr "Attendait une fin de bloc }, pas : %s" - -#: src/lib/address_conf.c:532 -#, fuzzy, c-format -msgid "Cannot add hostname(%s) and port(%s) to addrlist (%s)" -msgstr "" -"Impossible d'ajouter le hostname (%s) et le port (%s) à la liste d'adresse " -"(%s)" - -#: src/lib/address_conf.c:538 -#, fuzzy, c-format -msgid "Expected an end of block with } but got: %s" -msgstr "Attendait une fin de bloc }, pas : %s" - -#: src/lib/address_conf.c:547 -#, c-format -msgid "Expected an IP number or a hostname, got: %s" -msgstr "Attendait une adresse IP ou un nom de machine, pas : %s" - -#: src/lib/address_conf.c:552 src/lib/address_conf.c:566 -#, fuzzy, c-format -msgid "Cannot add port (%s) to (%s)" -msgstr "impossible d'ajouter le port (%s) à (%s)" - -#: src/lib/address_conf.c:561 -#, c-format -msgid "Expected a port number or string, got: %s" -msgstr "Attendait un numéro de port ou une chaîne, pas : %s" - -#: src/lib/attr.c:70 -#, c-format -msgid "Error scanning attributes: %s\n" -msgstr "Erreur pendant la lecture des attributs : %s\n" - -#: src/lib/berrno.c:52 -msgid "Child exited normally." -msgstr "" - -#: src/lib/berrno.c:59 -msgid "Unknown error during program execvp" -msgstr "" - -#: src/lib/berrno.c:62 -#, c-format -msgid "Child exited with code %d" -msgstr "" - -#: src/lib/berrno.c:70 -#, c-format -msgid "Child died from signal %d: %s" -msgstr "Le processus fils est mort par le signal %d : %s" - -#: src/lib/berrno.c:76 -msgid "Invalid errno. No error message possible." -msgstr "" - -#: src/lib/bget_msg.c:90 -msgid "Status OK\n" -msgstr "Statut OK\n" - -#: src/lib/bget_msg.c:94 -#, c-format -msgid "bget_msg: unknown signal %d\n" -msgstr "" - -#: src/lib/bnet.c:130 -#, fuzzy, c-format -msgid "Attr spool write error. wrote=%d wanted=%d bytes. ERR=%s\n" -msgstr "Erreur pendant l'écriture des attributs dans le spool. ERR=%s\n" - -#: src/lib/bnet.c:215 src/lib/bnet.c:256 -msgid "TLS connection initialization failed.\n" -msgstr "Initialisation de la connexion TLS échouée.\n" - -#: src/lib/bnet.c:223 -msgid "TLS Negotiation failed.\n" -msgstr "Négociation TLS échouée.\n" - -#: src/lib/bnet.c:229 src/lib/bnet.c:271 -msgid "" -"TLS certificate verification failed. Peer certificate did not match a " -"required commonName\n" -msgstr "" - -#: src/lib/bnet.c:280 -#, c-format -msgid "" -"TLS host certificate verification failed. Host name \"%s\" did not match " -"presented certificate\n" -msgstr "" - -#: src/lib/bnet.c:297 -msgid "TLS enabled but not configured.\n" -msgstr "TLS activé mais non configuré.\n" - -#: src/lib/bnet.c:303 -msgid "TLS enable but not configured.\n" -msgstr "TLS actif mais non configuré.\n" - -#: src/lib/bnet.c:400 -msgid "No problem." -msgstr "Pas de problème." - -#: src/lib/bnet.c:403 -msgid "Authoritative answer for host not found." -msgstr "" - -#: src/lib/bnet.c:406 -msgid "Non-authoritative for host not found, or ServerFail." -msgstr "" - -#: src/lib/bnet.c:409 -msgid "Non-recoverable errors, FORMERR, REFUSED, or NOTIMP." -msgstr "" - -#: src/lib/bnet.c:412 -msgid "Valid name, no data record of resquested type." -msgstr "" - -#: src/lib/bnet.c:415 -msgid "Unknown error." -msgstr "Erreur inconnue." - -#: src/lib/bnet.c:557 -#, c-format -msgid "Unknown sig %d" -msgstr "sig inconnu %d" - -#: src/lib/bnet_server.c:99 -#, c-format -msgid "Cannot open stream socket. ERR=%s. Current %s All %s\n" -msgstr "" - -#: src/lib/bnet_server.c:112 -#, c-format -msgid "Cannot set SO_REUSEADDR on socket: %s\n" -msgstr "Impossible de positionner l'option SO_REUSEADDR sur la socket : %s\n" - -#: src/lib/bnet_server.c:121 -#, c-format -msgid "Cannot bind port %d: ERR=%s: Retrying ...\n" -msgstr "Impossible de s'attacher au port %d : ERR=%s : Réessaie...\n" - -#: src/lib/bnet_server.c:129 src/lib/bnet_server.c:137 -#, c-format -msgid "Cannot bind port %d: ERR=%s.\n" -msgstr "Impossible de s'attacher au port %d : ERR=%s.\n" - -#: src/lib/bnet_server.c:144 -#, fuzzy -msgid "No addr/port found to listen on.\n" -msgstr "Aucun volume trouvé pour la restauration.\n" - -#: src/lib/bnet_server.c:150 -#, c-format -msgid "Could not init client queue: ERR=%s\n" -msgstr "Impossible d'initialiser la queue cliente : ERR=%s\n" - -#: src/lib/bnet_server.c:169 -#, c-format -msgid "Error in select: %s\n" -msgstr "Erreur sur le select : %s\n" - -#: src/lib/bnet_server.c:192 -#, c-format -msgid "Connection from %s:%d refused by hosts.access\n" -msgstr "Connexion depuis %s:%d refusée par hosts.access\n" - -#: src/lib/bnet_server.c:208 src/lib/bsock.c:363 src/lib/bsock.c:402 -#, c-format -msgid "Cannot set SO_KEEPALIVE on socket: %s\n" -msgstr "Impossible de positionner SO_KEEPALIVE sur la socket : %s\n" - -#: src/lib/bnet_server.c:220 -msgid "Could not create client BSOCK.\n" -msgstr "Impossible de créer la structure BSOCK cliente.\n" - -#: src/lib/bnet_server.c:227 -#, c-format -msgid "Could not add job to client queue: ERR=%s\n" -msgstr "Impossible d'ajouter le job à la queue cliente : ERR=%s\n" - -#: src/lib/bnet_server.c:244 -#, c-format -msgid "Could not destroy client queue: ERR=%s\n" -msgstr "Impossible de détruire la queue cliente : ERR=%s\n" - -#: src/lib/bpipe.c:373 src/lib/bpipe.c:456 -msgid "Program killed by Bacula (timeout)\n" -msgstr "" - -#: src/lib/bsock.c:221 -#, c-format -msgid "" -"Could not connect to %s on %s:%d. ERR=%s\n" -"Retrying ...\n" -msgstr "" -"Impossible de se connecter à %s sur %s:%d. ERR=%s\n" -"Réessaie...\n" - -#: src/lib/bsock.c:227 -#, c-format -msgid "Unable to connect to %s on %s:%d. ERR=%s\n" -msgstr "Impossible de se connecter à %s sur %s:%d. ERR=%s\n" - -#: src/lib/bsock.c:303 -#, fuzzy, c-format -msgid "gethostbyname() for host \"%s\" failed: ERR=%s\n" -msgstr "Impossible de supprimer le volume \"%s\". ERR=%s" - -#: src/lib/bsock.c:334 src/lib/bsock.c:336 -#, c-format -msgid "Socket open error. proto=%d port=%d. ERR=%s\n" -msgstr "Ouverture de la socket en erreur. proto=%d port=%d. ERR=%s\n" - -#: src/lib/bsock.c:349 src/lib/bsock.c:351 -#, fuzzy, c-format -msgid "Source address bind error. proto=%d. ERR=%s\n" -msgstr "Ouverture de la socket en erreur. proto=%d port=%d. ERR=%s\n" - -#: src/lib/bsock.c:371 -#, fuzzy, c-format -msgid "Cannot set TCP_KEEPIDLE on socket: %s\n" -msgstr "Impossible de positionner SO_KEEPALIVE sur la socket : %s\n" - -#: src/lib/bsock.c:438 -#, fuzzy, c-format -msgid "Could not init bsock read mutex. ERR=%s\n" -msgstr "Impossible d'initialiser la queue cliente : ERR=%s\n" - -#: src/lib/bsock.c:444 -#, fuzzy, c-format -msgid "Could not init bsock write mutex. ERR=%s\n" -msgstr "Impossible d'initialiser la queue cliente : ERR=%s\n" - -#: src/lib/bsock.c:594 -msgid "Socket is closed\n" -msgstr "" - -#: src/lib/bsock.c:600 -#, c-format -msgid "Socket has errors=%d on call to %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:607 -#, c-format -msgid "Socket is terminated=%d on call to %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:616 -#, c-format -msgid "Socket has insane msglen=%d on call to %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:626 -#, c-format -msgid "Flowcontrol failure on %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:711 -#, fuzzy, c-format -msgid "Write error sending %d bytes to %s:%s:%d: ERR=%s\n" -msgstr "Erreur de lecture de %s:%s:%d : ERR=%s\n" - -#: src/lib/bsock.c:717 -#, c-format -msgid "Wrote %d bytes to %s:%s:%d, but only %d accepted.\n" -msgstr "" - -#: src/lib/bsock.c:818 src/lib/bsock.c:846 src/lib/bsock.c:920 -#: src/lib/bsock.c:963 -#, c-format -msgid "Read expected %d got %d from %s:%s:%d\n" -msgstr "Attendait %d en lecture, eu %d de %s:%s:%d\n" - -#: src/lib/bsock.c:879 -#, c-format -msgid "Packet size=%d too big from \"%s:%s:%d. Terminating connection.\n" -msgstr "" - -#: src/lib/bsock.c:909 -#, c-format -msgid "Read error from %s:%s:%d: ERR=%s\n" -msgstr "Erreur de lecture de %s:%s:%d : ERR=%s\n" - -#: src/lib/bsock.c:1041 -#, fuzzy, c-format -msgid "fread attr spool error. Wanted=%d got=%d bytes. ERR=%s\n" -msgstr "Erreur pendant l'écriture des attributs dans le spool. ERR=%s\n" - -#: src/lib/bsock.c:1059 -#, fuzzy -msgid "fread attr spool I/O error.\n" -msgstr "Erreur pendant l'écriture des attributs dans le spool. ERR=%s\n" - -#: src/lib/bsock.c:1120 -#, fuzzy -msgid "Could not malloc BSOCK data buffer\n" -msgstr "Impossible d'ouvrir la base de données \"%s\".\n" - -#: src/lib/bsock.c:1138 src/lib/bsock.c:1157 -#, c-format -msgid "sockopt error: %s\n" -msgstr "erreur sockopt : %s\n" - -#: src/lib/bsock.c:1144 src/lib/bsock.c:1163 -#, c-format -msgid "Warning network buffer = %d bytes not max size.\n" -msgstr "" - -#: src/lib/bsock.c:1183 src/lib/bsock.c:1217 -#, fuzzy, c-format -msgid "fcntl F_GETFL error. ERR=%s\n" -msgstr "erreur de fermeture : ERR=%s\n" - -#: src/lib/bsock.c:1189 src/lib/bsock.c:1223 src/lib/bsock.c:1255 -#, fuzzy, c-format -msgid "fcntl F_SETFL error. ERR=%s\n" -msgstr "erreur de fermeture : ERR=%s\n" - -#: src/lib/bsock.c:1470 -#, fuzzy, c-format -msgid "Director authorization error at \"%s:%d\"\n" -msgstr "Pas d'enregistrement trouvé en base pour : %s\n" - -#: src/lib/bsock.c:1477 -#, c-format -msgid "" -"Authorization error: Remote server at \"%s:%d\" did not advertise required " -"TLS support.\n" -msgstr "" - -#: src/lib/bsock.c:1485 -#, c-format -msgid "" -"Authorization error with Director at \"%s:%d\": Remote server requires TLS.\n" -msgstr "" - -#: src/lib/bsock.c:1497 src/qt-console/bcomm/dircomm_auth.cpp:134 -#, fuzzy, c-format -msgid "TLS negotiation failed with Director at \"%s:%d\"\n" -msgstr "Négociation TLS échouée avec le SD \"%s:%d\".\n" - -#: src/lib/bsock.c:1507 -#, fuzzy, c-format -msgid "" -"Bad errmsg to Hello command: ERR=%s\n" -"The Director at \"%s:%d\" may not be running.\n" -msgstr "Mauvaise réponse à la commande Hello : ERR=%s\n" - -#: src/lib/bsock.c:1516 src/qt-console/bcomm/dircomm_auth.cpp:155 -#, fuzzy, c-format -msgid "Director at \"%s:%d\" rejected Hello command\n" -msgstr "Le File Daemon \"%s:%d\" a rejeté la commande Hello\n" - -#: src/lib/bsock.c:1526 -#, fuzzy, c-format -msgid "" -"Authorization error with Director at \"%s:%d\"\n" -"Most likely the passwords do not agree.\n" -"If you are using TLS, there may have been a certificate validation error " -"during the TLS handshake.\n" -"For help, please see: " -msgstr "" -"Problème d'authentification avec le director.\n" -"Le plus souvent, les mots de pass ne correspondent pas.\n" -"Si vous utilisez TLS, il peut y avoir une erreur de validation du " -"certificat\n" -"pendant l'initialisation de la connexion TLS.\n" -"Vous trouverez de l'aide sur\n" -"http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors\n" - -#: src/lib/bsys.c:142 -#, fuzzy, c-format -msgid "safe_unlink could not compile regex pattern \"%s\" ERR=%s\n" -msgstr "Impossible d'ouvrir %s : ERR=%s\n" - -#: src/lib/bsys.c:342 src/lib/bsys.c:359 src/lib/bsys.c:383 src/lib/bsys.c:396 -#, c-format -msgid "Out of memory: ERR=%s\n" -msgstr "Plus de mémoire : ERR=%s\n" - -#: src/lib/bsys.c:438 -msgid "Buffer overflow.\n" -msgstr "Buffer overflow.\n" - -#: src/lib/bsys.c:504 -msgid "Bad errno" -msgstr "Mauvais errno" - -#: src/lib/bsys.c:519 -#, c-format -msgid "Memset for %d bytes at %s:%d\n" -msgstr "" - -#: src/lib/bsys.c:568 -#, fuzzy, c-format -msgid "Cannot open %s file. %s ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier contenant le pid. %s ERR=%s\n" - -#: src/lib/bsys.c:585 src/lib/bsys.c:621 -#, c-format -msgid "" -"%s is already running. pid=%d\n" -"Check file %s\n" -msgstr "" - -#: src/lib/bsys.c:601 -#, fuzzy, c-format -msgid "Could not open %s file. %s ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier pid. %s ERR=%s\n" - -#: src/lib/bsys.c:624 -#, fuzzy, c-format -msgid "Cannot lock %s file. %s ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier contenant le pid. %s ERR=%s\n" - -#: src/lib/bsys.c:637 -#, fuzzy, c-format -msgid "Cannot not open %s file. %s ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier contenant le pid. %s ERR=%s\n" - -#: src/lib/bsys.c:769 -#, c-format -msgid "Could not create state file. %s ERR=%s\n" -msgstr "Impossible de créer le fichier d'état. %s ERR=%s\n" - -#: src/lib/bsys.c:788 -#, c-format -msgid "Write final hdr error: ERR=%s\n" -msgstr "" - -#: src/lib/btimers.c:254 -msgid "stop_btimer called with NULL btimer_id\n" -msgstr "" - -#: src/lib/cram-md5.c:106 src/lib/cram-md5.c:138 -msgid "1999 Authorization failed.\n" -msgstr "" - -#: src/lib/crypto.c:428 -msgid "Unable to open certificate file" -msgstr "Impossible d'ouvrir de fichier de certificat" - -#: src/lib/crypto.c:435 -msgid "Unable to read certificate from file" -msgstr "Impossible de lire le certificat à partir du fichier" - -#: src/lib/crypto.c:441 -msgid "Unable to extract public key from certificate" -msgstr "Impossible d'extraire la clef publique à partir du certificat" - -#: src/lib/crypto.c:448 -msgid "" -"Provided certificate does not include the required subjectKeyIdentifier " -"extension." -msgstr "" -"Le certificat fournis n'inclus pas l'extension subjectKeyIdentifier requise" - -#: src/lib/crypto.c:455 -#, c-format -msgid "Unsupported key type provided: %d\n" -msgstr "Type de clef fourni non supporté : %d\n" - -#: src/lib/crypto.c:492 src/lib/crypto.c:540 -msgid "Unable to open private key file" -msgstr "Impossible d'ouvrir le fichier de clef privée" - -#: src/lib/crypto.c:522 src/lib/crypto.c:556 -msgid "Unable to read private key from file" -msgstr "Impossible de lire la clef privée à partir du fichier" - -#: src/lib/crypto.c:615 -#, c-format -msgid "Unsupported digest type: %d\n" -msgstr "Le digest spécifié n'est pas supporté : %d\n" - -#: src/lib/crypto.c:629 -msgid "OpenSSL digest initialization failed" -msgstr "" - -#: src/lib/crypto.c:643 -msgid "OpenSSL digest update failed" -msgstr "" - -#: src/lib/crypto.c:661 -msgid "OpenSSL digest finalize failed" -msgstr "Initialisation du digest OpenSSL à échoué" - -#: src/lib/crypto.c:759 -msgid "OpenSSL digest_new failed" -msgstr "" - -#: src/lib/crypto.c:765 -msgid "OpenSSL sign get digest failed" -msgstr "" - -#: src/lib/crypto.c:804 src/lib/crypto.c:808 -#, fuzzy -msgid "OpenSSL digest Verify final failed" -msgstr "Initialisation du contexte clef/IV du cipher OpenSSL à échoué" - -#: src/lib/crypto.c:813 -#, fuzzy -msgid "No signers found for crypto verify.\n" -msgstr "Aucun volume trouvé pour la restauration.\n" - -#: src/lib/crypto.c:874 -msgid "Signature creation failed" -msgstr "La création de la signature a échouée" - -#: src/lib/crypto.c:952 -msgid "Signature decoding failed" -msgstr "Le décodage de la signature a échoué" - -#: src/lib/crypto.c:1029 -msgid "Unsupported cipher type specified\n" -msgstr "Le cipher spécifié est non supporté\n" - -#: src/lib/crypto.c:1178 -msgid "CryptoData decoding failed" -msgstr "Le décodage du CryptoData a échoué" - -#: src/lib/crypto.c:1222 -msgid "Failure decrypting the session key" -msgstr "Impossible de décrypter la clef de session" - -#: src/lib/crypto.c:1273 -#, c-format -msgid "Unsupported contentEncryptionAlgorithm: %d\n" -msgstr "contentEncryptionAlgorithm non supporté : %d\n" - -#: src/lib/crypto.c:1283 src/lib/crypto.c:1289 -msgid "OpenSSL cipher context initialization failed" -msgstr "Initialisation du contexte clef/IV du cipher OpenSSL à échoué" - -#: src/lib/crypto.c:1296 -msgid "Encryption session provided an invalid symmetric key" -msgstr "" - -#: src/lib/crypto.c:1302 -msgid "Encryption session provided an invalid IV" -msgstr "" - -#: src/lib/crypto.c:1308 -msgid "OpenSSL cipher context key/IV initialization failed" -msgstr "" - -#: src/lib/crypto.c:1407 -#, fuzzy, c-format -msgid "Unsupported digest type=%d specified\n" -msgstr "Le cipher spécifié est non supporté\n" - -#: src/lib/crypto.c:1427 -#, c-format -msgid "SHA1Update() returned an error: %d\n" -msgstr "" - -#: src/lib/crypto.c:1566 -msgid "No error" -msgstr "Pas d'erreur" - -#: src/lib/crypto.c:1568 -#, fuzzy -msgid "Signer not found" -msgstr "Le Storage \"%s\" est introuvable.\n" - -#: src/lib/crypto.c:1570 -#, fuzzy -msgid "Recipient not found" -msgstr "Ressource %s introuvable\n" - -#: src/lib/crypto.c:1572 -#, fuzzy -msgid "Unsupported digest algorithm" -msgstr "Le digest spécifié n'est pas supporté : %d\n" - -#: src/lib/crypto.c:1574 -#, fuzzy -msgid "Unsupported encryption algorithm" -msgstr "contentEncryptionAlgorithm non supporté : %d\n" - -#: src/lib/crypto.c:1576 -#, fuzzy -msgid "Signature is invalid" -msgstr "La création de la signature a échouée" - -#: src/lib/crypto.c:1578 -msgid "Decryption error" -msgstr "" - -#: src/lib/crypto.c:1581 -msgid "Internal error" -msgstr "Erreur interne" - -#: src/lib/crypto.c:1583 -msgid "Unknown error" -msgstr "Erreur inconnue." - -#: src/lib/daemon.c:51 -#, fuzzy, c-format -msgid "Cannot fork to become daemon: ERR=%s\n" -msgstr "Impossible de forker pour passer en mode démon : %s\n" - -#: src/lib/devlock.c:319 -msgid "writeunlock called too many times.\n" -msgstr "" - -#: src/lib/devlock.c:324 -msgid "writeunlock by non-owner.\n" -msgstr "" - -#: src/lib/devlock.c:490 src/lib/rwlock.c:427 -#, c-format -msgid "Thread %d found unchanged elements %d times\n" -msgstr "" - -#: src/lib/devlock.c:558 src/lib/rwlock.c:494 -#, c-format -msgid "%02d: interval %d, writes %d, reads %d\n" -msgstr "" - -#: src/lib/devlock.c:568 src/lib/rwlock.c:504 -#, c-format -msgid "data %02d: value %d, %d writes\n" -msgstr "" - -#: src/lib/devlock.c:573 src/lib/rwlock.c:509 -#, c-format -msgid "Total: %d thread writes, %d data writes\n" -msgstr "" - -#: src/lib/devlock.c:645 src/lib/rwlock.c:581 -msgid "Try write lock" -msgstr "" - -#: src/lib/devlock.c:651 src/lib/rwlock.c:587 -msgid "Try read lock" -msgstr "" - -#: src/lib/devlock.c:705 src/lib/rwlock.c:640 -msgid "Create thread" -msgstr "" - -#: src/lib/devlock.c:715 src/lib/rwlock.c:650 -msgid "Join thread" -msgstr "" - -#: src/lib/devlock.c:717 src/lib/rwlock.c:652 -#, c-format -msgid "%02d: interval %d, updates %d, r_collisions %d, w_collisions %d\n" -msgstr "" - -#: src/lib/devlock.c:729 src/lib/rwlock.c:664 -#, c-format -msgid "data %02d: value %d, %d updates\n" -msgstr "" - -#: src/lib/edit.c:491 -msgid "Empty name not allowed.\n" -msgstr "" - -#: src/lib/edit.c:501 -#, c-format -msgid "Illegal character \"%c\" in name.\n" -msgstr "Caractère illégal \"%c\" dans le nom.\n" - -#: src/lib/edit.c:508 -msgid "Name too long.\n" -msgstr "Nom trop long.\n" - -#: src/lib/ini.c:97 src/lib/ini.c:109 -#, fuzzy, c-format -msgid "" -"Config file error: %s\n" -" : Line %d, col %d of file %s\n" -"%s\n" -msgstr "" -"Erreur de config : %s\n" -" : ligne %d, col %d du fichier %s\n" -"%s\n" -"%s" - -#: src/lib/ini.c:367 src/lib/ini.c:414 -#, fuzzy, c-format -msgid "Cannot open config file %s: %s\n" -msgstr "Impossible d'ouvrir le fichier de configuration \"%s\" : %s\n" - -#: src/lib/ini.c:382 -#, fuzzy -msgid "Cannot open lex\n" -msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" - -#: src/lib/jcr.c:221 src/lib/util.c:438 -msgid "Backup" -msgstr "Backup" - -#: src/lib/jcr.c:223 -msgid "Verifying" -msgstr "Vérification" - -#: src/lib/jcr.c:225 -msgid "Restoring" -msgstr "Restauration" - -#: src/lib/jcr.c:227 -msgid "Archiving" -msgstr "Archivage" - -#: src/lib/jcr.c:229 -msgid "Copying" -msgstr "Copier" - -#: src/lib/jcr.c:231 -msgid "Migration" -msgstr "Migrer" - -#: src/lib/jcr.c:233 -#, fuzzy -msgid "Scanning" -msgstr "En cours" - -#: src/lib/jcr.c:235 -msgid "Unknown operation" -msgstr "Opération inconnue" - -#: src/lib/jcr.c:244 -msgid "backup" -msgstr "backup" - -#: src/lib/jcr.c:246 -msgid "verified" -msgstr "vérifié" - -#: src/lib/jcr.c:246 -msgid "verify" -msgstr "Vérifier" - -#: src/lib/jcr.c:248 -msgid "restored" -msgstr "Restauré" - -#: src/lib/jcr.c:248 -msgid "restore" -msgstr "restaurer" - -#: src/lib/jcr.c:250 -msgid "archived" -msgstr "archivé" - -#: src/lib/jcr.c:250 -msgid "archive" -msgstr "archiver" - -#: src/lib/jcr.c:252 -msgid "copied" -msgstr "copié" - -#: src/lib/jcr.c:252 -msgid "copy" -msgstr "copier" - -#: src/lib/jcr.c:254 -msgid "migrated" -msgstr "migrer" - -#: src/lib/jcr.c:254 -msgid "migrate" -msgstr "migré" - -#: src/lib/jcr.c:256 -msgid "scanned" -msgstr "scanné" - -#: src/lib/jcr.c:256 -msgid "scan" -msgstr "scanner" - -#: src/lib/jcr.c:258 -msgid "unknown action" -msgstr "action inconnue" - -#: src/lib/jcr.c:310 src/lib/lockmgr.c:305 src/lib/lockmgr.c:780 -#: src/lib/lockmgr.c:808 -#, c-format -msgid "pthread key create failed: ERR=%s\n" -msgstr "erreur sur pthread_key_create. ERR=%s\n" - -#: src/lib/jcr.c:331 -#, c-format -msgid "pthread_once failed. ERR=%s\n" -msgstr "erreur sur pthread_once. ERR=%s\n" - -#: src/lib/jcr.c:340 -#, fuzzy, c-format -msgid "Could not init msg_queue mutex. ERR=%s\n" -msgstr "Impossible d'initialiser la queue cliente : ERR=%s\n" - -#: src/lib/jcr.c:397 -msgid "NULL jcr.\n" -msgstr "NULL jcr.\n" - -#: src/lib/jcr.c:606 -#, fuzzy, c-format -msgid "pthread_setspecific failed: ERR=%s\n" -msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" - -#: src/lib/jcr.c:1097 -#, c-format -msgid "" -"Watchdog sending kill after %d secs to thread stalled reading Storage " -"daemon.\n" -msgstr "" -"Le watchdog a envoyé un signal après %d secs au thread bloqué en écoute du " -"SD.\n" - -#: src/lib/jcr.c:1109 -#, c-format -msgid "" -"Watchdog sending kill after %d secs to thread stalled reading File daemon.\n" -msgstr "" -"Le watchdog a envoyé un signal après %d secs au thread bloqué en écoute du " -"FD.\n" - -#: src/lib/jcr.c:1121 -#, c-format -msgid "" -"Watchdog sending kill after %d secs to thread stalled reading Director.\n" -msgstr "" -"Le watchdog a envoyé un signal après %d secs au thread bloqué en écoute du " -"Director.\n" - -#: src/lib/lex.c:81 -#, c-format -msgid "Problem probably begins at line %d.\n" -msgstr "Le problème commence sûrement au début de la ligne %d.\n" - -#: src/lib/lex.c:86 -#, c-format -msgid "" -"Config error: %s\n" -" : line %d, col %d of file %s\n" -"%s\n" -"%s" -msgstr "" -"Erreur de config : %s\n" -" : ligne %d, col %d du fichier %s\n" -"%s\n" -"%s" - -#: src/lib/lex.c:90 -#, c-format -msgid "Config error: %s\n" -msgstr "Erreur de config : %s\n" - -#: src/lib/lex.c:119 -msgid "Close of NULL file\n" -msgstr "" - -#: src/lib/lex.c:273 src/lib/xml.c:149 -msgid "" -"get_char: called after EOF. You may have a open double quote without the " -"closing double quote.\n" -msgstr "" - -#: src/lib/lex.c:333 src/lib/xml.c:192 src/lib/xml.c:205 -#, c-format -msgid "Config token too long, file: %s, line %d, begins at line %d\n" -msgstr "Config token trop long, fichier : %s, ligne %d, débutant ligne %d\n" - -#: src/lib/lex.c:357 -msgid "none" -msgstr "none" - -#: src/lib/lex.c:358 -msgid "comment" -msgstr "comment" - -#: src/lib/lex.c:359 -msgid "number" -msgstr "number" - -#: src/lib/lex.c:360 -msgid "ip_addr" -msgstr "ip_addr" - -# identifiant -#: src/lib/lex.c:361 -msgid "identifier" -msgstr "identifier" - -#: src/lib/lex.c:362 -msgid "string" -msgstr "string" - -#: src/lib/lex.c:363 -msgid "quoted_string" -msgstr "quoted_string" - -#: src/lib/lex.c:364 -#, fuzzy -msgid "include" -msgstr "Depuis" - -#: src/lib/lex.c:365 -#, fuzzy -msgid "include_quoted_string" -msgstr "quoted_string" - -#: src/lib/lex.c:366 -msgid "UTF-8 Byte Order Mark" -msgstr "" - -#: src/lib/lex.c:367 -msgid "UTF-16le Byte Order Mark" -msgstr "" - -#: src/lib/lex.c:405 src/lib/lex.c:411 src/lib/lex.c:422 src/lib/lex.c:428 -#, c-format -msgid "expected a positive integer number, got: %s" -msgstr "attendait un nombre entier positif, pas : %s" - -#: src/lib/lex.c:544 src/lib/xml.c:344 -msgid "" -"This config file appears to be in an unsupported Unicode format (UTF-16be). " -"Please resave as UTF-8\n" -msgstr "" - -#: src/lib/lex.c:690 src/lib/lex.c:718 -#, c-format -msgid "Cannot open included config file %s: %s\n" -msgstr "Impossible d'ouvrir le fichier de configuration inclus %s : %s\n" - -#: src/lib/lex.c:777 src/lib/lex.c:834 -#, c-format -msgid "expected an integer or a range, got %s: %s" -msgstr "attendait un entier ou bien un intervalle, pas %s : %s" - -#: src/lib/lex.c:791 src/lib/lex.c:799 src/lib/lex.c:810 src/lib/lex.c:818 -#, c-format -msgid "expected an integer number, got %s: %s" -msgstr "attendait un nombre entier, pas %s : %s" - -#: src/lib/lex.c:848 -#, c-format -msgid "expected a name, got %s: %s" -msgstr "attendait un nom, pas %s : %s" - -#: src/lib/lex.c:852 -#, c-format -msgid "name %s length %d too long, max is %d\n" -msgstr "la longueur du nom %s (%d) est trop grande, le max est %d\n" - -#: src/lib/lex.c:860 -#, c-format -msgid "expected a string, got %s: %s" -msgstr "attendait une chaîne, pas %s : %s" - -#: src/lib/lockmgr.c:54 -#, c-format -msgid "ASSERT failed at %s:%i: %s\n" -msgstr "" - -#: src/lib/lockmgr.c:59 -#, c-format -msgid "ASSERT failed at %s:%i: %s \n" -msgstr "" - -#: src/lib/lockmgr.c:65 -#, c-format -msgid "ASSERT failed at %s:%i: %s (%s)\n" -msgstr "" - -#: src/lib/lockmgr.c:96 -#, fuzzy, c-format -msgid "Mutex lock failure. ERR=%s\n" -msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" - -#: src/lib/lockmgr.c:106 -#, fuzzy, c-format -msgid "Mutex unlock failure. ERR=%s\n" -msgstr "rwl_writeunlock en échec sur %s:%d :. ERR=%s\n" - -#: src/lib/lockmgr.c:792 -#, fuzzy, c-format -msgid "pthread_create failed: ERR=%s\n" -msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" - -#: src/lib/mem_pool.c:103 -#, c-format -msgid "MemPool index %d larger than max %d\n" -msgstr "" - -#: src/lib/mem_pool.c:121 src/lib/mem_pool.c:141 src/lib/mem_pool.c:177 -#: src/lib/mem_pool.c:250 src/lib/mem_pool.c:270 src/lib/mem_pool.c:305 -#: src/lib/mem_pool.c:616 -#, c-format -msgid "Out of memory requesting %d bytes\n" -msgstr "Plus de mémoire à l'allocation de %d octets\n" - -#: src/lib/mem_pool.c:158 -msgid "obuf is NULL\n" -msgstr "" - -#: src/lib/message.c:418 src/lib/message.c:428 -#, c-format -msgid "Could not open console message file %s: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:433 -#, c-format -msgid "Could not get con mutex: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:538 -msgid "Bacula Message" -msgstr "Message de Bacula" - -#: src/lib/message.c:542 -#, c-format -msgid "open mail pipe %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:633 -msgid "open mail pipe failed.\n" -msgstr "" - -#: src/lib/message.c:646 -#, c-format -msgid "close error: ERR=%s\n" -msgstr "erreur de fermeture : ERR=%s\n" - -#: src/lib/message.c:657 -#, c-format -msgid "Mail prog: %s" -msgstr "" - -#: src/lib/message.c:666 -#, c-format -msgid "" -"Mail program terminated in error.\n" -"CMD=%s\n" -"ERR=%s\n" -msgstr "" -"La commande mail s'est terminée en erreur.\n" -"CMD=%s\n" -"ERR=%s\n" - -#: src/lib/message.c:773 -#, c-format -msgid "fopen %s failed: ERR=%s\n" -msgstr "fopen %s en erreur : ERR=%s\n" - -#: src/lib/message.c:895 src/lib/message.c:898 -msgid "Msg delivery error: Unable to store data in database.\n" -msgstr "" - -#: src/lib/message.c:950 -#, fuzzy, c-format -msgid "" -"Msg delivery error: Operator mail program terminated in error.\n" -"CMD=%s\n" -"ERR=%s\n" -msgstr "" -"La commande mail s'est terminée en erreur.\n" -"CMD=%s\n" -"ERR=%s\n" - -#: src/lib/message.c:971 -#, fuzzy, c-format -msgid "Msg delivery error: fopen %s failed: ERR=%s\n" -msgstr "fopen %s en erreur : ERR=%s\n" - -#: src/lib/message.c:1318 -#, c-format -msgid "%s: ABORTING due to ERROR in %s:%d\n" -msgstr "" - -#: src/lib/message.c:1322 -#, c-format -msgid "%s: ERROR TERMINATION at %s:%d\n" -msgstr "" - -#: src/lib/message.c:1327 -#, c-format -msgid "%s: Fatal Error because: " -msgstr "%s : Erreur Fatale car : " - -#: src/lib/message.c:1329 -#, c-format -msgid "%s: Fatal Error at %s:%d because:\n" -msgstr "%s : Erreur Fatale à %s:%d car :\n" - -#: src/lib/message.c:1333 -#, c-format -msgid "%s: ERROR: " -msgstr "%s : ERREUR : " - -#: src/lib/message.c:1335 -#, c-format -msgid "%s: ERROR in %s:%d " -msgstr "%s : ERREUR dans %s:%d " - -#: src/lib/message.c:1338 -#, c-format -msgid "%s: Warning: " -msgstr "%s : Attention : " - -#: src/lib/message.c:1341 -#, c-format -msgid "%s: Security violation: " -msgstr "" - -#: src/lib/message.c:1430 -#, c-format -msgid "%s ABORTING due to ERROR\n" -msgstr "" - -#: src/lib/message.c:1433 -#, c-format -msgid "%s ERROR TERMINATION\n" -msgstr "" - -#: src/lib/message.c:1436 -#, fuzzy, c-format -msgid "%s JobId %u: Fatal error: " -msgstr "%s : %s Erreur fatale : " - -#: src/lib/message.c:1445 -#, fuzzy, c-format -msgid "%s JobId %u: Error: " -msgstr "%s : %s Erreur : " - -#: src/lib/message.c:1451 -#, fuzzy, c-format -msgid "%s JobId %u: Warning: " -msgstr "%s : Attention : " - -#: src/lib/message.c:1457 -#, c-format -msgid "%s JobId %u: Security violation: " -msgstr "" - -#: src/lib/message.c:1732 -msgid "Debug lock information" -msgstr "" - -#: src/lib/message.c:1733 -msgid "Debug network information" -msgstr "" - -#: src/lib/message.c:1734 -msgid "Debug plugin information" -msgstr "" - -#: src/lib/message.c:1735 -msgid "Debug volume information" -msgstr "" - -#: src/lib/message.c:1736 -msgid "Debug SQL queries" -msgstr "" - -#: src/lib/message.c:1737 -msgid "Debug BVFS queries" -msgstr "" - -#: src/lib/message.c:1738 -msgid "Debug memory allocation" -msgstr "" - -#: src/lib/message.c:1739 -msgid "Debug scheduler information" -msgstr "" - -#: src/lib/message.c:1740 -msgid "Debug protocol information" -msgstr "" - -#: src/lib/message.c:1741 -msgid "Debug dedup information" -msgstr "" - -#: src/lib/message.c:1742 -msgid "Debug snapshots" -msgstr "" - -#: src/lib/message.c:1743 -msgid "Debug dedup engine" -msgstr "" - -#: src/lib/message.c:1744 -msgid "ASX personal's debugging" -msgstr "" - -#: src/lib/message.c:1745 -msgid "Debug all information" -msgstr "" - -#: src/lib/openssl.c:113 src/lib/openssl.c:172 src/stored/dev.c:385 -#: src/stored/dev.c:443 -#, c-format -msgid "Unable to init mutex: ERR=%s\n" -msgstr "Impossible d'initialiser le muxtex : ERR=%s\n" - -#: src/lib/openssl.c:134 src/lib/openssl.c:205 -#, c-format -msgid "Unable to destroy mutex: ERR=%s\n" -msgstr "Impossible de détruire le mutex : ERR=%s\n" - -#: src/lib/openssl.c:273 -#, c-format -msgid "Unable to init OpenSSL threading: ERR=%s\n" -msgstr "Impossible d'initialiser le thread OpenSSL : ERR=%s\n" - -#: src/lib/openssl.c:286 -msgid "Failed to seed OpenSSL PRNG\n" -msgstr "" - -#: src/lib/openssl.c:312 -msgid "Failed to save OpenSSL PRNG\n" -msgstr "Impossible de sauvegarder le PRNG OpenSSL\n" - -#: src/lib/parse_conf.c:164 -msgid "***UNKNOWN***" -msgstr "" - -#: src/lib/parse_conf.c:208 -#, c-format -msgid "Attempt to define second %s resource named \"%s\" is not permitted.\n" -msgstr "" - -#: src/lib/parse_conf.c:214 -#, c-format -msgid "Inserted res: %s index=%d\n" -msgstr "" - -#: src/lib/parse_conf.c:328 src/lib/parse_conf.c:349 -#, c-format -msgid "expected an =, got: %s" -msgstr "attendait un =, eu : %s" - -#: src/lib/parse_conf.c:358 -#, c-format -msgid "Unknown item code: %d\n" -msgstr "" - -#: src/lib/parse_conf.c:398 -#, c-format -msgid "message type: %s not found" -msgstr "" - -#: src/lib/parse_conf.c:437 -#, c-format -msgid "Attempt to redefine name \"%s\" to \"%s\"." -msgstr "" - -#: src/lib/parse_conf.c:542 -#, c-format -msgid "Attempt to redefine resource \"%s\" referenced on line %d : %s\n" -msgstr "" - -#: src/lib/parse_conf.c:578 -#, c-format -msgid "Too many %s directives. Max. is %d. line %d: %s\n" -msgstr "" - -#: src/lib/parse_conf.c:589 -#, c-format -msgid "Could not find config Resource \"%s\" referenced on line %d : %s\n" -msgstr "Impossible de trouver la ressource \"%s\" utilisée ligne %d : %s\n" - -#: src/lib/parse_conf.c:657 -#, c-format -msgid "Missing config Resource \"%s\" referenced on line %d : %s\n" -msgstr "Impossible de trouver la ressource \"%s\" utilisée ligne %d : %s\n" - -#: src/lib/parse_conf.c:732 -#, c-format -msgid "expected a size number, got: %s" -msgstr "attendait une taille, eu : %s" - -#: src/lib/parse_conf.c:737 -#, fuzzy, c-format -msgid "expected a speed number, got: %s" -msgstr "attendait une taille, eu : %s" - -#: src/lib/parse_conf.c:748 -#, fuzzy, c-format -msgid "expected a %s, got: %s" -msgstr "attendait un =, eu : %s" - -#: src/lib/parse_conf.c:749 -msgid "size" -msgstr "" - -#: src/lib/parse_conf.c:749 -msgid "speed" -msgstr "" - -#: src/lib/parse_conf.c:870 -#, c-format -msgid "Expected a Tape Label keyword, got: %s" -msgstr "Attendait un Label de lecteur, a pas : %s" - -#: src/lib/parse_conf.c:939 -#, c-format -msgid "Unable to initialize resource lock. ERR=%s\n" -msgstr "" - -#: src/lib/parse_conf.c:947 -#, fuzzy -msgid "Config filename too long.\n" -msgstr "Nom de Volume trop long.\n" - -#: src/lib/parse_conf.c:971 -#, c-format -msgid "Cannot open config file \"%s\": %s\n" -msgstr "Impossible d'ouvrir le fichier de configuration \"%s\" : %s\n" - -#: src/lib/parse_conf.c:989 -msgid "" -"Currently we cannot handle UTF-16 source files. Please convert the conf file " -"to UTF-8\n" -msgstr "" - -#: src/lib/parse_conf.c:993 -#, c-format -msgid "Expected a Resource name identifier, got: %s" -msgstr "Attendait un identifiant de Ressource, a pas : %s" - -#: src/lib/parse_conf.c:1009 -#, c-format -msgid "expected resource name, got: %s" -msgstr "attendait un nom de ressource, eu : %s" - -#: src/lib/parse_conf.c:1020 -#, c-format -msgid "not in resource definition: %s" -msgstr "" - -#: src/lib/parse_conf.c:1051 -#, c-format -msgid "" -"Keyword \"%s\" not permitted in this resource.\n" -"Perhaps you left the trailing brace off of the previous resource." -msgstr "" - -#: src/lib/parse_conf.c:1062 -msgid "Name not specified for resource" -msgstr "" - -#: src/lib/parse_conf.c:1072 -#, c-format -msgid "unexpected token %d %s in resource definition" -msgstr "mot clés inattendu %d %s dans la définition de la ressource" - -#: src/lib/parse_conf.c:1078 -#, c-format -msgid "Unknown parser state %d\n" -msgstr "" - -#: src/lib/parse_conf.c:1083 -msgid "End of conf file reached with unclosed resource." -msgstr "" - -#: src/lib/plugins.c:106 -#, fuzzy, c-format -msgid "Failed to open Plugin directory %s: ERR=%s\n" -msgstr "3910 Impossible d'ouvrir le device %s : ERR=%s\n" - -#: src/lib/plugins.c:123 -#, c-format -msgid "Failed to find any plugins in %s\n" -msgstr "" - -#: src/lib/plugins.c:157 -#, fuzzy, c-format -msgid "dlopen plugin %s failed: ERR=%s\n" -msgstr "fopen %s en erreur : ERR=%s\n" - -#: src/lib/plugins.c:168 -#, fuzzy, c-format -msgid "Lookup of loadPlugin in plugin %s failed: ERR=%s\n" -msgstr "fopen %s en erreur : ERR=%s\n" - -# Impossible d'ouvrir le fichier de spool des attributs : ERR=%s -#: src/lib/plugins.c:177 -#, fuzzy, c-format -msgid "Lookup of unloadPlugin in plugin %s failed: ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier de spool des attributs %s : ERR=%s\n" - -#: src/lib/priv.c:57 -#, c-format -msgid "Could not find userid=%s: ERR=%s\n" -msgstr "Impossible de trouver le userid %s : ERR=%s\n" - -#: src/lib/priv.c:63 -#, fuzzy, c-format -msgid "Could not find password entry. ERR=%s\n" -msgstr "Impossible de trouver le client %s : ERR=%s\n" - -#: src/lib/priv.c:76 -#, c-format -msgid "Could not find group=%s: ERR=%s\n" -msgstr "Impossible de trouver le groupe=%s : ERR=%s\n" - -#: src/lib/priv.c:84 -#, c-format -msgid "Could not initgroups for group=%s, userid=%s: ERR=%s\n" -msgstr "" -"Impossible d'utiliser initgroups pour le groupe=%s, userid=%s: ERR=%s\n" -"\n" - -#: src/lib/priv.c:87 -#, fuzzy, c-format -msgid "Could not initgroups for userid=%s: ERR=%s\n" -msgstr "Impossible d'ouvrir %s : ERR=%s\n" - -#: src/lib/priv.c:94 -#, fuzzy, c-format -msgid "Could not set group=%s: ERR=%s\n" -msgstr "Impossible d'ouvrir %s : ERR=%s\n" - -#: src/lib/priv.c:104 -#, fuzzy, c-format -msgid "prctl failed: ERR=%s\n" -msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" - -#: src/lib/priv.c:108 -#, fuzzy, c-format -msgid "setreuid failed: ERR=%s\n" -msgstr "fopen %s en erreur : ERR=%s\n" - -#: src/lib/priv.c:112 -#, fuzzy, c-format -msgid "cap_from_text failed: ERR=%s\n" -msgstr "fopen %s en erreur : ERR=%s\n" - -#: src/lib/priv.c:116 -#, fuzzy, c-format -msgid "cap_set_proc failed: ERR=%s\n" -msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" - -#: src/lib/priv.c:120 -msgid "Keep readall caps not implemented this OS or missing libraries.\n" -msgstr "" - -#: src/lib/priv.c:124 -#, c-format -msgid "Could not set specified userid: %s\n" -msgstr "" - -#: src/lib/pythonlib.c:105 -msgid "Could not initialize Python\n" -msgstr "Impossible d'initialiser le Python\n" - -#: src/lib/pythonlib.c:110 -#, c-format -msgid "Could not Run Python string %s\n" -msgstr "Impossible de lancer la commande Python %s\n" - -#: src/lib/pythonlib.c:122 -msgid "Could not initialize Python Job type.\n" -msgstr "" - -#: src/lib/pythonlib.c:127 -#, c-format -msgid "Could not import Python script %s/%s. Python disabled.\n" -msgstr "" - -#: src/lib/pythonlib.c:229 -msgid "Could not create Python Job Object.\n" -msgstr "" - -#: src/lib/pythonlib.c:242 src/lib/pythonlib.c:266 -#, c-format -msgid "Python function \"%s\" not found.\n" -msgstr "" - -#: src/lib/pythonlib.c:281 -#, c-format -msgid "Unknown Python daemon event %s\n" -msgstr "" - -#: src/lib/pythonlib.c:306 -#, fuzzy, c-format -msgid "Unable to initialize the Python lock. ERR=%s\n" -msgstr "Impossible d'initialiser le verrou sur la base. ERR=%s\n" - -#: src/lib/res.c:54 -#, c-format -msgid "rwl_writelock failure at %s:%d: ERR=%s\n" -msgstr "rwl_writelock en échec sur %s:%d : ERR=%s\n" - -#: src/lib/res.c:64 -#, c-format -msgid "rwl_writeunlock failure at %s:%d:. ERR=%s\n" -msgstr "rwl_writeunlock en échec sur %s:%d :. ERR=%s\n" - -#: src/lib/runscript.c:225 -#, c-format -msgid "%s: run %s \"%s\"\n" -msgstr "%s: exécution %s de la commande \"%s\"\n" - -#: src/lib/runscript.c:234 -#, c-format -msgid "Runscript: %s could not execute. ERR=%s\n" -msgstr "Runscript : impossible d'exécuter %s. ERR=%s\n" - -#: src/lib/runscript.c:243 -#, c-format -msgid "%s: %s\n" -msgstr "%s: %s\n" - -#: src/lib/runscript.c:248 -#, c-format -msgid "Runscript: %s returned non-zero status=%d. ERR=%s\n" -msgstr "" -"Runscript : %s s'est terminé avec un statut différent de 0 statut=%d. ERR=" -"%s\n" - -#: src/lib/rwlock.c:291 -msgid "rwl_writeunlock called too many times.\n" -msgstr "" - -#: src/lib/rwlock.c:296 -msgid "rwl_writeunlock by non-owner.\n" -msgstr "" - -#: src/lib/sellist.c:58 -#, fuzzy -msgid "Negative numbers not permitted.\n" -msgstr "Les nombres négatifs ne sont pas autorisés\n" - -#: src/lib/sellist.c:84 -#, fuzzy -msgid "User cancel requested.\n" -msgstr "Restauration annulée" - -#: src/lib/sellist.c:107 -#, fuzzy -msgid "Selection items must be be greater than zero.\n" -msgstr "Les valeurs doivent être supérieurs à zéro.\n" - -#: src/lib/signal.c:57 -msgid "Invalid signal number" -msgstr "" - -#: src/lib/signal.c:147 src/lib/signal.c:149 -#, c-format -msgid "Bacula interrupted by signal %d: %s\n" -msgstr "Bacula a reçu le signal %d : %s\n" - -#: src/lib/signal.c:165 -#, fuzzy, c-format -msgid "Kaboom! %s, %s got signal %d - %s at %s. Attempting traceback.\n" -msgstr "" -"Kaboom ! %s, %s a reçu le signal %d - %s. Tentative de dump des traces.\n" - -#: src/lib/signal.c:167 -#, c-format -msgid "Kaboom! exepath=%s\n" -msgstr "Kaboom ! exepath=%s\n" - -#: src/lib/signal.c:208 -#, c-format -msgid "Fork error: ERR=%s\n" -msgstr "Fork en erreur : ERR=%s\n" - -#: src/lib/signal.c:216 -#, fuzzy, c-format -msgid "Calling: %s %s %s %s\n" -msgstr "Exécution : %s %s %s\n" - -#: src/lib/signal.c:220 -#, c-format -msgid "execv: %s failed: ERR=%s\n" -msgstr "execv : %s en échec : ERR=%s\n" - -#: src/lib/signal.c:242 -#, c-format -msgid "It looks like the traceback worked...\n" -msgstr "" - -#: src/lib/signal.c:244 -#, c-format -msgid "The btraceback call returned %d\n" -msgstr "" - -#: src/lib/signal.c:304 -#, c-format -msgid "BA_NSIG too small (%d) should be (%d)\n" -msgstr "BA_NSIG trop petit (%d) devrait être (%d)\n" - -#: src/lib/signal.c:310 -msgid "UNKNOWN SIGNAL" -msgstr "SIGNAL INCONNU" - -#: src/lib/signal.c:311 -msgid "Hangup" -msgstr "Hangup" - -#: src/lib/signal.c:312 -msgid "Interrupt" -msgstr "" - -#: src/lib/signal.c:313 -msgid "Quit" -msgstr "Quit" - -#: src/lib/signal.c:314 -msgid "Illegal instruction" -msgstr "" - -#: src/lib/signal.c:315 -msgid "Trace/Breakpoint trap" -msgstr "" - -#: src/lib/signal.c:316 -msgid "Abort" -msgstr "Abort" - -#: src/lib/signal.c:318 -msgid "EMT instruction (Emulation Trap)" -msgstr "" - -#: src/lib/signal.c:321 -msgid "IOT trap" -msgstr "IOT trap" - -#: src/lib/signal.c:323 -msgid "BUS error" -msgstr "BUS error" - -#: src/lib/signal.c:324 -msgid "Floating-point exception" -msgstr "" - -#: src/lib/signal.c:325 -msgid "Kill, unblockable" -msgstr "" - -#: src/lib/signal.c:326 -msgid "User-defined signal 1" -msgstr "" - -#: src/lib/signal.c:327 -msgid "Segmentation violation" -msgstr "Erreur de segmentation" - -#: src/lib/signal.c:328 -msgid "User-defined signal 2" -msgstr "" - -#: src/lib/signal.c:329 -msgid "Broken pipe" -msgstr "Tube brisé" - -#: src/lib/signal.c:330 -msgid "Alarm clock" -msgstr "Alarm clock" - -#: src/lib/signal.c:331 -msgid "Termination" -msgstr "" - -#: src/lib/signal.c:333 -msgid "Stack fault" -msgstr "" - -#: src/lib/signal.c:335 -msgid "Child status has changed" -msgstr "" - -#: src/lib/signal.c:336 -msgid "Continue" -msgstr "Continue" - -#: src/lib/signal.c:337 -msgid "Stop, unblockable" -msgstr "" - -#: src/lib/signal.c:338 -msgid "Keyboard stop" -msgstr "" - -#: src/lib/signal.c:339 -msgid "Background read from tty" -msgstr "" - -#: src/lib/signal.c:340 -msgid "Background write to tty" -msgstr "" - -#: src/lib/signal.c:341 -msgid "Urgent condition on socket" -msgstr "" - -#: src/lib/signal.c:342 -msgid "CPU limit exceeded" -msgstr "" - -#: src/lib/signal.c:343 -msgid "File size limit exceeded" -msgstr "" - -#: src/lib/signal.c:344 -msgid "Virtual alarm clock" -msgstr "" - -#: src/lib/signal.c:345 -msgid "Profiling alarm clock" -msgstr "" - -#: src/lib/signal.c:346 -msgid "Window size change" -msgstr "" - -#: src/lib/signal.c:347 -msgid "I/O now possible" -msgstr "" - -#: src/lib/signal.c:349 -msgid "Power failure restart" -msgstr "" - -#: src/lib/signal.c:352 -msgid "No runnable lwp" -msgstr "" - -#: src/lib/signal.c:355 -msgid "SIGLWP special signal used by thread library" -msgstr "" - -#: src/lib/signal.c:358 -msgid "Checkpoint Freeze" -msgstr "" - -#: src/lib/signal.c:361 -msgid "Checkpoint Thaw" -msgstr "" - -#: src/lib/signal.c:364 -msgid "Thread Cancellation" -msgstr "" - -#: src/lib/signal.c:367 -msgid "Resource Lost (e.g. record-lock lost)" -msgstr "" - -#: src/lib/smartall.c:134 src/lib/smartall.c:247 src/lib/smartall.c:262 -msgid "Out of memory\n" -msgstr "Plus de mémoire\n" - -#: src/lib/smartall.c:139 -msgid "Too much memory used." -msgstr "" - -#: src/lib/smartall.c:171 -#, c-format -msgid "Attempt to free NULL called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:185 -#, c-format -msgid "in-use bit not set: double free from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:193 -#, c-format -msgid "qp->qnext->qprev != qp called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:197 -#, c-format -msgid "qp->qprev->qnext != qp called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:206 -#, c-format -msgid "Overrun buffer: len=%d addr=%p allocated: %s:%d called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:284 -#, c-format -msgid "sm_realloc size: %d\n" -msgstr "" - -#: src/lib/smartall.c:322 -#, fuzzy, c-format -msgid "sm_realloc %d at %p from %s:%d\n" -msgstr "Attendait %d en lecture, eu %d de %s:%s:%d\n" - -#: src/lib/smartall.c:382 -#, c-format -msgid "" -"\n" -"Orphaned buffers exist. Dump terminated following\n" -" discovery of bad links in chain of orphaned buffers.\n" -" Buffer address with bad links: %p\n" -msgstr "" - -#: src/lib/smartall.c:427 -#, c-format -msgid "Damaged buffer found. Called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:460 -#, c-format -msgid "" -"\n" -"Damaged buffers found at %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:463 -msgid " discovery of bad prev link.\n" -msgstr "" - -#: src/lib/smartall.c:466 -msgid " discovery of bad next link.\n" -msgstr "" - -#: src/lib/smartall.c:469 -msgid " discovery of data overrun.\n" -msgstr "" - -#: src/lib/smartall.c:472 -msgid " NULL pointer.\n" -msgstr " pointeur NULL.\n" - -#: src/lib/smartall.c:478 -#, c-format -msgid " Buffer address: %p\n" -msgstr " Adresse du buffer : %p\n" - -#: src/lib/smartall.c:485 -#, c-format -msgid "Damaged buffer: %6u bytes allocated at line %d of %s %s\n" -msgstr "" - -#: src/lib/status.h:86 -msgid "===================================================================\n" -msgstr "===================================================================\n" - -#: src/lib/tls.c:81 -#, c-format -msgid "" -"Error with certificate at depth: %d, issuer = %s, subject = %s, ERR=%d:%s\n" -msgstr "" - -#: src/lib/tls.c:118 -msgid "Error initializing SSL context" -msgstr "Erreur pendant l'initialisation du contexte SSL" - -#: src/lib/tls.c:139 -msgid "Error loading certificate verification stores" -msgstr "" - -#: src/lib/tls.c:144 -msgid "" -"Either a certificate file or a directory must be specified as a verification " -"store\n" -msgstr "" - -#: src/lib/tls.c:155 -msgid "Error loading certificate file" -msgstr "Erreur dans le chargement du certificat" - -#: src/lib/tls.c:163 -msgid "Error loading private key" -msgstr "Erreur dans le chargement de la clef privée" - -#: src/lib/tls.c:171 -msgid "Unable to open DH parameters file" -msgstr "Impossible d'ouvrir le fichier de paramètre DH" - -#: src/lib/tls.c:177 -msgid "Unable to load DH parameters from specified file" -msgstr "Impossible de charger les paramètres DH à partir du fichier spécifié" - -#: src/lib/tls.c:181 -msgid "Failed to set TLS Diffie-Hellman parameters" -msgstr "Impossible de positionner les paramètres TLS Diffie-Hellman" - -#: src/lib/tls.c:191 -msgid "Error setting cipher list, no valid ciphers available\n" -msgstr "" - -#: src/lib/tls.c:250 -msgid "Peer failed to present a TLS certificate\n" -msgstr "" - -#: src/lib/tls.c:296 src/lib/tls.c:297 -#, c-format -msgid "Peer %s failed to present a TLS certificate\n" -msgstr "" - -#: src/lib/tls.c:429 -msgid "Error creating file descriptor-based BIO" -msgstr "" - -#: src/lib/tls.c:440 -msgid "Error creating new SSL object" -msgstr "Erreur pendant la création d'un nouvel objet SSL" - -#: src/lib/tls.c:509 src/lib/tls.c:532 -msgid "Connect failure" -msgstr "Erreur de connexion" - -#: src/lib/tls.c:612 src/lib/tls.c:616 -msgid "TLS shutdown failure." -msgstr "" - -#: src/lib/tls.c:677 src/lib/tls.c:703 -msgid "TLS read/write failure." -msgstr "" - -#: src/lib/util.c:259 -msgid "Running" -msgstr "En cours" - -#: src/lib/util.c:262 -msgid "Blocked" -msgstr "Bloqué" - -#: src/lib/util.c:268 -#, fuzzy -msgid "Incomplete job" -msgstr "valeur octal incomplète" - -#: src/lib/util.c:275 -msgid "Non-fatal error" -msgstr "Erreur non fatale" - -#: src/lib/util.c:281 src/lib/util.c:416 -msgid "Canceled" -msgstr "Annulé" - -#: src/lib/util.c:284 -msgid "Verify differences" -msgstr "Vérification des différences" - -#: src/lib/util.c:287 -msgid "Waiting on FD" -msgstr "En attente du FD" - -#: src/lib/util.c:290 -msgid "Wait on SD" -msgstr "En attente du SD" - -#: src/lib/util.c:293 -msgid "Wait for new Volume" -msgstr "En attente d'un nouveau Volume" - -#: src/lib/util.c:296 -msgid "Waiting for mount" -msgstr "En attente d'un montage" - -#: src/lib/util.c:299 -msgid "Waiting for Storage resource" -msgstr "En attente du Storage" - -#: src/lib/util.c:302 -msgid "Waiting for Job resource" -msgstr "" - -#: src/lib/util.c:305 -msgid "Waiting for Client resource" -msgstr "" - -#: src/lib/util.c:308 -msgid "Waiting on Max Jobs" -msgstr "" - -#: src/lib/util.c:311 -msgid "Waiting for Start Time" -msgstr "" - -#: src/lib/util.c:314 -msgid "Waiting on Priority" -msgstr "" - -#: src/lib/util.c:333 -#, c-format -msgid "Unknown Job termination status=%d" -msgstr "" - -#: src/lib/util.c:349 -#, fuzzy -msgid "Completed successfully" -msgstr "Restauration effectuée." - -#: src/lib/util.c:352 -msgid "Completed with warnings" -msgstr "Terminé avec des avertissements" - -#: src/lib/util.c:355 -msgid "Terminated with errors" -msgstr "Terminé avec des erreurs" - -#: src/lib/util.c:358 -msgid "Fatal error" -msgstr "Erreur fatale" - -#: src/lib/util.c:361 -msgid "Created, not yet running" -msgstr "Créé, mais non démarré" - -#: src/lib/util.c:364 -msgid "Canceled by user" -msgstr "Annulé par l'utilisateur" - -#: src/lib/util.c:367 -#, fuzzy -msgid "Verify found differences" -msgstr "Vérification des différences" - -#: src/lib/util.c:370 -msgid "Waiting for File daemon" -msgstr "En attente du client" - -#: src/lib/util.c:373 -msgid "Waiting for Storage daemon" -msgstr "En attente du Storage" - -#: src/lib/util.c:376 -msgid "Waiting for higher priority jobs" -msgstr "Attend qu'un job plus prioritaire se termine" - -#: src/lib/util.c:379 -msgid "Batch inserting file records" -msgstr "Mise à jour du catalogue" - -#: src/lib/util.c:413 -msgid "Fatal Error" -msgstr "Erreur Fatale" - -#: src/lib/util.c:419 -msgid "Differences" -msgstr "" - -#: src/lib/util.c:422 -msgid "Unknown term code" -msgstr "" - -#: src/lib/util.c:441 -#, fuzzy -msgid "Migrated Job" -msgstr "Migrer" - -#: src/lib/util.c:444 -msgid "Verify" -msgstr "Vérifier" - -#: src/lib/util.c:447 -msgid "Restore" -msgstr "Restaurer" - -#: src/lib/util.c:450 -msgid "Console" -msgstr "" - -#: src/lib/util.c:453 -msgid "System or Console" -msgstr "" - -#: src/lib/util.c:456 -msgid "Admin" -msgstr "Admin" - -#: src/lib/util.c:459 src/lib/util.c:549 -msgid "Archive" -msgstr "Archiver" - -#: src/lib/util.c:462 -#, fuzzy -msgid "Job Copy" -msgstr "Copier" - -#: src/lib/util.c:465 -msgid "Copy" -msgstr "Copier" - -#: src/lib/util.c:468 -msgid "Migrate" -msgstr "Migrer" - -#: src/lib/util.c:471 -msgid "Scan" -msgstr "" - -#: src/lib/util.c:475 -msgid "Unknown Type" -msgstr "" - -#: src/lib/util.c:485 -msgid "Truncate" -msgstr "" - -#: src/lib/util.c:502 -msgid "Base" -msgstr "Base" - -#: src/lib/util.c:520 -msgid "Verify Init Catalog" -msgstr "" - -#: src/lib/util.c:529 -msgid "Verify Data" -msgstr "" - -#: src/lib/util.c:532 -msgid "Virtual Full" -msgstr "" - -#: src/lib/util.c:538 -msgid "Unknown Job Level" -msgstr "" - -#: src/lib/util.c:548 -msgid "Append" -msgstr "" - -#: src/lib/util.c:550 -#, fuzzy -msgid "Disabled" -msgstr "est bloqué" - -#: src/lib/util.c:552 -msgid "Used" -msgstr "" - -#: src/lib/util.c:553 -msgid "Cleaning" -msgstr "" - -#: src/lib/util.c:554 -msgid "Purged" -msgstr "" - -#: src/lib/util.c:555 -#, fuzzy -msgid "Recycle" -msgstr "RecyclePool" - -#: src/lib/util.c:556 -msgid "Read-Only" -msgstr "" - -#: src/lib/util.c:568 -#, fuzzy -msgid "Invalid volume status" -msgstr "Nom de Volume invalide : %s\n" - -#: src/lib/util.c:956 -msgid "Working directory not defined. Cannot continue.\n" -msgstr "" - -#: src/lib/util.c:959 -#, c-format -msgid "Working Directory: \"%s\" not found. Cannot continue.\n" -msgstr "" - -#: src/lib/util.c:963 -#, c-format -msgid "Working Directory: \"%s\" is not a directory. Cannot continue.\n" -msgstr "" - -#: src/lib/var.c:2659 -msgid "everything ok" -msgstr "tout est ok" - -#: src/lib/var.c:2660 -msgid "incomplete named character" -msgstr "" - -#: src/lib/var.c:2661 -msgid "incomplete hexadecimal value" -msgstr "valeur hexadécimale incomplète" - -#: src/lib/var.c:2662 -msgid "invalid hexadecimal value" -msgstr "valeur hexadécimale invalide" - -#: src/lib/var.c:2663 -msgid "octal value too large" -msgstr "valeur octal trop grande" - -#: src/lib/var.c:2664 -msgid "invalid octal value" -msgstr "valeur octal invalide" - -#: src/lib/var.c:2665 -msgid "incomplete octal value" -msgstr "valeur octal incomplète" - -#: src/lib/var.c:2666 -msgid "incomplete grouped hexadecimal value" -msgstr "" - -#: src/lib/var.c:2667 -msgid "incorrect character class specification" -msgstr "" - -#: src/lib/var.c:2668 -msgid "invalid expansion configuration" -msgstr "" - -#: src/lib/var.c:2669 -msgid "out of memory" -msgstr "plus de mémoire" - -#: src/lib/var.c:2670 -msgid "incomplete variable specification" -msgstr "" - -#: src/lib/var.c:2671 -msgid "undefined variable" -msgstr "variable non définie" - -#: src/lib/var.c:2672 -msgid "input is neither text nor variable" -msgstr "l'entrée n'est ni du texte ni une variable" - -#: src/lib/var.c:2673 -msgid "unknown command character in variable" -msgstr "" - -#: src/lib/var.c:2674 -msgid "malformatted search and replace operation" -msgstr "" - -#: src/lib/var.c:2675 -msgid "unknown flag in search and replace operation" -msgstr "" - -#: src/lib/var.c:2676 -msgid "invalid regex in search and replace operation" -msgstr "" - -#: src/lib/var.c:2677 -msgid "missing parameter in command" -msgstr "" - -#: src/lib/var.c:2678 -msgid "empty search string in search and replace operation" -msgstr "" - -#: src/lib/var.c:2679 -msgid "start offset missing in cut operation" -msgstr "" - -#: src/lib/var.c:2680 -msgid "offsets in cut operation delimited by unknown character" -msgstr "" - -#: src/lib/var.c:2681 -msgid "range out of bounds in cut operation" -msgstr "" - -#: src/lib/var.c:2682 -msgid "offset out of bounds in cut operation" -msgstr "" - -#: src/lib/var.c:2683 -msgid "logic error in cut operation" -msgstr "" - -#: src/lib/var.c:2684 -msgid "malformatted transpose operation" -msgstr "" - -#: src/lib/var.c:2685 -msgid "source and target class mismatch in transpose operation" -msgstr "" - -#: src/lib/var.c:2686 -msgid "empty character class in transpose operation" -msgstr "" - -#: src/lib/var.c:2687 -msgid "incorrect character class in transpose operation" -msgstr "" - -#: src/lib/var.c:2688 -msgid "malformatted padding operation" -msgstr "" - -#: src/lib/var.c:2689 -msgid "width parameter missing in padding operation" -msgstr "" - -#: src/lib/var.c:2690 -msgid "fill string missing in padding operation" -msgstr "" - -#: src/lib/var.c:2691 -msgid "unknown quoted pair in search and replace operation" -msgstr "" - -#: src/lib/var.c:2692 -msgid "sub-matching reference out of range" -msgstr "" - -#: src/lib/var.c:2693 -msgid "invalid argument" -msgstr "argument invalide" - -#: src/lib/var.c:2694 -msgid "incomplete quoted pair" -msgstr "" - -#: src/lib/var.c:2695 -msgid "lookup function does not support variable arrays" -msgstr "" - -#: src/lib/var.c:2696 -msgid "index of array variable contains an invalid character" -msgstr "" - -#: src/lib/var.c:2697 -msgid "index of array variable is incomplete" -msgstr "" - -#: src/lib/var.c:2698 -msgid "bracket expression in array variable's index not closed" -msgstr "" - -#: src/lib/var.c:2699 -msgid "division by zero error in index specification" -msgstr "" - -#: src/lib/var.c:2700 -msgid "unterminated loop construct" -msgstr "" - -#: src/lib/var.c:2701 -msgid "invalid character in loop limits" -msgstr "" - -#: src/lib/var.c:2702 -msgid "malformed operation argument list" -msgstr "" - -#: src/lib/var.c:2703 -msgid "undefined operation" -msgstr "opération indéfinie" - -#: src/lib/var.c:2704 -msgid "formatting failure" -msgstr "" - -#: src/lib/var.c:2713 -msgid "unknown error" -msgstr "erreur inconnue" - -#: src/lib/watchdog.c:85 -#, c-format -msgid "Unable to initialize watchdog lock. ERR=%s\n" -msgstr "" - -#: src/lib/watchdog.c:182 -msgid "BUG! register_watchdog called before start_watchdog\n" -msgstr "" - -#: src/lib/watchdog.c:185 -#, c-format -msgid "BUG! Watchdog %p has NULL callback\n" -msgstr "" - -#: src/lib/watchdog.c:188 -#, c-format -msgid "BUG! Watchdog %p has zero interval\n" -msgstr "" - -#: src/lib/watchdog.c:208 -msgid "BUG! unregister_watchdog_unlocked called before start_watchdog\n" -msgstr "" - -#: src/lib/watchdog.c:328 -#, c-format -msgid "rwl_writelock failure. ERR=%s\n" -msgstr "" - -#: src/lib/watchdog.c:343 -#, c-format -msgid "rwl_writeunlock failure. ERR=%s\n" -msgstr "" - -#: src/lib/xml.c:407 -msgid "Malformed XML expecting start of tag.\n" -msgstr "" - -#: src/lib/xml.c:460 -msgid "Bad file start bytes (utf8 bom).\n" -msgstr "" - -#: src/lib/xml.c:472 -msgid "Bad file start bytes (utf16 bom).\n" -msgstr "" - -#: src/plugins/fd/delta-fd.c:1359 -#, c-format -msgid "Can't use replace=ifnewer with Delta plugin on %s\n" -msgstr "" - -#: src/plugins/fd/delta-fd.c:1366 -#, c-format -msgid "Can't use replace=ifolder with Delta plugin on %s\n" -msgstr "" - -#: src/plugins/fd/delta-fd.c:1376 -#, c-format -msgid "" -"Can't restore %s, file already exists. Delta plugin doesn't support " -"replace=never option\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:698 src/plugins/fd/mysql-fd.c:1178 -#: src/plugins/fd/postgresql-fd.c:731 -#, fuzzy, c-format -msgid "Can't run command %s. ERR=%s\n" -msgstr "Impossible de lancer la commande : %s. ERR=%s\n" - -#: src/plugins/fd/hvplugin.c:844 -#, fuzzy, c-format -msgid "Can't create working directory %s. ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier inclus : %s. ERR=%s\n" - -#: src/plugins/fd/hvplugin.c:864 -#, fuzzy, c-format -msgid "Can't delete working directory %s. ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier inclus : %s. ERR=%s\n" - -#: src/plugins/fd/hvplugin.c:1007 src/plugins/fd/mysql-fd.c:1496 -#, fuzzy, c-format -msgid "Unknown parameter or missing argument for %s.\n" -msgstr "Mot clef inconnu : %s\n" - -#: src/plugins/fd/hvplugin.c:1046 -#, fuzzy, c-format -msgid "Unknown parameter for %s. Expecting block or file\n" -msgstr "Mot clef inconnu : %s\n" - -#: src/plugins/fd/hvplugin.c:1051 src/plugins/fd/mysql-fd.c:1573 -#: src/plugins/fd/postgresql-fd.c:1035 -#, fuzzy, c-format -msgid "Unknown parameter %s.\n" -msgstr "Mot clef inconnu : %s\n" - -#: src/plugins/fd/hvplugin.c:1217 src/plugins/fd/hvplugin.c:1231 -#: src/plugins/fd/hvplugin.c:1261 src/plugins/fd/mysql-fd.c:2813 -#: src/plugins/fd/mysql-fd.c:2841 src/plugins/fd/mysql-fd.c:3171 -#: src/plugins/fd/postgresql-fd.c:2198 src/plugins/fd/postgresql-fd.c:2220 -#: src/plugins/fd/postgresql-fd.c:2478 -msgid "Can't analyse plugin command line\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:1221 -#, fuzzy -msgid "Unable to access guest volume\n" -msgstr "Impossible d'écrire le marqueur EOF. ERR=%s\n" - -#: src/plugins/fd/hvplugin.c:1238 -msgid "The hvplugin plugin doesn't support regexwhere parameter.\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:1271 -msgid "" -"The hvplugin plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=hvplugin command in the\n" -"Include {} block.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:824 -#, c-format -msgid "Found MASTER_LOG position %s:%lld for \"%s\"\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:868 -#, c-format -msgid "Unable to get MySQL version %s, might cause errors\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:961 -#, c-format -msgid "Can't reach MySQL server to get database list. ERR=%d\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1069 -#, c-format -msgid "Can't reach MySQL server to get database config. ERR=%d\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1267 src/plugins/fd/mysql-fd.c:1290 -#: src/plugins/fd/mysql-fd.c:1302 src/plugins/fd/mysql-fd.c:1356 -#: src/plugins/fd/mysql-fd.c:1669 src/plugins/fd/postgresql-fd.c:1167 -#, fuzzy, c-format -msgid "Unable to create temporary file %s. ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:1527 -#, c-format -msgid "Invalid argument for %s. Expecting tar or xbstream\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1531 -msgid "" -"bin_format=tar is incompatible with Incremental backup. Using xbstream " -"instead\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1547 -#, c-format -msgid "Can't use mode=%s in MySQL plugin\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1584 -msgid "Unable to detect where my.cnf is located. Use config_file=" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1679 src/plugins/fd/postgresql-fd.c:1177 -#, fuzzy, c-format -msgid "Unable to fdopen file %s. ERR=%s\n" -msgstr "3910 Impossible d'ouvrir le device %s : ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:1774 -msgid "log_bin mysqld parameter is not suitable for Incremental backup.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1776 -msgid "Generating Full dump instead...\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2039 -#, fuzzy, c-format -msgid " Dumping database \"%s\"\n" -msgstr "Impossible d'ouvrir la base de données \"%s\".\n" - -#: src/plugins/fd/mysql-fd.c:2181 -#, fuzzy -msgid "Unable to detect the MySQL data_directory on this system.\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:2188 -#, c-format -msgid "Configuration of log_bin=%s is not suitable for PITR backup.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2217 -#, fuzzy, c-format -msgid "Unable to determine the last binlog %s\n" -msgstr "Impossible d'écrire le marqueur EOF. ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:2269 -#, fuzzy -msgid "Can't get server configuration.\n" -msgstr "La création de la signature a échouée" - -#: src/plugins/fd/mysql-fd.c:2290 -#, fuzzy -msgid "Unable to get the BINLOG list.\n" -msgstr "Impossible de se connecter au Client.\n" - -#: src/plugins/fd/mysql-fd.c:2375 -#, c-format -msgid "" -"Unable to read %s. ERR=%s\n" -"Check permissions and/or use config_file parameter.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2418 -#, fuzzy, c-format -msgid "Unable to determine the last LSN for %s (Previous job is %s)\n" -msgstr "Impossible d'écrire le marqueur EOF. ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:2426 -#, c-format -msgid "Will use LSN=%s for the current backup\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2461 -#, fuzzy -msgid "Unable to detect datadir from MySQL\n" -msgstr "Impossible de se connecter au Client.\n" - -#: src/plugins/fd/mysql-fd.c:2507 -#, fuzzy -msgid "Unable to get last LSN from the backup\n" -msgstr "Impossible de récupérer le Job du JobId=%s : ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:2512 -#, fuzzy, c-format -msgid "The current LSN is %s\n" -msgstr "Le pool courant est : %s\n" - -#: src/plugins/fd/mysql-fd.c:2866 -msgid "" -"The MySQL plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=mysql command in the\n" -"Include {} block.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3250 src/plugins/fd/postgresql-fd.c:2698 -msgid "replace=ifnewer/ifolder are not supported, switching to replace=never\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3294 src/plugins/fd/postgresql-fd.c:2739 -#: src/plugins/fd/postgresql-fd.c:2802 -#, c-format -msgid "" -"Database \"%s\" already exists, can't replace it when using replace=never\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3310 -#, fuzzy, c-format -msgid "Restoring target database \"%s\"\n" -msgstr "Impossible d'ouvrir la base de données \"%s\".\n" - -#: src/plugins/fd/mysql-fd.c:3327 src/plugins/fd/postgresql-fd.c:2771 -msgid "Re-creating roles, may produce errors if roles already exist\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3335 -#, fuzzy, c-format -msgid "Creating target database \"%s\"\n" -msgstr "Impossible d'ouvrir la base de données \"%s\".\n" - -#: src/plugins/fd/mysql-fd.c:3346 -#, fuzzy, c-format -msgid "Database \"%s\" already exists. Skipping creation.\n" -msgstr "Impossible de créer le volume \"%s\" car il existe déjà.\n" - -#: src/plugins/fd/mysql-fd.c:3351 -msgid "" -"To restore all databases from a single dump file, use replace=always restore " -"option." -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3355 -msgid "" -"To restore all databases from a single dump file, use where=/ restore option." -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3358 -msgid "Restoring all databases from all-databases.sql file\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3379 -msgid "" -"bin-log should be restored separately as files using where=/a/directory and " -"applied using mysqlbinlog program and MASTER_LOG position found in the " -"restore log.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3381 -#, c-format -msgid "Skipping \"%s\".\n" -msgstr "" - -#: src/plugins/fd/ndmp-fd.c:1081 -msgid "" -"Unable to get where= argument for the restore.\n" -"Using regexwhere is unsupported with the ndmp plugin.\n" -msgstr "" - -#: src/plugins/fd/ndmp-fd.c:1105 -#, fuzzy, c-format -msgid "Unable to parse or to use plugin options, %s\n" -msgstr "Impossible de se connecter à %s sur %s:%d. ERR=%s\n" - -#: src/plugins/fd/ndmp-fd.c:1116 -msgid "" -"The ndmp plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=ndmp command in the\n" -"Include {} block.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:608 -#, c-format -msgid "Can't reach PostgreSQL server to get database list. ERR=%d\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:662 -#, c-format -msgid "Can't reach PostgreSQL server to get database config. ERR=%d\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:982 -#, fuzzy, c-format -msgid "Unknown parameter or bad argument for %s.\n" -msgstr "Mot clef inconnu : %s\n" - -#: src/plugins/fd/postgresql-fd.c:1002 -#, c-format -msgid "Can't use mode=%s in postgresql plugin\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1011 -#, c-format -msgid "Can't use service=%s in postgresql plugin ERR=%s\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1030 -#, c-format -msgid "Bad compress=%s parameter expect 0-9.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1272 -#, fuzzy -msgid "Can't get cluster configuration.\n" -msgstr "La création de la signature a échouée" - -#: src/plugins/fd/postgresql-fd.c:1283 -msgid "Can't stop the current backup\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1289 src/plugins/fd/postgresql-fd.c:1297 -#, fuzzy -msgid "Can't determine the last WAL file\n" -msgstr "Impossible d'écrire le marqueur EOF. ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:1312 src/plugins/fd/postgresql-fd.c:1919 -#, fuzzy -msgid "Can't determine WAL directory\n" -msgstr "Impossible d'ouvrir le fichier inclus : %s. ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:1319 -#, fuzzy, c-format -msgid "Can't open WAL directory %s. ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier inclus : %s. ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:1861 -msgid "Your PostgreSQL version is too old for PITR mode\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1866 -#, fuzzy -msgid "Unable to detect the PostgreSQL data_directory on this system.\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:1873 -#, fuzzy, c-format -msgid "Unable to find data_directory=%s on this system. ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:1882 -msgid "Configuration wal_level=minimal is not suitable for PITR backup.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1892 -msgid "Configuration archive_command is not suitable for PITR backup.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1994 -#, fuzzy -msgid "Unable to start the PITR backup on this system.\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:2000 -#, fuzzy -msgid "Unable to determine the first WAL file on this system.\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:2015 -#, fuzzy, c-format -msgid "Unable to analyse tablespaces %s on this system. ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:2065 -#, fuzzy, c-format -msgid "Unable to analyse data_directory %s on this system. ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:2245 -msgid "" -"The postgresql plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=postgresql command in the\n" -"Include {} block.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:2490 -msgid "" -"You need to set PrefixLinks=Yes in your Restore job definition, or you will " -"need to fix all symlinks yourself." -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:2544 -#, c-format -msgid "Creating %s to help you starting the recovery.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:2549 -#, fuzzy, c-format -msgid "Can't create the %s file for recovery. ERR=%s\n" -msgstr "Impossible de créer le fichier d'état : %s ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:2758 -msgid "" -"The destination database already exists,it might generate some harmless " -"error messages." -msgstr "" - -#: src/plugins/sd/shstore-sd.c:179 -#, fuzzy, c-format -msgid "3612 JobId=%u waiting because device %s is reserved by: %s.\n" -msgstr "" -"3605 JobId=%u voulait libérer le lecteur, mais le device %s est occupé.\n" - -#: src/plugins/sd/shstore-sd.c:435 -#, fuzzy, c-format -msgid "" -"3998 Bad return from storage \"%s\" command: ERR=%s.\n" -"Results=%s\n" -msgstr "" -"3991 Erreur sur l'autochangeur \"loaded drive %d\" : ERR=%s.\n" -"Resultat=%s\n" - -#: src/qt-console/bat_conf.cpp:144 -#, fuzzy, c-format -msgid "Console: name=%s\n" -msgstr "Console connecté à %s\n" - -#: src/qt-console/bat_conf.cpp:147 -#: src/qt-console/tray-monitor/tray_conf.cpp:185 -#, c-format -msgid "ConsoleFont: name=%s font face=%s\n" -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:86 -#, fuzzy, c-format -msgid "Already connected\"%s\".\n" -msgstr "Console connecté à %s\n" - -#: src/qt-console/bcomm/dircomm.cpp:97 -#: src/qt-console/tray-monitor/tray-monitor.cpp:351 -#, fuzzy, c-format -msgid "Connecting to Director %s:%d" -msgstr "Connexion au Director %s:%d\n" - -#: src/qt-console/bcomm/dircomm.cpp:99 -#, fuzzy, c-format -msgid "" -"Connecting to Director %s:%d\n" -"\n" -msgstr "Connexion au Director %s:%d\n" - -#: src/qt-console/bcomm/dircomm.cpp:196 -#: src/qt-console/tray-monitor/tray-monitor.cpp:356 -#, fuzzy -msgid "Director daemon" -msgstr "Director" - -#: src/qt-console/bcomm/dircomm.cpp:234 -msgid "Initializing ..." -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:250 src/qt-console/console/console.cpp:131 -#, fuzzy -msgid "Connected" -msgstr "Connexion...\n" - -#: src/qt-console/bcomm/dircomm.cpp:374 -#, fuzzy -msgid "Command completed ..." -msgstr "Commande annulée.\n" - -#: src/qt-console/bcomm/dircomm.cpp:381 src/qt-console/console/console.cpp:368 -msgid "Processing command ..." -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:388 -msgid "At main prompt waiting for input ..." -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:395 src/qt-console/bcomm/dircomm.cpp:405 -msgid "At prompt waiting for input ..." -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:413 -#, fuzzy -msgid "Command failed." -msgstr "Commande annulée.\n" - -#: src/qt-console/bcomm/dircomm.cpp:485 -#, fuzzy -msgid "Director disconnected." -msgstr "Connexion du director le %s\n" - -#: src/qt-console/bcomm/dircomm_auth.cpp:108 -#, fuzzy, c-format -msgid "Director authorization problem at \"%s:%d\"\n" -msgstr "Pas d'enregistrement trouvé en base pour : %s\n" - -#: src/qt-console/bcomm/dircomm_auth.cpp:115 -#, c-format -msgid "" -"Authorization problem: Remote server at \"%s:%d\" did not advertise required " -"TLS support.\n" -msgstr "" - -#: src/qt-console/bcomm/dircomm_auth.cpp:123 -#, c-format -msgid "" -"Authorization problem with Director at \"%s:%d\": Remote server requires " -"TLS.\n" -msgstr "" - -#: src/qt-console/bcomm/dircomm_auth.cpp:146 -#, fuzzy, c-format -msgid "" -"Bad response to Hello command: ERR=%s\n" -"The Director at \"%s:%d\" is probably not running.\n" -msgstr "Mauvaise réponse à la commande Hello : ERR=%s\n" - -#: src/qt-console/bcomm/dircomm_auth.cpp:174 -#, fuzzy, c-format -msgid "" -"Authorization problem with Director at \"%s:%d\"\n" -"Most likely the passwords do not agree.\n" -"If you are using TLS, there may have been a certificate validation error " -"during the TLS handshake.\n" -"For help, please see " -msgstr "" -"Problème d'authentification avec le director.\n" -"Le plus souvent, les mots de pass ne correspondent pas.\n" -"Si vous utilisez TLS, il peut y avoir une erreur de validation du " -"certificat\n" -"pendant l'initialisation de la connexion TLS.\n" -"Vous trouverez de l'aide sur\n" -"http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors\n" - -#: src/qt-console/main.cpp:185 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s) %s %s %s\n" -"\n" -"Usage: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" -" -c set configuration file to file\n" -" -dnn set debug level to nn\n" -" -s no signals\n" -" -t test - read configuration and exit\n" -" -? print this message.\n" -"\n" -msgstr "" -") %s %s %s\n" -"\n" -"Usage : bconsole [-s] [-c config_file] [-d niveau_debug]\n" -" -c set configuration file to file\n" -" -dnn set debug level to nn\n" -" -s no signals\n" -" -t test - lecture de la configuration et sortie\n" -"\n" - -#: src/qt-console/tray-monitor/authenticate.cpp:76 -#, fuzzy -msgid "" -"Director authorization problem.\n" -"Most likely the passwords do not agree.\n" -"For help, please see " -msgstr "" -"Problème d'authentification avec le director.\n" -"Le plus souvent, les mots de pass ne correspondent pas.\n" -"Vous trouverez de l'aide sur\n" -"http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors\n" - -#: src/qt-console/tray-monitor/authenticate.cpp:126 -#, fuzzy -msgid "" -"Director and Storage daemon passwords or names not the same.\n" -"For help, please see " -msgstr "" -"Le mot de passe ou le nom du Director et du Client ne sont pas identiques.\n" - -#: src/qt-console/tray-monitor/authenticate.cpp:133 -#, fuzzy, c-format -msgid "bdird set configuration file to file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -t test - read configuration and exit\n" -" -? print this message.\n" -"\n" -msgstr "" -") %s %s %s\n" -"\n" -"Usage : bconsole [-s] [-c config_file] [-d niveau_debug]\n" -" -c set configuration file to file\n" -" -dnn set debug level to nn\n" -" -s no signals\n" -" -t test - lecture de la configuration et sortie\n" -"\n" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:208 -#, c-format -msgid "" -"Error: %d Monitor resources defined in %s. You must define one and only one " -"Monitor resource.\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:240 -#, fuzzy, c-format -msgid "" -"No Client, Storage or Director resource defined in %s\n" -"Without that I don't how to get status from the File, Storage or Director " -"Daemon :-(\n" -msgstr "" -"Pas de director défini pour %s\n" -"Sans cette définition, il n'est pas possible de se connecter à celui-ci.\n" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:255 -#, c-format -msgid "" -"Invalid refresh interval defined in %s\n" -"This value must be greater or equal to 1 second and less or equal to 10 " -"minutes (read value: %d).\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:323 -#, c-format -msgid "Error, currentitem is not a Client or a Storage..\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:361 -#, fuzzy, c-format -msgid "Connecting to Client %s:%d" -msgstr "Connexion au client %s (%s:%d)\n" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:366 -msgid "File daemon" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:371 -#, fuzzy, c-format -msgid "Connecting to Storage %s:%d" -msgstr "Connexion au Director %s:%d\n" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:380 -#: src/qt-console/tray-monitor/tray-monitor.cpp:410 -#, c-format -msgid "Error, currentitem is not a Client, a Storage or a Director..\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:385 -#, fuzzy -msgid "Cannot connect to daemon." -msgstr "Impossible de se connecter au démon Storage\n" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:394 -#, fuzzy, c-format -msgid "Authentication error : %s" -msgstr "Erreur sur l'autochangeur : ERR=%s\n" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:401 -#, fuzzy -msgid "Opened connection with Director daemon." -msgstr "Impossible de se connecter au Storage daemon.\n" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:404 -#, fuzzy -msgid "Opened connection with File daemon." -msgstr "Impossible de se connecter au client.\n" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:407 -#, fuzzy -msgid "Opened connection with Storage daemon." -msgstr "Impossible de se connecter au Storage daemon.\n" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:458 -msgid "Error : BNET_HARDEOF or BNET_ERROR" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:467 -#, fuzzy -msgid "Error : Connection closed." -msgstr "Connexion...\n" - -#: src/qt-console/tray-monitor/tray_conf.cpp:167 -#, c-format -msgid "Monitor: name=%s FDtimeout=%s SDtimeout=%s\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray_conf.cpp:173 -#, c-format -msgid "Director: name=%s address=%s FDport=%d\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray_conf.cpp:177 -#, fuzzy, c-format -msgid "Client: name=%s address=%s FDport=%d\n" -msgstr "Client \"%s\" adresse positionné à %s\n" - -#: src/qt-console/tray-monitor/tray_conf.cpp:181 -#, c-format -msgid "Storage: name=%s address=%s SDport=%d\n" -msgstr "" - -#: src/stored/acquire.c:62 -#, c-format -msgid "Acquire read: num_writers=%d not zero. Job %d canceled.\n" -msgstr "" - -#: src/stored/acquire.c:71 -#, c-format -msgid "No volumes specified for reading. Job %s canceled.\n" -msgstr "Pas de volume spécifié pour la lecture. Abandon du job %s.\n" - -#: src/stored/acquire.c:80 -#, c-format -msgid "Logic error: no next volume to read. Numvol=%d Curvol=%d\n" -msgstr "" - -#: src/stored/acquire.c:87 src/stored/acquire.c:164 src/stored/acquire.c:439 -#: src/stored/stored.c:614 -msgid "generate_plugin_event(bsdEventDeviceOpen) Failed\n" -msgstr "" - -#: src/stored/acquire.c:111 -#, fuzzy, c-format -msgid "" -"Changing read device. Want Media Type=\"%s\" have=\"%s\"\n" -" %s device=%s\n" -msgstr "" -"Changement du Device de lecture. Want Media Type=\"%s\" have=\"%s\"\n" -" device=%s\n" - -#: src/stored/acquire.c:159 -#, c-format -msgid "Media Type change. New read %s device %s chosen.\n" -msgstr "" - -#: src/stored/acquire.c:176 -#, c-format -msgid "No suitable device found to read Volume \"%s\"\n" -msgstr "" - -#: src/stored/acquire.c:215 -#, fuzzy, c-format -msgid "Job %s canceled.\n" -msgstr "Le job %s est annulé.\n" - -#: src/stored/acquire.c:233 -#, fuzzy, c-format -msgid "Read open %s device %s Volume \"%s\" failed: ERR=%s\n" -msgstr "Impossible de supprimer le volume \"%s\". ERR=%s" - -#: src/stored/acquire.c:326 -#, c-format -msgid "Too many errors trying to mount %s device %s for reading.\n" -msgstr "" - -#: src/stored/acquire.c:334 -#, fuzzy, c-format -msgid "Ready to read from volume \"%s\" on %s device %s.\n" -msgstr "Prêt à lire les données du volume \"%s\" depuis le device %s.\n" - -#: src/stored/acquire.c:424 -#, fuzzy, c-format -msgid "Could not ready %s device %s for append.\n" -msgstr "Impossible d'ouvrir le device %s\n" - -#: src/stored/acquire.c:520 src/stored/block_util.c:669 -#: src/stored/block_util.c:742 src/stored/block_util.c:772 -#: src/stored/spool.c:277 -#, c-format -msgid "Could not create JobMedia record for Volume=\"%s\" Job=%s\n" -msgstr "Impossible de créer un JobMedia en base pour le Volume=%s Job=%s\n" - -#: src/stored/acquire.c:575 -#, c-format -msgid "Alert: %s" -msgstr "Alert: %s" - -#: src/stored/acquire.c:583 -#, c-format -msgid "3997 Bad alert command: %s: ERR=%s.\n" -msgstr "" - -#: src/stored/aligned_dev.c:44 src/stored/dev.c:122 src/stored/stored.c:583 -#, c-format -msgid "Could not initialize %s\n" -msgstr "Impossible d'initialiser %s\n" - -#: src/stored/aligned_dev.c:132 src/stored/dev.c:667 -#, fuzzy, c-format -msgid "Error closing device %s. ERR=%s.\n" -msgstr "Erreur de lecture de %s:%s:%d : ERR=%s\n" - -#: src/stored/aligned_dev.c:432 src/stored/dvd.c:102 -msgid "No FreeSpace command defined.\n" -msgstr "" - -#: src/stored/aligned_dev.c:465 src/stored/dvd.c:136 -#, fuzzy, c-format -msgid "Cannot run free space command. Results=%s ERR=%s\n" -msgstr "Impossible de lancer la commande : %s. ERR=%s\n" - -#: src/stored/aligned_read.c:199 -#, c-format -msgid "Record not properly reconstructed. Remainder wanted=%d got=%d\n" -msgstr "" - -#: src/stored/aligned_read.c:249 src/stored/record_read.c:177 -#, c-format -msgid "Sanity check failed. maxlen=%d datalen=%d. Block discarded.\n" -msgstr "" - -#: src/stored/ansi_label.c:82 -#, c-format -msgid "Read error on device %s in ANSI label. ERR=%s\n" -msgstr "" - -#: src/stored/ansi_label.c:92 -msgid "Insane! End of tape while reading ANSI label.\n" -msgstr "" - -#: src/stored/ansi_label.c:118 -msgid "No VOL1 label while reading ANSI/IBM label.\n" -msgstr "" - -#: src/stored/ansi_label.c:141 -#, c-format -msgid "Wanted ANSI Volume \"%s\" got \"%s\"\n" -msgstr "" - -#: src/stored/ansi_label.c:152 -msgid "No HDR1 label while reading ANSI label.\n" -msgstr "" - -#: src/stored/ansi_label.c:158 -#, c-format -msgid "ANSI/IBM Volume \"%s\" does not belong to Bacula.\n" -msgstr "" - -#: src/stored/ansi_label.c:170 -msgid "No HDR2 label while reading ANSI/IBM label.\n" -msgstr "" - -#: src/stored/ansi_label.c:185 -msgid "Unknown or bad ANSI/IBM label record.\n" -msgstr "" - -#: src/stored/ansi_label.c:193 -msgid "Too many records in while reading ANSI/IBM label.\n" -msgstr "" - -#: src/stored/ansi_label.c:293 -#, c-format -msgid "ANSI Volume label name \"%s\" longer than 6 chars.\n" -msgstr "" - -#: src/stored/ansi_label.c:319 -#, fuzzy, c-format -msgid "Could not write ANSI VOL1 label. Wanted size=%d got=%d ERR=%s\n" -msgstr "Impossible de créer le fichier d'état. %s ERR=%s\n" - -#: src/stored/ansi_label.c:357 src/stored/ansi_label.c:386 -#, c-format -msgid "Could not write ANSI HDR1 label. ERR=%s\n" -msgstr "" - -#: src/stored/ansi_label.c:362 src/stored/ansi_label.c:393 -msgid "Could not write ANSI HDR1 label.\n" -msgstr "" - -#: src/stored/ansi_label.c:398 -#, c-format -msgid "Error writing EOF to tape. ERR=%s" -msgstr "" - -#: src/stored/ansi_label.c:403 -msgid "write_ansi_ibm_label called for non-ANSI/IBM type\n" -msgstr "" - -#: src/stored/append.c:77 -msgid "DCR is NULL!!!\n" -msgstr "" - -#: src/stored/append.c:83 -msgid "DEVICE is NULL!!!\n" -msgstr "" - -#: src/stored/append.c:94 -msgid "Unable to set network buffer size.\n" -msgstr "" - -#: src/stored/append.c:108 src/stored/append.c:118 src/stored/append.c:132 -#: src/stored/askdir.c:378 src/stored/askdir.c:379 -msgid "NULL Volume name. This shouldn't happen!!!\n" -msgstr "" - -#: src/stored/append.c:124 src/stored/btape.c:2231 -#, c-format -msgid "Write session label failed. ERR=%s\n" -msgstr "Impossible d'écrire le label de session. ERR=%s\n" - -#: src/stored/append.c:138 -#, c-format -msgid "Network send error to FD. ERR=%s\n" -msgstr "" - -#: src/stored/append.c:195 -#, fuzzy, c-format -msgid "Error reading data header from FD. n=%d msglen=%d ERR=%s\n" -msgstr "" -"Erreur pendant l'écriture des données vers le fichier de spool. ERR=%s\n" - -#: src/stored/append.c:206 -#, c-format -msgid "Malformed data header from FD: %s\n" -msgstr "" - -#: src/stored/append.c:228 -#, c-format -msgid "FI=%d from FD not positive or last_FI=%d\n" -msgstr "" - -#: src/stored/append.c:353 -#, fuzzy, c-format -msgid "Network error reading from FD. ERR=%s\n" -msgstr "Erreur dans l'exécution de la commande : %s. ERR=%s\n" - -#: src/stored/append.c:373 -#, fuzzy, c-format -msgid "DDE commit failed. ERR=%s\n" -msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" - -#: src/stored/append.c:404 src/stored/append.c:431 src/stored/spool.c:266 -#: src/stored/vbackup.c:120 src/stored/vbackup.c:130 src/stored/vbackup.c:300 -#, c-format -msgid "Fatal append error on device %s: ERR=%s\n" -msgstr "" - -#: src/stored/append.c:406 src/stored/vbackup.c:122 -msgid "Set ok=FALSE after write_block_to_device.\n" -msgstr "" - -#: src/stored/append.c:418 src/stored/btape.c:2350 -#, fuzzy, c-format -msgid "Error writing end session label. ERR=%s\n" -msgstr "" -"Erreur pendant l'écriture des données vers le fichier de spool. ERR=%s\n" - -#: src/stored/append.c:433 src/stored/vbackup.c:132 -#, fuzzy -msgid "Set ok=FALSE after write_final_block_to_device.\n" -msgstr "Erreur pendant l'écriture du fichier bsr.\n" - -#: src/stored/append.c:458 src/stored/read.c:110 src/stored/vbackup.c:155 -#, fuzzy, c-format -msgid "Elapsed time=%02d:%02d:%02d, Transfer rate=%s Bytes/second\n" -msgstr "Temps d'écriture du job = %02d:%02d:%02d, Taux de transfert = %s o/s\n" - -#: src/stored/append.c:495 -#, c-format -msgid "Error updating file attributes. ERR=%s\n" -msgstr "" - -#: src/stored/askdir.c:174 -msgid "Network error on bnet_recv in req_vol_info.\n" -msgstr "" - -#: src/stored/askdir.c:198 -#, c-format -msgid "Error getting Volume info: %s" -msgstr "Erreur pendant la récupération des informations sur un Volume : %s" - -#: src/stored/askdir.c:433 -#, c-format -msgid "Didn't get vol info vol=%s: ERR=%s" -msgstr "" - -#: src/stored/askdir.c:531 -#, c-format -msgid "Error creating JobMedia record: ERR=%s\n" -msgstr "" - -#: src/stored/askdir.c:538 -#, c-format -msgid "Error creating JobMedia record: %s\n" -msgstr "" - -#: src/stored/askdir.c:630 -#, c-format -msgid "Job %s canceled while waiting for mount on Storage Device \"%s\".\n" -msgstr "" -"Le job %s a été annulé alors qu'il attendait un montage sur le Storage " -"Device \"%s\".\n" - -#: src/stored/askdir.c:643 -#, fuzzy, c-format -msgid "" -"Job %s is waiting. Cannot find any appendable volumes.\n" -"Please use the \"label\" command to create a new Volume for:\n" -" Storage: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" -"Le Job %s est en attente. Bacula n'a pas pu trouver de media disponible.\n" -"Merci de créer un nouveau volume via la commande \"label\" pour :\n" -" Storage : %s\n" -" Type du Media : %s\n" -" Pool : %s\n" - -#: src/stored/askdir.c:668 src/stored/askdir.c:780 -#, c-format -msgid "Max time exceeded waiting to mount Storage Device %s for Job %s\n" -msgstr "" - -#: src/stored/askdir.c:679 -msgid "pthread error in mount_next_volume.\n" -msgstr "" - -#: src/stored/askdir.c:714 -msgid "Cannot request another volume: no volume name given.\n" -msgstr "" - -#: src/stored/askdir.c:720 -msgid "The current operation doesn't support mount request\n" -msgstr "" - -#: src/stored/askdir.c:727 -#, c-format -msgid "Job %s canceled while waiting for mount on Storage Device %s.\n" -msgstr "" -"Le Job %s a été annulé pendant qu'il attendait le montage sur le Storage " -"Device %s.\n" - -#: src/stored/askdir.c:745 -#, fuzzy, c-format -msgid "" -"%sPlease mount append Volume \"%s\" or label a new one for:\n" -" Job: %s\n" -" Storage: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" -"Le Job %s est en attente. Bacula n'a pas pu trouver de media disponible.\n" -"Merci de créer un nouveau volume via la commande \"label\" pour :\n" -" Storage : %s\n" -" Type du Media : %s\n" -" Pool : %s\n" - -#: src/stored/askdir.c:751 -#, fuzzy, c-format -msgid "" -"%sPlease mount read Volume \"%s\" for:\n" -" Job: %s\n" -" Storage: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" -"Le Job %s est en attente. Bacula n'a pas pu trouver de media disponible.\n" -"Merci de créer un nouveau volume via la commande \"label\" pour :\n" -" Storage : %s\n" -" Type du Media : %s\n" -" Pool : %s\n" - -#: src/stored/askdir.c:758 -msgid "" -"\n" -"\n" -"WARNING: device is full! Please add more disk space then ...\n" -"\n" -msgstr "" - -#: src/stored/askdir.c:791 -msgid "pthread error in mount_volume\n" -msgstr "" - -#: src/stored/authenticate.c:77 -#, fuzzy -msgid "" -"Incorrect password given by Director.\n" -"For help, please see: " -msgstr "Password incorrect donné par le Director à %s.\n" - -#: src/stored/authenticate.c:103 -#, fuzzy, c-format -msgid "TLS negotiation failed with DIR at \"%s:%d\"\n" -msgstr "Négociation TLS échouée avec le SD \"%s:%d\".\n" - -#: src/stored/authenticate.c:121 -#, c-format -msgid "Unable to authenticate Director at %s.\n" -msgstr "" - -#: src/stored/authenticate.c:169 src/stored/authenticate.c:209 -#, c-format -msgid "" -"Incorrect authorization key from File daemon at %s rejected.\n" -"For help, please see: " -msgstr "" - -#: src/stored/authenticate.c:196 -#, fuzzy, c-format -msgid "TLS negotiation failed with FD at \"%s:%d\"\n" -msgstr "Négociation TLS échouée avec le FD \"%s:%d\".\n" - -#: src/stored/authenticate.c:277 -msgid "" -"Authorization key rejected by Storage daemon.\n" -"Please see " -msgstr "" - -#: src/stored/autochanger.c:67 -#, c-format -msgid "No Changer Name given for device %s. Cannot continue.\n" -msgstr "" - -#: src/stored/autochanger.c:73 -#, c-format -msgid "No Changer Command given for device %s. Cannot continue.\n" -msgstr "" - -#: src/stored/autochanger.c:142 -#, fuzzy, c-format -msgid "No slot defined in catalog (slot=%d) for Volume \"%s\" on %s.\n" -msgstr "Demande de labélisation du volume \"%s\" Slot %d...\n" - -#: src/stored/autochanger.c:144 -msgid "Cartridge change or \"update slots\" may be required.\n" -msgstr "" - -#: src/stored/autochanger.c:150 -#, c-format -msgid "No \"Changer Device\" for %s. Manual load of Volume may be required.\n" -msgstr "" - -#: src/stored/autochanger.c:157 -#, c-format -msgid "No \"Changer Command\" for %s. Manual load of Volume may be requird.\n" -msgstr "" - -#: src/stored/autochanger.c:191 -#, c-format -msgid "3304 Issuing autochanger \"load slot %d, drive %d\" command.\n" -msgstr "" -"3304 Envoi de la commande \"load slot %d, drive %d\" à l'autochangeur.\n" - -#: src/stored/autochanger.c:199 -#, c-format -msgid "3305 Autochanger \"load slot %d, drive %d\", status is OK.\n" -msgstr "3305 Autochangeur \"load slot %d, drive %d\", le résultat est OK.\n" - -#: src/stored/autochanger.c:212 -#, c-format -msgid "" -"3992 Bad autochanger \"load slot %d, drive %d\": ERR=%s.\n" -"Results=%s\n" -msgstr "" -"3992 Erreur sur l'autochangeur \"load slot %d, drive %d\" : ERR=%s.\n" -"Resultat=%s\n" - -#: src/stored/autochanger.c:275 -#, c-format -msgid "3301 Issuing autochanger \"loaded? drive %d\" command.\n" -msgstr "3301 Envoi de la commande \"loaded? drive %d\" à l'autochangeur.\n" - -#: src/stored/autochanger.c:287 -#, c-format -msgid "3302 Autochanger \"loaded? drive %d\", result is Slot %d.\n" -msgstr "3302 Autochangeur \"loaded drive %d\", le resultat est Slot %d.\n" - -#: src/stored/autochanger.c:294 -#, c-format -msgid "3302 Autochanger \"loaded? drive %d\", result: nothing loaded.\n" -msgstr "3302 Autochangeur \"loaded drive %d\", résultat : lecteur vide.\n" - -#: src/stored/autochanger.c:306 -#, c-format -msgid "" -"3991 Bad autochanger \"loaded? drive %d\" command: ERR=%s.\n" -"Results=%s\n" -msgstr "" -"3991 Erreur sur l'autochangeur \"loaded drive %d\" : ERR=%s.\n" -"Resultat=%s\n" - -#: src/stored/autochanger.c:326 -#, fuzzy, c-format -msgid "Lock failure on autochanger. ERR=%s\n" -msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" - -#: src/stored/autochanger.c:340 -#, fuzzy, c-format -msgid "Unlock failure on autochanger. ERR=%s\n" -msgstr "rwl_writeunlock en échec sur %s:%d :. ERR=%s\n" - -#: src/stored/autochanger.c:387 src/stored/autochanger.c:553 -#, c-format -msgid "3307 Issuing autochanger \"unload slot %d, drive %d\" command.\n" -msgstr "" -"3307 Envoi de la commande \"unload slot %d, drive %d\" à l'autochangeur.\n" - -#: src/stored/autochanger.c:400 -#, c-format -msgid "" -"3995 Bad autochanger \"unload slot %d, drive %d\": ERR=%s\n" -"Results=%s\n" -msgstr "" -"3995 Erreur sur l'autochangeur \"unload slot %d, drive %d\" : ERR=%s.\n" -"Resultat=%s\n" - -#: src/stored/autochanger.c:503 -#, fuzzy, c-format -msgid "Volume \"%s\" wanted on %s is in use by device %s\n" -msgstr "Le volume \"%s\" est utilisé par le device %s\n" - -#: src/stored/autochanger.c:570 -#, fuzzy, c-format -msgid "3997 Bad autochanger \"unload slot %d, drive %d\": ERR=%s.\n" -msgstr "" -"3995 Erreur sur l'autochangeur \"unload slot %d, drive %d\" : ERR=%s.\n" - -#: src/stored/autochanger.c:613 -#, c-format -msgid "3993 Device %s not an autochanger device.\n" -msgstr "3993 Le Device %s n'est pas un autochangeur.\n" - -#: src/stored/autochanger.c:640 -#, c-format -msgid "3306 Issuing autochanger \"%s\" command.\n" -msgstr "3306 Envoi de la commande \"%s\" à l'autochangeur.\n" - -#: src/stored/autochanger.c:643 -msgid "3996 Open bpipe failed.\n" -msgstr "" - -#: src/stored/autochanger.c:670 -#, c-format -msgid "Autochanger error: ERR=%s\n" -msgstr "Erreur sur l'autochangeur : ERR=%s\n" - -#: src/stored/bcopy.c:62 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bcopy [-d debug_level] \n" -" -b bootstrap specify a bootstrap file\n" -" -c specify a Storage configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -i specify input Volume names (separated by |)\n" -" -o specify output Volume names (separated by |)\n" -" -p proceed inspite of errors\n" -" -v verbose\n" -" -w specify working directory (default /tmp)\n" -" -? print this message\n" -"\n" -msgstr "" -"\n" -"Version : %s (%s)\n" -"\n" -"Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c utilise fich comme fichier de configuration\n" -" -dnn positionne le niveau de debug à nn\n" -" -f reste en avant-plan (pour debugger)\n" -" -g groupid\n" -" -r lance maintenant\n" -" -s pas de signaux\n" -" -t test - lit seulement le fichier de configuration\n" -" -u userid\n" -" -v affiche les messages utilisateurs\n" -" -? affiche ce message.\n" -"\n" - -#: src/stored/bcopy.c:149 src/stored/bextract.c:206 src/stored/bscan.c:236 -#: src/tools/bbatch.c:176 src/tools/bvfs_test.c:189 src/tools/cats_test.c:308 -msgid "Wrong number of arguments: \n" -msgstr "" - -#: src/stored/bcopy.c:193 src/stored/btape.c:468 src/stored/device.c:338 -#, c-format -msgid "dev open failed: %s\n" -msgstr "" - -#: src/stored/bcopy.c:208 -msgid "Write of last block failed.\n" -msgstr "" - -#: src/stored/bcopy.c:212 -#, c-format -msgid "%u Jobs copied. %u records copied.\n" -msgstr "" - -#: src/stored/bcopy.c:229 src/stored/bscan.c:419 -#, c-format -msgid "Record: SessId=%u SessTim=%u FileIndex=%d Stream=%d len=%u\n" -msgstr "" - -#: src/stored/bcopy.c:245 -msgid "Volume is prelabeled. This volume cannot be copied.\n" -msgstr "" - -#: src/stored/bcopy.c:248 -msgid "Volume label not copied.\n" -msgstr "" - -#: src/stored/bcopy.c:254 -msgid "Copy skipped. Record does not match BSR filter.\n" -msgstr "" - -#: src/stored/bcopy.c:271 src/stored/bcopy.c:279 src/stored/bcopy.c:307 -#: src/stored/btape.c:2755 -#, c-format -msgid "Cannot fixup device error. %s\n" -msgstr "" - -#: src/stored/bcopy.c:285 -msgid "EOM label not copied.\n" -msgstr "" - -#: src/stored/bcopy.c:288 -msgid "EOT label not copied.\n" -msgstr "" - -#: src/stored/bcopy.c:321 src/stored/bls.c:439 src/stored/read_records.c:392 -msgid "Fresh Volume Label" -msgstr "" - -#: src/stored/bcopy.c:324 src/stored/bls.c:442 src/stored/read_records.c:395 -msgid "Volume Label" -msgstr "" - -#: src/stored/bcopy.c:328 src/stored/bls.c:446 src/stored/label.c:1332 -msgid "Begin Job Session" -msgstr "" - -#: src/stored/bcopy.c:332 src/stored/bls.c:451 src/stored/label.c:1335 -msgid "End Job Session" -msgstr "" - -#: src/stored/bcopy.c:337 src/stored/bls.c:455 -msgid "End of Medium" -msgstr "" - -#: src/stored/bcopy.c:340 src/stored/bls.c:467 src/stored/label.c:1344 -msgid "Unknown" -msgstr "" - -#: src/stored/bcopy.c:346 src/stored/bls.c:474 src/stored/read_records.c:413 -#, c-format -msgid "%s Record: VolSessionId=%d VolSessionTime=%d JobId=%d DataLen=%d\n" -msgstr "" - -#: src/stored/bcopy.c:364 src/stored/bextract.c:721 src/stored/bls.c:493 -#: src/stored/bscan.c:1359 src/stored/btape.c:3049 -#, c-format -msgid "Mount Volume \"%s\" on device %s and press return when ready: " -msgstr "" - -#: src/stored/bextract.c:80 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bextract \n" -" -b specify a bootstrap file\n" -" -c specify a Storage configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -T send debug traces to trace file\n" -" -e exclude list\n" -" -i include list\n" -" -p proceed inspite of I/O errors\n" -" -t read data from volume, do not write anything\n" -" -v verbose\n" -" -V specify Volume names (separated by |)\n" -" -? print this message\n" -"\n" -msgstr "" -"Copyright (C) 2000-2005 Kern Sibbald.\n" -"\n" -"Version : %s (%s)\n" -"\n" -"Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c utilise fich comme fichier de configuration\n" -" -dnn positionne le niveau de debug à nn\n" -" -f reste en avant-plan (pour debugger)\n" -" -g groupid\n" -" -r lance maintenant\n" -" -s pas de signaux\n" -" -t test - lit seulement le fichier de configuration\n" -" -u userid\n" -" -v affiche les messages utilisateurs\n" -" -? affiche ce message.\n" -"\n" - -#: src/stored/bextract.c:156 src/stored/bls.c:143 -#, c-format -msgid "Could not open exclude file: %s, ERR=%s\n" -msgstr "" - -#: src/stored/bextract.c:171 src/stored/bls.c:158 -#, c-format -msgid "Could not open include file: %s, ERR=%s\n" -msgstr "" - -#: src/stored/bextract.c:231 -#, c-format -msgid "%d Program Name and/or Program Data Stream records ignored.\n" -msgstr "" - -#: src/stored/bextract.c:235 -#, c-format -msgid "%d Win32 data or Win32 gzip data stream records. Ignored.\n" -msgstr "" - -#: src/stored/bextract.c:263 -#, c-format -msgid "Cannot stat %s. It must exist. ERR=%s\n" -msgstr "" - -#: src/stored/bextract.c:267 -#, c-format -msgid "%s must be a directory.\n" -msgstr "%s doit être un répertoire.\n" - -#: src/stored/bextract.c:296 -#, c-format -msgid "%u files restored.\n" -msgstr "%u fichiers restaurés.\n" - -#: src/stored/bextract.c:298 -#, fuzzy, c-format -msgid "Found %s error%s\n" -msgstr "Erreur de config : %s\n" - -#: src/stored/bextract.c:309 src/stored/bextract.c:315 -#, c-format -msgid "Write error on %s: %s\n" -msgstr "" - -#: src/stored/bextract.c:346 src/stored/read.c:163 src/stored/read.c:290 -#: src/stored/vbackup.c:265 -msgid "Cannot do rehydration, device is not dedup aware\n" -msgstr "" - -#: src/stored/bextract.c:354 -#, c-format -msgid "" -"Got rehydration error at file=%d record=%s fname=%s volsessionid=%d " -"volsessiontime=%d Msg=%s" -msgstr "" - -#: src/stored/bextract.c:388 src/stored/bextract.c:426 src/stored/bls.c:400 -#: src/stored/bscan.c:679 -msgid "Cannot continue.\n" -msgstr "" - -#: src/stored/bextract.c:419 src/stored/bextract.c:691 -msgid "Logic error output file should be open but is not.\n" -msgstr "" - -#: src/stored/bextract.c:446 -#, fuzzy, c-format -msgid "%s was deleted.\n" -msgstr "Pas de job sélectionné.\n" - -#: src/stored/bextract.c:495 -#, c-format -msgid "Seek error on %s: %s\n" -msgstr "" - -#: src/stored/bextract.c:550 -#, c-format -msgid "Uncompression error. ERR=%d\n" -msgstr "Erreur de décompression. ERR=%d\n" - -#: src/stored/bextract.c:619 -#, c-format -msgid "Compressed header version error. version=0x%x\n" -msgstr "" - -#: src/stored/bextract.c:648 -#, fuzzy, c-format -msgid "LZO uncompression error. ERR=%d\n" -msgstr "Erreur de décompression. ERR=%d\n" - -#: src/stored/bextract.c:682 -msgid "Got Program Name or Data Stream. Ignored.\n" -msgstr "" - -#: src/stored/block.c:100 -#, fuzzy -msgid "Error writing final JobMedia record to catalog.\n" -msgstr "Erreur pendant l'écriture du fichier bsr.\n" - -#: src/stored/block.c:148 -#, fuzzy, c-format -msgid "Cannot write block. Device at EOM. dev=%s\n" -msgstr "Impossible d'écrire un bloc. Le Device est au bout EOM.\n" - -#: src/stored/block.c:153 -#, c-format -msgid "Attempt to write on read-only Volume. dev=%s\n" -msgstr "" - -#: src/stored/block.c:159 -#, c-format -msgid "Attempt to write on closed device=%s\n" -msgstr "" - -#: src/stored/block.c:198 -#, c-format -msgid "Unable to write EOF. ERR=%s\n" -msgstr "Impossible d'écrire le marqueur EOF. ERR=%s\n" - -#: src/stored/block.c:234 src/stored/block.c:292 -msgid "Write block header zeroed.\n" -msgstr "" - -#: src/stored/block.c:284 -#, c-format -msgid "Block checksum changed during write: before=%ud after=%ud\n" -msgstr "" - -#: src/stored/block.c:311 -#, c-format -msgid "Write error at %u:%u on device %s. ERR=%s.\n" -msgstr "Erreur d'écriture à %u:%u sur le device %s. ERR=%s\n" - -#: src/stored/block.c:321 -#, fuzzy, c-format -msgid "" -"Out of freespace caused End of Volume \"%s\" at %u:%u on device %s. Write of " -"%u bytes got %d.\n" -msgstr "" -"Fin du volume \"%s\" à %u:%u sur le device %s. Ecriture de %u octets, eu " -"%d.\n" - -#: src/stored/block.c:326 -#, c-format -msgid "End of Volume \"%s\" at %u:%u on device %s. Write of %u bytes got %d.\n" -msgstr "" -"Fin du volume \"%s\" à %u:%u sur le device %s. Ecriture de %u octets, eu " -"%d.\n" - -#: src/stored/block.c:456 -#, fuzzy -msgid "Job failed or canceled.\n" -msgstr "Le job %d est annulé.\n" - -#: src/stored/block.c:462 -msgid "Attempt to read past end of tape or file.\n" -msgstr "" - -#: src/stored/block.c:470 -#, c-format -msgid "Attempt to read closed device: fd=%d at file:blk %u:%u on device %s\n" -msgstr "" - -#: src/stored/block.c:483 -#, c-format -msgid "Block buffer size looping problem on device %s\n" -msgstr "" - -#: src/stored/block.c:498 -#, fuzzy, c-format -msgid "Unable to open device part=%d %s: ERR=%s\n" -msgstr "3910 Impossible d'ouvrir le device %s : ERR=%s\n" - -#: src/stored/block.c:534 -#, fuzzy, c-format -msgid "The Volume=%s on device=%s appears to be unlabeled.\n" -msgstr "Le volume sur %s possède un mauvais label Bacula : %x\n" - -#: src/stored/block.c:537 -#, c-format -msgid "Read error on fd=%d at file:blk %u:%u on device %s. ERR=%s.\n" -msgstr "" - -#: src/stored/block.c:548 -#, c-format -msgid "The %sVolume=%s on device=%s appears to be unlabeled.\n" -msgstr "" - -#: src/stored/block.c:551 -#, fuzzy, c-format -msgid "Read zero %sbytes Vol=%s at %lld on device %s.\n" -msgstr "Prêt à lire les données du volume \"%s\" depuis le device %s.\n" - -#: src/stored/block.c:585 -#, c-format -msgid "" -"Volume data error at %u:%u! Very short block of %d bytes on device %s " -"discarded.\n" -msgstr "" - -#: src/stored/block.c:613 -#, c-format -msgid "Block length %u is greater than buffer %u. Attempting recovery.\n" -msgstr "" - -#: src/stored/block.c:633 -#, c-format -msgid "Setting block buffer size to %u bytes.\n" -msgstr "" - -#: src/stored/block.c:648 -#, c-format -msgid "" -"Volume data error at %u:%u! Short block of %d bytes on device %s discarded.\n" -msgstr "" - -#: src/stored/block_util.c:93 -#, c-format -msgid "" -"Dump block %s %p: adata=%d size=%d BlkNum=%d\n" -" Hdrcksum=%x cksum=%x\n" -msgstr "" - -#: src/stored/block_util.c:118 -#, c-format -msgid " Rec: VId=%u VT=%u FI=%s Strm=%s len=%d reclen=%d\n" -msgstr "" - -#: src/stored/block_util.c:203 -#, c-format -msgid "%d block read errors not printed.\n" -msgstr "" - -#: src/stored/block_util.c:341 -#, c-format -msgid "" -"Volume data error at %lld!\n" -"Adata block checksum mismatch in block=%u len=%d: calc=%x blk=%x\n" -msgstr "" - -#: src/stored/block_util.c:376 src/stored/block_util.c:394 -#: src/stored/block_util.c:404 -#, c-format -msgid "" -"Volume data error at %u:%u! Wanted ID: \"%s\", got \"%s\". Buffer " -"discarded.\n" -msgstr "" - -#: src/stored/block_util.c:419 -#, c-format -msgid "" -"Volume data error at %u:%u! Block length %u is insane (too large), probably " -"due to a bad archive.\n" -msgstr "" - -#: src/stored/block_util.c:446 -#, c-format -msgid "" -"Volume data error at %u:%u!\n" -"Block checksum mismatch in block=%u len=%d: calc=%x blk=%x\n" -msgstr "" - -#: src/stored/block_util.c:542 -#, fuzzy, c-format -msgid "" -"User defined maximum volume size %s will be exceeded on device %s.\n" -" Marking Volume \"%s\" as Full.\n" -msgstr "" -"Nombre maximum de job sur le volume atteind. Marquage du volume \"%s\" comme " -"Used.\n" - -#: src/stored/block_util.c:579 src/stored/block_util.c:585 -#, c-format -msgid "Backspace file at EOT failed. ERR=%s\n" -msgstr "" - -#: src/stored/block_util.c:592 -#, c-format -msgid "Backspace record at EOT failed. ERR=%s\n" -msgstr "" - -#: src/stored/block_util.c:609 -#, c-format -msgid "Re-read last block at EOT failed. ERR=%s" -msgstr "Erreur sur la re-lecture du dernier bloc en EOT. ERR=%s" - -#: src/stored/block_util.c:619 -#, c-format -msgid "" -"Re-read of last block: block numbers differ by more than one.\n" -"Probable tape misconfiguration and data loss. Read block=%u Want block=%u.\n" -msgstr "" - -#: src/stored/block_util.c:624 -#, c-format -msgid "" -"Re-read of last block OK, but block numbers differ. Read block=%u Want block=" -"%u.\n" -msgstr "" - -#: src/stored/block_util.c:628 -msgid "Re-read of last block succeeded.\n" -msgstr "La re-lecture du dernier bloc écrit a réussi.\n" - -#: src/stored/block_util.c:677 -#, c-format -msgid "" -"Error writing final EOF to tape. This Volume may not be readable.\n" -"%s" -msgstr "" - -#: src/stored/block_util.c:695 -#, fuzzy -msgid "Error sending Volume info to Director.\n" -msgstr "Erreur pendant la récupération des informations sur un Volume : %s" - -#: src/stored/block_util.c:815 -#, c-format -msgid "" -"Error while writing, current part number is less than the total number of " -"parts (%d/%d, device=%s)\n" -msgstr "" - -#: src/stored/block_util.c:823 -#, c-format -msgid "Unable to open device next part %s: ERR=%s\n" -msgstr "" - -#: src/stored/block_util.c:843 -#, c-format -msgid "" -"End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, " -"free_space_errno=%d, errmsg=%s).\n" -msgstr "" - -#: src/stored/block_util.c:856 -#, c-format -msgid "" -"End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, " -"free_space_errno=%d).\n" -msgstr "" - -#: src/stored/bls.c:68 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bls [options] \n" -" -b specify a bootstrap file\n" -" -c specify a Storage configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -e exclude list\n" -" -i include list\n" -" -j list jobs\n" -" -k list blocks\n" -" (no j or k option) list saved files\n" -" -L dump label\n" -" -p proceed inspite of errors\n" -" -v be verbose\n" -" -V specify Volume names (separated by |)\n" -" -E Check records to detect errors\n" -" -? print this message\n" -"\n" -msgstr "" -"Copyright (C) 2000-2005 Kern Sibbald.\n" -"\n" -"Version : %s (%s)\n" -"\n" -"Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c utilise fich comme fichier de configuration\n" -" -dnn positionne le niveau de debug à nn\n" -" -f reste en avant-plan (pour debugger)\n" -" -g groupid\n" -" -r lance maintenant\n" -" -s pas de signaux\n" -" -t test - lit seulement le fichier de configuration\n" -" -u userid\n" -" -v affiche les messages utilisateurs\n" -" -? affiche ce message.\n" -"\n" - -#: src/stored/bls.c:205 -msgid "No archive name specified\n" -msgstr "" - -#: src/stored/bls.c:244 -#, c-format -msgid "" -"\n" -"Warning, this Volume is a continuation of Volume %s\n" -msgstr "" - -#: src/stored/bls.c:291 -#, c-format -msgid "Got EOM at file %u on device %s, Volume \"%s\"\n" -msgstr "" - -#: src/stored/bls.c:302 -#, c-format -msgid "Mounted Volume \"%s\".\n" -msgstr "" - -#: src/stored/bls.c:304 -#, c-format -msgid "End of file %u on device %s, Volume \"%s\"\n" -msgstr "" - -#: src/stored/bls.c:329 -#, c-format -msgid "" -"File:blk=%u:%u blk_num=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=" -"%s rlen=%d\n" -msgstr "" - -#: src/stored/bls.c:338 -#, c-format -msgid "Block: %d size=%d\n" -msgstr "Bloc : %d taille=%d\n" - -#: src/stored/bls.c:402 -msgid "Attrib unpack error!\n" -msgstr "" - -#: src/stored/bls.c:413 -#, c-format -msgid "FileIndex=%d VolSessionId=%d VolSessionTime=%d Stream=%d DataLen=%d\n" -msgstr "" - -#: src/stored/bls.c:458 -msgid "End of Physical Medium" -msgstr "" - -#: src/stored/bls.c:461 -msgid "Start of object" -msgstr "" - -#: src/stored/bls.c:464 -msgid "End of object" -msgstr "" - -#: src/stored/bscan.c:105 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bscan [ options ] \n" -" -b bootstrap specify a bootstrap file\n" -" -c specify configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -m update media info in database\n" -" -D specify the driver database name (default NULL)\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database password (default none)\n" -" -h specify database host (default NULL)\n" -" -t specify database port (default 0)\n" -" -p proceed inspite of I/O errors\n" -" -r list records\n" -" -s synchronize or store in database\n" -" -S show scan progress periodically\n" -" -v verbose\n" -" -V specify Volume names (separated by |)\n" -" -w specify working directory (default from conf file)\n" -" -? print this message\n" -"\n" -msgstr "" -"Copyright (C) 2000-2005 Kern Sibbald.\n" -"\n" -"Version : %s (%s)\n" -"\n" -"Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c utilise fich comme fichier de configuration\n" -" -dnn positionne le niveau de debug à nn\n" -" -f reste en avant-plan (pour debugger)\n" -" -g groupid\n" -" -r lance maintenant\n" -" -s pas de signaux\n" -" -t test - lit seulement le fichier de configuration\n" -" -u userid\n" -" -v affiche les messages utilisateurs\n" -" -? affiche ce message.\n" -"\n" - -#: src/stored/bscan.c:254 src/stored/bsdjson.c:481 src/stored/stored.c:349 -#, c-format -msgid "No Working Directory defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bscan.c:262 -#, c-format -msgid "Working Directory: %s not found. Cannot continue.\n" -msgstr "" - -#: src/stored/bscan.c:266 -#, c-format -msgid "Working Directory: %s is not a directory. Cannot continue.\n" -msgstr "" - -#: src/stored/bscan.c:280 src/stored/bscan.c:363 -#, fuzzy, c-format -msgid "First Volume Size = %s\n" -msgstr "Le nombre courant de fichier sur le Volume est : %u\n" - -#: src/stored/bscan.c:299 src/tools/bbatch.c:243 src/tools/bvfs_test.c:212 -#, c-format -msgid "Using Database: %s, User: %s\n" -msgstr "" - -#: src/stored/bscan.c:334 -#, c-format -msgid "Create JobMedia for Job %s\n" -msgstr "" - -#: src/stored/bscan.c:344 -#, c-format -msgid "Could not create JobMedia record for Volume=%s Job=%s\n" -msgstr "" - -#: src/stored/bscan.c:411 -#, c-format -msgid "done: %d%%\n" -msgstr "" - -#: src/stored/bscan.c:435 -msgid "Volume is prelabeled. This tape cannot be scanned.\n" -msgstr "" - -#: src/stored/bscan.c:447 -#, c-format -msgid "Pool record for %s found in DB.\n" -msgstr "" - -#: src/stored/bscan.c:451 -#, c-format -msgid "VOL_LABEL: Pool record not found for Pool: %s\n" -msgstr "" - -#: src/stored/bscan.c:457 -#, c-format -msgid "VOL_LABEL: PoolType mismatch. DB=%s Vol=%s\n" -msgstr "" - -#: src/stored/bscan.c:461 -#, c-format -msgid "Pool type \"%s\" is OK.\n" -msgstr "" - -#: src/stored/bscan.c:471 -#, c-format -msgid "Media record for %s found in DB.\n" -msgstr "" - -#: src/stored/bscan.c:478 -#, c-format -msgid "VOL_LABEL: Media record not found for Volume: %s\n" -msgstr "" - -#: src/stored/bscan.c:485 -#, c-format -msgid "VOL_LABEL: MediaType mismatch. DB=%s Vol=%s\n" -msgstr "" - -#: src/stored/bscan.c:489 -#, c-format -msgid "Media type \"%s\" is OK.\n" -msgstr "" - -#: src/stored/bscan.c:499 -#, c-format -msgid "VOL_LABEL: OK for Volume: %s\n" -msgstr "" - -#: src/stored/bscan.c:506 -#, c-format -msgid "%d \"errors\" ignored before first Start of Session record.\n" -msgstr "" - -#: src/stored/bscan.c:517 -#, c-format -msgid "SOS_LABEL: Found Job record for JobId: %d\n" -msgstr "" - -#: src/stored/bscan.c:522 -#, c-format -msgid "SOS_LABEL: Job record not found for JobId: %d\n" -msgstr "" - -#: src/stored/bscan.c:562 -#, c-format -msgid "SOS_LABEL: VolSessId mismatch for JobId=%u. DB=%d Vol=%d\n" -msgstr "" - -#: src/stored/bscan.c:568 -#, c-format -msgid "SOS_LABEL: VolSessTime mismatch for JobId=%u. DB=%d Vol=%d\n" -msgstr "" - -#: src/stored/bscan.c:574 -#, c-format -msgid "SOS_LABEL: PoolId mismatch for JobId=%u. DB=%d Vol=%d\n" -msgstr "" - -#: src/stored/bscan.c:592 src/stored/bscan.c:1146 -#, c-format -msgid "Could not find SessId=%d SessTime=%d for EOS record.\n" -msgstr "" - -#: src/stored/bscan.c:638 -#, c-format -msgid "Could not update job record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:649 -#, c-format -msgid "End of all Volumes. VolFiles=%u VolBlocks=%u VolBytes=%s\n" -msgstr "" - -#: src/stored/bscan.c:661 -#, c-format -msgid "Could not find Job for SessId=%d SessTime=%d record.\n" -msgstr "" - -#: src/stored/bscan.c:692 -#, c-format -msgid "%s file records. At file:blk=%s:%s bytes=%s\n" -msgstr "" - -#: src/stored/bscan.c:757 -#, c-format -msgid "Got MD5 record: %s\n" -msgstr "" - -#: src/stored/bscan.c:765 -#, c-format -msgid "Got SHA1 record: %s\n" -msgstr "" - -#: src/stored/bscan.c:773 -#, c-format -msgid "Got SHA256 record: %s\n" -msgstr "" - -#: src/stored/bscan.c:781 -#, c-format -msgid "Got SHA512 record: %s\n" -msgstr "" - -#: src/stored/bscan.c:789 src/stored/bscan.c:796 -msgid "Got signed digest record\n" -msgstr "" - -#: src/stored/bscan.c:802 -#, c-format -msgid "Got Prog Names Stream: %s\n" -msgstr "" - -#: src/stored/bscan.c:808 -msgid "Got Prog Data Stream record.\n" -msgstr "" - -#: src/stored/bscan.c:853 -#, c-format -msgid "Unknown stream type!!! stream=%d len=%i\n" -msgstr "" - -#: src/stored/bscan.c:915 -#, c-format -msgid "Could not create File Attributes record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:921 -#, c-format -msgid "Created File record: %s\n" -msgstr "" - -#: src/stored/bscan.c:966 -#, c-format -msgid "Could not create media record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:970 src/stored/bscan.c:991 -#, c-format -msgid "Could not update media record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:974 -#, c-format -msgid "Created Media record for Volume: %s\n" -msgstr "" - -#: src/stored/bscan.c:995 -#, c-format -msgid "Updated Media record at end of Volume: %s\n" -msgstr "" - -#: src/stored/bscan.c:1012 -#, c-format -msgid "Could not create pool record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1016 -#, c-format -msgid "Created Pool record for Pool: %s\n" -msgstr "" - -#: src/stored/bscan.c:1035 -#, fuzzy, c-format -msgid "Could not get Client record. ERR=%s\n" -msgstr "Impossible d'initialiser la queue cliente : ERR=%s\n" - -#: src/stored/bscan.c:1045 -#, c-format -msgid "Created Client record for Client: %s\n" -msgstr "" - -#: src/stored/bscan.c:1062 -#, c-format -msgid "Fileset \"%s\" already exists.\n" -msgstr "" - -#: src/stored/bscan.c:1066 -#, c-format -msgid "Could not create FileSet record \"%s\". ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1071 -#, c-format -msgid "Created FileSet record \"%s\"\n" -msgstr "" - -#: src/stored/bscan.c:1118 -#, c-format -msgid "Could not create JobId record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1124 -#, c-format -msgid "Could not update job start record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1127 -#, c-format -msgid "Created new JobId=%u record for original JobId=%u\n" -msgstr "" - -#: src/stored/bscan.c:1180 -#, c-format -msgid "Could not update JobId=%u record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1185 -#, c-format -msgid "Updated Job termination record for JobId=%u Level=%s TermStat=%c\n" -msgstr "" - -#: src/stored/bscan.c:1210 -#, c-format -msgid "Job Termination code: %d" -msgstr "" - -#: src/stored/bscan.c:1215 -#, c-format -msgid "" -"%s\n" -"JobId: %d\n" -"Job: %s\n" -"FileSet: %s\n" -"Backup Level: %s\n" -"Client: %s\n" -"Start time: %s\n" -"End time: %s\n" -"Files Written: %s\n" -"Bytes Written: %s\n" -"Volume Session Id: %d\n" -"Volume Session Time: %d\n" -"Last Volume Bytes: %s\n" -"Termination: %s\n" -"\n" -msgstr "" - -#: src/stored/bscan.c:1273 -#, c-format -msgid "Could not create JobMedia record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1277 -#, c-format -msgid "Created JobMedia record JobId %d, MediaId %d\n" -msgstr "" - -#: src/stored/bscan.c:1293 -#, c-format -msgid "Could not find SessId=%d SessTime=%d for MD5/SHA1 record.\n" -msgstr "" - -#: src/stored/bscan.c:1307 -#, c-format -msgid "Could not add MD5/SHA1 to File record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1312 -msgid "Updated MD5/SHA1 record\n" -msgstr "" - -#: src/stored/bsdjson.c:74 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bsdjson [options] [-c config_file] [config_file]\n" -" -r get resource type \n" -" -n get resource \n" -" -l get only directives matching dirs (use with -r)\n" -" -D get only data\n" -" -c use as configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -t test - read config and exit\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Version : %s (%s)\n" -"\n" -"Usage : stored [options] [-c config_file] [config_file]\n" -" -c utilise fich comme fichier de configuration\n" -" -dnn positionne le niveau de debug à nn\n" -" -dt affiche un timestamp devant chaque ligne de debug\n" -" -f reste en avant-plan (pour debugger)\n" -" -g groupid\n" -" -p continue même en cas d'erreurs E/S\n" -" -s pas de signaux\n" -" -t test - lit seulement le fichier de configuration\n" -" -u userid\n" -" -v affiche les messages utilisateurs\n" -" -? affiche ce message.\n" -"\n" - -#: src/stored/bsdjson.c:450 src/stored/butil.c:78 src/stored/stored.c:318 -#, c-format -msgid "No Storage resource defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bsdjson.c:456 src/stored/stored.c:324 -#, c-format -msgid "Only one Storage resource permitted in %s\n" -msgstr "" - -#: src/stored/bsdjson.c:461 src/stored/stored.c:329 -#, c-format -msgid "No Director resource defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bsdjson.c:466 src/stored/stored.c:334 -#, c-format -msgid "No Device resource defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bsdjson.c:474 src/stored/stored.c:342 -#, c-format -msgid "No Messages resource defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bsdjson.c:503 src/stored/stored.c:371 -#, c-format -msgid "\"TLS Certificate\" file not defined for Storage \"%s\" in %s.\n" -msgstr "" - -#: src/stored/bsdjson.c:509 src/stored/stored.c:377 -#, c-format -msgid "\"TLS Key\" file not defined for Storage \"%s\" in %s.\n" -msgstr "" - -#: src/stored/bsdjson.c:515 src/stored/stored.c:383 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Storage \"%s\" in %s. At least one CA certificate store is required when " -"using \"TLS Verify Peer\".\n" -msgstr "" - -#: src/stored/btape.c:165 src/stored/stored.c:132 -#, c-format -msgid "Tape block size (%d) not multiple of system size (%d)\n" -msgstr "" - -#: src/stored/btape.c:169 src/stored/stored.c:136 -#, c-format -msgid "Tape block size (%d) is not a power of 2\n" -msgstr "" - -#: src/stored/btape.c:172 -#, c-format -msgid "" -"\n" -"\n" -"!!!! Warning large disk addressing disabled. boffset_t=%d should be 8 or " -"more !!!!!\n" -"\n" -"\n" -msgstr "" - -#: src/stored/btape.c:179 -#, c-format -msgid "32 bit printf/scanf problem. i=%d x32=%u y32=%u\n" -msgstr "" - -#: src/stored/btape.c:188 -msgid "64 bit printf/scanf problem. i=%d x64=%" -msgstr "" - -#: src/stored/btape.c:193 -#, c-format -msgid "Tape block granularity is %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:269 -msgid "No archive name specified.\n" -msgstr "" - -#: src/stored/btape.c:273 -msgid "Improper number of arguments specified.\n" -msgstr "" - -#: src/stored/btape.c:287 -msgid "btape does not work with DVD storage.\n" -msgstr "" - -#: src/stored/btape.c:292 -msgid "btape only works with tape storage.\n" -msgstr "" - -#: src/stored/btape.c:378 -#, c-format -msgid "Total Volume bytes=%sB. Total Write rate = %sB/s\n" -msgstr "" - -#: src/stored/btape.c:404 -#, c-format -msgid "Volume bytes=%sB. Write rate = %sB/s\n" -msgstr "" - -#: src/stored/btape.c:472 -#, c-format -msgid "open device %s: OK\n" -msgstr "" - -#: src/stored/btape.c:495 -msgid "Enter Volume Name: " -msgstr "Saisissez un nom de Volume : " - -#: src/stored/btape.c:502 -#, c-format -msgid "Device open failed. ERR=%s\n" -msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" - -#: src/stored/btape.c:507 -#, c-format -msgid "Wrote Volume label for volume \"%s\".\n" -msgstr "" - -#: src/stored/btape.c:521 -msgid "Volume has no label.\n" -msgstr "Le Volume n'a pas de label.\n" - -#: src/stored/btape.c:524 -msgid "Volume label read correctly.\n" -msgstr "" - -#: src/stored/btape.c:527 -#, c-format -msgid "I/O error on device: ERR=%s" -msgstr "" - -#: src/stored/btape.c:530 -#, fuzzy, c-format -msgid "Volume type error: ERR=%s\n" -msgstr "erreur de fermeture : ERR=%s\n" - -#: src/stored/btape.c:533 -msgid "Volume name error\n" -msgstr "" - -#: src/stored/btape.c:536 -#, c-format -msgid "Error creating label. ERR=%s" -msgstr "" - -#: src/stored/btape.c:539 -msgid "Volume version error.\n" -msgstr "" - -#: src/stored/btape.c:542 -msgid "Bad Volume label type.\n" -msgstr "" - -#: src/stored/btape.c:545 -msgid "Unknown error.\n" -msgstr "" - -#: src/stored/btape.c:563 -#, c-format -msgid "Bad status from load. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:565 -#, c-format -msgid "Loaded %s\n" -msgstr "" - -#: src/stored/btape.c:574 src/stored/btape.c:1137 src/stored/btape.c:1210 -#: src/stored/btape.c:1289 src/stored/btape.c:1559 -#, c-format -msgid "Bad status from rewind. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:577 src/stored/btape.c:1567 -#, c-format -msgid "Rewound %s\n" -msgstr "" - -#: src/stored/btape.c:603 src/stored/btape.c:1571 -#, c-format -msgid "Bad status from weof. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:607 -#, c-format -msgid "Wrote 1 EOF to %s\n" -msgstr "" - -#: src/stored/btape.c:610 -#, c-format -msgid "Wrote %d EOFs to %s\n" -msgstr "" - -#: src/stored/btape.c:628 -msgid "Moved to end of medium.\n" -msgstr "" - -#: src/stored/btape.c:655 -#, c-format -msgid "Bad status from bsf. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:657 -#, c-format -msgid "Backspaced %d file%s.\n" -msgstr "" - -#: src/stored/btape.c:674 -#, c-format -msgid "Bad status from bsr. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:676 -#, c-format -msgid "Backspaced %d record%s.\n" -msgstr "" - -#: src/stored/btape.c:686 src/stored/status.c:626 -#, c-format -msgid "Configured device capabilities:\n" -msgstr "" - -#: src/stored/btape.c:704 -#, c-format -msgid "Device status:\n" -msgstr "" - -#: src/stored/btape.c:718 src/stored/status.c:682 -#, c-format -msgid "Device parameters:\n" -msgstr "" - -#: src/stored/btape.c:723 -#, c-format -msgid "Status:\n" -msgstr "Statut :\n" - -#: src/stored/btape.c:738 -msgid "" -"Test writing larger and larger records.\n" -"This is a torture test for records.\n" -"I am going to write\n" -"larger and larger records. It will stop when the record size\n" -"plus the header exceeds the block size (by default about 64K)\n" -msgstr "" - -#: src/stored/btape.c:744 -msgid "Do you want to continue? (y/n): " -msgstr "Voulez vous continuer ? (y/n) : " - -#: src/stored/btape.c:746 src/stored/btape.c:2196 -msgid "Command aborted.\n" -msgstr "Commande annulée.\n" - -#: src/stored/btape.c:763 -#, c-format -msgid "Block %d i=%d\n" -msgstr "" - -#: src/stored/btape.c:790 -msgid "Skipping read backwards test because BSR turned off.\n" -msgstr "" - -#: src/stored/btape.c:794 -msgid "" -"\n" -"=== Write, backup, and re-read test ===\n" -"\n" -"I'm going to write three records and an EOF\n" -"then backup over the EOF and re-read the last record.\n" -"Bacula does this after writing the last block on the\n" -"tape to verify that the block was written correctly.\n" -"\n" -"This is not an *essential* feature ...\n" -"\n" -msgstr "" - -#: src/stored/btape.c:807 src/stored/btape.c:818 src/stored/btape.c:829 -#: src/stored/btape.c:1147 src/stored/btape.c:1163 src/stored/btape.c:1903 -#: src/stored/btape.c:2822 -msgid "Error writing record to block.\n" -msgstr "" - -#: src/stored/btape.c:811 src/stored/btape.c:822 src/stored/btape.c:833 -#: src/stored/btape.c:1151 src/stored/btape.c:1167 src/stored/btape.c:1907 -#: src/stored/btape.c:2826 -msgid "Error writing block to device.\n" -msgstr "" - -#: src/stored/btape.c:814 -#, c-format -msgid "Wrote first record of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:825 -#, c-format -msgid "Wrote second record of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:836 -#, c-format -msgid "Wrote third record of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:843 src/stored/btape.c:848 -#, c-format -msgid "Backspace file failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:852 -msgid "Backspaced over EOF OK.\n" -msgstr "" - -#: src/stored/btape.c:854 -#, c-format -msgid "Backspace record failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:857 -msgid "Backspace record OK.\n" -msgstr "" - -#: src/stored/btape.c:859 src/stored/btape.c:865 -#, c-format -msgid "Read block failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:870 -msgid "Bad data in record. Test failed!\n" -msgstr "" - -#: src/stored/btape.c:874 -msgid "" -"\n" -"Block re-read correct. Test succeeded!\n" -msgstr "" - -#: src/stored/btape.c:875 -msgid "" -"=== End Write, backup, and re-read test ===\n" -"\n" -msgstr "" - -#: src/stored/btape.c:882 -msgid "" -"This is not terribly serious since Bacula only uses\n" -"this function to verify the last block written to the\n" -"tape. Bacula will skip the last block verification\n" -"if you add:\n" -"\n" -"Backward Space Record = No\n" -"\n" -"to your Storage daemon's Device resource definition.\n" -msgstr "" - -#: src/stored/btape.c:904 -#, c-format -msgid "Begin writing %i files of %sB with raw blocks of %u bytes.\n" -msgstr "" - -#: src/stored/btape.c:925 src/stored/btape.c:2878 -#, c-format -msgid "Write failed at block %u. stat=%d ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:959 -#, c-format -msgid "Begin writing %i files of %sB with blocks of %u bytes.\n" -msgstr "" - -#: src/stored/btape.c:968 -#, fuzzy -msgid "" -"\n" -"Error writing record to block.\n" -msgstr "Erreur pendant l'écriture du fichier bsr.\n" - -#: src/stored/btape.c:972 -#, fuzzy -msgid "" -"\n" -"Error writing block to device.\n" -msgstr "Erreur pendant l'écriture du fichier bsr.\n" - -#: src/stored/btape.c:1027 -msgid "The file_size is too big, stop this test with Ctrl-c.\n" -msgstr "" - -#: src/stored/btape.c:1055 -msgid "Test with zero data, should give the maximum throughput.\n" -msgstr "" - -#: src/stored/btape.c:1067 src/stored/btape.c:1093 -msgid "Test with random data, should give the minimum throughput.\n" -msgstr "" - -#: src/stored/btape.c:1082 -msgid "Test with zero data and bacula block structure.\n" -msgstr "" - -#: src/stored/btape.c:1123 -#, c-format -msgid "" -"\n" -"=== Write, rewind, and re-read test ===\n" -"\n" -"I'm going to write %d records and an EOF\n" -"then write %d records and an EOF, then rewind,\n" -"and re-read the data to verify that it is correct.\n" -"\n" -"This is an *essential* feature ...\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1155 src/stored/btape.c:1171 -#, fuzzy, c-format -msgid "Wrote %d blocks of %d bytes.\n" -msgstr "Ecriture de 1000 blocs de %d octets.\n" - -#: src/stored/btape.c:1213 src/stored/btape.c:1292 -msgid "Rewind OK.\n" -msgstr "" - -#: src/stored/btape.c:1225 src/stored/btape.c:1343 -msgid "Got EOF on tape.\n" -msgstr "" - -#: src/stored/btape.c:1230 -#, c-format -msgid "Read block %d failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1236 -#, c-format -msgid "Read record failed. Block %d! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1242 src/stored/btape.c:1373 -#, c-format -msgid "Bad data in record. Expected %d, got %d at byte %d. Test failed!\n" -msgstr "" - -#: src/stored/btape.c:1249 -#, fuzzy, c-format -msgid "%d blocks re-read correctly.\n" -msgstr "1000 blocs relus correctement.\n" - -#: src/stored/btape.c:1252 src/stored/btape.c:1380 -msgid "" -"=== Test Succeeded. End Write, rewind, and re-read test ===\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1280 -msgid "Block position test\n" -msgstr "" - -#: src/stored/btape.c:1335 -#, c-format -msgid "Reposition to file:block %d:%d\n" -msgstr "" - -#: src/stored/btape.c:1337 -msgid "Reposition error.\n" -msgstr "" - -#: src/stored/btape.c:1349 -#, c-format -msgid "" -"Read block %d failed! file=%d blk=%d. ERR=%s\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1351 -msgid "" -"This may be because the tape drive block size is not\n" -" set to variable blocking as normally used by Bacula.\n" -" Please see the Tape Testing chapter in the manual and \n" -" look for using mt with defblksize and setoptions\n" -"If your tape drive block size is correct, then perhaps\n" -" your SCSI driver is *really* stupid and does not\n" -" correctly report the file:block after a FSF. In this\n" -" case try setting:\n" -" Fast Forward Space File = no\n" -" in your Device resource.\n" -msgstr "" - -#: src/stored/btape.c:1367 -#, c-format -msgid "Read record failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1378 -#, c-format -msgid "Block %d re-read correctly.\n" -msgstr "" - -#: src/stored/btape.c:1399 -msgid "" -"\n" -"\n" -"=== Append files test ===\n" -"\n" -"This test is essential to Bacula.\n" -"\n" -"I'm going to write one record in file 0,\n" -" two records in file 1,\n" -" and three records in file 2\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1423 -msgid "Now moving to end of medium.\n" -msgstr "" - -#: src/stored/btape.c:1425 src/stored/btape.c:1654 -#, c-format -msgid "We should be in file 3. I am at file %d. %s\n" -msgstr "" - -#: src/stored/btape.c:1426 src/stored/btape.c:1444 src/stored/btape.c:1643 -#: src/stored/btape.c:1655 src/stored/btape.c:1668 src/stored/btape.c:1685 -msgid "This is correct!" -msgstr "" - -#: src/stored/btape.c:1426 src/stored/btape.c:1444 src/stored/btape.c:1643 -#: src/stored/btape.c:1655 src/stored/btape.c:1668 src/stored/btape.c:1685 -msgid "This is NOT correct!!!!" -msgstr "" - -#: src/stored/btape.c:1432 -msgid "" -"\n" -"Now the important part, I am going to attempt to append to the tape.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1439 -msgid "" -"Done appending, there should be no I/O errors\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1440 -msgid "Doing Bacula scan of blocks:\n" -msgstr "" - -#: src/stored/btape.c:1442 -msgid "End scanning the tape.\n" -msgstr "" - -#: src/stored/btape.c:1443 src/stored/btape.c:1667 -#, c-format -msgid "We should be in file 4. I am at file %d. %s\n" -msgstr "" - -#: src/stored/btape.c:1468 -msgid "" -"\n" -"Autochanger enabled, but no name or no command device specified.\n" -msgstr "" - -#: src/stored/btape.c:1472 -msgid "" -"\n" -"Ah, I see you have an autochanger configured.\n" -"To test the autochanger you must have a blank tape\n" -" that I can write on in Slot 1.\n" -msgstr "" - -#: src/stored/btape.c:1475 -msgid "" -"\n" -"Do you wish to continue with the Autochanger test? (y/n): " -msgstr "" - -#: src/stored/btape.c:1482 -msgid "" -"\n" -"\n" -"=== Autochanger test ===\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1491 -msgid "3301 Issuing autochanger \"loaded\" command.\n" -msgstr "" - -#: src/stored/btape.c:1500 -#, c-format -msgid "3991 Bad autochanger command: %s\n" -msgstr "" - -#: src/stored/btape.c:1501 -#, c-format -msgid "3991 result=\"%s\": ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1505 -#, c-format -msgid "Slot %d loaded. I am going to unload it.\n" -msgstr "" - -#: src/stored/btape.c:1507 -msgid "Nothing loaded in the drive. OK.\n" -msgstr "" - -#: src/stored/btape.c:1514 -#, c-format -msgid "3302 Issuing autochanger \"unload %d %d\" command.\n" -msgstr "" - -#: src/stored/btape.c:1519 -#, c-format -msgid "unload status=%s %d\n" -msgstr "" - -#: src/stored/btape.c:1519 -msgid "Bad" -msgstr "" - -#: src/stored/btape.c:1522 -#, c-format -msgid "3992 Bad autochanger command: %s\n" -msgstr "" - -#: src/stored/btape.c:1523 -#, c-format -msgid "3992 result=\"%s\": ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1533 -#, c-format -msgid "3303 Issuing autochanger \"load %d %d\" command.\n" -msgstr "" - -#: src/stored/btape.c:1541 -#, c-format -msgid "3303 Autochanger \"load %d %d\" status is OK.\n" -msgstr "" - -#: src/stored/btape.c:1545 -#, c-format -msgid "3993 Bad autochanger command: %s\n" -msgstr "" - -#: src/stored/btape.c:1546 -#, c-format -msgid "3993 result=\"%s\": ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1561 -msgid "" -"\n" -"The test failed, probably because you need to put\n" -"a longer sleep time in the mtx-script in the load) case.\n" -"Adding a 30 second sleep and trying again ...\n" -msgstr "" - -#: src/stored/btape.c:1574 -#, c-format -msgid "Wrote EOF to %s\n" -msgstr "" - -#: src/stored/btape.c:1578 -#, c-format -msgid "" -"\n" -"The test worked this time. Please add:\n" -"\n" -" sleep %d\n" -"\n" -"to your mtx-changer script in the load) case.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1583 -msgid "" -"\n" -"The test autochanger worked!!\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1594 -msgid "You must correct this error or the Autochanger will not work.\n" -msgstr "" - -#: src/stored/btape.c:1612 -msgid "" -"\n" -"\n" -"=== Forward space files test ===\n" -"\n" -"This test is essential to Bacula.\n" -"\n" -"I'm going to write five files then test forward spacing\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1637 -msgid "Now forward spacing 1 file.\n" -msgstr "" - -#: src/stored/btape.c:1639 src/stored/btape.c:1651 src/stored/btape.c:1664 -#: src/stored/btape.c:1682 src/stored/btape.c:1858 -#, c-format -msgid "Bad status from fsr. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1642 -#, c-format -msgid "We should be in file 1. I am at file %d. %s\n" -msgstr "" - -#: src/stored/btape.c:1649 -msgid "Now forward spacing 2 files.\n" -msgstr "" - -#: src/stored/btape.c:1662 -msgid "Now forward spacing 4 files.\n" -msgstr "" - -#: src/stored/btape.c:1674 -msgid "" -"The test worked this time. Please add:\n" -"\n" -" Fast Forward Space File = no\n" -"\n" -"to your Device resource for this drive.\n" -msgstr "" - -#: src/stored/btape.c:1680 -msgid "Now forward spacing 1 more file.\n" -msgstr "" - -#: src/stored/btape.c:1684 -#, c-format -msgid "We should be in file 5. I am at file %d. %s\n" -msgstr "" - -#: src/stored/btape.c:1689 -msgid "" -"\n" -"=== End Forward space files test ===\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1693 -msgid "" -"\n" -"The forward space file test failed.\n" -msgstr "" - -#: src/stored/btape.c:1695 -msgid "" -"You have Fast Forward Space File enabled.\n" -"I am turning it off then retrying the test.\n" -msgstr "" - -#: src/stored/btape.c:1701 -msgid "" -"You must correct this error or Bacula will not work.\n" -"Some systems, e.g. OpenBSD, require you to set\n" -" Use MTIOCGET= no\n" -"in your device resource. Use with caution.\n" -msgstr "" - -#: src/stored/btape.c:1735 -msgid "" -"\n" -"Append test failed. Attempting again.\n" -"Setting \"Hardware End of Medium = no\n" -" and \"Fast Forward Space File = no\n" -"and retrying append test.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1743 -msgid "" -"\n" -"\n" -"It looks like the test worked this time, please add:\n" -"\n" -" Hardware End of Medium = No\n" -"\n" -" Fast Forward Space File = No\n" -"to your Device resource in the Storage conf file.\n" -msgstr "" - -#: src/stored/btape.c:1750 -msgid "" -"\n" -"\n" -"That appears *NOT* to have corrected the problem.\n" -msgstr "" - -#: src/stored/btape.c:1755 -msgid "" -"\n" -"\n" -"It looks like the append failed. Attempting again.\n" -"Setting \"BSF at EOM = yes\" and retrying append test.\n" -msgstr "" - -#: src/stored/btape.c:1760 -msgid "" -"\n" -"\n" -"It looks like the test worked this time, please add:\n" -"\n" -" Hardware End of Medium = No\n" -" Fast Forward Space File = No\n" -" BSF at EOM = yes\n" -"\n" -"to your Device resource in the Storage conf file.\n" -msgstr "" - -#: src/stored/btape.c:1771 -msgid "" -"\n" -"Append test failed.\n" -"\n" -"\n" -"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" -"Unable to correct the problem. You MUST fix this\n" -"problem before Bacula can use your tape drive correctly\n" -"\n" -"Perhaps running Bacula in fixed block mode will work.\n" -"Do so by setting:\n" -"\n" -"Minimum Block Size = nnn\n" -"Maximum Block Size = nnn\n" -"\n" -"in your Storage daemon's Device definition.\n" -"nnn must match your tape driver's block size, which\n" -"can be determined by reading your tape manufacturers\n" -"information, and the information on your kernel dirver.\n" -"Fixed block sizes, however, are not normally an ideal solution.\n" -"\n" -"Some systems, e.g. OpenBSD, require you to set\n" -" Use MTIOCGET= no\n" -"in your device resource. Use with caution.\n" -msgstr "" - -#: src/stored/btape.c:1793 -msgid "" -"\n" -"The above Bacula scan should have output identical to what follows.\n" -"Please double check it ...\n" -"=== Sample correct output ===\n" -"1 block of 64448 bytes in file 1\n" -"End of File mark.\n" -"2 blocks of 64448 bytes in file 2\n" -"End of File mark.\n" -"3 blocks of 64448 bytes in file 3\n" -"End of File mark.\n" -"1 block of 64448 bytes in file 4\n" -"End of File mark.\n" -"Total files=4, blocks=7, bytes = 451,136\n" -"=== End sample correct output ===\n" -"\n" -"If the above scan output is not identical to the\n" -"sample output, you MUST correct the problem\n" -"or Bacula will not be able to write multiple Jobs to \n" -"the tape.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1836 -#, c-format -msgid "Bad status from fsf. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1840 -msgid "Forward spaced 1 file.\n" -msgstr "" - -#: src/stored/btape.c:1843 -#, c-format -msgid "Forward spaced %d files.\n" -msgstr "" - -#: src/stored/btape.c:1862 -msgid "Forward spaced 1 record.\n" -msgstr "" - -#: src/stored/btape.c:1865 -#, c-format -msgid "Forward spaced %d records.\n" -msgstr "" - -#: src/stored/btape.c:1910 -#, c-format -msgid "Wrote one record of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:1912 -msgid "Wrote block to device.\n" -msgstr "" - -#: src/stored/btape.c:1926 -msgid "Enter length to read: " -msgstr "" - -#: src/stored/btape.c:1931 -msgid "Bad length entered, using default of 1024 bytes.\n" -msgstr "" - -#: src/stored/btape.c:1940 -#, c-format -msgid "Read of %d bytes gives stat=%d. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1963 src/stored/btape.c:2012 -#, c-format -msgid "End of tape\n" -msgstr "" - -#: src/stored/btape.c:1968 -#, c-format -msgid "Starting scan at file %u\n" -msgstr "" - -#: src/stored/btape.c:1973 src/stored/tape_dev.c:614 -#, c-format -msgid "read error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/btape.c:1975 -#, c-format -msgid "Bad status from read %d. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1978 src/stored/btape.c:1992 src/stored/btape.c:2056 -#: src/stored/btape.c:2068 src/stored/btape.c:2081 src/stored/btape.c:2097 -#, c-format -msgid "1 block of %d bytes in file %d\n" -msgstr "" - -#: src/stored/btape.c:1981 src/stored/btape.c:1995 src/stored/btape.c:2059 -#: src/stored/btape.c:2071 src/stored/btape.c:2084 src/stored/btape.c:2100 -#, c-format -msgid "%d blocks of %d bytes in file %d\n" -msgstr "" - -#: src/stored/btape.c:2003 src/stored/btape.c:2075 -#, c-format -msgid "End of File mark.\n" -msgstr "" - -#: src/stored/btape.c:2024 src/stored/btape.c:2128 -#, c-format -msgid "Total files=%d, blocks=%d, bytes = %s\n" -msgstr "" - -#: src/stored/btape.c:2088 -#, c-format -msgid "Short block read.\n" -msgstr "" - -#: src/stored/btape.c:2091 -#, c-format -msgid "Error reading block. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2115 -#, c-format -msgid "" -"Block=%u file,blk=%u,%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%s " -"rlen=%d\n" -msgstr "" - -#: src/stored/btape.c:2137 -#, c-format -msgid "Device status: %u. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2169 -#, fuzzy, c-format -msgid "" -"\n" -"This command simulates Bacula writing to a tape.\n" -"It requires either one or two blank tapes, which it\n" -"will label and write.\n" -"\n" -"If you have an autochanger configured, it will use\n" -"the tapes that are in slots 1 and 2, otherwise, you will\n" -"be prompted to insert the tapes when necessary.\n" -"\n" -"It will print a status approximately\n" -"every 322 MB, and write an EOF every %s. If you have\n" -"selected the simple test option, after writing the first tape\n" -"it will rewind it and re-read the last block written.\n" -"\n" -"If you have selected the multiple tape test, when the first tape\n" -"fills, it will ask for a second, and after writing a few more \n" -"blocks, it will stop. Then it will begin re-reading the\n" -"two tapes.\n" -"\n" -"This may take a long time -- hours! ...\n" -"\n" -msgstr "" -"\n" -"Cette commande simule l'écriture d'une bande par Bacula.\n" -"Ce test requiert une ou deux bandes vierges qui vont être\n" -"labélisées et écrites.\n" -"\n" -"Si vous avez configuré un autochangeur, il utilisera les bandes\n" -"des slots 1 et 2, sinon, le programme vous demandera d'insérer\n" -"les bandes quand cela sera nécessaire.\n" -"\n" -"L'état d'avancement sera affiché tous les 322 Mo, et un EOF sera \n" -"écrit tous les 3,2 Go. Si vous avez choisi le test simple, après avoir\n" -"rempli la bande, elle sera rembobinée et le dernier bloc écrit sera\n" -"relu.\n" -"\n" -"Si vous avez choisi le test multi-bande, quand la première bande sera\n" -"remplie vous devrez insérer la nouvelle et après l'écriture de quelques\n" -"blocs les deux bandes seront relues.\n" -"\n" -"Ce test peut durer longtemps (voir des heures).\n" - -#: src/stored/btape.c:2187 -msgid "" -"Do you want to run the simplified test (s) with one tape\n" -"or the complete multiple tape (m) test: (s/m) " -msgstr "" -"Voulez vous lancer le test simplifié (s) utilisant une seule bande\n" -"ou bien le test multi-bande complet (m) : (s/m) " - -#: src/stored/btape.c:2190 -msgid "Simple test (single tape) selected.\n" -msgstr "Sélection du test simplifié (utilisant une seule bande).\n" - -#: src/stored/btape.c:2193 -msgid "Multiple tape test selected.\n" -msgstr "Sélection du test multiple.\n" - -#: src/stored/btape.c:2235 -msgid "Wrote Start of Session label.\n" -msgstr "Ecriture du label de début de session.\n" - -#: src/stored/btape.c:2254 -#, c-format -msgid "%s Begin writing Bacula records to tape ...\n" -msgstr "" - -#: src/stored/btape.c:2256 -#, c-format -msgid "%s Begin writing Bacula records to first tape ...\n" -msgstr "" - -#: src/stored/btape.c:2282 -#, fuzzy -msgid "Flush block failed.\n" -msgstr "Flush de %s blocs, écriture de EOF\n" - -#: src/stored/btape.c:2296 -#, fuzzy, c-format -msgid "Wrote block=%u, file,blk=%u,%u VolBytes=%s rate=%sB/s\n" -msgstr "Ecriture blk_block=%u, dev_blk_num=%u VolBytes=%s rate=%.1f KB/s\n" - -#: src/stored/btape.c:2307 -#, c-format -msgid "%s Flush block, write EOF\n" -msgstr "Flush de %s blocs, écriture de EOF\n" - -#: src/stored/btape.c:2316 -#, fuzzy -msgid "Wrote 1000 blocks on second tape. Done.\n" -msgstr "Ecriture de 1000 blocs de %d octets.\n" - -#: src/stored/btape.c:2321 -msgid "Not OK\n" -msgstr "" - -#: src/stored/btape.c:2345 -#, fuzzy -msgid "Job canceled.\n" -msgstr "Le job %s est annulé.\n" - -#: src/stored/btape.c:2356 -msgid "Set ok=false after write_block_to_device.\n" -msgstr "" - -#: src/stored/btape.c:2360 -msgid "Wrote End of Session label.\n" -msgstr "Ecriture du label de fin de session.\n" - -#: src/stored/btape.c:2384 -#, c-format -msgid "Wrote state file last_block_num1=%d last_block_num2=%d\n" -msgstr "Ecriture du fichier d'état last_block_num1=%d last_block_num2=%d\n" - -#: src/stored/btape.c:2388 -#, c-format -msgid "Could not create state file: %s ERR=%s\n" -msgstr "Impossible de créer le fichier d'état : %s ERR=%s\n" - -#: src/stored/btape.c:2399 -#, c-format -msgid "" -"\n" -"\n" -"%s Done filling tape at %d:%d. Now beginning re-read of tape ...\n" -msgstr "" - -#: src/stored/btape.c:2402 -#, c-format -msgid "" -"\n" -"\n" -"%s Done filling tapes at %d:%d. Now beginning re-read of first tape ...\n" -msgstr "" - -#: src/stored/btape.c:2408 -#, fuzzy -msgid "do_unfill failed.\n" -msgstr "Job échoué.\n" - -#: src/stored/btape.c:2413 -#, fuzzy, c-format -msgid "%s: Error during test.\n" -msgstr "Erreur pendant l'envoi de la liste d'inclusion.\n" - -#: src/stored/btape.c:2448 -msgid "" -"\n" -"The state file level has changed. You must redo\n" -"the fill command.\n" -msgstr "" - -#: src/stored/btape.c:2455 -#, c-format -msgid "" -"\n" -"Could not find the state file: %s ERR=%s\n" -"You must redo the fill command.\n" -msgstr "" -"\n" -"Impossible de trouver le fichier d'état : %s ERR=%s\n" -"Vous devez relancer la commande \"fill\".\n" - -#: src/stored/btape.c:2521 -msgid "Mount first tape. Press enter when ready: " -msgstr "Chargez la première bande et appuyez sur \"Entrée\" : " - -#: src/stored/btape.c:2538 -msgid "Rewinding.\n" -msgstr "Rembobinage.\n" - -#: src/stored/btape.c:2543 -#, c-format -msgid "Reading the first 10000 records from %u:%u.\n" -msgstr "Lecture des 10000 premiers enregistrements depuis %u:%u.\n" - -#: src/stored/btape.c:2547 src/stored/btape.c:2616 -#, c-format -msgid "Reposition from %u:%u to %u:%u\n" -msgstr "Re-positionnement de %u:%u à %u:%u\n" - -#: src/stored/btape.c:2550 src/stored/btape.c:2603 src/stored/btape.c:2619 -#, c-format -msgid "Reposition error. ERR=%s\n" -msgstr "Erreur pendant le re-positionnement. ERR=%s\n" - -#: src/stored/btape.c:2553 -#, c-format -msgid "Reading block %u.\n" -msgstr "Lecture du bloc %u.\n" - -#: src/stored/btape.c:2555 src/stored/btape.c:2608 src/stored/btape.c:2624 -#, c-format -msgid "Error reading block: ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2560 -msgid "" -"\n" -"The last block on the tape matches. Test succeeded.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2563 -msgid "" -"\n" -"The last block of the first tape matches.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2587 -msgid "Mount second tape. Press enter when ready: " -msgstr "Chargez une deuxième bande et appuyez sur \"Entrée\" : " - -#: src/stored/btape.c:2601 -#, c-format -msgid "Reposition from %u:%u to 0:1\n" -msgstr "Re-positionnement de %u:%u à 0:1\n" - -#: src/stored/btape.c:2606 src/stored/btape.c:2622 -#, c-format -msgid "Reading block %d.\n" -msgstr "Lecture du bloc %d.\n" - -#: src/stored/btape.c:2612 -msgid "" -"\n" -"The first block on the second tape matches.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2628 -msgid "" -"\n" -"The last block on the second tape matches. Test succeeded.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2646 -#, c-format -msgid "10000 records read now at %d:%d\n" -msgstr "10000 enregistrements lus maintenant à %d:%d\n" - -#: src/stored/btape.c:2672 src/stored/btape.c:2683 src/stored/btape.c:2728 -msgid "Last block written" -msgstr "Dernier bloc écrit" - -#: src/stored/btape.c:2674 src/stored/btape.c:2684 -msgid "Block read back" -msgstr "" - -#: src/stored/btape.c:2675 -#, c-format -msgid "" -"\n" -"\n" -"The blocks differ at byte %u\n" -msgstr "" - -#: src/stored/btape.c:2676 -msgid "" -"\n" -"\n" -"!!!! The last block written and the block\n" -"that was read back differ. The test FAILED !!!!\n" -"This must be corrected before you use Bacula\n" -"to write multi-tape Volumes.!!!!\n" -msgstr "" - -#: src/stored/btape.c:2712 -#, c-format -msgid "Last block at: %u:%u this_dev_block_num=%d\n" -msgstr "" - -#: src/stored/btape.c:2726 -#, c-format -msgid "Block not written: FileIndex=%u blk_block=%u Size=%u\n" -msgstr "" - -#: src/stored/btape.c:2730 -msgid "Block not written" -msgstr "Bloc non écrit" - -#: src/stored/btape.c:2745 -#, fuzzy, c-format -msgid "End of tape %d:%d. Volume Bytes=%s. Write rate = %sB/s\n" -msgstr "Fin de média sur le Volume \"%s\" Octets=%s Blocs=%s à %s.\n" - -#: src/stored/btape.c:2796 -msgid "Test writing blocks of 64512 bytes to tape.\n" -msgstr "" - -#: src/stored/btape.c:2798 -msgid "How many blocks do you want to write? (1000): " -msgstr "" - -#: src/stored/btape.c:2815 -#, c-format -msgid "Begin writing %d Bacula blocks to tape ...\n" -msgstr "" - -#: src/stored/btape.c:2858 -#, c-format -msgid "Begin writing raw blocks of %u bytes.\n" -msgstr "" - -#: src/stored/btape.c:2889 -msgid "test autochanger" -msgstr "" - -#: src/stored/btape.c:2890 -msgid "backspace file" -msgstr "" - -#: src/stored/btape.c:2891 -msgid "backspace record" -msgstr "" - -#: src/stored/btape.c:2892 -msgid "list device capabilities" -msgstr "" - -#: src/stored/btape.c:2893 -msgid "clear tape errors" -msgstr "" - -#: src/stored/btape.c:2894 -msgid "go to end of Bacula data for append" -msgstr "" - -#: src/stored/btape.c:2895 -msgid "go to the physical end of medium" -msgstr "" - -#: src/stored/btape.c:2896 -msgid "fill tape, write onto second volume" -msgstr "" - -#: src/stored/btape.c:2897 -msgid "read filled tape" -msgstr "" - -#: src/stored/btape.c:2898 -msgid "forward space a file" -msgstr "" - -#: src/stored/btape.c:2899 -msgid "forward space a record" -msgstr "" - -#: src/stored/btape.c:2900 -msgid "print this command" -msgstr "affiche cette commande" - -#: src/stored/btape.c:2901 -msgid "write a Bacula label to the tape" -msgstr "" - -#: src/stored/btape.c:2902 -msgid "load a tape" -msgstr "" - -#: src/stored/btape.c:2903 -msgid "quit btape" -msgstr "" - -#: src/stored/btape.c:2904 -msgid "use write() to fill tape" -msgstr "" - -#: src/stored/btape.c:2905 -msgid "read and print the Bacula tape label" -msgstr "" - -#: src/stored/btape.c:2906 -msgid "test record handling functions" -msgstr "" - -#: src/stored/btape.c:2907 -msgid "rewind the tape" -msgstr "rembobine la bande" - -#: src/stored/btape.c:2908 -msgid "read() tape block by block to EOT and report" -msgstr "" - -#: src/stored/btape.c:2909 -msgid "Bacula read block by block to EOT and report" -msgstr "Bacula lit bloc par bloc jusqu'à la fin de la bande (EOT) et résume" - -#: src/stored/btape.c:2910 -msgid "" -"[file_size=n(GB)|nb_file=3|skip_zero|skip_random|skip_raw|skip_block] report " -"drive speed" -msgstr "" - -#: src/stored/btape.c:2911 -msgid "print tape status" -msgstr "" - -#: src/stored/btape.c:2912 -msgid "General test Bacula tape functions" -msgstr "test général des fonctions Bacula sur un lecteur de bande" - -#: src/stored/btape.c:2913 -msgid "write an EOF on the tape" -msgstr "écrit un EOF sur la bande" - -#: src/stored/btape.c:2914 -msgid "write a single Bacula block" -msgstr "écrit un seul bloc bacula" - -#: src/stored/btape.c:2915 -msgid "read a single record" -msgstr "lit un seul enregistrement" - -#: src/stored/btape.c:2916 -msgid "read a single Bacula block" -msgstr "lit un seul bloc bacula" - -#: src/stored/btape.c:2917 -msgid "quick fill command" -msgstr "" - -#: src/stored/btape.c:2938 -#, c-format -msgid "\"%s\" is an invalid command\n" -msgstr "\"%s\" est une commande invalide.\n" - -#: src/stored/btape.c:2947 -#, c-format -msgid "Interactive commands:\n" -msgstr "" - -#: src/stored/btape.c:2958 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: btape \n" -" -b specify bootstrap file\n" -" -c set configuration file to file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -p proceed inspite of I/O errors\n" -" -s turn off signals\n" -" -v be verbose\n" -" -? print this message.\n" -"\n" -msgstr "" -") %s %s %s\n" -"\n" -"Usage : bconsole [-s] [-c config_file] [-d niveau_debug]\n" -" -c set configuration file to file\n" -" -dnn set debug level to nn\n" -" -s no signals\n" -" -t test - lecture de la configuration et sortie\n" -"\n" - -#: src/stored/btape.c:3046 -#, c-format -msgid "Mount second Volume on device %s and press return when ready: " -msgstr "" - -#: src/stored/btape.c:3074 -#, c-format -msgid "Mount blank Volume on device %s and press return when ready: " -msgstr "" - -#: src/stored/btape.c:3094 -#, fuzzy, c-format -msgid "End of Volume \"%s\" %d records.\n" -msgstr "Le volume \"%s\" existe déjà en base.\n" - -#: src/stored/btape.c:3108 -#, fuzzy, c-format -msgid "Read block=%u, VolBytes=%s rate=%sB/s\n" -msgstr "Ecriture blk_block=%u, dev_blk_num=%u VolBytes=%s rate=%.1f KB/s\n" - -#: src/stored/btape.c:3121 -#, c-format -msgid "Cannot open Dev=%s, Vol=%s\n" -msgstr "" - -#: src/stored/butil.c:48 -msgid "Nohdr," -msgstr "" - -#: src/stored/butil.c:51 -msgid "partial," -msgstr "" - -#: src/stored/butil.c:54 -msgid "empty," -msgstr "" - -#: src/stored/butil.c:57 -msgid "Nomatch," -msgstr "" - -#: src/stored/butil.c:60 -msgid "cont," -msgstr "" - -#: src/stored/butil.c:150 -msgid "Volume name or names is too long. Please use a .bsr file.\n" -msgstr "" - -#: src/stored/butil.c:170 -#, c-format -msgid "Cannot find device \"%s\" in config file %s.\n" -msgstr "" - -#: src/stored/butil.c:177 -#, c-format -msgid "Cannot init device %s\n" -msgstr "" - -#: src/stored/butil.c:203 -#, c-format -msgid "Cannot open %s\n" -msgstr "" - -#: src/stored/butil.c:290 -#, c-format -msgid "Could not find device \"%s\" in config file %s.\n" -msgstr "" - -#: src/stored/butil.c:295 -#, c-format -msgid "Using device: \"%s\" for writing.\n" -msgstr "" - -#: src/stored/butil.c:297 -#, c-format -msgid "Using device: \"%s\" for reading.\n" -msgstr "" - -#: src/stored/butil.c:313 -msgid "Unexpected End of Data\n" -msgstr "" - -#: src/stored/butil.c:315 -msgid "Unexpected End of Tape\n" -msgstr "" - -#: src/stored/butil.c:317 -msgid "Unexpected End of File\n" -msgstr "" - -#: src/stored/butil.c:319 -msgid "Tape Door is Open\n" -msgstr "" - -#: src/stored/butil.c:321 -msgid "Unexpected Tape is Off-line\n" -msgstr "" - -#: src/stored/dde_status.c:149 -#, fuzzy -msgid "Dedupengine status:\n" -msgstr "" -"\n" -"Statut du Device :\n" - -#: src/stored/dde_status.c:159 -#, c-format -msgid "" -" DDE: hash_count=%llu ref_count=%llu ref_size=%sB\n" -" ref_ratio=%.2f size_ratio=%.2f dde_errors=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:167 -#, c-format -msgid "" -" Config: bnum=%lld bmin=%lld bmax=%lld mlock_strategy=%ld mlocked=%lldMB " -"mlock_max=%lldMB\n" -msgstr "" - -#: src/stored/dde_status.c:173 -#, c-format -msgid " Addr: bad_addr=%llu bad_bucket=%llu wrong=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:178 -#, c-format -msgid "" -" Containers: chunk_allocated=%llu chunk_used=%llu\n" -" disk_space_allocated=%sB disk_space_used=%sB containers_errors=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:199 -#, c-format -msgid "" -" Vacuum: last_run=\"%s\" duration=%llus ref_count=%llu ref_size=%sB\n" -" vacuum_errors=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:205 -#, c-format -msgid " Stats: read_chunk=%llu query_hash=%llu new_hash=%llu calc_hash=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:213 -#, c-format -msgid " acc_container_cnt[%d]:%s %14llu\n" -msgstr "" - -#: src/stored/dde_status.c:226 -#, c-format -msgid " [%d]%s filesize=%sB/%sB usage=%llu/%llu/%llu %3llu%% %s\n" -msgstr "" - -#: src/stored/dde_status.c:239 -#, c-format -msgid " [%d]%s filesize=%sB/%sB usage=%llu/%llu/%llu %3llu%%\n" -msgstr "" - -#: src/stored/dde_vacuum.c:84 -#, c-format -msgid "" -"Skipping volume \"%s\" from vacuum process, the volume is only created in " -"the catalog.\n" -msgstr "" - -#: src/stored/dde_vacuum.c:91 -#, c-format -msgid "" -"Error: Volume \"%s\" (status %s) not found in %s. All volumes should be " -"available for a Vacuum. ERR=%s\n" -msgstr "" - -#: src/stored/dedupengine.c:384 -msgid "Initializing DDE." -msgstr "" - -#: src/stored/dedupengine.c:392 -msgid "DedupDirectory directive in Storage resource missing." -msgstr "" - -#: src/stored/dedupengine.c:399 -#, fuzzy, c-format -msgid "Cannot create DedupDirectory: %s" -msgstr "change le répertoire courant" - -#: src/stored/dedupengine.c:405 -#, fuzzy, c-format -msgid "Cannot create DedupIndexDirectory: %s" -msgstr "change le répertoire courant" - -#: src/stored/dedupengine.c:414 src/stored/dedupengine.c:421 -#, fuzzy, c-format -msgid "Cannot create recovery directory: %s" -msgstr "change le répertoire courant" - -#: src/stored/dedupengine.c:428 -#, fuzzy, c-format -msgid "Cannot delete temporary recovery directory: %s" -msgstr "change le répertoire courant" - -#: src/stored/dedupengine.c:1246 -#, c-format -msgid "bucket version (%ld) is posterior to the software (%ld)\n" -msgstr "" - -#: src/stored/dedupengine.c:1772 -#, c-format -msgid "" -"The Deduplication Engine filesystem \"%s\" is full (only %sB free). Running " -"jobs will be stopped and marked as Incomplete. Extend the storage space and " -"run the vacuum procedure\n" -msgstr "" - -#: src/stored/dedupengine.c:1782 -#, c-format -msgid "" -"The Deduplication Engine filesystem \"%s\" is nearly full (%sB free). Please " -"run the vacuum procedure\n" -msgstr "" - -#: src/stored/dedupengine.c:1965 -msgid "Header not found in DDE index\n" -msgstr "" - -#: src/stored/dedupengine.c:1971 -msgid "DDE index bad magic in header\n" -msgstr "" - -#: src/stored/dedupengine.c:1976 -#, c-format -msgid "" -"Cannot open DDE because the version (%ld) is posterior to the software " -"(%ld)\n" -msgstr "" - -#: src/stored/dedupengine.c:1996 -#, c-format -msgid "Cannot open DDE, unknown hash ID: %ld\n" -msgstr "" - -#: src/stored/dedupstored.c:99 -#, c-format -msgid "Transport thread error: joining thread (%d)\n" -msgstr "" - -#: src/stored/dedupstored.c:208 -#, fuzzy, c-format -msgid "Socket error or stop during rehydration. ERR=%d\n" -msgstr "Erreur de socket sur la commande %s : ERR=%s\n" - -#: src/stored/dedupstored.c:226 -#, fuzzy, c-format -msgid "Unexpected message from FD, n=%d msglen=%d msg=%s\n" -msgstr "" -"Erreur pendant l'écriture des données vers le fichier de spool. ERR=%s\n" - -#: src/stored/dedupstored.c:415 -#, c-format -msgid "BAD HASH: computed=#%08x expected=#%08x size=%d\n" -msgstr "" - -#: src/stored/dedupstored.c:521 -#, c-format -msgid "GOT chunk #%08x, now do a CANCEL\n" -msgstr "" - -#: src/stored/dedupstored.c:528 -#, c-format -msgid "Received unexpected chunk #%08x\n" -msgstr "" - -#: src/stored/dedupstored.c:535 -#, c-format -msgid "Cannot lz4decode received chunk #%08x\n" -msgstr "" - -#: src/stored/dedupstored.c:541 -#, c-format -msgid "Received chunk #%08x with the wrong size %d (expected %ld) \n" -msgstr "" - -#: src/stored/dedupstored.c:550 -#, c-format -msgid "Received a chunk with a bad hash #%08x (expected #%08x) size=%d\n" -msgstr "" - -#: src/stored/dedupstored.c:585 -msgid "Ignore dedup flow control protocol error\n" -msgstr "" - -#: src/stored/dedupstored.c:599 -#, c-format -msgid "Ignore unknown inter-daemon command: %ld\n" -msgstr "" - -#: src/stored/dedupstored.c:678 -msgid "Got Dedup data but dedupengine is not started\n" -msgstr "" - -#: src/stored/dedupstored.c:718 -#, fuzzy -msgid "Error sending chunk request to client\n" -msgstr "Erreur pendant lors de la récupération du pool. ERR=%s\n" - -#: src/stored/dev.c:146 -#, c-format -msgid "Unable to stat device %s: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:164 -#, c-format -msgid "" -"%s is an unknown device type. Must be tape or directory\n" -" or have RequiresMount=yes for DVD. st_mode=%x\n" -msgstr "" - -#: src/stored/dev.c:177 -msgid "DVD support is now deprecated.\n" -msgstr "" - -#: src/stored/dev.c:180 -msgid "Aligned device not supported. Please use \"DeviceType = File\"\n" -msgstr "" - -#: src/stored/dev.c:183 -msgid "Deduplication device not supported. Please use \"DeviceType = File\"\n" -msgstr "" - -#: src/stored/dev.c:212 -msgid "Deduplication device not properly configured.\n" -msgstr "" - -#: src/stored/dev.c:303 -#, c-format -msgid "Using default block size %u on dedup device %s\n" -msgstr "" - -#: src/stored/dev.c:341 -#, c-format -msgid "Unable to stat mount point %s: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:346 -msgid "" -"Mount and unmount commands must defined for a device which requires mount.\n" -msgstr "" - -#: src/stored/dev.c:362 -#, c-format -msgid "Min block size > max on device %s\n" -msgstr "" - -#: src/stored/dev.c:366 -#, c-format -msgid "Block size %u on device %s is too large, using default %u\n" -msgstr "" -"La taille de bloc %u sur le Device %s est trop grande, utilisation de la " -"valeur par défaut %u\n" - -#: src/stored/dev.c:371 -#, fuzzy, c-format -msgid "Max block size %u not multiple of device %s block size=%d.\n" -msgstr "" -"La taille du buffer réseau %d n'est pas un multiple de la taille de bloc du " -"lecteur.\n" - -#: src/stored/dev.c:375 -#, c-format -msgid "Max Vol Size < 8 * Max Block Size for device %s\n" -msgstr "" - -#: src/stored/dev.c:391 src/stored/dev.c:397 -#, c-format -msgid "Unable to init cond variable: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:403 -#, fuzzy, c-format -msgid "Unable to init spool mutex: ERR=%s\n" -msgstr "Impossible d'initialiser le muxtex : ERR=%s\n" - -#: src/stored/dev.c:409 -#, fuzzy, c-format -msgid "Unable to init acquire mutex: ERR=%s\n" -msgstr "Impossible d'initialiser le muxtex : ERR=%s\n" - -#: src/stored/dev.c:415 -#, fuzzy, c-format -msgid "Unable to init read acquire mutex: ERR=%s\n" -msgstr "Impossible d'initialiser le muxtex : ERR=%s\n" - -#: src/stored/dev.c:421 -#, fuzzy, c-format -msgid "Unable to init adata mutex: ERR=%s\n" -msgstr "Impossible d'initialiser le muxtex : ERR=%s\n" - -#: src/stored/dev.c:427 -#, fuzzy, c-format -msgid "Unable to init volcat mutex: ERR=%s\n" -msgstr "Impossible d'initialiser le muxtex : ERR=%s\n" - -#: src/stored/dev.c:433 -#, fuzzy, c-format -msgid "Unable to init dcrs mutex: ERR=%s\n" -msgstr "Impossible d'initialiser le muxtex : ERR=%s\n" - -#: src/stored/dev.c:523 -msgid "Illegal mode given to open dev.\n" -msgstr "" - -#: src/stored/dev.c:575 -msgid "Bad device call. Device not open\n" -msgstr "" - -#: src/stored/dev.c:587 -#, c-format -msgid "Seek error: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:588 src/stored/file_dev.c:78 src/stored/file_dev.c:105 -#: src/stored/tape_dev.c:294 -#, c-format -msgid "lseek error on %s. ERR=%s.\n" -msgstr "erreur de déplacement (lseek) sur %s : ERR=%s\n" - -#: src/stored/device.c:126 -#, c-format -msgid "End of medium on Volume \"%s\" Bytes=%s Blocks=%s at %s.\n" -msgstr "Fin de média sur le Volume \"%s\" Octets=%s Blocs=%s à %s.\n" - -#: src/stored/device.c:157 -#, c-format -msgid "New volume \"%s\" mounted on device %s at %s.\n" -msgstr "Nouveau volume \"%s\" monté sur le device %s à %s.\n" - -#: src/stored/device.c:169 -#, c-format -msgid "write_block_to_device Volume label failed. ERR=%s" -msgstr "" - -#: src/stored/device.c:201 -#, c-format -msgid "write_block_to_device overflow block failed. ERR=%s" -msgstr "" - -#: src/stored/device.c:206 -#, c-format -msgid "Catastrophic error. Cannot write overflow block to device %s. ERR=%s" -msgstr "" - -#: src/stored/device.c:367 src/stored/tape_dev.c:161 -#, c-format -msgid "Unable to open device %s: ERR=%s\n" -msgstr "" - -#: src/stored/device.c:369 -#, c-format -msgid "Unable to open archive %s: ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:164 -#, fuzzy, c-format -msgid "Connection request from %s failed.\n" -msgstr "Demande de connexion échouée.\n" - -#: src/stored/dircmd.c:202 -msgid "Unable to authenticate Director\n" -msgstr "" - -#: src/stored/dircmd.c:296 -#, fuzzy, c-format -msgid "Bad client command: %s" -msgstr "Erreur dans la commande RunScript : %s\n" - -#: src/stored/dircmd.c:306 -#, fuzzy -msgid "Client daemon" -msgstr "Director" - -#: src/stored/dircmd.c:309 -#, fuzzy, c-format -msgid "Failed to connect to Client daemon: %s:%d\n" -msgstr "Impossible de se connecter au client.\n" - -#: src/stored/dircmd.c:387 -msgid "In storage_cmd port==0, no prior Storage connection.\n" -msgstr "" - -#: src/stored/dircmd.c:439 -#, c-format -msgid "3991 Bad setdebug command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:484 -#, fuzzy -msgid "3000 Deduplication vacuum marked to be canceled.\n" -msgstr "3000 Job %s marqué pour être annulé.\n" - -#: src/stored/dircmd.c:486 -msgid "3900 No deduplication vacuum process found.\n" -msgstr "" - -#: src/stored/dircmd.c:490 -msgid "3903 Error scanning cancel command.\n" -msgstr "" - -#: src/stored/dircmd.c:494 -#, c-format -msgid "3904 Job %s not found.\n" -msgstr "3904 Job %s non trouvé.\n" - -#: src/stored/dircmd.c:523 -#, fuzzy, c-format -msgid "3000 JobId=%ld Job=\"%s\" marked to be %s.\n" -msgstr "JobId %s, Job %s marqué pour être annulé.\n" - -#: src/stored/dircmd.c:602 src/stored/dircmd.c:1003 src/stored/dircmd.c:1163 -#: src/stored/dircmd.c:1274 src/stored/dircmd.c:1396 src/stored/dircmd.c:1438 -#, c-format -msgid "3999 Device \"%s\" not found or could not be opened.\n" -msgstr "" - -#: src/stored/dircmd.c:607 -#, c-format -msgid "3903 Error scanning label command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:659 -#, fuzzy, c-format -msgid "3910 Unable to open device \"%s\": ERR=%s\n" -msgstr "3910 Impossible d'ouvrir le device %s : ERR=%s\n" - -#: src/stored/dircmd.c:676 -#, c-format -msgid "3920 Cannot label Volume because it is already labeled: \"%s\"\n" -msgstr "" -"3920 Impossible de labéliser le Volume car il possède déjà le label : \"%s" -"\"\n" - -#: src/stored/dircmd.c:683 -msgid "3921 Wrong volume mounted.\n" -msgstr "3921 Mauvais volume monté.\n" - -#: src/stored/dircmd.c:687 -msgid "3922 Cannot relabel an ANSI/IBM labeled Volume.\n" -msgstr "3922 Impossible de re-labéliser un Volume ANSI/IBM.\n" - -#: src/stored/dircmd.c:695 -#, c-format -msgid "3912 Failed to label Volume: ERR=%s\n" -msgstr "3912 Impossible de labéliser le Volume : ERR=%s\n" - -#: src/stored/dircmd.c:711 -#, fuzzy, c-format -msgid "3915 Failed to label Volume: ERR=%s\n" -msgstr "3912 Impossible de labéliser le Volume : ERR=%s\n" - -#: src/stored/dircmd.c:714 -#, fuzzy, c-format -msgid "3914 Failed to label Volume (no media): ERR=%s\n" -msgstr "3912 Impossible de labéliser le Volume : ERR=%s\n" - -#: src/stored/dircmd.c:717 -#, c-format -msgid "3913 Cannot label Volume. Unknown status %d from read_volume_label()\n" -msgstr "" - -#: src/stored/dircmd.c:755 -#, c-format -msgid "3001 Mounted Volume: %s\n" -msgstr "3001 Volume monté : %s\n" - -#: src/stored/dircmd.c:759 src/stored/dircmd.c:1474 -#, fuzzy, c-format -msgid "" -"3902 Cannot mount Volume on Storage Device \"%s\" because:\n" -"%s" -msgstr "" -"3902 Impossible de monté le volume dans le storage device %s car :\n" -"%s" - -#: src/stored/dircmd.c:790 src/stored/reserve.c:648 -#, c-format -msgid "" -"\n" -" Device \"%s\" requested by DIR could not be opened or does not exist.\n" -msgstr "" - -#: src/stored/dircmd.c:812 src/stored/reserve.c:644 -#, c-format -msgid "" -"\n" -" Device \"%s\" in changer \"%s\" requested by DIR could not be opened or " -"does not exist.\n" -msgstr "" - -#: src/stored/dircmd.c:876 -#, fuzzy -msgid "Specified slot ignored. " -msgstr "fopen %s en erreur : ERR=%s\n" - -#: src/stored/dircmd.c:896 src/stored/dircmd.c:959 -#, fuzzy, c-format -msgid "3901 Unable to open device \"%s\": ERR=%s\n" -msgstr "3910 Impossible d'ouvrir le device %s : ERR=%s\n" - -#: src/stored/dircmd.c:917 src/stored/dircmd.c:947 -#, fuzzy, c-format -msgid "3001 Device \"%s\" is mounted with Volume \"%s\"\n" -msgstr "3001 Device %s est monté avec le volume \"%s\"\n" - -#: src/stored/dircmd.c:920 src/stored/dircmd.c:950 src/stored/dircmd.c:969 -#, fuzzy, c-format -msgid "" -"3905 Device \"%s\" open but no Bacula volume is mounted.\n" -"If this is not a blank tape, try unmounting and remounting the Volume.\n" -msgstr "" -"3905 Le device %s est ouvert mais il n'y a pas de volume Bacula monté.\n" -"Si ce n'est pas une cartouche vierge, essayer de la démonter puis de la " -"remonter.\n" - -#: src/stored/dircmd.c:931 -#, fuzzy, c-format -msgid "3001 Device \"%s\" is doing acquire.\n" -msgstr "3902 Le Device %s est occupé en acquisition.\n" - -#: src/stored/dircmd.c:936 src/stored/dircmd.c:1134 -#, fuzzy, c-format -msgid "3903 Device \"%s\" is being labeled.\n" -msgstr "3934 Device %s est en cours d'initialisation.\n" - -#: src/stored/dircmd.c:966 -#, fuzzy, c-format -msgid "3001 Device \"%s\" is already mounted with Volume \"%s\"\n" -msgstr "3001 Device %s est déjà monté avec le volume \"%s\"\n" - -#: src/stored/dircmd.c:979 -#, fuzzy, c-format -msgid "3002 Device \"%s\" is mounted.\n" -msgstr "3002 Le device %s est monté.\n" - -#: src/stored/dircmd.c:981 src/stored/dircmd.c:1103 src/stored/dircmd.c:1122 -#: src/stored/dircmd.c:1154 -#, c-format -msgid "3907 %s" -msgstr "3907 %s" - -#: src/stored/dircmd.c:984 -#, fuzzy, c-format -msgid "3906 File device \"%s\" is always mounted.\n" -msgstr "3906 Le device fichier %s est toujours monté.\n" - -#: src/stored/dircmd.c:993 -#, fuzzy, c-format -msgid "3930 Device \"%s\" is being released.\n" -msgstr "3934 Device %s est en cours d'initialisation.\n" - -#: src/stored/dircmd.c:997 -#, fuzzy, c-format -msgid "3905 Unknown wait state %d\n" -msgstr "est dans un état inconnu %c" - -#: src/stored/dircmd.c:1007 -#, c-format -msgid "3909 Error scanning mount command: %s\n" -msgstr "3909 Erreur pendant la lecture de la commande de montage : %s\n" - -#: src/stored/dircmd.c:1032 -#, fuzzy, c-format -msgid "3002 Device \"%s\" enabled.\n" -msgstr "3022 Le device %s est libéré.\n" - -#: src/stored/dircmd.c:1039 -#, fuzzy, c-format -msgid "3907 Error scanning \"enable\" command: %s\n" -msgstr "3909 Erreur pendant la lecture de la commande de montage : %s\n" - -#: src/stored/dircmd.c:1064 -#, fuzzy, c-format -msgid "3002 Device \"%s\" disabled.\n" -msgstr "3002 Le device %s est monté.\n" - -#: src/stored/dircmd.c:1071 -#, fuzzy, c-format -msgid "3907 Error scanning \"disable\" command: %s\n" -msgstr "3909 Erreur pendant la lecture de la commande de montage : %s\n" - -#: src/stored/dircmd.c:1100 src/stored/dircmd.c:1156 -#, fuzzy, c-format -msgid "3002 Device \"%s\" unmounted.\n" -msgstr "3002 Le device %s est démonté.\n" - -#: src/stored/dircmd.c:1107 -#, fuzzy, c-format -msgid "3901 Device \"%s\" is already unmounted.\n" -msgstr "3901 Le device %s est déjà démonté.\n" - -#: src/stored/dircmd.c:1125 -#, fuzzy, c-format -msgid "3001 Device \"%s\" unmounted.\n" -msgstr "3001 Le device %s est démonté.\n" - -#: src/stored/dircmd.c:1130 -#, fuzzy, c-format -msgid "3902 Device \"%s\" is busy in acquire.\n" -msgstr "3902 Le Device %s est occupé en acquisition.\n" - -#: src/stored/dircmd.c:1168 -#, c-format -msgid "3907 Error scanning unmount command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1196 -#, fuzzy -msgid "3916 Error scanning action_on_purge command\n" -msgstr "2902 Erreur dans le décodage de la commande d'annulation.\n" - -#: src/stored/dircmd.c:1239 -#, fuzzy, c-format -msgid "3921 Device \"%s\" already released.\n" -msgstr "3921 Le Device %s est déjà libéré.\n" - -#: src/stored/dircmd.c:1246 -#, fuzzy, c-format -msgid "3922 Device \"%s\" waiting for sysop.\n" -msgstr "3922 Device %s est en attente d'une intervention sysop.\n" - -#: src/stored/dircmd.c:1252 -#, fuzzy, c-format -msgid "3922 Device \"%s\" waiting for mount.\n" -msgstr "3922 Le Device %s est en atttente d'un montage.\n" - -#: src/stored/dircmd.c:1256 -#, fuzzy, c-format -msgid "3923 Device \"%s\" is busy in acquire.\n" -msgstr "3902 Le Device %s est occupé en acquisition.\n" - -#: src/stored/dircmd.c:1260 -#, fuzzy, c-format -msgid "3914 Device \"%s\" is being labeled.\n" -msgstr "3934 Device %s est en cours d'initialisation.\n" - -#: src/stored/dircmd.c:1268 -#, fuzzy, c-format -msgid "3022 Device \"%s\" released.\n" -msgstr "3022 Le device %s est libéré.\n" - -#: src/stored/dircmd.c:1279 -#, c-format -msgid "3927 Error scanning release command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1308 -#, c-format -msgid "Could not create bootstrap file %s: ERR=%s\n" -msgstr "Impossible de créer le fichier bootstrap %s : ERR=%s\n" - -#: src/stored/dircmd.c:1321 -msgid "Error parsing bootstrap file.\n" -msgstr "" - -#: src/stored/dircmd.c:1383 -#, fuzzy, c-format -msgid "3998 Device \"%s\" is not an autochanger.\n" -msgstr "3995 Le Device %s n'est pas un autochangeur.\n" - -#: src/stored/dircmd.c:1400 -#, fuzzy, c-format -msgid "3909 Error scanning autochanger drives/list/slots command: %s\n" -msgstr "3909 Erreur pendant la lecture de la commande de montage : %s\n" - -#: src/stored/dircmd.c:1442 -#, c-format -msgid "3909 Error scanning readlabel command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1470 -#, c-format -msgid "3001 Volume=%s Slot=%d\n" -msgstr "3001 Volume=%s Slot=%d\n" - -#: src/stored/dircmd.c:1502 -#, fuzzy, c-format -msgid "3931 Device \"%s\" is BLOCKED. user unmounted.\n" -msgstr "3931 Device %s est BLOQUE, démonté par l'utilisateur.\n" - -#: src/stored/dircmd.c:1506 -#, fuzzy, c-format -msgid "" -"3932 Device \"%s\" is BLOCKED. user unmounted during wait for media/mount.\n" -msgstr "" -"3932 Device %s est BLOQUE, démonté par l'utilisateur alors que bacula était " -"en attente d'un média.\n" - -#: src/stored/dircmd.c:1510 -#, fuzzy, c-format -msgid "3933 Device \"%s\" is BLOCKED waiting for media.\n" -msgstr "3933 Device %s est bloqué en attente d'un media.\n" - -#: src/stored/dircmd.c:1514 -#, fuzzy, c-format -msgid "3934 Device \"%s\" is being initialized.\n" -msgstr "3934 Device %s est en cours d'initialisation.\n" - -#: src/stored/dircmd.c:1518 -#, fuzzy, c-format -msgid "3935 Device \"%s\" is blocked labeling a Volume.\n" -msgstr "3935 Device %s est bloqué par une labélisation de volume.\n" - -#: src/stored/dircmd.c:1522 -#, fuzzy, c-format -msgid "3935 Device \"%s\" is blocked for unknown reason.\n" -msgstr "3935 Device %s est bloqué pour une raison inconnue.\n" - -#: src/stored/dircmd.c:1527 -#, fuzzy, c-format -msgid "3936 Device \"%s\" is busy reading.\n" -msgstr "3936 Device %s est occupé en lecture.\n" - -#: src/stored/dircmd.c:1530 -#, fuzzy, c-format -msgid "3937 Device \"%s\" is busy with writers=%d reserved=%d.\n" -msgstr "3937 Device %s est occupé avec %d flux en écriture.\n" - -#: src/stored/dircmd.c:1550 -#, c-format -msgid "" -"3999 Device \"%s\" requested by DIR could not be locked for shared storage.\n" -msgstr "" - -#: src/stored/dvd.c:252 -#, fuzzy, c-format -msgid "Error writing part %d to the DVD: ERR=%s\n" -msgstr "Erreur dans l'exécution de la commande : %s. ERR=%s\n" - -#: src/stored/dvd.c:254 -#, c-format -msgid "Error while writing current part to the DVD: %s" -msgstr "" - -#: src/stored/dvd.c:264 -#, c-format -msgid "Part %d (%lld bytes) written to DVD.\n" -msgstr "" - -#: src/stored/dvd.c:281 -#, c-format -msgid "Remaining free space %s on %s\n" -msgstr "" - -#: src/stored/dvd.c:347 -#, c-format -msgid "Next Volume part already exists on DVD. Cannot continue: %s\n" -msgstr "" - -#: src/stored/dvd.c:552 -#, c-format -msgid "" -"Error writing. Current part less than total number of parts (%d/%d, device=" -"%s)\n" -msgstr "" - -#: src/stored/dvd.c:559 -#, fuzzy, c-format -msgid "Unable to write last on %s: ERR=%s\n" -msgstr "Impossible de se connecter à %s sur %s:%d. ERR=%s\n" - -#: src/stored/fd_cmds.c:209 -#, c-format -msgid "Command error with FD, hanging up. ERR=%s\n" -msgstr "" - -#: src/stored/fd_cmds.c:212 -msgid "Command error with FD, hanging up.\n" -msgstr "" - -#: src/stored/fd_cmds.c:223 -#, fuzzy, c-format -msgid "FD command not found: %s\n" -msgstr "Job non trouvé : %s\n" - -#: src/stored/fd_cmds.c:254 -msgid "Attempt to append on non-open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:266 src/stored/fd_cmds.c:309 -msgid "Attempt to close non-open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:284 -msgid "Attempt to open already open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:338 -msgid "Attempt to read on non-open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:356 -msgid "Attempt to open an already open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:372 -#, fuzzy -msgid "Cannot open session, received bad parameters.\n" -msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" - -#: src/stored/file_dev.c:95 src/stored/tape_dev.c:859 -msgid "Bad call to reposition. Device not open\n" -msgstr "" - -#: src/stored/file_dev.c:157 -#, c-format -msgid "Could not open file device %s. No Volume name given.\n" -msgstr "" - -#: src/stored/file_dev.c:183 -#, fuzzy, c-format -msgid "Could not open(%s,%s,0640): ERR=%s\n" -msgstr "Impossible d'ouvrir %s : ERR=%s\n" - -#: src/stored/file_dev.c:202 -#, fuzzy, c-format -msgid "Could not open aligned volume: %s, ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier pid. %s ERR=%s\n" - -#: src/stored/file_dev.c:255 -#, c-format -msgid "Unable to truncate device %s. ERR=%s\n" -msgstr "" - -#: src/stored/file_dev.c:272 -#, fuzzy, c-format -msgid "Unable to stat device %s. ERR=%s\n" -msgstr "3910 Impossible d'ouvrir le device %s : ERR=%s\n" - -#: src/stored/file_dev.c:289 -#, c-format -msgid "Device %s doesn't support ftruncate(). Recreating file %s.\n" -msgstr "" - -#: src/stored/file_dev.c:301 -#, fuzzy, c-format -msgid "Could not reopen: %s, ERR=%s\n" -msgstr "Impossible d'ouvrir %s : ERR=%s\n" - -#: src/stored/file_dev.c:379 src/stored/tape_dev.c:1024 -#, c-format -msgid "Device %s cannot be %smounted. ERR=%s\n" -msgstr "Le Device %s ne peut pas être %smounted. ERR=%s\n" - -#: src/stored/hello.c:138 -#, fuzzy, c-format -msgid "" -"Connection from unknown Director %s at %s rejected.\n" -"Please see " -msgstr "" -"Connexion d'un Director inconnu %s à %s rejeté.\n" -"\n" - -#: src/stored/hello.c:165 -#, fuzzy, c-format -msgid "Invalid connection from %s. Len=%d\n" -msgstr "Connexion invalide. Len=%d\n" - -#: src/stored/hello.c:179 -#, fuzzy, c-format -msgid "Invalid Hello from %s. Len=%d\n" -msgstr "Connexion invalide. Len=%d\n" - -#: src/stored/hello.c:184 -#, fuzzy, c-format -msgid "Client connect failed: Job name not found: %s\n" -msgstr "Job non trouvé : %s\n" - -#: src/stored/hello.c:193 -#, c-format -msgid "" -"A Client \"%s\" tried to authenticate for Job %s, but the Job is already " -"authenticated with \"%s\".\n" -msgstr "" - -#: src/stored/hello.c:227 -#, c-format -msgid "" -"A Client \"%s\" tried to authenticate for Job %s, but the job is already " -"authenticated.\n" -msgstr "" - -#: src/stored/hello.c:234 src/stored/job.c:197 -msgid "Unable to authenticate File daemon\n" -msgstr "" - -#: src/stored/hello.c:292 -#, fuzzy -msgid "Client socket not open. Could not connect to Client.\n" -msgstr "Impossible de se connecter au Client.\n" - -#: src/stored/hello.c:308 src/stored/hello.c:310 -#, fuzzy, c-format -msgid "Recv request to Client failed. ERR=%s\n" -msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" - -#: src/stored/hello.c:315 src/stored/hello.c:316 -#, fuzzy, c-format -msgid "Bad Hello from Client: %s.\n" -msgstr "Début de purge des jobs du client \"%s\"\n" - -#: src/stored/hello.c:442 src/stored/hello.c:444 -#, fuzzy, c-format -msgid "Send caps to Client failed. ERR=%s\n" -msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" - -#: src/stored/hello.c:457 src/stored/hello.c:459 -#, fuzzy, c-format -msgid "Recv caps from Client failed. ERR=%s\n" -msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" - -#: src/stored/hello.c:463 -#, fuzzy, c-format -msgid "Recv bad caps from Client: %s.\n" -msgstr "Début de purge des jobs du client \"%s\"\n" - -#: src/stored/hello.c:464 -#, fuzzy, c-format -msgid "Recv bad caps from Client %s\n" -msgstr "Début de purge des jobs du client \"%s\"\n" - -#: src/stored/job.c:353 -msgid "In free_jcr(), but still attached to device!!!!\n" -msgstr "" - -#: src/stored/label.c:90 -#, fuzzy, c-format -msgid "Couldn't rewind %s device %s: ERR=%s\n" -msgstr "Impossible de trouver le userid %s : ERR=%s\n" - -#: src/stored/label.c:108 src/stored/label.c:204 -#, fuzzy, c-format -msgid "Wrong Volume mounted on %s device %s: Wanted %s have %s\n" -msgstr "Nouveau volume \"%s\" monté sur le device %s à %s.\n" - -#: src/stored/label.c:111 src/stored/label.c:192 -#, c-format -msgid "Too many tries: %s" -msgstr "" - -#: src/stored/label.c:128 -#, c-format -msgid "" -"Requested Volume \"%s\" on %s device %s is not a Bacula labeled Volume, " -"because: ERR=%s" -msgstr "" - -#: src/stored/label.c:133 -msgid "Could not read Volume label from block.\n" -msgstr "Impossible de lire le label du Volume depuis le média.\n" - -#: src/stored/label.c:136 -#, c-format -msgid "Could not unserialize Volume label: ERR=%s\n" -msgstr "" - -#: src/stored/label.c:144 -#, c-format -msgid "Volume Header Id bad: %s\n" -msgstr "" - -#: src/stored/label.c:177 -#, c-format -msgid "Volume on %s device %s has wrong Bacula version. Wanted %d got %d\n" -msgstr "" - -#: src/stored/label.c:188 -#, fuzzy, c-format -msgid "Volume on %s device %s has bad Bacula label type: %x\n" -msgstr "Le volume sur %s possède un mauvais label Bacula : %x\n" - -#: src/stored/label.c:225 -#, fuzzy, c-format -msgid "Got Aligned or File type Volume %s on Dedup device %s. Wanted File.\n" -msgstr "Le nouveau volume \"%s\" a été labélisé sur le device %s.\n" - -#: src/stored/label.c:235 -#, fuzzy, c-format -msgid "Got Aligned or Dedup type Volume %s on File device %s. Wanted File.\n" -msgstr "Le nouveau volume \"%s\" a été labélisé sur le device %s.\n" - -#: src/stored/label.c:245 -#, fuzzy, c-format -msgid "" -"Got File or Dedup type Volume %s on Aligned device %s. Wanted Aligned.\n" -msgstr "" -"Ecriture du label sur le Volume pré-labélisé \"%s\" sur le lecteur %s\n" - -#: src/stored/label.c:274 src/stored/label.c:467 src/stored/mount.c:502 -#, fuzzy, c-format -msgid "Could not reserve volume %s on %s device %s\n" -msgstr "Impossible de trouver le prochain volume pour le Job %s.\n" - -#: src/stored/label.c:364 -#, fuzzy, c-format -msgid "Cannot write Volume label to block for %s device %s\n" -msgstr "Impossible d'écrire le label du Volume sur le Device %s\n" - -#: src/stored/label.c:431 src/stored/label.c:587 -#, fuzzy, c-format -msgid "Open %s device %s Volume \"%s\" failed: ERR=%s\n" -msgstr "Impossible de supprimer le volume \"%s\". ERR=%s" - -#: src/stored/label.c:601 -#, fuzzy, c-format -msgid "Rewind error on %s device %s: ERR=%s\n" -msgstr "Erreur de lecture de %s:%s:%d : ERR=%s\n" - -#: src/stored/label.c:609 -#, fuzzy, c-format -msgid "Truncate error on %s device %s: ERR=%s\n" -msgstr "Erreur d'écriture à %u:%u sur le device %s. ERR=%s\n" - -#: src/stored/label.c:616 -#, fuzzy, c-format -msgid "Failed to re-open DVD after truncate on %s device %s: ERR=%s\n" -msgstr "" -"Impossible de se positionner à la fin du média sur le device %s : ERR=%s\n" - -#: src/stored/label.c:661 -#, fuzzy, c-format -msgid "Unable to write %s device %s: ERR=%s\n" -msgstr "Impossible de se connecter à %s sur %s:%d. ERR=%s\n" - -#: src/stored/label.c:695 -#, fuzzy, c-format -msgid "Recycled volume \"%s\" on %s device %s, all previous data lost.\n" -msgstr "" -"Recyclage du volume \"%s\" sur le lecteur %s, les précédentes données sont " -"perdues.\n" - -#: src/stored/label.c:698 -#, fuzzy, c-format -msgid "Wrote label to prelabeled Volume \"%s\" on %s device %s\n" -msgstr "" -"Ecriture du label sur le Volume pré-labélisé \"%s\" sur le lecteur %s\n" - -#: src/stored/label.c:940 -#, fuzzy, c-format -msgid "Bad Volume session label request=%d\n" -msgstr "Le Volume n'a pas de label.\n" - -#: src/stored/label.c:1004 -#, c-format -msgid "Expecting Volume Label, got FI=%s Stream=%s len=%d\n" -msgstr "" - -#: src/stored/label.c:1144 -#, c-format -msgid "Unknown %d" -msgstr "" - -#: src/stored/label.c:1148 -#, c-format -msgid "" -"\n" -"Volume Label:\n" -"Adata : %d\n" -"Id : %sVerNo : %d\n" -"VolName : %s\n" -"PrevVolName : %s\n" -"VolFile : %d\n" -"LabelType : %s\n" -"LabelSize : %d\n" -"PoolName : %s\n" -"MediaType : %s\n" -"PoolType : %s\n" -"HostName : %s\n" -msgstr "" - -#: src/stored/label.c:1172 -#, c-format -msgid "Date label written: %s\n" -msgstr "" - -#: src/stored/label.c:1178 -#, c-format -msgid "Date label written: %04d-%02d-%02d at %02d:%02d\n" -msgstr "" - -#: src/stored/label.c:1198 -#, c-format -msgid "" -"\n" -"%s Record:\n" -"JobId : %d\n" -"VerNum : %d\n" -"PoolName : %s\n" -"PoolType : %s\n" -"JobName : %s\n" -"ClientName : %s\n" -msgstr "" - -#: src/stored/label.c:1211 -#, c-format -msgid "" -"Job (unique name) : %s\n" -"FileSet : %s\n" -"JobType : %c\n" -"JobLevel : %c\n" -msgstr "" - -#: src/stored/label.c:1220 -#, c-format -msgid "" -"JobFiles : %s\n" -"JobBytes : %s\n" -"StartBlock : %s\n" -"EndBlock : %s\n" -"StartFile : %s\n" -"EndFile : %s\n" -"JobErrors : %s\n" -"JobStatus : %c\n" -msgstr "" - -#: src/stored/label.c:1241 -#, c-format -msgid "Date written : %s\n" -msgstr "" - -#: src/stored/label.c:1246 -#, c-format -msgid "Date written : %04d-%02d-%02d at %02d:%02d\n" -msgstr "" - -#: src/stored/label.c:1258 -msgid "***** ERROR ****** : Found error with the JobId\n" -msgstr "" - -#: src/stored/label.c:1278 -msgid "***** ERROR ****** : Found error with the JobLevel\n" -msgstr "" - -#: src/stored/label.c:1298 -msgid "***** ERROR ****** : Found error with the JobType\n" -msgstr "" - -#: src/stored/label.c:1305 -#, c-format -msgid "***** ERROR ****** : Found error with the Job name %s\n" -msgstr "" - -#: src/stored/label.c:1326 -msgid "Fresh Volume" -msgstr "" - -#: src/stored/label.c:1329 -msgid "Volume" -msgstr "" - -#: src/stored/label.c:1338 src/stored/read_records.c:406 -msgid "End of Media" -msgstr "" - -#: src/stored/label.c:1341 -msgid "End of Tape" -msgstr "" - -#: src/stored/label.c:1360 src/stored/label.c:1368 src/stored/label.c:1407 -#, c-format -msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d DataLen=%d\n" -msgstr "" - -#: src/stored/label.c:1365 -msgid "Bacula \"End of Tape\" label found.\n" -msgstr "" - -#: src/stored/label.c:1380 src/stored/label.c:1392 -#, c-format -msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d\n" -msgstr "" - -#: src/stored/label.c:1382 -#, c-format -msgid " Job=%s Date=%s Level=%c Type=%c\n" -msgstr "" - -#: src/stored/label.c:1394 -#, c-format -msgid " Date=%s Level=%c Type=%c Files=%s Bytes=%s Errors=%d Status=%c\n" -msgstr "" - -#: src/stored/lock.c:266 src/stored/lock.c:299 -#, fuzzy, c-format -msgid "pthread_cond_wait failure. ERR=%s\n" -msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n" - -#: src/stored/lock.c:608 -#, fuzzy -msgid "unknown blocked code" -msgstr "source inconnue" - -#: src/stored/mount.c:89 -#, fuzzy, c-format -msgid "Too many errors trying to mount %s device %s.\n" -msgstr "Le volume \"%s\" n'est pas dans le device %s.\n" - -#: src/stored/mount.c:97 -#, c-format -msgid "Job %d canceled.\n" -msgstr "Le job %d est annulé.\n" - -#: src/stored/mount.c:218 -#, fuzzy, c-format -msgid "Open of %s device %s Volume \"%s\" failed: ERR=%s\n" -msgstr "Impossible de supprimer le volume \"%s\". ERR=%s" - -#: src/stored/mount.c:296 -#, c-format -msgid "Volume \"%s\" previously written, moving to end of data.\n" -msgstr "Le volume \"%s\" contient des données, re-positionnement à la fin.\n" - -#: src/stored/mount.c:302 -#, fuzzy, c-format -msgid "Unable to position to end of data on %s device %s: ERR=%s\n" -msgstr "" -"Impossible de se positionner à la fin du média sur le device %s : ERR=%s\n" - -#: src/stored/mount.c:446 src/stored/mount.c:835 -#, fuzzy, c-format -msgid "Volume \"%s\" not loaded on %s device %s.\n" -msgstr "Le volume \"%s\" n'est pas dans le device %s.\n" - -#: src/stored/mount.c:482 -#, c-format -msgid "" -"Director wanted Volume \"%s\".\n" -" Current Volume \"%s\" not acceptable because:\n" -" %s" -msgstr "" -"Le director voulait utiliser le volume \"%s\".\n" -" Le volume courant \"%s\" n'est pas utilisable car :\n" -" %s" - -#: src/stored/mount.c:660 -#, c-format -msgid "Ready to append to end of Volume \"%s\" part=%d size=%s\n" -msgstr "" -"Prêt à ajouter des données à la fin du volume \"%s\" part=%d size=%s\n" -"\n" - -#: src/stored/mount.c:664 -#, fuzzy, c-format -msgid "" -"Bacula cannot write on DVD Volume \"%s\" because: The sizes do not match! " -"Volume=%s Catalog=%s\n" -msgstr "" -"Impossible d'écrire sur le volume \"%s\" car :\n" -"Les tailles ne correspondent pas. Volume=%s Catalogue=%s\n" - -#: src/stored/mount.c:678 -#, c-format -msgid "Ready to append to end of Volume \"%s\" at file=%d.\n" -msgstr "Prêt à ajouter des données à la fin du volume \"%s\" file=%d.\n" - -#: src/stored/mount.c:681 -#, fuzzy, c-format -msgid "" -"For Volume \"%s\":\n" -"The number of files mismatch! Volume=%u Catalog=%u\n" -"Correcting Catalog\n" -msgstr "" -"Impossible d'écrire sur le volume \"%s\" \n" -"car le nombre de fichiers ne correspond pas. Volume=%u Catalogue=%u\n" - -#: src/stored/mount.c:688 src/stored/mount.c:747 -#, fuzzy -msgid "Error updating Catalog\n" -msgstr "Impossible d'ouvrir le fichier de données %s.\n" - -#: src/stored/mount.c:693 -#, fuzzy, c-format -msgid "" -"Bacula cannot write on tape Volume \"%s\" because:\n" -"The number of files mismatch! Volume=%u Catalog=%u\n" -msgstr "" -"Impossible d'écrire sur le volume \"%s\" \n" -"car le nombre de fichiers ne correspond pas. Volume=%u Catalogue=%u\n" - -#: src/stored/mount.c:717 -#, fuzzy, c-format -msgid "Ready to append to end of Volumes \"%s\" ameta size=%s adata size=%s\n" -msgstr "" -"Prêt à ajouter des données à la fin du volume \"%s\" part=%d size=%s\n" -"\n" - -#: src/stored/mount.c:722 -#, fuzzy, c-format -msgid "Ready to append to end of Volume \"%s\" size=%s\n" -msgstr "" -"Prêt à ajouter des données à la fin du volume \"%s\" part=%d size=%s\n" -"\n" - -#: src/stored/mount.c:729 -#, fuzzy, c-format -msgid "" -"For Volume \"%s\":\n" -" The sizes do not match! Metadata Volume=%s Catalog=%s\n" -" Correcting Catalog\n" -msgstr "" -"Impossible d'écrire sur le volume \"%s\" car :\n" -"Les tailles ne correspondent pas. Volume=%s Catalogue=%s\n" - -#: src/stored/mount.c:736 -#, fuzzy, c-format -msgid "" -"For aligned Volume \"%s\":\n" -" Aligned sizes do not match! Aligned Volume=%s Catalog=%s\n" -" Correcting Catalog\n" -msgstr "" -"Impossible d'écrire sur le volume \"%s\" car :\n" -"Les tailles ne correspondent pas. Volume=%s Catalogue=%s\n" - -#: src/stored/mount.c:752 -#, fuzzy, c-format -msgid "" -"Bacula cannot write on disk Volume \"%s\" because: The sizes do not match! " -"Volume=%s Catalog=%s\n" -msgstr "" -"Impossible d'écrire sur le volume \"%s\" car :\n" -"Les tailles ne correspondent pas. Volume=%s Catalogue=%s\n" - -#: src/stored/mount.c:818 -#, fuzzy, c-format -msgid "Labeled new Volume \"%s\" on %s device %s.\n" -msgstr "Le nouveau volume \"%s\" a été labélisé sur le device %s.\n" - -#: src/stored/mount.c:829 -#, fuzzy, c-format -msgid "%s device %s not configured to autolabel Volumes.\n" -msgstr "" -"Attention, le device %s n'est pas configuré pour labéliser automatiquement " -"les volumes.\n" - -#: src/stored/mount.c:853 -#, c-format -msgid "Marking Volume \"%s\" in Error in Catalog.\n" -msgstr "Le volume \"%s\" est marqué en Erreur dans le catalogue.\n" - -#: src/stored/mount.c:870 -#, c-format -msgid "" -"Autochanger Volume \"%s\" not found in slot %d.\n" -" Setting InChanger to zero in catalog.\n" -msgstr "" - -#: src/stored/mount.c:889 -msgid "Hey!!!!! WroteVol non-zero !!!!!\n" -msgstr "" - -#: src/stored/mount.c:939 -#, fuzzy, c-format -msgid "" -"Invalid tape position on volume \"%s\" on device %s. Expected %d, got %d\n" -msgstr "" -"Fin du volume \"%s\" à %u:%u sur le device %s. Ecriture de %u octets, eu " -"%d.\n" - -#: src/stored/mount.c:980 -#, fuzzy, c-format -msgid "Cannot open %s Dev=%s, Vol=%s for reading.\n" -msgstr "Impossible d'ouvrir le fichier %s pour lecture. ERR=%s\n" - -#: src/stored/os.c:126 -#, fuzzy, c-format -msgid "Unable to set eotmodel on device %s: ERR=%s\n" -msgstr "3910 Impossible d'ouvrir le device %s : ERR=%s\n" - -#: src/stored/os.c:180 -msgid " Bacula status:" -msgstr "" - -#: src/stored/os.c:181 src/stored/os.c:264 src/stored/os.c:266 -#, c-format -msgid " file=%d block=%d\n" -msgstr " fichier=%d bloc=%d\n" - -#: src/stored/os.c:185 src/stored/tape_dev.c:345 -#, c-format -msgid "ioctl MTIOCGET error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/os.c:189 -msgid " Device status:" -msgstr "" - -#: src/stored/os.c:365 -#, c-format -msgid "unknown func code %d" -msgstr "" - -#: src/stored/os.c:371 -#, c-format -msgid "I/O function \"%s\" not supported on this device.\n" -msgstr "" - -#: src/stored/parse_bsr.c:116 -#, c-format -msgid "Cannot open bootstrap file %s: %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:220 -#, c-format -msgid "Device \"%s\" in bsr at inappropriate place.\n" -msgstr "" - -#: src/stored/parse_bsr.c:283 -#, fuzzy, c-format -msgid "REGEX '%s' compile error. ERR=%s\n" -msgstr "erreur de fermeture : ERR=%s\n" - -#: src/stored/parse_bsr.c:326 -msgid "JobType not yet implemented\n" -msgstr "" - -#: src/stored/parse_bsr.c:334 -msgid "JobLevel not yet implemented\n" -msgstr "" - -#: src/stored/parse_bsr.c:379 -#, c-format -msgid "MediaType %s in bsr at inappropriate place.\n" -msgstr "" - -#: src/stored/parse_bsr.c:684 -#, c-format -msgid "Slot %d in bsr at inappropriate place.\n" -msgstr "" - -#: src/stored/parse_bsr.c:708 -#, c-format -msgid "VolFile : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:716 -#, c-format -msgid "VolBlock : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:724 -#, c-format -msgid "VolAddr : %llu-%llu\n" -msgstr "" - -#: src/stored/parse_bsr.c:733 -#, c-format -msgid "FileIndex : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:735 -#, c-format -msgid "FileIndex : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:745 -#, c-format -msgid "JobId : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:747 -#, c-format -msgid "JobId : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:757 -#, c-format -msgid "SessId : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:759 -#, c-format -msgid "SessId : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:768 -#, c-format -msgid "VolumeName : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:769 -#, c-format -msgid " MediaType : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:770 -#, c-format -msgid " Device : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:771 -#, c-format -msgid " Slot : %d\n" -msgstr "" - -#: src/stored/parse_bsr.c:780 -#, c-format -msgid "Client : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:788 -#, c-format -msgid "Job : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:796 -#, c-format -msgid "SessTime : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:807 -msgid "BSR is NULL\n" -msgstr "" - -#: src/stored/parse_bsr.c:811 -#, c-format -msgid "Next : 0x%x\n" -msgstr "" - -#: src/stored/parse_bsr.c:812 -#, c-format -msgid "Root bsr : 0x%x\n" -msgstr "" - -#: src/stored/parse_bsr.c:824 -#, c-format -msgid "count : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:825 -#, c-format -msgid "found : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:828 -#, c-format -msgid "done : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:829 -#, c-format -msgid "positioning : %d\n" -msgstr "" - -#: src/stored/parse_bsr.c:830 -#, c-format -msgid "fast_reject : %d\n" -msgstr "" - -#: src/stored/parse_bsr.c:1054 src/stored/parse_bsr.c:1058 -#, c-format -msgid "" -"Bootstrap file error: %s\n" -" : Line %d, col %d of file %s\n" -"%s\n" -msgstr "" - -#: src/stored/read.c:56 -msgid "No Volume names found for restore.\n" -msgstr "" - -#: src/stored/read.c:201 src/stored/read.c:360 -#, c-format -msgid ">filed: Error Hdr=%s\n" -msgstr "" - -#: src/stored/read.c:202 -#, fuzzy, c-format -msgid "Error sending header to Client. ERR=%s\n" -msgstr "Erreur pendant lors de la récupération du pool. ERR=%s\n" - -#: src/stored/read.c:248 src/stored/read.c:376 -#, c-format -msgid "Error sending to FD. ERR=%s\n" -msgstr "" - -#: src/stored/read.c:249 -#, fuzzy, c-format -msgid "Error sending data to Client. ERR=%s\n" -msgstr "" -"Erreur pendant l'écriture des données vers le fichier de spool. ERR=%s\n" - -#: src/stored/read.c:332 src/stored/read.c:361 src/stored/read.c:377 -#, c-format -msgid "Error sending to File daemon. ERR=%s\n" -msgstr "" - -#: src/stored/read_records.c:79 -#, c-format -msgid "End of Volume at file %u on device %s, Volume \"%s\"\n" -msgstr "Fin de Volume au fichier %u sur le Device %s, Volume \"%s\"\n" - -#: src/stored/read_records.c:83 -msgid "End of all volumes.\n" -msgstr "Fin de tous les Volumes.\n" - -#: src/stored/read_records.c:133 -msgid "Did fsr in attemp to skip bad record.\n" -msgstr "" - -#: src/stored/read_records.c:375 -#, c-format -msgid "Forward spacing Volume \"%s\" to file:block %u:%u.\n" -msgstr "Postionnement en avant du Volume \"%s\" sur le fichier:bloc %u:%u.\n" - -#: src/stored/read_records.c:399 -msgid "Begin Session" -msgstr "" - -#: src/stored/read_records.c:403 -msgid "End Session" -msgstr "" - -#: src/stored/read_records.c:409 -#, c-format -msgid "Unknown code %d\n" -msgstr "" - -#: src/stored/record_util.c:62 -#, c-format -msgid "unknown: %d" -msgstr "" - -#: src/stored/reserve.c:65 -#, fuzzy, c-format -msgid "Unable to initialize reservation lock. ERR=%s\n" -msgstr "Impossible d'initialiser le verrou sur la base. ERR=%s\n" - -#: src/stored/reserve.c:145 -#, c-format -msgid "Hey! num_writers=%d!!!!\n" -msgstr "" - -#: src/stored/reserve.c:260 -#, fuzzy -msgid "3939 Could not get dcr\n" -msgstr "Impossible de créer la structure BSOCK cliente.\n" - -#: src/stored/reserve.c:369 -#, fuzzy, c-format -msgid "Device reservation failed for JobId=%d: %s\n" -msgstr "Impossible de créer le fichier bootstrap %s : ERR=%s\n" - -#: src/stored/reserve.c:378 -#, c-format -msgid "Failed command: %s\n" -msgstr "Erreur sur la commande : %s\n" - -#: src/stored/reserve.c:654 -#, fuzzy, c-format -msgid "" -"\n" -" Device \"%s\" requested by DIR is disabled.\n" -msgstr "3934 Device %s est en cours d'initialisation.\n" - -#: src/stored/reserve.c:669 -#, c-format -msgid "3926 Could not get dcr for device: %s\n" -msgstr "" - -#: src/stored/reserve.c:809 -#, fuzzy, c-format -msgid "3603 JobId=%u %s device %s is busy reading.\n" -msgstr "3603 JobId=%u device %s est occupé en lecture.\n" - -#: src/stored/reserve.c:818 -#, fuzzy, c-format -msgid "3604 JobId=%u %s device %s is BLOCKED due to user unmount.\n" -msgstr "" -"3604 JobId=%u device %s est bloqué car il a été démonté par l'utilisateur " -"(unmount).\n" - -#: src/stored/reserve.c:866 -#, fuzzy, c-format -msgid "3601 JobId=%u %s device %s is BLOCKED due to user unmount.\n" -msgstr "" -"3601 JobId=%u device %s est BLOQUE car il a été demonté par l'utilisateur.\n" - -#: src/stored/reserve.c:874 -#, fuzzy, c-format -msgid "" -"3602 JobId=%u %s device %s is busy (already reading/writing). read=%d, " -"writers=%d reserved=%d\n" -msgstr "3602 JobId=%u device %s est occupé (à lire ou écrire).\n" - -#: src/stored/reserve.c:913 -#, fuzzy, c-format -msgid "3609 JobId=%u Max concurrent jobs=%d exceeded on %s device %s.\n" -msgstr "" -"3607 JobId=%u voulait Vol=\"%s\", c'est le Vol=\"%s\" qui est dans le drive " -"%s.\n" - -#: src/stored/reserve.c:931 -#, fuzzy, c-format -msgid "" -"3610 JobId=%u Aligned volume max bytes does not allow concurrency on drive " -"%s.\n" -msgstr "" -"3607 JobId=%u voulait Vol=\"%s\", c'est le Vol=\"%s\" qui est dans le drive " -"%s.\n" - -#: src/stored/reserve.c:941 -#, fuzzy, c-format -msgid "3611 JobId=%u Volume max jobs=%d exceeded on %s device %s.\n" -msgstr "" -"3607 JobId=%u voulait Vol=\"%s\", c'est le Vol=\"%s\" qui est dans le drive " -"%s.\n" - -#: src/stored/reserve.c:966 -#, fuzzy, c-format -msgid "" -"3608 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" nreserve=%d on %s " -"device %s.\n" -msgstr "" -"3608 JobId=%u voulait le Pool=\"%s\", mais c'est le Pool=\"%s\" qui est dans " -"le drive %s.\n" - -#: src/stored/reserve.c:1018 -#, fuzzy, c-format -msgid "3605 JobId=%u wants free drive but %s device %s is busy.\n" -msgstr "" -"3605 JobId=%u voulait libérer le lecteur, mais le device %s est occupé.\n" - -#: src/stored/reserve.c:1027 -#, fuzzy, c-format -msgid "3606 JobId=%u prefers mounted drives, but %s device %s has no Volume.\n" -msgstr "3606 JobId=%u voulait un lecteur monté, mais le lecteur %s est vide.\n" - -#: src/stored/reserve.c:1049 -#, fuzzy, c-format -msgid "3607 JobId=%u wants Vol=\"%s\" drive has Vol=\"%s\" on %s device %s.\n" -msgstr "" -"3607 JobId=%u voulait Vol=\"%s\", c'est le Vol=\"%s\" qui est dans le drive " -"%s.\n" - -#: src/stored/reserve.c:1104 -#, c-format -msgid "Logic error!!!! JobId=%u Should not get here.\n" -msgstr "" - -#: src/stored/reserve.c:1105 -#, c-format -msgid "3910 JobId=%u Logic error!!!! %s device %s Should not get here.\n" -msgstr "" - -#: src/stored/reserve.c:1108 -msgid "Logic error!!!! Should not get here.\n" -msgstr "" - -#: src/stored/reserve.c:1111 -#, fuzzy, c-format -msgid "3911 JobId=%u failed reserve %s device %s.\n" -msgstr "" -"3605 JobId=%u voulait libérer le lecteur, mais le device %s est occupé.\n" - -#: src/stored/spool.c:72 -#, fuzzy -msgid "Spooling statistics:\n" -msgstr "Spooling des données...\n" - -#: src/stored/spool.c:75 -#, c-format -msgid "" -"Data spooling: %u active jobs, %s bytes; %u total jobs, %s max bytes/job.\n" -msgstr "" - -#: src/stored/spool.c:83 -#, c-format -msgid "Attr spooling: %u active jobs, %s bytes; %u total jobs, %s max bytes.\n" -msgstr "" - -#: src/stored/spool.c:104 -msgid "Spooling data ...\n" -msgstr "Spooling des données...\n" - -#: src/stored/spool.c:130 -#, c-format -msgid "Bad return from despool WroteVol=%d\n" -msgstr "" - -#: src/stored/spool.c:163 -#, c-format -msgid "Open data spool file %s failed: ERR=%s\n" -msgstr "Erreur pendant l'ouverture fichier de spool %s. ERR=%s\n" - -#: src/stored/spool.c:191 -msgid "Despooling zero bytes. Your disk is probably FULL!\n" -msgstr "" - -#: src/stored/spool.c:200 -#, c-format -msgid "Committing spooled data to Volume \"%s\". Despooling %s bytes ...\n" -msgstr "" -"Transfert des données spoolées sur le Volume \"%s\". Transfert de %s " -"octets...\n" - -#: src/stored/spool.c:205 -#, c-format -msgid "Writing spooled data to Volume. Despooling %s bytes ...\n" -msgstr "" -"Ecriture des données spoolées sur le Volume. Transfert de %s octets...\n" - -#: src/stored/spool.c:295 -#, fuzzy, c-format -msgid "" -"Despooling elapsed time = %02d:%02d:%02d, Transfer rate = %s Bytes/second\n" -msgstr "" -"Temps du transfert des données spoolées = %02d:%02d:%02d, Taux de transfert " -"= %s o/s\n" - -#: src/stored/spool.c:304 src/stored/spool.c:505 src/stored/spool.c:551 -#, c-format -msgid "Ftruncate spool file failed: ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:363 -#, c-format -msgid "Spool header read error. ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:366 -#, c-format -msgid "Spool read error. Wanted %u bytes, got %d\n" -msgstr "" - -#: src/stored/spool.c:367 -#, c-format -msgid "Spool header read error. Wanted %u bytes, got %d\n" -msgstr "" - -#: src/stored/spool.c:374 src/stored/spool.c:375 -#, c-format -msgid "Spool block too big. Max %u bytes, got %u\n" -msgstr "" - -#: src/stored/spool.c:381 src/stored/spool.c:382 -#, c-format -msgid "Spool data read error. Wanted %u bytes, got %d\n" -msgstr "" - -#: src/stored/spool.c:436 -#, fuzzy, c-format -msgid "" -"User specified Job spool size reached: JobSpoolSize=%s MaxJobSpoolSize=%s\n" -msgstr "Taille du spool spécifiée par l'utlisateur atteinte.\n" - -#: src/stored/spool.c:441 -#, fuzzy, c-format -msgid "" -"User specified Device spool size reached: DevSpoolSize=%s MaxDevSpoolSize=" -"%s\n" -msgstr "Taille du spool spécifiée par l'utlisateur atteinte.\n" - -#: src/stored/spool.c:448 -msgid "Bad return from despool in write_block.\n" -msgstr "" - -#: src/stored/spool.c:456 -msgid "Spooling data again ...\n" -msgstr "Reprise du spool des données...\n" - -#: src/stored/spool.c:488 -#, c-format -msgid "Error writing header to spool file. ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:493 -#, c-format -msgid "" -"Error writing header to spool file. Disk probably full. Attempting recovery. " -"Wanted to write=%d got=%d\n" -msgstr "" - -#: src/stored/spool.c:511 src/stored/spool.c:557 -msgid "Fatal despooling error." -msgstr "" - -#: src/stored/spool.c:519 -msgid "Retrying after header spooling error failed.\n" -msgstr "" - -#: src/stored/spool.c:535 -#, c-format -msgid "Error writing data to spool file. ERR=%s\n" -msgstr "" -"Erreur pendant l'écriture des données vers le fichier de spool. ERR=%s\n" - -#: src/stored/spool.c:568 -msgid "Retrying after data spooling error failed.\n" -msgstr "" - -#: src/stored/spool.c:655 -msgid "Network error on BlastAttributes.\n" -msgstr "" - -#: src/stored/spool.c:679 src/stored/spool.c:703 -#, c-format -msgid "Fseek on attributes file failed: ERR=%s\n" -msgstr "" - -# Impossible d'ouvrir le fichier de spool des attributs : ERR=%s -#: src/stored/spool.c:691 -#, fuzzy, c-format -msgid "Truncate on attributes file failed: ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier de spool des attributs %s : ERR=%s\n" - -#: src/stored/spool.c:715 -#, c-format -msgid "Sending spooled attrs to the Director. Despooling %s bytes ...\n" -msgstr "" -"Transfert des attributs spoolés au Director. Transfert de %s octets...\n" - -# Impossible d'ouvrir le fichier de spool des attributs : ERR=%s -#: src/stored/spool.c:741 -#, c-format -msgid "fopen attr spool file %s failed: ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier de spool des attributs %s : ERR=%s\n" - -#: src/stored/status.c:86 -msgid "Used Volume status:\n" -msgstr "Volume en cours d'utilisation :\n" - -#: src/stored/status.c:108 -msgid "" -"\n" -"SD Resources:\n" -msgstr "" - -#: src/stored/status.c:144 -#, fuzzy, c-format -msgid "3900 missing args in .status command: %s\n" -msgstr "3909 Erreur pendant la lecture de la commande de montage : %s\n" - -#: src/stored/status.c:149 -msgid "" -"\n" -"SD Shared Storage:\n" -msgstr "" - -#: src/stored/status.c:294 -#, fuzzy, c-format -msgid "" -"\n" -"Device \"%s\" is not open or does not exist.\n" -msgstr "Le Device \"%s\" n'est pas ouvert ou il n'existe pas.\n" - -#: src/stored/status.c:303 -#, fuzzy, c-format -msgid "" -"\n" -"Device %s is %s %s:\n" -" Volume: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" -"Le Device %s est monté avec :\n" -" Volume : %s\n" -" Pool : %s\n" -" Type du Media : %s\n" - -#: src/stored/status.c:308 -#, fuzzy -msgid "waiting for" -msgstr "En attente d'un montage" - -#: src/stored/status.c:308 -msgid "mounted with" -msgstr "" - -#: src/stored/status.c:310 -#, fuzzy -msgid "*unknown*" -msgstr "inconnu" - -#: src/stored/status.c:314 -#, fuzzy, c-format -msgid "" -"\n" -"Device %s: %s open but no Bacula volume is currently mounted.\n" -msgstr "Le Device %s est ouvert, mais il n'y a pas de Volume Bacula monté.\n" - -#: src/stored/status.c:325 -#, c-format -msgid " Total Bytes=%s Blocks=%s Bytes/block=%s\n" -msgstr " Total Octets=%s Blocs=%s Octets/Bloc=%s\n" - -#: src/stored/status.c:340 -#, c-format -msgid " Total Bytes Read=%s Blocks Read=%s Bytes/block=%s\n" -msgstr " Total des Octets lu=%s Blocs lu=%s Octets/Bloc=%s\n" - -#: src/stored/status.c:346 -#, c-format -msgid " Positioned at File=%s Block=%s\n" -msgstr " Positionné sur Fichier=%s Bloc=%s\n" - -#: src/stored/status.c:352 -#, fuzzy, c-format -msgid "" -"\n" -"Device %s: %s is not open.\n" -msgstr "Le Device %s n'est pas ouvert.\n" - -#: src/stored/status.c:366 -#, fuzzy, c-format -msgid " Available Space=%sB\n" -msgstr "Requêtes disponibles :\n" - -#: src/stored/status.c:374 -#, c-format -msgid "" -" shstore=%d registered=%d locked=%d blockedbySD=%s\n" -"\n" -msgstr "" - -#: src/stored/status.c:425 -#, c-format -msgid "Autochanger \"%s\" with devices:\n" -msgstr "Autochangeur \"%s\" avec les Devices :\n" - -#: src/stored/status.c:449 -msgid "" -"\n" -"Device status:\n" -msgstr "" -"\n" -"Statut du Device :\n" - -#: src/stored/status.c:506 -#, fuzzy, c-format -msgid "Daemon started %s. Jobs: run=%d, running=%d.\n" -msgstr "Démon démarré depuis %s, %d jobs lancés depuis cette date.\n" - -#: src/stored/status.c:521 -#, c-format -msgid " Res: ndevices=%d nautochgr=%d\n" -msgstr "" - -#: src/stored/status.c:534 -msgid "" -"No DEVICE structure.\n" -"\n" -msgstr "" - -#: src/stored/status.c:540 -#, fuzzy, c-format -msgid " Device is BLOCKED by another SD=%s\n" -msgstr " Le Device est BLOQUE. Démonté par l'utilisateur.\n" - -#: src/stored/status.c:545 -#, fuzzy -msgid " Device is disabled. User command.\n" -msgstr " Le Device est BLOQUE. Démonté par l'utilisateur.\n" - -#: src/stored/status.c:550 -msgid " Device is BLOCKED. User unmounted.\n" -msgstr " Le Device est BLOQUE. Démonté par l'utilisateur.\n" - -#: src/stored/status.c:554 -msgid " Device is BLOCKED. User unmounted during wait for media/mount.\n" -msgstr "" -" Le Device est BLOQUE. Démonté par l'utilisateur à cause d'un chargement " -"de média.\n" - -#: src/stored/status.c:565 -#, c-format -msgid "" -" Device is BLOCKED waiting for mount of volume \"%s\",\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" -" Le Device est BLOQUE en attente du montage du volume \"%s\",\n" -" Pool : %s\n" -" Media type : %s\n" - -#: src/stored/status.c:574 -#, c-format -msgid "" -" Device is BLOCKED waiting to create a volume for:\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" -" Le Device est BLOQUE en attente de création d'un volume :\n" -" Pool : %s\n" -" Media type : %s\n" - -#: src/stored/status.c:586 -msgid " Device is BLOCKED waiting for media.\n" -msgstr " Le Device est BLOQUE en attente d'un média.\n" - -#: src/stored/status.c:592 -msgid " Device is being initialized.\n" -msgstr " Le Device est en cours d'initialisation.\n" - -#: src/stored/status.c:596 -msgid " Device is blocked labeling a Volume.\n" -msgstr " Le Device est occupé à labéliser un Volume.\n" - -#: src/stored/status.c:605 -#, fuzzy, c-format -msgid " Slot %d %s loaded in drive %d.\n" -msgstr " Le slot %d est chargé dans le lecteur %d.\n" - -#: src/stored/status.c:609 -#, c-format -msgid " Drive %d is not loaded.\n" -msgstr " Le lecteur %d n'est pas chargé.\n" - -#: src/stored/status.c:644 -msgid "Device state:\n" -msgstr "" - -#: src/stored/status.c:660 -#, c-format -msgid " num_writers=%d reserves=%d block=%d enabled=%d\n" -msgstr "" - -#: src/stored/status.c:664 -#, fuzzy -msgid "Attached JobIds: " -msgstr "" -"\n" -"Jobs planifiés :\n" - -#: src/stored/status.c:684 -#, c-format -msgid " Archive name: %s Device name: %s\n" -msgstr "" - -#: src/stored/status.c:687 -#, fuzzy, c-format -msgid " File=%u block=%u\n" -msgstr "Fichier=%u bloc=%u\n" - -#: src/stored/status.c:689 -#, fuzzy, c-format -msgid " Min block=%u Max block=%u\n" -msgstr "Min bloc=%u Max bloc=%u\n" - -#: src/stored/status.c:821 -#, c-format -msgid "%s Job %s waiting for Client connection.\n" -msgstr "%s Job %s est en attente de la connexion du Client.\n" - -#: src/stored/status.c:837 -#, c-format -msgid "" -"Reading: %s %s job %s JobId=%d Volume=\"%s\"\n" -" pool=\"%s\" device=%s\n" -msgstr "" -"Lecture : %s %s job %s JobId=%d Volume=\"%s\"\n" -" pool=\"%s\" device=%s\n" - -#: src/stored/status.c:850 -#, fuzzy, c-format -msgid "" -"Writing: %s %s job %s JobId=%d Volume=\"%s\"\n" -" pool=\"%s\" device=%s\n" -msgstr "" -"Ecriture : %s %s job %s JobId=%d Volume=\"%s\"\n" -" pool=\"%s\" device=%s\n" - -#: src/stored/status.c:861 -#, c-format -msgid " spooling=%d despooling=%d despool_wait=%d\n" -msgstr " spooling=%d despooling=%d despool_wait=%d\n" - -#: src/stored/status.c:885 -#, fuzzy, c-format -msgid " Files=%s Bytes=%s AveBytes/sec=%s LastBytes/sec=%s\n" -msgstr " Fichiers=%s Octets=%s Octets/sec=%s\n" - -#: src/stored/status.c:900 -#, c-format -msgid " FDReadSeqNo=%s in_msg=%u out_msg=%d fd=%d\n" -msgstr "" - -#: src/stored/status.c:906 -msgid " FDSocket closed\n" -msgstr "" - -#: src/stored/status.c:927 -msgid "" -"\n" -"Jobs waiting to reserve a drive:\n" -msgstr "" -"\n" -"Jobs en attente de réservation de lecteur :\n" - -#: src/stored/status.c:1007 -#, fuzzy, c-format -msgid "3900 No arg in .status command: %s\n" -msgstr "3909 Erreur pendant la lecture de la commande de montage : %s\n" - -#: src/stored/status.c:1076 -msgid "3900 dedupengine is disabled: not compiled in this version.\n" -msgstr "" - -#: src/stored/status.c:1089 -#, fuzzy, c-format -msgid "3900 Unknown arg in .status command: %s\n" -msgstr "3909 Erreur pendant la lecture de la commande de montage : %s\n" - -#: src/stored/stored.c:79 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bacula-sd [options] [-c config_file] [config_file]\n" -" -c use as configuration file\n" -" -d [,] set debug level to , debug tags to \n" -" -dt print timestamp in debug output\n" -" -f run in foreground (for debugging)\n" -" -g set groupid to group\n" -" -m print kaboom output (for debugging)\n" -" -p proceed despite I/O errors\n" -" -s no signals (for debugging)\n" -" -t test - read config and exit\n" -" -u userid to \n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Version : %s (%s)\n" -"\n" -"Usage : stored [options] [-c config_file] [config_file]\n" -" -c utilise fich comme fichier de configuration\n" -" -dnn positionne le niveau de debug à nn\n" -" -dt affiche un timestamp devant chaque ligne de debug\n" -" -f reste en avant-plan (pour debugger)\n" -" -g groupid\n" -" -p continue même en cas d'erreurs E/S\n" -" -s pas de signaux\n" -" -t test - lit seulement le fichier de configuration\n" -" -u userid\n" -" -v affiche les messages utilisateurs\n" -" -? affiche ce message.\n" -"\n" - -#: src/stored/stored.c:273 -msgid "Volume Session Time is ZERO!\n" -msgstr "" - -#: src/stored/stored.c:282 -#, c-format -msgid "Unable to create thread. ERR=%s\n" -msgstr "" - -#: src/stored/stored.c:592 -#, fuzzy, c-format -msgid "Unable to stat ControlDevice %s: ERR=%s\n" -msgstr "3910 Impossible d'ouvrir le device %s : ERR=%s\n" - -#: src/stored/stored.c:598 -msgid "No plugin directory configured for SAN shared storage\n" -msgstr "" - -#: src/stored/stored.c:619 -#, c-format -msgid "Could not open device %s\n" -msgstr "Impossible d'ouvrir le device %s\n" - -#: src/stored/stored.c:637 -#, c-format -msgid "Could not mount device %s\n" -msgstr "Impossible de monter le device %s\n" - -#: src/stored/stored_conf.c:237 -#, c-format -msgid "Expected a Device Type keyword, got: %s" -msgstr "" - -#: src/stored/stored_conf.c:251 -#, c-format -msgid "" -"Maximum Block Size configured value %u is greater than allowed maximum: %u" -msgstr "" - -#: src/stored/stored_conf.c:264 -#, c-format -msgid "Warning: no \"%s\" resource (%d) defined.\n" -msgstr "" - -#: src/stored/stored_conf.c:267 -#, c-format -msgid "dump_resource type=%d\n" -msgstr "" - -#: src/stored/stored_conf.c:391 -#, c-format -msgid "Warning: unknown resource type %d\n" -msgstr "" - -#: src/stored/stored_conf.c:601 -#, c-format -msgid "\"%s\" item is required in \"%s\" resource, but not found.\n" -msgstr "" - -#: src/stored/stored_conf.c:607 -#, c-format -msgid "Too many items in \"%s\" resource\n" -msgstr "Trop d'éléments dans la ressource \"%s\"\n" - -#: src/stored/stored_conf.c:641 -#, c-format -msgid "Cannot find AutoChanger resource %s\n" -msgstr "Impossible de trouver la ressource AutoChanger %s\n" - -#: src/stored/stored_conf.c:657 -#, fuzzy, c-format -msgid "Unable to init lock: ERR=%s\n" -msgstr "Impossible d'initialiser le muxtex : ERR=%s\n" - -#: src/stored/tape_dev.c:227 -#, c-format -msgid "No tape loaded or drive offline on %s.\n" -msgstr "" - -#: src/stored/tape_dev.c:237 -#, c-format -msgid "Rewind error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:262 -#, fuzzy, c-format -msgid "Bad call to eod. Device %s not open\n" -msgstr "Le Device %s n'est pas ouvert.\n" - -#: src/stored/tape_dev.c:334 -#, c-format -msgid "ioctl MTEOM error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:429 -msgid "Bad call to load_dev. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:440 src/stored/tape_dev.c:453 -#, c-format -msgid "ioctl MTLOAD error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:484 -#, c-format -msgid "ioctl MTOFFL error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:525 -msgid "Bad call to fsf. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:536 src/stored/tape_dev.c:663 -#, c-format -msgid "Device %s at End of Tape.\n" -msgstr "" - -#: src/stored/tape_dev.c:567 src/stored/tape_dev.c:643 -#, c-format -msgid "ioctl MTFSF error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:692 -msgid "Bad call to bsf. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:698 -#, c-format -msgid "Device %s cannot BSF because it is not a tape.\n" -msgstr "" - -#: src/stored/tape_dev.c:715 -#, c-format -msgid "ioctl MTBSF error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:734 -msgid "Bad call to fsr. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:744 -#, c-format -msgid "ioctl MTFSR not permitted on %s.\n" -msgstr "" - -#: src/stored/tape_dev.c:772 -#, c-format -msgid "ioctl MTFSR %d error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:790 -msgid "Bad call to bsr_dev. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:800 -#, c-format -msgid "ioctl MTBSR not permitted on %s.\n" -msgstr "" - -#: src/stored/tape_dev.c:814 -#, c-format -msgid "ioctl MTBSR error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:920 -msgid "Bad call to weof_dev. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:930 -msgid "Attempt to WEOF on non-appendable Volume\n" -msgstr "" - -#: src/stored/tape_dev.c:948 -#, c-format -msgid "ioctl MTWEOF error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/vbackup.c:68 -msgid "Read and write devices not properly initialized.\n" -msgstr "" - -#: src/stored/vbackup.c:74 -#, c-format -msgid "No Volume names found for %s.\n" -msgstr "" - -#: src/stored/vol_mgr.c:81 -#, fuzzy, c-format -msgid "Unable to initialize volume list lock. ERR=%s\n" -msgstr "Impossible d'initialiser le verrou sur la base. ERR=%s\n" - -#: src/stored/vol_mgr.c:371 -#, fuzzy, c-format -msgid "Could not reserve volume \"%s\", because job canceled.\n" -msgstr "Impossible de trouver le prochain volume pour le Job %s.\n" - -#: src/stored/vol_mgr.c:382 -#, fuzzy, c-format -msgid "Could not reserve volume \"%s\" for append, because it will be read.\n" -msgstr "Impossible de trouver le prochain volume pour le Job %s.\n" - -#: src/stored/vol_mgr.c:415 -#, fuzzy, c-format -msgid "Cannot free Volume \"%s\", because it is reserved by someone else.\n" -msgstr "Impossible de pruner le Volume \"%s\" car il est archivé.\n" - -#: src/stored/vol_mgr.c:516 -#, c-format -msgid "Volume %s is busy swapping from %s to %s\n" -msgstr "" - -#: src/stored/vol_mgr.c:519 src/stored/vol_mgr.c:526 -#, fuzzy, c-format -msgid "Volume %s is busy swapping.\n" -msgstr "Le device %s est occupé en lecture.\n" - -#: src/stored/vol_mgr.c:523 -#, fuzzy, c-format -msgid "%s device %s is busy.\n" -msgstr "Le device %s est occupé en lecture.\n" - -#: src/stored/wait.c:122 -#, c-format -msgid "pthread timedwait error. ERR=%s\n" -msgstr "" - -#: src/stored/wait.c:228 -#, fuzzy, c-format -msgid "JobId=%s, Job %s waiting to reserve a device.\n" -msgstr "Le job %s est en attente de réservation d'un device.\n" - -#: src/stored/wait.c:274 -#, fuzzy, c-format -msgid "JobId=%s, Job %s waiting device %s.\n" -msgstr "Le job %s est en attente de réservation d'un device.\n" - -#: src/tools/bbatch.c:65 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"Example : bbatch -w /path/to/workdir -h localhost -f dat1 -f dat -f datx\n" -" will start 3 thread and load dat1, dat and datx in your catalog\n" -"See bbatch.c to generate datafile\n" -"\n" -"Usage: bbatch [ options ] -w working/dir -f datafile\n" -" -b with batch mode\n" -" -B without batch mode\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database host (default NULL)\n" -" -w specify working directory\n" -" -r call restore code with given jobids\n" -" -v verbose\n" -" -f specify data file\n" -" -? print this message\n" -"\n" -msgstr "" -"Copyright (C) 2000-2005 Kern Sibbald.\n" -"\n" -"Version : %s (%s)\n" -"\n" -"Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c utilise fich comme fichier de configuration\n" -" -dnn positionne le niveau de debug à nn\n" -" -f reste en avant-plan (pour debugger)\n" -" -g groupid\n" -" -r lance maintenant\n" -" -s pas de signaux\n" -" -t test - lit seulement le fichier de configuration\n" -" -u userid\n" -" -v affiche les messages utilisateurs\n" -" -? affiche ce message.\n" -"\n" - -#: src/tools/bbatch.c:187 src/tools/bbatch.c:236 src/tools/bvfs_test.c:203 -msgid "Could not init Bacula database\n" -msgstr "" - -#: src/tools/bbatch.c:197 -#, c-format -msgid "Computing file list for jobid=%s files=%lld secs=%d\n" -msgstr "" - -#: src/tools/bbatch.c:301 -#, fuzzy, c-format -msgid "Error opening datafile %s\n" -msgstr "Impossible d'ouvrir le fichier de données %s.\n" - -#: src/tools/bbatch.c:311 -#, fuzzy -msgid "Error while inserting file\n" -msgstr "Entrez le nombre de départ : " - -#: src/tools/bregex.c:142 src/tools/bregtest.c:126 src/tools/bwild.c:111 -#, c-format -msgid "Could not open data file: %s\n" -msgstr "Impossible d'ouvrir le fichier de données %s.\n" - -#: src/tools/bsmtp.c:119 -#, c-format -msgid "Fatal malformed reply from %s: %s\n" -msgstr "" - -#: src/tools/bsmtp.c:127 -#, fuzzy, c-format -msgid "Fatal fgets error: ERR=%s\n" -msgstr "erreur de fermeture : ERR=%s\n" - -#: src/tools/bsmtp.c:163 -#, fuzzy, c-format -msgid "" -"\n" -"Usage: %s [-f from] [-h mailhost] [-s subject] [-c copy] [recipient ...]\n" -" -4 forces bsmtp to use IPv4 addresses only.\n" -" -6 forces bsmtp to use IPv6 addresses only.\n" -" -8 set charset to UTF-8\n" -" -a use any ip protocol for address resolution\n" -" -c set the Cc: field\n" -" -d set debug level to \n" -" -dt print a timestamp in debug output\n" -" -f set the From: field\n" -" -h use mailhost:port as the SMTP server\n" -" -s set the Subject: field\n" -" -r set the Reply-To: field\n" -" -l set the maximum number of lines to send (default: " -"unlimited)\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Version : %s (%s)\n" -"\n" -"Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c utilise fich comme fichier de configuration\n" -" -d positionne le niveau de debug à nn\n" -" -dt affiche un timestamp devant chaque ligne de debug\n" -" -f reste en avant-plan (pour debugger)\n" -" -g groupid\n" -" -r lance maintenant\n" -" -s pas de signaux\n" -" -t test - lit seulement le fichier de configuration\n" -" -u userid\n" -" -v affiche les messages utilisateurs\n" -" -? affiche ce message.\n" -"\n" - -#: src/tools/bsmtp.c:350 -msgid "Fatal error: no recipient given.\n" -msgstr "" - -#: src/tools/bsmtp.c:378 -#, c-format -msgid "Fatal gethostname error: ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:389 -#, fuzzy, c-format -msgid "Fatal getaddrinfo for myself failed \"%s\": ERR=%s\n" -msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" - -#: src/tools/bsmtp.c:397 -#, c-format -msgid "Fatal gethostbyname for myself failed \"%s\": ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:457 src/tools/bsmtp.c:492 -#, c-format -msgid "Error unknown mail host \"%s\": ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:460 src/tools/bsmtp.c:495 -msgid "Retrying connection using \"localhost\".\n" -msgstr "" - -#: src/tools/bsmtp.c:485 -#, fuzzy, c-format -msgid "Failed to connect to mailhost %s\n" -msgstr "Impossible de se connecter au Client.\n" - -#: src/tools/bsmtp.c:503 -#, c-format -msgid "Fatal error: Unknown address family for smtp host: %d\n" -msgstr "" - -#: src/tools/bsmtp.c:512 src/tools/bsmtp.c:517 -#, c-format -msgid "Fatal socket error: ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:522 -#, c-format -msgid "Fatal connect error to %s: ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:531 -#, fuzzy, c-format -msgid "Fatal _open_osfhandle error: ERR=%s\n" -msgstr "erreur de fermeture : ERR=%s\n" - -#: src/tools/bsmtp.c:538 src/tools/bsmtp.c:542 src/tools/bsmtp.c:551 -#: src/tools/bsmtp.c:555 -#, c-format -msgid "Fatal fdopen error: ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:547 -#, c-format -msgid "Fatal dup error: ERR=%s\n" -msgstr "" - -#: src/tools/bsnapshot.c:47 -#, fuzzy, c-format -msgid "" -"ERROR %s\n" -"\n" -msgstr "%s : ERREUR : " - -#: src/tools/bsnapshot.c:51 -#, c-format -msgid "" -"Bacula Systems SA(R) %s (%s)\n" -"\n" -"Usage: bsnapshot\n" -" -d level Set debug level\n" -" -v Verbose\n" -" -s Use sudo\n" -" -o logfile send debug to logfile\n" -" -V volume volume\n" -" -T type volume type\n" -" -t check compatibility\n" -" -c specify configuration file\n" -"\n" -msgstr "" - -#: src/tools/bsnapshot.c:1876 -#, fuzzy -msgid "Unable to open -p argument for reading" -msgstr "Impossible d'ouvrir le fichier de paramètre DH" - -#: src/tools/bvfs_test.c:44 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database host (default NULL)\n" -" -w specify working directory\n" -" -j specify jobids\n" -" -p specify path\n" -" -f specify file\n" -" -l maximum tuple to fetch\n" -" -T truncate cache table before starting\n" -" -v verbose\n" -" -? print this message\n" -"\n" -msgstr "" -"Copyright (C) 2000-2005 Kern Sibbald.\n" -"\n" -"Version : %s (%s)\n" -"\n" -"Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c utilise fich comme fichier de configuration\n" -" -dnn positionne le niveau de debug à nn\n" -" -f reste en avant-plan (pour debugger)\n" -" -g groupid\n" -" -r lance maintenant\n" -" -s pas de signaux\n" -" -t test - lit seulement le fichier de configuration\n" -" -u userid\n" -" -v affiche les messages utilisateurs\n" -" -? affiche ce message.\n" -"\n" - -#: src/tools/cats_test.c:47 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database host (default NULL)\n" -" -w specify working directory\n" -" -p specify path\n" -" -f specify file\n" -" -l maximum tuple to fetch\n" -" -q print only errors\n" -" -v verbose\n" -" -? print this message\n" -"\n" -msgstr "" -"Copyright (C) 2000-2005 Kern Sibbald.\n" -"\n" -"Version : %s (%s)\n" -"\n" -"Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c utilise fich comme fichier de configuration\n" -" -dnn positionne le niveau de debug à nn\n" -" -f reste en avant-plan (pour debugger)\n" -" -g groupid\n" -" -r lance maintenant\n" -" -s pas de signaux\n" -" -t test - lit seulement le fichier de configuration\n" -" -u userid\n" -" -v affiche les messages utilisateurs\n" -" -? affiche ce message.\n" -"\n" - -#: src/tools/cats_test.c:363 -#, fuzzy, c-format -msgid "Could not open, database \"%s\".\n" -msgstr "Impossible d'ouvrir la base de données \"%s\".\n" - -#: src/tools/dbcheck.c:178 -msgid "" -"Warning skipping the additional parameters for working directory/dbname/user/" -"password/host.\n" -msgstr "" - -#: src/tools/dbcheck.c:196 -#, c-format -msgid "Error can not find the Catalog name[%s] in the given config file [%s]\n" -msgstr "" - -#: src/tools/dbcheck.c:198 -#, c-format -msgid "Error there is no Catalog section in the given config file [%s]\n" -msgstr "" - -#: src/tools/dbcheck.c:207 -msgid "Error no Director resource defined.\n" -msgstr "" - -#: src/tools/dbcheck.c:231 -msgid "Wrong number of arguments.\n" -msgstr "" - -#: src/tools/dbcheck.c:236 -msgid "Working directory not supplied.\n" -msgstr "" - -#: src/tools/dbcheck.c:272 -msgid "Database port must be a numeric value.\n" -msgstr "" - -#: src/tools/dbcheck.c:275 -msgid "Database port must be a int value.\n" -msgstr "" - -#: src/tools/dbcheck.c:346 -#, c-format -msgid "Hello, this is the database check/correct program.\n" -msgstr "" - -#: src/tools/dbcheck.c:348 -#, c-format -msgid "Modify database is on." -msgstr "" - -#: src/tools/dbcheck.c:350 -#, c-format -msgid "Modify database is off." -msgstr "" - -#: src/tools/dbcheck.c:352 src/tools/dbcheck.c:407 -#, c-format -msgid " Verbose is on.\n" -msgstr "" - -#: src/tools/dbcheck.c:354 src/tools/dbcheck.c:409 -#, c-format -msgid " Verbose is off.\n" -msgstr "" - -#: src/tools/dbcheck.c:356 -#, c-format -msgid "Please select the function you want to perform.\n" -msgstr "" - -#: src/tools/dbcheck.c:360 -#, c-format -msgid "" -"\n" -" 1) Toggle modify database flag\n" -" 2) Toggle verbose flag\n" -" 3) Repair bad Path records\n" -" 4) Eliminate duplicate Path records\n" -" 5) Eliminate orphaned Jobmedia records\n" -" 6) Eliminate orphaned File records\n" -" 7) Eliminate orphaned Path records\n" -" 8) Eliminate orphaned FileSet records\n" -" 9) Eliminate orphaned Client records\n" -" 10) Eliminate orphaned Job records\n" -" 11) Eliminate all Admin records\n" -" 12) Eliminate all Restore records\n" -" 13) All (3-12)\n" -" 14) Quit\n" -msgstr "" - -#: src/tools/dbcheck.c:376 -#, c-format -msgid "" -"\n" -" 1) Toggle modify database flag\n" -" 2) Toggle verbose flag\n" -" 3) Check for bad Path records\n" -" 4) Check for duplicate Path records\n" -" 5) Check for orphaned Jobmedia records\n" -" 6) Check for orphaned File records\n" -" 7) Check for orphaned Path records\n" -" 8) Check for orphaned FileSet records\n" -" 9) Check for orphaned Client records\n" -" 10) Check for orphaned Job records\n" -" 11) Check for all Admin records\n" -" 12) Check for all Restore records\n" -" 13) All (3-12)\n" -" 14) Quit\n" -msgstr "" - -#: src/tools/dbcheck.c:393 -msgid "Select function number: " -msgstr "" - -#: src/tools/dbcheck.c:400 -#, c-format -msgid "Database will be modified.\n" -msgstr "" - -#: src/tools/dbcheck.c:402 -#, c-format -msgid "Database will NOT be modified.\n" -msgstr "" - -#: src/tools/dbcheck.c:481 -#, c-format -msgid "JobId=%s Name=\"%s\" StartTime=%s\n" -msgstr "" - -#: src/tools/dbcheck.c:488 -#, c-format -msgid "Orphaned JobMediaId=%s JobId=%s Volume=\"%s\"\n" -msgstr "" - -#: src/tools/dbcheck.c:495 -#, c-format -msgid "Orphaned FileId=%s JobId=%s Volume=\"%s\"\n" -msgstr "" - -#: src/tools/dbcheck.c:502 -#, c-format -msgid "Orphaned FileSetId=%s FileSet=\"%s\" MD5=%s\n" -msgstr "" - -#: src/tools/dbcheck.c:509 -#, c-format -msgid "Orphaned ClientId=%s Name=\"%s\"\n" -msgstr "" - -#: src/tools/dbcheck.c:562 -#, c-format -msgid "Deleting: %s\n" -msgstr "" - -#: src/tools/dbcheck.c:634 -#, c-format -msgid "Checking for duplicate Path entries.\n" -msgstr "" - -#: src/tools/dbcheck.c:645 -#, c-format -msgid "Found %d duplicate Path records.\n" -msgstr "" - -#: src/tools/dbcheck.c:646 src/tools/dbcheck.c:708 src/tools/dbcheck.c:754 -#: src/tools/dbcheck.c:822 src/tools/dbcheck.c:864 src/tools/dbcheck.c:906 -#: src/tools/dbcheck.c:948 src/tools/dbcheck.c:985 src/tools/dbcheck.c:1018 -#: src/tools/dbcheck.c:1052 -msgid "Print them? (yes/no): " -msgstr "" - -#: src/tools/dbcheck.c:669 -#, c-format -msgid "Found %d for: %s\n" -msgstr "" - -#: src/tools/dbcheck.c:699 -#, c-format -msgid "Checking for orphaned JobMedia entries.\n" -msgstr "" - -#: src/tools/dbcheck.c:707 -#, c-format -msgid "Found %d orphaned JobMedia records.\n" -msgstr "" - -#: src/tools/dbcheck.c:725 -#, c-format -msgid "Deleting %d orphaned JobMedia records.\n" -msgstr "" - -#: src/tools/dbcheck.c:742 -#, c-format -msgid "Checking for orphaned File entries. This may take some time!\n" -msgstr "" - -#: src/tools/dbcheck.c:753 -#, c-format -msgid "Found %d orphaned File records.\n" -msgstr "" - -#: src/tools/dbcheck.c:770 -#, c-format -msgid "Deleting %d orphaned File records.\n" -msgstr "" - -#: src/tools/dbcheck.c:789 -#, c-format -msgid "Pruning orphaned Path entries isn't possible when using BVFS.\n" -msgstr "" - -#: src/tools/dbcheck.c:798 #, fuzzy -msgid "Create temporary index? (yes/no): " -msgstr "Continuez ? (oui/non) : " - -#: src/tools/dbcheck.c:810 -#, c-format -msgid "Checking for orphaned Path entries. This may take some time!\n" -msgstr "" - -#: src/tools/dbcheck.c:821 -#, c-format -msgid "Found %d orphaned Path records.\n" -msgstr "" - -#: src/tools/dbcheck.c:834 -#, c-format -msgid "Deleting %d orphaned Path records.\n" -msgstr "" - -#: src/tools/dbcheck.c:853 -#, c-format -msgid "Checking for orphaned FileSet entries. This takes some time!\n" -msgstr "" - -#: src/tools/dbcheck.c:863 -#, c-format -msgid "Found %d orphaned FileSet records.\n" -msgstr "" - -#: src/tools/dbcheck.c:878 -#, c-format -msgid "Deleting %d orphaned FileSet records.\n" -msgstr "" - -#: src/tools/dbcheck.c:887 -#, c-format -msgid "Checking for orphaned Client entries.\n" -msgstr "" - -#: src/tools/dbcheck.c:905 -#, c-format -msgid "Found %d orphaned Client records.\n" -msgstr "" - -#: src/tools/dbcheck.c:920 -#, c-format -msgid "Deleting %d orphaned Client records.\n" -msgstr "" - -#: src/tools/dbcheck.c:929 -#, c-format -msgid "Checking for orphaned Job entries.\n" -msgstr "" - -#: src/tools/dbcheck.c:947 -#, c-format -msgid "Found %d orphaned Job records.\n" -msgstr "" - -#: src/tools/dbcheck.c:962 -#, c-format -msgid "Deleting %d orphaned Job records.\n" -msgstr "" - -#: src/tools/dbcheck.c:964 -#, c-format -msgid "Deleting JobMedia records of orphaned Job records.\n" -msgstr "" - -#: src/tools/dbcheck.c:966 -#, c-format -msgid "Deleting Log records of orphaned Job records.\n" -msgstr "" - -#: src/tools/dbcheck.c:975 -#, c-format -msgid "Checking for Admin Job entries.\n" -msgstr "" - -#: src/tools/dbcheck.c:984 -#, c-format -msgid "Found %d Admin Job records.\n" -msgstr "" - -#: src/tools/dbcheck.c:999 -#, c-format -msgid "Deleting %d Admin Job records.\n" -msgstr "" - -#: src/tools/dbcheck.c:1008 -#, c-format -msgid "Checking for Restore Job entries.\n" -msgstr "" - -#: src/tools/dbcheck.c:1017 -#, c-format -msgid "Found %d Restore Job records.\n" -msgstr "" - -#: src/tools/dbcheck.c:1032 -#, c-format -msgid "Deleting %d Restore Job records.\n" -msgstr "" - -#: src/tools/dbcheck.c:1042 -#, c-format -msgid "Checking for Paths without a trailing slash\n" -msgstr "" - -#: src/tools/dbcheck.c:1051 -#, c-format -msgid "Found %d bad Path records.\n" -msgstr "" - -#: src/tools/dbcheck.c:1068 -#, c-format -msgid "Reparing %d bad Filename records.\n" -msgstr "" - -#: src/tools/dbcheck.c:1214 -#, c-format -msgid "" -"Ok. Index over the %s column already exists and dbcheck will work faster.\n" -msgstr "" - -#: src/tools/dbcheck.c:1217 -#, c-format -msgid "" -"Note. Index over the %s column not found, that can greatly slow down " -"dbcheck.\n" -msgstr "" - -#: src/tools/dbcheck.c:1232 -#, c-format -msgid "Create temporary index... This may take some time!\n" -msgstr "" - -#: src/tools/dbcheck.c:1240 -#, c-format -msgid "Temporary index created.\n" -msgstr "" - -#: src/tools/dbcheck.c:1255 -#, c-format -msgid "Drop temporary index.\n" -msgstr "" - -#: src/tools/dbcheck.c:1265 -#, c-format -msgid "Temporary index %s deleted.\n" -msgstr "" - -#: src/tools/drivetype.c:29 -#, c-format -msgid "" -"\n" -"Usage: drivetype [-v] path ...\n" -"\n" -" Print the drive type a given file/directory is on.\n" -" The following options are supported:\n" -"\n" -" -l print local fixed hard drive\n" -" -a display information on all drives\n" -" -v print both path and file system type.\n" -" -? print this message.\n" -"\n" -msgstr "" +#~ msgid " File=%u block=%u\n" +#~ msgstr "Fichier=%u bloc=%u\n" -#: src/tools/drivetype.c:60 -#, c-format -msgid "%s: unknown\n" -msgstr "" +#, fuzzy +#~ msgid " Min block=%u Max block=%u\n" +#~ msgstr "Min bloc=%u Max bloc=%u\n" -#: src/tools/fstype.c:29 -#, c-format -msgid "" -"\n" -"Usage: fstype [-v] path ...\n" -"\n" -" Print the file system type for each file/directory argument given.\n" -" The following options are supported:\n" -"\n" -" -l print all file system types in mtab.\n" -" -m print full entries in mtab.\n" -" -v print both path and file system type of each argument.\n" -" -? print this message.\n" -"\n" -msgstr "" +#~ msgid "%s Job %s waiting for Client connection.\n" +#~ msgstr "%s Job %s est en attente de la connexion du Client.\n" -#: src/tools/fstype.c:163 -#, c-format -msgid "%s: unknown file system type\n" -msgstr "" +#~ msgid "" +#~ "Reading: %s %s job %s JobId=%d Volume=\"%s\"\n" +#~ " pool=\"%s\" device=%s\n" +#~ msgstr "" +#~ "Lecture : %s %s job %s JobId=%d Volume=\"%s\"\n" +#~ " pool=\"%s\" device=%s\n" -#: src/tools/testfind.c:57 -#, c-format -msgid "" -"\n" -"Usage: testfind [-d debug_level] [-] [pattern1 ...]\n" -" -a print extended attributes (Win32 debug)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -c specify config file containing FileSet resources\n" -" -f specify which FileSet to use\n" -" -? print this message.\n" -"\n" -"Patterns are used for file inclusion -- normally directories.\n" -"Debug level >= 1 prints each file found.\n" -"Debug level >= 10 prints path/file for catalog.\n" -"Errors are always printed.\n" -"Files/paths truncated is the number of files/paths with len > 255.\n" -"Truncation is only in the catalog.\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Writing: %s %s job %s JobId=%d Volume=\"%s\"\n" +#~ " pool=\"%s\" device=%s\n" +#~ msgstr "" +#~ "Ecriture : %s %s job %s JobId=%d Volume=\"%s\"\n" +#~ " pool=\"%s\" device=%s\n" -#: src/tools/testfind.c:223 -#, c-format -msgid "" -"\n" -"Total files : %d\n" -"Max file length: %d\n" -"Max path length: %d\n" -"Files truncated: %d\n" -"Paths truncated: %d\n" -"Hard links : %d\n" -msgstr "" +#~ msgid " spooling=%d despooling=%d despool_wait=%d\n" +#~ msgstr " spooling=%d despooling=%d despool_wait=%d\n" -#: src/tools/testfind.c:264 -#, c-format -msgid "Reg: %s\n" -msgstr "" +#, fuzzy +#~ msgid " Files=%s Bytes=%s AveBytes/sec=%s LastBytes/sec=%s\n" +#~ msgstr " Fichiers=%s Octets=%s Octets/sec=%s\n" -#: src/tools/testfind.c:286 -msgid "\t[will not descend: recursion turned off]" -msgstr "" +#~ msgid "" +#~ "\n" +#~ "Jobs waiting to reserve a drive:\n" +#~ msgstr "" +#~ "\n" +#~ "Jobs en attente de réservation de lecteur :\n" -#: src/tools/testfind.c:288 -msgid "\t[will not descend: file system change not allowed]" -msgstr "" +#, fuzzy +#~ msgid "3900 No arg in .status command: %s\n" +#~ msgstr "3909 Erreur pendant la lecture de la commande de montage : %s\n" -#: src/tools/testfind.c:290 -msgid "\t[will not descend: disallowed file system]" -msgstr "" +#, fuzzy +#~ msgid "3900 Unknown arg in .status command: %s\n" +#~ msgstr "3909 Erreur pendant la lecture de la commande de montage : %s\n" -#: src/tools/testfind.c:292 -msgid "\t[will not descend: disallowed drive type]" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bacula-sd [options] [-c config_file] [config_file]\n" +#~ " -c use as configuration file\n" +#~ " -d [,] set debug level to , debug tags to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -f run in foreground (for debugging)\n" +#~ " -g set groupid to group\n" +#~ " -m print kaboom output (for debugging)\n" +#~ " -p proceed despite I/O errors\n" +#~ " -s no signals (for debugging)\n" +#~ " -t test - read config and exit\n" +#~ " -u userid to \n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Version : %s (%s)\n" +#~ "\n" +#~ "Usage : stored [options] [-c config_file] [config_file]\n" +#~ " -c utilise fich comme fichier de configuration\n" +#~ " -dnn positionne le niveau de debug à nn\n" +#~ " -dt affiche un timestamp devant chaque ligne de debug\n" +#~ " -f reste en avant-plan (pour debugger)\n" +#~ " -g groupid\n" +#~ " -p continue même en cas d'erreurs E/S\n" +#~ " -s pas de signaux\n" +#~ " -t test - lit seulement le fichier de configuration\n" +#~ " -u userid\n" +#~ " -v affiche les messages utilisateurs\n" +#~ " -? affiche ce message.\n" +#~ "\n" -#: src/tools/testfind.c:308 src/tools/testls.c:203 -#, c-format -msgid "Err: Could not access %s: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to stat ControlDevice %s: ERR=%s\n" +#~ msgstr "3910 Impossible d'ouvrir le device %s : ERR=%s\n" -#: src/tools/testfind.c:311 src/tools/testls.c:206 -#, c-format -msgid "Err: Could not follow ff->link %s: %s\n" -msgstr "" +#~ msgid "Could not open device %s\n" +#~ msgstr "Impossible d'ouvrir le device %s\n" -#: src/tools/testfind.c:314 src/tools/testls.c:209 -#, c-format -msgid "Err: Could not stat %s: %s\n" -msgstr "" +#~ msgid "Could not mount device %s\n" +#~ msgstr "Impossible de monter le device %s\n" -#: src/tools/testfind.c:317 src/tools/testls.c:212 -#, c-format -msgid "Skip: File not saved. No change. %s\n" -msgstr "" +#~ msgid "Too many items in \"%s\" resource\n" +#~ msgstr "Trop d'éléments dans la ressource \"%s\"\n" -#: src/tools/testfind.c:320 src/tools/testls.c:215 -#, c-format -msgid "Err: Attempt to backup archive. Not saved. %s\n" -msgstr "" +#~ msgid "Cannot find AutoChanger resource %s\n" +#~ msgstr "Impossible de trouver la ressource AutoChanger %s\n" -#: src/tools/testfind.c:323 src/tools/testls.c:224 -#, c-format -msgid "Err: Could not open directory %s: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to init lock: ERR=%s\n" +#~ msgstr "Impossible d'initialiser le muxtex : ERR=%s\n" -#: src/tools/testfind.c:326 src/tools/testls.c:227 -#, c-format -msgid "Err: Unknown file ff->type %d: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Bad call to eod. Device %s not open\n" +#~ msgstr "Le Device %s n'est pas ouvert.\n" -#: src/tools/testfind.c:376 -#, c-format -msgid "===== Filename truncated to 255 chars: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to initialize volume list lock. ERR=%s\n" +#~ msgstr "Impossible d'initialiser le verrou sur la base. ERR=%s\n" -#: src/tools/testfind.c:393 -#, c-format -msgid "========== Path name truncated to 255 chars: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Could not reserve volume \"%s\", because job canceled.\n" +#~ msgstr "Impossible de trouver le prochain volume pour le Job %s.\n" -#: src/tools/testfind.c:402 -#, c-format -msgid "========== Path length is zero. File=%s\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Could not reserve volume \"%s\" for append, because it will be read.\n" +#~ msgstr "Impossible de trouver le prochain volume pour le Job %s.\n" -#: src/tools/testfind.c:405 -#, c-format -msgid "Path: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot free Volume \"%s\", because it is reserved by someone else.\n" +#~ msgstr "Impossible de pruner le Volume \"%s\" car il est archivé.\n" -#: src/tools/testls.c:47 -#, c-format -msgid "" -"\n" -"Usage: testls [-d debug_level] [-] [pattern1 ...]\n" -" -a print extended attributes (Win32 debug)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -e specify file of exclude patterns\n" -" -i specify file of include patterns\n" -" -q quiet, don't print filenames (debug)\n" -" - read pattern(s) from stdin\n" -" -? print this message.\n" -"\n" -"Patterns are file inclusion -- normally directories.\n" -"Debug level >= 1 prints each file found.\n" -"Debug level >= 10 prints path/file for catalog.\n" -"Errors always printed.\n" -"Files/paths truncated is number with len > 255.\n" -"Truncation is only in catalog.\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "Volume %s is busy swapping.\n" +#~ msgstr "Le device %s est occupé en lecture.\n" -#: src/tools/testls.c:143 -#, c-format -msgid "Could not open include file: %s\n" -msgstr "" +#, fuzzy +#~ msgid "%s device %s is busy.\n" +#~ msgstr "Le device %s est occupé en lecture.\n" -#: src/tools/testls.c:156 -#, c-format -msgid "Could not open exclude file: %s\n" -msgstr "" +#, fuzzy +#~ msgid "JobId=%s, Job %s waiting to reserve a device.\n" +#~ msgstr "Le job %s est en attente de réservation d'un device.\n" -#: src/tools/testls.c:170 -#, c-format -msgid "Files seen = %d\n" -msgstr "" +#, fuzzy +#~ msgid "JobId=%s, Job %s waiting device %s.\n" +#~ msgstr "Le job %s est en attente de réservation d'un device.\n" -#: src/tools/testls.c:218 -#, c-format -msgid "Recursion turned off. Directory not entered. %s\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "Example : bbatch -w /path/to/workdir -h localhost -f dat1 -f dat -f datx\n" +#~ " will start 3 thread and load dat1, dat and datx in your catalog\n" +#~ "See bbatch.c to generate datafile\n" +#~ "\n" +#~ "Usage: bbatch [ options ] -w working/dir -f datafile\n" +#~ " -b with batch mode\n" +#~ " -B without batch mode\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -n specify the database name (default bacula)\n" +#~ " -u specify database user name (default bacula)\n" +#~ " -P specify database host (default NULL)\n" +#~ " -w specify working directory\n" +#~ " -r call restore code with given jobids\n" +#~ " -v verbose\n" +#~ " -f specify data file\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "Copyright (C) 2000-2015 Kern Sibbald\n" +#~ "Version : %s (%s)\n" +#~ "\n" +#~ "Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c utilise fich comme fichier de configuration\n" +#~ " -dnn positionne le niveau de debug à nn\n" +#~ " -f reste en avant-plan (pour debugger)\n" +#~ " -g groupid\n" +#~ " -r lance maintenant\n" +#~ " -s pas de signaux\n" +#~ " -t test - lit seulement le fichier de configuration\n" +#~ " -u userid\n" +#~ " -v affiche les messages utilisateurs\n" +#~ " -? affiche ce message.\n" +#~ "\n" -#: src/tools/testls.c:221 -#, c-format -msgid "Skip: File system change prohibited. Directory not entered. %s\n" -msgstr "" +#, fuzzy +#~ msgid "Error opening datafile %s\n" +#~ msgstr "Impossible d'ouvrir le fichier de données %s.\n" -#: src/win32/compat/compat.cpp:2855 #, fuzzy -msgid "" -"\n" -"\n" -"Bacula ERROR: " -msgstr "Bacula " +#~ msgid "Error while inserting file\n" +#~ msgstr "Entrez le nombre de départ : " -#: src/win32/filed/plugins/vssapi.c:1428 -#, fuzzy, c-format -msgid "Unable to resolve parent path for %ls\n" -msgstr "Impossible de mettre à jour les informations du Volume : ERR=%s" +#~ msgid "Could not open data file: %s\n" +#~ msgstr "Impossible d'ouvrir le fichier de données %s.\n" -#: src/win32/filed/plugins/vssfs.c:226 src/win32/filed/plugins/vssfs.c:238 #, fuzzy -msgid "Unable to parse user supplied restore configuration\n" -msgstr "Impossible de lire le certificat à partir du fichier" +#~ msgid "Fatal fgets error: ERR=%s\n" +#~ msgstr "erreur de fermeture : ERR=%s\n" -#: src/win32/libwin32/main.cpp:226 -msgid "Bad Command Line Option" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Usage: %s [-f from] [-h mailhost] [-s subject] [-c copy] [recipient ...]\n" +#~ " -4 forces bsmtp to use IPv4 addresses only.\n" +#~ " -6 forces bsmtp to use IPv6 addresses only.\n" +#~ " -8 set charset to UTF-8\n" +#~ " -a use any ip protocol for address resolution\n" +#~ " -c set the Cc: field\n" +#~ " -d set debug level to \n" +#~ " -dt print a timestamp in debug output\n" +#~ " -f set the From: field\n" +#~ " -h use mailhost:port as the SMTP server\n" +#~ " -s set the Subject: field\n" +#~ " -r set the Reply-To: field\n" +#~ " -l set the maximum number of lines to send (default: " +#~ "unlimited)\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Version : %s (%s)\n" +#~ "\n" +#~ "Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c utilise fich comme fichier de configuration\n" +#~ " -d positionne le niveau de debug à nn\n" +#~ " -dt affiche un timestamp devant chaque ligne de debug\n" +#~ " -f reste en avant-plan (pour debugger)\n" +#~ " -g groupid\n" +#~ " -r lance maintenant\n" +#~ " -s pas de signaux\n" +#~ " -t test - lit seulement le fichier de configuration\n" +#~ " -u userid\n" +#~ " -v affiche les messages utilisateurs\n" +#~ " -? affiche ce message.\n" +#~ "\n" -#: src/win32/libwin32/service.cpp:96 -msgid "RegisterServiceCtlHandler failed" -msgstr "" +#, fuzzy +#~ msgid "Fatal getaddrinfo for myself failed \"%s\": ERR=%s\n" +#~ msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n" -#: src/win32/libwin32/service.cpp:97 #, fuzzy -msgid "Failure contacting the Service Handler" -msgstr "Impossible de décrypter la clef de session" +#~ msgid "Failed to connect to mailhost %s\n" +#~ msgstr "Impossible de se connecter au Client.\n" -#: src/win32/libwin32/service.cpp:108 -msgid "Service start report failed" -msgstr "" +#, fuzzy +#~ msgid "Fatal _open_osfhandle error: ERR=%s\n" +#~ msgstr "erreur de fermeture : ERR=%s\n" -#: src/win32/libwin32/service.cpp:161 -msgid "StartServiceCtrlDispatcher failed." -msgstr "" +#, fuzzy +#~ msgid "" +#~ "ERROR %s\n" +#~ "\n" +#~ msgstr "%s : ERREUR : " -#: src/win32/libwin32/service.cpp:168 #, fuzzy -msgid "KERNEL32.DLL not found: Bacula service not started" -msgstr "Ressource %s introuvable\n" +#~ msgid "Unable to open -p argument for reading" +#~ msgstr "Impossible d'ouvrir le fichier de paramètre DH" -#: src/win32/libwin32/service.cpp:178 #, fuzzy -msgid "Registry service not found: Bacula service not started" -msgstr "Ressource %s introuvable\n" +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -n specify the database name (default bacula)\n" +#~ " -u specify database user name (default bacula)\n" +#~ " -P specify database host (default NULL)\n" +#~ " -w specify working directory\n" +#~ " -j specify jobids\n" +#~ " -p specify path\n" +#~ " -f specify file\n" +#~ " -l maximum tuple to fetch\n" +#~ " -T truncate cache table before starting\n" +#~ " -v verbose\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "Copyright (C) 2000-2015 Kern Sibbald\n" +#~ "Version : %s (%s)\n" +#~ "\n" +#~ "Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c utilise fich comme fichier de configuration\n" +#~ " -dnn positionne le niveau de debug à nn\n" +#~ " -f reste en avant-plan (pour debugger)\n" +#~ " -g groupid\n" +#~ " -r lance maintenant\n" +#~ " -s pas de signaux\n" +#~ " -t test - lit seulement le fichier de configuration\n" +#~ " -u userid\n" +#~ " -v affiche les messages utilisateurs\n" +#~ " -? affiche ce message.\n" +#~ "\n" -#: src/win32/libwin32/service.cpp:180 #, fuzzy -msgid "Registry service entry point not found" -msgstr "Ressource %s introuvable\n" +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -n specify the database name (default bacula)\n" +#~ " -u specify database user name (default bacula)\n" +#~ " -P specify database host (default NULL)\n" +#~ " -w specify working directory\n" +#~ " -p specify path\n" +#~ " -f specify file\n" +#~ " -l maximum tuple to fetch\n" +#~ " -q print only errors\n" +#~ " -v verbose\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "Copyright (C) 2000-2015 Kern Sibbald\n" +#~ "Version : %s (%s)\n" +#~ "\n" +#~ "Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c utilise fich comme fichier de configuration\n" +#~ " -dnn positionne le niveau de debug à nn\n" +#~ " -f reste en avant-plan (pour debugger)\n" +#~ " -g groupid\n" +#~ " -r lance maintenant\n" +#~ " -s pas de signaux\n" +#~ " -t test - lit seulement le fichier de configuration\n" +#~ " -u userid\n" +#~ " -v affiche les messages utilisateurs\n" +#~ " -? affiche ce message.\n" +#~ "\n" -#: src/win32/libwin32/service.cpp:201 -msgid "Report Service failure" -msgstr "" +#, fuzzy +#~ msgid "Could not open, database \"%s\".\n" +#~ msgstr "Impossible d'ouvrir la base de données \"%s\".\n" -#: src/win32/libwin32/service.cpp:232 #, fuzzy -msgid "Unable to install the service" -msgstr "Impossible d'écrire le marqueur EOF. ERR=%s\n" +#~ msgid "Create temporary index? (yes/no): " +#~ msgstr "Continuez ? (oui/non) : " -#: src/win32/libwin32/service.cpp:240 #, fuzzy -msgid "Service command length too long" -msgstr "Nom trop long.\n" +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "Bacula ERROR: " +#~ msgstr "Bacula " -#: src/win32/libwin32/service.cpp:241 -msgid "Service command length too long. Service not registered." -msgstr "" +#, fuzzy +#~ msgid "Unable to resolve parent path for %ls\n" +#~ msgstr "Impossible de mettre à jour les informations du Volume : ERR=%s" -#: src/win32/libwin32/service.cpp:254 #, fuzzy -msgid "" -"The Service Control Manager could not be contacted - the service was not " -"installed" -msgstr "Ressource %s introuvable\n" +#~ msgid "Unable to parse user supplied restore configuration\n" +#~ msgstr "Impossible de lire le certificat à partir du fichier" -#: src/win32/libwin32/service.cpp:277 src/win32/libwin32/service.cpp:306 -#: src/win32/libwin32/service.cpp:352 src/win32/libwin32/service.cpp:359 -#: src/win32/libwin32/service.cpp:363 #, fuzzy -msgid "The Bacula service: " -msgstr "Bacula Storage : Dernier Job annulé" +#~ msgid "Failure contacting the Service Handler" +#~ msgstr "Impossible de décrypter la clef de session" -#: src/win32/libwin32/service.cpp:284 -msgid "" -"Provides file backup and restore services. Bacula -- the network backup " -"solution." -msgstr "" +#, fuzzy +#~ msgid "KERNEL32.DLL not found: Bacula service not started" +#~ msgstr "Ressource %s introuvable\n" -#: src/win32/libwin32/service.cpp:295 #, fuzzy -msgid "Cannot write System Registry for " -msgstr "Impossible de détruire la mémoire partagée : %s\n" +#~ msgid "Registry service not found: Bacula service not started" +#~ msgstr "Ressource %s introuvable\n" -#: src/win32/libwin32/service.cpp:296 #, fuzzy -msgid "" -"The System Registry could not be updated - the Bacula service was not " -"installed" -msgstr "Ressource %s introuvable\n" +#~ msgid "Registry service entry point not found" +#~ msgstr "Ressource %s introuvable\n" -#: src/win32/libwin32/service.cpp:305 #, fuzzy -msgid "Cannot add Bacula key to System Registry" -msgstr "Impossible de détruire la mémoire partagée : %s\n" +#~ msgid "Unable to install the service" +#~ msgstr "Impossible d'écrire le marqueur EOF. ERR=%s\n" -#: src/win32/libwin32/service.cpp:316 -msgid "The " -msgstr "" +#, fuzzy +#~ msgid "Service command length too long" +#~ msgstr "Nom trop long.\n" -#: src/win32/libwin32/service.cpp:370 #, fuzzy -msgid "An existing Bacula service: " -msgstr "Bacula Storage : Dernier Job annulé" +#~ msgid "" +#~ "The Service Control Manager could not be contacted - the service was not " +#~ "installed" +#~ msgstr "Ressource %s introuvable\n" -#: src/win32/libwin32/service.cpp:378 #, fuzzy -msgid "" -"The service Manager could not be contacted - the Bacula service was not " -"removed" -msgstr "Ressource %s introuvable\n" +#~ msgid "The Bacula service: " +#~ msgstr "Bacula Storage : Dernier Job annulé" -#: src/win32/libwin32/service.cpp:391 #, fuzzy -msgid "" -"Could not find registry entry.\n" -"Service probably not registerd - the Bacula service was not removed" -msgstr "Ressource %s introuvable\n" +#~ msgid "Cannot write System Registry for " +#~ msgstr "Impossible de détruire la mémoire partagée : %s\n" -#: src/win32/libwin32/service.cpp:398 #, fuzzy -msgid "Could not delete Registry key for " -msgstr "Impossible de détruire la mémoire partagée : %s\n" +#~ msgid "" +#~ "The System Registry could not be updated - the Bacula service was not " +#~ "installed" +#~ msgstr "Ressource %s introuvable\n" -#: src/win32/libwin32/service.cpp:408 -msgid "Bacula could not be contacted, probably not running" -msgstr "" +#, fuzzy +#~ msgid "Cannot add Bacula key to System Registry" +#~ msgstr "Impossible de détruire la mémoire partagée : %s\n" -#: src/win32/libwin32/service.cpp:415 #, fuzzy -msgid "The Bacula service has been removed" -msgstr "Ressource %s introuvable\n" +#~ msgid "An existing Bacula service: " +#~ msgstr "Bacula Storage : Dernier Job annulé" -#: src/win32/libwin32/service.cpp:456 -msgid "SetServiceStatus failed" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "The service Manager could not be contacted - the Bacula service was not " +#~ "removed" +#~ msgstr "Ressource %s introuvable\n" -#: src/win32/libwin32/service.cpp:482 -#, c-format -msgid "" -"\n" -"\n" -"%s error: %ld at %s:%d" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Could not find registry entry.\n" +#~ "Service probably not registerd - the Bacula service was not removed" +#~ msgstr "Ressource %s introuvable\n" -#: src/win32/libwin32/service.cpp:558 -#, c-format -msgid "Locked by: %s, duration: %ld seconds\n" -msgstr "" +#, fuzzy +#~ msgid "Could not delete Registry key for " +#~ msgstr "Impossible de détruire la mémoire partagée : %s\n" -#: src/win32/libwin32/service.cpp:562 -#, c-format -msgid "No longer locked\n" -msgstr "" +#, fuzzy +#~ msgid "The Bacula service has been removed" +#~ msgstr "Ressource %s introuvable\n" -#: src/win32/libwin32/service.cpp:566 #, fuzzy -msgid "Could not lock database" -msgstr "Impossible d'ouvrir la base de données \"%s\".\n" +#~ msgid "Could not lock database" +#~ msgstr "Impossible d'ouvrir la base de données \"%s\".\n" #~ msgid "Expected an drivetype string, got: %s\n" #~ msgstr "Attendait un type de lecteur, pas : %s\n" @@ -21074,8 +9586,7 @@ msgstr "Impossible d'ouvrir la base de données \"%s\".\n" #, fuzzy #~ msgid "Copyright (c) 2000 - 2004, Kern Sibbald and John Walker" #~ msgstr "" -#~ "Copyright (C) 2000-2005 Kern Sibbald\n" -#~ "\n" +#~ "Copyright (C) 2000-2015 Kern Sibbald\n" #~ "Version : " #, fuzzy @@ -21484,8 +9995,7 @@ msgstr "Impossible d'ouvrir la base de données \"%s\".\n" #~ " -? print this message.\n" #~ "\n" #~ msgstr "" -#~ "Copyright (C) 2000-2005 Kern Sibbald.\n" -#~ "\n" +#~ "Copyright (C) 2000-2015 Kern Sibbald\n" #~ "Version : %s (%s)\n" #~ "\n" #~ "Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n" @@ -21505,12 +10015,9 @@ msgstr "Impossible d'ouvrir la base de données \"%s\".\n" #~ msgstr "Impossible d'écrire au bloc %u.\n" #, fuzzy -#~ msgid "" -#~ "Copyright (C) 2004-2006 Kern Sibbald\n" -#~ "Written by Nicolas Boichat\n" +#~ msgid "Copyright (C) 2000-2015 Kern SibbaldWritten by Nicolas Boichat\n" #~ msgstr "" -#~ "Copyright (C) 2000-2005 Kern Sibbald\n" -#~ "\n" +#~ "Copyright (C) 2000-2015 Kern Sibbald\n" #~ "Version : " #~ msgid "Using default Catalog name=%s DB=%s\n" diff --git a/bacula/po/it.po b/bacula/po/it.po index 03ba48b659..41ed2b225d 100644 --- a/bacula/po/it.po +++ b/bacula/po/it.po @@ -1,9 +1,9 @@ # Italian translations for Bacula package # Traduzioni italiane per il pacchetto Bacula.. # Copyright 2000-2015, Kern Sibbald -# License: BSD 2-Clause +# License: BSD 2-Clause; see file LICENSE-FOSS # , 2005. -# License: BSD 2-Clause +# License: BSD 2-Clause; see file LICENSE-FOSS msgid "" msgstr "" "Project-Id-Version: Bacula 1.38\n" diff --git a/bacula/po/nl.po b/bacula/po/nl.po index 6b82919d28..191c524ff6 100644 --- a/bacula/po/nl.po +++ b/bacula/po/nl.po @@ -1,13 +1,13 @@ # Dutch translation of Bacula -# Copyright (C) 2000-2-15 Kern Sibbald -# License: BSD 2-Clause +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # W. van den Akker , 2012 # msgid "" msgstr "" "Project-Id-Version: Bacula 5.2.7\n" "Report-Msgid-Bugs-To: bacula-devel@lists.sourceforge.net\n" -"POT-Creation-Date: 2015-05-21 11:42+0200\n" +"POT-Creation-Date: 2015-08-09 15:05+0200\n" "PO-Revision-Date: 2012-05-05 11:52+0100\n" "Last-Translator: W. van den Akker \n" "Language-Team: LANGUAGE \n" @@ -16,19011 +16,1786 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: examples/nagios/check_bacula/check_bacula.c:57 -#, c-format -msgid "" -"Copyright (C) 2005 Christian Masopust\n" -"Written by Christian Masopust (2005)\n" -"\n" -"Version: " -msgstr "" -"Copyright (C) 2005 Christian Masopust\n" -"Gemaakt door Christian Masopust (2005)\n" -"\n" -"Versie: " - -#: src/baconfig.h:61 src/baconfig.h:62 src/baconfig.h:67 src/baconfig.h:68 -#: src/baconfig.h:79 src/baconfig.h:80 +#: src/baconfig.h:64 src/baconfig.h:65 src/baconfig.h:70 src/baconfig.h:71 +#: src/baconfig.h:82 src/baconfig.h:83 #, c-format msgid "Failed ASSERT: %s\n" msgstr "" -#: src/baconfig.h:88 src/dird/ua_dotcmds.c:1675 src/dird/ua_dotcmds.c:1683 -#: src/dird/ua_run.c:810 src/dird/ua_run.c:1863 src/dird/ua_run.c:1890 -#: src/dird/ua_run.c:1921 src/dird/ua_run.c:1948 src/dird/ua_run.c:1986 -#: src/dird/ua_select.c:622 src/dird/ua_select.c:642 src/dird/ua_update.c:364 +#: src/baconfig.h:91 msgid "*None*" msgstr "*Geen*" -#: src/cats/cats.c:132 src/cats/mysql.c:408 src/cats/postgresql.c:529 -#: src/cats/postgresql.c:579 src/cats/sqlite.c:478 -#, c-format -msgid "Query failed: %s: ERR=%s\n" -msgstr "" - -#: src/cats/cats_null.c:30 -msgid "Please replace this null libbaccats library with a proper one.\n" -msgstr "" - -#: src/cats/mysql.c:91 -msgid "A user name for MySQL must be supplied.\n" +#: src/lib/status.h:78 +msgid "" +"\n" +"Terminated Jobs:\n" msgstr "" -#: src/cats/mysql.c:178 src/cats/postgresql.c:232 src/cats/sqlite.c:177 -#, c-format -msgid "Unable to initialize DB lock. ERR=%s\n" +#: src/lib/status.h:85 +msgid " JobId Level Files Bytes Status Finished Name \n" msgstr "" -#: src/cats/mysql.c:221 -#, c-format -msgid "" -"Unable to connect to MySQL server.\n" -"Database=%s User=%s\n" -"MySQL connect failed either server not running or your authorization is " -"incorrect.\n" +#: src/lib/status.h:87 +msgid "===================================================================\n" msgstr "" -#: src/cats/mysql.c:385 src/cats/postgresql.c:476 src/cats/sqlite.c:402 -#: src/dird/fd_cmds.c:926 src/dird/fd_cmds.c:987 -#, c-format -msgid "Attribute create error. %s" +#: src/lib/status.h:107 +msgid "Created" msgstr "" -#: src/cats/postgresql.c:103 -msgid "A user name for PostgreSQL must be supplied.\n" +#: src/lib/status.h:111 +msgid "Error" msgstr "" -#: src/cats/postgresql.c:187 src/cats/sql.c:336 src/cats/sql.c:343 -#: src/cats/sql_create.c:550 src/cats/sql_get.c:199 src/cats/sql_get.c:570 -#: src/cats/sql_get.c:780 src/cats/sql_get.c:1096 src/cats/sql_get.c:1468 -#, c-format -msgid "error fetching row: %s\n" +#: src/lib/status.h:114 +msgid "Diffs" msgstr "" -#: src/cats/postgresql.c:203 -#, c-format -msgid "Encoding error for database \"%s\". Wanted SQL_ASCII, got %s\n" +#: src/lib/status.h:117 +msgid "Cancel" msgstr "" -#: src/cats/postgresql.c:268 -#, c-format -msgid "" -"Unable to connect to PostgreSQL server. Database=%s User=%s\n" -"Possible causes: SQL server not running; password incorrect; max_connections " -"exceeded.\n" +#: src/lib/status.h:120 +msgid "OK" msgstr "" -#: src/cats/postgresql.c:372 -msgid "PQescapeStringConn returned non-zero.\n" +#: src/lib/status.h:123 +msgid "OK -- with warnings" msgstr "" -#: src/cats/postgresql.c:390 -msgid "PQescapeByteaConn returned NULL.\n" +#: src/lib/status.h:126 +msgid "Incomplete" msgstr "" -#: src/cats/postgresql.c:421 -msgid "PQunescapeByteaConn returned NULL.\n" +#: src/lib/status.h:129 +msgid "Other" msgstr "" -#: src/cats/postgresql.c:536 -#, fuzzy, c-format -msgid "Fetch failed: ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/cats/postgresql.c:839 +#: src/lib/status.h:141 #, c-format -msgid "error fetching currval: %s\n" +msgid "%6d\t%-6s\t%8s\t%10s\t%-7s\t%-8s\t%s\n" msgstr "" -#: src/cats/postgresql.c:1030 +#: src/lib/status.h:149 #, c-format -msgid "error starting batch mode: %s" +msgid "%6d %-6s %8s %10s %-7s %-8s %s\n" msgstr "" -#: src/cats/postgresql.c:1059 src/cats/postgresql.c:1066 -#, c-format -msgid "error ending batch mode: %s" +#: src/lib/status.h:178 src/lib/status.h:189 src/lib/status.h:203 +#: src/lib/status.h:207 src/lib/status.h:211 +msgid "Bacula " msgstr "" -#: src/cats/postgresql.c:1115 +#: src/qt-console/bat_conf.cpp:133 #, c-format -msgid "error copying in batch mode: %s" +msgid "No record for %d %s\n" msgstr "" -#: src/cats/sql.c:185 +#: src/qt-console/bat_conf.cpp:142 #, c-format -msgid "" -"Potential performance problem:\n" -"max_connections=%d set for %s database \"%s\" should be larger than " -"Director's MaxConcurrentJobs=%d\n" +msgid "Director: name=%s address=%s DIRport=%d\n" msgstr "" -#: src/cats/sql.c:229 +#: src/qt-console/bat_conf.cpp:146 #, c-format -msgid "" -"query %s failed:\n" -"%s\n" -msgstr "" +msgid "Console: name=%s\n" +msgstr "Console: naam=%s\n" -#: src/cats/sql.c:250 +#: src/qt-console/bat_conf.cpp:149 +#: src/qt-console/tray-monitor/tray_conf.cpp:187 #, c-format -msgid "" -"insert %s failed:\n" -"%s\n" +msgid "ConsoleFont: name=%s font face=%s\n" msgstr "" -#: src/cats/sql.c:262 +#: src/qt-console/bat_conf.cpp:153 src/qt-console/bat_conf.cpp:234 +#: src/qt-console/bat_conf.cpp:284 src/qt-console/bat_conf.cpp:314 #, c-format -msgid "Insertion problem: affected_rows=%s\n" +msgid "Unknown resource type %d\n" msgstr "" -#: src/cats/sql.c:280 +#: src/qt-console/bat_conf.cpp:262 +#: src/qt-console/tray-monitor/tray_conf.cpp:280 #, c-format -msgid "" -"update %s failed:\n" -"%s\n" +msgid "%s item is required in %s resource, but not found.\n" msgstr "" -#: src/cats/sql.c:290 +#: src/qt-console/bat_conf.cpp:331 +#: src/qt-console/tray-monitor/tray_conf.cpp:364 #, c-format -msgid "Update failed: affected_rows=%s for %s\n" +msgid "Attempt to define second %s resource named \"%s\" is not permitted.\n" msgstr "" -#: src/cats/sql.c:310 +#: src/qt-console/bcomm/dircomm.cpp:89 #, c-format -msgid "" -"delete %s failed:\n" -"%s\n" -msgstr "" +msgid "Already connected\"%s\".\n" +msgstr "Al verbonden\"%s\".\n" -#: src/cats/sql.c:396 +#: src/qt-console/bcomm/dircomm.cpp:100 +#: src/qt-console/tray-monitor/tray-monitor.cpp:353 #, c-format -msgid "Path length is zero. File=%s\n" -msgstr "" - -#: src/cats/sql.c:610 -msgid "No results to list.\n" +msgid "Connecting to Director %s:%d" msgstr "" -#: src/cats/sql.c:751 -#, fuzzy -msgid "Could not init database batch connection\n" -msgstr "Data parser kon niet geregistreerd worden!" - -#: src/cats/sql.c:757 +#: src/qt-console/bcomm/dircomm.cpp:102 #, c-format -msgid "Could not open database \"%s\": ERR=%s\n" -msgstr "" - -#: src/cats/sql.c:857 msgid "" -"Your database is no longer functional. This is most likely due to\n" -"the fact that your Bacula Enterprise Edition period has expired.\n" -"You can continue testing by re-initializing the catalog database orcontact " -"Bacula Systems to order a subscription.\n" +"Connecting to Director %s:%d\n" +"\n" msgstr "" +"Verbinden met Director %s:%d\n" +"\n" -#: src/cats/sql_create.c:82 +#: src/qt-console/bcomm/dircomm.cpp:154 #, c-format -msgid "Create DB Job record %s failed. ERR=%s\n" +msgid "Failed to initialize TLS context for Console \"%s\".\n" msgstr "" -#: src/cats/sql_create.c:125 +#: src/qt-console/bcomm/dircomm.cpp:177 #, c-format -msgid "Create JobMedia record %s failed: ERR=%s\n" +msgid "Failed to initialize TLS context for Director \"%s\".\n" msgstr "" -#: src/cats/sql_create.c:134 -#, c-format -msgid "Update Media record %s failed: ERR=%s\n" +#: src/qt-console/bcomm/dircomm.cpp:199 +#: src/qt-console/tray-monitor/tray-monitor.cpp:358 +msgid "Director daemon" msgstr "" -#: src/cats/sql_create.c:164 -#, c-format -msgid "pool record %s already exists\n" -msgstr "" +#: src/qt-console/bcomm/dircomm.cpp:237 +msgid "Initializing ..." +msgstr "Initialiseren ..." -#: src/cats/sql_create.c:196 -#, c-format -msgid "Create db Pool record %s failed: ERR=%s\n" -msgstr "" +#: src/qt-console/bcomm/dircomm.cpp:253 src/qt-console/console/console.cpp:134 +msgid "Connected" +msgstr "Verbonden" -#: src/cats/sql_create.c:225 -#, c-format -msgid "Device record %s already exists\n" -msgstr "" +#: src/qt-console/bcomm/dircomm.cpp:377 +msgid "Command completed ..." +msgstr "Opdracht gereed ..." -#: src/cats/sql_create.c:241 -#, c-format -msgid "Create db Device record %s failed: ERR=%s\n" -msgstr "" +#: src/qt-console/bcomm/dircomm.cpp:384 src/qt-console/console/console.cpp:371 +msgid "Processing command ..." +msgstr "Opdracht aan het uitvoeren ..." -#: src/cats/sql_create.c:274 -#, c-format -msgid "More than one Storage record!: %d\n" -msgstr "" +#: src/qt-console/bcomm/dircomm.cpp:391 +msgid "At main prompt waiting for input ..." +msgstr "Wacht op invoer op opdrachtregel in hoofdscherm ..." -#: src/cats/sql_create.c:279 -#, c-format -msgid "error fetching Storage row: %s\n" -msgstr "" +#: src/qt-console/bcomm/dircomm.cpp:398 src/qt-console/bcomm/dircomm.cpp:408 +msgid "At prompt waiting for input ..." +msgstr "Wacht op invoer op opdrachtregel ..." -#: src/cats/sql_create.c:299 -#, c-format -msgid "Create DB Storage record %s failed. ERR=%s\n" -msgstr "" +#: src/qt-console/bcomm/dircomm.cpp:416 +msgid "Command failed." +msgstr "Opdracht mislukt." -#: src/cats/sql_create.c:330 -#, c-format -msgid "mediatype record %s already exists\n" -msgstr "" +#: src/qt-console/bcomm/dircomm.cpp:488 +msgid "Director disconnected." +msgstr "Director niet verbonden." -#: src/cats/sql_create.c:346 +#: src/qt-console/bcomm/dircomm_auth.cpp:111 #, c-format -msgid "Create db mediatype record %s failed: ERR=%s\n" +msgid "Director authorization problem at \"%s:%d\"\n" msgstr "" -#: src/cats/sql_create.c:384 +#: src/qt-console/bcomm/dircomm_auth.cpp:118 #, c-format -msgid "Volume \"%s\" already exists.\n" +msgid "" +"Authorization problem: Remote server at \"%s:%d\" did not advertise required " +"TLS support.\n" msgstr "" -#: src/cats/sql_create.c:429 +#: src/qt-console/bcomm/dircomm_auth.cpp:126 #, c-format -msgid "Create DB Media record %s failed. ERR=%s\n" +msgid "" +"Authorization problem with Director at \"%s:%d\": Remote server requires " +"TLS.\n" msgstr "" -#: src/cats/sql_create.c:478 +#: src/qt-console/bcomm/dircomm_auth.cpp:137 #, c-format -msgid "More than one Client!: %d\n" +msgid "TLS negotiation failed with Director at \"%s:%d\"\n" msgstr "" -#: src/cats/sql_create.c:483 +#: src/qt-console/bcomm/dircomm_auth.cpp:149 #, c-format -msgid "error fetching Client row: %s\n" +msgid "" +"Bad response to Hello command: ERR=%s\n" +"The Director at \"%s:%d\" is probably not running.\n" msgstr "" -#: src/cats/sql_create.c:510 +#: src/qt-console/bcomm/dircomm_auth.cpp:158 #, c-format -msgid "Create DB Client record %s failed. ERR=%s\n" +msgid "Director at \"%s:%d\" rejected Hello command\n" msgstr "" -#: src/cats/sql_create.c:543 src/cats/sql_get.c:192 +#: src/qt-console/bcomm/dircomm_auth.cpp:173 #, c-format -msgid "More than one Path!: %s for path: %s\n" +msgid "" +"Authorization problem with Director at \"%s:%d\"\n" +"Most likely the passwords do not agree.\n" +"If you are using TLS, there may have been a certificate validation error " +"during the TLS handshake.\n" +"For help, please see " msgstr "" -#: src/cats/sql_create.c:576 -#, c-format -msgid "Create db Path record %s failed. ERR=%s\n" +#: src/qt-console/main.cpp:159 +msgid "Cryptography library initialization failed.\n" msgstr "" -#: src/cats/sql_create.c:621 +#: src/qt-console/main.cpp:163 #, c-format -msgid "Create DB Counters record %s failed. ERR=%s\n" +msgid "Please correct configuration file: %s\n" msgstr "" -#: src/cats/sql_create.c:657 -#, c-format -msgid "More than one FileSet!: %d\n" +#: src/qt-console/main.cpp:187 +#, fuzzy, c-format +msgid "" +"\n" +"Version: %s (%s) %s %s %s\n" +"\n" +"Usage: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" +" -c set configuration file to file\n" +" -dnn set debug level to nn\n" +" -s no signals\n" +" -t test - read configuration and exit\n" +" -? print this message.\n" +"\n" msgstr "" +"\n" +"Versie: %s (%s) %s %s %s\n" +"\n" +"Specificatie: bat [-s] [-c configuratiebestand] [-d debug_level] " +"[configuratiebestand]\n" +" -c gebruik configuratiebestand\n" +" -d instellen debug level op \n" +" -s geen signaleringen\n" +" -t test - lees configuratie en stop\n" +" -? geef deze melding.\n" +"\n" -#: src/cats/sql_create.c:662 -#, c-format -msgid "error fetching FileSet row: ERR=%s\n" +#: src/qt-console/main.cpp:220 src/qt-console/main.cpp:250 +msgid "TLS required but not configured in Bacula.\n" msgstr "" -#: src/cats/sql_create.c:692 +#: src/qt-console/main.cpp:228 #, c-format -msgid "Create DB FileSet record %s failed. ERR=%s\n" +msgid "" +"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " +"Director \"%s\" in %s. At least one CA certificate store is required.\n" msgstr "" -#: src/cats/sql_create.c:930 +#: src/qt-console/main.cpp:237 #, c-format -msgid "Create db File record %s failed. ERR=%s" +msgid "" +"No Director resource defined in %s\n" +"Without that I don't how to speak to the Director :-(\n" msgstr "" -#: src/cats/sql_create.c:953 +#: src/qt-console/main.cpp:258 #, c-format -msgid "Attempt to put non-attributes into catalog. Stream=%d\n" -msgstr "" - -#: src/cats/sql_create.c:969 -msgid "Cannot Copy/Migrate job using BaseJob.\n" +msgid "" +"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " +"Console \"%s\" in %s.\n" msgstr "" -#: src/cats/sql_create.c:1069 src/cats/sql_get.c:1196 -msgid "ERR=JobIds are empty\n" +#: src/qt-console/tray-monitor/authenticate.cpp:79 +msgid "" +"Director authorization problem.\n" +"Most likely the passwords do not agree.\n" +"For help, please see " msgstr "" -#: src/cats/sql_create.c:1122 +#: src/qt-console/tray-monitor/authenticate.cpp:88 #, c-format -msgid "Create db Object record %s failed. ERR=%s" +msgid "Bad response to Hello command: ERR=%s\n" msgstr "" -#: src/cats/sql_delete.c:60 -#, c-format -msgid "No pool record %s exists\n" +#: src/qt-console/tray-monitor/authenticate.cpp:95 +msgid "Director rejected Hello command\n" msgstr "" -#: src/cats/sql_delete.c:65 +#: src/qt-console/tray-monitor/authenticate.cpp:123 #, c-format -msgid "Expecting one pool record, got %d\n" +msgid "Error sending Hello to Storage daemon. ERR=%s\n" msgstr "" -#: src/cats/sql_delete.c:71 -#, c-format -msgid "Error fetching row %s\n" +#: src/qt-console/tray-monitor/authenticate.cpp:129 +msgid "" +"Director and Storage daemon passwords or names not the same.\n" +"For help, please see " msgstr "" -#: src/cats/sql_find.c:84 src/cats/sql_find.c:113 src/cats/sql_find.c:167 +#: src/qt-console/tray-monitor/authenticate.cpp:136 #, c-format -msgid "" -"Query error for start time request: ERR=%s\n" -"CMD=%s\n" +msgid "bdird set configuration file to file\n" +" -d set debug level to \n" +" -dt print timestamp in debug output\n" +" -t test - read configuration and exit\n" +" -? print this message.\n" +"\n" msgstr "" +"\n" +"Versie: %s (%s) %s %s %s\n" +"\n" +"Specificatie: tray-monitor [-c configuratiebestand] [-d debug_level]\n" +" -c gebruik configuratiebestand\n" +" -d instellen debug level op \n" +" -dt weergeven tijd in debug output\n" +" -t test - lees configuratie en stop\n" +" -? geef deze melding.\n" +"\n" -#: src/cats/sql_find.c:396 +#: src/qt-console/tray-monitor/tray-monitor.cpp:210 #, c-format -msgid "Request for Volume item %d greater than max %d or less than 1\n" +msgid "" +"Error: %d Monitor resources defined in %s. You must define one and only one " +"Monitor resource.\n" msgstr "" -#: src/cats/sql_find.c:411 +#: src/qt-console/tray-monitor/tray-monitor.cpp:242 #, c-format -msgid "No Volume record found for item %d.\n" +msgid "" +"No Client, Storage or Director resource defined in %s\n" +"Without that I don't how to get status from the File, Storage or Director " +"Daemon :-(\n" msgstr "" -#: src/cats/sql_get.c:140 +#: src/qt-console/tray-monitor/tray-monitor.cpp:257 #, c-format -msgid "Error fetching row: %s\n" +msgid "" +"Invalid refresh interval defined in %s\n" +"This value must be greater or equal to 1 second and less or equal to 10 " +"minutes (read value: %d).\n" msgstr "" -#: src/cats/sql_get.c:147 +#: src/qt-console/tray-monitor/tray-monitor.cpp:325 #, c-format -msgid "get_file_record want 1 got rows=%d PathId=%s Filename=%s\n" +msgid "Error, currentitem is not a Client or a Storage..\n" msgstr "" -#: src/cats/sql_get.c:155 +#: src/qt-console/tray-monitor/tray-monitor.cpp:363 #, c-format -msgid "File record for PathId=%s Filename=%s not found.\n" -msgstr "" - -#: src/cats/sql_get.c:161 -msgid "File record not found in Catalog.\n" +msgid "Connecting to Client %s:%d" msgstr "" -#: src/cats/sql_get.c:203 -#, c-format -msgid "Get DB path record %s found bad record: %s\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:368 +msgid "File daemon" msgstr "" -#: src/cats/sql_get.c:216 +#: src/qt-console/tray-monitor/tray-monitor.cpp:373 #, c-format -msgid "Path record: %s not found.\n" +msgid "Connecting to Storage %s:%d" msgstr "" -#: src/cats/sql_get.c:220 -#, c-format -msgid "Path record: %s not found in Catalog.\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:378 +msgid "Storage daemon" msgstr "" -#: src/cats/sql_get.c:259 +#: src/qt-console/tray-monitor/tray-monitor.cpp:382 +#: src/qt-console/tray-monitor/tray-monitor.cpp:412 #, c-format -msgid "No Job found for JobId %s\n" +msgid "Error, currentitem is not a Client, a Storage or a Director..\n" msgstr "" -#: src/cats/sql_get.c:330 src/cats/sql_get.c:385 -#, c-format -msgid "No volumes found for JobId=%d\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:387 +msgid "Cannot connect to daemon." msgstr "" -#: src/cats/sql_get.c:336 src/cats/sql_get.c:396 +#: src/qt-console/tray-monitor/tray-monitor.cpp:396 #, c-format -msgid "Error fetching row %d: ERR=%s\n" +msgid "Authentication error : %s" msgstr "" -#: src/cats/sql_get.c:350 -#, c-format -msgid "No Volume for JobId %d found in Catalog.\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:403 +msgid "Opened connection with Director daemon." msgstr "" -#: src/cats/sql_get.c:489 -#, c-format -msgid "Pool id select failed: ERR=%s\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:406 +msgid "Opened connection with File daemon." msgstr "" -#: src/cats/sql_get.c:526 -#, c-format -msgid "Client id select failed: ERR=%s\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:409 +msgid "Opened connection with Storage daemon." msgstr "" -#: src/cats/sql_get.c:565 -#, c-format -msgid "More than one Pool! Num=%s\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:460 +msgid "Error : BNET_HARDEOF or BNET_ERROR" msgstr "" -#: src/cats/sql_get.c:628 -msgid "Pool record not found in Catalog.\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:469 +msgid "Error : Connection closed." msgstr "" -#: src/cats/sql_get.c:691 +#: src/qt-console/tray-monitor/tray_conf.cpp:160 #, c-format -msgid "Error got %s RestoreObjects but expected only one!\n" +msgid "No %s resource defined\n" msgstr "" -#: src/cats/sql_get.c:696 -#, fuzzy, c-format -msgid "RestoreObject record \"%d\" not found.\n" -msgstr "Job \"%s\" niet gevonden.\n" - -#: src/cats/sql_get.c:721 src/dird/ua_run.c:703 +#: src/qt-console/tray-monitor/tray_conf.cpp:169 #, c-format -msgid "Decompression failed. Len wanted=%d got=%d. Object=%s\n" -msgstr "" - -#: src/cats/sql_get.c:739 -msgid "RestoreObject record not found in Catalog.\n" +msgid "Monitor: name=%s FDtimeout=%s SDtimeout=%s\n" msgstr "" -#: src/cats/sql_get.c:775 +#: src/qt-console/tray-monitor/tray_conf.cpp:175 #, c-format -msgid "More than one Client!: %s\n" -msgstr "" - -#: src/cats/sql_get.c:792 src/cats/sql_get.c:796 -msgid "Client record not found in Catalog.\n" +msgid "Director: name=%s address=%s FDport=%d\n" msgstr "" -#: src/cats/sql_get.c:821 +#: src/qt-console/tray-monitor/tray_conf.cpp:179 #, c-format -msgid "More than one Counter!: %d\n" +msgid "Client: name=%s address=%s FDport=%d\n" msgstr "" -#: src/cats/sql_get.c:826 +#: src/qt-console/tray-monitor/tray_conf.cpp:183 #, c-format -msgid "error fetching Counter row: %s\n" +msgid "Storage: name=%s address=%s SDport=%d\n" msgstr "" -#: src/cats/sql_get.c:846 +#: src/qt-console/tray-monitor/tray_conf.cpp:191 #, c-format -msgid "Counter record: %s not found in Catalog.\n" +msgid "Unknown resource type %d in dump_resource.\n" msgstr "" -#: src/cats/sql_get.c:884 +#: src/qt-console/tray-monitor/tray_conf.cpp:249 #, c-format -msgid "Error got %s FileSets but expected only one!\n" +msgid "Unknown resource type %d in free_resource.\n" msgstr "" -#: src/cats/sql_get.c:889 +#: src/qt-console/tray-monitor/tray_conf.cpp:286 #, c-format -msgid "FileSet record \"%s\" not found.\n" -msgstr "" - -#: src/cats/sql_get.c:899 -msgid "FileSet record not found in Catalog.\n" +msgid "Too many items in %s resource\n" msgstr "" -#: src/cats/sql_get.c:998 +#: src/qt-console/tray-monitor/tray_conf.cpp:306 +#: src/qt-console/tray-monitor/tray_conf.cpp:344 #, c-format -msgid "Media id select failed: ERR=%s\n" +msgid "Unknown resource type %d in save_resource.\n" msgstr "" -#: src/cats/sql_get.c:1036 -#, c-format -msgid "query dbids failed: ERR=%s\n" -msgstr "" +#~ msgid "" +#~ "Copyright (C) 2005 Christian Masopust\n" +#~ "Written by Christian Masopust (2005)\n" +#~ "\n" +#~ "Version: " +#~ msgstr "" +#~ "Copyright (C) 2005 Christian Masopust\n" +#~ "Gemaakt door Christian Masopust (2005)\n" +#~ "\n" +#~ "Versie: " -#: src/cats/sql_get.c:1091 -#, c-format -msgid "More than one Volume!: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Fetch failed: ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/cats/sql_get.c:1150 -#, c-format -msgid "Media record with MediaId=%s not found.\n" -msgstr "" +#, fuzzy +#~ msgid "Could not init database batch connection\n" +#~ msgstr "Data parser kon niet geregistreerd worden!" -#: src/cats/sql_get.c:1153 -#, fuzzy, c-format -msgid "Media record for Volume name \"%s\" not found.\n" -msgstr "Job \"%s\" niet gevonden.\n" +#, fuzzy +#~ msgid "RestoreObject record \"%d\" not found.\n" +#~ msgstr "Job \"%s\" niet gevonden.\n" -#: src/cats/sql_get.c:1160 -#, c-format -msgid "Media record for MediaId=%u not found in Catalog.\n" -msgstr "" +#, fuzzy +#~ msgid "Media record for Volume name \"%s\" not found.\n" +#~ msgstr "Job \"%s\" niet gevonden.\n" -#: src/cats/sql_get.c:1163 -#, c-format -msgid "Media record for Volume Name \"%s\" not found in Catalog.\n" -msgstr "" +#, fuzzy +#~ msgid "Snapshot record for Snapshot name \"%s\" not found.\n" +#~ msgstr "Job \"%s\" niet gevonden.\n" -#: src/cats/sql_get.c:1463 -#, c-format -msgid "More than one Snapshot!: %s\n" -msgstr "" +#, fuzzy +#~ msgid "send a file to the director" +#~ msgstr "Verbinding naar director opnieuw opzetten" -#: src/cats/sql_get.c:1492 src/cats/sql_get.c:1502 -#, c-format -msgid "Snapshot record with SnapshotId=%s not found.\n" -msgstr "" +#, fuzzy +#~ msgid "@exec error: ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/cats/sql_get.c:1495 src/cats/sql_get.c:1505 -#, fuzzy, c-format -msgid "Snapshot record for Snapshot name \"%s\" not found.\n" -msgstr "Job \"%s\" niet gevonden.\n" +#~ msgid "*** Admin Error ***" +#~ msgstr "*** Admin Fout ***" -#: src/cats/sql_list.c:45 -#, c-format -msgid "Query failed: %s\n" -msgstr "" +#~ msgid "Admin Canceled" +#~ msgstr "Admin geannuleerd" -#: src/cats/sql_list.c:314 -msgid "These JobIds have copies as follows:\n" -msgstr "" +#~ msgid "Backup OK -- with warnings" +#~ msgstr "Backup OK -- met waarschuwingen" -#: src/cats/sql_list.c:316 -msgid "The catalog contains copies as follows:\n" -msgstr "" +#~ msgid "*** Backup Error ***" +#~ msgstr "*** Backup Fout ***" -#: src/cats/sqlite.c:192 -#, c-format -msgid "Database %s does not exist, please create it.\n" -msgstr "" +#~ msgid "Backup Canceled" +#~ msgstr "Backup geannuleerd" -#: src/cats/sqlite.c:214 -#, c-format -msgid "Unable to open Database=%s. ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bdirjson [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -r get resource type \n" +#~ " -n get resource \n" +#~ " -l get only directives matching dirs (use with -r)\n" +#~ " -D get only data\n" +#~ " -R do not apply JobDefs to Job\n" +#~ " -c set configuration file to file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -t test - read configuration and exit\n" +#~ " -s output in show text format\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Versie: %s (%s) %s %s %s\n" +#~ "\n" +#~ "Specificatie: tray-monitor [-c configuratiebestand] [-d debug_level]\n" +#~ " -c gebruik configuratiebestand\n" +#~ " -d instellen debug level op \n" +#~ " -dt weergeven tijd in debug output\n" +#~ " -t test - lees configuratie en stop\n" +#~ " -? geef deze melding.\n" +#~ "\n" -#: src/cats/sqlite.c:215 -msgid "unknown" -msgstr "" +#~ msgid "Error writing bsr file.\n" +#~ msgstr "Fout bij schrijven van bsr bestand.\n" -#: src/console/authenticate.c:119 src/dird/authenticate.c:122 -msgid "" -"Authorization problem: Remote server did not advertise required TLS " -"support.\n" -msgstr "" +#~ msgid "No Volumes found to restore.\n" +#~ msgstr "Geen Volumes gevonden om terug te zetten.\n" -#: src/console/authenticate.c:126 src/dird/authenticate.c:129 -#: src/filed/authenticate.c:102 src/filed/authenticate.c:208 -#: src/stored/authenticate.c:94 src/stored/authenticate.c:187 -#: src/stored/authenticate.c:295 -msgid "Authorization problem: Remote server requires TLS.\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Volumes marked with \"*\" are in the Autochanger.\n" +#~ msgstr "" +#~ "\n" +#~ "Volumes gemarkeerd met \"*\" staan online.\n" -#: src/console/authenticate.c:135 -msgid "TLS negotiation failed\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bacula-dir [-f -s] [-c config_file] [-d debug_level] " +#~ "[config_file]\n" +#~ " -c set configuration file to file\n" +#~ " -d [,] set debug level to , debug tags to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -T set trace on\n" +#~ " -f run in foreground (for debugging)\n" +#~ " -g groupid\n" +#~ " -m print kaboom output (for debugging)\n" +#~ " -r run now\n" +#~ " -s no signals\n" +#~ " -t test - read configuration and exit\n" +#~ " -u userid\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Versie: %s (%s) %s %s %s\n" +#~ "\n" +#~ "Specificatie: tray-monitor [-c configuratiebestand] [-d debug_level]\n" +#~ " -c gebruik configuratiebestand\n" +#~ " -d instellen debug level op \n" +#~ " -dt weergeven tijd in debug output\n" +#~ " -t test - lees configuratie en stop\n" +#~ " -? geef deze melding.\n" +#~ "\n" -#: src/console/authenticate.c:149 -#: src/qt-console/tray-monitor/authenticate.cpp:85 -#, c-format -msgid "Bad response to Hello command: ERR=%s\n" -msgstr "" +#~ msgid "Job" +#~ msgstr "Job" -#: src/console/authenticate.c:156 -#: src/qt-console/tray-monitor/authenticate.cpp:92 -msgid "Director rejected Hello command\n" -msgstr "" +#, fuzzy +#~ msgid "ComponentInfo failed.\n" +#~ msgstr "Opdracht mislukt." -#: src/console/authenticate.c:174 -msgid "" -"Director authorization problem.\n" -"Most likely the passwords do not agree.\n" -"If you are using TLS, there may have been a certificate validation error " -"during the TLS handshake.\n" -"For help, please see " -msgstr "" +#~ msgid "Unable to init job cond variable: ERR=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/console/bbconsjson.c:79 src/console/console.c:118 -#, c-format -msgid "" -"\n" -"%sVersion: " -msgstr "" +#, fuzzy +#~ msgid "Failed to select Storage daemon.\n" +#~ msgstr "Kan de geselecteerde opslag niet vinden." -#: src/console/bbconsjson.c:152 src/dird/bdirjson.c:141 -#: src/filed/bfdjson.c:116 src/stored/bsdjson.c:126 -#, c-format -msgid "Please use valid -l argument: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Client resource \"%s\" does not exist.\n" +#~ msgstr "Fout: Client %s bestaat niet.\n" -#: src/console/bbconsjson.c:213 src/console/console.c:1157 -#: src/dird/bdirjson.c:235 src/dird/dird.c:283 src/dird/dird.c:311 -#: src/dird/dird.c:548 src/dird/dird.c:551 src/filed/bfdjson.c:199 -#: src/filed/filed.c:210 src/qt-console/main.cpp:161 src/stored/bsdjson.c:211 -#: src/stored/stored.c:236 -#, c-format -msgid "Please correct configuration file: %s\n" -msgstr "" +#, fuzzy +#~ msgid "canceled" +#~ msgstr "Backup geannuleerd" -#: src/console/bbconsjson.c:430 src/console/bbconsjson.c:461 -#: src/console/console.c:1347 src/console/console.c:1377 -#: src/dird/bdirjson.c:1163 src/dird/bdirjson.c:1201 src/dird/bdirjson.c:1256 -#: src/dird/dird.c:688 src/dird/dird.c:906 src/dird/dird.c:961 -#: src/dird/dird.c:1168 src/filed/bfdjson.c:483 src/filed/bfdjson.c:526 -#: src/filed/filed.c:379 src/filed/filed.c:579 src/qt-console/main.cpp:218 -#: src/qt-console/main.cpp:248 src/stored/bsdjson.c:494 -#: src/stored/stored.c:362 -msgid "TLS required but not configured in Bacula.\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot create pool \"%s\" in database. ERR=%s" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/console/bbconsjson.c:439 src/console/console.c:1355 -#: src/qt-console/main.cpp:226 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Director \"%s\" in %s. At least one CA certificate store is required.\n" -msgstr "" +#, fuzzy +#~ msgid "Job's NextPool resource" +#~ msgstr "Selecteer Pool" -#: src/console/bbconsjson.c:448 src/console/console.c:1364 -#: src/qt-console/main.cpp:235 -#, c-format -msgid "" -"No Director resource defined in %s\n" -"Without that I don't how to speak to the Director :-(\n" -msgstr "" +#, fuzzy +#~ msgid "Pool's NextPool resource" +#~ msgstr "Selecteer Pool" -#: src/console/bbconsjson.c:468 src/console/console.c:1384 -#: src/qt-console/main.cpp:256 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Console \"%s\" in %s.\n" -msgstr "" +#~ msgid "Job %s waiting %d seconds for scheduled start time.\n" +#~ msgstr "Job %s wacht %d seconde voor de start tijd.\n" -#: src/console/console.c:170 -msgid "input from file" -msgstr "" +#~ msgid "Rescheduled Job %s at %s to re-run in %d seconds (%s).\n" +#~ msgstr "" +#~ "Opnieuw ingeplande Job %s in %s start opnieuw in %d seconden (%s).\n" -#: src/console/console.c:171 -msgid "output to file" -msgstr "" +#~ msgid "previous Job" +#~ msgstr "vorige Job" -#: src/console/console.c:172 -msgid "quit" -msgstr "" +#~ msgid "" +#~ "Job canceled. Attempt to read and write same device.\n" +#~ " Read storage \"%s\" (From %s) -- Write storage \"%s\" (From %s)\n" +#~ msgstr "" +#~ "Job geannuleerd. Er wordt van hetzelfde device gelezen en naar " +#~ "geschreven.\n" +#~ " Lezen van opslag \"%s\" (Van %s) -- Schrijven naar opslag \"%s\" (Van " +#~ "%s)\n" -#: src/console/console.c:173 -msgid "output to file and terminal" -msgstr "" +#~ msgid "Illegal character in Volume name \"%s\"\n" +#~ msgstr "Onjuist karakter in Volume naam \"%s\"\n" -#: src/console/console.c:174 -msgid "sleep specified time" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Created new Volume=\"%s\", Pool=\"%s\", MediaType=\"%s\" in catalog.\n" +#~ msgstr "Nieuw volume \"%s\" aangemaakt in catalogus.\n" -#: src/console/console.c:175 -msgid "print current time" -msgstr "" +#~ msgid "" +#~ "Wanted to create Volume \"%s\", but it already exists. Trying again.\n" +#~ msgstr "" +#~ "Geprobeerd om \"%s\" aan te maken, maar deze bestaat al. Probeer " +#~ "opnieuw.\n" -#: src/console/console.c:176 -msgid "print Console's version" -msgstr "" +#~ msgid "Too many failures. Giving up creating Volume name.\n" +#~ msgstr "Teveel mislukte pogingen. Aanmaken volume naam gestopt.\n" -#: src/console/console.c:177 -msgid "echo command string" -msgstr "" +#, fuzzy +#~ msgid "Snapshot not found\n" +#~ msgstr "Job \"%s\" niet gevonden.\n" -#: src/console/console.c:178 -msgid "encode command string" -msgstr "" +#, fuzzy +#~ msgid "Client resource not found\n" +#~ msgstr "Fout: Client %s bestaat niet.\n" -#: src/console/console.c:179 -msgid "execute an external command" -msgstr "" +#, fuzzy +#~ msgid "No snapshot found\n" +#~ msgstr "Job \"%s\" niet gevonden.\n" -#: src/console/console.c:180 -msgid "exit = quit" -msgstr "" +#, fuzzy +#~ msgid "List snapshots in Catalog" +#~ msgstr "Bestand niet in catalog: %s\n" -#: src/console/console.c:181 #, fuzzy -msgid "send a file to the director" -msgstr "Verbinding naar director opnieuw opzetten" +#~ msgid "Unable to get Snapshot record.\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/console/console.c:182 -msgid "zed_keys = use zed keys instead of bash keys" -msgstr "" +#, fuzzy +#~ msgid "New Comment is: %s\n" +#~ msgstr "Nieuw bestand: %s\n" -#: src/console/console.c:183 -msgid "help listing" -msgstr "" +#, fuzzy +#~ msgid "Snapshot Retention Period" +#~ msgstr "Geef nieuwe retention periode:" -#: src/console/console.c:185 -msgid "set command separator" -msgstr "" +#, fuzzy +#~ msgid "Enter Snapshot Retention period: " +#~ msgstr "Geef nieuwe retention periode:" -#: src/console/console.c:219 -msgid ": is an invalid command\n" -msgstr "" +#, fuzzy +#~ msgid "Current comment is: %s\n" +#~ msgstr "De huidige %s retention periode: %s\n" -#: src/console/console.c:714 -msgid "Illegal separator character.\n" -msgstr "" +#, fuzzy +#~ msgid "Restart a job" +#~ msgstr "Uitvoeren herstel opdracht" -#: src/console/console.c:747 -msgid "Command logic problem\n" -msgstr "" +#, fuzzy +#~ msgid "Resume a job" +#~ msgstr "Uitvoeren herstel opdracht" -#: src/console/console.c:962 -#, c-format -msgid "Can't find %s in Director list\n" -msgstr "" +#, fuzzy +#~ msgid "Failed to set bandwidth limit to Client.\n" +#~ msgstr "Kan de geselecteerde client niet vinden." -#: src/console/console.c:970 -msgid "Available Directors:\n" -msgstr "" +#, fuzzy +#~ msgid "Client \"%s\" %sabled\n" +#~ msgstr "Opdracht mislukt." -#: src/console/console.c:974 -#, c-format -msgid "%2d: %s at %s:%d\n" -msgstr "" +#~ msgid "Storage" +#~ msgstr "Opslag" -#: src/console/console.c:978 -msgid "Select Director by entering a number: " -msgstr "" +#~ msgid "Client" +#~ msgstr "Client" -#: src/console/console.c:985 -#, c-format -msgid "%s is not a number. You must enter a number between 1 and %d\n" -msgstr "" +#~ msgid "Job \"%s\" not found.\n" +#~ msgstr "Job \"%s\" niet gevonden.\n" -#: src/console/console.c:992 -#, c-format -msgid "You must enter a number between 1 and %d\n" -msgstr "" +#~ msgid "Could not find a Catalog resource\n" +#~ msgstr "Kan Catalog medium niet vinden\n" -#: src/console/console.c:1153 src/dird/dird.c:279 src/filed/filed.c:205 -#: src/qt-console/main.cpp:157 src/stored/stored.c:232 -#: src/stored/test-dedup.c:836 src/stored/tune-dde.c:330 -msgid "Cryptography library initialization failed.\n" -msgstr "" +#, fuzzy +#~ msgid "Command line" +#~ msgstr "Onjuiste opdrachtregel optie" -#: src/console/console.c:1188 -#, c-format -msgid "Connecting to Director %s:%d\n" -msgstr "" +#, fuzzy +#~ msgid "Invalid keyword found: %s\n" +#~ msgstr "Onjuiste periode.\n" -#: src/console/console.c:1205 src/qt-console/bcomm/dircomm.cpp:151 -#, c-format -msgid "Failed to initialize TLS context for Console \"%s\".\n" -msgstr "" +#, fuzzy +#~ msgid "Failed to send command to Client.\n" +#~ msgstr "Kan de geselecteerde client niet vinden." -#: src/console/console.c:1225 src/qt-console/bcomm/dircomm.cpp:174 -#, c-format -msgid "Failed to initialize TLS context for Director \"%s\".\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to get Job record for Job=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/console/console.c:1259 -msgid "Enter a period to cancel a command.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to get last Job record for Job=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/console/console.c:1410 -msgid "Too many arguments on input command.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to get Client record for Client=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/console/console.c:1414 -msgid "First argument to input command must be a filename.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to get last Job record for Client=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/console/console.c:1420 -#, c-format -msgid "Cannot open file %s for input. ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "No Volumes found to perform \"truncate\" command.\n" +#~ msgstr "Geen Volumes gevonden om terug te zetten.\n" -#: src/console/console.c:1452 -msgid "Too many arguments on output/tee command.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to create component file %s. ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/console/console.c:1469 -#, c-format -msgid "Cannot open file %s for output. ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to fdopen component file %s. ERR=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/console/console.c:1488 -msgid "Too many arguments. Enclose command in double quotes.\n" -msgstr "" +#, fuzzy +#~ msgid "Error writing component file.\n" +#~ msgstr "Fout bij schrijven van bsr bestand.\n" -#: src/console/console.c:1497 -#, c-format -msgid "Cannot popen(\"%s\", \"r\"): ERR=%s\n" -msgstr "" +#~ msgid "The defined FileSet resources are:\n" +#~ msgstr "De gedefinieerde Fileset media zijn:\n" -#: src/console/console.c:1509 -#, fuzzy, c-format -msgid "@exec error: ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" +#~ msgid "Select FileSet resource" +#~ msgstr "Selecteer FileSet bron" -#: src/console/console.c:1542 -msgid "The String to encode is too long\n" -msgstr "" +#, fuzzy +#~ msgid "NextPool \"%s\" not found.\n" +#~ msgstr "Job \"%s\" niet gevonden.\n" -#: src/console/console_conf.c:130 src/qt-console/bat_conf.cpp:131 -#, c-format -msgid "No record for %d %s\n" -msgstr "" +#, fuzzy +#~ msgid "No authorization. NextPool \"%s\".\n" +#~ msgstr "Geen toegang tot Pool \"%s\"\n" -#: src/console/console_conf.c:139 -#, c-format -msgid "Console: name=%s rcfile=%s histfile=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Enter the JobId list to select: " +#~ msgstr "Voer de gekozen Job in:" -#: src/console/console_conf.c:143 src/qt-console/bat_conf.cpp:140 -#, c-format -msgid "Director: name=%s address=%s DIRport=%d\n" -msgstr "" +#~ msgid "You have the following choices:\n" +#~ msgstr "U heeft de volgende keuzes:\n" -#: src/console/console_conf.c:147 src/console/console_conf.c:227 -#: src/console/console_conf.c:268 src/console/console_conf.c:295 -#: src/filed/filed_conf.c:422 src/filed/filed_conf.c:486 -#: src/filed/filed_conf.c:516 src/qt-console/bat_conf.cpp:151 -#: src/qt-console/bat_conf.cpp:233 src/qt-console/bat_conf.cpp:279 -#: src/qt-console/bat_conf.cpp:309 src/stored/stored_conf.c:575 -#: src/stored/stored_conf.c:662 src/stored/stored_conf.c:697 -#, c-format -msgid "Unknown resource type %d\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to use current plugin configuration, discarding it." +#~ msgstr "Kan configuratiebestand niet lezen" -#: src/console/console_conf.c:249 src/dird/dird_conf.c:1466 -#: src/dird/dird_conf.c:1481 src/filed/filed_conf.c:447 -#: src/qt-console/bat_conf.cpp:257 -#: src/qt-console/tray-monitor/tray_conf.cpp:274 -#, c-format -msgid "%s item is required in %s resource, but not found.\n" -msgstr "" +#, fuzzy +#~ msgid "Plugin Restore Options\n" +#~ msgstr "Uitvoeren herstel opdracht" -#: src/dird/admin.c:54 -#, c-format -msgid "Start Admin JobId %d, Job=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Use above plugin configuration? (yes/mod/no): " +#~ msgstr "Doorgaan? (ja, wijz, nee):" -#: src/dird/admin.c:79 src/dird/backup.c:801 src/dird/mac.c:719 -#: src/dird/vbackup.c:362 -#, c-format -msgid "Error getting Job record for Job report: ERR=%s" -msgstr "" +#~ msgid "Pool" +#~ msgstr "Pool" -#: src/dird/admin.c:87 -msgid "Admin OK" -msgstr "" +#, fuzzy +#~ msgid "NextPool" +#~ msgstr "Pool" -#: src/dird/admin.c:91 -msgid "*** Admin Error ***" -msgstr "*** Admin Fout ***" +#, fuzzy +#~ msgid "Command input" +#~ msgstr "Onjuiste opdrachtregel optie" -#: src/dird/admin.c:95 -msgid "Admin Canceled" -msgstr "Admin geannuleerd" +#~ msgid "The current %s retention period is: %s\n" +#~ msgstr "De huidige %s retention periode: %s\n" -#: src/dird/admin.c:99 src/dird/backup.c:857 src/dird/restore.c:671 -#: src/dird/vbackup.c:412 -#, c-format -msgid "Inappropriate term code: %c\n" -msgstr "" +#, fuzzy +#~ msgid "Continue? (yes/no): " +#~ msgstr "Doorgaan? (ja, wijz, nee):" -#: src/dird/admin.c:107 src/lib/status.h:205 src/lib/status.h:216 -#: src/lib/status.h:230 src/lib/status.h:234 src/lib/status.h:238 -msgid "Bacula " -msgstr "" +#~ msgid "Continue? (yes/mod/no): " +#~ msgstr "Doorgaan? (ja, wijz, nee):" -#: src/dird/authenticate.c:78 src/dird/authenticate.c:79 -#: src/qt-console/tray-monitor/authenticate.cpp:120 -#, c-format -msgid "Error sending Hello to Storage daemon. ERR=%s\n" -msgstr "" +#~ msgid "Enter new retention period: " +#~ msgstr "Geef nieuwe retention periode:" -#: src/dird/authenticate.c:108 -msgid "Director and Storage daemon passwords or names not the same.\n" -msgstr "" +#~ msgid "Invalid period.\n" +#~ msgstr "Onjuiste periode.\n" -#: src/dird/authenticate.c:110 -#, c-format -msgid "" -"Director unable to authenticate with Storage daemon at \"%s:%d\". Possible " -"causes:\n" -"Passwords or names not the same or\n" -"Maximum Concurrent Jobs exceeded on the SD or\n" -"SD networking messed up (restart daemon).\n" -"For help, please see: " -msgstr "" +#~ msgid "The defined Storage resources are:\n" +#~ msgstr "De gedefinieerde Opslag media zijn:\n" -#: src/dird/authenticate.c:138 -#, c-format -msgid "TLS negotiation failed with SD at \"%s:%d\"\n" -msgstr "" +#~ msgid "Select Storage resource" +#~ msgstr "Selecteer opslag medium" -#: src/dird/authenticate.c:150 -#, c-format -msgid "bdird\" command before continuing.\n" +#~ msgstr "" +#~ "U diente een \"use \" te specificeren alvorens te kunnen " +#~ "doorgaan.\n" -#: src/dird/authenticate.c:159 -#: src/qt-console/tray-monitor/authenticate.cpp:140 -msgid "Storage daemon rejected Hello command\n" -msgstr "" +#~ msgid "The defined Catalog resources are:\n" +#~ msgstr "De gedefinieerde Catalog media zijn:\n" -#: src/dird/authenticate.c:160 -#, c-format -msgid "Storage daemon at \"%s:%d\" rejected Hello command\n" -msgstr "" +#~ msgid "Select Catalog resource" +#~ msgstr "Selecteer Catalog media" -#: src/dird/authenticate.c:196 src/dird/authenticate.c:198 -#, c-format -msgid "Error sending Hello to File daemon at \"%s:%d\". ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "The disabled Job resources are:\n" +#~ msgstr "De gedefinieerde job resources zijn:\n" -#: src/dird/authenticate.c:228 -msgid "Director and File daemon passwords or names not the same.\n" -msgstr "" +#, fuzzy +#~ msgid "The enabled Job resources are:\n" +#~ msgstr "De gedefinieerde job resources zijn:\n" -#: src/dird/authenticate.c:230 -#, c-format -msgid "" -"Unable to authenticate with File daemon at \"%s:%d\". Possible causes:\n" -"Passwords or names not the same or\n" -"Maximum Concurrent Jobs exceeded on the FD or\n" -"FD networking messed up (restart daemon).\n" -"For help, please see: " -msgstr "" +#~ msgid "Select Job resource" +#~ msgstr "Selecteer Job media:" -#: src/dird/authenticate.c:242 -#, c-format -msgid "" -"Authorization problem: FD \"%s:%s\" did not advertise required TLS support.\n" -msgstr "" +#~ msgid "The defined Job resources are:\n" +#~ msgstr "De gedefinieerde job resources zijn:\n" -#: src/dird/authenticate.c:250 -#, c-format -msgid "Authorization problem: FD at \"%s:%d\" requires TLS.\n" -msgstr "" +#~ msgid "Select Restore Job" +#~ msgstr "Selecteer Job om terug te zetten" -#: src/dird/authenticate.c:260 -#, c-format -msgid "TLS negotiation failed with FD at \"%s:%d\".\n" -msgstr "" +#~ msgid "The defined Client resources are:\n" +#~ msgstr "De gedefinieerde Clients zijn:\n" -#: src/dird/authenticate.c:272 -#: src/qt-console/tray-monitor/authenticate.cpp:179 -#, c-format -msgid "Bad response from File daemon to Hello command: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Select Client resource" +#~ msgstr "Selecteer FileSet bron" -#: src/dird/authenticate.c:274 -#, c-format -msgid "Bad response from File daemon at \"%s:%d\" to Hello command: ERR=%s\n" -msgstr "" +#~ msgid "Select Client (File daemon) resource" +#~ msgstr "Selecteer een Client (File daemon)" -#: src/dird/authenticate.c:283 -#: src/qt-console/tray-monitor/authenticate.cpp:186 -msgid "File daemon rejected Hello command\n" -msgstr "" +#~ msgid "Error: Client resource %s does not exist.\n" +#~ msgstr "Fout: Client %s bestaat niet.\n" -#: src/dird/authenticate.c:284 -#, c-format -msgid "File daemon at \"%s:%d\" rejected Hello command\n" -msgstr "" +#, fuzzy +#~ msgid "The defined Schedule resources are:\n" +#~ msgstr "De gedefinieerde Clients zijn:\n" -#: src/dird/authenticate.c:316 -#, c-format -msgid "UA Hello from %s:%s:%d is invalid. Len=%d\n" -msgstr "" +#, fuzzy +#~ msgid "Select Schedule resource" +#~ msgstr "Selecteer Pool" -#: src/dird/authenticate.c:324 -#, c-format -msgid "UA Hello from %s:%s:%d is invalid. Got: %s\n" -msgstr "" +#~ msgid "Could not find Client %s: ERR=%s" +#~ msgstr "Kan Client niet vinden %s: ERR=%s" -#: src/dird/authenticate.c:398 -msgid "" -"Authorization problem: Remote client did not advertise required TLS " -"support.\n" -msgstr "" +#~ msgid "Could not find Client \"%s\": ERR=%s" +#~ msgstr "Kan Client niet vinden \"%s\": ERR=%s" -#: src/dird/authenticate.c:406 -msgid "Authorization problem: Remote client requires TLS.\n" -msgstr "" +#~ msgid "Defined Clients:\n" +#~ msgstr "Gedefinieerde Clients:\n" -#: src/dird/authenticate.c:421 src/filed/authenticate.c:111 -#: src/filed/authenticate.c:217 src/stored/authenticate.c:304 -msgid "TLS negotiation failed.\n" -msgstr "" +#~ msgid "Select the Client" +#~ msgstr "Selecteer Client" -#: src/dird/authenticate.c:435 -#, c-format -msgid "Unable to authenticate console \"%s\" at %s:%s:%d.\n" -msgstr "" +#~ msgid "Defined Pools:\n" +#~ msgstr "Gedefinieerde Pools:\n" -#: src/dird/authenticate.c:440 -#, c-format -msgid "1000 OK: %d %s %sVersion: %s (%s)\n" -msgstr "" +#~ msgid "Select the Pool" +#~ msgstr "Selecteer Pool" -#: src/dird/autoprune.c:65 -msgid "" -"End auto prune.\n" -"\n" -msgstr "" +#~ msgid "No access to Pool \"%s\"\n" +#~ msgstr "Geen toegang tot Pool \"%s\"\n" -#: src/dird/backup.c:97 src/dird/job.c:199 src/dird/job.c:1220 -#: src/dird/job.c:1497 src/dird/job.c:1544 src/dird/job.c:1568 -#: src/dird/mac.c:216 src/dird/mac.c:217 src/dird/vbackup.c:78 -msgid "Pool resource" -msgstr "" +#, fuzzy +#~ msgid "Enter a Volume name or *MediaId: " +#~ msgstr "Voer *MediaId of Volume naam in:" -#: src/dird/backup.c:100 -msgid "No Storage specification found in Job or Pool.\n" -msgstr "" +#~ msgid "Select Pool resource" +#~ msgstr "Selecteer Pool" -#: src/dird/backup.c:261 -#, c-format -msgid "Using BaseJobId(s): %s\n" -msgstr "" +#~ msgid "Enter the JobId to select: " +#~ msgstr "Voer de gekozen Job in:" -#: src/dird/backup.c:271 -msgid "Cannot find previous jobids.\n" -msgstr "" +#~ msgid "Could not find Job \"%s\": ERR=%s" +#~ msgstr "Kan Job niet vinden \"%s\": ERR=%s" -#: src/dird/backup.c:286 -msgid "Sending Accurate information to the FD.\n" -msgstr "" +#~ msgid "Please enter a number between 1 and %d\n" +#~ msgstr "Voer een nummer in tussen 1 en %d\n" -#: src/dird/backup.c:444 -#, c-format -msgid "Restart Incomplete Backup JobId %s, Job=%s\n" -msgstr "" +#~ msgid "JobId %s is not running.\n" +#~ msgstr "JobID %s is niet in uitvoering.\n" -#: src/dird/backup.c:447 -#, c-format -msgid "Start Backup JobId %s, Job=%s\n" -msgstr "" +#~ msgid "Job \"%s\" is not running.\n" +#~ msgstr "Job \"%s\" is niet in uitvoering.\n" -#: src/dird/backup.c:463 -#, c-format -msgid "Found %ld files from prior incomplete Job.\n" -msgstr "" +#~ msgid "Enter autochanger drive[0]: " +#~ msgstr "Voer autochanger drive[0] in: " -#: src/dird/backup.c:557 src/dird/restore.c:409 src/dird/verify.c:276 -msgid "The File daemon does not support SDCallsClient.\n" -msgstr "" +#~ msgid "Enter autochanger slot: " +#~ msgstr "Voer autochanger slot in:" -#: src/dird/backup.c:690 -#, c-format -msgid "Unexpected Client Job message: %s\n" -msgstr "" +#~ msgid "Media Type" +#~ msgstr "Type media" -#: src/dird/backup.c:703 -#, c-format -msgid "Network error with FD during %s: ERR=%s\n" -msgstr "" +#~ msgid "Select the Media Type" +#~ msgstr "Selecteer media type" -#: src/dird/backup.c:739 -msgid "No Job status returned from FD.\n" -msgstr "" +#~ msgid "No Jobs running.\n" +#~ msgstr "Geen Jobs in uitvoering.\n" -#: src/dird/backup.c:808 src/dird/vbackup.c:369 -#, c-format -msgid "Error getting Client record for Job report: ERR=%s" -msgstr "" +#~ msgid "None of your jobs are running.\n" +#~ msgstr "Geen van uw opdrachten zijn in uitvoering.\n" -#: src/dird/backup.c:814 src/dird/mac.c:749 src/dird/vbackup.c:375 -#, c-format -msgid "Error getting Media record for Volume \"%s\": ERR=%s" -msgstr "" +#, fuzzy +#~ msgid "Warning Job JobId=%d is not running.\n" +#~ msgstr "JobID %s is niet in uitvoering.\n" -#: src/dird/backup.c:824 src/dird/backup.c:833 src/dird/vbackup.c:385 -#: src/stored/bscan.c:1199 -msgid "Backup OK -- with warnings" -msgstr "Backup OK -- met waarschuwingen" +#, fuzzy +#~ msgid "Confirm %s of %d Job%s (yes/no): " +#~ msgstr "Bevestig annulering (yes/no)" -#: src/dird/backup.c:826 src/dird/vbackup.c:387 src/stored/bscan.c:1196 -msgid "Backup OK" -msgstr "" +#, fuzzy +#~ msgid "Warning Job %s is not running.\n" +#~ msgstr "JobID %s is niet in uitvoering.\n" -#: src/dird/backup.c:830 -msgid "Backup failed -- incomplete" -msgstr "" +#, fuzzy +#~ msgid "Select Job(s):\n" +#~ msgstr "Selecteer Job:\n" -#: src/dird/backup.c:837 src/dird/vbackup.c:392 src/stored/bscan.c:1203 -msgid "*** Backup Error ***" -msgstr "*** Backup Fout ***" +#, fuzzy +#~ msgid "Choose Job list to %s" +#~ msgstr "Voer de gekozen Job in:" -#: src/dird/backup.c:847 src/dird/vbackup.c:402 src/stored/bscan.c:1206 -msgid "Backup Canceled" -msgstr "Backup geannuleerd" +#~ msgid "You have messages.\n" +#~ msgstr "U heeft berichten.\n" -#: src/dird/backup.c:916 -#, c-format -msgid " Base files/Used files: %lld/%lld (%.2f%%)\n" -msgstr "" +#, fuzzy +#~ msgid "Console connected %sat %s\n" +#~ msgstr "Al verbonden\"%s\".\n" -#: src/dird/backup.c:923 src/dird/mac.c:822 -#, c-format -msgid "meta: %s (%sB) aligned: %s (%sB)" -msgstr "" +#, fuzzy +#~ msgid "is waiting for its start time (%s)" +#~ msgstr "Job %s wacht %d seconde voor de start tijd.\n" -#: src/dird/backup.c:929 src/dird/mac.c:828 -#, c-format -msgid "%s (%sB)" -msgstr "" +#~ msgid "Verify OK" +#~ msgstr "Controle OK" -#: src/dird/backup.c:936 -#, c-format -msgid "" -"%s %s %s (%s):\n" -" Build OS: %s %s %s\n" -" JobId: %d\n" -" Job: %s\n" -" Backup Level: %s%s\n" -" Client: \"%s\" %s\n" -" FileSet: \"%s\" %s\n" -" Pool: \"%s\" (From %s)\n" -" Catalog: \"%s\" (From %s)\n" -" Storage: \"%s\" (From %s)\n" -" Scheduled time: %s\n" -" Start time: %s\n" -" End time: %s\n" -" Elapsed time: %s\n" -" Priority: %d\n" -" FD Files Written: %s\n" -" SD Files Written: %s\n" -" FD Bytes Written: %s (%sB)\n" -" SD Bytes Written: %s (%sB)\n" -" Rate: %.1f KB/s\n" -" Software Compression: %s\n" -" Comm Line Compression: %s\n" -"%s Snapshot/VSS: %s\n" -" Encryption: %s\n" -" Accurate: %s\n" -" Volume name(s): %s\n" -" Volume Session Id: %d\n" -" Volume Session Time: %d\n" -" Last Volume Bytes: %s\n" -" Non-fatal FD errors: %d\n" -" SD Errors: %d\n" -" FD termination status: %s\n" -" SD termination status: %s\n" -" Termination: %s\n" -"\n" -msgstr "" +#~ msgid "*** Verify Error ***" +#~ msgstr "*** Fout bij controleren ***" -#: src/dird/backup.c:996 src/dird/backup.c:997 src/dird/backup.c:998 -#: src/dird/ua_input.c:142 src/dird/ua_run.c:188 src/dird/ua_run.c:833 -#: src/dird/ua_update.c:256 src/dird/ua_update.c:276 src/dird/ua_update.c:698 -#: src/stored/parse_bsr.c:828 src/tools/dbcheck.c:1124 -msgid "yes" -msgstr "" +#~ msgid "New file: %s\n" +#~ msgstr "Nieuw bestand: %s\n" -#: src/dird/backup.c:996 src/dird/backup.c:997 src/dird/backup.c:998 -#: src/dird/ua_input.c:146 src/dird/ua_run.c:191 src/dird/ua_run.c:837 -#: src/dird/ua_update.c:256 src/dird/ua_update.c:276 src/dird/ua_update.c:698 -#: src/stored/parse_bsr.c:828 -msgid "no" -msgstr "" +#~ msgid "File not in catalog: %s\n" +#~ msgstr "Bestand niet in catalog: %s\n" -#: src/dird/backup.c:1039 -#, c-format -msgid "Could not get Job Volume Parameters to update Bootstrap file. ERR=%s\n" -msgstr "" +#~ msgid " st_ino differ. Cat: %s File: %s\n" +#~ msgstr " st_ino verschil. Cat: %s Bestand: %s\n" -#: src/dird/backup.c:1075 -#, c-format -msgid "" -"Could not open WriteBootstrap file:\n" -"%s: ERR=%s\n" -msgstr "" +#~ msgid " st_mode differ. Cat: %x File: %x\n" +#~ msgstr " st_mode verschil. Cat: %x Bestand: %x\n" -#: src/dird/bdirjson.c:69 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bdirjson [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -r get resource type \n" -" -n get resource \n" -" -l get only directives matching dirs (use with -r)\n" -" -D get only data\n" -" -R do not apply JobDefs to Job\n" -" -c set configuration file to file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -t test - read configuration and exit\n" -" -s output in show text format\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Versie: %s (%s) %s %s %s\n" -"\n" -"Specificatie: tray-monitor [-c configuratiebestand] [-d debug_level]\n" -" -c gebruik configuratiebestand\n" -" -d instellen debug level op \n" -" -dt weergeven tijd in debug output\n" -" -t test - lees configuratie en stop\n" -" -? geef deze melding.\n" -"\n" +#~ msgid " st_nlink differ. Cat: %d File: %d\n" +#~ msgstr " st_nlink verschil. Cat: %d Bestand: %d\n" -#: src/dird/bdirjson.c:1141 src/dird/dird.c:666 -#, c-format -msgid "" -"No Director resource defined in %s\n" -"Without that I don't know who I am :-(\n" -msgstr "" +#~ msgid " st_uid differ. Cat: %u File: %u\n" +#~ msgstr " st_uid verschil. Cat: %u Bestand: %u\n" -#: src/dird/bdirjson.c:1149 src/dird/dird.c:674 src/filed/bfdjson.c:476 -#: src/filed/filed.c:341 -#, c-format -msgid "No Messages resource defined in %s\n" -msgstr "" +#~ msgid " st_gid differ. Cat: %u File: %u\n" +#~ msgstr " st_gid verschil. Cat: %u Bestand: %u\n" -#: src/dird/bdirjson.c:1154 src/dird/dird.c:679 -#, c-format -msgid "Only one Director resource permitted in %s\n" -msgstr "" +#~ msgid " st_size differ. Cat: %s File: %s\n" +#~ msgstr " st_size verschil. Cat: %s Bestand: %s\n" -#: src/dird/bdirjson.c:1171 src/dird/dird.c:696 src/filed/bfdjson.c:536 -#: src/filed/filed.c:589 src/stored/bsdjson.c:533 src/stored/stored.c:418 -#, c-format -msgid "\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n" -msgstr "" +#~ msgid " st_atime differs\n" +#~ msgstr " st_atime verschilt\n" -#: src/dird/bdirjson.c:1177 src/dird/dird.c:702 src/filed/bfdjson.c:542 -#: src/filed/filed.c:595 src/stored/bsdjson.c:539 src/stored/stored.c:424 -#, c-format -msgid "\"TLS Key\" file not defined for Director \"%s\" in %s.\n" -msgstr "" +#~ msgid " st_mtime differs\n" +#~ msgstr " st_mtime verschilt\n" -#: src/dird/bdirjson.c:1184 src/dird/dird.c:709 src/filed/bfdjson.c:548 -#: src/filed/filed.c:601 src/stored/bsdjson.c:545 src/stored/stored.c:430 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Director \"%s\" in %s. At least one CA certificate store is required when " -"using \"TLS Verify Peer\".\n" -msgstr "" +#~ msgid " st_ctime differs\n" +#~ msgstr " st_ctime verschilt\n" -#: src/dird/bdirjson.c:1210 src/dird/dird.c:915 -#, c-format -msgid "\"TLS Certificate\" file not defined for Console \"%s\" in %s.\n" -msgstr "" +#~ msgid "File: %s\n" +#~ msgstr "Bestand: %s\n" -#: src/dird/bdirjson.c:1216 src/dird/dird.c:921 -#, c-format -msgid "\"TLS Key\" file not defined for Console \"%s\" in %s.\n" -msgstr "" +#, fuzzy +#~ msgid "pioctl VIOCGETAL error on file \"%s\": ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/dird/bdirjson.c:1223 src/dird/dird.c:928 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Console \"%s\" in %s. At least one CA certificate store is required when " -"using \"TLS Verify Peer\".\n" -msgstr "" +#, fuzzy +#~ msgid "pioctl VIOCSETAL error on file \"%s\": ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/dird/bdirjson.c:1240 src/dird/dird.c:945 src/dird/dird.c:985 -#: src/filed/filed.c:404 -#, c-format -msgid "Failed to initialize TLS context for File daemon \"%s\" in %s.\n" -msgstr "" +#~ msgid "Read error on file %s. ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/dird/bdirjson.c:1263 src/dird/dird.c:968 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"File daemon \"%s\" in %s.\n" -msgstr "" +#~ msgid "Too many errors. JobErrors=%d.\n" +#~ msgstr "Te veel fouten. OpdrachtFouten=%d.\n" -#: src/dird/bdirjson.c:1272 src/dird/dird.c:736 -#, c-format -msgid "No Job records defined in %s\n" -msgstr "" +#~ msgid "Encryption error\n" +#~ msgstr "Fout in versleuteling \n" -#: src/dird/bdirjson.c:1339 src/dird/bdirjson.c:1352 src/dird/dird.c:805 -#: src/dird/dird.c:818 -#, c-format -msgid "Hey something is wrong. p=0x%lu\n" -msgstr "" +#, fuzzy +#~ msgid "Network send error to SD. Data=%s ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/dird/bdirjson.c:1413 src/dird/dird.c:880 -#, c-format -msgid "\"%s\" directive in Job \"%s\" resource is required, but not found.\n" -msgstr "" +#~ msgid "Compression LZO error: %d\n" +#~ msgstr "Compressie LZO fout: %d\n" -#: src/dird/bdirjson.c:1420 src/dird/dird.c:887 -msgid "Too many items in Job resource\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bfdjson [-c config_file] [-d debug_level]\n" +#~ " -r get resource type \n" +#~ " -n get resource \n" +#~ " -l get only directives matching dirs (use with -r)\n" +#~ " -D get only data\n" +#~ " -c use as configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print a timestamp in debug output\n" +#~ " -t test configuration file and exit\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Versie: %s (%s) %s %s %s\n" +#~ "\n" +#~ "Specificatie: tray-monitor [-c configuratiebestand] [-d debug_level]\n" +#~ " -c gebruik configuratiebestand\n" +#~ " -d instellen debug level op \n" +#~ " -dt weergeven tijd in debug output\n" +#~ " -t test - lees configuratie en stop\n" +#~ " -? geef deze melding.\n" +#~ "\n" -#: src/dird/bdirjson.c:1424 src/dird/dird.c:891 -#, c-format -msgid "No storage specified in Job \"%s\" nor in Pool.\n" -msgstr "" +#, fuzzy +#~ msgid "Error while creating command string %s.\n" +#~ msgstr "" +#~ "Fout bij verwerken van opdrachtregel variabelen, maak nu gebruik van " +#~ "standaard instelling.\n" -#: src/dird/bsr.c:190 -#, c-format -msgid "Unable to get Job record. ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to create snapshot record. ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/dird/bsr.c:201 -#, c-format -msgid "Unable to get Job Volume Parameters. ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to create snapshot record, got %s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/dird/bsr.c:249 -#, c-format -msgid "Unable to create bootstrap file %s. ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to delete snapshot record. ERR=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/dird/bsr.c:258 -msgid "No files found to read. No bootstrap file written.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to delete snapshot record, got %s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/dird/bsr.c:262 -msgid "Error writing bsr file.\n" -msgstr "Fout bij schrijven van bsr bestand.\n" +#, fuzzy +#~ msgid "Unable to get snapshot record. ERR=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/dird/bsr.c:313 -msgid "" -"The Job will require the following (*=>InChanger):\n" -" Volume(s) Storage(s) SD Device(s)\n" -"===========================================================================\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to get snapshot record, got %s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/dird/bsr.c:333 -msgid "No Volumes found to restore.\n" -msgstr "Geen Volumes gevonden om terug te zetten.\n" +#, fuzzy +#~ msgid "Unable to parse command output\n" +#~ msgstr "Kan de geselecteerde client niet vinden." -#: src/dird/bsr.c:335 #, fuzzy -msgid "" -"\n" -"Volumes marked with \"*\" are in the Autochanger.\n" -msgstr "" -"\n" -"Volumes gemarkeerd met \"*\" staan online.\n" +#~ msgid " Unable to delete snapshot of %s ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/dird/catreq.c:128 src/dird/catreq.c:382 -#, c-format -msgid "1990 Invalid Catalog Request: %s" -msgstr "" +#, fuzzy +#~ msgid " Create Snapshot for %s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/dird/catreq.c:129 -#, c-format -msgid "Invalid Catalog request; DB not open: %s" -msgstr "" +#, fuzzy +#~ msgid " Unable to create snapshot of %s ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/dird/catreq.c:150 -#, c-format -msgid "Pool \"%s\" not found for SD find media request.\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bacula-fd [-f -s] [-c config_file] [-d debug_level]\n" +#~ " -c use as configuration file\n" +#~ " -d [,] set debug level to , debug tags to \n" +#~ " -dt print a timestamp in debug output\n" +#~ " -f run in foreground (for debugging)\n" +#~ " -g groupid\n" +#~ " -k keep readall capabilities\n" +#~ " -m print kaboom output (for debugging)\n" +#~ " -s no signals (for debugging)\n" +#~ " -t test configuration file and exit\n" +#~ " -T set trace on\n" +#~ " -u userid\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Versie: %s (%s) %s %s %s\n" +#~ "\n" +#~ "Specificatie: tray-monitor [-c configuratiebestand] [-d debug_level]\n" +#~ " -c gebruik configuratiebestand\n" +#~ " -d instellen debug level op \n" +#~ " -dt weergeven tijd in debug output\n" +#~ " -t test - lees configuratie en stop\n" +#~ " -? geef deze melding.\n" +#~ "\n" -#: src/dird/catreq.c:159 -msgid "1901 No Media.\n" -msgstr "" +#, fuzzy +#~ msgid "Disable Command \"%s\" not found.\n" +#~ msgstr "Job \"%s\" niet gevonden.\n" -#: src/dird/catreq.c:191 -msgid "not in Pool" -msgstr "" +#, fuzzy +#~ msgid "Connection from unknown Director %s at %s rejected.\n" +#~ msgstr "" +#~ "Verbinden met Director %s:%d\n" +#~ "\n" -#: src/dird/catreq.c:193 -msgid "not correct MediaType" -msgstr "" +#, fuzzy +#~ msgid "SD \"%s\" tried to connect two times.\n" +#~ msgstr "Verbinden met de director mislukt\n" -#: src/dird/catreq.c:203 -msgid "is not Enabled" -msgstr "" +#, fuzzy +#~ msgid "Recv caps from SD failed. ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/dird/catreq.c:212 -#, c-format -msgid "1998 Volume \"%s\" catalog status is %s, %s.\n" -msgstr "" +#, fuzzy +#~ msgid "Command: \"%s\" is disabled.\n" +#~ msgstr "Opdracht mislukt." -#: src/dird/catreq.c:217 -#, c-format -msgid "1997 Volume \"%s\" not in catalog.\n" -msgstr "" +#, fuzzy +#~ msgid "VSS CreateSnapshots failed. ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/dird/catreq.c:244 -#, c-format -msgid "Unable to get Media record for Volume %s: ERR=%s\n" -msgstr "" +#~ msgid "LZO init failed\n" +#~ msgstr "Initialiseren LZO mislukt\n" -#: src/dird/catreq.c:246 -#, c-format -msgid "1991 Catalog Request for vol=%s failed: %s" -msgstr "" +#~ msgid "Zlib errno" +#~ msgstr "Zlib foutnr." -#: src/dird/catreq.c:273 -#, c-format -msgid "Attempt to set Volume Files from %u to %u for Volume \"%s\". Ignored.\n" -msgstr "" +#~ msgid "Zlib stream error" +#~ msgstr "Zlib datastroom fout" -#: src/dird/catreq.c:332 -#, c-format -msgid "Catalog error updating Media record. %s" -msgstr "" +#~ msgid "Zlib data error" +#~ msgstr "Zlib data fout" -#: src/dird/catreq.c:334 -msgid "1993 Update Media error\n" -msgstr "" +#~ msgid "Zlib memory error" +#~ msgstr "Zlib geheugen fout" -#: src/dird/catreq.c:361 -#, c-format -msgid "Catalog error creating JobMedia record. %s" -msgstr "" +#~ msgid "Zlib buffer error" +#~ msgstr "Zlib buffer fout" -#: src/dird/catreq.c:363 -msgid "1992 Create JobMedia error\n" -msgstr "" +#~ msgid "Zlib version error" +#~ msgstr "Zlib versie fout" -#: src/dird/catreq.c:383 -#, c-format -msgid "Invalid Catalog request: %s" -msgstr "" +#, fuzzy +#~ msgid "Write write error on %s: ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/dird/catreq.c:470 -#, c-format -msgid "Attribute create error: ERR=%s" -msgstr "" +#, fuzzy +#~ msgid "Director connected %sat: %s\n" +#~ msgstr "Director niet verbonden." -#: src/dird/catreq.c:567 -#, c-format -msgid "Restore object create error. %s" -msgstr "" - -#: src/dird/catreq.c:574 -#, c-format -msgid "%s not same File=%d as attributes=%d\n" -msgstr "" - -#: src/dird/catreq.c:601 -#, c-format -msgid "Catalog error updating file digest. Unsupported digest stream type: %d" -msgstr "" - -#: src/dird/catreq.c:616 -#, c-format -msgid "attribute create error. %s" -msgstr "" - -#: src/dird/catreq.c:622 -#, c-format -msgid "Catalog error updating file digest. %s" -msgstr "" - -#: src/dird/catreq.c:645 -#, c-format -msgid "1994 Invalid Catalog Update: %s" -msgstr "" - -#: src/dird/catreq.c:646 -#, c-format -msgid "Invalid Catalog Update; DB not open: %s" -msgstr "" - -#: src/dird/catreq.c:702 src/dird/catreq.c:717 -#, c-format -msgid "fread attr spool error. ERR=%s\n" -msgstr "" - -#: src/dird/dir_plugins.c:170 src/filed/fd_plugins.c:1129 -#: src/stored/sd_plugins.c:221 -#, c-format -msgid "Loaded plugin: %s\n" -msgstr "" - -#: src/dird/dir_plugins.c:190 src/filed/fd_plugins.c:1150 -#: src/stored/sd_plugins.c:241 -#, c-format -msgid "Plugin magic wrong. Plugin=%s wanted=%s got=%s\n" -msgstr "" - -#: src/dird/dir_plugins.c:198 src/filed/fd_plugins.c:1158 -#: src/stored/sd_plugins.c:249 -#, c-format -msgid "Plugin version incorrect. Plugin=%s wanted=%d got=%d\n" -msgstr "" - -#: src/dird/dir_plugins.c:207 src/filed/fd_plugins.c:1168 -#: src/stored/sd_plugins.c:258 -#, c-format -msgid "Plugin license incompatible. Plugin=%s license=%s\n" -msgstr "" - -#: src/dird/dir_plugins.c:215 src/filed/fd_plugins.c:1176 -#: src/stored/sd_plugins.c:266 -#, c-format -msgid "Plugin size incorrect. Plugin=%s wanted=%d got=%d\n" -msgstr "" - -#: src/dird/dird.c:121 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bacula-dir [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c set configuration file to file\n" -" -d [,] set debug level to , debug tags to \n" -" -dt print timestamp in debug output\n" -" -T set trace on\n" -" -f run in foreground (for debugging)\n" -" -g groupid\n" -" -m print kaboom output (for debugging)\n" -" -r run now\n" -" -s no signals\n" -" -t test - read configuration and exit\n" -" -u userid\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Versie: %s (%s) %s %s %s\n" -"\n" -"Specificatie: tray-monitor [-c configuratiebestand] [-d debug_level]\n" -" -c gebruik configuratiebestand\n" -" -d instellen debug level op \n" -" -dt weergeven tijd in debug output\n" -" -t test - lees configuratie en stop\n" -" -? geef deze melding.\n" -"\n" - -#: src/dird/dird.c:502 -msgid "Already doing a reload request, request ignored.\n" -msgstr "" - -#: src/dird/dird.c:526 -msgid "Too many open reload requests. Request ignored.\n" -msgstr "" - -#: src/dird/dird.c:549 -msgid "Out of reload table entries. Giving up.\n" -msgstr "" - -#: src/dird/dird.c:552 -msgid "Resetting previous configuration.\n" -msgstr "" - -#: src/dird/dird.c:728 src/filed/filed.c:620 src/stored/stored.c:449 -#, c-format -msgid "Failed to initialize TLS context for Director \"%s\" in %s.\n" -msgstr "" - -#: src/dird/dird.c:1044 src/dird/dird.c:1046 src/stored/bscan.c:287 -#: src/stored/bscan.c:294 -#, c-format -msgid "Could not open Catalog \"%s\", database \"%s\".\n" -msgstr "" - -#: src/dird/dird.c:1049 src/stored/bscan.c:290 src/tools/cats_test.c:364 -#, c-format -msgid "%s" -msgstr "" - -#: src/dird/dird.c:1149 -#, c-format -msgid "Could not create storage record for %s\n" -msgstr "" - -#: src/dird/dird.c:1157 -#, c-format -msgid "Could not update storage record for %s\n" -msgstr "" - -#: src/dird/dird.c:1176 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Storage \"%s\" in %s.\n" -msgstr "" - -#: src/dird/dird.c:1192 src/stored/stored.c:402 -#, c-format -msgid "Failed to initialize TLS context for Storage \"%s\" in %s.\n" -msgstr "" - -#: src/dird/dird.c:1306 src/dird/mac_sql.c:548 src/stored/stored.c:505 -#, c-format -msgid "Could not compile regex pattern \"%s\" ERR=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:579 src/qt-console/tray-monitor/tray_conf.cpp:158 -#, c-format -msgid "No %s resource defined\n" -msgstr "" - -#: src/dird/dird_conf.c:588 -#, c-format -msgid "Director: name=%s MaxJobs=%d FDtimeout=%s SDtimeout=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:593 -#, c-format -msgid " query_file=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:596 src/dird/dird_conf.c:616 src/dird/dird_conf.c:641 -#: src/dird/dird_conf.c:733 src/dird/dird_conf.c:737 src/dird/dird_conf.c:741 -#: src/dird/dird_conf.c:774 src/dird/dird_conf.c:797 src/dird/dird_conf.c:813 -#: src/dird/dird_conf.c:826 src/dird/dird_conf.c:1069 -#: src/dird/dird_conf.c:1076 -msgid " --> " -msgstr "" - -#: src/dird/dird_conf.c:601 -#, c-format -msgid "Console: name=%s SSL=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:606 -#, c-format -msgid "Counter: name=%s min=%d max=%d cur=%d wrapcntr=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:611 -#, c-format -msgid "Counter: name=%s min=%d max=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:625 -#, c-format -msgid "Client: Name=%s Enabled=%d Address=%s FDport=%d MaxJobs=%u\n" -msgstr "" - -#: src/dird/dird_conf.c:629 -#, c-format -msgid " JobRetention=%s FileRetention=%s AutoPrune=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:637 src/dird/dird_conf.c:726 -#, c-format -msgid " MaximumBandwidth=%lld\n" -msgstr "" - -#: src/dird/dird_conf.c:649 -#, c-format -msgid "" -"Device: name=%s ok=%d num_writers=%d max_writers=%d\n" -" reserved=%d open=%d append=%d read=%d labeled=%d offline=%d autochgr=" -"%d\n" -" poolid=%s volname=%s MediaType=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:664 -#, c-format -msgid "" -"%s: name=%s address=%s SDport=%d MaxJobs=%u\n" -" DeviceName=%s MediaType=%s StorageId=%s Autochanger=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:682 -msgid " Parent --> " -msgstr "" - -#: src/dird/dird_conf.c:687 -msgid " Shared --> " -msgstr "" - -#: src/dird/dird_conf.c:696 -#, c-format -msgid "" -"Catalog: name=%s address=%s DBport=%d db_name=%s\n" -" db_driver=%s db_user=%s MutliDBConn=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:709 -#, c-format -msgid "%s: name=%s JobType=%d level=%s Priority=%d Enabled=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:710 src/dird/ua_prune.c:603 src/dird/ua_run.c:1013 -#: src/dird/ua_select.c:292 src/dird/ua_select.c:315 src/dird/ua_select.c:356 -#: src/dird/ua_select.c:1453 -msgid "Job" -msgstr "Job" - -#: src/dird/dird_conf.c:710 -msgid "JobDefs" -msgstr "" - -#: src/dird/dird_conf.c:714 -#, c-format -msgid "" -" MaxJobs=%u Resched=%d Times=%d Interval=%s Spool=%d WritePartAfterJob=" -"%d\n" -msgstr "" - -#: src/dird/dird_conf.c:720 -#, c-format -msgid " SpoolSize=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:723 -#, c-format -msgid " Accurate=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:730 -#, c-format -msgid " SelectionType=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:745 -#, c-format -msgid " --> Where=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:748 -#, c-format -msgid " --> RegexWhere=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:751 -#, c-format -msgid " --> Bootstrap=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:754 -#, c-format -msgid " --> WriteBootstrap=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:757 -#, c-format -msgid " --> PluginOptions=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:760 -#, c-format -msgid " --> MaxRunTime=%u\n" -msgstr "" - -#: src/dird/dird_conf.c:763 -#, c-format -msgid " --> MaxWaitTime=%u\n" -msgstr "" - -#: src/dird/dird_conf.c:766 -#, c-format -msgid " --> MaxStartDelay=%u\n" -msgstr "" - -#: src/dird/dird_conf.c:769 -#, c-format -msgid " --> MaxRunSchedTime=%u\n" -msgstr "" - -#: src/dird/dird_conf.c:781 -#, c-format -msgid " --> Base %s\n" -msgstr "" - -#: src/dird/dird_conf.c:787 src/lib/runscript.c:286 -msgid " --> RunScript\n" -msgstr "" - -#: src/dird/dird_conf.c:788 src/lib/runscript.c:287 -#, c-format -msgid " --> Command=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:789 src/lib/runscript.c:288 -#, c-format -msgid " --> Target=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:790 src/lib/runscript.c:289 -#, c-format -msgid " --> RunOnSuccess=%u\n" -msgstr "" - -#: src/dird/dird_conf.c:791 src/lib/runscript.c:290 -#, c-format -msgid " --> RunOnFailure=%u\n" -msgstr "" - -#: src/dird/dird_conf.c:792 src/lib/runscript.c:291 -#, c-format -msgid " --> FailJobOnError=%u\n" -msgstr "" - -#: src/dird/dird_conf.c:793 src/lib/runscript.c:292 -#, c-format -msgid " --> RunWhen=%u\n" -msgstr "" - -#: src/dird/dird_conf.c:801 -msgid " --> FullBackup" -msgstr "" - -#: src/dird/dird_conf.c:805 -msgid " --> IncrementalBackup" -msgstr "" - -#: src/dird/dird_conf.c:809 -msgid " --> DifferentialBackup" -msgstr "" - -#: src/dird/dird_conf.c:819 -#, c-format -msgid " --> Run=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:823 -#, c-format -msgid " --> SelectionPattern=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:837 -#, c-format -msgid "FileSet: name=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:931 -#, c-format -msgid "Schedule: Name=%s Enabled=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:937 -#, c-format -msgid " --> Run Level=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:939 -#, c-format -msgid " MaxRunSchedTime=%u\n" -msgstr "" - -#: src/dird/dird_conf.c:942 -#, c-format -msgid " Priority=%u\n" -msgstr "" - -#: src/dird/dird_conf.c:944 -msgid " hour=" -msgstr "" - -#: src/dird/dird_conf.c:953 -msgid " mday=" -msgstr "" - -#: src/dird/dird_conf.c:962 -msgid " month=" -msgstr "" - -#: src/dird/dird_conf.c:971 -msgid " wday=" -msgstr "" - -#: src/dird/dird_conf.c:980 -msgid " wom=" -msgstr "" - -#: src/dird/dird_conf.c:989 -msgid " woy=" -msgstr "" - -#: src/dird/dird_conf.c:998 -#, c-format -msgid " mins=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:1000 src/dird/dird_conf.c:1004 -#: src/dird/dird_conf.c:1008 -msgid " --> " -msgstr "" - -#: src/dird/dird_conf.c:1017 -#, c-format -msgid "Schedule: name=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1025 -#, c-format -msgid "Pool: name=%s PoolType=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1027 -#, c-format -msgid " use_cat=%d use_once=%d cat_files=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:1030 -#, c-format -msgid " max_vols=%d auto_prune=%d VolRetention=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1033 -#, c-format -msgid " VolUse=%s recycle=%d LabelFormat=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1037 -#, c-format -msgid " CleaningPrefix=%s LabelType=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:1039 -#, c-format -msgid " RecyleOldest=%d PurgeOldest=%d ActionOnPurge=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:1043 -#, c-format -msgid " MaxVolJobs=%d MaxVolFiles=%d MaxVolBytes=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1047 -#, c-format -msgid " MigTime=%s MigHiBytes=%s MigLoBytes=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1051 -#, c-format -msgid " JobRetention=%s FileRetention=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1055 -#, c-format -msgid " NextPool=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1058 -#, c-format -msgid " RecyclePool=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1061 -#, c-format -msgid " ScratchPool=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1064 -#, c-format -msgid " Catalog=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1084 -#, c-format -msgid "Messages: name=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1086 -#, c-format -msgid " mailcmd=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1088 -#, c-format -msgid " opcmd=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1092 src/qt-console/tray-monitor/tray_conf.cpp:189 -#, c-format -msgid "Unknown resource type %d in dump_resource.\n" -msgstr "" - -#: src/dird/dird_conf.c:1437 src/qt-console/tray-monitor/tray_conf.cpp:247 -#, c-format -msgid "Unknown resource type %d in free_resource.\n" -msgstr "" - -#: src/dird/dird_conf.c:1472 src/lib/parse_conf.c:259 -#: src/qt-console/tray-monitor/tray_conf.cpp:280 -#, c-format -msgid "Too many items in %s resource\n" -msgstr "" - -#: src/dird/dird_conf.c:1512 -#, c-format -msgid "Cannot find Pool resource %s\n" -msgstr "" - -#: src/dird/dird_conf.c:1523 -#, c-format -msgid "Cannot find Console resource %s\n" -msgstr "" - -#: src/dird/dird_conf.c:1529 src/filed/filed_conf.c:467 -#: src/stored/stored_conf.c:628 -#, c-format -msgid "Cannot find Director resource %s\n" -msgstr "" - -#: src/dird/dird_conf.c:1538 src/stored/stored_conf.c:634 -#, c-format -msgid "Cannot find Storage resource %s\n" -msgstr "" - -#: src/dird/dird_conf.c:1554 -#, c-format -msgid "Cannot find Job resource %s\n" -msgstr "" - -#: src/dird/dird_conf.c:1605 -#, c-format -msgid "Cannot find Counter resource %s\n" -msgstr "" - -#: src/dird/dird_conf.c:1613 src/filed/filed_conf.c:474 -#, c-format -msgid "Cannot find Client resource %s\n" -msgstr "" - -#: src/dird/dird_conf.c:1626 -#, c-format -msgid "Cannot find Schedule resource %s\n" -msgstr "" - -#: src/dird/dird_conf.c:1631 src/dird/dird_conf.c:1697 -#: src/qt-console/tray-monitor/tray_conf.cpp:300 -#: src/qt-console/tray-monitor/tray_conf.cpp:338 -#, c-format -msgid "Unknown resource type %d in save_resource.\n" -msgstr "" - -#: src/dird/dird_conf.c:1714 -#, c-format -msgid "Expected one of: %s, got: %s" -msgstr "" - -#: src/dird/dird_conf.c:1753 -#, c-format -msgid "Could not find Storage Resource %s referenced on line %d : %s\n" -msgstr "" - -#: src/dird/dird_conf.c:1758 -#, c-format -msgid "" -"Attempt to redefine Storage resource \"%s\" referenced on line %d : %s\n" -msgstr "" - -#: src/dird/dird_conf.c:1833 -#, c-format -msgid "Expected a Migration Job Type keyword, got: %s" -msgstr "" - -#: src/dird/dird_conf.c:1859 -#, c-format -msgid "Expected a Job Type keyword, got: %s" -msgstr "" - -#: src/dird/dird_conf.c:1883 -#, c-format -msgid "Expected a Job Level keyword, got: %s" -msgstr "" - -#: src/dird/dird_conf.c:1903 -#, c-format -msgid "Expected a Restore replacement option, got: %s" -msgstr "" - -#: src/dird/dird_conf.c:1955 src/dird/dird_conf.c:2071 src/lib/ini.c:636 -#: src/lib/parse_conf.c:828 src/lib/parse_conf.c:844 -#, c-format -msgid "Expect %s, got: %s" -msgstr "" - -#: src/dird/dird_conf.c:1977 src/lib/parse_conf.c:537 -#, c-format -msgid "Could not find config Resource %s referenced on line %d : %s\n" -msgstr "" - -#: src/dird/dird_conf.c:2111 src/dird/inc_conf.c:701 -#, c-format -msgid "Expecting open brace. Got %s" -msgstr "" - -#: src/dird/dird_conf.c:2125 src/dird/inc_conf.c:370 src/dird/inc_conf.c:716 -#, c-format -msgid "Expecting keyword, got: %s\n" -msgstr "" - -#: src/dird/dird_conf.c:2131 src/dird/inc_conf.c:378 src/dird/inc_conf.c:722 -#: src/lib/parse_conf.c:1037 -#, c-format -msgid "expected an equals, got: %s" -msgstr "" - -#: src/dird/dird_conf.c:2142 src/dird/inc_conf.c:388 src/dird/inc_conf.c:731 -#, c-format -msgid "Keyword %s not permitted in this resource" -msgstr "" - -#: src/dird/expand.c:244 -#, c-format -msgid "Count not update counter %s: ERR=%s\n" -msgstr "" - -#: src/dird/expand.c:416 -#, c-format -msgid "Cannot create var context: ERR=%s\n" -msgstr "" - -#: src/dird/expand.c:421 -#, c-format -msgid "Cannot set var callback: ERR=%s\n" -msgstr "" - -#: src/dird/expand.c:427 -#, c-format -msgid "Cannot set var operate: ERR=%s\n" -msgstr "" - -#: src/dird/expand.c:433 src/dird/expand.c:448 -#, c-format -msgid "Cannot unescape string: ERR=%s\n" -msgstr "" - -#: src/dird/expand.c:441 -#, c-format -msgid "Cannot expand expression \"%s\": ERR=%s\n" -msgstr "" - -#: src/dird/expand.c:459 -#, c-format -msgid "Cannot destroy var context: ERR=%s\n" -msgstr "" - -#: src/dird/fd_cmds.c:81 -msgid "File daemon not defined for current Job\n" -msgstr "" - -#: src/dird/fd_cmds.c:98 -msgid "Client: " -msgstr "" - -#: src/dird/fd_cmds.c:134 -#, c-format -msgid "File daemon \"%s\" rejected Job command: %s\n" -msgstr "" - -#: src/dird/fd_cmds.c:147 -#, c-format -msgid "Error updating Client record. ERR=%s\n" -msgstr "" - -#: src/dird/fd_cmds.c:152 -#, c-format -msgid "FD gave bad response to JobId command: %s\n" -msgstr "" - -#: src/dird/fd_cmds.c:181 src/dird/fd_cmds.c:269 -msgid ", since=" -msgstr "" - -#: src/dird/fd_cmds.c:246 -msgid "No prior or suitable Full backup found in catalog. Doing FULL backup.\n" -msgstr "" - -#: src/dird/fd_cmds.c:247 src/dird/fd_cmds.c:253 src/dird/fd_cmds.c:262 -#, c-format -msgid " (upgraded from %s)" -msgstr "" - -#: src/dird/fd_cmds.c:252 -msgid "" -"No prior or suitable Differential backup found in catalog. Doing " -"Differential backup.\n" -msgstr "" - -#: src/dird/fd_cmds.c:260 -#, c-format -msgid "Prior failed job found in catalog. Upgrading to %s.\n" -msgstr "" - -#: src/dird/fd_cmds.c:338 -#, c-format -msgid "Unimplemented backup level %d %c\n" -msgstr "" - -#: src/dird/fd_cmds.c:420 -msgid "" -"FD compression disabled for this Job because AllowCompress=No in Storage " -"resource.\n" -msgstr "" - -#: src/dird/fd_cmds.c:520 src/filed/job.c:1094 -#, c-format -msgid "Cannot run program: %s. ERR=%s\n" -msgstr "" - -#: src/dird/fd_cmds.c:532 src/dird/fd_cmds.c:558 src/dird/fd_cmds.c:572 -msgid ">filed: write error on socket\n" -msgstr "" - -#: src/dird/fd_cmds.c:538 -#, c-format -msgid "Error running program: %s. ERR=%s\n" -msgstr "" - -#: src/dird/fd_cmds.c:547 -#, c-format -msgid "Cannot open included file: %s. ERR=%s\n" -msgstr "" - -#: src/dird/fd_cmds.c:720 -#, c-format -msgid "Client \"%s\" RunScript failed.\n" -msgstr "" - -#: src/dird/fd_cmds.c:743 -#, c-format -msgid "" -"Client \"%s\" may not be used to restore this job. Please upgrade your " -"client.\n" -msgstr "" - -#: src/dird/fd_cmds.c:824 -msgid "RestoreObject failed.\n" -msgstr "" - -#: src/dird/fd_cmds.c:861 -#, fuzzy -msgid "ComponentInfo failed.\n" -msgstr "Opdracht mislukt." - -#: src/dird/fd_cmds.c:906 -#, c-format -msgid "" -"fixed name. Max=%d: " -msgstr "" - -#: src/dird/ua_cmds.c:341 -#, c-format -msgid "The number must be between 0 and %d\n" -msgstr "" - -#: src/dird/ua_cmds.c:349 -msgid "Enter Volume name: " -msgstr "" - -#: src/dird/ua_cmds.c:353 -msgid "Enter base volume name: " -msgstr "" - -#: src/dird/ua_cmds.c:362 src/dird/ua_label.c:652 -msgid "Volume name too long.\n" -msgstr "" - -#: src/dird/ua_cmds.c:366 src/dird/ua_label.c:658 src/lib/edit.c:514 -msgid "Volume name must be at least one character long.\n" -msgstr "" - -#: src/dird/ua_cmds.c:377 -msgid "Enter the starting number: " -msgstr "" - -#: src/dird/ua_cmds.c:382 -msgid "Start number must be greater than zero.\n" -msgstr "" - -#: src/dird/ua_cmds.c:393 -msgid "Enter slot (0 for none): " -msgstr "" - -#: src/dird/ua_cmds.c:397 -msgid "InChanger? yes/no: " -msgstr "" - -#: src/dird/ua_cmds.c:425 -#, c-format -msgid "%d Volumes created in pool %s\n" -msgstr "" - -#: src/dird/ua_cmds.c:441 src/dird/ua_cmds.c:1241 -msgid "Turn on or off? " -msgstr "" - -#: src/dird/ua_cmds.c:569 -#, c-format -msgid "" -"Can't set %s RecyclePool to %s, %s is not in database.\n" -"Try to update it with 'update pool=%s'\n" -msgstr "" - -#: src/dird/ua_cmds.c:587 -#, c-format -msgid "" -"Can't set %s ScratchPool to %s, %s is not in database.\n" -"Try to update it with 'update pool=%s'\n" -msgstr "" - -#: src/dird/ua_cmds.c:654 -#, c-format -msgid "" -"Error: Pool %s already exists.\n" -"Use update to change it.\n" -msgstr "" - -#: src/dird/ua_cmds.c:665 -#, c-format -msgid "Pool %s created.\n" -msgstr "" - -#: src/dird/ua_cmds.c:696 -#, fuzzy -msgid "Failed to set bandwidth limit to Client.\n" -msgstr "Kan de geselecteerde client niet vinden." - -#: src/dird/ua_cmds.c:700 -#, c-format -msgid "2000 OK Limiting bandwidth to %lldkb/s %s\n" -msgstr "" - -#: src/dird/ua_cmds.c:701 -msgid "on running and future jobs" -msgstr "" - -#: src/dird/ua_cmds.c:725 -msgid "Set Bandwidth choice:\n" -msgstr "" - -#: src/dird/ua_cmds.c:726 -msgid "Running Job" -msgstr "" - -#: src/dird/ua_cmds.c:727 -msgid "Running and future Jobs for a Client" -msgstr "" - -#: src/dird/ua_cmds.c:728 -msgid "Choose where to limit the bandwidth" -msgstr "" - -#: src/dird/ua_cmds.c:740 -msgid "Enter new bandwidth limit kb/s: " -msgstr "" - -#: src/dird/ua_cmds.c:777 src/dird/ua_cmds.c:840 src/dird/ua_cmds.c:862 -#: src/dird/ua_cmds.c:884 -msgid "Unauthorized command from this console.\n" -msgstr "" - -#: src/dird/ua_cmds.c:784 src/dird/ua_cmds.c:1292 src/dird/ua_dotcmds.c:201 -#: src/dird/ua_run.c:343 -#, c-format -msgid "Client \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_cmds.c:794 -#, c-format -msgid "Client \"%s\" address set to %s\n" -msgstr "" - -#: src/dird/ua_cmds.c:813 -#, c-format -msgid "Job Attributes Insertion %sabled\n" -msgstr "" - -#: src/dird/ua_cmds.c:844 -#, c-format -msgid "Job \"%s\" %sabled\n" -msgstr "" - -#: src/dird/ua_cmds.c:866 -#, fuzzy, c-format -msgid "Client \"%s\" %sabled\n" -msgstr "Opdracht mislukt." - -#: src/dird/ua_cmds.c:888 -#, c-format -msgid "Schedule \"%s\" %sabled\n" -msgstr "" - -#: src/dird/ua_cmds.c:897 -msgid "" -"You must enter one of the following keywords: job, client, schedule, or " -"storage.\n" -msgstr "" - -#: src/dird/ua_cmds.c:926 src/dird/ua_dotcmds.c:1086 src/dird/ua_status.c:411 -#, c-format -msgid "Connecting to Storage daemon %s at %s:%d\n" -msgstr "" - -#: src/dird/ua_cmds.c:932 src/dird/ua_dotcmds.c:1092 -msgid "Connected to storage daemon\n" -msgstr "" - -#: src/dird/ua_cmds.c:1103 -msgid "Enter new debug level: " -msgstr "" - -#: src/dird/ua_cmds.c:1116 -#, c-format -msgid "Incorrect tags found on command line %s\n" -msgstr "" - -#: src/dird/ua_cmds.c:1199 src/dird/ua_dotcmds.c:1194 -msgid "Available daemons are: \n" -msgstr "" - -#: src/dird/ua_cmds.c:1200 src/dird/ua_dotcmds.c:1195 -msgid "Director" -msgstr "" - -#: src/dird/ua_cmds.c:1201 src/dird/ua_dotcmds.c:1196 src/dird/ua_run.c:1012 -#: src/dird/ua_select.c:189 -msgid "Storage" -msgstr "Opslag" - -#: src/dird/ua_cmds.c:1202 src/dird/ua_dotcmds.c:1197 src/dird/ua_run.c:1018 -#: src/dird/ua_select.c:383 src/dird/ua_select.c:407 src/dird/ua_select.c:544 -msgid "Client" -msgstr "Client" - -#: src/dird/ua_cmds.c:1203 -msgid "All" -msgstr "" - -#: src/dird/ua_cmds.c:1204 -msgid "Select daemon type to set debug level" -msgstr "" - -#: src/dird/ua_cmds.c:1296 src/dird/ua_cmds.c:2119 src/dird/ua_dotcmds.c:205 -#: src/dird/ua_status.c:462 -#, c-format -msgid "No authorization for Client \"%s\"\n" -msgstr "" - -#: src/dird/ua_cmds.c:1301 src/dird/ua_dotcmds.c:210 -msgid "Client name missing.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1309 src/dird/ua_select.c:1471 src/dird/ua_select.c:1478 -#, c-format -msgid "Job \"%s\" not found.\n" -msgstr "Job \"%s\" niet gevonden.\n" - -#: src/dird/ua_cmds.c:1313 src/dird/ua_cmds.c:1380 src/dird/ua_cmds.c:2141 -#, c-format -msgid "No authorization for Job \"%s\"\n" -msgstr "" - -#: src/dird/ua_cmds.c:1318 -msgid "Job name missing.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1327 -#, c-format -msgid "Fileset \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1331 -#, c-format -msgid "No authorization for FileSet \"%s\"\n" -msgstr "" - -#: src/dird/ua_cmds.c:1336 -msgid "Fileset name missing.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1347 src/dird/ua_run.c:1402 -#, c-format -msgid "Level \"%s\" not valid.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1351 -msgid "Level value missing.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1358 -msgid "Invalid value for accurate. It must be yes or no.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1363 -msgid "Accurate value missing.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1376 -msgid "No job specified.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1436 -msgid "Error sending include list.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1441 -msgid "Error sending exclude list.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1535 -msgid "" -"In general it is not a good idea to delete either a\n" -"Pool or a Volume since they may contain data.\n" -"\n" -msgstr "" - -#: src/dird/ua_cmds.c:1538 -msgid "Choose catalog item to delete" -msgstr "" - -#: src/dird/ua_cmds.c:1552 -msgid "Nothing done.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1580 -#, c-format -msgid "Are you sure you want to delete %d JobIds ? (yes/no): " -msgstr "" - -#: src/dird/ua_cmds.c:1590 -msgid "Enter JobId to delete: " -msgstr "" - -#: src/dird/ua_cmds.c:1608 -#, c-format -msgid "Jobid %s and associated records deleted from the catalog.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1623 -#, c-format -msgid "" -"\n" -"This command will delete volume %s\n" -"and all Jobs saved on that volume from the Catalog\n" -msgstr "" - -#: src/dird/ua_cmds.c:1630 -#, c-format -msgid "Are you sure you want to delete Volume \"%s\"? (yes/no): " -msgstr "" - -#: src/dird/ua_cmds.c:1643 -msgid "Can't list jobs on this volume\n" -msgstr "" - -#: src/dird/ua_cmds.c:1668 -#, c-format -msgid "Are you sure you want to delete Pool \"%s\"? (yes/no): " -msgstr "" - -#: src/dird/ua_cmds.c:1714 -#, c-format -msgid "Invalid device name. %s" -msgstr "" - -#: src/dird/ua_cmds.c:1791 -#, c-format -msgid "Using Catalog name=%s DB=%s\n" -msgstr "" - -#: src/dird/ua_cmds.c:1859 -msgid "ERR: Can't open db\n" -msgstr "" - -#: src/dird/ua_cmds.c:1906 -msgid "Wait on mount timed out\n" -msgstr "" - -#: src/dird/ua_cmds.c:1916 -msgid "ERR: Job was not found\n" -msgstr "" - -#: src/dird/ua_cmds.c:1992 -msgid "" -" Command Description\n" -" ======= ===========\n" -msgstr "" - -#: src/dird/ua_cmds.c:1996 -#, c-format -msgid "" -" %-13s %s\n" -"\n" -"Arguments:\n" -"\t%s\n" -msgstr "" - -#: src/dird/ua_cmds.c:2001 -#, c-format -msgid " %-13s %s\n" -msgstr "" - -#: src/dird/ua_cmds.c:2005 -#, c-format -msgid "" -"\n" -"Can't find %s command.\n" -"\n" -msgstr "" - -#: src/dird/ua_cmds.c:2007 -msgid "" -"\n" -"When at a prompt, entering a period cancels the command.\n" -"\n" -msgstr "" - -#: src/dird/ua_cmds.c:2043 -#, c-format -msgid "%s Version: %s (%s) %s %s %s %s\n" -msgstr "" - -#: src/dird/ua_cmds.c:2102 src/dird/ua_cmds.c:2129 src/dird/ua_cmds.c:2151 -#, c-format -msgid "No authorization for Catalog \"%s\"\n" -msgstr "" - -#: src/dird/ua_cmds.c:2187 src/dird/ua_select.c:242 -msgid "Could not find a Catalog resource\n" -msgstr "Kan Catalog medium niet vinden\n" - -#: src/dird/ua_cmds.c:2208 -#, c-format -msgid "Could not open catalog database \"%s\".\n" -msgstr "" - -#: src/dird/ua_cmds.c:2227 -#, c-format -msgid "Using Catalog \"%s\"\n" -msgstr "" - -#: src/dird/ua_dde.c:62 src/dird/ua_dotcmds.c:1594 -#, c-format -msgid "List Media failed: ERR=%s\n" -msgstr "" - -#: src/dird/ua_dde.c:110 -#, fuzzy -msgid "Command line" -msgstr "Onjuiste opdrachtregel optie" - -#: src/dird/ua_dde.c:211 -#, fuzzy, c-format -msgid "Invalid keyword found: %s\n" -msgstr "Onjuiste periode.\n" - -#: src/dird/ua_dde.c:216 -msgid "Dedup Engine choice: \n" -msgstr "" - -#: src/dird/ua_dde.c:217 -msgid "Vacuum data files" -msgstr "" - -#: src/dird/ua_dde.c:218 -msgid "Cancel running vacuum" -msgstr "" - -#: src/dird/ua_dde.c:219 -msgid "Display data files usage" -msgstr "" - -#: src/dird/ua_dde.c:223 -msgid "Select action to perform on Dedup Engine" -msgstr "" - -#: src/dird/ua_dotcmds.c:180 -msgid ": is an invalid command.\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:219 -msgid "path name missing.\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:238 -#, fuzzy -msgid "Failed to send command to Client.\n" -msgstr "Kan de geselecteerde client niet vinden." - -#: src/dird/ua_dotcmds.c:894 -#, fuzzy, c-format -msgid "Unable to get Job record for Job=%s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/dird/ua_dotcmds.c:909 -#, fuzzy, c-format -msgid "Unable to get last Job record for Job=%s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/dird/ua_dotcmds.c:925 -#, fuzzy, c-format -msgid "Unable to get Client record for Client=%s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/dird/ua_dotcmds.c:941 -#, fuzzy, c-format -msgid "Unable to get last Job record for Client=%s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/dird/ua_dotcmds.c:952 src/dird/ua_restore.c:960 -#: src/dird/ua_restore.c:1003 src/dird/vbackup.c:142 -#, c-format -msgid "Unable to get Job record for JobId=%s: ERR=%s\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1156 src/dird/ua_dotcmds.c:1250 -#, c-format -msgid "Unknown command: %s\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1198 -msgid "Select daemon type to make die" -msgstr "" - -#: src/dird/ua_dotcmds.c:1224 -msgid "The Director will generate a deadlock.\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1228 -msgid "The Director will segment fault.\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1509 -msgid "Access to specified Client or FileSet not allowed.\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1514 src/dird/ua_dotcmds.c:1558 -#: src/dird/ua_restore.c:1121 src/dird/ua_restore.c:1149 -#: src/dird/ua_restore.c:1170 -#, c-format -msgid "Query failed: %s. ERR=%s\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1553 -msgid "query keyword not found.\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1580 -#, c-format -msgid "List MediaType failed: ERR=%s\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1608 -#, c-format -msgid "List Location failed: ERR=%s\n" -msgstr "" - -#: src/dird/ua_input.c:114 -msgid "Enter slot" -msgstr "" - -#: src/dird/ua_input.c:118 src/dird/ua_input.c:124 -#, c-format -msgid "Expected a positive integer, got: %s\n" -msgstr "" - -#: src/dird/ua_input.c:181 -msgid "Invalid response. You must answer yes or no.\n" -msgstr "" - -#: src/dird/ua_input.c:204 -msgid "Invalid Enabled value, it must be yes, no, archived, 0, 1, or 2\n" -msgstr "" - -#: src/dird/ua_input.c:231 -#, c-format -msgid "Illegal character \"%c\" in a comment.\n" -msgstr "" - -#: src/dird/ua_input.c:238 -msgid "Comment too long.\n" -msgstr "" - -#: src/dird/ua_input.c:244 -msgid "Comment must be at least one character long.\n" -msgstr "" - -#: src/dird/ua_label.c:93 -msgid "Negative numbers not permitted\n" -msgstr "" - -#: src/dird/ua_label.c:99 src/lib/sellist.c:65 -msgid "Range end is not integer.\n" -msgstr "" - -#: src/dird/ua_label.c:104 src/lib/sellist.c:70 -msgid "Range start is not an integer.\n" -msgstr "" - -#: src/dird/ua_label.c:110 src/lib/sellist.c:77 -msgid "Range end not bigger than start.\n" -msgstr "" - -#: src/dird/ua_label.c:116 src/lib/sellist.c:95 -msgid "Input value is not an integer.\n" -msgstr "" - -#: src/dird/ua_label.c:122 -msgid "Values must be be greater than zero.\n" -msgstr "" - -#: src/dird/ua_label.c:126 -msgid "Slot too large.\n" -msgstr "" - -#: src/dird/ua_label.c:178 src/dird/ua_label.c:356 src/dird/ua_label.c:1191 -#: src/dird/ua_run.c:417 -msgid "command line" -msgstr "" - -#: src/dird/ua_label.c:196 src/dird/ua_label.c:520 src/dird/ua_label.c:1198 -msgid "No slots in changer to scan.\n" -msgstr "" - -#: src/dird/ua_label.c:208 src/dird/ua_label.c:531 -msgid "No Volumes found to label, or no barcodes.\n" -msgstr "" - -#: src/dird/ua_label.c:218 src/dird/ua_label.c:1219 -#, c-format -msgid "Slot %d greater than max %d ignored.\n" -msgstr "" - -#: src/dird/ua_label.c:256 -#, c-format -msgid "No VolName for Slot=%d InChanger set to zero.\n" -msgstr "" - -#: src/dird/ua_label.c:277 -#, c-format -msgid "Catalog record for Volume \"%s\" updated to reference slot %d.\n" -msgstr "" - -#: src/dird/ua_label.c:281 -#, c-format -msgid "Catalog record for Volume \"%s\" is up to date.\n" -msgstr "" - -#: src/dird/ua_label.c:287 -#, c-format -msgid "Volume \"%s\" not found in catalog. Slot=%d InChanger set to zero.\n" -msgstr "" - -#: src/dird/ua_label.c:385 -#, c-format -msgid "" -"Volume \"%s\" has VolStatus %s. It must be Purged or Recycled before " -"relabeling.\n" -msgstr "" - -#: src/dird/ua_label.c:401 -msgid "Enter new Volume name: " -msgstr "" - -#: src/dird/ua_label.c:414 -#, c-format -msgid "Media record for new Volume \"%s\" already exists.\n" -msgstr "" - -#: src/dird/ua_label.c:432 -msgid "Enter slot (0 or Enter for none): " -msgstr "" - -#: src/dird/ua_label.c:460 -#, c-format -msgid "Delete of Volume \"%s\" failed. ERR=%s" -msgstr "" - -#: src/dird/ua_label.c:463 -#, c-format -msgid "Old volume \"%s\" deleted from catalog.\n" -msgstr "" - -#: src/dird/ua_label.c:474 -#, c-format -msgid "Requesting to mount %s ...\n" -msgstr "" - -#: src/dird/ua_label.c:496 -msgid "Do not forget to mount the drive!!!\n" -msgstr "" - -#: src/dird/ua_label.c:536 -msgid "" -"The following Volumes will be labeled:\n" -"Slot Volume\n" -"==============\n" -msgstr "" - -#: src/dird/ua_label.c:545 -msgid "Do you want to label these Volumes? (yes|no): " -msgstr "" - -#: src/dird/ua_label.c:565 -#, c-format -msgid "Media record for Slot %d Volume \"%s\" already exists.\n" -msgstr "" - -#: src/dird/ua_label.c:571 -#, c-format -msgid "Error setting InChanger: ERR=%s" -msgstr "" - -#: src/dird/ua_label.c:594 -#, c-format -msgid "Maximum pool Volumes=%d reached.\n" -msgstr "" - -#: src/dird/ua_label.c:602 -#, c-format -msgid "Catalog record for cleaning tape \"%s\" successfully created.\n" -msgstr "" - -#: src/dird/ua_label.c:609 -#, c-format -msgid "Catalog error on cleaning tape: %s" -msgstr "" - -#: src/dird/ua_label.c:645 -#, c-format -msgid "Illegal character \"%c\" in a volume name.\n" -msgstr "" - -#: src/dird/ua_label.c:693 -#, c-format -msgid "Sending relabel command from \"%s\" to \"%s\" ...\n" -msgstr "" - -#: src/dird/ua_label.c:700 -#, c-format -msgid "Sending label command for Volume \"%s\" Slot %d ...\n" -msgstr "" - -#: src/dird/ua_label.c:738 -#, c-format -msgid "Catalog record for Volume \"%s\", Slot %d successfully created.\n" -msgstr "" - -#: src/dird/ua_label.c:751 -#, c-format -msgid "Label command failed for Volume %s.\n" -msgstr "" - -#: src/dird/ua_label.c:765 -msgid "Could not open SD socket.\n" -msgstr "" - -#: src/dird/ua_label.c:837 src/dird/ua_label.c:847 -#, c-format -msgid "Invalid Slot number: %s\n" -msgstr "" - -#: src/dird/ua_label.c:856 -#, c-format -msgid "Invalid Volume name: %s. Volume skipped.\n" -msgstr "" - -#: src/dird/ua_label.c:950 -#, c-format -msgid "Device \"%s\" has %d slots.\n" -msgstr "" - -#: src/dird/ua_label.c:996 -#, c-format -msgid "Pool \"%s\" resource not found for volume \"%s\"!\n" -msgstr "" - -#: src/dird/ua_label.c:1210 -msgid "No Volumes found, or no barcodes.\n" -msgstr "" - -#: src/dird/ua_label.c:1213 -msgid "" -" Slot | Volume Name | Status | Media Type | " -"Pool |\n" -msgstr "" - -#: src/dird/ua_label.c:1214 -msgid "" -"------+------------------+-----------+----------------------" -"+--------------------|\n" -msgstr "" - -#: src/dird/ua_output.c:56 src/dird/ua_output.c:80 -msgid "ON or OFF keyword missing.\n" -msgstr "" - -#: src/dird/ua_output.c:100 -msgid "Disabled Jobs:\n" -msgstr "" - -#: src/dird/ua_output.c:106 -msgid "No disabled Jobs.\n" -msgstr "" - -#: src/dird/ua_output.c:208 -msgid "Keywords for the show command are:\n" -msgstr "" - -#: src/dird/ua_output.c:215 -#, c-format -msgid "%s resource %s not found.\n" -msgstr "" - -#: src/dird/ua_output.c:219 -#, c-format -msgid "Resource %s not found\n" -msgstr "" - -#: src/dird/ua_output.c:360 -msgid "Hey! DB is NULL\n" -msgstr "" - -#: src/dird/ua_output.c:522 -msgid "Invalid jobid argument\n" -msgstr "" - -#: src/dird/ua_output.c:546 -#, c-format -msgid "Unknown ObjectType %s\n" -msgstr "" - -#: src/dird/ua_output.c:556 -msgid "list pluginrestoreconf requires jobid argument\n" -msgstr "" - -#: src/dird/ua_output.c:594 -#, c-format -msgid "Jobid %d used %d Volume(s): %s\n" -msgstr "" - -#: src/dird/ua_output.c:613 -msgid "No Pool specified.\n" -msgstr "" - -#: src/dird/ua_output.c:624 src/dird/ua_select.c:612 src/dird/ua_update.c:435 -#, c-format -msgid "Error obtaining pool ids. ERR=%s\n" -msgstr "" - -#: src/dird/ua_output.c:634 -#, c-format -msgid "Pool: %s\n" -msgstr "" - -#: src/dird/ua_output.c:650 -msgid "Ignoring invalid value for days. Max is 50.\n" -msgstr "" - -#: src/dird/ua_output.c:679 -#, c-format -msgid "Unknown list keyword: %s\n" -msgstr "" - -#: src/dird/ua_output.c:704 -#, c-format -msgid "%s is not a job name.\n" -msgstr "" - -#: src/dird/ua_output.c:718 -#, c-format -msgid "Could not find Pool for Job %s\n" -msgstr "" - -#: src/dird/ua_output.c:731 -#, c-format -msgid "Could not find next Volume for Job %s (Pool=%s, Level=%s).\n" -msgstr "" - -#: src/dird/ua_output.c:735 -#, c-format -msgid "" -"The next Volume to be used by Job \"%s\" (Pool=%s, Level=%s) will be %s\n" -msgstr "" - -#: src/dird/ua_output.c:746 -#, c-format -msgid "Could not find next Volume for Job %s.\n" -msgstr "" - -#: src/dird/ua_output.c:892 -#, c-format -msgid "Pool %s not in database. %s" -msgstr "" - -#: src/dird/ua_output.c:900 -#, c-format -msgid "Pool %s created in database.\n" -msgstr "" - -#: src/dird/ua_output.c:956 -msgid "You have no messages.\n" -msgstr "" - -#: src/dird/ua_output.c:1036 -msgid "Message too long to display.\n" -msgstr "" - -#: src/dird/ua_prune.c:118 -msgid "Choose item to prune" -msgstr "" - -#: src/dird/ua_prune.c:174 -#, c-format -msgid "Cannot prune Volume \"%s\" because it is archived.\n" -msgstr "" - -#: src/dird/ua_prune.c:219 -msgid "Pruned Jobs from JobHisto catalog.\n" -msgstr "" - -#: src/dird/ua_prune.c:307 -msgid "Begin pruning Files.\n" -msgstr "" - -#: src/dird/ua_prune.c:322 -msgid "No Files found to prune.\n" -msgstr "" - -#: src/dird/ua_prune.c:345 -#, c-format -msgid "Pruned Files from %s Jobs for client %s from catalog.\n" -msgstr "" - -#: src/dird/ua_prune.c:491 -#, c-format -msgid "Begin pruning Jobs older than %s.\n" -msgstr "" - -#: src/dird/ua_prune.c:602 -#, c-format -msgid "Pruned %d %s for client %s from catalog.\n" -msgstr "" - -#: src/dird/ua_prune.c:603 -msgid "Jobs" -msgstr "" - -#: src/dird/ua_prune.c:605 -msgid "No Jobs found to prune.\n" -msgstr "" - -#: src/dird/ua_prune.c:666 -msgid "Expecting limit argument as integer\n" -msgstr "" - -#: src/dird/ua_prune.c:679 -#, c-format -msgid "Volume \"%s\"" -msgstr "" - -#: src/dird/ua_purge.c:85 -msgid "" -"\n" -"This command can be DANGEROUS!!!\n" -"\n" -"It purges (deletes) all Files from a Job,\n" -"JobId, Client or Volume; or it purges (deletes)\n" -"all Jobs from a Client or Volume without regard\n" -"to retention periods. Normally you should use the\n" -"PRUNE command, which respects retention periods.\n" -msgstr "" - -#: src/dird/ua_purge.c:153 -msgid "Choose item to purge" -msgstr "" - -#: src/dird/ua_purge.c:200 -#, c-format -msgid "Begin purging files for Client \"%s\"\n" -msgstr "" - -#: src/dird/ua_purge.c:209 src/dird/ua_purge.c:259 -#, c-format -msgid "No Files found for client %s to purge from %s catalog.\n" -msgstr "" - -#: src/dird/ua_purge.c:212 -#, c-format -msgid "Files for %d Jobs for client \"%s\" purged from %s catalog.\n" -msgstr "" - -#: src/dird/ua_purge.c:250 -#, c-format -msgid "Begin purging jobs from Client \"%s\"\n" -msgstr "" - -#: src/dird/ua_purge.c:262 -#, c-format -msgid "%d Jobs for client %s purged from %s catalog.\n" -msgstr "" - -#: src/dird/ua_purge.c:466 -#, c-format -msgid "" -"\n" -"Volume \"%s\" has VolStatus \"%s\" and cannot be purged.\n" -"The VolStatus must be: Append, Full, Used, or Error to be purged.\n" -msgstr "" - -#: src/dird/ua_purge.c:494 -#, c-format -msgid "%d File%s on Volume \"%s\" purged from catalog.\n" -msgstr "" - -#: src/dird/ua_purge.c:544 -#, c-format -msgid "" -"There are no more Jobs associated with Volume \"%s\". Marking it purged.\n" -msgstr "" - -#: src/dird/ua_purge.c:617 -msgid "Can't update volume size in the catalog\n" -msgstr "" - -#: src/dird/ua_purge.c:619 -#, c-format -msgid "The volume \"%s\" has been truncated\n" -msgstr "" - -#: src/dird/ua_purge.c:621 -#, c-format -msgid "Unable to truncate volume \"%s\"\n" -msgstr "" - -#: src/dird/ua_purge.c:714 -#, fuzzy -msgid "No Volumes found to perform \"truncate\" command.\n" -msgstr "Geen Volumes gevonden om terug te zetten.\n" - -#: src/dird/ua_purge.c:781 -#, c-format -msgid "Unable move recycled Volume in full Pool \"%s\" MaxVols=%d\n" -msgstr "" - -#: src/dird/ua_purge.c:795 -#, c-format -msgid "All records pruned from Volume \"%s\"; marking it \"Purged\"\n" -msgstr "" - -#: src/dird/ua_purge.c:800 -#, c-format -msgid "Cannot purge Volume with VolStatus=%s\n" -msgstr "" - -#: src/dird/ua_query.c:62 src/findlib/create_file.c:283 -#: src/findlib/create_file.c:385 -#, c-format -msgid "Could not open %s: ERR=%s\n" -msgstr "" - -#: src/dird/ua_query.c:67 -msgid "Available queries:\n" -msgstr "" - -#: src/dird/ua_query.c:74 -msgid "Choose a query" -msgstr "" - -#: src/dird/ua_query.c:88 -msgid "Could not find query.\n" -msgstr "" - -#: src/dird/ua_query.c:106 -msgid "Too many prompts in query, max is 9.\n" -msgstr "" - -#: src/dird/ua_query.c:209 -#, c-format -msgid "Warning prompt %d missing.\n" -msgstr "" - -#: src/dird/ua_query.c:254 -msgid "" -"Entering SQL query mode.\n" -"Terminate each query with a semicolon.\n" -"Terminate query mode with a blank line.\n" -msgstr "" - -#: src/dird/ua_query.c:257 src/dird/ua_query.c:273 -msgid "Enter SQL query: " -msgstr "" - -#: src/dird/ua_query.c:275 -msgid "Add to SQL query: " -msgstr "" - -#: src/dird/ua_query.c:278 -msgid "End query mode.\n" -msgstr "" - -#: src/dird/ua_restore.c:295 -msgid "\"RegexWhere\" specification not authorized.\n" -msgstr "" - -#: src/dird/ua_restore.c:302 -msgid "\"where\" specification not authorized.\n" -msgstr "" - -#: src/dird/ua_restore.c:320 -msgid "" -"No Restore Job Resource found in bacula-dir.conf.\n" -"You must create at least one before running this command.\n" -msgstr "" - -#: src/dird/ua_restore.c:337 -msgid "Restore not done.\n" -msgstr "" - -#: src/dird/ua_restore.c:348 -msgid "Unable to construct a valid BSR. Cannot continue.\n" -msgstr "" - -#: src/dird/ua_restore.c:352 src/dird/ua_restore.c:366 -msgid "No files selected to be restored.\n" -msgstr "" - -#: src/dird/ua_restore.c:356 -#, c-format -msgid "Bootstrap records written to %s\n" -msgstr "" - -#: src/dird/ua_restore.c:360 -msgid "" -"\n" -"1 file selected to be restored.\n" -"\n" -msgstr "" - -#: src/dird/ua_restore.c:362 -#, c-format -msgid "" -"\n" -"%s files selected to be restored.\n" -"\n" -msgstr "" - -#: src/dird/ua_restore.c:381 -msgid "No Client resource found!\n" -msgstr "" - -#: src/dird/ua_restore.c:499 -msgid "The restore will use the following job(s) as Base\n" -msgstr "" - -#: src/dird/ua_restore.c:532 -#, c-format -msgid "Missing value for keyword: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:612 -msgid "List last 20 Jobs run" -msgstr "" - -#: src/dird/ua_restore.c:613 -msgid "List Jobs where a given File is saved" -msgstr "" - -#: src/dird/ua_restore.c:614 -msgid "Enter list of comma separated JobIds to select" -msgstr "" - -#: src/dird/ua_restore.c:615 -msgid "Enter SQL list command" -msgstr "" - -#: src/dird/ua_restore.c:616 -msgid "Select the most recent backup for a client" -msgstr "" - -#: src/dird/ua_restore.c:617 -msgid "Select backup for a client before a specified time" -msgstr "" - -#: src/dird/ua_restore.c:618 -msgid "Enter a list of files to restore" -msgstr "" - -#: src/dird/ua_restore.c:619 -msgid "Enter a list of files to restore before a specified time" -msgstr "" - -#: src/dird/ua_restore.c:620 -msgid "Find the JobIds of the most recent backup for a client" -msgstr "" - -#: src/dird/ua_restore.c:621 -msgid "Find the JobIds for a backup for a client before a specified time" -msgstr "" - -#: src/dird/ua_restore.c:622 -msgid "Enter a list of directories to restore for found JobIds" -msgstr "" - -#: src/dird/ua_restore.c:623 -msgid "Select full restore to a specified Job date" -msgstr "" - -#: src/dird/ua_restore.c:624 src/dird/ua_status.c:1213 src/lib/status.h:120 -msgid "Cancel" -msgstr "" - -#: src/dird/ua_restore.c:671 -#, c-format -msgid "Unknown keyword: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:700 src/dird/ua_update.c:947 -#, c-format -msgid "Improper date format: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:735 src/dird/ua_select.c:770 -#, c-format -msgid "Error: Pool resource \"%s\" does not exist.\n" -msgstr "" - -#: src/dird/ua_restore.c:740 -#, c-format -msgid "Error: Pool resource \"%s\" access not allowed.\n" -msgstr "" - -#: src/dird/ua_restore.c:756 -msgid "" -"\n" -"First you select one or more JobIds that contain files\n" -"to be restored. You will be presented several methods\n" -"of specifying the JobIds. Then you will be allowed to\n" -"select which files from those JobIds are to be restored.\n" -"\n" -msgstr "" - -#: src/dird/ua_restore.c:769 -msgid "To select the JobIds, you have the following choices:\n" -msgstr "" - -#: src/dird/ua_restore.c:774 -msgid "Select item: " -msgstr "" - -#: src/dird/ua_restore.c:779 src/dird/ua_restore.c:814 -msgid "SQL query not authorized.\n" -msgstr "" - -#: src/dird/ua_restore.c:792 -msgid "Enter Filename (no path):" -msgstr "" - -#: src/dird/ua_restore.c:807 src/dird/ua_restore.c:915 -msgid "Enter JobId(s), comma separated, to restore: " -msgstr "" - -#: src/dird/ua_restore.c:817 -msgid "Enter SQL list command: " -msgstr "" - -#: src/dird/ua_restore.c:851 src/dird/ua_restore.c:874 -msgid "" -"Enter file names with paths, or < to enter a filename\n" -"containing a list of file names with paths, and terminate\n" -"them with a blank line.\n" -msgstr "" - -#: src/dird/ua_restore.c:855 src/dird/ua_restore.c:878 -msgid "Enter full filename: " -msgstr "" - -#: src/dird/ua_restore.c:913 -#, c-format -msgid "You have already selected the following JobIds: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:931 -msgid "" -"Enter full directory names or start the name\n" -"with a < to indicate it is a filename containing a list\n" -"of directories and terminate them with a blank line.\n" -msgstr "" - -#: src/dird/ua_restore.c:935 -msgid "Enter directory name: " -msgstr "" - -#: src/dird/ua_restore.c:951 -msgid "Enter JobId to get the state to restore: " -msgstr "" - -#: src/dird/ua_restore.c:964 src/dird/vbackup.c:146 -#, c-format -msgid "Selecting jobs to build the Full state at %s\n" -msgstr "" - -#: src/dird/ua_restore.c:990 -msgid "Invalid JobId in list.\n" -msgstr "" - -#: src/dird/ua_restore.c:1009 -#, c-format -msgid "Access to JobId=%s (Job \"%s\") not authorized. Not selected.\n" -msgstr "" - -#: src/dird/ua_restore.c:1022 -msgid "No Jobs selected.\n" -msgstr "" - -#: src/dird/ua_restore.c:1027 -#, c-format -msgid "You have selected the following JobIds: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:1029 -#, c-format -msgid "You have selected the following JobId: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:1039 -msgid "" -"The restored files will the most current backup\n" -"BEFORE the date you specify below.\n" -"\n" -msgstr "" - -#: src/dird/ua_restore.c:1042 -msgid "Enter date as YYYY-MM-DD HH:MM:SS :" -msgstr "" - -#: src/dird/ua_restore.c:1048 -msgid "Improper date format.\n" -msgstr "" - -#: src/dird/ua_restore.c:1069 -#, c-format -msgid "Cannot open file %s: ERR=%s\n" -msgstr "" - -#: src/dird/ua_restore.c:1077 src/dird/ua_restore.c:1081 -#, c-format -msgid "Error occurred on line %d of file \"%s\"\n" -msgstr "" - -#: src/dird/ua_restore.c:1125 src/dird/ua_restore.c:1153 -#, c-format -msgid "No database record found for: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:1141 -msgid "No JobId specified cannot continue.\n" -msgstr "" - -#: src/dird/ua_restore.c:1174 -#, c-format -msgid "No table found: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:1232 -msgid "" -"\n" -"\n" -"For one or more of the JobIds selected, no files were found,\n" -"so file selection is not possible.\n" -"Most likely your retention policy pruned the files.\n" -msgstr "" - -#: src/dird/ua_restore.c:1235 -msgid "" -"\n" -"Do you want to restore all the files? (yes|no): " -msgstr "" - -#: src/dird/ua_restore.c:1238 -msgid "" -"\n" -"Regexp matching files to restore? (empty to abort): " -msgstr "" - -#: src/dird/ua_restore.c:1254 -#, c-format -msgid "Regex compile error: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:1297 -#, fuzzy, c-format -msgid "Unable to create component file %s. ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/dird/ua_restore.c:1304 -#, fuzzy, c-format -msgid "Unable to fdopen component file %s. ERR=%s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/dird/ua_restore.c:1311 -#, fuzzy -msgid "Error writing component file.\n" -msgstr "Fout bij schrijven van bsr bestand.\n" - -#: src/dird/ua_restore.c:1356 -#, c-format -msgid "" -"\n" -"Building directory tree for JobId(s) %s ... " -msgstr "" - -#: src/dird/ua_restore.c:1426 -#, c-format -msgid "" -"\n" -"%s files inserted into the tree and marked for extraction.\n" -msgstr "" - -#: src/dird/ua_restore.c:1429 -#, c-format -msgid "" -"\n" -"%s files inserted into the tree.\n" -msgstr "" - -#: src/dird/ua_restore.c:1517 -#, c-format -msgid "Error getting FileSet \"%s\": ERR=%s\n" -msgstr "" - -#: src/dird/ua_restore.c:1522 -#, c-format -msgid "FileSet argument: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:1528 src/dird/ua_select.c:204 -msgid "The defined FileSet resources are:\n" -msgstr "De gedefinieerde Fileset media zijn:\n" - -#: src/dird/ua_restore.c:1532 src/dird/ua_run.c:1014 src/dird/ua_select.c:212 -msgid "FileSet" -msgstr "" - -#: src/dird/ua_restore.c:1532 src/dird/ua_select.c:212 -msgid "Select FileSet resource" -msgstr "Selecteer FileSet bron" - -#: src/dird/ua_restore.c:1534 -#, c-format -msgid "No FileSet found for client \"%s\".\n" -msgstr "" - -#: src/dird/ua_restore.c:1540 -#, c-format -msgid "Error getting FileSet record: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:1541 -msgid "" -"This probably means you modified the FileSet.\n" -"Continuing anyway.\n" -msgstr "" - -#: src/dird/ua_restore.c:1556 -#, c-format -msgid "Pool \"%s\" not found, using any pool.\n" -msgstr "" - -#: src/dird/ua_restore.c:1583 src/dird/ua_restore.c:1599 -#, c-format -msgid "No Full backup before %s found.\n" -msgstr "" - -#: src/dird/ua_restore.c:1628 -msgid "No jobs found.\n" -msgstr "" - -#: src/dird/ua_restore.c:1763 -#, c-format -msgid "" -"\n" -"Warning Storage is overridden by \"%s\" on the command line.\n" -msgstr "" - -#: src/dird/ua_restore.c:1768 -#, c-format -msgid "" -"This may not work because of two different MediaTypes:\n" -" Storage MediaType=\"%s\"\n" -" Volume MediaType=\"%s\".\n" -"\n" -msgstr "" - -#: src/dird/ua_restore.c:1787 -#, c-format -msgid "Using Storage \"%s\" from MediaType \"%s\".\n" -msgstr "" - -#: src/dird/ua_restore.c:1790 -#, c-format -msgid "Storage \"%s\" not found, using Storage \"%s\" from MediaType \"%s\".\n" -msgstr "" - -#: src/dird/ua_restore.c:1799 -#, c-format -msgid "" -"\n" -"Unable to find Storage resource for\n" -"MediaType \"%s\", needed by the Jobs you selected.\n" -msgstr "" - -#: src/dird/ua_run.c:165 -msgid "OK to run? (yes/mod/no): " -msgstr "" - -#: src/dird/ua_run.c:194 -#, c-format -msgid "" -"\n" -"Bad response: %s. You must answer yes, mod, or no.\n" -"\n" -msgstr "" - -#: src/dird/ua_run.c:198 -msgid "Job not run.\n" -msgstr "" - -#: src/dird/ua_run.c:237 -msgid "Job failed.\n" -msgstr "" - -#: src/dird/ua_run.c:240 -#, c-format -msgid "Job queued. JobId=%s\n" -msgstr "" - -#: src/dird/ua_run.c:258 -#, c-format -msgid "Job \"%s\" not found\n" -msgstr "" - -#: src/dird/ua_run.c:265 -msgid "A job name must be specified.\n" -msgstr "" - -#: src/dird/ua_run.c:271 -#, c-format -msgid "No authorization. Job \"%s\".\n" -msgstr "" - -#: src/dird/ua_run.c:289 -#, c-format -msgid "Pool \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_run.c:299 -#, c-format -msgid "No authorization. Pool \"%s\".\n" -msgstr "" - -#: src/dird/ua_run.c:313 -#, fuzzy, c-format -msgid "NextPool \"%s\" not found.\n" -msgstr "Job \"%s\" niet gevonden.\n" - -#: src/dird/ua_run.c:322 -#, fuzzy, c-format -msgid "No authorization. NextPool \"%s\".\n" -msgstr "Geen toegang tot Pool \"%s\"\n" - -#: src/dird/ua_run.c:353 src/dird/ua_run.c:373 -#, c-format -msgid "No authorization. Client \"%s\".\n" -msgstr "" - -#: src/dird/ua_run.c:363 -#, c-format -msgid "Restore Client \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_run.c:392 -#, c-format -msgid "FileSet \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_run.c:401 -#, c-format -msgid "No authorization. FileSet \"%s\".\n" -msgstr "" - -#: src/dird/ua_run.c:420 -#, c-format -msgid "Storage \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_run.c:423 src/dird/ua_run.c:1054 -msgid "user selection" -msgstr "" - -#: src/dird/ua_run.c:432 -#, c-format -msgid "No authorization. Storage \"%s\".\n" -msgstr "" - -#: src/dird/ua_run.c:456 -msgid "No JobId specified.\n" -msgstr "" - -#: src/dird/ua_run.c:470 -msgid "Invalid or no Job name specified.\n" -msgstr "" - -#: src/dird/ua_run.c:485 -#, fuzzy -msgid "Enter the JobId list to select: " -msgstr "Voer de gekozen Job in:" - -#: src/dird/ua_run.c:501 -#, c-format -msgid "JobId=%d entered is not in the list.\n" -msgstr "" - -#: src/dird/ua_run.c:525 -#, c-format -msgid "Could not get job record for selected JobId=%d. ERR=%s" -msgstr "" - -#: src/dird/ua_run.c:593 src/dird/ua_run.c:846 src/dird/ua_select.c:154 -msgid "You have the following choices:\n" -msgstr "U heeft de volgende keuzes:\n" - -#: src/dird/ua_run.c:597 -msgid "Select termination code: " -msgstr "" - -#: src/dird/ua_run.c:781 -#, fuzzy -msgid "Unable to use current plugin configuration, discarding it." -msgstr "Kan configuratiebestand niet lezen" - -#: src/dird/ua_run.c:796 -#, fuzzy -msgid "Plugin Restore Options\n" -msgstr "Uitvoeren herstel opdracht" - -#: src/dird/ua_run.c:807 -msgid "*None, but required*" -msgstr "" - -#: src/dird/ua_run.c:827 -#, fuzzy -msgid "Use above plugin configuration? (yes/mod/no): " -msgstr "Doorgaan? (ja, wijz, nee):" - -#: src/dird/ua_run.c:845 src/dird/ua_run.c:1007 src/dird/ua_select.c:73 -msgid "mod" -msgstr "" - -#: src/dird/ua_run.c:869 -#, c-format -msgid "Please enter a value for %s: " -msgstr "" - -#: src/dird/ua_run.c:943 -msgid "No plugin to configure\n" -msgstr "" - -#: src/dird/ua_run.c:951 -msgid "Plugins to configure:\n" -msgstr "" - -#: src/dird/ua_run.c:960 -msgid "Select plugin to configure" -msgstr "" - -#: src/dird/ua_run.c:976 -#, c-format -msgid "Can't configure %32s\n" -msgstr "" - -#: src/dird/ua_run.c:1011 -msgid "Level" -msgstr "" - -#: src/dird/ua_run.c:1016 -msgid "Restore Client" -msgstr "" - -#: src/dird/ua_run.c:1020 -msgid "When" -msgstr "" - -#: src/dird/ua_run.c:1021 -msgid "Priority" -msgstr "" - -#: src/dird/ua_run.c:1026 src/dird/ua_select.c:633 src/dird/ua_select.c:746 -#: src/dird/ua_update.c:615 -msgid "Pool" -msgstr "Pool" - -#: src/dird/ua_run.c:1031 -#, fuzzy -msgid "NextPool" -msgstr "Pool" - -#: src/dird/ua_run.c:1033 -msgid "Verify Job" -msgstr "" - -#: src/dird/ua_run.c:1036 -msgid "Bootstrap" -msgstr "" - -#: src/dird/ua_run.c:1037 -msgid "Where" -msgstr "" - -#: src/dird/ua_run.c:1038 -msgid "File Relocation" -msgstr "" - -#: src/dird/ua_run.c:1039 -msgid "Replace" -msgstr "" - -#: src/dird/ua_run.c:1040 -msgid "JobId" -msgstr "" - -#: src/dird/ua_run.c:1043 -msgid "Plugin Options" -msgstr "" - -#: src/dird/ua_run.c:1086 -msgid "" -"Please enter desired start time as YYYY-MM-DD HH:MM:SS (return for now): " -msgstr "" - -#: src/dird/ua_run.c:1094 src/dird/ua_run.c:1311 -msgid "Invalid time, using current time.\n" -msgstr "" - -#: src/dird/ua_run.c:1101 -msgid "Enter new Priority: " -msgstr "" - -#: src/dird/ua_run.c:1105 -msgid "Priority must be a positive integer.\n" -msgstr "" - -#: src/dird/ua_run.c:1126 -msgid "Please enter the Bootstrap file name: " -msgstr "" - -#: src/dird/ua_run.c:1138 -#, c-format -msgid "Warning cannot open %s: ERR=%s\n" -msgstr "" - -#: src/dird/ua_run.c:1168 -msgid "Please enter the full path prefix for restore (/ for none): " -msgstr "" - -#: src/dird/ua_run.c:1190 -msgid "Replace:\n" -msgstr "" - -#: src/dird/ua_run.c:1194 -msgid "Select replace option" -msgstr "" - -#: src/dird/ua_run.c:1205 -msgid "" -"You must set the bootstrap file to NULL to be able to specify a JobId.\n" -msgstr "" - -#: src/dird/ua_run.c:1217 -msgid "Please Plugin Options string: " -msgstr "" - -#: src/dird/ua_run.c:1260 src/dird/ua_run.c:1265 -#, fuzzy -msgid "Command input" -msgstr "Onjuiste opdrachtregel optie" - -#: src/dird/ua_run.c:1262 src/dird/ua_run.c:1267 src/dird/ua_run.c:1287 -msgid "User input" -msgstr "" - -#: src/dird/ua_run.c:1350 -#, c-format -msgid "Invalid replace option: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1449 -#, c-format -msgid "strip_prefix=%s add_prefix=%s add_suffix=%s\n" -msgstr "" - -#: src/dird/ua_run.c:1452 -msgid "This will replace your current Where value\n" -msgstr "" - -#: src/dird/ua_run.c:1453 -msgid "Strip prefix" -msgstr "" - -#: src/dird/ua_run.c:1454 -msgid "Add prefix" -msgstr "" - -#: src/dird/ua_run.c:1455 -msgid "Add file suffix" -msgstr "" - -#: src/dird/ua_run.c:1456 -msgid "Enter a regexp" -msgstr "" - -#: src/dird/ua_run.c:1457 -msgid "Test filename manipulation" -msgstr "" - -#: src/dird/ua_run.c:1458 -msgid "Use this ?" -msgstr "" - -#: src/dird/ua_run.c:1463 -msgid "Please enter the path prefix to strip: " -msgstr "" - -#: src/dird/ua_run.c:1471 -msgid "Please enter the path prefix to add (/ for none): " -msgstr "" - -#: src/dird/ua_run.c:1482 -msgid "Please enter the file suffix to add: " -msgstr "" - -#: src/dird/ua_run.c:1489 -msgid "Please enter a valid regexp (!from!to!): " -msgstr "" - -#: src/dird/ua_run.c:1502 -#, c-format -msgid "regexwhere=%s\n" -msgstr "" - -#: src/dird/ua_run.c:1508 -#, c-format -msgid "strip_prefix=%s add_prefix=%s add_suffix=%s result=%s\n" -msgstr "" - -#: src/dird/ua_run.c:1515 -msgid "Cannot use your regexp\n" -msgstr "" - -#: src/dird/ua_run.c:1518 -msgid "Enter a period (.) to stop this test\n" -msgstr "" - -#: src/dird/ua_run.c:1519 -msgid "Please enter filename to test: " -msgstr "" - -#: src/dird/ua_run.c:1521 -#, c-format -msgid "%s -> %s\n" -msgstr "" - -#: src/dird/ua_run.c:1565 -msgid "Cannot use your regexp.\n" -msgstr "" - -#: src/dird/ua_run.c:1578 src/dird/ua_run.c:1608 -msgid "Levels:\n" -msgstr "" - -#: src/dird/ua_run.c:1580 src/lib/util.c:505 src/lib/util.c:551 -msgid "Full" -msgstr "" - -#: src/dird/ua_run.c:1581 src/lib/util.c:508 -msgid "Incremental" -msgstr "" - -#: src/dird/ua_run.c:1582 src/lib/util.c:511 -msgid "Differential" -msgstr "" - -#: src/dird/ua_run.c:1583 src/lib/util.c:514 -msgid "Since" -msgstr "" - -#: src/dird/ua_run.c:1584 -msgid "VirtualFull" -msgstr "" - -#: src/dird/ua_run.c:1585 src/dird/ua_run.c:1614 -msgid "Select level" -msgstr "" - -#: src/dird/ua_run.c:1609 -msgid "Initialize Catalog" -msgstr "" - -#: src/dird/ua_run.c:1610 src/lib/util.c:517 -msgid "Verify Catalog" -msgstr "" - -#: src/dird/ua_run.c:1611 src/lib/util.c:523 -msgid "Verify Volume to Catalog" -msgstr "" - -#: src/dird/ua_run.c:1612 src/lib/util.c:526 -msgid "Verify Disk to Catalog" -msgstr "" - -#: src/dird/ua_run.c:1613 -msgid "Verify Volume Data (not yet implemented)" -msgstr "" - -#: src/dird/ua_run.c:1634 -msgid "Level not appropriate for this Job. Cannot be changed.\n" -msgstr "" - -#: src/dird/ua_run.c:1665 -#, c-format -msgid "" -"Run Admin Job\n" -"JobName: %s\n" -"FileSet: %s\n" -"Client: %s\n" -"Storage: %s\n" -"When: %s\n" -"Priority: %d\n" -msgstr "" - -#: src/dird/ua_run.c:1723 -#, c-format -msgid "" -"Run Backup job\n" -"JobName: %s\n" -"Level: %s\n" -"Client: %s\n" -"FileSet: %s\n" -"Pool: %s (From %s)\n" -"%sStorage: %s (From %s)\n" -"When: %s\n" -"Priority: %d\n" -"%s%s%s" -msgstr "" - -#: src/dird/ua_run.c:1756 -#, c-format -msgid "Could not get job record for selected JobId. ERR=%s" -msgstr "" - -#: src/dird/ua_run.c:1795 -#, c-format -msgid "" -"Run Verify Job\n" -"JobName: %s\n" -"Level: %s\n" -"Client: %s\n" -"FileSet: %s\n" -"Pool: %s (From %s)\n" -"Storage: %s (From %s)\n" -"Verify Job: %s\n" -"Verify List: %s\n" -"When: %s\n" -"Priority: %d\n" -msgstr "" - -#: src/dird/ua_run.c:1824 -msgid "Please enter a JobId for restore: " -msgstr "" - -#: src/dird/ua_run.c:1863 src/dird/ua_run.c:1890 src/dird/ua_run.c:1921 -#: src/dird/ua_run.c:1948 src/dird/ua_run.c:1986 -msgid "User specified" -msgstr "" - -#: src/dird/ua_run.c:1865 -#, c-format -msgid "" -"Run Restore job\n" -"JobName: %s\n" -"Bootstrap: %s\n" -"RegexWhere: %s\n" -"Replace: %s\n" -"FileSet: %s\n" -"Backup Client: %s\n" -"Restore Client: %s\n" -"Storage: %s\n" -"When: %s\n" -"Catalog: %s\n" -"Priority: %d\n" -"Plugin Options: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1923 -#, c-format -msgid "" -"Run Restore job\n" -"JobName: %s\n" -"Bootstrap: %s\n" -"Where: %s\n" -"Replace: %s\n" -"FileSet: %s\n" -"Backup Client: %s\n" -"Restore Client: %s\n" -"Storage: %s\n" -"When: %s\n" -"Catalog: %s\n" -"Priority: %d\n" -"Plugin Options: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1955 -#, c-format -msgid "" -"Run Restore job\n" -"JobName: %s\n" -"Bootstrap: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1963 -#, c-format -msgid "RegexWhere: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1966 -#, c-format -msgid "Where: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1970 -#, c-format -msgid "" -"Replace: %s\n" -"Client: %s\n" -"Storage: %s\n" -"JobId: %s\n" -"When: %s\n" -"Catalog: %s\n" -"Priority: %d\n" -"Plugin Options: %s\n" -msgstr "" - -#: src/dird/ua_run.c:2028 -msgid "Run Copy job\n" -msgstr "" - -#: src/dird/ua_run.c:2030 -msgid "Run Migration job\n" -msgstr "" - -#: src/dird/ua_run.c:2062 -#, c-format -msgid "Unknown Job Type=%d\n" -msgstr "" - -#: src/dird/ua_run.c:2136 -#, c-format -msgid "Value missing for keyword %s\n" -msgstr "" - -#: src/dird/ua_run.c:2146 -msgid "JobId specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2155 src/dird/ua_run.c:2295 -msgid "Client specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2163 -msgid "FileSet specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2171 -msgid "Level specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2180 -msgid "Storage specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2188 -msgid "RegexWhere or Where specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2193 -msgid "No authorization for \"regexwhere\" specification.\n" -msgstr "" - -#: src/dird/ua_run.c:2200 -msgid "Where or RegexWhere specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2205 -msgid "No authoriztion for \"where\" specification.\n" -msgstr "" - -#: src/dird/ua_run.c:2212 -msgid "Bootstrap specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2220 -msgid "Replace specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2228 -msgid "When specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2236 -msgid "Priority specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2241 -msgid "Priority must be positive nonzero setting it to 10.\n" -msgstr "" - -#: src/dird/ua_run.c:2251 -msgid "Verify Job specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2279 -msgid "Migration Job specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2287 -msgid "Pool specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2303 -msgid "Restore Client specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2310 -msgid "Plugin Options not yet implemented.\n" -msgstr "" - -#: src/dird/ua_run.c:2313 -msgid "Plugin Options specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2318 -msgid "No authoriztion for \"PluginOptions\" specification.\n" -msgstr "" - -#: src/dird/ua_run.c:2325 -msgid "Spool flag specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2332 -msgid "Invalid spooldata flag.\n" -msgstr "" - -#: src/dird/ua_run.c:2341 -msgid "IgnoreDuplicateCheck flag specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2348 -msgid "Invalid ignoreduplicatecheck flag.\n" -msgstr "" - -#: src/dird/ua_run.c:2353 -msgid "Accurate flag specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2360 -msgid "Invalid accurate flag.\n" -msgstr "" - -#: src/dird/ua_run.c:2365 -msgid "Job name specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2373 -msgid "Media Type specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2381 -msgid "NextPool specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2406 -#, c-format -msgid "Invalid keyword: %s\n" -msgstr "" - -#: src/dird/ua_run.c:2421 -#, c-format -msgid "Catalog \"%s\" not found\n" -msgstr "" - -#: src/dird/ua_run.c:2425 -#, c-format -msgid "No authorization. Catalog \"%s\".\n" -msgstr "" - -#: src/dird/ua_run.c:2459 -#, c-format -msgid "Verify Job \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_run.c:2469 -#, c-format -msgid "Migration Job \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_select.c:39 src/dird/ua_select.c:65 -#, c-format -msgid "The current %s retention period is: %s\n" -msgstr "De huidige %s retention periode: %s\n" - -#: src/dird/ua_select.c:44 -#, fuzzy -msgid "Continue? (yes/no): " -msgstr "Doorgaan? (ja, wijz, nee):" - -#: src/dird/ua_select.c:70 -msgid "Continue? (yes/mod/no): " -msgstr "Doorgaan? (ja, wijz, nee):" - -#: src/dird/ua_select.c:74 -msgid "Enter new retention period: " -msgstr "Geef nieuwe retention periode:" - -#: src/dird/ua_select.c:78 -msgid "Invalid period.\n" -msgstr "Onjuiste periode.\n" - -#: src/dird/ua_select.c:177 -msgid "The defined Storage resources are:\n" -msgstr "De gedefinieerde Opslag media zijn:\n" - -#: src/dird/ua_select.c:189 -msgid "Select Storage resource" -msgstr "Selecteer opslag medium" - -#: src/dird/ua_select.c:245 -msgid "You must specify a \"use \" command before continuing.\n" -msgstr "" -"U diente een \"use \" te specificeren alvorens te kunnen " -"doorgaan.\n" - -#: src/dird/ua_select.c:251 -msgid "The defined Catalog resources are:\n" -msgstr "De gedefinieerde Catalog media zijn:\n" - -#: src/dird/ua_select.c:259 -msgid "Catalog" -msgstr "" - -#: src/dird/ua_select.c:259 -msgid "Select Catalog resource" -msgstr "Selecteer Catalog media" - -#: src/dird/ua_select.c:278 -#, fuzzy -msgid "The disabled Job resources are:\n" -msgstr "De gedefinieerde job resources zijn:\n" - -#: src/dird/ua_select.c:280 -#, fuzzy -msgid "The enabled Job resources are:\n" -msgstr "De gedefinieerde job resources zijn:\n" - -#: src/dird/ua_select.c:292 src/dird/ua_select.c:315 -msgid "Select Job resource" -msgstr "Selecteer Job media:" - -#: src/dird/ua_select.c:307 -msgid "The defined Job resources are:\n" -msgstr "De gedefinieerde job resources zijn:\n" - -#: src/dird/ua_select.c:334 -#, c-format -msgid "Error: Restore Job resource \"%s\" does not exist.\n" -msgstr "" - -#: src/dird/ua_select.c:348 -msgid "The defined Restore Job resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:356 -msgid "Select Restore Job" -msgstr "Selecteer Job om terug te zetten" - -#: src/dird/ua_select.c:372 src/dird/ua_select.c:399 -msgid "The defined Client resources are:\n" -msgstr "De gedefinieerde Clients zijn:\n" - -#: src/dird/ua_select.c:383 -#, fuzzy -msgid "Select Client resource" -msgstr "Selecteer FileSet bron" - -#: src/dird/ua_select.c:407 -msgid "Select Client (File daemon) resource" -msgstr "Selecteer een Client (File daemon)" - -#: src/dird/ua_select.c:434 -#, c-format -msgid "Error: Client resource %s does not exist.\n" -msgstr "Fout: Client %s bestaat niet.\n" - -#: src/dird/ua_select.c:450 -#, fuzzy -msgid "The defined Schedule resources are:\n" -msgstr "De gedefinieerde Clients zijn:\n" - -#: src/dird/ua_select.c:461 -msgid "Schedule" -msgstr "" - -#: src/dird/ua_select.c:461 -#, fuzzy -msgid "Select Schedule resource" -msgstr "Selecteer Pool" - -#: src/dird/ua_select.c:487 -#, c-format -msgid "Could not find Client %s: ERR=%s" -msgstr "Kan Client niet vinden %s: ERR=%s" - -#: src/dird/ua_select.c:497 src/dird/ua_select.c:551 -#, c-format -msgid "Could not find Client \"%s\": ERR=%s" -msgstr "Kan Client niet vinden \"%s\": ERR=%s" - -#: src/dird/ua_select.c:526 -#, c-format -msgid "Error obtaining client ids. ERR=%s\n" -msgstr "" - -#: src/dird/ua_select.c:530 -msgid "No clients defined. You must run a job before using this command.\n" -msgstr "" - -#: src/dird/ua_select.c:534 -msgid "Defined Clients:\n" -msgstr "Gedefinieerde Clients:\n" - -#: src/dird/ua_select.c:544 -msgid "Select the Client" -msgstr "Selecteer Client" - -#: src/dird/ua_select.c:577 src/dird/ua_select.c:601 src/dird/ua_select.c:646 -#, c-format -msgid "Could not find Pool \"%s\": ERR=%s" -msgstr "" - -#: src/dird/ua_select.c:616 -msgid "No pools defined. Use the \"create\" command to create one.\n" -msgstr "" - -#: src/dird/ua_select.c:620 -msgid "Defined Pools:\n" -msgstr "Gedefinieerde Pools:\n" - -#: src/dird/ua_select.c:633 -msgid "Select the Pool" -msgstr "Selecteer Pool" - -#: src/dird/ua_select.c:671 -#, c-format -msgid "No access to Pool \"%s\"\n" -msgstr "Geen toegang tot Pool \"%s\"\n" - -#: src/dird/ua_select.c:703 -#, fuzzy -msgid "Enter a Volume name or *MediaId: " -msgstr "Voer *MediaId of Volume naam in:" - -#: src/dird/ua_select.c:738 -msgid "The defined Pool resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:746 -msgid "Select Pool resource" -msgstr "Selecteer Pool" - -#: src/dird/ua_select.c:781 -msgid "Enter the JobId to select: " -msgstr "Voer de gekozen Job in:" - -#: src/dird/ua_select.c:819 -#, c-format -msgid "Could not find Job \"%s\": ERR=%s" -msgstr "Kan Job niet vinden \"%s\": ERR=%s" - -#: src/dird/ua_select.c:910 src/dird/ua_select.c:1006 -#, c-format -msgid "Automatically selected %s: %s\n" -msgstr "" - -#: src/dird/ua_select.c:921 src/dird/ua_select.c:1017 -#, c-format -msgid "" -"Your request has multiple choices for \"%s\". Selection is not possible in " -"batch mode.\n" -msgstr "" - -#: src/dird/ua_select.c:939 src/dird/ua_select.c:999 -#, c-format -msgid "Selection list for \"%s\" is empty!\n" -msgstr "" - -#: src/dird/ua_select.c:945 -#, c-format -msgid "Automatically selected: %s\n" -msgstr "" - -#: src/dird/ua_select.c:957 -msgid "Selection aborted, nothing done.\n" -msgstr "" - -#: src/dird/ua_select.c:962 src/dird/ua_select.c:1051 -#, c-format -msgid "Please enter a number between 1 and %d\n" -msgstr "Voer een nummer in tussen 1 en %d\n" - -#: src/dird/ua_select.c:1105 -msgid "Storage name given twice.\n" -msgstr "" - -#: src/dird/ua_select.c:1122 -#, c-format -msgid "Expecting jobid=nn command, got: %s\n" -msgstr "" - -#: src/dird/ua_select.c:1126 -#, c-format -msgid "JobId %s is not running.\n" -msgstr "JobID %s is niet in uitvoering.\n" - -#: src/dird/ua_select.c:1136 -#, c-format -msgid "Expecting job=xxx, got: %s.\n" -msgstr "" - -#: src/dird/ua_select.c:1140 -#, c-format -msgid "Job \"%s\" is not running.\n" -msgstr "Job \"%s\" is niet in uitvoering.\n" - -#: src/dird/ua_select.c:1148 -#, c-format -msgid "Expecting ujobid=xxx, got: %s.\n" -msgstr "" - -#: src/dird/ua_select.c:1169 -#, c-format -msgid "Storage resource \"%s\": not found\n" -msgstr "" - -#: src/dird/ua_select.c:1201 -msgid "Enter autochanger drive[0]: " -msgstr "Voer autochanger drive[0] in: " - -#: src/dird/ua_select.c:1222 -msgid "Enter autochanger slot: " -msgstr "Voer autochanger slot in:" - -#: src/dird/ua_select.c:1252 -msgid "Media Types defined in conf file:\n" -msgstr "" - -#: src/dird/ua_select.c:1258 -msgid "Media Type" -msgstr "Type media" - -#: src/dird/ua_select.c:1258 -msgid "Select the Media Type" -msgstr "Selecteer media type" - -#: src/dird/ua_select.c:1296 src/filed/status.c:322 src/stored/status.c:915 -msgid "No Jobs running.\n" -msgstr "Geen Jobs in uitvoering.\n" - -#: src/dird/ua_select.c:1298 -msgid "None of your jobs are running.\n" -msgstr "Geen van uw opdrachten zijn in uitvoering.\n" - -#: src/dird/ua_select.c:1326 -msgid "No value given for \"jobid\".\n" -msgstr "" - -#: src/dird/ua_select.c:1338 -#, c-format -msgid "Unauthorized command from this console for JobId=%d.\n" -msgstr "" - -#: src/dird/ua_select.c:1342 -#, fuzzy, c-format -msgid "Warning Job JobId=%d is not running.\n" -msgstr "JobID %s is niet in uitvoering.\n" - -#: src/dird/ua_select.c:1367 src/dird/ua_select.c:1462 -#, fuzzy, c-format -msgid "Confirm %s of %d Job%s (yes/no): " -msgstr "Bevestig annulering (yes/no)" - -#: src/dird/ua_select.c:1380 -msgid "No value given for \"job\".\n" -msgstr "" - -#: src/dird/ua_select.c:1390 -#, c-format -msgid "Unauthorized command from this console for job=%s.\n" -msgstr "" - -#: src/dird/ua_select.c:1396 src/dird/ua_select.c:1421 -#, fuzzy, c-format -msgid "Warning Job %s is not running.\n" -msgstr "JobID %s is niet in uitvoering.\n" - -#: src/dird/ua_select.c:1405 -msgid "No value given for \"ujobid\".\n" -msgstr "" - -#: src/dird/ua_select.c:1415 -#, c-format -msgid "Unauthorized command from this console for ujobid=%s.\n" -msgstr "" - -#: src/dird/ua_select.c:1441 -#, fuzzy -msgid "Select Job(s):\n" -msgstr "Selecteer Job:\n" - -#: src/dird/ua_select.c:1447 -#, c-format -msgid "JobId=%s Job=%s" -msgstr "" - -#: src/dird/ua_select.c:1451 -#, fuzzy, c-format -msgid "Choose Job list to %s" -msgstr "Voer de gekozen Job in:" - -#: src/dird/ua_server.c:57 -#, c-format -msgid "Cannot create UA thread: %s\n" -msgstr "" - -#: src/dird/ua_server.c:147 -msgid "You have messages.\n" -msgstr "U heeft berichten.\n" - -#: src/dird/ua_status.c:171 -msgid "Status available for:\n" -msgstr "" - -#: src/dird/ua_status.c:178 -msgid "Select daemon type for status" -msgstr "" - -#: src/dird/ua_status.c:324 src/stored/status.c:499 -#, c-format -msgid "%s %sVersion: %s (%s) %s %s %s\n" -msgstr "" - -#: src/dird/ua_status.c:328 -#, c-format -msgid "Daemon started %s, conf reloaded %s\n" -msgstr "" - -#: src/dird/ua_status.c:329 -#, c-format -msgid " Jobs: run=%d, running=%d mode=%d,%d\n" -msgstr "" - -#: src/dird/ua_status.c:331 src/filed/status.c:175 src/stored/status.c:509 -#, c-format -msgid " Heap: heap=%s smbytes=%s max_bytes=%s bufs=%s max_bufs=%s\n" -msgstr "" - -#: src/dird/ua_status.c:337 -#, c-format -msgid "" -" Res: njobs=%d nclients=%d nstores=%d npools=%d ncats=%d nfsets=%d nscheds=" -"%d\n" -msgstr "" - -#: src/dird/ua_status.c:394 -#, c-format -msgid "No authorization for Storage \"%s\"\n" -msgstr "" - -#: src/dird/ua_status.c:404 -msgid "Restricted Client or Job does not permit access to Storage daemons\n" -msgstr "" - -#: src/dird/ua_status.c:414 -#, c-format -msgid "" -"\n" -"Failed to connect to Storage daemon %s.\n" -"====\n" -msgstr "" - -#: src/dird/ua_status.c:429 -msgid "Must have three aguments\n" -msgstr "" - -#: src/dird/ua_status.c:478 -#, c-format -msgid "" -"Failed to connect to Client %s.\n" -"====\n" -msgstr "" - -#: src/dird/ua_status.c:483 -msgid "Connected to file daemon\n" -msgstr "" - -#: src/dird/ua_status.c:502 src/dird/ua_status.c:511 -msgid "" -"\n" -"Scheduled Jobs:\n" -msgstr "" - -#: src/dird/ua_status.c:503 -msgid "" -"Level Type Pri Scheduled Job Name Volume\n" -msgstr "" - -#: src/dird/ua_status.c:504 -msgid "===================================================================================\n" -msgstr "" - -#: src/dird/ua_status.c:512 -msgid "" -"Level Type Pri Scheduled Job Name Schedule\n" -msgstr "" - -#: src/dird/ua_status.c:513 -msgid "=====================================================================================\n" -msgstr "" - -#: src/dird/ua_status.c:570 src/dird/ua_status.c:753 -#, c-format -msgid "%-14s\t%-8s\t%3d\t%-18s\t%-18s\t%s\n" -msgstr "" - -#: src/dird/ua_status.c:591 src/dird/ua_status.c:757 -#, c-format -msgid "%-14s %-8s %3d %-18s %-18s %s\n" -msgstr "" - -#: src/dird/ua_status.c:627 -msgid "Ignoring invalid value for days. Max is 3000.\n" -msgstr "" - -#: src/dird/ua_status.c:638 -msgid "Ignoring invalid value for limit. Max is 2000.\n" -msgstr "" - -#: src/dird/ua_status.c:649 -msgid "Ignoring invalid time.\n" -msgstr "" - -#: src/dird/ua_status.c:772 src/dird/ua_status.c:877 -msgid "No Scheduled Jobs.\n" -msgstr "" - -#: src/dird/ua_status.c:824 -msgid "Ignoring invalid value for days. Max is 500.\n" -msgstr "" - -#: src/dird/ua_status.c:903 src/filed/status.c:228 src/stored/status.c:816 -msgid "" -"\n" -"Running Jobs:\n" -msgstr "" - -#: src/dird/ua_status.c:911 -#, fuzzy, c-format -msgid "Console connected %sat %s\n" -msgstr "Al verbonden\"%s\".\n" - -#: src/dird/ua_status.c:912 src/filed/status.c:240 -msgid "using TLS " -msgstr "" - -#: src/dird/ua_status.c:922 -msgid "" -"No Jobs running.\n" -"====\n" -msgstr "" - -#: src/dird/ua_status.c:929 -msgid " JobId Type Level Files Bytes Name Status\n" -msgstr "" - -#: src/dird/ua_status.c:930 -msgid "======================================================================\n" -msgstr "" - -#: src/dird/ua_status.c:945 -msgid "is waiting execution" -msgstr "" - -#: src/dird/ua_status.c:948 -msgid "is running" -msgstr "" - -#: src/dird/ua_status.c:951 -msgid "is blocked" -msgstr "" - -#: src/dird/ua_status.c:954 -msgid "has terminated" -msgstr "" - -#: src/dird/ua_status.c:957 -msgid "has terminated with warnings" -msgstr "" - -#: src/dird/ua_status.c:960 -msgid "has terminated in incomplete state" -msgstr "" - -#: src/dird/ua_status.c:963 -msgid "has erred" -msgstr "" - -#: src/dird/ua_status.c:966 -msgid "has errors" -msgstr "" - -#: src/dird/ua_status.c:969 -msgid "has a fatal error" -msgstr "" - -#: src/dird/ua_status.c:972 -msgid "has verify differences" -msgstr "" - -#: src/dird/ua_status.c:975 -msgid "has been canceled" -msgstr "" - -#: src/dird/ua_status.c:980 -msgid "is waiting on Client" -msgstr "" - -#: src/dird/ua_status.c:982 -#, c-format -msgid "is waiting on Client %s" -msgstr "" - -#: src/dird/ua_status.c:990 src/dird/ua_status.c:992 -#, c-format -msgid "is waiting on Storage \"%s\"" -msgstr "" - -#: src/dird/ua_status.c:994 -msgid "is waiting on Storage" -msgstr "" - -#: src/dird/ua_status.c:1000 -msgid "is waiting on max Storage jobs" -msgstr "" - -#: src/dird/ua_status.c:1003 -msgid "is waiting on max Client jobs" -msgstr "" - -#: src/dird/ua_status.c:1006 -msgid "is waiting on max Job jobs" -msgstr "" - -#: src/dird/ua_status.c:1009 -msgid "is waiting on max total jobs" -msgstr "" - -#: src/dird/ua_status.c:1013 -#, fuzzy, c-format -msgid "is waiting for its start time (%s)" -msgstr "Job %s wacht %d seconde voor de start tijd.\n" - -#: src/dird/ua_status.c:1019 -msgid "is waiting for higher priority jobs to finish" -msgstr "" - -#: src/dird/ua_status.c:1022 -msgid "is waiting for a Shared Storage device" -msgstr "" - -#: src/dird/ua_status.c:1025 src/dird/ua_status.c:1076 src/lib/util.c:317 -msgid "SD committing Data" -msgstr "" - -#: src/dird/ua_status.c:1028 src/dird/ua_status.c:1079 src/lib/util.c:320 -msgid "SD despooling Data" -msgstr "" - -#: src/dird/ua_status.c:1031 src/dird/ua_status.c:1082 src/lib/util.c:323 -msgid "SD despooling Attributes" -msgstr "" - -#: src/dird/ua_status.c:1034 src/dird/ua_status.c:1085 src/lib/util.c:326 -msgid "Dir inserting Attributes" -msgstr "" - -#: src/dird/ua_status.c:1039 -#, c-format -msgid "is in unknown state %c" -msgstr "" - -#: src/dird/ua_status.c:1053 -msgid "is waiting for a mount request" -msgstr "" - -#: src/dird/ua_status.c:1060 -msgid "is waiting for an appendable Volume" -msgstr "" - -#: src/dird/ua_status.c:1068 -msgid "is waiting for Client to connect to Storage daemon" -msgstr "" - -#: src/dird/ua_status.c:1070 -#, c-format -msgid "is waiting for Client %s to connect to Storage %s" -msgstr "" - -#: src/dird/ua_status.c:1101 -#, c-format -msgid "%6d\t%-6s\t%-20s\t%s\t%s\n" -msgstr "" - -#: src/dird/ua_status.c:1133 -#, c-format -msgid "%6d %-4s %-3s %10s %10s %-17s %s\n" -msgstr "" - -#: src/dird/ua_status.c:1161 -msgid "No Terminated Jobs.\n" -msgstr "" - -#: src/dird/ua_status.c:1167 src/lib/status.h:77 -msgid "" -"\n" -"Terminated Jobs:\n" -msgstr "" - -#: src/dird/ua_status.c:1168 src/lib/status.h:84 -msgid " JobId Level Files Bytes Status Finished Name \n" -msgstr "" - -#: src/dird/ua_status.c:1169 -msgid "====================================================================\n" -msgstr "" - -#: src/dird/ua_status.c:1203 src/lib/status.h:110 src/lib/util.c:256 -msgid "Created" -msgstr "" - -#: src/dird/ua_status.c:1210 src/lib/status.h:117 -msgid "Diffs" -msgstr "" - -#: src/dird/ua_status.c:1219 src/lib/status.h:126 src/lib/util.c:278 -#: src/lib/util.c:400 src/lib/util.c:406 -msgid "OK -- with warnings" -msgstr "" - -#: src/dird/ua_status.c:1222 src/lib/status.h:129 -msgid "Incomplete" -msgstr "" - -#: src/dird/ua_status.c:1225 src/lib/status.h:132 -msgid "Other" -msgstr "" - -#: src/dird/ua_status.c:1229 src/lib/status.h:144 -#, c-format -msgid "%6d\t%-6s\t%8s\t%10s\t%-7s\t%-8s\t%s\n" -msgstr "" - -#: src/dird/ua_status.c:1255 src/lib/status.h:173 -#, c-format -msgid "%6d %-6s %8s %10s %-7s %-8s %s\n" -msgstr "" - -#: src/dird/ua_status.c:1265 -msgid "\n" -msgstr "" - -#: src/dird/ua_tree.c:63 -msgid "add dir/file to be restored recursively, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:64 -msgid "change current directory" -msgstr "" - -#: src/dird/ua_tree.c:65 -msgid "count marked files in and below the cd" -msgstr "" - -#: src/dird/ua_tree.c:66 -msgid "delete dir/file to be restored recursively in dir" -msgstr "" - -#: src/dird/ua_tree.c:67 src/dird/ua_tree.c:68 -msgid "long list current directory, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:69 -msgid "leave file selection mode" -msgstr "" - -#: src/dird/ua_tree.c:70 -msgid "estimate restore size" -msgstr "" - -#: src/dird/ua_tree.c:71 -msgid "same as done command" -msgstr "" - -#: src/dird/ua_tree.c:72 -msgid "find files, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:73 src/dird/ua_tree.c:86 src/dird/ua_tree.c:87 -msgid "print help" -msgstr "" - -#: src/dird/ua_tree.c:74 src/dird/ua_tree.c:75 -msgid "list current directory, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:76 -msgid "list subdir in current directory, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:77 -msgid "list the marked files in and below the cd" -msgstr "" - -#: src/dird/ua_tree.c:78 -msgid "list the marked files in" -msgstr "" - -#: src/dird/ua_tree.c:79 -msgid "mark dir/file to be restored recursively, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:80 -msgid "mark directory name to be restored (no files)" -msgstr "" - -#: src/dird/ua_tree.c:81 src/dird/ua_tree.c:82 -msgid "print current working directory" -msgstr "" - -#: src/dird/ua_tree.c:83 -msgid "unmark dir/file to be restored recursively in dir" -msgstr "" - -#: src/dird/ua_tree.c:84 -msgid "unmark directory name only no recursion" -msgstr "" - -#: src/dird/ua_tree.c:85 -msgid "quit and do not do restore" -msgstr "" - -#: src/dird/ua_tree.c:107 -msgid "" -"\n" -"You are now entering file selection mode where you add (mark) and\n" -"remove (unmark) files to be restored. No files are initially added, unless\n" -"you used the \"all\" keyword on the command line.\n" -"Enter \"done\" to leave this mode.\n" -"\n" -msgstr "" - -#: src/dird/ua_tree.c:118 src/dird/ua_tree.c:848 -#, c-format -msgid "cwd is: %s\n" -msgstr "" - -#: src/dird/ua_tree.c:127 src/dird/ua_tree.c:146 -#, c-format -msgid "Invalid command \"%s\". Enter \"done\" to exit.\n" -msgstr "" - -#: src/dird/ua_tree.c:218 -#, c-format -msgid "" -"Something is wrong with the Delta sequence of %s, skiping new parts. Current " -"sequence is %d\n" -msgstr "" - -#: src/dird/ua_tree.c:390 src/dird/ua_tree.c:402 src/dird/ua_tree.c:419 -msgid "No files marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:404 -msgid "1 file marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:406 -#, c-format -msgid "%s files marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:434 -msgid "No directories marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:436 -msgid "1 directory marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:438 -#, c-format -msgid "%s directories marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:459 -#, c-format -msgid "%s total files/dirs. %s marked to be restored.\n" -msgstr "" - -#: src/dird/ua_tree.c:470 -msgid "No file specification given.\n" -msgstr "" - -#: src/dird/ua_tree.c:691 -#, c-format -msgid "Node %s has no children.\n" -msgstr "" - -#: src/dird/ua_tree.c:784 -#, c-format -msgid "%d total files; %d marked to be restored; %s bytes.\n" -msgstr "" - -#: src/dird/ua_tree.c:795 src/stored/btape.c:2948 -#, c-format -msgid "" -" Command Description\n" -" ======= ===========\n" -msgstr "" - -#: src/dird/ua_tree.c:818 -msgid "Too few or too many arguments. Try using double quotes.\n" -msgstr "" - -#: src/dird/ua_tree.c:831 -msgid "Invalid path given.\n" -msgstr "" - -#: src/dird/ua_tree.c:867 src/dird/ua_tree.c:879 -msgid "No files unmarked.\n" -msgstr "" - -#: src/dird/ua_tree.c:881 -msgid "1 file unmarked.\n" -msgstr "" - -#: src/dird/ua_tree.c:884 -#, c-format -msgid "%s files unmarked.\n" -msgstr "" - -#: src/dird/ua_tree.c:895 src/dird/ua_tree.c:912 -msgid "No directories unmarked.\n" -msgstr "" - -#: src/dird/ua_tree.c:914 -msgid "1 directory unmarked.\n" -msgstr "" - -#: src/dird/ua_tree.c:916 -#, c-format -msgid "%d directories unmarked.\n" -msgstr "" - -#: src/dird/ua_update.c:92 -msgid "Update choice:\n" -msgstr "" - -#: src/dird/ua_update.c:93 -msgid "Volume parameters" -msgstr "" - -#: src/dird/ua_update.c:94 -msgid "Pool from resource" -msgstr "" - -#: src/dird/ua_update.c:95 -msgid "Slots from autochanger" -msgstr "" - -#: src/dird/ua_update.c:96 -msgid "Long term statistics" -msgstr "" - -#: src/dird/ua_update.c:97 -msgid "Snapshot parameters" -msgstr "" - -#: src/dird/ua_update.c:98 -msgid "item" -msgstr "" - -#: src/dird/ua_update.c:98 -msgid "Choose catalog item to update" -msgstr "" - -#: src/dird/ua_update.c:144 -#, c-format -msgid "Invalid VolStatus specified: %s\n" -msgstr "" - -#: src/dird/ua_update.c:153 -#, c-format -msgid "New Volume status is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:182 -#, c-format -msgid "Invalid use duration specified: %s\n" -msgstr "" - -#: src/dird/ua_update.c:190 -#, c-format -msgid "New use duration is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:204 -#, c-format -msgid "New max jobs is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:217 -#, c-format -msgid "New max files is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:228 -#, c-format -msgid "Invalid max. bytes specification: %s\n" -msgstr "" - -#: src/dird/ua_update.c:236 -#, c-format -msgid "New Max bytes is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:247 src/dird/ua_update.c:267 -msgid "Invalid value. It must be yes or no.\n" -msgstr "" - -#: src/dird/ua_update.c:255 -#, c-format -msgid "New Recycle flag is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:275 -#, c-format -msgid "New InChanger flag is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:293 -#, c-format -msgid "Invalid slot, it must be between 0 and MaxVols=%d\n" -msgstr "" - -#: src/dird/ua_update.c:303 src/dird/ua_update.c:727 -#, c-format -msgid "Error updating media record Slot: ERR=%s" -msgstr "" - -#: src/dird/ua_update.c:305 -#, c-format -msgid "New Slot is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:330 -#, c-format -msgid "New Pool is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:373 -#, c-format -msgid "New RecyclePool is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:393 -#, c-format -msgid "Error updating Volume record: ERR=%s" -msgstr "" - -#: src/dird/ua_update.c:395 -#, c-format -msgid "Volume defaults updated from \"%s\" Pool record.\n" -msgstr "" - -#: src/dird/ua_update.c:418 src/dird/ua_update.c:450 -#, c-format -msgid "Error updating Volume records: ERR=%s" -msgstr "" - -#: src/dird/ua_update.c:420 src/dird/ua_update.c:452 -#, c-format -msgid "All Volume defaults updated from \"%s\" Pool record.\n" -msgstr "" - -#: src/dird/ua_update.c:442 -#, c-format -msgid "Updating all pools, but skipped PoolId=%d. ERR=%s\n" -msgstr "" - -#: src/dird/ua_update.c:468 -#, c-format -msgid "Error updating media record Enabled: ERR=%s" -msgstr "" - -#: src/dird/ua_update.c:471 -#, c-format -msgid "New Enabled is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:486 -#, c-format -msgid "Error updating media record ActionOnPurge: ERR=%s" -msgstr "" - -#: src/dird/ua_update.c:489 -#, c-format -msgid "New ActionOnPurge is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:605 -msgid "Volume Status" -msgstr "" - -#: src/dird/ua_update.c:606 -msgid "Volume Retention Period" -msgstr "" - -#: src/dird/ua_update.c:607 -msgid "Volume Use Duration" -msgstr "" - -#: src/dird/ua_update.c:608 -msgid "Maximum Volume Jobs" -msgstr "" - -#: src/dird/ua_update.c:609 -msgid "Maximum Volume Files" -msgstr "" - -#: src/dird/ua_update.c:610 -msgid "Maximum Volume Bytes" -msgstr "" - -#: src/dird/ua_update.c:611 -msgid "Recycle Flag" -msgstr "" - -#: src/dird/ua_update.c:612 -msgid "Slot" -msgstr "" - -#: src/dird/ua_update.c:613 -msgid "InChanger Flag" -msgstr "" - -#: src/dird/ua_update.c:614 -msgid "Volume Files" -msgstr "" - -#: src/dird/ua_update.c:616 -msgid "Volume from Pool" -msgstr "" - -#: src/dird/ua_update.c:617 -msgid "All Volumes from Pool" -msgstr "" - -#: src/dird/ua_update.c:618 -msgid "All Volumes from all Pools" -msgstr "" - -#: src/dird/ua_update.c:619 -msgid "Enabled" -msgstr "" - -#: src/dird/ua_update.c:620 -msgid "RecyclePool" -msgstr "" - -#: src/dird/ua_update.c:621 -msgid "Action On Purge" -msgstr "" - -#: src/dird/ua_update.c:631 -#, c-format -msgid "Updating Volume \"%s\"\n" -msgstr "" - -#: src/dird/ua_update.c:636 -#, c-format -msgid "Current Volume status is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:637 -msgid "Possible Values are:\n" -msgstr "" - -#: src/dird/ua_update.c:648 -msgid "Choose new Volume Status" -msgstr "" - -#: src/dird/ua_update.c:656 -msgid "Enter Volume Retention period: " -msgstr "" - -#: src/dird/ua_update.c:663 -#, c-format -msgid "Current use duration is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:665 -msgid "Enter Volume Use Duration: " -msgstr "" - -#: src/dird/ua_update.c:672 -#, c-format -msgid "Current max jobs is: %u\n" -msgstr "" - -#: src/dird/ua_update.c:673 -msgid "Enter new Maximum Jobs: " -msgstr "" - -#: src/dird/ua_update.c:680 -#, c-format -msgid "Current max files is: %u\n" -msgstr "" - -#: src/dird/ua_update.c:681 -msgid "Enter new Maximum Files: " -msgstr "" - -#: src/dird/ua_update.c:688 -#, c-format -msgid "Current value is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:689 -msgid "Enter new Maximum Bytes: " -msgstr "" - -#: src/dird/ua_update.c:697 -#, c-format -msgid "Current recycle flag is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:699 -msgid "Enter new Recycle status: " -msgstr "" - -#: src/dird/ua_update.c:706 -#, c-format -msgid "Current Slot is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:707 -msgid "Enter new Slot: " -msgstr "" - -#: src/dird/ua_update.c:714 -#, c-format -msgid "Current InChanger flag is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:715 -#, c-format -msgid "Set InChanger flag for Volume \"%s\": yes/no: " -msgstr "" - -#: src/dird/ua_update.c:729 -#, c-format -msgid "New InChanger flag is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:736 -msgid "" -"Warning changing Volume Files can result\n" -"in loss of data on your Volume\n" -"\n" -msgstr "" - -#: src/dird/ua_update.c:738 -#, c-format -msgid "Current Volume Files is: %u\n" -msgstr "" - -#: src/dird/ua_update.c:739 -msgid "Enter new number of Files for Volume: " -msgstr "" - -#: src/dird/ua_update.c:744 -msgid "Normally, you should only increase Volume Files by one!\n" -msgstr "" - -#: src/dird/ua_update.c:745 -msgid "Increase Volume Files? (yes/no): " -msgstr "" - -#: src/dird/ua_update.c:755 -#, c-format -msgid "New Volume Files is: %u\n" -msgstr "" - -#: src/dird/ua_update.c:767 -#, c-format -msgid "Current Pool is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:768 -msgid "Enter new Pool name: " -msgstr "" - -#: src/dird/ua_update.c:789 -#, c-format -msgid "Current Enabled is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:790 -msgid "Enter new Enabled: " -msgstr "" - -#: src/dird/ua_update.c:800 -#, c-format -msgid "Current RecyclePool is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:802 -msgid "No current RecyclePool\n" -msgstr "" - -#: src/dird/ua_update.c:812 -#, c-format -msgid "Current ActionOnPurge is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:814 -msgid "Enter new ActionOnPurge (one of: Truncate, None): " -msgstr "" - -#: src/dird/ua_update.c:842 -#, c-format -msgid "Updating %i job(s).\n" -msgstr "" - -#: src/dird/ua_update.c:874 -#, c-format -msgid "db_update_pool_record returned %d. ERR=%s\n" -msgstr "" - -#: src/dird/ua_update.c:881 -msgid "Pool DB record updated from resource.\n" -msgstr "" - -#: src/dird/ua_update.c:908 -msgid "Expect JobId keyword, not found.\n" -msgstr "" - -#: src/dird/ua_update.c:933 -msgid "Neither Client nor StartTime specified.\n" -msgstr "" - -#: src/dird/vbackup.c:122 -#, c-format -msgid "Start Virtual Backup JobId %s, Job=%s\n" -msgstr "" - -#: src/dird/vbackup.c:126 -msgid "" -"This Job is not an Accurate backup so is not equivalent to a Full backup.\n" -msgstr "" - -#: src/dird/vbackup.c:172 -msgid "No valid Jobs found from user selection.\n" -msgstr "" - -#: src/dird/vbackup.c:176 -#, c-format -msgid "Using user supplied JobIds=%s\n" -msgstr "" - -#: src/dird/vbackup.c:195 -msgid "No previous Full found in list, using Differential level\n" -msgstr "" - -#: src/dird/vbackup.c:200 -msgid "No previous Full found in list, using Incremental level\n" -msgstr "" - -#: src/dird/vbackup.c:213 -msgid "No previous Jobs found.\n" -msgstr "" - -#: src/dird/vbackup.c:236 -#, c-format -msgid "Error getting Job record for previous Job: ERR=%s" -msgstr "" - -#: src/dird/vbackup.c:449 -#, c-format -msgid "" -"%s %s %s (%s):\n" -" Build OS: %s %s %s\n" -" JobId: %d\n" -" Job: %s\n" -" Backup Level: Virtual Full\n" -" Client: \"%s\" %s\n" -" FileSet: \"%s\" %s\n" -" Pool: \"%s\" (From %s)\n" -" Catalog: \"%s\" (From %s)\n" -" Storage: \"%s\" (From %s)\n" -" Scheduled time: %s\n" -" Start time: %s\n" -" End time: %s\n" -" Elapsed time: %s\n" -" Priority: %d\n" -" SD Files Written: %s\n" -" SD Bytes Written: %s (%sB)\n" -" Rate: %.1f KB/s\n" -" Volume name(s): %s\n" -" Volume Session Id: %d\n" -" Volume Session Time: %d\n" -" Last Volume Bytes: %s (%sB)\n" -" SD Errors: %d\n" -" SD termination status: %s\n" -" Termination: %s\n" -"\n" -msgstr "" - -#: src/dird/verify.c:72 src/dird/verify.c:319 -#, c-format -msgid "Unimplemented Verify level %d(%c)\n" -msgstr "" - -#: src/dird/verify.c:136 -msgid "" -"Unable to find JobId of previous InitCatalog Job.\n" -"Please run a Verify with Level=InitCatalog before\n" -"running the current Job.\n" -msgstr "" - -#: src/dird/verify.c:141 -msgid "Unable to find JobId of previous Job for this client.\n" -msgstr "" - -#: src/dird/verify.c:158 -#, c-format -msgid "Could not get job record for previous Job. ERR=%s" -msgstr "" - -#: src/dird/verify.c:164 -#, c-format -msgid "Last Job %d did not terminate normally. JobStatus=%c\n" -msgstr "" - -#: src/dird/verify.c:168 -#, c-format -msgid "Verifying against JobId=%d Job=%s\n" -msgstr "" - -#: src/dird/verify.c:207 -#, c-format -msgid "Start Verify JobId=%s Level=%s Job=%s\n" -msgstr "" - -#: src/dird/verify.c:306 -msgid "Deprecated feature ... use bootstrap.\n" -msgstr "" - -#: src/dird/verify.c:373 -#, c-format -msgid "Unimplemented verify level %d\n" -msgstr "" - -#: src/dird/verify.c:422 -msgid "Verify OK" -msgstr "Controle OK" - -#: src/dird/verify.c:426 -msgid "*** Verify Error ***" -msgstr "*** Fout bij controleren ***" - -#: src/dird/verify.c:430 -msgid "Verify warnings" -msgstr "" - -#: src/dird/verify.c:433 -msgid "Verify Canceled" -msgstr "" - -#: src/dird/verify.c:436 -msgid "Verify Differences" -msgstr "" - -#: src/dird/verify.c:441 -#, c-format -msgid "Inappropriate term code: %d %c\n" -msgstr "" - -#: src/dird/verify.c:455 -#, c-format -msgid "" -"%s %s %s (%s):\n" -" Build OS: %s %s %s\n" -" JobId: %d\n" -" Job: %s\n" -" FileSet: %s\n" -" Verify Level: %s\n" -" Client: %s\n" -" Verify JobId: %d\n" -" Verify Job: %s\n" -" Start time: %s\n" -" End time: %s\n" -" Files Expected: %s\n" -" Files Examined: %s\n" -" Non-fatal FD errors: %d\n" -" FD termination status: %s\n" -" SD termination status: %s\n" -" Termination: %s\n" -"\n" -msgstr "" - -#: src/dird/verify.c:490 -#, c-format -msgid "" -"%s %s %s (%s):\n" -" Build: %s %s %s\n" -" JobId: %d\n" -" Job: %s\n" -" FileSet: %s\n" -" Verify Level: %s\n" -" Client: %s\n" -" Verify JobId: %d\n" -" Verify Job: %s\n" -" Start time: %s\n" -" End time: %s\n" -" Files Examined: %s\n" -" Non-fatal FD errors: %d\n" -" FD termination status: %s\n" -" Termination: %s\n" -"\n" -msgstr "" - -#: src/dird/verify.c:569 -#, c-format -msgid "" -"birdSD.\n" -msgstr "" - -#: src/filed/backup.c:176 -msgid "The heartbeat didn't start in time.\n" -msgstr "" - -#: src/filed/backup.c:190 -#, c-format -msgid "Had %ld acl errors while doing backup\n" -msgstr "" - -#: src/filed/backup.c:196 -#, c-format -msgid "Had %ld xattr errors while doing backup\n" -msgstr "" - -#: src/filed/backup.c:323 -#, c-format -msgid " Recursion turned off. Will not descend from %s into %s\n" -msgstr "" - -#: src/filed/backup.c:330 -#, c-format -msgid " %s is a different filesystem. Will not descend from %s into it.\n" -msgstr "" - -#: src/filed/backup.c:336 -#, c-format -msgid " Disallowed filesystem. Will not descend from %s into %s\n" -msgstr "" - -#: src/filed/backup.c:341 -#, c-format -msgid " Disallowed drive type. Will not descend into %s\n" -msgstr "" - -#: src/filed/backup.c:352 -#, c-format -msgid " Socket file skipped: %s\n" -msgstr "" - -#: src/filed/backup.c:365 -#, c-format -msgid " Could not access \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/backup.c:372 -#, c-format -msgid " Could not follow link \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/backup.c:379 -#, c-format -msgid " Could not stat \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/backup.c:386 src/filed/verify.c:130 -#, c-format -msgid " Unchanged file skipped: %s\n" -msgstr "" - -#: src/filed/backup.c:389 -#, c-format -msgid " Archive file not saved: %s\n" -msgstr "" - -#: src/filed/backup.c:393 -#, c-format -msgid " Could not open directory \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/backup.c:402 -#, c-format -msgid " Unknown file type %d; not saved: %s\n" -msgstr "" - -#: src/filed/backup.c:511 -#, c-format -msgid " Cannot open \"%s\": ERR=%s.\n" -msgstr "" - -#: src/filed/backup.c:690 src/filed/restore.c:1449 -msgid "Windows Encrypted data not supported on this OS.\n" -msgstr "" - -#: src/filed/backup.c:717 -#, c-format -msgid "Read error on file %s. ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/filed/backup.c:720 -#, c-format -msgid "Too many errors. JobErrors=%d.\n" -msgstr "Te veel fouten. OpdrachtFouten=%d.\n" - -#: src/filed/backup.c:730 -msgid "Encryption padding error\n" -msgstr "" - -#: src/filed/backup.c:873 src/filed/backup.c:889 -msgid "Encryption error\n" -msgstr "Fout in versleuteling \n" - -#: src/filed/backup.c:910 -msgid "main thread is stopping because heartbeat thread stopped\n" -msgstr "" - -#: src/filed/backup.c:967 -msgid "Invalid file flags, no supported data stream type.\n" -msgstr "" - -#: src/filed/backup.c:1007 -#, fuzzy, c-format -msgid "Network send error to SD. Data=%s ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/filed/backup.c:1148 -#, c-format -msgid "Compression deflateParams error: %d\n" -msgstr "" - -#: src/filed/backup.c:1201 -#, c-format -msgid " Cannot open resource fork for \"%s\": ERR=%s.\n" -msgstr "" - -#: src/filed/backup.c:1259 -#, c-format -msgid "Compression deflate error: %d\n" -msgstr "" - -#: src/filed/backup.c:1266 -#, c-format -msgid "Compression deflateReset error: %d\n" -msgstr "" - -#: src/filed/backup.c:1308 -#, c-format -msgid "Compression LZO error: %d\n" -msgstr "Compressie LZO fout: %d\n" - -#: src/filed/backup.c:1518 -#, c-format -msgid "VSS Writer (BackupComplete): %s\n" -msgstr "" - -#: src/filed/bfdjson.c:68 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bfdjson [-c config_file] [-d debug_level]\n" -" -r get resource type \n" -" -n get resource \n" -" -l get only directives matching dirs (use with -r)\n" -" -D get only data\n" -" -c use as configuration file\n" -" -d set debug level to \n" -" -dt print a timestamp in debug output\n" -" -t test configuration file and exit\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Versie: %s (%s) %s %s %s\n" -"\n" -"Specificatie: tray-monitor [-c configuratiebestand] [-d debug_level]\n" -" -c gebruik configuratiebestand\n" -" -d instellen debug level op \n" -" -dt weergeven tijd in debug output\n" -" -t test - lees configuratie en stop\n" -" -? geef deze melding.\n" -"\n" - -#: src/filed/bfdjson.c:463 src/filed/filed.c:328 -#, c-format -msgid "" -"No File daemon resource defined in %s\n" -"Without that I don't know who I am :-(\n" -msgstr "" - -#: src/filed/bfdjson.c:468 src/filed/filed.c:333 -#, c-format -msgid "Only one Client resource permitted in %s\n" -msgstr "" - -#: src/filed/bfdjson.c:492 src/filed/filed.c:388 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"File daemon in %s.\n" -msgstr "" - -#: src/filed/bfdjson.c:504 src/filed/filed.c:423 -#, c-format -msgid "" -"\"PKI Key Pair\" must be defined for File daemon \"%s\" in %s if either " -"\"PKI Sign\" or \"PKI Encrypt\" are enabled.\n" -msgstr "" - -#: src/filed/bfdjson.c:517 src/filed/filed.c:538 -#, c-format -msgid "No Director resource defined in %s\n" -msgstr "" - -#: src/filed/crypto.c:37 -msgid "Encrypting sparse or offset data not supported.\n" -msgstr "" - -#: src/filed/crypto.c:44 -msgid "Failed to initialize encryption context.\n" -msgstr "" - -#: src/filed/crypto.c:117 -#, c-format -msgid "%s signature digest initialization failed\n" -msgstr "" - -#: src/filed/crypto.c:147 -msgid "Unsupported cipher on this system.\n" -msgstr "" - -#: src/filed/crypto.c:153 src/filed/crypto.c:162 -msgid "An error occurred while encrypting the stream.\n" -msgstr "" - -#: src/filed/crypto.c:225 -msgid "Failed to allocate memory for crypto signature.\n" -msgstr "" - -#: src/filed/crypto.c:230 -msgid "An error occurred while adding signer the stream.\n" -msgstr "" - -#: src/filed/crypto.c:236 src/filed/crypto.c:251 -msgid "An error occurred while signing the stream.\n" -msgstr "" - -#: src/filed/crypto.c:275 -msgid "An error occurred finalizing signing the stream.\n" -msgstr "" - -#: src/filed/dedupfiled.c:88 -#, c-format -msgid "Quarantine, got ACK for unknown block #%08x\n" -msgstr "" - -#: src/filed/dedupfiled.c:100 -#, c-format -msgid "Quarantine, got request for unknown block #%08x\n" -msgstr "" - -#: src/filed/dedupfiled.c:130 -#, c-format -msgid "Quarantine, got unexpected command %d len=%d \"%s\" \n" -msgstr "" - -#: src/filed/dedupfiled.c:332 -#, c-format -msgid "DEDUP SD didn't found #%08x, use zeroes instead\n" -msgstr "" - -#: src/filed/dedupfiled.c:338 -#, c-format -msgid "DEDUP got a BNET_CMD_UNK_HASH but don't know the hash #%08x.\n" -msgstr "" - -#: src/filed/dedupfiled.c:368 -#, c-format -msgid "DEDUP got a BNET_CMD_STO_BLOCK but don't know the hash #%08x.\n" -msgstr "" - -#: src/filed/fd_plugins.c:546 src/filed/fd_plugins.c:690 -#, c-format -msgid "Command plugin \"%s\": no type in startBackupFile packet.\n" -msgstr "" - -#: src/filed/fd_plugins.c:559 -#, c-format -msgid "Command plugin \"%s\": no object_name in startBackupFile packet.\n" -msgstr "" - -#: src/filed/fd_plugins.c:572 src/filed/fd_plugins.c:697 -#, c-format -msgid "Command plugin \"%s\": no fname in startBackupFile packet.\n" -msgstr "" - -#: src/filed/fd_plugins.c:771 -msgid "Plugin save packet not found.\n" -msgstr "" - -#: src/filed/fd_plugins.c:906 -#, c-format -msgid "Plugin=%s not found.\n" -msgstr "" - -#: src/filed/fd_plugins.c:973 -#, c-format -msgid "Plugin createFile call failed. Stat=%d file=%s\n" -msgstr "" - -#: src/filed/fd_plugins.c:978 -#, c-format -msgid "Plugin createFile call failed. Returned CF_ERROR file=%s\n" -msgstr "" - -#: src/filed/fd_plugins.c:1008 src/findlib/create_file.c:220 -#, c-format -msgid "Could not create %s: ERR=%s\n" -msgstr "" - -#: src/filed/fd_plugins.c:1875 -msgid "Command plugin: no fname in baculaCheckChanges packet.\n" -msgstr "" - -#: src/filed/fd_snapshot.c:939 -#, fuzzy, c-format -msgid "Error while creating command string %s.\n" -msgstr "" -"Fout bij verwerken van opdrachtregel variabelen, maak nu gebruik van " -"standaard instelling.\n" - -#: src/filed/fd_snapshot.c:959 -#, c-format -msgid "Error while executing \"%s\" %s. %s %s\n" -msgstr "" - -#: src/filed/fd_snapshot.c:970 -msgid "Unable to parse snapshot command output\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1104 -#, fuzzy, c-format -msgid "Unable to create snapshot record. ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/filed/fd_snapshot.c:1108 -#, fuzzy, c-format -msgid "Unable to create snapshot record, got %s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/filed/fd_snapshot.c:1125 -#, fuzzy, c-format -msgid "Unable to delete snapshot record. ERR=%s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/filed/fd_snapshot.c:1129 -#, fuzzy, c-format -msgid "Unable to delete snapshot record, got %s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/filed/fd_snapshot.c:1153 -#, fuzzy, c-format -msgid "Unable to get snapshot record. ERR=%s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/filed/fd_snapshot.c:1157 -#, fuzzy, c-format -msgid "Unable to get snapshot record, got %s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/filed/fd_snapshot.c:1162 -#, fuzzy -msgid "Unable to parse command output\n" -msgstr "Kan de geselecteerde client niet vinden." - -#: src/filed/fd_snapshot.c:1342 -msgid "Un-Quiescing applications\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1354 -msgid "Quiescing applications\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1391 -#, c-format -msgid " Delete Snapshot for %s\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1394 -#, fuzzy, c-format -msgid " Unable to delete snapshot of %s ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/filed/fd_snapshot.c:1430 -#, fuzzy, c-format -msgid " Create Snapshot for %s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/filed/fd_snapshot.c:1438 -#, fuzzy, c-format -msgid " Unable to create snapshot of %s ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/filed/filed.c:52 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bacula-fd [-f -s] [-c config_file] [-d debug_level]\n" -" -c use as configuration file\n" -" -d [,] set debug level to , debug tags to \n" -" -dt print a timestamp in debug output\n" -" -f run in foreground (for debugging)\n" -" -g groupid\n" -" -k keep readall capabilities\n" -" -m print kaboom output (for debugging)\n" -" -s no signals (for debugging)\n" -" -t test configuration file and exit\n" -" -T set trace on\n" -" -u userid\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Versie: %s (%s) %s %s %s\n" -"\n" -"Specificatie: tray-monitor [-c configuratiebestand] [-d debug_level]\n" -" -c gebruik configuratiebestand\n" -" -d instellen debug level op \n" -" -dt weergeven tijd in debug output\n" -" -t test - lees configuratie en stop\n" -" -? geef deze melding.\n" -"\n" - -#: src/filed/filed.c:185 -msgid "-k option has no meaning without -u option.\n" -msgstr "" - -#: src/filed/filed.c:361 src/filed/filed.c:560 -#, fuzzy, c-format -msgid "Disable Command \"%s\" not found.\n" -msgstr "Job \"%s\" niet gevonden.\n" - -#: src/filed/filed.c:412 -msgid "PKI encryption/signing enabled but not compiled into Bacula.\n" -msgstr "" - -#: src/filed/filed.c:435 src/filed/filed.c:466 src/filed/filed.c:516 -msgid "Failed to allocate a new keypair object.\n" -msgstr "" - -#: src/filed/filed.c:439 -#, c-format -msgid "Failed to load public certificate for File daemon \"%s\" in %s.\n" -msgstr "" - -#: src/filed/filed.c:445 -#, c-format -msgid "Failed to load private key for File daemon \"%s\" in %s.\n" -msgstr "" - -#: src/filed/filed.c:475 -#, c-format -msgid "Failed to load private key from file %s for File daemon \"%s\" in %s.\n" -msgstr "" - -#: src/filed/filed.c:482 -#, c-format -msgid "" -"Failed to load trusted signer certificate from file %s for File daemon \"%s" -"\" in %s.\n" -msgstr "" - -#: src/filed/filed.c:522 -#, c-format -msgid "" -"Failed to load master key certificate from file %s for File daemon \"%s\" in " -"%s.\n" -msgstr "" - -#: src/filed/filed_conf.c:200 src/filed/filed_conf.c:224 -#, c-format -msgid "Expected a Cipher Type keyword, got: %s" -msgstr "" - -#: src/filed/hello.c:79 src/stored/hello.c:102 -#, c-format -msgid "Bad Hello command from Director at %s. Len=%d.\n" -msgstr "" - -#: src/filed/hello.c:93 src/stored/hello.c:116 -#, c-format -msgid "Bad Hello command from Director at %s: %s\n" -msgstr "" - -#: src/filed/hello.c:111 -#, fuzzy, c-format -msgid "Connection from unknown Director %s at %s rejected.\n" -msgstr "" -"Verbinden met Director %s:%d\n" -"\n" - -#: src/filed/hello.c:145 -msgid "SD connect failed: Bad Hello command\n" -msgstr "" - -#: src/filed/hello.c:153 -#, c-format -msgid "SD connect failed: Job name not found: %s\n" -msgstr "" - -#: src/filed/hello.c:164 -#, fuzzy, c-format -msgid "SD \"%s\" tried to connect two times.\n" -msgstr "Verbinden met de director mislukt\n" - -#: src/filed/hello.c:269 src/filed/hello.c:271 src/stored/hello.c:500 -#: src/stored/hello.c:502 -#, fuzzy, c-format -msgid "Recv caps from SD failed. ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/filed/hello.c:277 src/stored/hello.c:508 -#, c-format -msgid "Bad caps from SD: %s.\n" -msgstr "" - -#: src/filed/hello.c:278 src/stored/hello.c:509 -#, c-format -msgid "Bad caps from SD: %s\n" -msgstr "" - -#: src/filed/job.c:322 -#, fuzzy, c-format -msgid "Command: \"%s\" is disabled.\n" -msgstr "Opdracht mislukt." - -#: src/filed/job.c:491 -#, c-format -msgid "Bad command from %s. Len=%d.\n" -msgstr "" - -#: src/filed/job.c:552 -msgid "2902 Error scanning cancel command.\n" -msgstr "" - -#: src/filed/job.c:556 src/filed/job.c:595 -#, c-format -msgid "2901 Job %s not found.\n" -msgstr "" - -#: src/filed/job.c:566 -#, c-format -msgid "2001 Job \"%s\" marked to be %s.\n" -msgstr "" - -#: src/filed/job.c:589 -#, c-format -msgid "2991 Bad setbandwidth command: %s\n" -msgstr "" - -#: src/filed/job.c:645 -#, c-format -msgid "2991 Bad setdebug command: %s\n" -msgstr "" - -#: src/filed/job.c:695 -#, c-format -msgid "Bad estimate command: %s" -msgstr "" - -#: src/filed/job.c:696 -msgid "2992 Bad estimate command.\n" -msgstr "" - -#: src/filed/job.c:719 -#, c-format -msgid "Bad Job Command: %s" -msgstr "" - -#: src/filed/job.c:759 -#, c-format -msgid "Bad RunBeforeJob command: %s\n" -msgstr "" - -#: src/filed/job.c:760 src/filed/job.c:779 -msgid "2905 Bad RunBeforeJob command.\n" -msgstr "" - -#: src/filed/job.c:790 -msgid "2905 Bad RunBeforeNow command.\n" -msgstr "" - -#: src/filed/job.c:809 -#, c-format -msgid "Bad RunAfter command: %s\n" -msgstr "" - -#: src/filed/job.c:810 -msgid "2905 Bad RunAfterJob command.\n" -msgstr "" - -#: src/filed/job.c:846 -#, c-format -msgid "Bad RunScript command: %s\n" -msgstr "" - -#: src/filed/job.c:847 -msgid "2905 Bad RunScript command.\n" -msgstr "" - -#: src/filed/job.c:902 -#, c-format -msgid "Bad RestoreObject command: %s\n" -msgstr "" - -#: src/filed/job.c:967 -msgid "2909 Bad RestoreObject command.\n" -msgstr "" - -#: src/filed/job.c:1064 -#, c-format -msgid "Plugin Directory not defined. Cannot use plugin: \"%s\"\n" -msgstr "" - -#: src/filed/job.c:1106 -#, c-format -msgid "Error running program: %s. stat=%d: ERR=%s\n" -msgstr "" - -#: src/filed/job.c:1117 -#, c-format -msgid "Cannot open FileSet input file: %s. ERR=%s\n" -msgstr "" - -#: src/filed/job.c:1271 -#, c-format -msgid "REGEX %s compile error. ERR=%s\n" -msgstr "" - -#: src/filed/job.c:1422 -#, c-format -msgid "Invalid FileSet command: %s\n" -msgstr "" - -#: src/filed/job.c:1708 src/findlib/match.c:205 src/tools/testfind.c:640 -#, c-format -msgid "Unknown include/exclude option: %c\n" -msgstr "" - -#: src/filed/job.c:1862 -#, c-format -msgid "" -"DIR and FD clocks differ by %lld seconds, FD automatically compensating.\n" -msgstr "" - -#: src/filed/job.c:1871 -#, c-format -msgid "Unknown backup level: %s\n" -msgstr "" - -#: src/filed/job.c:1884 -#, c-format -msgid "Bad level command: %s\n" -msgstr "" - -#: src/filed/job.c:1906 -#, c-format -msgid "Bad session command: %s" -msgstr "" - -#: src/filed/job.c:1965 src/stored/dircmd.c:348 -#, c-format -msgid "Bad storage command: %s" -msgstr "" - -#: src/filed/job.c:1993 src/stored/dircmd.c:370 -#, c-format -msgid "Failed to connect to Storage daemon: %s:%d\n" -msgstr "" - -#: src/filed/job.c:2034 -msgid "Failed connect from Storage daemon. SD bsock=NULL.\n" -msgstr "" - -#: src/filed/job.c:2282 -msgid "ACL support not configured for your machine.\n" -msgstr "" - -#: src/filed/job.c:2286 -msgid "XATTR support not configured for your machine.\n" -msgstr "" - -#: src/filed/job.c:2295 -msgid "Cannot contact Storage daemon\n" -msgstr "" - -#: src/filed/job.c:2314 -#, c-format -msgid "Bad response to append open: %s\n" -msgstr "" - -#: src/filed/job.c:2319 -msgid "Bad response from stored to open command\n" -msgstr "" - -#: src/filed/job.c:2350 -#, c-format -msgid "Generate VSS snapshots. Driver=\"%s\"\n" -msgstr "" - -#: src/filed/job.c:2355 -#, fuzzy, c-format -msgid "VSS CreateSnapshots failed. ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/filed/job.c:2361 -#, c-format -msgid "VSS Writer (PrepareForBackup): %s\n" -msgstr "" - -#: src/filed/job.c:2366 -msgid "No drive letters found for generating VSS snapshots.\n" -msgstr "" - -#: src/filed/job.c:2370 -#, c-format -msgid "VSS was not initialized properly. ERR=%s\n" -msgstr "" - -#: src/filed/job.c:2428 -msgid "Append Close with SD failed.\n" -msgstr "" - -#: src/filed/job.c:2433 -#, c-format -msgid "Bad status %d %c returned from Storage Daemon.\n" -msgstr "" - -#: src/filed/job.c:2463 -#, c-format -msgid "2994 Bad verify command: %s\n" -msgstr "" - -#: src/filed/job.c:2478 src/filed/job.c:2519 -#, c-format -msgid "2994 Bad verify level: %s\n" -msgstr "" - -#: src/filed/job.c:2624 -#, c-format -msgid "Bad replace command. CMD=%s\n" -msgstr "" - -#: src/filed/job.c:2650 -#, c-format -msgid "Bad where regexp. where=%s\n" -msgstr "" - -#: src/filed/job.c:2686 -#, c-format -msgid "VSS was not initialized properly. VSS support is disabled. ERR=%s\n" -msgstr "" - -#: src/filed/job.c:2731 -#, c-format -msgid "VSS Writer (RestoreComplete): %s\n" -msgstr "" - -#: src/filed/job.c:2786 -msgid "Improper calling sequence.\n" -msgstr "" - -#: src/filed/job.c:2806 -#, c-format -msgid "Bad response to SD read open: %s\n" -msgstr "" - -#: src/filed/job.c:2811 -msgid "Bad response from stored to read open command\n" -msgstr "" - -#: src/filed/job.c:2900 -#, c-format -msgid "Bad response from SD to %s command. Wanted %s, got len=%ld msg=\"%s\"\n" -msgstr "" - -#: src/filed/restore.c:99 -#, c-format -msgid "Size of data or stream of %s not correct. Original %s, restored %s.\n" -msgstr "" - -#: src/filed/restore.c:119 -#, c-format -msgid "Invalid length of Finder Info (got %d, not 32)\n" -msgstr "" - -#: src/filed/restore.c:124 -#, c-format -msgid "Could not set Finder Info on %s\n" -msgstr "" - -#: src/filed/restore.c:312 src/filed/restore.c:995 src/stored/bextract.c:696 -#, c-format -msgid "Unknown stream=%d ignored. This shouldn't happen!\n" -msgstr "" - -#: src/filed/restore.c:410 -msgid "LZO init failed\n" -msgstr "Initialiseren LZO mislukt\n" - -#: src/filed/restore.c:472 src/filed/verify_vol.c:95 -#, c-format -msgid "Record header scan error: %s\n" -msgstr "" - -#: src/filed/restore.c:482 src/filed/verify_vol.c:105 -#, c-format -msgid "Data record error. ERR=%s\n" -msgstr "" - -#: src/filed/restore.c:486 src/filed/verify_vol.c:109 -#, c-format -msgid "Actual data size %d not same as header %d\n" -msgstr "" - -#: src/filed/restore.c:548 src/stored/bextract.c:436 -#, c-format -msgid "%s stream not supported on this Client.\n" -msgstr "" - -#: src/filed/restore.c:629 -msgid "Unexpected cryptographic session data stream.\n" -msgstr "" - -#: src/filed/restore.c:637 -msgid "" -"No private decryption keys have been defined to decrypt encrypted backup " -"data.\n" -msgstr "" - -#: src/filed/restore.c:648 -msgid "Could not create digest.\n" -msgstr "" - -#: src/filed/restore.c:662 -msgid "Missing private key required to decrypt encrypted backup data.\n" -msgstr "" - -#: src/filed/restore.c:665 -msgid "Decrypt of the session key failed.\n" -msgstr "" - -#: src/filed/restore.c:668 -msgid "Signer not found. Decryption failed.\n" -msgstr "" - -#: src/filed/restore.c:671 -msgid "Unsupported digest algorithm. Decrypt failed.\n" -msgstr "" - -#: src/filed/restore.c:674 -msgid "Unsupported encryption algorithm. Decrypt failed.\n" -msgstr "" - -#: src/filed/restore.c:678 -#, c-format -msgid "" -"An error=%d occurred while decoding encrypted session data stream: ERR=%s\n" -msgstr "" - -#: src/filed/restore.c:747 src/filed/restore.c:795 -#, c-format -msgid "Missing encryption session data stream for %s\n" -msgstr "" - -#: src/filed/restore.c:755 src/filed/restore.c:802 -#, c-format -msgid "Failed to initialize decryption context for %s\n" -msgstr "" - -#: src/filed/restore.c:814 -#, c-format -msgid "Cannot open resource fork for %s.\n" -msgstr "" - -#: src/filed/restore.c:956 -msgid "Unexpected cryptographic signature data stream.\n" -msgstr "" - -#: src/filed/restore.c:962 -#, c-format -msgid "Failed to decode message signature for %s\n" -msgstr "" - -#: src/filed/restore.c:1033 -#, c-format -msgid "Encountered %ld acl errors while doing restore\n" -msgstr "" - -#: src/filed/restore.c:1037 -#, c-format -msgid "Encountered %ld xattr errors while doing restore\n" -msgstr "" - -#: src/filed/restore.c:1041 -#, c-format -msgid "" -"%d non-supported data streams and %d non-supported attrib streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1045 -#, c-format -msgid "%d non-supported resource fork streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1048 -#, c-format -msgid "%d non-supported Finder Info streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1051 -#, c-format -msgid "%d non-supported acl streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1054 -#, c-format -msgid "%d non-supported crypto streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1057 -#, c-format -msgid "%d non-supported xattr streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1136 src/lib/util.c:488 -msgid "None" -msgstr "" - -#: src/filed/restore.c:1140 -msgid "Zlib errno" -msgstr "Zlib foutnr." - -#: src/filed/restore.c:1142 -msgid "Zlib stream error" -msgstr "Zlib datastroom fout" - -#: src/filed/restore.c:1144 -msgid "Zlib data error" -msgstr "Zlib data fout" - -#: src/filed/restore.c:1146 -msgid "Zlib memory error" -msgstr "Zlib geheugen fout" - -#: src/filed/restore.c:1148 -msgid "Zlib buffer error" -msgstr "Zlib buffer fout" - -#: src/filed/restore.c:1150 -msgid "Zlib version error" -msgstr "Zlib versie fout" - -#: src/filed/restore.c:1152 src/lib/util.c:832 src/lib/util.c:842 -#: src/lib/util.c:853 src/lib/util.c:860 src/lib/util.c:867 src/lib/util.c:881 -#: src/lib/util.c:891 src/lib/util.c:904 src/lib/util.c:915 -msgid "*none*" -msgstr "" - -#: src/filed/restore.c:1189 -#, c-format -msgid "Missing cryptographic signature for %s\n" -msgstr "" - -#: src/filed/restore.c:1219 src/filed/restore.c:1243 -#, c-format -msgid "Signature validation failed for file %s: ERR=%s\n" -msgstr "" - -#: src/filed/restore.c:1233 -#, c-format -msgid "Digest one file failed for file: %s\n" -msgstr "" - -#: src/filed/restore.c:1264 -#, c-format -msgid "Signature validation failed for %s: %s\n" -msgstr "" - -#: src/filed/restore.c:1290 src/stored/bextract.c:531 -#: src/stored/bextract.c:596 -#, c-format -msgid "Seek to %s error on %s: ERR=%s\n" -msgstr "" - -#: src/filed/restore.c:1331 -#, c-format -msgid "Compressed header version error. Got=0x%x want=0x%x\n" -msgstr "" - -#: src/filed/restore.c:1336 src/stored/bextract.c:625 -#, c-format -msgid "Compressed header size error. comp_len=%d, msglen=%d\n" -msgstr "" - -#: src/filed/restore.c:1359 -#, c-format -msgid "LZO uncompression error on file %s. ERR=%d\n" -msgstr "" - -#: src/filed/restore.c:1369 src/stored/bextract.c:660 -#, c-format -msgid "Compression algorithm 0x%x found, but not supported!\n" -msgstr "" - -#: src/filed/restore.c:1394 -#, c-format -msgid "Uncompression error on file %s. ERR=%s\n" -msgstr "" - -#: src/filed/restore.c:1403 src/stored/bextract.c:564 -msgid "GZIP data stream found, but GZIP not configured!\n" -msgstr "" - -#: src/filed/restore.c:1431 -#, c-format -msgid "Write error in Win32 Block Decomposition on %s: %s\n" -msgstr "" - -#: src/filed/restore.c:1439 src/filed/restore.c:1454 -#, fuzzy, c-format -msgid "Write write error on %s: ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/filed/restore.c:1482 -#, c-format -msgid "Wrong write size error at %lld block=%d wanted=%d wrote=%d\n" -msgstr "" - -#: src/filed/restore.c:1486 -#, c-format -msgid "" -"Write write error at %lld block=%d write_len=%d lerror=%d on %s: ERR=%s\n" -msgstr "" - -#: src/filed/restore.c:1543 -msgid "Decryption error\n" -msgstr "" - -#: src/filed/restore.c:1627 -msgid "Logic error: output file should be open\n" -msgstr "" - -#: src/filed/restore.c:1663 -msgid "Logic error: output file should not be open\n" -msgstr "" - -#: src/filed/restore.c:1694 -#, c-format -msgid "Decryption error. buf_len=%d decrypt_len=%d on file %s\n" -msgstr "" - -#: src/filed/status.c:115 -#, c-format -msgid "%s %sVersion: %s (%s) %s %s %s %s\n" -msgstr "" - -#: src/filed/status.c:120 -#, c-format -msgid "Daemon started %s. Jobs: run=%d running=%d.\n" -msgstr "" - -#: src/filed/status.c:182 -#, c-format -msgid "" -" Sizes: boffset_t=%d size_t=%d debug=%s trace=%d mode=%d,%d bwlimit=%skB/s\n" -msgstr "" - -#: src/filed/status.c:239 -#, fuzzy, c-format -msgid "Director connected %sat: %s\n" -msgstr "Director niet verbonden." - -#: src/filed/status.c:243 -#, c-format -msgid "JobId %d Job %s is running.\n" -msgstr "" - -#: src/filed/status.c:246 -#, c-format -msgid " %s%s %s Job started: %s\n" -msgstr "" - -#: src/filed/status.c:274 -#, c-format -msgid "" -" Files=%s Bytes=%s AveBytes/sec=%s LastBytes/sec=%s Errors=%d\n" -" Bwlimit=%s ReadBytes=%s\n" -msgstr "" - -#: src/filed/status.c:285 -#, c-format -msgid " Files: Restored=%s Expected=%s Completed=%d%%\n" -msgstr "" - -#: src/filed/status.c:290 -#, c-format -msgid " Files: Examined=%s Backed up=%s\n" -msgstr "" - -#: src/filed/status.c:303 -#, c-format -msgid " Processing file: %s\n" -msgstr "" - -#: src/filed/status.c:315 -msgid " SDSocket closed.\n" -msgstr "" - -#: src/filed/status.c:325 -msgid "====\n" -msgstr "" - -#: src/filed/status.c:458 src/filed/status.c:492 -#, c-format -msgid "Bad .status command: %s\n" -msgstr "" - -#: src/filed/status.c:459 -msgid "2900 Bad .status command, missing argument.\n" -msgstr "" - -#: src/filed/status.c:493 -msgid "2900 Bad .status command, wrong argument.\n" -msgstr "" - -#: src/filed/verify.c:40 -#, c-format -msgid "Cannot malloc %d network read buffer\n" -msgstr "" - -#: src/filed/verify.c:110 -#, c-format -msgid " Could not access %s: ERR=%s\n" -msgstr "" - -#: src/filed/verify.c:117 -#, c-format -msgid " Could not follow link %s: ERR=%s\n" -msgstr "" - -#: src/filed/verify.c:124 -#, c-format -msgid " Could not stat %s: ERR=%s\n" -msgstr "" - -#: src/filed/verify.c:133 -#, c-format -msgid " Archive file skipped: %s\n" -msgstr "" - -#: src/filed/verify.c:136 -#, c-format -msgid " Recursion turned off. Directory skipped: %s\n" -msgstr "" - -#: src/filed/verify.c:140 -#, c-format -msgid " File system change prohibited. Directory skipped: %s\n" -msgstr "" - -#: src/filed/verify.c:148 -#, c-format -msgid " Could not open directory %s: ERR=%s\n" -msgstr "" - -#: src/filed/verify.c:153 -#, c-format -msgid " Unknown file type %d: %s\n" -msgstr "" - -#: src/filed/verify.c:197 src/filed/verify_vol.c:205 -#, c-format -msgid "Network error in send to Director: ERR=%s\n" -msgstr "" - -#: src/filed/verify.c:291 -#, c-format -msgid " Cannot open %s: ERR=%s.\n" -msgstr "" - -#: src/filed/verify.c:305 -#, c-format -msgid " Cannot open resource fork for %s: ERR=%s.\n" -msgstr "" - -#: src/filed/verify.c:367 -#, c-format -msgid "Error reading file %s: ERR=%s\n" -msgstr "" - -#: src/filed/verify_vol.c:52 -msgid "Storage command not issued before Verify.\n" -msgstr "" - -#: src/filed/verify_vol.c:142 -#, c-format -msgid "Error scanning record header: %s\n" -msgstr "" - -#: src/filed/win_efs.c:106 -#, c-format -msgid "Restore data %ld bytes too long for Microsoft buffer %ld bytes.\n" -msgstr "" - -#: src/filed/win_efs.c:192 -#, c-format -msgid "Restore data %ld bytes too long for Microsoft buffer %lld bytes.\n" -msgstr "" - -#: src/filed/win_efs.c:227 -#, c-format -msgid "WriteEncryptedFileRaw failure: ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:235 -#, c-format -msgid "Illegal xattr stream, no XATTR_MAGIC on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:249 -#, c-format -msgid "Illegal xattr stream, xattr name length <= 0 on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:371 src/filed/xattr.c:407 -#, c-format -msgid "llistea error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:457 src/filed/xattr.c:511 -#, c-format -msgid "lgetea error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:547 src/filed/xattr.c:869 src/filed/xattr.c:1344 -#: src/filed/xattr.c:1812 src/filed/xattr.c:2169 src/filed/xattr.c:2961 -#, c-format -msgid "Xattr stream on file \"%s\" exceeds maximum size of %d bytes\n" -msgstr "" - -#: src/filed/xattr.c:567 src/filed/xattr.c:895 src/filed/xattr.c:1364 -#: src/filed/xattr.c:1842 src/filed/xattr.c:2186 -#, c-format -msgid "Failed to serialize extended attributes on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:634 -#, c-format -msgid "lsetea error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:722 src/filed/xattr.c:760 src/filed/xattr.c:824 -#: src/filed/xattr.c:836 -#, c-format -msgid "attr_list error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:960 -#, c-format -msgid "Received illegal xattr named %s on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:993 src/filed/xattr.c:1003 -#, c-format -msgid "attr_set error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:1153 src/filed/xattr.c:1188 -#, c-format -msgid "llistxattr error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:1256 src/filed/xattr.c:1308 -#, c-format -msgid "lgetxattr error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:1427 -#, c-format -msgid "lsetxattr error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:1585 src/filed/xattr.c:1620 -#, c-format -msgid "extattr_list_link error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:1640 -#, c-format -msgid "Failed to convert %d into namespace on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:1720 src/filed/xattr.c:1775 -#, c-format -msgid "extattr_get_link error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:1899 -#, c-format -msgid "Failed to split %s into namespace and name part on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:1912 -#, c-format -msgid "Failed to convert %s into namespace on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:1933 -#, c-format -msgid "extattr_set_link error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:2036 src/filed/xattr.c:2061 -#, c-format -msgid "getproplist error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:2255 -#, c-format -msgid "Unable create proper proplist to restore xattrs on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:2284 -#, c-format -msgid "setproplist error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:2602 src/filed/xattr.c:2655 -#, c-format -msgid "Unable to get acl on xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:2672 -#, c-format -msgid "Unable to get acl text on xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:2746 -#, c-format -msgid "Unable to get status on xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:2879 -#, c-format -msgid "Unable to open xattr %s on \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:2902 -#, c-format -msgid "Unable to read symlin %s on \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:2977 -#, c-format -msgid "Unable to read content of xattr %s on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:3017 -#, c-format -msgid "Unable to chdir to xattr space of file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3074 src/filed/xattr.c:3323 -#, c-format -msgid "Unable to open file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3102 src/filed/xattr.c:3384 -#, c-format -msgid "Unable to open xattr space %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3118 src/filed/xattr.c:3348 -#, c-format -msgid "Unable to chdir to xattr space on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3139 -#, c-format -msgid "Unable to list the xattr space on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3231 -#, c-format -msgid "Unable to convert acl from text on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:3241 src/filed/xattr.c:3264 -#, c-format -msgid "Unable to restore acl of xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3337 -#, c-format -msgid "Unable to open xattr space on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3367 src/filed/xattr.c:3529 -#, c-format -msgid "Unable to open xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3401 -#, c-format -msgid "Unable to chdir to xattr space %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3441 -#, c-format -msgid "Unable to mkfifo xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3459 -#, c-format -msgid "Unable to mknod xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3477 -#, c-format -msgid "Unable to mkdir xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3497 -#, c-format -msgid "Unable to link xattr %s to %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3550 -#, c-format -msgid "" -"Unable to restore data of xattr %s on file \"%s\": Not all data available in " -"xattr stream\n" -msgstr "" - -#: src/filed/xattr.c:3563 -#, c-format -msgid "Unable to restore data of xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3586 -#, c-format -msgid "Unable to symlink xattr %s to %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3622 -#, c-format -msgid "Unable to restore owner of xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3650 -#, c-format -msgid "Unable to restore filetimes of xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3666 -#, c-format -msgid "Illegal xattr stream, failed to parse xattr stream on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:3727 -#, c-format -msgid "Failed to restore extensible attributes on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:3740 -#, c-format -msgid "Failed to restore extended attributes on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:3909 -#, c-format -msgid "" -"Can't restore Extended Attributes of %s - incompatible xattr stream " -"encountered - %d\n" -msgstr "" - -#: src/findlib/attribs.c:94 src/findlib/attribs.c:131 -#: src/findlib/attribs.c:613 -#, c-format -msgid "Unable to set file owner %s: ERR=%s\n" -msgstr "" - -#: src/findlib/attribs.c:105 src/findlib/attribs.c:137 -#, c-format -msgid "Unable to set file modes %s: ERR=%s\n" -msgstr "" - -#: src/findlib/attribs.c:124 src/findlib/attribs.c:149 -#, c-format -msgid "Unable to set file times %s: ERR=%s\n" -msgstr "" - -#: src/findlib/attribs.c:590 -#, c-format -msgid "File size of restored file %s not correct. Original %s, restored %s.\n" -msgstr "" - -#: src/findlib/attribs.c:633 -#, c-format -msgid "Unable to set file flags %s: ERR=%s\n" -msgstr "" - -#: src/findlib/attribs.c:920 -#, c-format -msgid "Error in %s file %s: ERR=%s\n" -msgstr "" - -#: src/findlib/attribs.c:942 -#, c-format -msgid "Error in %s: ERR=%s\n" -msgstr "" - -#: src/findlib/bfile.c:86 -msgid "Unix attributes" -msgstr "" - -#: src/findlib/bfile.c:88 -msgid "File data" -msgstr "" - -#: src/findlib/bfile.c:90 -msgid "MD5 digest" -msgstr "" - -#: src/findlib/bfile.c:92 -msgid "GZIP data" -msgstr "" - -#: src/findlib/bfile.c:94 -msgid "Compressed data" -msgstr "" - -#: src/findlib/bfile.c:96 -msgid "Extended attributes" -msgstr "" - -#: src/findlib/bfile.c:98 -msgid "Sparse data" -msgstr "" - -#: src/findlib/bfile.c:100 -msgid "GZIP sparse data" -msgstr "" - -#: src/findlib/bfile.c:102 -msgid "Compressed sparse data" -msgstr "" - -#: src/findlib/bfile.c:104 -msgid "Program names" -msgstr "" - -#: src/findlib/bfile.c:106 -msgid "Program data" -msgstr "" - -#: src/findlib/bfile.c:108 -msgid "SHA1 digest" -msgstr "" - -#: src/findlib/bfile.c:110 -msgid "Win32 data" -msgstr "" - -#: src/findlib/bfile.c:112 -msgid "Win32 GZIP data" -msgstr "" - -#: src/findlib/bfile.c:114 -msgid "Win32 compressed data" -msgstr "" - -#: src/findlib/bfile.c:116 -msgid "MacOS Fork data" -msgstr "" - -#: src/findlib/bfile.c:118 -msgid "HFS+ attribs" -msgstr "" - -#: src/findlib/bfile.c:120 -msgid "Standard Unix ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:122 -msgid "Default Unix ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:124 -msgid "SHA256 digest" -msgstr "" - -#: src/findlib/bfile.c:126 -msgid "SHA512 digest" -msgstr "" - -#: src/findlib/bfile.c:128 -msgid "Signed digest" -msgstr "" - -#: src/findlib/bfile.c:130 -msgid "Encrypted File data" -msgstr "" - -#: src/findlib/bfile.c:132 -msgid "Encrypted Win32 data" -msgstr "" - -#: src/findlib/bfile.c:134 -msgid "Encrypted session data" -msgstr "" - -#: src/findlib/bfile.c:136 -msgid "Encrypted GZIP data" -msgstr "" - -#: src/findlib/bfile.c:138 -msgid "Encrypted compressed data" -msgstr "" - -#: src/findlib/bfile.c:140 -msgid "Encrypted Win32 GZIP data" -msgstr "" - -#: src/findlib/bfile.c:142 -msgid "Encrypted Win32 Compressed data" -msgstr "" - -#: src/findlib/bfile.c:144 -msgid "Encrypted MacOS fork data" -msgstr "" - -#: src/findlib/bfile.c:146 -msgid "Plugin Name" -msgstr "" - -#: src/findlib/bfile.c:148 -msgid "Plugin Data" -msgstr "" - -#: src/findlib/bfile.c:150 -#, fuzzy -msgid "Restore Object" -msgstr "Uitvoeren herstel opdracht" - -#: src/findlib/bfile.c:152 -msgid "AIX ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:154 -msgid "Darwin ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:156 -msgid "FreeBSD Default ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:158 -msgid "FreeBSD Access ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:160 -msgid "HPUX ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:162 -msgid "Irix Default ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:164 -msgid "Irix Access ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:166 -msgid "Linux Default ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:168 -msgid "Linux Access ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:170 -msgid "TRU64 Default ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:172 -msgid "TRU64 Access ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:174 -msgid "Solaris POSIX ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:176 -msgid "Solaris NFSv4/ZFS ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:178 -msgid "AFS ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:180 -msgid "AIX POSIX ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:182 -msgid "AIX NFSv4 ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:184 -msgid "FreeBSD NFSv4/ZFS ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:186 -msgid "GNU Hurd Default ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:188 -msgid "GNU Hurd Access ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:190 -msgid "GNU Hurd Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:192 -msgid "IRIX Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:194 -msgid "TRU64 Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:196 -msgid "AIX Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:198 -msgid "OpenBSD Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:200 -msgid "Solaris Extensible attribs or System Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:202 -msgid "Solaris Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:204 -msgid "Darwin Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:206 -msgid "FreeBSD Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:208 -msgid "Linux Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:210 -msgid "NetBSD Extended attribs" -msgstr "" - -#: src/findlib/create_file.c:118 -#, c-format -msgid "File skipped. Not newer: %s\n" -msgstr "" - -#: src/findlib/create_file.c:125 -#, c-format -msgid "File skipped. Not older: %s\n" -msgstr "" - -#: src/findlib/create_file.c:135 -#, c-format -msgid "File skipped. Already exists: %s\n" -msgstr "" - -#: src/findlib/create_file.c:161 -#, c-format -msgid "File %s already exists and could not be replaced. ERR=%s.\n" -msgstr "" - -#: src/findlib/create_file.c:212 src/findlib/create_file.c:276 -#: src/findlib/create_file.c:371 -#, c-format -msgid "bpkt already open fid=%d\n" -msgstr "" - -#: src/findlib/create_file.c:235 -#, c-format -msgid "Cannot make fifo %s: ERR=%s\n" -msgstr "" - -#: src/findlib/create_file.c:253 -#, c-format -msgid "Cannot make node %s: ERR=%s\n" -msgstr "" - -#: src/findlib/create_file.c:299 -#, c-format -msgid "Could not symlink %s -> %s: ERR=%s\n" -msgstr "" - -#: src/findlib/create_file.c:322 src/findlib/create_file.c:335 -#, c-format -msgid "Could not restore file flags for file %s: ERR=%s\n" -msgstr "" - -#: src/findlib/create_file.c:326 src/findlib/create_file.c:343 -#, c-format -msgid "Could not hard link %s -> %s: ERR=%s\n" -msgstr "" - -#: src/findlib/create_file.c:339 -#, c-format -msgid "Could not reset file flags for file %s: ERR=%s\n" -msgstr "" - -#: src/findlib/create_file.c:395 -#, c-format -msgid "Original file %s have been deleted: type=%d\n" -msgstr "" - -#: src/findlib/create_file.c:407 -#, c-format -msgid "Original file %s not saved: type=%d\n" -msgstr "" - -#: src/findlib/create_file.c:410 -#, c-format -msgid "Unknown file type %d; not restored: %s\n" -msgstr "" - -#: src/findlib/create_file.c:455 -#, c-format -msgid "Zero length filename: %s\n" -msgstr "" - -#: src/findlib/enable_priv.c:81 -msgid "AdjustTokenPrivileges set " -msgstr "" - -#: src/findlib/find.c:185 -#, c-format -msgid "Plugin: \"%s\" not found.\n" -msgstr "" - -#: src/findlib/find_one.c:223 -#, c-format -msgid " NODUMP flag set - will not process %s\n" -msgstr "" - -#: src/findlib/find_one.c:244 -#, c-format -msgid "Cannot stat file %s: ERR=%s\n" -msgstr "" - -#: src/findlib/find_one.c:249 -#, c-format -msgid "%s mtime changed during backup.\n" -msgstr "" - -#: src/findlib/find_one.c:256 -#, c-format -msgid "%s ctime changed during backup.\n" -msgstr "" - -#: src/findlib/find_one.c:263 -#, c-format -msgid "%s size of %lld changed during backup to %lld.n" -msgstr "" - -#: src/findlib/find_one.c:391 -#, c-format -msgid "Top level directory \"%s\" has unlisted fstype \"%s\"\n" -msgstr "" - -#: src/findlib/find_one.c:406 -#, c-format -msgid "Top level directory \"%s\" has an unlisted drive type \"%s\"\n" -msgstr "" - -#: src/findlib/mkpath.c:137 src/stored/dedupengine.c:250 -#, c-format -msgid "Cannot create directory %s: ERR=%s\n" -msgstr "" - -#: src/findlib/mkpath.c:141 src/findlib/mkpath.c:217 -#: src/stored/dedupengine.c:254 -#, c-format -msgid "%s exists but is not a directory.\n" -msgstr "" - -#: src/findlib/mkpath.c:153 -#, c-format -msgid "Security problem!! We created directory %s, but it is a link.\n" -msgstr "" - -#: src/findlib/mkpath.c:179 -#, c-format -msgid "Cannot change owner and/or group of %s: ERR=%s\n" -msgstr "" - -#: src/findlib/mkpath.c:184 -#, c-format -msgid "Cannot change permissions of %s: ERR=%s\n" -msgstr "" - -#: src/findlib/mkpath.c:254 -#, c-format -msgid "%c: is not a valid drive.\n" -msgstr "" - -#: src/findlib/mkpath.c:298 -msgid "Too many subdirectories. Some permissions not reset.\n" -msgstr "" - -#: src/findlib/savecwd.c:49 -#, c-format -msgid "Cannot open current directory: ERR=%s\n" -msgstr "" - -#: src/findlib/savecwd.c:60 -#, c-format -msgid "Cannot get current directory: ERR=%s\n" -msgstr "" - -#: src/findlib/savecwd.c:84 src/findlib/savecwd.c:95 -#, c-format -msgid "Cannot reset current directory: ERR=%s\n" -msgstr "" - -#: src/lib/address_conf.c:51 -#, c-format -msgid "Only ipv4 and ipv6 are supported (%d)\n" -msgstr "" - -#: src/lib/address_conf.c:55 -#, c-format -msgid "Only ipv4 is supported (%d)\n" -msgstr "" - -#: src/lib/address_conf.c:178 -#, c-format -msgid "You tried to assign a ipv6 address to an ipv4(%d)\n" -msgstr "" - -#: src/lib/address_conf.c:187 -#, c-format -msgid "You tried to assign an ipv4 address to an ipv6(%d)\n" -msgstr "" - -#: src/lib/address_conf.c:270 -#, c-format -msgid "Can't add default IPv4 address (%s)\n" -msgstr "" - -#: src/lib/address_conf.c:301 -msgid "" -"Old style addresses cannot be mixed with new style. Try removing Port=nnn." -msgstr "" - -#: src/lib/address_conf.c:323 -#, c-format -msgid "Cannot resolve service(%s)" -msgstr "" - -#: src/lib/address_conf.c:333 -#, c-format -msgid "Cannot resolve hostname(%s) %s" -msgstr "" - -#: src/lib/address_conf.c:441 src/lib/address_conf.c:474 -#, c-format -msgid "Expected a block to begin with { but got: %s" -msgstr "" - -#: src/lib/address_conf.c:446 -msgid "Empty addr block is not allowed" -msgstr "" - -#: src/lib/address_conf.c:450 -#, c-format -msgid "Expected a string but got: %s" -msgstr "" - -#: src/lib/address_conf.c:461 -#, c-format -msgid "Expected a string [ip|ipv4|ipv6] but got: %s" -msgstr "" - -#: src/lib/address_conf.c:465 -#, c-format -msgid "Expected a string [ip|ipv4] but got: %s" -msgstr "" - -#: src/lib/address_conf.c:470 -#, c-format -msgid "Expected an equal = but got: %s" -msgstr "" - -#: src/lib/address_conf.c:481 -#, c-format -msgid "Expected an identifier [addr|port] but got: %s" -msgstr "" - -#: src/lib/address_conf.c:486 -msgid "Only one port per address block" -msgstr "" - -#: src/lib/address_conf.c:492 -msgid "Only one addr per address block" -msgstr "" - -#: src/lib/address_conf.c:496 -#, c-format -msgid "Expected a identifier [addr|port] but got: %s" -msgstr "" - -#: src/lib/address_conf.c:500 -#, c-format -msgid "Expected a equal =, got: %s" -msgstr "" - -#: src/lib/address_conf.c:508 -#, c-format -msgid "Expected a number or a string but got: %s" -msgstr "" - -#: src/lib/address_conf.c:514 -#, c-format -msgid "Expected an IP number or a hostname but got: %s" -msgstr "" - -#: src/lib/address_conf.c:520 -msgid "State machine missmatch" -msgstr "" - -#: src/lib/address_conf.c:526 -#, c-format -msgid "Expected a end of block with } but got: %s" -msgstr "" - -#: src/lib/address_conf.c:532 -#, c-format -msgid "Cannot add hostname(%s) and port(%s) to addrlist (%s)" -msgstr "" - -#: src/lib/address_conf.c:538 -#, c-format -msgid "Expected an end of block with } but got: %s" -msgstr "" - -#: src/lib/address_conf.c:547 -#, c-format -msgid "Expected an IP number or a hostname, got: %s" -msgstr "" - -#: src/lib/address_conf.c:552 src/lib/address_conf.c:566 -#, c-format -msgid "Cannot add port (%s) to (%s)" -msgstr "" - -#: src/lib/address_conf.c:561 -#, c-format -msgid "Expected a port number or string, got: %s" -msgstr "" - -#: src/lib/attr.c:70 -#, c-format -msgid "Error scanning attributes: %s\n" -msgstr "" - -#: src/lib/berrno.c:52 -msgid "Child exited normally." -msgstr "" - -#: src/lib/berrno.c:59 -msgid "Unknown error during program execvp" -msgstr "" - -#: src/lib/berrno.c:62 -#, c-format -msgid "Child exited with code %d" -msgstr "" - -#: src/lib/berrno.c:70 -#, c-format -msgid "Child died from signal %d: %s" -msgstr "" - -#: src/lib/berrno.c:76 -msgid "Invalid errno. No error message possible." -msgstr "" - -#: src/lib/bget_msg.c:90 -msgid "Status OK\n" -msgstr "" - -#: src/lib/bget_msg.c:94 -#, c-format -msgid "bget_msg: unknown signal %d\n" -msgstr "" - -#: src/lib/bnet.c:130 -#, c-format -msgid "Attr spool write error. wrote=%d wanted=%d bytes. ERR=%s\n" -msgstr "" - -#: src/lib/bnet.c:215 src/lib/bnet.c:256 -msgid "TLS connection initialization failed.\n" -msgstr "" - -#: src/lib/bnet.c:223 -msgid "TLS Negotiation failed.\n" -msgstr "" - -#: src/lib/bnet.c:229 src/lib/bnet.c:271 -msgid "" -"TLS certificate verification failed. Peer certificate did not match a " -"required commonName\n" -msgstr "" - -#: src/lib/bnet.c:280 -#, c-format -msgid "" -"TLS host certificate verification failed. Host name \"%s\" did not match " -"presented certificate\n" -msgstr "" - -#: src/lib/bnet.c:297 -msgid "TLS enabled but not configured.\n" -msgstr "" - -#: src/lib/bnet.c:303 -msgid "TLS enable but not configured.\n" -msgstr "" - -#: src/lib/bnet.c:400 -msgid "No problem." -msgstr "" - -#: src/lib/bnet.c:403 -msgid "Authoritative answer for host not found." -msgstr "" - -#: src/lib/bnet.c:406 -msgid "Non-authoritative for host not found, or ServerFail." -msgstr "" - -#: src/lib/bnet.c:409 -msgid "Non-recoverable errors, FORMERR, REFUSED, or NOTIMP." -msgstr "" - -#: src/lib/bnet.c:412 -msgid "Valid name, no data record of resquested type." -msgstr "" - -#: src/lib/bnet.c:415 -msgid "Unknown error." -msgstr "" - -#: src/lib/bnet.c:557 -#, c-format -msgid "Unknown sig %d" -msgstr "" - -#: src/lib/bnet_server.c:99 -#, c-format -msgid "Cannot open stream socket. ERR=%s. Current %s All %s\n" -msgstr "" - -#: src/lib/bnet_server.c:112 -#, c-format -msgid "Cannot set SO_REUSEADDR on socket: %s\n" -msgstr "" - -#: src/lib/bnet_server.c:121 -#, c-format -msgid "Cannot bind port %d: ERR=%s: Retrying ...\n" -msgstr "" - -#: src/lib/bnet_server.c:129 src/lib/bnet_server.c:137 -#, c-format -msgid "Cannot bind port %d: ERR=%s.\n" -msgstr "" - -#: src/lib/bnet_server.c:144 -#, fuzzy -msgid "No addr/port found to listen on.\n" -msgstr "Geen Volumes gevonden om terug te zetten.\n" - -#: src/lib/bnet_server.c:150 -#, c-format -msgid "Could not init client queue: ERR=%s\n" -msgstr "" - -#: src/lib/bnet_server.c:169 -#, c-format -msgid "Error in select: %s\n" -msgstr "" - -#: src/lib/bnet_server.c:192 -#, c-format -msgid "Connection from %s:%d refused by hosts.access\n" -msgstr "" - -#: src/lib/bnet_server.c:208 src/lib/bsock.c:363 src/lib/bsock.c:402 -#, c-format -msgid "Cannot set SO_KEEPALIVE on socket: %s\n" -msgstr "" - -#: src/lib/bnet_server.c:220 -msgid "Could not create client BSOCK.\n" -msgstr "" - -#: src/lib/bnet_server.c:227 -#, c-format -msgid "Could not add job to client queue: ERR=%s\n" -msgstr "" - -#: src/lib/bnet_server.c:244 -#, c-format -msgid "Could not destroy client queue: ERR=%s\n" -msgstr "" - -#: src/lib/bpipe.c:373 src/lib/bpipe.c:456 -msgid "Program killed by Bacula (timeout)\n" -msgstr "" - -#: src/lib/bsock.c:221 -#, c-format -msgid "" -"Could not connect to %s on %s:%d. ERR=%s\n" -"Retrying ...\n" -msgstr "" - -#: src/lib/bsock.c:227 -#, c-format -msgid "Unable to connect to %s on %s:%d. ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:303 -#, c-format -msgid "gethostbyname() for host \"%s\" failed: ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:334 src/lib/bsock.c:336 -#, c-format -msgid "Socket open error. proto=%d port=%d. ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:349 src/lib/bsock.c:351 -#, c-format -msgid "Source address bind error. proto=%d. ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:371 -#, c-format -msgid "Cannot set TCP_KEEPIDLE on socket: %s\n" -msgstr "" - -#: src/lib/bsock.c:438 -#, fuzzy, c-format -msgid "Could not init bsock read mutex. ERR=%s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/lib/bsock.c:444 -#, fuzzy, c-format -msgid "Could not init bsock write mutex. ERR=%s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/lib/bsock.c:594 -msgid "Socket is closed\n" -msgstr "" - -#: src/lib/bsock.c:600 -#, c-format -msgid "Socket has errors=%d on call to %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:607 -#, c-format -msgid "Socket is terminated=%d on call to %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:616 -#, c-format -msgid "Socket has insane msglen=%d on call to %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:626 -#, c-format -msgid "Flowcontrol failure on %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:711 -#, c-format -msgid "Write error sending %d bytes to %s:%s:%d: ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:717 -#, c-format -msgid "Wrote %d bytes to %s:%s:%d, but only %d accepted.\n" -msgstr "" - -#: src/lib/bsock.c:818 src/lib/bsock.c:846 src/lib/bsock.c:920 -#: src/lib/bsock.c:963 -#, c-format -msgid "Read expected %d got %d from %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:879 -#, c-format -msgid "Packet size=%d too big from \"%s:%s:%d. Terminating connection.\n" -msgstr "" - -#: src/lib/bsock.c:909 -#, c-format -msgid "Read error from %s:%s:%d: ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:1041 -#, c-format -msgid "fread attr spool error. Wanted=%d got=%d bytes. ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:1059 -msgid "fread attr spool I/O error.\n" -msgstr "" - -#: src/lib/bsock.c:1120 -msgid "Could not malloc BSOCK data buffer\n" -msgstr "" - -#: src/lib/bsock.c:1138 src/lib/bsock.c:1157 -#, c-format -msgid "sockopt error: %s\n" -msgstr "" - -#: src/lib/bsock.c:1144 src/lib/bsock.c:1163 -#, c-format -msgid "Warning network buffer = %d bytes not max size.\n" -msgstr "" - -#: src/lib/bsock.c:1183 src/lib/bsock.c:1217 -#, c-format -msgid "fcntl F_GETFL error. ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:1189 src/lib/bsock.c:1223 src/lib/bsock.c:1255 -#, c-format -msgid "fcntl F_SETFL error. ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:1470 -#, fuzzy, c-format -msgid "Director authorization error at \"%s:%d\"\n" -msgstr "Geen toegang tot Pool \"%s\"\n" - -#: src/lib/bsock.c:1477 -#, c-format -msgid "" -"Authorization error: Remote server at \"%s:%d\" did not advertise required " -"TLS support.\n" -msgstr "" - -#: src/lib/bsock.c:1485 -#, c-format -msgid "" -"Authorization error with Director at \"%s:%d\": Remote server requires TLS.\n" -msgstr "" - -#: src/lib/bsock.c:1497 src/qt-console/bcomm/dircomm_auth.cpp:134 -#, c-format -msgid "TLS negotiation failed with Director at \"%s:%d\"\n" -msgstr "" - -#: src/lib/bsock.c:1507 -#, c-format -msgid "" -"Bad errmsg to Hello command: ERR=%s\n" -"The Director at \"%s:%d\" may not be running.\n" -msgstr "" - -#: src/lib/bsock.c:1516 src/qt-console/bcomm/dircomm_auth.cpp:155 -#, c-format -msgid "Director at \"%s:%d\" rejected Hello command\n" -msgstr "" - -#: src/lib/bsock.c:1526 -#, c-format -msgid "" -"Authorization error with Director at \"%s:%d\"\n" -"Most likely the passwords do not agree.\n" -"If you are using TLS, there may have been a certificate validation error " -"during the TLS handshake.\n" -"For help, please see: " -msgstr "" - -#: src/lib/bsys.c:142 -#, c-format -msgid "safe_unlink could not compile regex pattern \"%s\" ERR=%s\n" -msgstr "" - -#: src/lib/bsys.c:342 src/lib/bsys.c:359 src/lib/bsys.c:383 src/lib/bsys.c:396 -#, c-format -msgid "Out of memory: ERR=%s\n" -msgstr "" - -#: src/lib/bsys.c:438 -msgid "Buffer overflow.\n" -msgstr "" - -#: src/lib/bsys.c:504 -msgid "Bad errno" -msgstr "" - -#: src/lib/bsys.c:519 -#, c-format -msgid "Memset for %d bytes at %s:%d\n" -msgstr "" - -#: src/lib/bsys.c:568 -#, fuzzy, c-format -msgid "Cannot open %s file. %s ERR=%s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/lib/bsys.c:585 src/lib/bsys.c:621 -#, c-format -msgid "" -"%s is already running. pid=%d\n" -"Check file %s\n" -msgstr "" - -#: src/lib/bsys.c:601 -#, fuzzy, c-format -msgid "Could not open %s file. %s ERR=%s\n" -msgstr "Kan Client niet vinden %s: ERR=%s" - -#: src/lib/bsys.c:624 -#, fuzzy, c-format -msgid "Cannot lock %s file. %s ERR=%s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/lib/bsys.c:637 -#, fuzzy, c-format -msgid "Cannot not open %s file. %s ERR=%s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/lib/bsys.c:769 -#, c-format -msgid "Could not create state file. %s ERR=%s\n" -msgstr "" - -#: src/lib/bsys.c:788 -#, c-format -msgid "Write final hdr error: ERR=%s\n" -msgstr "" - -#: src/lib/btimers.c:254 -msgid "stop_btimer called with NULL btimer_id\n" -msgstr "" - -#: src/lib/cram-md5.c:106 src/lib/cram-md5.c:138 -msgid "1999 Authorization failed.\n" -msgstr "" - -#: src/lib/crypto.c:428 -msgid "Unable to open certificate file" -msgstr "" - -#: src/lib/crypto.c:435 -msgid "Unable to read certificate from file" -msgstr "" - -#: src/lib/crypto.c:441 -msgid "Unable to extract public key from certificate" -msgstr "" - -#: src/lib/crypto.c:448 -msgid "" -"Provided certificate does not include the required subjectKeyIdentifier " -"extension." -msgstr "" - -#: src/lib/crypto.c:455 -#, c-format -msgid "Unsupported key type provided: %d\n" -msgstr "" - -#: src/lib/crypto.c:492 src/lib/crypto.c:540 -msgid "Unable to open private key file" -msgstr "" - -#: src/lib/crypto.c:522 src/lib/crypto.c:556 -msgid "Unable to read private key from file" -msgstr "" - -#: src/lib/crypto.c:615 -#, c-format -msgid "Unsupported digest type: %d\n" -msgstr "" - -#: src/lib/crypto.c:629 -msgid "OpenSSL digest initialization failed" -msgstr "" - -#: src/lib/crypto.c:643 -msgid "OpenSSL digest update failed" -msgstr "" - -#: src/lib/crypto.c:661 -msgid "OpenSSL digest finalize failed" -msgstr "" - -#: src/lib/crypto.c:759 -msgid "OpenSSL digest_new failed" -msgstr "" - -#: src/lib/crypto.c:765 -msgid "OpenSSL sign get digest failed" -msgstr "" - -#: src/lib/crypto.c:804 src/lib/crypto.c:808 -msgid "OpenSSL digest Verify final failed" -msgstr "" - -#: src/lib/crypto.c:813 -msgid "No signers found for crypto verify.\n" -msgstr "" - -#: src/lib/crypto.c:874 -msgid "Signature creation failed" -msgstr "" - -#: src/lib/crypto.c:952 -msgid "Signature decoding failed" -msgstr "" - -#: src/lib/crypto.c:1029 -msgid "Unsupported cipher type specified\n" -msgstr "" - -#: src/lib/crypto.c:1178 -msgid "CryptoData decoding failed" -msgstr "" - -#: src/lib/crypto.c:1222 -msgid "Failure decrypting the session key" -msgstr "" - -#: src/lib/crypto.c:1273 -#, c-format -msgid "Unsupported contentEncryptionAlgorithm: %d\n" -msgstr "" - -#: src/lib/crypto.c:1283 src/lib/crypto.c:1289 -msgid "OpenSSL cipher context initialization failed" -msgstr "" - -#: src/lib/crypto.c:1296 -msgid "Encryption session provided an invalid symmetric key" -msgstr "" - -#: src/lib/crypto.c:1302 -msgid "Encryption session provided an invalid IV" -msgstr "" - -#: src/lib/crypto.c:1308 -msgid "OpenSSL cipher context key/IV initialization failed" -msgstr "" - -#: src/lib/crypto.c:1407 -#, c-format -msgid "Unsupported digest type=%d specified\n" -msgstr "" - -#: src/lib/crypto.c:1427 -#, c-format -msgid "SHA1Update() returned an error: %d\n" -msgstr "" - -#: src/lib/crypto.c:1566 -msgid "No error" -msgstr "" - -#: src/lib/crypto.c:1568 -msgid "Signer not found" -msgstr "" - -#: src/lib/crypto.c:1570 -msgid "Recipient not found" -msgstr "" - -#: src/lib/crypto.c:1572 -msgid "Unsupported digest algorithm" -msgstr "" - -#: src/lib/crypto.c:1574 -msgid "Unsupported encryption algorithm" -msgstr "" - -#: src/lib/crypto.c:1576 -msgid "Signature is invalid" -msgstr "" - -#: src/lib/crypto.c:1578 -msgid "Decryption error" -msgstr "" - -#: src/lib/crypto.c:1581 -msgid "Internal error" -msgstr "" - -#: src/lib/crypto.c:1583 -msgid "Unknown error" -msgstr "" - -#: src/lib/daemon.c:51 -#, c-format -msgid "Cannot fork to become daemon: ERR=%s\n" -msgstr "" - -#: src/lib/devlock.c:319 -msgid "writeunlock called too many times.\n" -msgstr "" - -#: src/lib/devlock.c:324 -msgid "writeunlock by non-owner.\n" -msgstr "" - -#: src/lib/devlock.c:490 src/lib/rwlock.c:427 -#, c-format -msgid "Thread %d found unchanged elements %d times\n" -msgstr "" - -#: src/lib/devlock.c:558 src/lib/rwlock.c:494 -#, c-format -msgid "%02d: interval %d, writes %d, reads %d\n" -msgstr "" - -#: src/lib/devlock.c:568 src/lib/rwlock.c:504 -#, c-format -msgid "data %02d: value %d, %d writes\n" -msgstr "" - -#: src/lib/devlock.c:573 src/lib/rwlock.c:509 -#, c-format -msgid "Total: %d thread writes, %d data writes\n" -msgstr "" - -#: src/lib/devlock.c:645 src/lib/rwlock.c:581 -msgid "Try write lock" -msgstr "" - -#: src/lib/devlock.c:651 src/lib/rwlock.c:587 -msgid "Try read lock" -msgstr "" - -#: src/lib/devlock.c:705 src/lib/rwlock.c:640 -msgid "Create thread" -msgstr "" - -#: src/lib/devlock.c:715 src/lib/rwlock.c:650 -msgid "Join thread" -msgstr "" - -#: src/lib/devlock.c:717 src/lib/rwlock.c:652 -#, c-format -msgid "%02d: interval %d, updates %d, r_collisions %d, w_collisions %d\n" -msgstr "" - -#: src/lib/devlock.c:729 src/lib/rwlock.c:664 -#, c-format -msgid "data %02d: value %d, %d updates\n" -msgstr "" - -#: src/lib/edit.c:491 -msgid "Empty name not allowed.\n" -msgstr "" - -#: src/lib/edit.c:501 -#, c-format -msgid "Illegal character \"%c\" in name.\n" -msgstr "" - -#: src/lib/edit.c:508 -msgid "Name too long.\n" -msgstr "" - -#: src/lib/ini.c:97 src/lib/ini.c:109 -#, c-format -msgid "" -"Config file error: %s\n" -" : Line %d, col %d of file %s\n" -"%s\n" -msgstr "" - -#: src/lib/ini.c:367 src/lib/ini.c:414 -#, c-format -msgid "Cannot open config file %s: %s\n" -msgstr "" - -#: src/lib/ini.c:382 -msgid "Cannot open lex\n" -msgstr "" - -#: src/lib/jcr.c:221 src/lib/util.c:438 -msgid "Backup" -msgstr "" - -#: src/lib/jcr.c:223 -msgid "Verifying" -msgstr "" - -#: src/lib/jcr.c:225 -msgid "Restoring" -msgstr "" - -#: src/lib/jcr.c:227 -msgid "Archiving" -msgstr "" - -#: src/lib/jcr.c:229 -msgid "Copying" -msgstr "" - -#: src/lib/jcr.c:231 -msgid "Migration" -msgstr "" - -#: src/lib/jcr.c:233 -msgid "Scanning" -msgstr "" - -#: src/lib/jcr.c:235 -msgid "Unknown operation" -msgstr "" - -#: src/lib/jcr.c:244 -msgid "backup" -msgstr "" - -#: src/lib/jcr.c:246 -msgid "verified" -msgstr "" - -#: src/lib/jcr.c:246 -msgid "verify" -msgstr "" - -#: src/lib/jcr.c:248 -msgid "restored" -msgstr "" - -#: src/lib/jcr.c:248 -msgid "restore" -msgstr "" - -#: src/lib/jcr.c:250 -msgid "archived" -msgstr "" - -#: src/lib/jcr.c:250 -msgid "archive" -msgstr "" - -#: src/lib/jcr.c:252 -msgid "copied" -msgstr "" - -#: src/lib/jcr.c:252 -msgid "copy" -msgstr "" - -#: src/lib/jcr.c:254 -msgid "migrated" -msgstr "" - -#: src/lib/jcr.c:254 -msgid "migrate" -msgstr "" - -#: src/lib/jcr.c:256 -msgid "scanned" -msgstr "" - -#: src/lib/jcr.c:256 -msgid "scan" -msgstr "" - -#: src/lib/jcr.c:258 -msgid "unknown action" -msgstr "" - -#: src/lib/jcr.c:310 src/lib/lockmgr.c:305 src/lib/lockmgr.c:780 -#: src/lib/lockmgr.c:808 -#, c-format -msgid "pthread key create failed: ERR=%s\n" -msgstr "" - -#: src/lib/jcr.c:331 -#, c-format -msgid "pthread_once failed. ERR=%s\n" -msgstr "" - -#: src/lib/jcr.c:340 -#, c-format -msgid "Could not init msg_queue mutex. ERR=%s\n" -msgstr "" - -#: src/lib/jcr.c:397 -msgid "NULL jcr.\n" -msgstr "" - -#: src/lib/jcr.c:606 -#, c-format -msgid "pthread_setspecific failed: ERR=%s\n" -msgstr "" - -#: src/lib/jcr.c:1097 -#, c-format -msgid "" -"Watchdog sending kill after %d secs to thread stalled reading Storage " -"daemon.\n" -msgstr "" - -#: src/lib/jcr.c:1109 -#, c-format -msgid "" -"Watchdog sending kill after %d secs to thread stalled reading File daemon.\n" -msgstr "" - -#: src/lib/jcr.c:1121 -#, c-format -msgid "" -"Watchdog sending kill after %d secs to thread stalled reading Director.\n" -msgstr "" - -#: src/lib/lex.c:81 -#, c-format -msgid "Problem probably begins at line %d.\n" -msgstr "" - -#: src/lib/lex.c:86 -#, c-format -msgid "" -"Config error: %s\n" -" : line %d, col %d of file %s\n" -"%s\n" -"%s" -msgstr "" - -#: src/lib/lex.c:90 -#, c-format -msgid "Config error: %s\n" -msgstr "" - -#: src/lib/lex.c:119 -msgid "Close of NULL file\n" -msgstr "" - -#: src/lib/lex.c:273 src/lib/xml.c:149 -msgid "" -"get_char: called after EOF. You may have a open double quote without the " -"closing double quote.\n" -msgstr "" - -#: src/lib/lex.c:333 src/lib/xml.c:192 src/lib/xml.c:205 -#, c-format -msgid "Config token too long, file: %s, line %d, begins at line %d\n" -msgstr "" - -#: src/lib/lex.c:357 -msgid "none" -msgstr "" - -#: src/lib/lex.c:358 -msgid "comment" -msgstr "" - -#: src/lib/lex.c:359 -msgid "number" -msgstr "" - -#: src/lib/lex.c:360 -msgid "ip_addr" -msgstr "" - -#: src/lib/lex.c:361 -msgid "identifier" -msgstr "" - -#: src/lib/lex.c:362 -msgid "string" -msgstr "" - -#: src/lib/lex.c:363 -msgid "quoted_string" -msgstr "" - -#: src/lib/lex.c:364 -msgid "include" -msgstr "" - -#: src/lib/lex.c:365 -msgid "include_quoted_string" -msgstr "" - -#: src/lib/lex.c:366 -msgid "UTF-8 Byte Order Mark" -msgstr "" - -#: src/lib/lex.c:367 -msgid "UTF-16le Byte Order Mark" -msgstr "" - -#: src/lib/lex.c:405 src/lib/lex.c:411 src/lib/lex.c:422 src/lib/lex.c:428 -#, c-format -msgid "expected a positive integer number, got: %s" -msgstr "" - -#: src/lib/lex.c:544 src/lib/xml.c:344 -msgid "" -"This config file appears to be in an unsupported Unicode format (UTF-16be). " -"Please resave as UTF-8\n" -msgstr "" - -#: src/lib/lex.c:690 src/lib/lex.c:718 -#, c-format -msgid "Cannot open included config file %s: %s\n" -msgstr "" - -#: src/lib/lex.c:777 src/lib/lex.c:834 -#, c-format -msgid "expected an integer or a range, got %s: %s" -msgstr "" - -#: src/lib/lex.c:791 src/lib/lex.c:799 src/lib/lex.c:810 src/lib/lex.c:818 -#, c-format -msgid "expected an integer number, got %s: %s" -msgstr "" - -#: src/lib/lex.c:848 -#, c-format -msgid "expected a name, got %s: %s" -msgstr "" - -#: src/lib/lex.c:852 -#, c-format -msgid "name %s length %d too long, max is %d\n" -msgstr "" - -#: src/lib/lex.c:860 -#, c-format -msgid "expected a string, got %s: %s" -msgstr "" - -#: src/lib/lockmgr.c:54 -#, c-format -msgid "ASSERT failed at %s:%i: %s\n" -msgstr "" - -#: src/lib/lockmgr.c:59 -#, c-format -msgid "ASSERT failed at %s:%i: %s \n" -msgstr "" - -#: src/lib/lockmgr.c:65 -#, c-format -msgid "ASSERT failed at %s:%i: %s (%s)\n" -msgstr "" - -#: src/lib/lockmgr.c:96 -#, c-format -msgid "Mutex lock failure. ERR=%s\n" -msgstr "" - -#: src/lib/lockmgr.c:106 -#, c-format -msgid "Mutex unlock failure. ERR=%s\n" -msgstr "" - -#: src/lib/lockmgr.c:792 -#, c-format -msgid "pthread_create failed: ERR=%s\n" -msgstr "" - -#: src/lib/mem_pool.c:103 -#, c-format -msgid "MemPool index %d larger than max %d\n" -msgstr "" - -#: src/lib/mem_pool.c:121 src/lib/mem_pool.c:141 src/lib/mem_pool.c:177 -#: src/lib/mem_pool.c:250 src/lib/mem_pool.c:270 src/lib/mem_pool.c:305 -#: src/lib/mem_pool.c:616 -#, c-format -msgid "Out of memory requesting %d bytes\n" -msgstr "" - -#: src/lib/mem_pool.c:158 -msgid "obuf is NULL\n" -msgstr "" - -#: src/lib/message.c:418 src/lib/message.c:428 -#, c-format -msgid "Could not open console message file %s: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:433 -#, c-format -msgid "Could not get con mutex: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:538 -msgid "Bacula Message" -msgstr "" - -#: src/lib/message.c:542 -#, c-format -msgid "open mail pipe %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:633 -msgid "open mail pipe failed.\n" -msgstr "" - -#: src/lib/message.c:646 -#, c-format -msgid "close error: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:657 -#, c-format -msgid "Mail prog: %s" -msgstr "" - -#: src/lib/message.c:666 -#, c-format -msgid "" -"Mail program terminated in error.\n" -"CMD=%s\n" -"ERR=%s\n" -msgstr "" - -#: src/lib/message.c:773 -#, c-format -msgid "fopen %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:895 src/lib/message.c:898 -msgid "Msg delivery error: Unable to store data in database.\n" -msgstr "" - -#: src/lib/message.c:950 -#, c-format -msgid "" -"Msg delivery error: Operator mail program terminated in error.\n" -"CMD=%s\n" -"ERR=%s\n" -msgstr "" - -#: src/lib/message.c:971 -#, c-format -msgid "Msg delivery error: fopen %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:1318 -#, c-format -msgid "%s: ABORTING due to ERROR in %s:%d\n" -msgstr "" - -#: src/lib/message.c:1322 -#, c-format -msgid "%s: ERROR TERMINATION at %s:%d\n" -msgstr "" - -#: src/lib/message.c:1327 -#, c-format -msgid "%s: Fatal Error because: " -msgstr "" - -#: src/lib/message.c:1329 -#, c-format -msgid "%s: Fatal Error at %s:%d because:\n" -msgstr "" - -#: src/lib/message.c:1333 -#, c-format -msgid "%s: ERROR: " -msgstr "" - -#: src/lib/message.c:1335 -#, c-format -msgid "%s: ERROR in %s:%d " -msgstr "" - -#: src/lib/message.c:1338 -#, c-format -msgid "%s: Warning: " -msgstr "" - -#: src/lib/message.c:1341 -#, c-format -msgid "%s: Security violation: " -msgstr "" - -#: src/lib/message.c:1430 -#, c-format -msgid "%s ABORTING due to ERROR\n" -msgstr "" - -#: src/lib/message.c:1433 -#, c-format -msgid "%s ERROR TERMINATION\n" -msgstr "" - -#: src/lib/message.c:1436 -#, c-format -msgid "%s JobId %u: Fatal error: " -msgstr "" - -#: src/lib/message.c:1445 -#, c-format -msgid "%s JobId %u: Error: " -msgstr "" - -#: src/lib/message.c:1451 -#, c-format -msgid "%s JobId %u: Warning: " -msgstr "" - -#: src/lib/message.c:1457 -#, c-format -msgid "%s JobId %u: Security violation: " -msgstr "" - -#: src/lib/message.c:1732 -msgid "Debug lock information" -msgstr "" - -#: src/lib/message.c:1733 -msgid "Debug network information" -msgstr "" - -#: src/lib/message.c:1734 -msgid "Debug plugin information" -msgstr "" - -#: src/lib/message.c:1735 -msgid "Debug volume information" -msgstr "" - -#: src/lib/message.c:1736 -msgid "Debug SQL queries" -msgstr "" - -#: src/lib/message.c:1737 -msgid "Debug BVFS queries" -msgstr "" - -#: src/lib/message.c:1738 -msgid "Debug memory allocation" -msgstr "" - -#: src/lib/message.c:1739 -msgid "Debug scheduler information" -msgstr "" - -#: src/lib/message.c:1740 -msgid "Debug protocol information" -msgstr "" - -#: src/lib/message.c:1741 -msgid "Debug dedup information" -msgstr "" - -#: src/lib/message.c:1742 -msgid "Debug snapshots" -msgstr "" - -#: src/lib/message.c:1743 -msgid "Debug dedup engine" -msgstr "" - -#: src/lib/message.c:1744 -msgid "ASX personal's debugging" -msgstr "" - -#: src/lib/message.c:1745 -msgid "Debug all information" -msgstr "" - -#: src/lib/openssl.c:113 src/lib/openssl.c:172 src/stored/dev.c:385 -#: src/stored/dev.c:443 -#, c-format -msgid "Unable to init mutex: ERR=%s\n" -msgstr "" - -#: src/lib/openssl.c:134 src/lib/openssl.c:205 -#, c-format -msgid "Unable to destroy mutex: ERR=%s\n" -msgstr "" - -#: src/lib/openssl.c:273 -#, c-format -msgid "Unable to init OpenSSL threading: ERR=%s\n" -msgstr "" - -#: src/lib/openssl.c:286 -msgid "Failed to seed OpenSSL PRNG\n" -msgstr "" - -#: src/lib/openssl.c:312 -msgid "Failed to save OpenSSL PRNG\n" -msgstr "" - -#: src/lib/parse_conf.c:164 -msgid "***UNKNOWN***" -msgstr "" - -#: src/lib/parse_conf.c:208 -#, c-format -msgid "Attempt to define second %s resource named \"%s\" is not permitted.\n" -msgstr "" - -#: src/lib/parse_conf.c:214 -#, c-format -msgid "Inserted res: %s index=%d\n" -msgstr "" - -#: src/lib/parse_conf.c:328 src/lib/parse_conf.c:349 -#, c-format -msgid "expected an =, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:358 -#, c-format -msgid "Unknown item code: %d\n" -msgstr "" - -#: src/lib/parse_conf.c:398 -#, c-format -msgid "message type: %s not found" -msgstr "" - -#: src/lib/parse_conf.c:437 -#, c-format -msgid "Attempt to redefine name \"%s\" to \"%s\"." -msgstr "" - -#: src/lib/parse_conf.c:542 -#, c-format -msgid "Attempt to redefine resource \"%s\" referenced on line %d : %s\n" -msgstr "" - -#: src/lib/parse_conf.c:578 -#, c-format -msgid "Too many %s directives. Max. is %d. line %d: %s\n" -msgstr "" - -#: src/lib/parse_conf.c:589 -#, c-format -msgid "Could not find config Resource \"%s\" referenced on line %d : %s\n" -msgstr "" - -#: src/lib/parse_conf.c:657 -#, c-format -msgid "Missing config Resource \"%s\" referenced on line %d : %s\n" -msgstr "" - -#: src/lib/parse_conf.c:732 -#, c-format -msgid "expected a size number, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:737 -#, c-format -msgid "expected a speed number, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:748 -#, c-format -msgid "expected a %s, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:749 -msgid "size" -msgstr "" - -#: src/lib/parse_conf.c:749 -msgid "speed" -msgstr "" - -#: src/lib/parse_conf.c:870 -#, c-format -msgid "Expected a Tape Label keyword, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:939 -#, c-format -msgid "Unable to initialize resource lock. ERR=%s\n" -msgstr "" - -#: src/lib/parse_conf.c:947 -msgid "Config filename too long.\n" -msgstr "" - -#: src/lib/parse_conf.c:971 -#, c-format -msgid "Cannot open config file \"%s\": %s\n" -msgstr "" - -#: src/lib/parse_conf.c:989 -msgid "" -"Currently we cannot handle UTF-16 source files. Please convert the conf file " -"to UTF-8\n" -msgstr "" - -#: src/lib/parse_conf.c:993 -#, c-format -msgid "Expected a Resource name identifier, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:1009 -#, c-format -msgid "expected resource name, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:1020 -#, c-format -msgid "not in resource definition: %s" -msgstr "" - -#: src/lib/parse_conf.c:1051 -#, c-format -msgid "" -"Keyword \"%s\" not permitted in this resource.\n" -"Perhaps you left the trailing brace off of the previous resource." -msgstr "" - -#: src/lib/parse_conf.c:1062 -msgid "Name not specified for resource" -msgstr "" - -#: src/lib/parse_conf.c:1072 -#, c-format -msgid "unexpected token %d %s in resource definition" -msgstr "" - -#: src/lib/parse_conf.c:1078 -#, c-format -msgid "Unknown parser state %d\n" -msgstr "" - -#: src/lib/parse_conf.c:1083 -msgid "End of conf file reached with unclosed resource." -msgstr "" - -#: src/lib/plugins.c:106 -#, c-format -msgid "Failed to open Plugin directory %s: ERR=%s\n" -msgstr "" - -#: src/lib/plugins.c:123 -#, c-format -msgid "Failed to find any plugins in %s\n" -msgstr "" - -#: src/lib/plugins.c:157 -#, c-format -msgid "dlopen plugin %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/plugins.c:168 -#, c-format -msgid "Lookup of loadPlugin in plugin %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/plugins.c:177 -#, c-format -msgid "Lookup of unloadPlugin in plugin %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:57 -#, c-format -msgid "Could not find userid=%s: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:63 -#, c-format -msgid "Could not find password entry. ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:76 -#, c-format -msgid "Could not find group=%s: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:84 -#, c-format -msgid "Could not initgroups for group=%s, userid=%s: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:87 -#, c-format -msgid "Could not initgroups for userid=%s: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:94 -#, c-format -msgid "Could not set group=%s: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:104 -#, c-format -msgid "prctl failed: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:108 -#, c-format -msgid "setreuid failed: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:112 -#, c-format -msgid "cap_from_text failed: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:116 -#, c-format -msgid "cap_set_proc failed: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:120 -msgid "Keep readall caps not implemented this OS or missing libraries.\n" -msgstr "" - -#: src/lib/priv.c:124 -#, c-format -msgid "Could not set specified userid: %s\n" -msgstr "" - -#: src/lib/pythonlib.c:105 -msgid "Could not initialize Python\n" -msgstr "" - -#: src/lib/pythonlib.c:110 -#, c-format -msgid "Could not Run Python string %s\n" -msgstr "" - -#: src/lib/pythonlib.c:122 -msgid "Could not initialize Python Job type.\n" -msgstr "" - -#: src/lib/pythonlib.c:127 -#, c-format -msgid "Could not import Python script %s/%s. Python disabled.\n" -msgstr "" - -#: src/lib/pythonlib.c:229 -msgid "Could not create Python Job Object.\n" -msgstr "" - -#: src/lib/pythonlib.c:242 src/lib/pythonlib.c:266 -#, c-format -msgid "Python function \"%s\" not found.\n" -msgstr "" - -#: src/lib/pythonlib.c:281 -#, c-format -msgid "Unknown Python daemon event %s\n" -msgstr "" - -#: src/lib/pythonlib.c:306 -#, c-format -msgid "Unable to initialize the Python lock. ERR=%s\n" -msgstr "" - -#: src/lib/res.c:54 -#, c-format -msgid "rwl_writelock failure at %s:%d: ERR=%s\n" -msgstr "" - -#: src/lib/res.c:64 -#, c-format -msgid "rwl_writeunlock failure at %s:%d:. ERR=%s\n" -msgstr "" - -#: src/lib/runscript.c:225 -#, c-format -msgid "%s: run %s \"%s\"\n" -msgstr "" - -#: src/lib/runscript.c:234 -#, c-format -msgid "Runscript: %s could not execute. ERR=%s\n" -msgstr "" - -#: src/lib/runscript.c:243 -#, c-format -msgid "%s: %s\n" -msgstr "" - -#: src/lib/runscript.c:248 -#, c-format -msgid "Runscript: %s returned non-zero status=%d. ERR=%s\n" -msgstr "" - -#: src/lib/rwlock.c:291 -msgid "rwl_writeunlock called too many times.\n" -msgstr "" - -#: src/lib/rwlock.c:296 -msgid "rwl_writeunlock by non-owner.\n" -msgstr "" - -#: src/lib/sellist.c:58 -msgid "Negative numbers not permitted.\n" -msgstr "" - -#: src/lib/sellist.c:84 -#, fuzzy -msgid "User cancel requested.\n" -msgstr "Terugzetten geannuleerd.\n" - -#: src/lib/sellist.c:107 -msgid "Selection items must be be greater than zero.\n" -msgstr "" - -#: src/lib/signal.c:57 -msgid "Invalid signal number" -msgstr "" - -#: src/lib/signal.c:147 src/lib/signal.c:149 -#, c-format -msgid "Bacula interrupted by signal %d: %s\n" -msgstr "" - -#: src/lib/signal.c:165 -#, c-format -msgid "Kaboom! %s, %s got signal %d - %s at %s. Attempting traceback.\n" -msgstr "" - -#: src/lib/signal.c:167 -#, c-format -msgid "Kaboom! exepath=%s\n" -msgstr "" - -#: src/lib/signal.c:208 -#, c-format -msgid "Fork error: ERR=%s\n" -msgstr "" - -#: src/lib/signal.c:216 -#, c-format -msgid "Calling: %s %s %s %s\n" -msgstr "" - -#: src/lib/signal.c:220 -#, c-format -msgid "execv: %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/signal.c:242 -#, c-format -msgid "It looks like the traceback worked...\n" -msgstr "" - -#: src/lib/signal.c:244 -#, c-format -msgid "The btraceback call returned %d\n" -msgstr "" - -#: src/lib/signal.c:304 -#, c-format -msgid "BA_NSIG too small (%d) should be (%d)\n" -msgstr "" - -#: src/lib/signal.c:310 -msgid "UNKNOWN SIGNAL" -msgstr "" - -#: src/lib/signal.c:311 -msgid "Hangup" -msgstr "" - -#: src/lib/signal.c:312 -msgid "Interrupt" -msgstr "" - -#: src/lib/signal.c:313 -msgid "Quit" -msgstr "" - -#: src/lib/signal.c:314 -msgid "Illegal instruction" -msgstr "" - -#: src/lib/signal.c:315 -msgid "Trace/Breakpoint trap" -msgstr "" - -#: src/lib/signal.c:316 -msgid "Abort" -msgstr "" - -#: src/lib/signal.c:318 -msgid "EMT instruction (Emulation Trap)" -msgstr "" - -#: src/lib/signal.c:321 -msgid "IOT trap" -msgstr "" - -#: src/lib/signal.c:323 -msgid "BUS error" -msgstr "" - -#: src/lib/signal.c:324 -msgid "Floating-point exception" -msgstr "" - -#: src/lib/signal.c:325 -msgid "Kill, unblockable" -msgstr "" - -#: src/lib/signal.c:326 -msgid "User-defined signal 1" -msgstr "" - -#: src/lib/signal.c:327 -msgid "Segmentation violation" -msgstr "" - -#: src/lib/signal.c:328 -msgid "User-defined signal 2" -msgstr "" - -#: src/lib/signal.c:329 -msgid "Broken pipe" -msgstr "" - -#: src/lib/signal.c:330 -msgid "Alarm clock" -msgstr "" - -#: src/lib/signal.c:331 -msgid "Termination" -msgstr "" - -#: src/lib/signal.c:333 -msgid "Stack fault" -msgstr "" - -#: src/lib/signal.c:335 -msgid "Child status has changed" -msgstr "" - -#: src/lib/signal.c:336 -msgid "Continue" -msgstr "" - -#: src/lib/signal.c:337 -msgid "Stop, unblockable" -msgstr "" - -#: src/lib/signal.c:338 -msgid "Keyboard stop" -msgstr "" - -#: src/lib/signal.c:339 -msgid "Background read from tty" -msgstr "" - -#: src/lib/signal.c:340 -msgid "Background write to tty" -msgstr "" - -#: src/lib/signal.c:341 -msgid "Urgent condition on socket" -msgstr "" - -#: src/lib/signal.c:342 -msgid "CPU limit exceeded" -msgstr "" - -#: src/lib/signal.c:343 -msgid "File size limit exceeded" -msgstr "" - -#: src/lib/signal.c:344 -msgid "Virtual alarm clock" -msgstr "" - -#: src/lib/signal.c:345 -msgid "Profiling alarm clock" -msgstr "" - -#: src/lib/signal.c:346 -msgid "Window size change" -msgstr "" - -#: src/lib/signal.c:347 -msgid "I/O now possible" -msgstr "" - -#: src/lib/signal.c:349 -msgid "Power failure restart" -msgstr "" - -#: src/lib/signal.c:352 -msgid "No runnable lwp" -msgstr "" - -#: src/lib/signal.c:355 -msgid "SIGLWP special signal used by thread library" -msgstr "" - -#: src/lib/signal.c:358 -msgid "Checkpoint Freeze" -msgstr "" - -#: src/lib/signal.c:361 -msgid "Checkpoint Thaw" -msgstr "" - -#: src/lib/signal.c:364 -msgid "Thread Cancellation" -msgstr "" - -#: src/lib/signal.c:367 -msgid "Resource Lost (e.g. record-lock lost)" -msgstr "" - -#: src/lib/smartall.c:134 src/lib/smartall.c:247 src/lib/smartall.c:262 -msgid "Out of memory\n" -msgstr "" - -#: src/lib/smartall.c:139 -msgid "Too much memory used." -msgstr "" - -#: src/lib/smartall.c:171 -#, c-format -msgid "Attempt to free NULL called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:185 -#, c-format -msgid "in-use bit not set: double free from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:193 -#, c-format -msgid "qp->qnext->qprev != qp called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:197 -#, c-format -msgid "qp->qprev->qnext != qp called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:206 -#, c-format -msgid "Overrun buffer: len=%d addr=%p allocated: %s:%d called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:284 -#, c-format -msgid "sm_realloc size: %d\n" -msgstr "" - -#: src/lib/smartall.c:322 -#, c-format -msgid "sm_realloc %d at %p from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:382 -#, c-format -msgid "" -"\n" -"Orphaned buffers exist. Dump terminated following\n" -" discovery of bad links in chain of orphaned buffers.\n" -" Buffer address with bad links: %p\n" -msgstr "" - -#: src/lib/smartall.c:427 -#, c-format -msgid "Damaged buffer found. Called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:460 -#, c-format -msgid "" -"\n" -"Damaged buffers found at %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:463 -msgid " discovery of bad prev link.\n" -msgstr "" - -#: src/lib/smartall.c:466 -msgid " discovery of bad next link.\n" -msgstr "" - -#: src/lib/smartall.c:469 -msgid " discovery of data overrun.\n" -msgstr "" - -#: src/lib/smartall.c:472 -msgid " NULL pointer.\n" -msgstr "" - -#: src/lib/smartall.c:478 -#, c-format -msgid " Buffer address: %p\n" -msgstr "" - -#: src/lib/smartall.c:485 -#, c-format -msgid "Damaged buffer: %6u bytes allocated at line %d of %s %s\n" -msgstr "" - -#: src/lib/status.h:86 -msgid "===================================================================\n" -msgstr "" - -#: src/lib/tls.c:81 -#, c-format -msgid "" -"Error with certificate at depth: %d, issuer = %s, subject = %s, ERR=%d:%s\n" -msgstr "" - -#: src/lib/tls.c:118 -msgid "Error initializing SSL context" -msgstr "" - -#: src/lib/tls.c:139 -msgid "Error loading certificate verification stores" -msgstr "" - -#: src/lib/tls.c:144 -msgid "" -"Either a certificate file or a directory must be specified as a verification " -"store\n" -msgstr "" - -#: src/lib/tls.c:155 -msgid "Error loading certificate file" -msgstr "" - -#: src/lib/tls.c:163 -msgid "Error loading private key" -msgstr "" - -#: src/lib/tls.c:171 -msgid "Unable to open DH parameters file" -msgstr "" - -#: src/lib/tls.c:177 -msgid "Unable to load DH parameters from specified file" -msgstr "" - -#: src/lib/tls.c:181 -msgid "Failed to set TLS Diffie-Hellman parameters" -msgstr "" - -#: src/lib/tls.c:191 -msgid "Error setting cipher list, no valid ciphers available\n" -msgstr "" - -#: src/lib/tls.c:250 -msgid "Peer failed to present a TLS certificate\n" -msgstr "" - -#: src/lib/tls.c:296 src/lib/tls.c:297 -#, c-format -msgid "Peer %s failed to present a TLS certificate\n" -msgstr "" - -#: src/lib/tls.c:429 -msgid "Error creating file descriptor-based BIO" -msgstr "" - -#: src/lib/tls.c:440 -msgid "Error creating new SSL object" -msgstr "" - -#: src/lib/tls.c:509 src/lib/tls.c:532 -msgid "Connect failure" -msgstr "" - -#: src/lib/tls.c:612 src/lib/tls.c:616 -msgid "TLS shutdown failure." -msgstr "" - -#: src/lib/tls.c:677 src/lib/tls.c:703 -msgid "TLS read/write failure." -msgstr "" - -#: src/lib/util.c:259 -msgid "Running" -msgstr "" - -#: src/lib/util.c:262 -msgid "Blocked" -msgstr "" - -#: src/lib/util.c:268 -msgid "Incomplete job" -msgstr "" - -#: src/lib/util.c:275 -msgid "Non-fatal error" -msgstr "" - -#: src/lib/util.c:281 src/lib/util.c:416 -msgid "Canceled" -msgstr "" - -#: src/lib/util.c:284 -msgid "Verify differences" -msgstr "" - -#: src/lib/util.c:287 -msgid "Waiting on FD" -msgstr "" - -#: src/lib/util.c:290 -msgid "Wait on SD" -msgstr "" - -#: src/lib/util.c:293 -msgid "Wait for new Volume" -msgstr "" - -#: src/lib/util.c:296 -msgid "Waiting for mount" -msgstr "" - -#: src/lib/util.c:299 -msgid "Waiting for Storage resource" -msgstr "" - -#: src/lib/util.c:302 -msgid "Waiting for Job resource" -msgstr "" - -#: src/lib/util.c:305 -msgid "Waiting for Client resource" -msgstr "" - -#: src/lib/util.c:308 -msgid "Waiting on Max Jobs" -msgstr "" - -#: src/lib/util.c:311 -msgid "Waiting for Start Time" -msgstr "" - -#: src/lib/util.c:314 -msgid "Waiting on Priority" -msgstr "" - -#: src/lib/util.c:333 -#, c-format -msgid "Unknown Job termination status=%d" -msgstr "" - -#: src/lib/util.c:349 -msgid "Completed successfully" -msgstr "" - -#: src/lib/util.c:352 -msgid "Completed with warnings" -msgstr "" - -#: src/lib/util.c:355 -msgid "Terminated with errors" -msgstr "" - -#: src/lib/util.c:358 -msgid "Fatal error" -msgstr "" - -#: src/lib/util.c:361 -msgid "Created, not yet running" -msgstr "" - -#: src/lib/util.c:364 -msgid "Canceled by user" -msgstr "" - -#: src/lib/util.c:367 -msgid "Verify found differences" -msgstr "" - -#: src/lib/util.c:370 -msgid "Waiting for File daemon" -msgstr "" - -#: src/lib/util.c:373 -msgid "Waiting for Storage daemon" -msgstr "" - -#: src/lib/util.c:376 -msgid "Waiting for higher priority jobs" -msgstr "" - -#: src/lib/util.c:379 -msgid "Batch inserting file records" -msgstr "" - -#: src/lib/util.c:413 -msgid "Fatal Error" -msgstr "" - -#: src/lib/util.c:419 -msgid "Differences" -msgstr "" - -#: src/lib/util.c:422 -msgid "Unknown term code" -msgstr "" - -#: src/lib/util.c:441 -msgid "Migrated Job" -msgstr "" - -#: src/lib/util.c:444 -msgid "Verify" -msgstr "" - -#: src/lib/util.c:447 -msgid "Restore" -msgstr "" - -#: src/lib/util.c:450 -msgid "Console" -msgstr "" - -#: src/lib/util.c:453 -msgid "System or Console" -msgstr "" - -#: src/lib/util.c:456 -msgid "Admin" -msgstr "" - -#: src/lib/util.c:459 src/lib/util.c:549 -msgid "Archive" -msgstr "" - -#: src/lib/util.c:462 -msgid "Job Copy" -msgstr "" - -#: src/lib/util.c:465 -msgid "Copy" -msgstr "" - -#: src/lib/util.c:468 -msgid "Migrate" -msgstr "" - -#: src/lib/util.c:471 -msgid "Scan" -msgstr "" - -#: src/lib/util.c:475 -msgid "Unknown Type" -msgstr "" - -#: src/lib/util.c:485 -msgid "Truncate" -msgstr "" - -#: src/lib/util.c:502 -msgid "Base" -msgstr "" - -#: src/lib/util.c:520 -msgid "Verify Init Catalog" -msgstr "" - -#: src/lib/util.c:529 -msgid "Verify Data" -msgstr "" - -#: src/lib/util.c:532 -msgid "Virtual Full" -msgstr "" - -#: src/lib/util.c:538 -msgid "Unknown Job Level" -msgstr "" - -#: src/lib/util.c:548 -msgid "Append" -msgstr "" - -#: src/lib/util.c:550 -msgid "Disabled" -msgstr "" - -#: src/lib/util.c:552 -msgid "Used" -msgstr "" - -#: src/lib/util.c:553 -msgid "Cleaning" -msgstr "" - -#: src/lib/util.c:554 -msgid "Purged" -msgstr "" - -#: src/lib/util.c:555 -msgid "Recycle" -msgstr "" - -#: src/lib/util.c:556 -msgid "Read-Only" -msgstr "" - -#: src/lib/util.c:568 -msgid "Invalid volume status" -msgstr "" - -#: src/lib/util.c:956 -msgid "Working directory not defined. Cannot continue.\n" -msgstr "" - -#: src/lib/util.c:959 -#, c-format -msgid "Working Directory: \"%s\" not found. Cannot continue.\n" -msgstr "" - -#: src/lib/util.c:963 -#, c-format -msgid "Working Directory: \"%s\" is not a directory. Cannot continue.\n" -msgstr "" - -#: src/lib/var.c:2659 -msgid "everything ok" -msgstr "" - -#: src/lib/var.c:2660 -msgid "incomplete named character" -msgstr "" - -#: src/lib/var.c:2661 -msgid "incomplete hexadecimal value" -msgstr "" - -#: src/lib/var.c:2662 -msgid "invalid hexadecimal value" -msgstr "" - -#: src/lib/var.c:2663 -msgid "octal value too large" -msgstr "" - -#: src/lib/var.c:2664 -msgid "invalid octal value" -msgstr "" - -#: src/lib/var.c:2665 -msgid "incomplete octal value" -msgstr "" - -#: src/lib/var.c:2666 -msgid "incomplete grouped hexadecimal value" -msgstr "" - -#: src/lib/var.c:2667 -msgid "incorrect character class specification" -msgstr "" - -#: src/lib/var.c:2668 -msgid "invalid expansion configuration" -msgstr "" - -#: src/lib/var.c:2669 -msgid "out of memory" -msgstr "" - -#: src/lib/var.c:2670 -msgid "incomplete variable specification" -msgstr "" - -#: src/lib/var.c:2671 -msgid "undefined variable" -msgstr "" - -#: src/lib/var.c:2672 -msgid "input is neither text nor variable" -msgstr "" - -#: src/lib/var.c:2673 -msgid "unknown command character in variable" -msgstr "" - -#: src/lib/var.c:2674 -msgid "malformatted search and replace operation" -msgstr "" - -#: src/lib/var.c:2675 -msgid "unknown flag in search and replace operation" -msgstr "" - -#: src/lib/var.c:2676 -msgid "invalid regex in search and replace operation" -msgstr "" - -#: src/lib/var.c:2677 -msgid "missing parameter in command" -msgstr "" - -#: src/lib/var.c:2678 -msgid "empty search string in search and replace operation" -msgstr "" - -#: src/lib/var.c:2679 -msgid "start offset missing in cut operation" -msgstr "" - -#: src/lib/var.c:2680 -msgid "offsets in cut operation delimited by unknown character" -msgstr "" - -#: src/lib/var.c:2681 -msgid "range out of bounds in cut operation" -msgstr "" - -#: src/lib/var.c:2682 -msgid "offset out of bounds in cut operation" -msgstr "" - -#: src/lib/var.c:2683 -msgid "logic error in cut operation" -msgstr "" - -#: src/lib/var.c:2684 -msgid "malformatted transpose operation" -msgstr "" - -#: src/lib/var.c:2685 -msgid "source and target class mismatch in transpose operation" -msgstr "" - -#: src/lib/var.c:2686 -msgid "empty character class in transpose operation" -msgstr "" - -#: src/lib/var.c:2687 -msgid "incorrect character class in transpose operation" -msgstr "" - -#: src/lib/var.c:2688 -msgid "malformatted padding operation" -msgstr "" - -#: src/lib/var.c:2689 -msgid "width parameter missing in padding operation" -msgstr "" - -#: src/lib/var.c:2690 -msgid "fill string missing in padding operation" -msgstr "" - -#: src/lib/var.c:2691 -msgid "unknown quoted pair in search and replace operation" -msgstr "" - -#: src/lib/var.c:2692 -msgid "sub-matching reference out of range" -msgstr "" - -#: src/lib/var.c:2693 -msgid "invalid argument" -msgstr "" - -#: src/lib/var.c:2694 -msgid "incomplete quoted pair" -msgstr "" - -#: src/lib/var.c:2695 -msgid "lookup function does not support variable arrays" -msgstr "" - -#: src/lib/var.c:2696 -msgid "index of array variable contains an invalid character" -msgstr "" - -#: src/lib/var.c:2697 -msgid "index of array variable is incomplete" -msgstr "" - -#: src/lib/var.c:2698 -msgid "bracket expression in array variable's index not closed" -msgstr "" - -#: src/lib/var.c:2699 -msgid "division by zero error in index specification" -msgstr "" - -#: src/lib/var.c:2700 -msgid "unterminated loop construct" -msgstr "" - -#: src/lib/var.c:2701 -msgid "invalid character in loop limits" -msgstr "" - -#: src/lib/var.c:2702 -msgid "malformed operation argument list" -msgstr "" - -#: src/lib/var.c:2703 -msgid "undefined operation" -msgstr "" - -#: src/lib/var.c:2704 -msgid "formatting failure" -msgstr "" - -#: src/lib/var.c:2713 -msgid "unknown error" -msgstr "" - -#: src/lib/watchdog.c:85 -#, c-format -msgid "Unable to initialize watchdog lock. ERR=%s\n" -msgstr "" - -#: src/lib/watchdog.c:182 -msgid "BUG! register_watchdog called before start_watchdog\n" -msgstr "" - -#: src/lib/watchdog.c:185 -#, c-format -msgid "BUG! Watchdog %p has NULL callback\n" -msgstr "" - -#: src/lib/watchdog.c:188 -#, c-format -msgid "BUG! Watchdog %p has zero interval\n" -msgstr "" - -#: src/lib/watchdog.c:208 -msgid "BUG! unregister_watchdog_unlocked called before start_watchdog\n" -msgstr "" - -#: src/lib/watchdog.c:328 -#, c-format -msgid "rwl_writelock failure. ERR=%s\n" -msgstr "" - -#: src/lib/watchdog.c:343 -#, c-format -msgid "rwl_writeunlock failure. ERR=%s\n" -msgstr "" - -#: src/lib/xml.c:407 -msgid "Malformed XML expecting start of tag.\n" -msgstr "" - -#: src/lib/xml.c:460 -msgid "Bad file start bytes (utf8 bom).\n" -msgstr "" - -#: src/lib/xml.c:472 -msgid "Bad file start bytes (utf16 bom).\n" -msgstr "" - -#: src/plugins/fd/delta-fd.c:1359 -#, c-format -msgid "Can't use replace=ifnewer with Delta plugin on %s\n" -msgstr "" - -#: src/plugins/fd/delta-fd.c:1366 -#, c-format -msgid "Can't use replace=ifolder with Delta plugin on %s\n" -msgstr "" - -#: src/plugins/fd/delta-fd.c:1376 -#, c-format -msgid "" -"Can't restore %s, file already exists. Delta plugin doesn't support " -"replace=never option\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:698 src/plugins/fd/mysql-fd.c:1178 -#: src/plugins/fd/postgresql-fd.c:731 -#, fuzzy, c-format -msgid "Can't run command %s. ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/plugins/fd/hvplugin.c:844 -#, fuzzy, c-format -msgid "Can't create working directory %s. ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/plugins/fd/hvplugin.c:864 -#, fuzzy, c-format -msgid "Can't delete working directory %s. ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/plugins/fd/hvplugin.c:1007 src/plugins/fd/mysql-fd.c:1496 -#, c-format -msgid "Unknown parameter or missing argument for %s.\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:1046 -#, c-format -msgid "Unknown parameter for %s. Expecting block or file\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:1051 src/plugins/fd/mysql-fd.c:1573 -#: src/plugins/fd/postgresql-fd.c:1035 -#, c-format -msgid "Unknown parameter %s.\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:1217 src/plugins/fd/hvplugin.c:1231 -#: src/plugins/fd/hvplugin.c:1261 src/plugins/fd/mysql-fd.c:2813 -#: src/plugins/fd/mysql-fd.c:2841 src/plugins/fd/mysql-fd.c:3171 -#: src/plugins/fd/postgresql-fd.c:2198 src/plugins/fd/postgresql-fd.c:2220 -#: src/plugins/fd/postgresql-fd.c:2478 -msgid "Can't analyse plugin command line\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:1221 -msgid "Unable to access guest volume\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:1238 -msgid "The hvplugin plugin doesn't support regexwhere parameter.\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:1271 -msgid "" -"The hvplugin plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=hvplugin command in the\n" -"Include {} block.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:824 -#, c-format -msgid "Found MASTER_LOG position %s:%lld for \"%s\"\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:868 -#, c-format -msgid "Unable to get MySQL version %s, might cause errors\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:961 -#, c-format -msgid "Can't reach MySQL server to get database list. ERR=%d\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1069 -#, c-format -msgid "Can't reach MySQL server to get database config. ERR=%d\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1267 src/plugins/fd/mysql-fd.c:1290 -#: src/plugins/fd/mysql-fd.c:1302 src/plugins/fd/mysql-fd.c:1356 -#: src/plugins/fd/mysql-fd.c:1669 src/plugins/fd/postgresql-fd.c:1167 -#, fuzzy, c-format -msgid "Unable to create temporary file %s. ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/plugins/fd/mysql-fd.c:1527 -#, c-format -msgid "Invalid argument for %s. Expecting tar or xbstream\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1531 -msgid "" -"bin_format=tar is incompatible with Incremental backup. Using xbstream " -"instead\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1547 -#, c-format -msgid "Can't use mode=%s in MySQL plugin\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1584 -msgid "Unable to detect where my.cnf is located. Use config_file=" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1679 src/plugins/fd/postgresql-fd.c:1177 -#, fuzzy, c-format -msgid "Unable to fdopen file %s. ERR=%s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:1774 -msgid "log_bin mysqld parameter is not suitable for Incremental backup.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1776 -msgid "Generating Full dump instead...\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2039 -#, c-format -msgid " Dumping database \"%s\"\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2181 -#, fuzzy -msgid "Unable to detect the MySQL data_directory on this system.\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:2188 -#, c-format -msgid "Configuration of log_bin=%s is not suitable for PITR backup.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2217 -#, fuzzy, c-format -msgid "Unable to determine the last binlog %s\n" -msgstr "Kan de geselecteerde client niet vinden." - -#: src/plugins/fd/mysql-fd.c:2269 -#, fuzzy -msgid "Can't get server configuration.\n" -msgstr "Wijziging van configuratiebestand" - -#: src/plugins/fd/mysql-fd.c:2290 -#, fuzzy -msgid "Unable to get the BINLOG list.\n" -msgstr "Kan de geselecteerde client niet vinden." - -#: src/plugins/fd/mysql-fd.c:2375 -#, c-format -msgid "" -"Unable to read %s. ERR=%s\n" -"Check permissions and/or use config_file parameter.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2418 -#, fuzzy, c-format -msgid "Unable to determine the last LSN for %s (Previous job is %s)\n" -msgstr "Kan de geselecteerde client niet vinden." - -#: src/plugins/fd/mysql-fd.c:2426 -#, c-format -msgid "Will use LSN=%s for the current backup\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2461 -#, fuzzy -msgid "Unable to detect datadir from MySQL\n" -msgstr "Kan de geselecteerde client niet vinden." - -#: src/plugins/fd/mysql-fd.c:2507 -#, fuzzy -msgid "Unable to get last LSN from the backup\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:2512 -#, fuzzy, c-format -msgid "The current LSN is %s\n" -msgstr "De huidige %s retention periode: %s\n" - -#: src/plugins/fd/mysql-fd.c:2866 -msgid "" -"The MySQL plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=mysql command in the\n" -"Include {} block.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3250 src/plugins/fd/postgresql-fd.c:2698 -msgid "replace=ifnewer/ifolder are not supported, switching to replace=never\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3294 src/plugins/fd/postgresql-fd.c:2739 -#: src/plugins/fd/postgresql-fd.c:2802 -#, c-format -msgid "" -"Database \"%s\" already exists, can't replace it when using replace=never\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3310 -#, c-format -msgid "Restoring target database \"%s\"\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3327 src/plugins/fd/postgresql-fd.c:2771 -msgid "Re-creating roles, may produce errors if roles already exist\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3335 -#, c-format -msgid "Creating target database \"%s\"\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3346 -#, fuzzy, c-format -msgid "Database \"%s\" already exists. Skipping creation.\n" -msgstr "" -"Geprobeerd om \"%s\" aan te maken, maar deze bestaat al. Probeer opnieuw.\n" - -#: src/plugins/fd/mysql-fd.c:3351 -msgid "" -"To restore all databases from a single dump file, use replace=always restore " -"option." -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3355 -msgid "" -"To restore all databases from a single dump file, use where=/ restore option." -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3358 -msgid "Restoring all databases from all-databases.sql file\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3379 -msgid "" -"bin-log should be restored separately as files using where=/a/directory and " -"applied using mysqlbinlog program and MASTER_LOG position found in the " -"restore log.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3381 -#, c-format -msgid "Skipping \"%s\".\n" -msgstr "" - -#: src/plugins/fd/ndmp-fd.c:1081 -msgid "" -"Unable to get where= argument for the restore.\n" -"Using regexwhere is unsupported with the ndmp plugin.\n" -msgstr "" - -#: src/plugins/fd/ndmp-fd.c:1105 -#, fuzzy, c-format -msgid "Unable to parse or to use plugin options, %s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/plugins/fd/ndmp-fd.c:1116 -msgid "" -"The ndmp plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=ndmp command in the\n" -"Include {} block.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:608 -#, c-format -msgid "Can't reach PostgreSQL server to get database list. ERR=%d\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:662 -#, c-format -msgid "Can't reach PostgreSQL server to get database config. ERR=%d\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:982 -#, c-format -msgid "Unknown parameter or bad argument for %s.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1002 -#, c-format -msgid "Can't use mode=%s in postgresql plugin\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1011 -#, c-format -msgid "Can't use service=%s in postgresql plugin ERR=%s\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1030 -#, c-format -msgid "Bad compress=%s parameter expect 0-9.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1272 -#, fuzzy -msgid "Can't get cluster configuration.\n" -msgstr "Wijziging van configuratiebestand" - -#: src/plugins/fd/postgresql-fd.c:1283 -msgid "Can't stop the current backup\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1289 src/plugins/fd/postgresql-fd.c:1297 -#, fuzzy -msgid "Can't determine the last WAL file\n" -msgstr "Kan de geselecteerde client niet vinden." - -#: src/plugins/fd/postgresql-fd.c:1312 src/plugins/fd/postgresql-fd.c:1919 -msgid "Can't determine WAL directory\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1319 -#, fuzzy, c-format -msgid "Can't open WAL directory %s. ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/plugins/fd/postgresql-fd.c:1861 -msgid "Your PostgreSQL version is too old for PITR mode\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1866 -#, fuzzy -msgid "Unable to detect the PostgreSQL data_directory on this system.\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:1873 -#, fuzzy, c-format -msgid "Unable to find data_directory=%s on this system. ERR=%s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:1882 -msgid "Configuration wal_level=minimal is not suitable for PITR backup.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1892 -msgid "Configuration archive_command is not suitable for PITR backup.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1994 -#, fuzzy -msgid "Unable to start the PITR backup on this system.\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:2000 -#, fuzzy -msgid "Unable to determine the first WAL file on this system.\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:2015 -#, fuzzy, c-format -msgid "Unable to analyse tablespaces %s on this system. ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/plugins/fd/postgresql-fd.c:2065 -#, fuzzy, c-format -msgid "Unable to analyse data_directory %s on this system. ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/plugins/fd/postgresql-fd.c:2245 -msgid "" -"The postgresql plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=postgresql command in the\n" -"Include {} block.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:2490 -msgid "" -"You need to set PrefixLinks=Yes in your Restore job definition, or you will " -"need to fix all symlinks yourself." -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:2544 -#, c-format -msgid "Creating %s to help you starting the recovery.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:2549 -#, fuzzy, c-format -msgid "Can't create the %s file for recovery. ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/plugins/fd/postgresql-fd.c:2758 -msgid "" -"The destination database already exists,it might generate some harmless " -"error messages." -msgstr "" - -#: src/plugins/sd/shstore-sd.c:179 -#, c-format -msgid "3612 JobId=%u waiting because device %s is reserved by: %s.\n" -msgstr "" - -#: src/plugins/sd/shstore-sd.c:435 -#, c-format -msgid "" -"3998 Bad return from storage \"%s\" command: ERR=%s.\n" -"Results=%s\n" -msgstr "" - -#: src/qt-console/bat_conf.cpp:144 -#, c-format -msgid "Console: name=%s\n" -msgstr "Console: naam=%s\n" - -#: src/qt-console/bat_conf.cpp:147 -#: src/qt-console/tray-monitor/tray_conf.cpp:185 -#, c-format -msgid "ConsoleFont: name=%s font face=%s\n" -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:86 -#, c-format -msgid "Already connected\"%s\".\n" -msgstr "Al verbonden\"%s\".\n" - -#: src/qt-console/bcomm/dircomm.cpp:97 -#: src/qt-console/tray-monitor/tray-monitor.cpp:351 -#, c-format -msgid "Connecting to Director %s:%d" -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:99 -#, c-format -msgid "" -"Connecting to Director %s:%d\n" -"\n" -msgstr "" -"Verbinden met Director %s:%d\n" -"\n" - -#: src/qt-console/bcomm/dircomm.cpp:196 -#: src/qt-console/tray-monitor/tray-monitor.cpp:356 -msgid "Director daemon" -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:234 -msgid "Initializing ..." -msgstr "Initialiseren ..." - -#: src/qt-console/bcomm/dircomm.cpp:250 src/qt-console/console/console.cpp:131 -msgid "Connected" -msgstr "Verbonden" - -#: src/qt-console/bcomm/dircomm.cpp:374 -msgid "Command completed ..." -msgstr "Opdracht gereed ..." - -#: src/qt-console/bcomm/dircomm.cpp:381 src/qt-console/console/console.cpp:368 -msgid "Processing command ..." -msgstr "Opdracht aan het uitvoeren ..." - -#: src/qt-console/bcomm/dircomm.cpp:388 -msgid "At main prompt waiting for input ..." -msgstr "Wacht op invoer op opdrachtregel in hoofdscherm ..." - -#: src/qt-console/bcomm/dircomm.cpp:395 src/qt-console/bcomm/dircomm.cpp:405 -msgid "At prompt waiting for input ..." -msgstr "Wacht op invoer op opdrachtregel ..." - -#: src/qt-console/bcomm/dircomm.cpp:413 -msgid "Command failed." -msgstr "Opdracht mislukt." - -#: src/qt-console/bcomm/dircomm.cpp:485 -msgid "Director disconnected." -msgstr "Director niet verbonden." - -#: src/qt-console/bcomm/dircomm_auth.cpp:108 -#, c-format -msgid "Director authorization problem at \"%s:%d\"\n" -msgstr "" - -#: src/qt-console/bcomm/dircomm_auth.cpp:115 -#, c-format -msgid "" -"Authorization problem: Remote server at \"%s:%d\" did not advertise required " -"TLS support.\n" -msgstr "" - -#: src/qt-console/bcomm/dircomm_auth.cpp:123 -#, c-format -msgid "" -"Authorization problem with Director at \"%s:%d\": Remote server requires " -"TLS.\n" -msgstr "" - -#: src/qt-console/bcomm/dircomm_auth.cpp:146 -#, c-format -msgid "" -"Bad response to Hello command: ERR=%s\n" -"The Director at \"%s:%d\" is probably not running.\n" -msgstr "" - -#: src/qt-console/bcomm/dircomm_auth.cpp:174 -#, c-format -msgid "" -"Authorization problem with Director at \"%s:%d\"\n" -"Most likely the passwords do not agree.\n" -"If you are using TLS, there may have been a certificate validation error " -"during the TLS handshake.\n" -"For help, please see " -msgstr "" - -#: src/qt-console/main.cpp:185 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s) %s %s %s\n" -"\n" -"Usage: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" -" -c set configuration file to file\n" -" -dnn set debug level to nn\n" -" -s no signals\n" -" -t test - read configuration and exit\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Versie: %s (%s) %s %s %s\n" -"\n" -"Specificatie: bat [-s] [-c configuratiebestand] [-d debug_level] " -"[configuratiebestand]\n" -" -c gebruik configuratiebestand\n" -" -d instellen debug level op \n" -" -s geen signaleringen\n" -" -t test - lees configuratie en stop\n" -" -? geef deze melding.\n" -"\n" - -#: src/qt-console/tray-monitor/authenticate.cpp:76 -msgid "" -"Director authorization problem.\n" -"Most likely the passwords do not agree.\n" -"For help, please see " -msgstr "" - -#: src/qt-console/tray-monitor/authenticate.cpp:126 -msgid "" -"Director and Storage daemon passwords or names not the same.\n" -"For help, please see " -msgstr "" - -#: src/qt-console/tray-monitor/authenticate.cpp:133 -#, c-format -msgid "bdird set configuration file to file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -t test - read configuration and exit\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Versie: %s (%s) %s %s %s\n" -"\n" -"Specificatie: tray-monitor [-c configuratiebestand] [-d debug_level]\n" -" -c gebruik configuratiebestand\n" -" -d instellen debug level op \n" -" -dt weergeven tijd in debug output\n" -" -t test - lees configuratie en stop\n" -" -? geef deze melding.\n" -"\n" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:208 -#, c-format -msgid "" -"Error: %d Monitor resources defined in %s. You must define one and only one " -"Monitor resource.\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:240 -#, c-format -msgid "" -"No Client, Storage or Director resource defined in %s\n" -"Without that I don't how to get status from the File, Storage or Director " -"Daemon :-(\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:255 -#, c-format -msgid "" -"Invalid refresh interval defined in %s\n" -"This value must be greater or equal to 1 second and less or equal to 10 " -"minutes (read value: %d).\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:323 -#, c-format -msgid "Error, currentitem is not a Client or a Storage..\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:361 -#, c-format -msgid "Connecting to Client %s:%d" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:366 -msgid "File daemon" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:371 -#, c-format -msgid "Connecting to Storage %s:%d" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:380 -#: src/qt-console/tray-monitor/tray-monitor.cpp:410 -#, c-format -msgid "Error, currentitem is not a Client, a Storage or a Director..\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:385 -msgid "Cannot connect to daemon." -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:394 -#, c-format -msgid "Authentication error : %s" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:401 -msgid "Opened connection with Director daemon." -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:404 -msgid "Opened connection with File daemon." -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:407 -msgid "Opened connection with Storage daemon." -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:458 -msgid "Error : BNET_HARDEOF or BNET_ERROR" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:467 -msgid "Error : Connection closed." -msgstr "" - -#: src/qt-console/tray-monitor/tray_conf.cpp:167 -#, c-format -msgid "Monitor: name=%s FDtimeout=%s SDtimeout=%s\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray_conf.cpp:173 -#, c-format -msgid "Director: name=%s address=%s FDport=%d\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray_conf.cpp:177 -#, c-format -msgid "Client: name=%s address=%s FDport=%d\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray_conf.cpp:181 -#, c-format -msgid "Storage: name=%s address=%s SDport=%d\n" -msgstr "" - -#: src/stored/acquire.c:62 -#, c-format -msgid "Acquire read: num_writers=%d not zero. Job %d canceled.\n" -msgstr "" - -#: src/stored/acquire.c:71 -#, c-format -msgid "No volumes specified for reading. Job %s canceled.\n" -msgstr "" - -#: src/stored/acquire.c:80 -#, c-format -msgid "Logic error: no next volume to read. Numvol=%d Curvol=%d\n" -msgstr "" - -#: src/stored/acquire.c:87 src/stored/acquire.c:164 src/stored/acquire.c:439 -#: src/stored/stored.c:614 -msgid "generate_plugin_event(bsdEventDeviceOpen) Failed\n" -msgstr "" - -#: src/stored/acquire.c:111 -#, c-format -msgid "" -"Changing read device. Want Media Type=\"%s\" have=\"%s\"\n" -" %s device=%s\n" -msgstr "" - -#: src/stored/acquire.c:159 -#, c-format -msgid "Media Type change. New read %s device %s chosen.\n" -msgstr "" - -#: src/stored/acquire.c:176 -#, c-format -msgid "No suitable device found to read Volume \"%s\"\n" -msgstr "" - -#: src/stored/acquire.c:215 -#, c-format -msgid "Job %s canceled.\n" -msgstr "" - -#: src/stored/acquire.c:233 -#, c-format -msgid "Read open %s device %s Volume \"%s\" failed: ERR=%s\n" -msgstr "" - -#: src/stored/acquire.c:326 -#, c-format -msgid "Too many errors trying to mount %s device %s for reading.\n" -msgstr "" - -#: src/stored/acquire.c:334 -#, c-format -msgid "Ready to read from volume \"%s\" on %s device %s.\n" -msgstr "" - -#: src/stored/acquire.c:424 -#, c-format -msgid "Could not ready %s device %s for append.\n" -msgstr "" - -#: src/stored/acquire.c:520 src/stored/block_util.c:669 -#: src/stored/block_util.c:742 src/stored/block_util.c:772 -#: src/stored/spool.c:277 -#, c-format -msgid "Could not create JobMedia record for Volume=\"%s\" Job=%s\n" -msgstr "" - -#: src/stored/acquire.c:575 -#, c-format -msgid "Alert: %s" -msgstr "" - -#: src/stored/acquire.c:583 -#, c-format -msgid "3997 Bad alert command: %s: ERR=%s.\n" -msgstr "" - -#: src/stored/aligned_dev.c:44 src/stored/dev.c:122 src/stored/stored.c:583 -#, c-format -msgid "Could not initialize %s\n" -msgstr "" - -#: src/stored/aligned_dev.c:132 src/stored/dev.c:667 -#, fuzzy, c-format -msgid "Error closing device %s. ERR=%s.\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/stored/aligned_dev.c:432 src/stored/dvd.c:102 -msgid "No FreeSpace command defined.\n" -msgstr "" - -#: src/stored/aligned_dev.c:465 src/stored/dvd.c:136 -#, c-format -msgid "Cannot run free space command. Results=%s ERR=%s\n" -msgstr "" - -#: src/stored/aligned_read.c:199 -#, c-format -msgid "Record not properly reconstructed. Remainder wanted=%d got=%d\n" -msgstr "" - -#: src/stored/aligned_read.c:249 src/stored/record_read.c:177 -#, c-format -msgid "Sanity check failed. maxlen=%d datalen=%d. Block discarded.\n" -msgstr "" - -#: src/stored/ansi_label.c:82 -#, c-format -msgid "Read error on device %s in ANSI label. ERR=%s\n" -msgstr "" - -#: src/stored/ansi_label.c:92 -msgid "Insane! End of tape while reading ANSI label.\n" -msgstr "" - -#: src/stored/ansi_label.c:118 -msgid "No VOL1 label while reading ANSI/IBM label.\n" -msgstr "" - -#: src/stored/ansi_label.c:141 -#, c-format -msgid "Wanted ANSI Volume \"%s\" got \"%s\"\n" -msgstr "" - -#: src/stored/ansi_label.c:152 -msgid "No HDR1 label while reading ANSI label.\n" -msgstr "" - -#: src/stored/ansi_label.c:158 -#, c-format -msgid "ANSI/IBM Volume \"%s\" does not belong to Bacula.\n" -msgstr "" - -#: src/stored/ansi_label.c:170 -msgid "No HDR2 label while reading ANSI/IBM label.\n" -msgstr "" - -#: src/stored/ansi_label.c:185 -msgid "Unknown or bad ANSI/IBM label record.\n" -msgstr "" - -#: src/stored/ansi_label.c:193 -msgid "Too many records in while reading ANSI/IBM label.\n" -msgstr "" - -#: src/stored/ansi_label.c:293 -#, c-format -msgid "ANSI Volume label name \"%s\" longer than 6 chars.\n" -msgstr "" - -#: src/stored/ansi_label.c:319 -#, c-format -msgid "Could not write ANSI VOL1 label. Wanted size=%d got=%d ERR=%s\n" -msgstr "" - -#: src/stored/ansi_label.c:357 src/stored/ansi_label.c:386 -#, c-format -msgid "Could not write ANSI HDR1 label. ERR=%s\n" -msgstr "" - -#: src/stored/ansi_label.c:362 src/stored/ansi_label.c:393 -msgid "Could not write ANSI HDR1 label.\n" -msgstr "" - -#: src/stored/ansi_label.c:398 -#, c-format -msgid "Error writing EOF to tape. ERR=%s" -msgstr "" - -#: src/stored/ansi_label.c:403 -msgid "write_ansi_ibm_label called for non-ANSI/IBM type\n" -msgstr "" - -#: src/stored/append.c:77 -msgid "DCR is NULL!!!\n" -msgstr "" - -#: src/stored/append.c:83 -msgid "DEVICE is NULL!!!\n" -msgstr "" - -#: src/stored/append.c:94 -msgid "Unable to set network buffer size.\n" -msgstr "" - -#: src/stored/append.c:108 src/stored/append.c:118 src/stored/append.c:132 -#: src/stored/askdir.c:378 src/stored/askdir.c:379 -msgid "NULL Volume name. This shouldn't happen!!!\n" -msgstr "" - -#: src/stored/append.c:124 src/stored/btape.c:2231 -#, c-format -msgid "Write session label failed. ERR=%s\n" -msgstr "" - -#: src/stored/append.c:138 -#, c-format -msgid "Network send error to FD. ERR=%s\n" -msgstr "" - -#: src/stored/append.c:195 -#, c-format -msgid "Error reading data header from FD. n=%d msglen=%d ERR=%s\n" -msgstr "" - -#: src/stored/append.c:206 -#, c-format -msgid "Malformed data header from FD: %s\n" -msgstr "" - -#: src/stored/append.c:228 -#, c-format -msgid "FI=%d from FD not positive or last_FI=%d\n" -msgstr "" - -#: src/stored/append.c:353 -#, c-format -msgid "Network error reading from FD. ERR=%s\n" -msgstr "" - -#: src/stored/append.c:373 -#, fuzzy, c-format -msgid "DDE commit failed. ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/stored/append.c:404 src/stored/append.c:431 src/stored/spool.c:266 -#: src/stored/vbackup.c:120 src/stored/vbackup.c:130 src/stored/vbackup.c:300 -#, c-format -msgid "Fatal append error on device %s: ERR=%s\n" -msgstr "" - -#: src/stored/append.c:406 src/stored/vbackup.c:122 -msgid "Set ok=FALSE after write_block_to_device.\n" -msgstr "" - -#: src/stored/append.c:418 src/stored/btape.c:2350 -#, c-format -msgid "Error writing end session label. ERR=%s\n" -msgstr "" - -#: src/stored/append.c:433 src/stored/vbackup.c:132 -msgid "Set ok=FALSE after write_final_block_to_device.\n" -msgstr "" - -#: src/stored/append.c:458 src/stored/read.c:110 src/stored/vbackup.c:155 -#, c-format -msgid "Elapsed time=%02d:%02d:%02d, Transfer rate=%s Bytes/second\n" -msgstr "" - -#: src/stored/append.c:495 -#, c-format -msgid "Error updating file attributes. ERR=%s\n" -msgstr "" - -#: src/stored/askdir.c:174 -msgid "Network error on bnet_recv in req_vol_info.\n" -msgstr "" - -#: src/stored/askdir.c:198 -#, c-format -msgid "Error getting Volume info: %s" -msgstr "" - -#: src/stored/askdir.c:433 -#, c-format -msgid "Didn't get vol info vol=%s: ERR=%s" -msgstr "" - -#: src/stored/askdir.c:531 -#, c-format -msgid "Error creating JobMedia record: ERR=%s\n" -msgstr "" - -#: src/stored/askdir.c:538 -#, c-format -msgid "Error creating JobMedia record: %s\n" -msgstr "" - -#: src/stored/askdir.c:630 -#, c-format -msgid "Job %s canceled while waiting for mount on Storage Device \"%s\".\n" -msgstr "" - -#: src/stored/askdir.c:643 -#, c-format -msgid "" -"Job %s is waiting. Cannot find any appendable volumes.\n" -"Please use the \"label\" command to create a new Volume for:\n" -" Storage: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" - -#: src/stored/askdir.c:668 src/stored/askdir.c:780 -#, c-format -msgid "Max time exceeded waiting to mount Storage Device %s for Job %s\n" -msgstr "" - -#: src/stored/askdir.c:679 -msgid "pthread error in mount_next_volume.\n" -msgstr "" - -#: src/stored/askdir.c:714 -msgid "Cannot request another volume: no volume name given.\n" -msgstr "" - -#: src/stored/askdir.c:720 -msgid "The current operation doesn't support mount request\n" -msgstr "" - -#: src/stored/askdir.c:727 -#, c-format -msgid "Job %s canceled while waiting for mount on Storage Device %s.\n" -msgstr "" - -#: src/stored/askdir.c:745 -#, c-format -msgid "" -"%sPlease mount append Volume \"%s\" or label a new one for:\n" -" Job: %s\n" -" Storage: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" - -#: src/stored/askdir.c:751 -#, c-format -msgid "" -"%sPlease mount read Volume \"%s\" for:\n" -" Job: %s\n" -" Storage: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" - -#: src/stored/askdir.c:758 -msgid "" -"\n" -"\n" -"WARNING: device is full! Please add more disk space then ...\n" -"\n" -msgstr "" - -#: src/stored/askdir.c:791 -msgid "pthread error in mount_volume\n" -msgstr "" - -#: src/stored/authenticate.c:77 -msgid "" -"Incorrect password given by Director.\n" -"For help, please see: " -msgstr "" - -#: src/stored/authenticate.c:103 -#, c-format -msgid "TLS negotiation failed with DIR at \"%s:%d\"\n" -msgstr "" - -#: src/stored/authenticate.c:121 -#, c-format -msgid "Unable to authenticate Director at %s.\n" -msgstr "" - -#: src/stored/authenticate.c:169 src/stored/authenticate.c:209 -#, c-format -msgid "" -"Incorrect authorization key from File daemon at %s rejected.\n" -"For help, please see: " -msgstr "" - -#: src/stored/authenticate.c:196 -#, c-format -msgid "TLS negotiation failed with FD at \"%s:%d\"\n" -msgstr "" - -#: src/stored/authenticate.c:277 -msgid "" -"Authorization key rejected by Storage daemon.\n" -"Please see " -msgstr "" - -#: src/stored/autochanger.c:67 -#, c-format -msgid "No Changer Name given for device %s. Cannot continue.\n" -msgstr "" - -#: src/stored/autochanger.c:73 -#, c-format -msgid "No Changer Command given for device %s. Cannot continue.\n" -msgstr "" - -#: src/stored/autochanger.c:142 -#, c-format -msgid "No slot defined in catalog (slot=%d) for Volume \"%s\" on %s.\n" -msgstr "" - -#: src/stored/autochanger.c:144 -msgid "Cartridge change or \"update slots\" may be required.\n" -msgstr "" - -#: src/stored/autochanger.c:150 -#, c-format -msgid "No \"Changer Device\" for %s. Manual load of Volume may be required.\n" -msgstr "" - -#: src/stored/autochanger.c:157 -#, c-format -msgid "No \"Changer Command\" for %s. Manual load of Volume may be requird.\n" -msgstr "" - -#: src/stored/autochanger.c:191 -#, c-format -msgid "3304 Issuing autochanger \"load slot %d, drive %d\" command.\n" -msgstr "" - -#: src/stored/autochanger.c:199 -#, c-format -msgid "3305 Autochanger \"load slot %d, drive %d\", status is OK.\n" -msgstr "" - -#: src/stored/autochanger.c:212 -#, c-format -msgid "" -"3992 Bad autochanger \"load slot %d, drive %d\": ERR=%s.\n" -"Results=%s\n" -msgstr "" - -#: src/stored/autochanger.c:275 -#, c-format -msgid "3301 Issuing autochanger \"loaded? drive %d\" command.\n" -msgstr "" - -#: src/stored/autochanger.c:287 -#, c-format -msgid "3302 Autochanger \"loaded? drive %d\", result is Slot %d.\n" -msgstr "" - -#: src/stored/autochanger.c:294 -#, c-format -msgid "3302 Autochanger \"loaded? drive %d\", result: nothing loaded.\n" -msgstr "" - -#: src/stored/autochanger.c:306 -#, c-format -msgid "" -"3991 Bad autochanger \"loaded? drive %d\" command: ERR=%s.\n" -"Results=%s\n" -msgstr "" - -#: src/stored/autochanger.c:326 -#, c-format -msgid "Lock failure on autochanger. ERR=%s\n" -msgstr "" - -#: src/stored/autochanger.c:340 -#, c-format -msgid "Unlock failure on autochanger. ERR=%s\n" -msgstr "" - -#: src/stored/autochanger.c:387 src/stored/autochanger.c:553 -#, c-format -msgid "3307 Issuing autochanger \"unload slot %d, drive %d\" command.\n" -msgstr "" - -#: src/stored/autochanger.c:400 -#, c-format -msgid "" -"3995 Bad autochanger \"unload slot %d, drive %d\": ERR=%s\n" -"Results=%s\n" -msgstr "" - -#: src/stored/autochanger.c:503 -#, c-format -msgid "Volume \"%s\" wanted on %s is in use by device %s\n" -msgstr "" - -#: src/stored/autochanger.c:570 -#, c-format -msgid "3997 Bad autochanger \"unload slot %d, drive %d\": ERR=%s.\n" -msgstr "" - -#: src/stored/autochanger.c:613 -#, c-format -msgid "3993 Device %s not an autochanger device.\n" -msgstr "" - -#: src/stored/autochanger.c:640 -#, c-format -msgid "3306 Issuing autochanger \"%s\" command.\n" -msgstr "" - -#: src/stored/autochanger.c:643 -msgid "3996 Open bpipe failed.\n" -msgstr "" - -#: src/stored/autochanger.c:670 -#, c-format -msgid "Autochanger error: ERR=%s\n" -msgstr "" - -#: src/stored/bcopy.c:62 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bcopy [-d debug_level] \n" -" -b bootstrap specify a bootstrap file\n" -" -c specify a Storage configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -i specify input Volume names (separated by |)\n" -" -o specify output Volume names (separated by |)\n" -" -p proceed inspite of errors\n" -" -v verbose\n" -" -w specify working directory (default /tmp)\n" -" -? print this message\n" -"\n" -msgstr "" -"\n" -"Versie: %s (%s) %s %s %s\n" -"\n" -"Specificatie: tray-monitor [-c configuratiebestand] [-d debug_level]\n" -" -c gebruik configuratiebestand\n" -" -d instellen debug level op \n" -" -dt weergeven tijd in debug output\n" -" -t test - lees configuratie en stop\n" -" -? geef deze melding.\n" -"\n" - -#: src/stored/bcopy.c:149 src/stored/bextract.c:206 src/stored/bscan.c:236 -#: src/tools/bbatch.c:176 src/tools/bvfs_test.c:189 src/tools/cats_test.c:308 -msgid "Wrong number of arguments: \n" -msgstr "" - -#: src/stored/bcopy.c:193 src/stored/btape.c:468 src/stored/device.c:338 -#, c-format -msgid "dev open failed: %s\n" -msgstr "" - -#: src/stored/bcopy.c:208 -msgid "Write of last block failed.\n" -msgstr "" - -#: src/stored/bcopy.c:212 -#, c-format -msgid "%u Jobs copied. %u records copied.\n" -msgstr "" - -#: src/stored/bcopy.c:229 src/stored/bscan.c:419 -#, c-format -msgid "Record: SessId=%u SessTim=%u FileIndex=%d Stream=%d len=%u\n" -msgstr "" - -#: src/stored/bcopy.c:245 -msgid "Volume is prelabeled. This volume cannot be copied.\n" -msgstr "" - -#: src/stored/bcopy.c:248 -msgid "Volume label not copied.\n" -msgstr "" - -#: src/stored/bcopy.c:254 -msgid "Copy skipped. Record does not match BSR filter.\n" -msgstr "" - -#: src/stored/bcopy.c:271 src/stored/bcopy.c:279 src/stored/bcopy.c:307 -#: src/stored/btape.c:2755 -#, c-format -msgid "Cannot fixup device error. %s\n" -msgstr "" - -#: src/stored/bcopy.c:285 -msgid "EOM label not copied.\n" -msgstr "" - -#: src/stored/bcopy.c:288 -msgid "EOT label not copied.\n" -msgstr "" - -#: src/stored/bcopy.c:321 src/stored/bls.c:439 src/stored/read_records.c:392 -msgid "Fresh Volume Label" -msgstr "" - -#: src/stored/bcopy.c:324 src/stored/bls.c:442 src/stored/read_records.c:395 -msgid "Volume Label" -msgstr "" - -#: src/stored/bcopy.c:328 src/stored/bls.c:446 src/stored/label.c:1332 -msgid "Begin Job Session" -msgstr "" - -#: src/stored/bcopy.c:332 src/stored/bls.c:451 src/stored/label.c:1335 -msgid "End Job Session" -msgstr "" - -#: src/stored/bcopy.c:337 src/stored/bls.c:455 -msgid "End of Medium" -msgstr "" - -#: src/stored/bcopy.c:340 src/stored/bls.c:467 src/stored/label.c:1344 -msgid "Unknown" -msgstr "" - -#: src/stored/bcopy.c:346 src/stored/bls.c:474 src/stored/read_records.c:413 -#, c-format -msgid "%s Record: VolSessionId=%d VolSessionTime=%d JobId=%d DataLen=%d\n" -msgstr "" - -#: src/stored/bcopy.c:364 src/stored/bextract.c:721 src/stored/bls.c:493 -#: src/stored/bscan.c:1359 src/stored/btape.c:3049 -#, c-format -msgid "Mount Volume \"%s\" on device %s and press return when ready: " -msgstr "" - -#: src/stored/bextract.c:80 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bextract \n" -" -b specify a bootstrap file\n" -" -c specify a Storage configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -T send debug traces to trace file\n" -" -e exclude list\n" -" -i include list\n" -" -p proceed inspite of I/O errors\n" -" -t read data from volume, do not write anything\n" -" -v verbose\n" -" -V specify Volume names (separated by |)\n" -" -? print this message\n" -"\n" -msgstr "" -"\n" -"Versie: %s (%s) %s %s %s\n" -"\n" -"Specificatie: tray-monitor [-c configuratiebestand] [-d debug_level]\n" -" -c gebruik configuratiebestand\n" -" -d instellen debug level op \n" -" -dt weergeven tijd in debug output\n" -" -t test - lees configuratie en stop\n" -" -? geef deze melding.\n" -"\n" - -#: src/stored/bextract.c:156 src/stored/bls.c:143 -#, c-format -msgid "Could not open exclude file: %s, ERR=%s\n" -msgstr "" - -#: src/stored/bextract.c:171 src/stored/bls.c:158 -#, c-format -msgid "Could not open include file: %s, ERR=%s\n" -msgstr "" - -#: src/stored/bextract.c:231 -#, c-format -msgid "%d Program Name and/or Program Data Stream records ignored.\n" -msgstr "" - -#: src/stored/bextract.c:235 -#, c-format -msgid "%d Win32 data or Win32 gzip data stream records. Ignored.\n" -msgstr "" - -#: src/stored/bextract.c:263 -#, c-format -msgid "Cannot stat %s. It must exist. ERR=%s\n" -msgstr "" - -#: src/stored/bextract.c:267 -#, c-format -msgid "%s must be a directory.\n" -msgstr "" - -#: src/stored/bextract.c:296 -#, c-format -msgid "%u files restored.\n" -msgstr "" - -#: src/stored/bextract.c:298 -#, c-format -msgid "Found %s error%s\n" -msgstr "" - -#: src/stored/bextract.c:309 src/stored/bextract.c:315 -#, c-format -msgid "Write error on %s: %s\n" -msgstr "" - -#: src/stored/bextract.c:346 src/stored/read.c:163 src/stored/read.c:290 -#: src/stored/vbackup.c:265 -msgid "Cannot do rehydration, device is not dedup aware\n" -msgstr "" - -#: src/stored/bextract.c:354 -#, c-format -msgid "" -"Got rehydration error at file=%d record=%s fname=%s volsessionid=%d " -"volsessiontime=%d Msg=%s" -msgstr "" - -#: src/stored/bextract.c:388 src/stored/bextract.c:426 src/stored/bls.c:400 -#: src/stored/bscan.c:679 -msgid "Cannot continue.\n" -msgstr "" - -#: src/stored/bextract.c:419 src/stored/bextract.c:691 -msgid "Logic error output file should be open but is not.\n" -msgstr "" - -#: src/stored/bextract.c:446 -#, c-format -msgid "%s was deleted.\n" -msgstr "" - -#: src/stored/bextract.c:495 -#, c-format -msgid "Seek error on %s: %s\n" -msgstr "" - -#: src/stored/bextract.c:550 -#, c-format -msgid "Uncompression error. ERR=%d\n" -msgstr "" - -#: src/stored/bextract.c:619 -#, c-format -msgid "Compressed header version error. version=0x%x\n" -msgstr "" - -#: src/stored/bextract.c:648 -#, c-format -msgid "LZO uncompression error. ERR=%d\n" -msgstr "" - -#: src/stored/bextract.c:682 -msgid "Got Program Name or Data Stream. Ignored.\n" -msgstr "" - -#: src/stored/block.c:100 -msgid "Error writing final JobMedia record to catalog.\n" -msgstr "" - -#: src/stored/block.c:148 -#, c-format -msgid "Cannot write block. Device at EOM. dev=%s\n" -msgstr "" - -#: src/stored/block.c:153 -#, c-format -msgid "Attempt to write on read-only Volume. dev=%s\n" -msgstr "" - -#: src/stored/block.c:159 -#, c-format -msgid "Attempt to write on closed device=%s\n" -msgstr "" - -#: src/stored/block.c:198 -#, c-format -msgid "Unable to write EOF. ERR=%s\n" -msgstr "" - -#: src/stored/block.c:234 src/stored/block.c:292 -msgid "Write block header zeroed.\n" -msgstr "" - -#: src/stored/block.c:284 -#, c-format -msgid "Block checksum changed during write: before=%ud after=%ud\n" -msgstr "" - -#: src/stored/block.c:311 -#, c-format -msgid "Write error at %u:%u on device %s. ERR=%s.\n" -msgstr "" - -#: src/stored/block.c:321 -#, c-format -msgid "" -"Out of freespace caused End of Volume \"%s\" at %u:%u on device %s. Write of " -"%u bytes got %d.\n" -msgstr "" - -#: src/stored/block.c:326 -#, c-format -msgid "End of Volume \"%s\" at %u:%u on device %s. Write of %u bytes got %d.\n" -msgstr "" - -#: src/stored/block.c:456 -#, fuzzy -msgid "Job failed or canceled.\n" -msgstr "Terugzetten geannuleerd.\n" - -#: src/stored/block.c:462 -msgid "Attempt to read past end of tape or file.\n" -msgstr "" - -#: src/stored/block.c:470 -#, c-format -msgid "Attempt to read closed device: fd=%d at file:blk %u:%u on device %s\n" -msgstr "" - -#: src/stored/block.c:483 -#, c-format -msgid "Block buffer size looping problem on device %s\n" -msgstr "" - -#: src/stored/block.c:498 -#, c-format -msgid "Unable to open device part=%d %s: ERR=%s\n" -msgstr "" - -#: src/stored/block.c:534 -#, fuzzy, c-format -msgid "The Volume=%s on device=%s appears to be unlabeled.\n" -msgstr "Nieuw volume \"%s\" aangemaakt in catalogus.\n" - -#: src/stored/block.c:537 -#, c-format -msgid "Read error on fd=%d at file:blk %u:%u on device %s. ERR=%s.\n" -msgstr "" - -#: src/stored/block.c:548 -#, c-format -msgid "The %sVolume=%s on device=%s appears to be unlabeled.\n" -msgstr "" - -#: src/stored/block.c:551 -#, c-format -msgid "Read zero %sbytes Vol=%s at %lld on device %s.\n" -msgstr "" - -#: src/stored/block.c:585 -#, c-format -msgid "" -"Volume data error at %u:%u! Very short block of %d bytes on device %s " -"discarded.\n" -msgstr "" - -#: src/stored/block.c:613 -#, c-format -msgid "Block length %u is greater than buffer %u. Attempting recovery.\n" -msgstr "" - -#: src/stored/block.c:633 -#, c-format -msgid "Setting block buffer size to %u bytes.\n" -msgstr "" - -#: src/stored/block.c:648 -#, c-format -msgid "" -"Volume data error at %u:%u! Short block of %d bytes on device %s discarded.\n" -msgstr "" - -#: src/stored/block_util.c:93 -#, c-format -msgid "" -"Dump block %s %p: adata=%d size=%d BlkNum=%d\n" -" Hdrcksum=%x cksum=%x\n" -msgstr "" - -#: src/stored/block_util.c:118 -#, c-format -msgid " Rec: VId=%u VT=%u FI=%s Strm=%s len=%d reclen=%d\n" -msgstr "" - -#: src/stored/block_util.c:203 -#, c-format -msgid "%d block read errors not printed.\n" -msgstr "" - -#: src/stored/block_util.c:341 -#, c-format -msgid "" -"Volume data error at %lld!\n" -"Adata block checksum mismatch in block=%u len=%d: calc=%x blk=%x\n" -msgstr "" - -#: src/stored/block_util.c:376 src/stored/block_util.c:394 -#: src/stored/block_util.c:404 -#, c-format -msgid "" -"Volume data error at %u:%u! Wanted ID: \"%s\", got \"%s\". Buffer " -"discarded.\n" -msgstr "" - -#: src/stored/block_util.c:419 -#, c-format -msgid "" -"Volume data error at %u:%u! Block length %u is insane (too large), probably " -"due to a bad archive.\n" -msgstr "" - -#: src/stored/block_util.c:446 -#, c-format -msgid "" -"Volume data error at %u:%u!\n" -"Block checksum mismatch in block=%u len=%d: calc=%x blk=%x\n" -msgstr "" - -#: src/stored/block_util.c:542 -#, c-format -msgid "" -"User defined maximum volume size %s will be exceeded on device %s.\n" -" Marking Volume \"%s\" as Full.\n" -msgstr "" - -#: src/stored/block_util.c:579 src/stored/block_util.c:585 -#, c-format -msgid "Backspace file at EOT failed. ERR=%s\n" -msgstr "" - -#: src/stored/block_util.c:592 -#, c-format -msgid "Backspace record at EOT failed. ERR=%s\n" -msgstr "" - -#: src/stored/block_util.c:609 -#, c-format -msgid "Re-read last block at EOT failed. ERR=%s" -msgstr "" - -#: src/stored/block_util.c:619 -#, c-format -msgid "" -"Re-read of last block: block numbers differ by more than one.\n" -"Probable tape misconfiguration and data loss. Read block=%u Want block=%u.\n" -msgstr "" - -#: src/stored/block_util.c:624 -#, c-format -msgid "" -"Re-read of last block OK, but block numbers differ. Read block=%u Want block=" -"%u.\n" -msgstr "" - -#: src/stored/block_util.c:628 -msgid "Re-read of last block succeeded.\n" -msgstr "" - -#: src/stored/block_util.c:677 -#, c-format -msgid "" -"Error writing final EOF to tape. This Volume may not be readable.\n" -"%s" -msgstr "" - -#: src/stored/block_util.c:695 -#, fuzzy -msgid "Error sending Volume info to Director.\n" -msgstr "Geen Volumes gevonden om terug te zetten.\n" - -#: src/stored/block_util.c:815 -#, c-format -msgid "" -"Error while writing, current part number is less than the total number of " -"parts (%d/%d, device=%s)\n" -msgstr "" - -#: src/stored/block_util.c:823 -#, c-format -msgid "Unable to open device next part %s: ERR=%s\n" -msgstr "" - -#: src/stored/block_util.c:843 -#, c-format -msgid "" -"End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, " -"free_space_errno=%d, errmsg=%s).\n" -msgstr "" - -#: src/stored/block_util.c:856 -#, c-format -msgid "" -"End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, " -"free_space_errno=%d).\n" -msgstr "" - -#: src/stored/bls.c:68 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bls [options] \n" -" -b specify a bootstrap file\n" -" -c specify a Storage configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -e exclude list\n" -" -i include list\n" -" -j list jobs\n" -" -k list blocks\n" -" (no j or k option) list saved files\n" -" -L dump label\n" -" -p proceed inspite of errors\n" -" -v be verbose\n" -" -V specify Volume names (separated by |)\n" -" -E Check records to detect errors\n" -" -? print this message\n" -"\n" -msgstr "" -"\n" -"Versie: %s (%s) %s %s %s\n" -"\n" -"Specificatie: tray-monitor [-c configuratiebestand] [-d debug_level]\n" -" -c gebruik configuratiebestand\n" -" -d instellen debug level op \n" -" -dt weergeven tijd in debug output\n" -" -t test - lees configuratie en stop\n" -" -? geef deze melding.\n" -"\n" - -#: src/stored/bls.c:205 -msgid "No archive name specified\n" -msgstr "" - -#: src/stored/bls.c:244 -#, c-format -msgid "" -"\n" -"Warning, this Volume is a continuation of Volume %s\n" -msgstr "" - -#: src/stored/bls.c:291 -#, c-format -msgid "Got EOM at file %u on device %s, Volume \"%s\"\n" -msgstr "" - -#: src/stored/bls.c:302 -#, c-format -msgid "Mounted Volume \"%s\".\n" -msgstr "" - -#: src/stored/bls.c:304 -#, c-format -msgid "End of file %u on device %s, Volume \"%s\"\n" -msgstr "" - -#: src/stored/bls.c:329 -#, c-format -msgid "" -"File:blk=%u:%u blk_num=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=" -"%s rlen=%d\n" -msgstr "" - -#: src/stored/bls.c:338 -#, c-format -msgid "Block: %d size=%d\n" -msgstr "" - -#: src/stored/bls.c:402 -msgid "Attrib unpack error!\n" -msgstr "" - -#: src/stored/bls.c:413 -#, c-format -msgid "FileIndex=%d VolSessionId=%d VolSessionTime=%d Stream=%d DataLen=%d\n" -msgstr "" - -#: src/stored/bls.c:458 -msgid "End of Physical Medium" -msgstr "" - -#: src/stored/bls.c:461 -msgid "Start of object" -msgstr "" - -#: src/stored/bls.c:464 -msgid "End of object" -msgstr "" - -#: src/stored/bscan.c:105 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bscan [ options ] \n" -" -b bootstrap specify a bootstrap file\n" -" -c specify configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -m update media info in database\n" -" -D specify the driver database name (default NULL)\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database password (default none)\n" -" -h specify database host (default NULL)\n" -" -t specify database port (default 0)\n" -" -p proceed inspite of I/O errors\n" -" -r list records\n" -" -s synchronize or store in database\n" -" -S show scan progress periodically\n" -" -v verbose\n" -" -V specify Volume names (separated by |)\n" -" -w specify working directory (default from conf file)\n" -" -? print this message\n" -"\n" -msgstr "" - -#: src/stored/bscan.c:254 src/stored/bsdjson.c:481 src/stored/stored.c:349 -#, c-format -msgid "No Working Directory defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bscan.c:262 -#, c-format -msgid "Working Directory: %s not found. Cannot continue.\n" -msgstr "" - -#: src/stored/bscan.c:266 -#, c-format -msgid "Working Directory: %s is not a directory. Cannot continue.\n" -msgstr "" - -#: src/stored/bscan.c:280 src/stored/bscan.c:363 -#, c-format -msgid "First Volume Size = %s\n" -msgstr "" - -#: src/stored/bscan.c:299 src/tools/bbatch.c:243 src/tools/bvfs_test.c:212 -#, c-format -msgid "Using Database: %s, User: %s\n" -msgstr "" - -#: src/stored/bscan.c:334 -#, c-format -msgid "Create JobMedia for Job %s\n" -msgstr "" - -#: src/stored/bscan.c:344 -#, c-format -msgid "Could not create JobMedia record for Volume=%s Job=%s\n" -msgstr "" - -#: src/stored/bscan.c:411 -#, c-format -msgid "done: %d%%\n" -msgstr "" - -#: src/stored/bscan.c:435 -msgid "Volume is prelabeled. This tape cannot be scanned.\n" -msgstr "" - -#: src/stored/bscan.c:447 -#, c-format -msgid "Pool record for %s found in DB.\n" -msgstr "" - -#: src/stored/bscan.c:451 -#, c-format -msgid "VOL_LABEL: Pool record not found for Pool: %s\n" -msgstr "" - -#: src/stored/bscan.c:457 -#, c-format -msgid "VOL_LABEL: PoolType mismatch. DB=%s Vol=%s\n" -msgstr "" - -#: src/stored/bscan.c:461 -#, c-format -msgid "Pool type \"%s\" is OK.\n" -msgstr "" - -#: src/stored/bscan.c:471 -#, c-format -msgid "Media record for %s found in DB.\n" -msgstr "" - -#: src/stored/bscan.c:478 -#, c-format -msgid "VOL_LABEL: Media record not found for Volume: %s\n" -msgstr "" - -#: src/stored/bscan.c:485 -#, c-format -msgid "VOL_LABEL: MediaType mismatch. DB=%s Vol=%s\n" -msgstr "" - -#: src/stored/bscan.c:489 -#, c-format -msgid "Media type \"%s\" is OK.\n" -msgstr "" - -#: src/stored/bscan.c:499 -#, c-format -msgid "VOL_LABEL: OK for Volume: %s\n" -msgstr "" - -#: src/stored/bscan.c:506 -#, c-format -msgid "%d \"errors\" ignored before first Start of Session record.\n" -msgstr "" - -#: src/stored/bscan.c:517 -#, c-format -msgid "SOS_LABEL: Found Job record for JobId: %d\n" -msgstr "" - -#: src/stored/bscan.c:522 -#, c-format -msgid "SOS_LABEL: Job record not found for JobId: %d\n" -msgstr "" - -#: src/stored/bscan.c:562 -#, c-format -msgid "SOS_LABEL: VolSessId mismatch for JobId=%u. DB=%d Vol=%d\n" -msgstr "" - -#: src/stored/bscan.c:568 -#, c-format -msgid "SOS_LABEL: VolSessTime mismatch for JobId=%u. DB=%d Vol=%d\n" -msgstr "" - -#: src/stored/bscan.c:574 -#, c-format -msgid "SOS_LABEL: PoolId mismatch for JobId=%u. DB=%d Vol=%d\n" -msgstr "" - -#: src/stored/bscan.c:592 src/stored/bscan.c:1146 -#, c-format -msgid "Could not find SessId=%d SessTime=%d for EOS record.\n" -msgstr "" - -#: src/stored/bscan.c:638 -#, c-format -msgid "Could not update job record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:649 -#, c-format -msgid "End of all Volumes. VolFiles=%u VolBlocks=%u VolBytes=%s\n" -msgstr "" - -#: src/stored/bscan.c:661 -#, c-format -msgid "Could not find Job for SessId=%d SessTime=%d record.\n" -msgstr "" - -#: src/stored/bscan.c:692 -#, c-format -msgid "%s file records. At file:blk=%s:%s bytes=%s\n" -msgstr "" - -#: src/stored/bscan.c:757 -#, c-format -msgid "Got MD5 record: %s\n" -msgstr "" - -#: src/stored/bscan.c:765 -#, c-format -msgid "Got SHA1 record: %s\n" -msgstr "" - -#: src/stored/bscan.c:773 -#, c-format -msgid "Got SHA256 record: %s\n" -msgstr "" - -#: src/stored/bscan.c:781 -#, c-format -msgid "Got SHA512 record: %s\n" -msgstr "" - -#: src/stored/bscan.c:789 src/stored/bscan.c:796 -msgid "Got signed digest record\n" -msgstr "" - -#: src/stored/bscan.c:802 -#, c-format -msgid "Got Prog Names Stream: %s\n" -msgstr "" - -#: src/stored/bscan.c:808 -msgid "Got Prog Data Stream record.\n" -msgstr "" - -#: src/stored/bscan.c:853 -#, c-format -msgid "Unknown stream type!!! stream=%d len=%i\n" -msgstr "" - -#: src/stored/bscan.c:915 -#, c-format -msgid "Could not create File Attributes record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:921 -#, c-format -msgid "Created File record: %s\n" -msgstr "" - -#: src/stored/bscan.c:966 -#, c-format -msgid "Could not create media record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:970 src/stored/bscan.c:991 -#, c-format -msgid "Could not update media record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:974 -#, c-format -msgid "Created Media record for Volume: %s\n" -msgstr "" - -#: src/stored/bscan.c:995 -#, c-format -msgid "Updated Media record at end of Volume: %s\n" -msgstr "" - -#: src/stored/bscan.c:1012 -#, c-format -msgid "Could not create pool record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1016 -#, c-format -msgid "Created Pool record for Pool: %s\n" -msgstr "" - -#: src/stored/bscan.c:1035 -#, c-format -msgid "Could not get Client record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1045 -#, c-format -msgid "Created Client record for Client: %s\n" -msgstr "" - -#: src/stored/bscan.c:1062 -#, c-format -msgid "Fileset \"%s\" already exists.\n" -msgstr "" - -#: src/stored/bscan.c:1066 -#, c-format -msgid "Could not create FileSet record \"%s\". ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1071 -#, c-format -msgid "Created FileSet record \"%s\"\n" -msgstr "" - -#: src/stored/bscan.c:1118 -#, c-format -msgid "Could not create JobId record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1124 -#, c-format -msgid "Could not update job start record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1127 -#, c-format -msgid "Created new JobId=%u record for original JobId=%u\n" -msgstr "" - -#: src/stored/bscan.c:1180 -#, c-format -msgid "Could not update JobId=%u record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1185 -#, c-format -msgid "Updated Job termination record for JobId=%u Level=%s TermStat=%c\n" -msgstr "" - -#: src/stored/bscan.c:1210 -#, c-format -msgid "Job Termination code: %d" -msgstr "" - -#: src/stored/bscan.c:1215 -#, c-format -msgid "" -"%s\n" -"JobId: %d\n" -"Job: %s\n" -"FileSet: %s\n" -"Backup Level: %s\n" -"Client: %s\n" -"Start time: %s\n" -"End time: %s\n" -"Files Written: %s\n" -"Bytes Written: %s\n" -"Volume Session Id: %d\n" -"Volume Session Time: %d\n" -"Last Volume Bytes: %s\n" -"Termination: %s\n" -"\n" -msgstr "" - -#: src/stored/bscan.c:1273 -#, c-format -msgid "Could not create JobMedia record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1277 -#, c-format -msgid "Created JobMedia record JobId %d, MediaId %d\n" -msgstr "" - -#: src/stored/bscan.c:1293 -#, c-format -msgid "Could not find SessId=%d SessTime=%d for MD5/SHA1 record.\n" -msgstr "" - -#: src/stored/bscan.c:1307 -#, c-format -msgid "Could not add MD5/SHA1 to File record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1312 -msgid "Updated MD5/SHA1 record\n" -msgstr "" - -#: src/stored/bsdjson.c:74 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bsdjson [options] [-c config_file] [config_file]\n" -" -r get resource type \n" -" -n get resource \n" -" -l get only directives matching dirs (use with -r)\n" -" -D get only data\n" -" -c use as configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -t test - read config and exit\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Versie: %s (%s) %s %s %s\n" -"\n" -"Specificatie: tray-monitor [-c configuratiebestand] [-d debug_level]\n" -" -c gebruik configuratiebestand\n" -" -d instellen debug level op \n" -" -dt weergeven tijd in debug output\n" -" -t test - lees configuratie en stop\n" -" -? geef deze melding.\n" -"\n" - -#: src/stored/bsdjson.c:450 src/stored/butil.c:78 src/stored/stored.c:318 -#, c-format -msgid "No Storage resource defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bsdjson.c:456 src/stored/stored.c:324 -#, c-format -msgid "Only one Storage resource permitted in %s\n" -msgstr "" - -#: src/stored/bsdjson.c:461 src/stored/stored.c:329 -#, c-format -msgid "No Director resource defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bsdjson.c:466 src/stored/stored.c:334 -#, c-format -msgid "No Device resource defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bsdjson.c:474 src/stored/stored.c:342 -#, c-format -msgid "No Messages resource defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bsdjson.c:503 src/stored/stored.c:371 -#, c-format -msgid "\"TLS Certificate\" file not defined for Storage \"%s\" in %s.\n" -msgstr "" - -#: src/stored/bsdjson.c:509 src/stored/stored.c:377 -#, c-format -msgid "\"TLS Key\" file not defined for Storage \"%s\" in %s.\n" -msgstr "" - -#: src/stored/bsdjson.c:515 src/stored/stored.c:383 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Storage \"%s\" in %s. At least one CA certificate store is required when " -"using \"TLS Verify Peer\".\n" -msgstr "" - -#: src/stored/btape.c:165 src/stored/stored.c:132 -#, c-format -msgid "Tape block size (%d) not multiple of system size (%d)\n" -msgstr "" - -#: src/stored/btape.c:169 src/stored/stored.c:136 -#, c-format -msgid "Tape block size (%d) is not a power of 2\n" -msgstr "" - -#: src/stored/btape.c:172 -#, c-format -msgid "" -"\n" -"\n" -"!!!! Warning large disk addressing disabled. boffset_t=%d should be 8 or " -"more !!!!!\n" -"\n" -"\n" -msgstr "" - -#: src/stored/btape.c:179 -#, c-format -msgid "32 bit printf/scanf problem. i=%d x32=%u y32=%u\n" -msgstr "" - -#: src/stored/btape.c:188 -msgid "64 bit printf/scanf problem. i=%d x64=%" -msgstr "" - -#: src/stored/btape.c:193 -#, c-format -msgid "Tape block granularity is %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:269 -msgid "No archive name specified.\n" -msgstr "" - -#: src/stored/btape.c:273 -msgid "Improper number of arguments specified.\n" -msgstr "" - -#: src/stored/btape.c:287 -msgid "btape does not work with DVD storage.\n" -msgstr "" - -#: src/stored/btape.c:292 -msgid "btape only works with tape storage.\n" -msgstr "" - -#: src/stored/btape.c:378 -#, c-format -msgid "Total Volume bytes=%sB. Total Write rate = %sB/s\n" -msgstr "" - -#: src/stored/btape.c:404 -#, c-format -msgid "Volume bytes=%sB. Write rate = %sB/s\n" -msgstr "" - -#: src/stored/btape.c:472 -#, c-format -msgid "open device %s: OK\n" -msgstr "" - -#: src/stored/btape.c:495 -msgid "Enter Volume Name: " -msgstr "" - -#: src/stored/btape.c:502 -#, c-format -msgid "Device open failed. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:507 -#, c-format -msgid "Wrote Volume label for volume \"%s\".\n" -msgstr "" - -#: src/stored/btape.c:521 -msgid "Volume has no label.\n" -msgstr "" - -#: src/stored/btape.c:524 -msgid "Volume label read correctly.\n" -msgstr "" - -#: src/stored/btape.c:527 -#, c-format -msgid "I/O error on device: ERR=%s" -msgstr "" - -#: src/stored/btape.c:530 -#, c-format -msgid "Volume type error: ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:533 -msgid "Volume name error\n" -msgstr "" - -#: src/stored/btape.c:536 -#, c-format -msgid "Error creating label. ERR=%s" -msgstr "" - -#: src/stored/btape.c:539 -msgid "Volume version error.\n" -msgstr "" - -#: src/stored/btape.c:542 -msgid "Bad Volume label type.\n" -msgstr "" - -#: src/stored/btape.c:545 -msgid "Unknown error.\n" -msgstr "" - -#: src/stored/btape.c:563 -#, c-format -msgid "Bad status from load. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:565 -#, c-format -msgid "Loaded %s\n" -msgstr "" - -#: src/stored/btape.c:574 src/stored/btape.c:1137 src/stored/btape.c:1210 -#: src/stored/btape.c:1289 src/stored/btape.c:1559 -#, c-format -msgid "Bad status from rewind. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:577 src/stored/btape.c:1567 -#, c-format -msgid "Rewound %s\n" -msgstr "" - -#: src/stored/btape.c:603 src/stored/btape.c:1571 -#, c-format -msgid "Bad status from weof. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:607 -#, c-format -msgid "Wrote 1 EOF to %s\n" -msgstr "" - -#: src/stored/btape.c:610 -#, c-format -msgid "Wrote %d EOFs to %s\n" -msgstr "" - -#: src/stored/btape.c:628 -msgid "Moved to end of medium.\n" -msgstr "" - -#: src/stored/btape.c:655 -#, c-format -msgid "Bad status from bsf. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:657 -#, c-format -msgid "Backspaced %d file%s.\n" -msgstr "" - -#: src/stored/btape.c:674 -#, c-format -msgid "Bad status from bsr. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:676 -#, c-format -msgid "Backspaced %d record%s.\n" -msgstr "" - -#: src/stored/btape.c:686 src/stored/status.c:626 -#, c-format -msgid "Configured device capabilities:\n" -msgstr "" - -#: src/stored/btape.c:704 -#, c-format -msgid "Device status:\n" -msgstr "" - -#: src/stored/btape.c:718 src/stored/status.c:682 -#, c-format -msgid "Device parameters:\n" -msgstr "" - -#: src/stored/btape.c:723 -#, c-format -msgid "Status:\n" -msgstr "" - -#: src/stored/btape.c:738 -msgid "" -"Test writing larger and larger records.\n" -"This is a torture test for records.\n" -"I am going to write\n" -"larger and larger records. It will stop when the record size\n" -"plus the header exceeds the block size (by default about 64K)\n" -msgstr "" - -#: src/stored/btape.c:744 -msgid "Do you want to continue? (y/n): " -msgstr "" - -#: src/stored/btape.c:746 src/stored/btape.c:2196 -msgid "Command aborted.\n" -msgstr "" - -#: src/stored/btape.c:763 -#, c-format -msgid "Block %d i=%d\n" -msgstr "" - -#: src/stored/btape.c:790 -msgid "Skipping read backwards test because BSR turned off.\n" -msgstr "" - -#: src/stored/btape.c:794 -msgid "" -"\n" -"=== Write, backup, and re-read test ===\n" -"\n" -"I'm going to write three records and an EOF\n" -"then backup over the EOF and re-read the last record.\n" -"Bacula does this after writing the last block on the\n" -"tape to verify that the block was written correctly.\n" -"\n" -"This is not an *essential* feature ...\n" -"\n" -msgstr "" - -#: src/stored/btape.c:807 src/stored/btape.c:818 src/stored/btape.c:829 -#: src/stored/btape.c:1147 src/stored/btape.c:1163 src/stored/btape.c:1903 -#: src/stored/btape.c:2822 -msgid "Error writing record to block.\n" -msgstr "" - -#: src/stored/btape.c:811 src/stored/btape.c:822 src/stored/btape.c:833 -#: src/stored/btape.c:1151 src/stored/btape.c:1167 src/stored/btape.c:1907 -#: src/stored/btape.c:2826 -msgid "Error writing block to device.\n" -msgstr "" - -#: src/stored/btape.c:814 -#, c-format -msgid "Wrote first record of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:825 -#, c-format -msgid "Wrote second record of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:836 -#, c-format -msgid "Wrote third record of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:843 src/stored/btape.c:848 -#, c-format -msgid "Backspace file failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:852 -msgid "Backspaced over EOF OK.\n" -msgstr "" - -#: src/stored/btape.c:854 -#, c-format -msgid "Backspace record failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:857 -msgid "Backspace record OK.\n" -msgstr "" - -#: src/stored/btape.c:859 src/stored/btape.c:865 -#, c-format -msgid "Read block failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:870 -msgid "Bad data in record. Test failed!\n" -msgstr "" - -#: src/stored/btape.c:874 -msgid "" -"\n" -"Block re-read correct. Test succeeded!\n" -msgstr "" - -#: src/stored/btape.c:875 -msgid "" -"=== End Write, backup, and re-read test ===\n" -"\n" -msgstr "" - -#: src/stored/btape.c:882 -msgid "" -"This is not terribly serious since Bacula only uses\n" -"this function to verify the last block written to the\n" -"tape. Bacula will skip the last block verification\n" -"if you add:\n" -"\n" -"Backward Space Record = No\n" -"\n" -"to your Storage daemon's Device resource definition.\n" -msgstr "" - -#: src/stored/btape.c:904 -#, c-format -msgid "Begin writing %i files of %sB with raw blocks of %u bytes.\n" -msgstr "" - -#: src/stored/btape.c:925 src/stored/btape.c:2878 -#, c-format -msgid "Write failed at block %u. stat=%d ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:959 -#, c-format -msgid "Begin writing %i files of %sB with blocks of %u bytes.\n" -msgstr "" - -#: src/stored/btape.c:968 -msgid "" -"\n" -"Error writing record to block.\n" -msgstr "" - -#: src/stored/btape.c:972 -msgid "" -"\n" -"Error writing block to device.\n" -msgstr "" - -#: src/stored/btape.c:1027 -msgid "The file_size is too big, stop this test with Ctrl-c.\n" -msgstr "" - -#: src/stored/btape.c:1055 -msgid "Test with zero data, should give the maximum throughput.\n" -msgstr "" - -#: src/stored/btape.c:1067 src/stored/btape.c:1093 -msgid "Test with random data, should give the minimum throughput.\n" -msgstr "" - -#: src/stored/btape.c:1082 -msgid "Test with zero data and bacula block structure.\n" -msgstr "" - -#: src/stored/btape.c:1123 -#, c-format -msgid "" -"\n" -"=== Write, rewind, and re-read test ===\n" -"\n" -"I'm going to write %d records and an EOF\n" -"then write %d records and an EOF, then rewind,\n" -"and re-read the data to verify that it is correct.\n" -"\n" -"This is an *essential* feature ...\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1155 src/stored/btape.c:1171 -#, c-format -msgid "Wrote %d blocks of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:1213 src/stored/btape.c:1292 -msgid "Rewind OK.\n" -msgstr "" - -#: src/stored/btape.c:1225 src/stored/btape.c:1343 -msgid "Got EOF on tape.\n" -msgstr "" - -#: src/stored/btape.c:1230 -#, c-format -msgid "Read block %d failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1236 -#, c-format -msgid "Read record failed. Block %d! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1242 src/stored/btape.c:1373 -#, c-format -msgid "Bad data in record. Expected %d, got %d at byte %d. Test failed!\n" -msgstr "" - -#: src/stored/btape.c:1249 -#, c-format -msgid "%d blocks re-read correctly.\n" -msgstr "" - -#: src/stored/btape.c:1252 src/stored/btape.c:1380 -msgid "" -"=== Test Succeeded. End Write, rewind, and re-read test ===\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1280 -msgid "Block position test\n" -msgstr "" - -#: src/stored/btape.c:1335 -#, c-format -msgid "Reposition to file:block %d:%d\n" -msgstr "" - -#: src/stored/btape.c:1337 -msgid "Reposition error.\n" -msgstr "" - -#: src/stored/btape.c:1349 -#, c-format -msgid "" -"Read block %d failed! file=%d blk=%d. ERR=%s\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1351 -msgid "" -"This may be because the tape drive block size is not\n" -" set to variable blocking as normally used by Bacula.\n" -" Please see the Tape Testing chapter in the manual and \n" -" look for using mt with defblksize and setoptions\n" -"If your tape drive block size is correct, then perhaps\n" -" your SCSI driver is *really* stupid and does not\n" -" correctly report the file:block after a FSF. In this\n" -" case try setting:\n" -" Fast Forward Space File = no\n" -" in your Device resource.\n" -msgstr "" - -#: src/stored/btape.c:1367 -#, c-format -msgid "Read record failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1378 -#, c-format -msgid "Block %d re-read correctly.\n" -msgstr "" - -#: src/stored/btape.c:1399 -msgid "" -"\n" -"\n" -"=== Append files test ===\n" -"\n" -"This test is essential to Bacula.\n" -"\n" -"I'm going to write one record in file 0,\n" -" two records in file 1,\n" -" and three records in file 2\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1423 -msgid "Now moving to end of medium.\n" -msgstr "" - -#: src/stored/btape.c:1425 src/stored/btape.c:1654 -#, c-format -msgid "We should be in file 3. I am at file %d. %s\n" -msgstr "" - -#: src/stored/btape.c:1426 src/stored/btape.c:1444 src/stored/btape.c:1643 -#: src/stored/btape.c:1655 src/stored/btape.c:1668 src/stored/btape.c:1685 -msgid "This is correct!" -msgstr "" - -#: src/stored/btape.c:1426 src/stored/btape.c:1444 src/stored/btape.c:1643 -#: src/stored/btape.c:1655 src/stored/btape.c:1668 src/stored/btape.c:1685 -msgid "This is NOT correct!!!!" -msgstr "" - -#: src/stored/btape.c:1432 -msgid "" -"\n" -"Now the important part, I am going to attempt to append to the tape.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1439 -msgid "" -"Done appending, there should be no I/O errors\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1440 -msgid "Doing Bacula scan of blocks:\n" -msgstr "" - -#: src/stored/btape.c:1442 -msgid "End scanning the tape.\n" -msgstr "" - -#: src/stored/btape.c:1443 src/stored/btape.c:1667 -#, c-format -msgid "We should be in file 4. I am at file %d. %s\n" -msgstr "" - -#: src/stored/btape.c:1468 -msgid "" -"\n" -"Autochanger enabled, but no name or no command device specified.\n" -msgstr "" - -#: src/stored/btape.c:1472 -msgid "" -"\n" -"Ah, I see you have an autochanger configured.\n" -"To test the autochanger you must have a blank tape\n" -" that I can write on in Slot 1.\n" -msgstr "" - -#: src/stored/btape.c:1475 -msgid "" -"\n" -"Do you wish to continue with the Autochanger test? (y/n): " -msgstr "" - -#: src/stored/btape.c:1482 -msgid "" -"\n" -"\n" -"=== Autochanger test ===\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1491 -msgid "3301 Issuing autochanger \"loaded\" command.\n" -msgstr "" - -#: src/stored/btape.c:1500 -#, c-format -msgid "3991 Bad autochanger command: %s\n" -msgstr "" - -#: src/stored/btape.c:1501 -#, c-format -msgid "3991 result=\"%s\": ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1505 -#, c-format -msgid "Slot %d loaded. I am going to unload it.\n" -msgstr "" - -#: src/stored/btape.c:1507 -msgid "Nothing loaded in the drive. OK.\n" -msgstr "" - -#: src/stored/btape.c:1514 -#, c-format -msgid "3302 Issuing autochanger \"unload %d %d\" command.\n" -msgstr "" - -#: src/stored/btape.c:1519 -#, c-format -msgid "unload status=%s %d\n" -msgstr "" - -#: src/stored/btape.c:1519 -msgid "Bad" -msgstr "" - -#: src/stored/btape.c:1522 -#, c-format -msgid "3992 Bad autochanger command: %s\n" -msgstr "" - -#: src/stored/btape.c:1523 -#, c-format -msgid "3992 result=\"%s\": ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1533 -#, c-format -msgid "3303 Issuing autochanger \"load %d %d\" command.\n" -msgstr "" - -#: src/stored/btape.c:1541 -#, c-format -msgid "3303 Autochanger \"load %d %d\" status is OK.\n" -msgstr "" - -#: src/stored/btape.c:1545 -#, c-format -msgid "3993 Bad autochanger command: %s\n" -msgstr "" - -#: src/stored/btape.c:1546 -#, c-format -msgid "3993 result=\"%s\": ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1561 -msgid "" -"\n" -"The test failed, probably because you need to put\n" -"a longer sleep time in the mtx-script in the load) case.\n" -"Adding a 30 second sleep and trying again ...\n" -msgstr "" - -#: src/stored/btape.c:1574 -#, c-format -msgid "Wrote EOF to %s\n" -msgstr "" - -#: src/stored/btape.c:1578 -#, c-format -msgid "" -"\n" -"The test worked this time. Please add:\n" -"\n" -" sleep %d\n" -"\n" -"to your mtx-changer script in the load) case.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1583 -msgid "" -"\n" -"The test autochanger worked!!\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1594 -msgid "You must correct this error or the Autochanger will not work.\n" -msgstr "" - -#: src/stored/btape.c:1612 -msgid "" -"\n" -"\n" -"=== Forward space files test ===\n" -"\n" -"This test is essential to Bacula.\n" -"\n" -"I'm going to write five files then test forward spacing\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1637 -msgid "Now forward spacing 1 file.\n" -msgstr "" - -#: src/stored/btape.c:1639 src/stored/btape.c:1651 src/stored/btape.c:1664 -#: src/stored/btape.c:1682 src/stored/btape.c:1858 -#, c-format -msgid "Bad status from fsr. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1642 -#, c-format -msgid "We should be in file 1. I am at file %d. %s\n" -msgstr "" - -#: src/stored/btape.c:1649 -msgid "Now forward spacing 2 files.\n" -msgstr "" - -#: src/stored/btape.c:1662 -msgid "Now forward spacing 4 files.\n" -msgstr "" - -#: src/stored/btape.c:1674 -msgid "" -"The test worked this time. Please add:\n" -"\n" -" Fast Forward Space File = no\n" -"\n" -"to your Device resource for this drive.\n" -msgstr "" - -#: src/stored/btape.c:1680 -msgid "Now forward spacing 1 more file.\n" -msgstr "" - -#: src/stored/btape.c:1684 -#, c-format -msgid "We should be in file 5. I am at file %d. %s\n" -msgstr "" - -#: src/stored/btape.c:1689 -msgid "" -"\n" -"=== End Forward space files test ===\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1693 -msgid "" -"\n" -"The forward space file test failed.\n" -msgstr "" - -#: src/stored/btape.c:1695 -msgid "" -"You have Fast Forward Space File enabled.\n" -"I am turning it off then retrying the test.\n" -msgstr "" - -#: src/stored/btape.c:1701 -msgid "" -"You must correct this error or Bacula will not work.\n" -"Some systems, e.g. OpenBSD, require you to set\n" -" Use MTIOCGET= no\n" -"in your device resource. Use with caution.\n" -msgstr "" - -#: src/stored/btape.c:1735 -msgid "" -"\n" -"Append test failed. Attempting again.\n" -"Setting \"Hardware End of Medium = no\n" -" and \"Fast Forward Space File = no\n" -"and retrying append test.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1743 -msgid "" -"\n" -"\n" -"It looks like the test worked this time, please add:\n" -"\n" -" Hardware End of Medium = No\n" -"\n" -" Fast Forward Space File = No\n" -"to your Device resource in the Storage conf file.\n" -msgstr "" - -#: src/stored/btape.c:1750 -msgid "" -"\n" -"\n" -"That appears *NOT* to have corrected the problem.\n" -msgstr "" - -#: src/stored/btape.c:1755 -msgid "" -"\n" -"\n" -"It looks like the append failed. Attempting again.\n" -"Setting \"BSF at EOM = yes\" and retrying append test.\n" -msgstr "" - -#: src/stored/btape.c:1760 -msgid "" -"\n" -"\n" -"It looks like the test worked this time, please add:\n" -"\n" -" Hardware End of Medium = No\n" -" Fast Forward Space File = No\n" -" BSF at EOM = yes\n" -"\n" -"to your Device resource in the Storage conf file.\n" -msgstr "" - -#: src/stored/btape.c:1771 -msgid "" -"\n" -"Append test failed.\n" -"\n" -"\n" -"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" -"Unable to correct the problem. You MUST fix this\n" -"problem before Bacula can use your tape drive correctly\n" -"\n" -"Perhaps running Bacula in fixed block mode will work.\n" -"Do so by setting:\n" -"\n" -"Minimum Block Size = nnn\n" -"Maximum Block Size = nnn\n" -"\n" -"in your Storage daemon's Device definition.\n" -"nnn must match your tape driver's block size, which\n" -"can be determined by reading your tape manufacturers\n" -"information, and the information on your kernel dirver.\n" -"Fixed block sizes, however, are not normally an ideal solution.\n" -"\n" -"Some systems, e.g. OpenBSD, require you to set\n" -" Use MTIOCGET= no\n" -"in your device resource. Use with caution.\n" -msgstr "" - -#: src/stored/btape.c:1793 -msgid "" -"\n" -"The above Bacula scan should have output identical to what follows.\n" -"Please double check it ...\n" -"=== Sample correct output ===\n" -"1 block of 64448 bytes in file 1\n" -"End of File mark.\n" -"2 blocks of 64448 bytes in file 2\n" -"End of File mark.\n" -"3 blocks of 64448 bytes in file 3\n" -"End of File mark.\n" -"1 block of 64448 bytes in file 4\n" -"End of File mark.\n" -"Total files=4, blocks=7, bytes = 451,136\n" -"=== End sample correct output ===\n" -"\n" -"If the above scan output is not identical to the\n" -"sample output, you MUST correct the problem\n" -"or Bacula will not be able to write multiple Jobs to \n" -"the tape.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1836 -#, c-format -msgid "Bad status from fsf. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1840 -msgid "Forward spaced 1 file.\n" -msgstr "" - -#: src/stored/btape.c:1843 -#, c-format -msgid "Forward spaced %d files.\n" -msgstr "" - -#: src/stored/btape.c:1862 -msgid "Forward spaced 1 record.\n" -msgstr "" - -#: src/stored/btape.c:1865 -#, c-format -msgid "Forward spaced %d records.\n" -msgstr "" - -#: src/stored/btape.c:1910 -#, c-format -msgid "Wrote one record of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:1912 -msgid "Wrote block to device.\n" -msgstr "" - -#: src/stored/btape.c:1926 -msgid "Enter length to read: " -msgstr "" - -#: src/stored/btape.c:1931 -msgid "Bad length entered, using default of 1024 bytes.\n" -msgstr "" - -#: src/stored/btape.c:1940 -#, c-format -msgid "Read of %d bytes gives stat=%d. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1963 src/stored/btape.c:2012 -#, c-format -msgid "End of tape\n" -msgstr "" - -#: src/stored/btape.c:1968 -#, c-format -msgid "Starting scan at file %u\n" -msgstr "" - -#: src/stored/btape.c:1973 src/stored/tape_dev.c:614 -#, c-format -msgid "read error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/btape.c:1975 -#, c-format -msgid "Bad status from read %d. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1978 src/stored/btape.c:1992 src/stored/btape.c:2056 -#: src/stored/btape.c:2068 src/stored/btape.c:2081 src/stored/btape.c:2097 -#, c-format -msgid "1 block of %d bytes in file %d\n" -msgstr "" - -#: src/stored/btape.c:1981 src/stored/btape.c:1995 src/stored/btape.c:2059 -#: src/stored/btape.c:2071 src/stored/btape.c:2084 src/stored/btape.c:2100 -#, c-format -msgid "%d blocks of %d bytes in file %d\n" -msgstr "" - -#: src/stored/btape.c:2003 src/stored/btape.c:2075 -#, c-format -msgid "End of File mark.\n" -msgstr "" - -#: src/stored/btape.c:2024 src/stored/btape.c:2128 -#, c-format -msgid "Total files=%d, blocks=%d, bytes = %s\n" -msgstr "" - -#: src/stored/btape.c:2088 -#, c-format -msgid "Short block read.\n" -msgstr "" - -#: src/stored/btape.c:2091 -#, c-format -msgid "Error reading block. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2115 -#, c-format -msgid "" -"Block=%u file,blk=%u,%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%s " -"rlen=%d\n" -msgstr "" - -#: src/stored/btape.c:2137 -#, c-format -msgid "Device status: %u. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2169 -#, c-format -msgid "" -"\n" -"This command simulates Bacula writing to a tape.\n" -"It requires either one or two blank tapes, which it\n" -"will label and write.\n" -"\n" -"If you have an autochanger configured, it will use\n" -"the tapes that are in slots 1 and 2, otherwise, you will\n" -"be prompted to insert the tapes when necessary.\n" -"\n" -"It will print a status approximately\n" -"every 322 MB, and write an EOF every %s. If you have\n" -"selected the simple test option, after writing the first tape\n" -"it will rewind it and re-read the last block written.\n" -"\n" -"If you have selected the multiple tape test, when the first tape\n" -"fills, it will ask for a second, and after writing a few more \n" -"blocks, it will stop. Then it will begin re-reading the\n" -"two tapes.\n" -"\n" -"This may take a long time -- hours! ...\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2187 -msgid "" -"Do you want to run the simplified test (s) with one tape\n" -"or the complete multiple tape (m) test: (s/m) " -msgstr "" - -#: src/stored/btape.c:2190 -msgid "Simple test (single tape) selected.\n" -msgstr "" - -#: src/stored/btape.c:2193 -msgid "Multiple tape test selected.\n" -msgstr "" - -#: src/stored/btape.c:2235 -msgid "Wrote Start of Session label.\n" -msgstr "" - -#: src/stored/btape.c:2254 -#, c-format -msgid "%s Begin writing Bacula records to tape ...\n" -msgstr "" - -#: src/stored/btape.c:2256 -#, c-format -msgid "%s Begin writing Bacula records to first tape ...\n" -msgstr "" - -#: src/stored/btape.c:2282 -msgid "Flush block failed.\n" -msgstr "" - -#: src/stored/btape.c:2296 -#, c-format -msgid "Wrote block=%u, file,blk=%u,%u VolBytes=%s rate=%sB/s\n" -msgstr "" - -#: src/stored/btape.c:2307 -#, c-format -msgid "%s Flush block, write EOF\n" -msgstr "" - -#: src/stored/btape.c:2316 -msgid "Wrote 1000 blocks on second tape. Done.\n" -msgstr "" - -#: src/stored/btape.c:2321 -msgid "Not OK\n" -msgstr "" - -#: src/stored/btape.c:2345 -msgid "Job canceled.\n" -msgstr "" - -#: src/stored/btape.c:2356 -msgid "Set ok=false after write_block_to_device.\n" -msgstr "" - -#: src/stored/btape.c:2360 -msgid "Wrote End of Session label.\n" -msgstr "" - -#: src/stored/btape.c:2384 -#, c-format -msgid "Wrote state file last_block_num1=%d last_block_num2=%d\n" -msgstr "" - -#: src/stored/btape.c:2388 -#, c-format -msgid "Could not create state file: %s ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2399 -#, c-format -msgid "" -"\n" -"\n" -"%s Done filling tape at %d:%d. Now beginning re-read of tape ...\n" -msgstr "" - -#: src/stored/btape.c:2402 -#, c-format -msgid "" -"\n" -"\n" -"%s Done filling tapes at %d:%d. Now beginning re-read of first tape ...\n" -msgstr "" - -#: src/stored/btape.c:2408 -msgid "do_unfill failed.\n" -msgstr "" - -#: src/stored/btape.c:2413 -#, c-format -msgid "%s: Error during test.\n" -msgstr "" - -#: src/stored/btape.c:2448 -msgid "" -"\n" -"The state file level has changed. You must redo\n" -"the fill command.\n" -msgstr "" - -#: src/stored/btape.c:2455 -#, c-format -msgid "" -"\n" -"Could not find the state file: %s ERR=%s\n" -"You must redo the fill command.\n" -msgstr "" - -#: src/stored/btape.c:2521 -msgid "Mount first tape. Press enter when ready: " -msgstr "" - -#: src/stored/btape.c:2538 -msgid "Rewinding.\n" -msgstr "" - -#: src/stored/btape.c:2543 -#, c-format -msgid "Reading the first 10000 records from %u:%u.\n" -msgstr "" - -#: src/stored/btape.c:2547 src/stored/btape.c:2616 -#, c-format -msgid "Reposition from %u:%u to %u:%u\n" -msgstr "" - -#: src/stored/btape.c:2550 src/stored/btape.c:2603 src/stored/btape.c:2619 -#, c-format -msgid "Reposition error. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2553 -#, c-format -msgid "Reading block %u.\n" -msgstr "" - -#: src/stored/btape.c:2555 src/stored/btape.c:2608 src/stored/btape.c:2624 -#, c-format -msgid "Error reading block: ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2560 -msgid "" -"\n" -"The last block on the tape matches. Test succeeded.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2563 -msgid "" -"\n" -"The last block of the first tape matches.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2587 -msgid "Mount second tape. Press enter when ready: " -msgstr "" - -#: src/stored/btape.c:2601 -#, c-format -msgid "Reposition from %u:%u to 0:1\n" -msgstr "" - -#: src/stored/btape.c:2606 src/stored/btape.c:2622 -#, c-format -msgid "Reading block %d.\n" -msgstr "" - -#: src/stored/btape.c:2612 -msgid "" -"\n" -"The first block on the second tape matches.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2628 -msgid "" -"\n" -"The last block on the second tape matches. Test succeeded.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2646 -#, c-format -msgid "10000 records read now at %d:%d\n" -msgstr "" - -#: src/stored/btape.c:2672 src/stored/btape.c:2683 src/stored/btape.c:2728 -msgid "Last block written" -msgstr "" - -#: src/stored/btape.c:2674 src/stored/btape.c:2684 -msgid "Block read back" -msgstr "" - -#: src/stored/btape.c:2675 -#, c-format -msgid "" -"\n" -"\n" -"The blocks differ at byte %u\n" -msgstr "" - -#: src/stored/btape.c:2676 -msgid "" -"\n" -"\n" -"!!!! The last block written and the block\n" -"that was read back differ. The test FAILED !!!!\n" -"This must be corrected before you use Bacula\n" -"to write multi-tape Volumes.!!!!\n" -msgstr "" - -#: src/stored/btape.c:2712 -#, c-format -msgid "Last block at: %u:%u this_dev_block_num=%d\n" -msgstr "" - -#: src/stored/btape.c:2726 -#, c-format -msgid "Block not written: FileIndex=%u blk_block=%u Size=%u\n" -msgstr "" - -#: src/stored/btape.c:2730 -msgid "Block not written" -msgstr "" - -#: src/stored/btape.c:2745 -#, c-format -msgid "End of tape %d:%d. Volume Bytes=%s. Write rate = %sB/s\n" -msgstr "" - -#: src/stored/btape.c:2796 -msgid "Test writing blocks of 64512 bytes to tape.\n" -msgstr "" - -#: src/stored/btape.c:2798 -msgid "How many blocks do you want to write? (1000): " -msgstr "" - -#: src/stored/btape.c:2815 -#, c-format -msgid "Begin writing %d Bacula blocks to tape ...\n" -msgstr "" - -#: src/stored/btape.c:2858 -#, c-format -msgid "Begin writing raw blocks of %u bytes.\n" -msgstr "" - -#: src/stored/btape.c:2889 -msgid "test autochanger" -msgstr "" - -#: src/stored/btape.c:2890 -msgid "backspace file" -msgstr "" - -#: src/stored/btape.c:2891 -msgid "backspace record" -msgstr "" - -#: src/stored/btape.c:2892 -msgid "list device capabilities" -msgstr "" - -#: src/stored/btape.c:2893 -msgid "clear tape errors" -msgstr "" - -#: src/stored/btape.c:2894 -msgid "go to end of Bacula data for append" -msgstr "" - -#: src/stored/btape.c:2895 -msgid "go to the physical end of medium" -msgstr "" - -#: src/stored/btape.c:2896 -msgid "fill tape, write onto second volume" -msgstr "" - -#: src/stored/btape.c:2897 -msgid "read filled tape" -msgstr "" - -#: src/stored/btape.c:2898 -msgid "forward space a file" -msgstr "" - -#: src/stored/btape.c:2899 -msgid "forward space a record" -msgstr "" - -#: src/stored/btape.c:2900 -msgid "print this command" -msgstr "" - -#: src/stored/btape.c:2901 -msgid "write a Bacula label to the tape" -msgstr "" - -#: src/stored/btape.c:2902 -msgid "load a tape" -msgstr "" - -#: src/stored/btape.c:2903 -msgid "quit btape" -msgstr "" - -#: src/stored/btape.c:2904 -msgid "use write() to fill tape" -msgstr "" - -#: src/stored/btape.c:2905 -msgid "read and print the Bacula tape label" -msgstr "" - -#: src/stored/btape.c:2906 -msgid "test record handling functions" -msgstr "" - -#: src/stored/btape.c:2907 -msgid "rewind the tape" -msgstr "" - -#: src/stored/btape.c:2908 -msgid "read() tape block by block to EOT and report" -msgstr "" - -#: src/stored/btape.c:2909 -msgid "Bacula read block by block to EOT and report" -msgstr "" - -#: src/stored/btape.c:2910 -msgid "" -"[file_size=n(GB)|nb_file=3|skip_zero|skip_random|skip_raw|skip_block] report " -"drive speed" -msgstr "" - -#: src/stored/btape.c:2911 -msgid "print tape status" -msgstr "" - -#: src/stored/btape.c:2912 -msgid "General test Bacula tape functions" -msgstr "" - -#: src/stored/btape.c:2913 -msgid "write an EOF on the tape" -msgstr "" - -#: src/stored/btape.c:2914 -msgid "write a single Bacula block" -msgstr "" - -#: src/stored/btape.c:2915 -msgid "read a single record" -msgstr "" - -#: src/stored/btape.c:2916 -msgid "read a single Bacula block" -msgstr "" - -#: src/stored/btape.c:2917 -msgid "quick fill command" -msgstr "" - -#: src/stored/btape.c:2938 -#, c-format -msgid "\"%s\" is an invalid command\n" -msgstr "" - -#: src/stored/btape.c:2947 -#, c-format -msgid "Interactive commands:\n" -msgstr "" - -#: src/stored/btape.c:2958 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: btape \n" -" -b specify bootstrap file\n" -" -c set configuration file to file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -p proceed inspite of I/O errors\n" -" -s turn off signals\n" -" -v be verbose\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Versie: %s (%s) %s %s %s\n" -"\n" -"Specificatie: tray-monitor [-c configuratiebestand] [-d debug_level]\n" -" -c gebruik configuratiebestand\n" -" -d instellen debug level op \n" -" -dt weergeven tijd in debug output\n" -" -t test - lees configuratie en stop\n" -" -? geef deze melding.\n" -"\n" - -#: src/stored/btape.c:3046 -#, c-format -msgid "Mount second Volume on device %s and press return when ready: " -msgstr "" - -#: src/stored/btape.c:3074 -#, c-format -msgid "Mount blank Volume on device %s and press return when ready: " -msgstr "" - -#: src/stored/btape.c:3094 -#, c-format -msgid "End of Volume \"%s\" %d records.\n" -msgstr "" - -#: src/stored/btape.c:3108 -#, c-format -msgid "Read block=%u, VolBytes=%s rate=%sB/s\n" -msgstr "" - -#: src/stored/btape.c:3121 -#, c-format -msgid "Cannot open Dev=%s, Vol=%s\n" -msgstr "" - -#: src/stored/butil.c:48 -msgid "Nohdr," -msgstr "" - -#: src/stored/butil.c:51 -msgid "partial," -msgstr "" - -#: src/stored/butil.c:54 -msgid "empty," -msgstr "" - -#: src/stored/butil.c:57 -msgid "Nomatch," -msgstr "" - -#: src/stored/butil.c:60 -msgid "cont," -msgstr "" - -#: src/stored/butil.c:150 -msgid "Volume name or names is too long. Please use a .bsr file.\n" -msgstr "" - -#: src/stored/butil.c:170 -#, c-format -msgid "Cannot find device \"%s\" in config file %s.\n" -msgstr "" - -#: src/stored/butil.c:177 -#, c-format -msgid "Cannot init device %s\n" -msgstr "" - -#: src/stored/butil.c:203 -#, c-format -msgid "Cannot open %s\n" -msgstr "" - -#: src/stored/butil.c:290 -#, c-format -msgid "Could not find device \"%s\" in config file %s.\n" -msgstr "" - -#: src/stored/butil.c:295 -#, c-format -msgid "Using device: \"%s\" for writing.\n" -msgstr "" - -#: src/stored/butil.c:297 -#, c-format -msgid "Using device: \"%s\" for reading.\n" -msgstr "" - -#: src/stored/butil.c:313 -msgid "Unexpected End of Data\n" -msgstr "" - -#: src/stored/butil.c:315 -msgid "Unexpected End of Tape\n" -msgstr "" - -#: src/stored/butil.c:317 -msgid "Unexpected End of File\n" -msgstr "" - -#: src/stored/butil.c:319 -msgid "Tape Door is Open\n" -msgstr "" - -#: src/stored/butil.c:321 -msgid "Unexpected Tape is Off-line\n" -msgstr "" - -#: src/stored/dde_status.c:149 -msgid "Dedupengine status:\n" -msgstr "" - -#: src/stored/dde_status.c:159 -#, c-format -msgid "" -" DDE: hash_count=%llu ref_count=%llu ref_size=%sB\n" -" ref_ratio=%.2f size_ratio=%.2f dde_errors=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:167 -#, c-format -msgid "" -" Config: bnum=%lld bmin=%lld bmax=%lld mlock_strategy=%ld mlocked=%lldMB " -"mlock_max=%lldMB\n" -msgstr "" - -#: src/stored/dde_status.c:173 -#, c-format -msgid " Addr: bad_addr=%llu bad_bucket=%llu wrong=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:178 -#, c-format -msgid "" -" Containers: chunk_allocated=%llu chunk_used=%llu\n" -" disk_space_allocated=%sB disk_space_used=%sB containers_errors=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:199 -#, c-format -msgid "" -" Vacuum: last_run=\"%s\" duration=%llus ref_count=%llu ref_size=%sB\n" -" vacuum_errors=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:205 -#, c-format -msgid " Stats: read_chunk=%llu query_hash=%llu new_hash=%llu calc_hash=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:213 -#, c-format -msgid " acc_container_cnt[%d]:%s %14llu\n" -msgstr "" - -#: src/stored/dde_status.c:226 -#, c-format -msgid " [%d]%s filesize=%sB/%sB usage=%llu/%llu/%llu %3llu%% %s\n" -msgstr "" - -#: src/stored/dde_status.c:239 -#, c-format -msgid " [%d]%s filesize=%sB/%sB usage=%llu/%llu/%llu %3llu%%\n" -msgstr "" - -#: src/stored/dde_vacuum.c:84 -#, c-format -msgid "" -"Skipping volume \"%s\" from vacuum process, the volume is only created in " -"the catalog.\n" -msgstr "" - -#: src/stored/dde_vacuum.c:91 -#, c-format -msgid "" -"Error: Volume \"%s\" (status %s) not found in %s. All volumes should be " -"available for a Vacuum. ERR=%s\n" -msgstr "" - -#: src/stored/dedupengine.c:384 -#, fuzzy -msgid "Initializing DDE." -msgstr "Initialiseren ..." - -#: src/stored/dedupengine.c:392 -msgid "DedupDirectory directive in Storage resource missing." -msgstr "" - -#: src/stored/dedupengine.c:399 -#, c-format -msgid "Cannot create DedupDirectory: %s" -msgstr "" - -#: src/stored/dedupengine.c:405 -#, c-format -msgid "Cannot create DedupIndexDirectory: %s" -msgstr "" - -#: src/stored/dedupengine.c:414 src/stored/dedupengine.c:421 -#, fuzzy, c-format -msgid "Cannot create recovery directory: %s" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/stored/dedupengine.c:428 -#, c-format -msgid "Cannot delete temporary recovery directory: %s" -msgstr "" - -#: src/stored/dedupengine.c:1246 -#, c-format -msgid "bucket version (%ld) is posterior to the software (%ld)\n" -msgstr "" - -#: src/stored/dedupengine.c:1772 -#, c-format -msgid "" -"The Deduplication Engine filesystem \"%s\" is full (only %sB free). Running " -"jobs will be stopped and marked as Incomplete. Extend the storage space and " -"run the vacuum procedure\n" -msgstr "" - -#: src/stored/dedupengine.c:1782 -#, c-format -msgid "" -"The Deduplication Engine filesystem \"%s\" is nearly full (%sB free). Please " -"run the vacuum procedure\n" -msgstr "" - -#: src/stored/dedupengine.c:1965 -msgid "Header not found in DDE index\n" -msgstr "" - -#: src/stored/dedupengine.c:1971 -msgid "DDE index bad magic in header\n" -msgstr "" - -#: src/stored/dedupengine.c:1976 -#, c-format -msgid "" -"Cannot open DDE because the version (%ld) is posterior to the software " -"(%ld)\n" -msgstr "" - -#: src/stored/dedupengine.c:1996 -#, c-format -msgid "Cannot open DDE, unknown hash ID: %ld\n" -msgstr "" - -#: src/stored/dedupstored.c:99 -#, c-format -msgid "Transport thread error: joining thread (%d)\n" -msgstr "" - -#: src/stored/dedupstored.c:208 -#, c-format -msgid "Socket error or stop during rehydration. ERR=%d\n" -msgstr "" - -#: src/stored/dedupstored.c:226 -#, c-format -msgid "Unexpected message from FD, n=%d msglen=%d msg=%s\n" -msgstr "" - -#: src/stored/dedupstored.c:415 -#, c-format -msgid "BAD HASH: computed=#%08x expected=#%08x size=%d\n" -msgstr "" - -#: src/stored/dedupstored.c:521 -#, c-format -msgid "GOT chunk #%08x, now do a CANCEL\n" -msgstr "" - -#: src/stored/dedupstored.c:528 -#, c-format -msgid "Received unexpected chunk #%08x\n" -msgstr "" - -#: src/stored/dedupstored.c:535 -#, c-format -msgid "Cannot lz4decode received chunk #%08x\n" -msgstr "" - -#: src/stored/dedupstored.c:541 -#, c-format -msgid "Received chunk #%08x with the wrong size %d (expected %ld) \n" -msgstr "" - -#: src/stored/dedupstored.c:550 -#, c-format -msgid "Received a chunk with a bad hash #%08x (expected #%08x) size=%d\n" -msgstr "" - -#: src/stored/dedupstored.c:585 -msgid "Ignore dedup flow control protocol error\n" -msgstr "" - -#: src/stored/dedupstored.c:599 -#, c-format -msgid "Ignore unknown inter-daemon command: %ld\n" -msgstr "" - -#: src/stored/dedupstored.c:678 -msgid "Got Dedup data but dedupengine is not started\n" -msgstr "" - -#: src/stored/dedupstored.c:718 -#, fuzzy -msgid "Error sending chunk request to client\n" -msgstr "Geen Volumes gevonden om terug te zetten.\n" - -#: src/stored/dev.c:146 -#, c-format -msgid "Unable to stat device %s: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:164 -#, c-format -msgid "" -"%s is an unknown device type. Must be tape or directory\n" -" or have RequiresMount=yes for DVD. st_mode=%x\n" -msgstr "" - -#: src/stored/dev.c:177 -msgid "DVD support is now deprecated.\n" -msgstr "" - -#: src/stored/dev.c:180 -msgid "Aligned device not supported. Please use \"DeviceType = File\"\n" -msgstr "" - -#: src/stored/dev.c:183 -msgid "Deduplication device not supported. Please use \"DeviceType = File\"\n" -msgstr "" - -#: src/stored/dev.c:212 -msgid "Deduplication device not properly configured.\n" -msgstr "" - -#: src/stored/dev.c:303 -#, c-format -msgid "Using default block size %u on dedup device %s\n" -msgstr "" - -#: src/stored/dev.c:341 -#, c-format -msgid "Unable to stat mount point %s: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:346 -msgid "" -"Mount and unmount commands must defined for a device which requires mount.\n" -msgstr "" - -#: src/stored/dev.c:362 -#, c-format -msgid "Min block size > max on device %s\n" -msgstr "" - -#: src/stored/dev.c:366 -#, c-format -msgid "Block size %u on device %s is too large, using default %u\n" -msgstr "" - -#: src/stored/dev.c:371 -#, c-format -msgid "Max block size %u not multiple of device %s block size=%d.\n" -msgstr "" - -#: src/stored/dev.c:375 -#, c-format -msgid "Max Vol Size < 8 * Max Block Size for device %s\n" -msgstr "" - -#: src/stored/dev.c:391 src/stored/dev.c:397 -#, c-format -msgid "Unable to init cond variable: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:403 -#, fuzzy, c-format -msgid "Unable to init spool mutex: ERR=%s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/stored/dev.c:409 -#, fuzzy, c-format -msgid "Unable to init acquire mutex: ERR=%s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/stored/dev.c:415 -#, fuzzy, c-format -msgid "Unable to init read acquire mutex: ERR=%s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/stored/dev.c:421 -#, fuzzy, c-format -msgid "Unable to init adata mutex: ERR=%s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/stored/dev.c:427 -#, fuzzy, c-format -msgid "Unable to init volcat mutex: ERR=%s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/stored/dev.c:433 -#, fuzzy, c-format -msgid "Unable to init dcrs mutex: ERR=%s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/stored/dev.c:523 -msgid "Illegal mode given to open dev.\n" -msgstr "" - -#: src/stored/dev.c:575 -msgid "Bad device call. Device not open\n" -msgstr "" - -#: src/stored/dev.c:587 -#, c-format -msgid "Seek error: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:588 src/stored/file_dev.c:78 src/stored/file_dev.c:105 -#: src/stored/tape_dev.c:294 -#, c-format -msgid "lseek error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/device.c:126 -#, c-format -msgid "End of medium on Volume \"%s\" Bytes=%s Blocks=%s at %s.\n" -msgstr "" - -#: src/stored/device.c:157 -#, c-format -msgid "New volume \"%s\" mounted on device %s at %s.\n" -msgstr "" - -#: src/stored/device.c:169 -#, c-format -msgid "write_block_to_device Volume label failed. ERR=%s" -msgstr "" - -#: src/stored/device.c:201 -#, c-format -msgid "write_block_to_device overflow block failed. ERR=%s" -msgstr "" - -#: src/stored/device.c:206 -#, c-format -msgid "Catastrophic error. Cannot write overflow block to device %s. ERR=%s" -msgstr "" - -#: src/stored/device.c:367 src/stored/tape_dev.c:161 -#, c-format -msgid "Unable to open device %s: ERR=%s\n" -msgstr "" - -#: src/stored/device.c:369 -#, c-format -msgid "Unable to open archive %s: ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:164 -#, c-format -msgid "Connection request from %s failed.\n" -msgstr "" - -#: src/stored/dircmd.c:202 -msgid "Unable to authenticate Director\n" -msgstr "" - -#: src/stored/dircmd.c:296 -#, c-format -msgid "Bad client command: %s" -msgstr "" - -#: src/stored/dircmd.c:306 -#, fuzzy -msgid "Client daemon" -msgstr "Client" - -#: src/stored/dircmd.c:309 -#, fuzzy, c-format -msgid "Failed to connect to Client daemon: %s:%d\n" -msgstr "Verbinden met de director mislukt\n" - -#: src/stored/dircmd.c:387 -msgid "In storage_cmd port==0, no prior Storage connection.\n" -msgstr "" - -#: src/stored/dircmd.c:439 -#, c-format -msgid "3991 Bad setdebug command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:484 -msgid "3000 Deduplication vacuum marked to be canceled.\n" -msgstr "" - -#: src/stored/dircmd.c:486 -msgid "3900 No deduplication vacuum process found.\n" -msgstr "" - -#: src/stored/dircmd.c:490 -msgid "3903 Error scanning cancel command.\n" -msgstr "" - -#: src/stored/dircmd.c:494 -#, c-format -msgid "3904 Job %s not found.\n" -msgstr "" - -#: src/stored/dircmd.c:523 -#, c-format -msgid "3000 JobId=%ld Job=\"%s\" marked to be %s.\n" -msgstr "" - -#: src/stored/dircmd.c:602 src/stored/dircmd.c:1003 src/stored/dircmd.c:1163 -#: src/stored/dircmd.c:1274 src/stored/dircmd.c:1396 src/stored/dircmd.c:1438 -#, c-format -msgid "3999 Device \"%s\" not found or could not be opened.\n" -msgstr "" - -#: src/stored/dircmd.c:607 -#, c-format -msgid "3903 Error scanning label command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:659 -#, c-format -msgid "3910 Unable to open device \"%s\": ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:676 -#, c-format -msgid "3920 Cannot label Volume because it is already labeled: \"%s\"\n" -msgstr "" - -#: src/stored/dircmd.c:683 -msgid "3921 Wrong volume mounted.\n" -msgstr "" - -#: src/stored/dircmd.c:687 -msgid "3922 Cannot relabel an ANSI/IBM labeled Volume.\n" -msgstr "" - -#: src/stored/dircmd.c:695 -#, c-format -msgid "3912 Failed to label Volume: ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:711 -#, c-format -msgid "3915 Failed to label Volume: ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:714 -#, c-format -msgid "3914 Failed to label Volume (no media): ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:717 -#, c-format -msgid "3913 Cannot label Volume. Unknown status %d from read_volume_label()\n" -msgstr "" - -#: src/stored/dircmd.c:755 -#, c-format -msgid "3001 Mounted Volume: %s\n" -msgstr "" - -#: src/stored/dircmd.c:759 src/stored/dircmd.c:1474 -#, c-format -msgid "" -"3902 Cannot mount Volume on Storage Device \"%s\" because:\n" -"%s" -msgstr "" - -#: src/stored/dircmd.c:790 src/stored/reserve.c:648 -#, c-format -msgid "" -"\n" -" Device \"%s\" requested by DIR could not be opened or does not exist.\n" -msgstr "" - -#: src/stored/dircmd.c:812 src/stored/reserve.c:644 -#, c-format -msgid "" -"\n" -" Device \"%s\" in changer \"%s\" requested by DIR could not be opened or " -"does not exist.\n" -msgstr "" - -#: src/stored/dircmd.c:876 -msgid "Specified slot ignored. " -msgstr "" - -#: src/stored/dircmd.c:896 src/stored/dircmd.c:959 -#, c-format -msgid "3901 Unable to open device \"%s\": ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:917 src/stored/dircmd.c:947 -#, c-format -msgid "3001 Device \"%s\" is mounted with Volume \"%s\"\n" -msgstr "" - -#: src/stored/dircmd.c:920 src/stored/dircmd.c:950 src/stored/dircmd.c:969 -#, c-format -msgid "" -"3905 Device \"%s\" open but no Bacula volume is mounted.\n" -"If this is not a blank tape, try unmounting and remounting the Volume.\n" -msgstr "" - -#: src/stored/dircmd.c:931 -#, c-format -msgid "3001 Device \"%s\" is doing acquire.\n" -msgstr "" - -#: src/stored/dircmd.c:936 src/stored/dircmd.c:1134 -#, c-format -msgid "3903 Device \"%s\" is being labeled.\n" -msgstr "" - -#: src/stored/dircmd.c:966 -#, c-format -msgid "3001 Device \"%s\" is already mounted with Volume \"%s\"\n" -msgstr "" - -#: src/stored/dircmd.c:979 -#, c-format -msgid "3002 Device \"%s\" is mounted.\n" -msgstr "" - -#: src/stored/dircmd.c:981 src/stored/dircmd.c:1103 src/stored/dircmd.c:1122 -#: src/stored/dircmd.c:1154 -#, c-format -msgid "3907 %s" -msgstr "" - -#: src/stored/dircmd.c:984 -#, c-format -msgid "3906 File device \"%s\" is always mounted.\n" -msgstr "" - -#: src/stored/dircmd.c:993 -#, c-format -msgid "3930 Device \"%s\" is being released.\n" -msgstr "" - -#: src/stored/dircmd.c:997 -#, c-format -msgid "3905 Unknown wait state %d\n" -msgstr "" - -#: src/stored/dircmd.c:1007 -#, c-format -msgid "3909 Error scanning mount command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1032 -#, c-format -msgid "3002 Device \"%s\" enabled.\n" -msgstr "" - -#: src/stored/dircmd.c:1039 -#, c-format -msgid "3907 Error scanning \"enable\" command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1064 -#, c-format -msgid "3002 Device \"%s\" disabled.\n" -msgstr "" - -#: src/stored/dircmd.c:1071 -#, c-format -msgid "3907 Error scanning \"disable\" command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1100 src/stored/dircmd.c:1156 -#, c-format -msgid "3002 Device \"%s\" unmounted.\n" -msgstr "" - -#: src/stored/dircmd.c:1107 -#, c-format -msgid "3901 Device \"%s\" is already unmounted.\n" -msgstr "" - -#: src/stored/dircmd.c:1125 -#, c-format -msgid "3001 Device \"%s\" unmounted.\n" -msgstr "" - -#: src/stored/dircmd.c:1130 -#, c-format -msgid "3902 Device \"%s\" is busy in acquire.\n" -msgstr "" - -#: src/stored/dircmd.c:1168 -#, c-format -msgid "3907 Error scanning unmount command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1196 -msgid "3916 Error scanning action_on_purge command\n" -msgstr "" - -#: src/stored/dircmd.c:1239 -#, c-format -msgid "3921 Device \"%s\" already released.\n" -msgstr "" - -#: src/stored/dircmd.c:1246 -#, c-format -msgid "3922 Device \"%s\" waiting for sysop.\n" -msgstr "" - -#: src/stored/dircmd.c:1252 -#, c-format -msgid "3922 Device \"%s\" waiting for mount.\n" -msgstr "" - -#: src/stored/dircmd.c:1256 -#, c-format -msgid "3923 Device \"%s\" is busy in acquire.\n" -msgstr "" - -#: src/stored/dircmd.c:1260 -#, c-format -msgid "3914 Device \"%s\" is being labeled.\n" -msgstr "" - -#: src/stored/dircmd.c:1268 -#, c-format -msgid "3022 Device \"%s\" released.\n" -msgstr "" - -#: src/stored/dircmd.c:1279 -#, c-format -msgid "3927 Error scanning release command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1308 -#, c-format -msgid "Could not create bootstrap file %s: ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:1321 -msgid "Error parsing bootstrap file.\n" -msgstr "" - -#: src/stored/dircmd.c:1383 -#, c-format -msgid "3998 Device \"%s\" is not an autochanger.\n" -msgstr "" - -#: src/stored/dircmd.c:1400 -#, c-format -msgid "3909 Error scanning autochanger drives/list/slots command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1442 -#, c-format -msgid "3909 Error scanning readlabel command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1470 -#, c-format -msgid "3001 Volume=%s Slot=%d\n" -msgstr "" - -#: src/stored/dircmd.c:1502 -#, c-format -msgid "3931 Device \"%s\" is BLOCKED. user unmounted.\n" -msgstr "" - -#: src/stored/dircmd.c:1506 -#, c-format -msgid "" -"3932 Device \"%s\" is BLOCKED. user unmounted during wait for media/mount.\n" -msgstr "" - -#: src/stored/dircmd.c:1510 -#, c-format -msgid "3933 Device \"%s\" is BLOCKED waiting for media.\n" -msgstr "" - -#: src/stored/dircmd.c:1514 -#, c-format -msgid "3934 Device \"%s\" is being initialized.\n" -msgstr "" - -#: src/stored/dircmd.c:1518 -#, c-format -msgid "3935 Device \"%s\" is blocked labeling a Volume.\n" -msgstr "" - -#: src/stored/dircmd.c:1522 -#, c-format -msgid "3935 Device \"%s\" is blocked for unknown reason.\n" -msgstr "" - -#: src/stored/dircmd.c:1527 -#, c-format -msgid "3936 Device \"%s\" is busy reading.\n" -msgstr "" - -#: src/stored/dircmd.c:1530 -#, c-format -msgid "3937 Device \"%s\" is busy with writers=%d reserved=%d.\n" -msgstr "" - -#: src/stored/dircmd.c:1550 -#, c-format -msgid "" -"3999 Device \"%s\" requested by DIR could not be locked for shared storage.\n" -msgstr "" - -#: src/stored/dvd.c:252 -#, c-format -msgid "Error writing part %d to the DVD: ERR=%s\n" -msgstr "" - -#: src/stored/dvd.c:254 -#, c-format -msgid "Error while writing current part to the DVD: %s" -msgstr "" - -#: src/stored/dvd.c:264 -#, c-format -msgid "Part %d (%lld bytes) written to DVD.\n" -msgstr "" - -#: src/stored/dvd.c:281 -#, c-format -msgid "Remaining free space %s on %s\n" -msgstr "" - -#: src/stored/dvd.c:347 -#, c-format -msgid "Next Volume part already exists on DVD. Cannot continue: %s\n" -msgstr "" - -#: src/stored/dvd.c:552 -#, c-format -msgid "" -"Error writing. Current part less than total number of parts (%d/%d, device=" -"%s)\n" -msgstr "" - -#: src/stored/dvd.c:559 -#, c-format -msgid "Unable to write last on %s: ERR=%s\n" -msgstr "" - -#: src/stored/fd_cmds.c:209 -#, c-format -msgid "Command error with FD, hanging up. ERR=%s\n" -msgstr "" - -#: src/stored/fd_cmds.c:212 -msgid "Command error with FD, hanging up.\n" -msgstr "" - -#: src/stored/fd_cmds.c:223 -#, c-format -msgid "FD command not found: %s\n" -msgstr "" - -#: src/stored/fd_cmds.c:254 -msgid "Attempt to append on non-open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:266 src/stored/fd_cmds.c:309 -msgid "Attempt to close non-open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:284 -msgid "Attempt to open already open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:338 -msgid "Attempt to read on non-open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:356 -msgid "Attempt to open an already open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:372 -msgid "Cannot open session, received bad parameters.\n" -msgstr "" - -#: src/stored/file_dev.c:95 src/stored/tape_dev.c:859 -msgid "Bad call to reposition. Device not open\n" -msgstr "" - -#: src/stored/file_dev.c:157 -#, c-format -msgid "Could not open file device %s. No Volume name given.\n" -msgstr "" - -#: src/stored/file_dev.c:183 -#, fuzzy, c-format -msgid "Could not open(%s,%s,0640): ERR=%s\n" -msgstr "Kan Client niet vinden %s: ERR=%s" - -#: src/stored/file_dev.c:202 -#, fuzzy, c-format -msgid "Could not open aligned volume: %s, ERR=%s\n" -msgstr "Kan Client niet vinden %s: ERR=%s" - -#: src/stored/file_dev.c:255 -#, c-format -msgid "Unable to truncate device %s. ERR=%s\n" -msgstr "" - -#: src/stored/file_dev.c:272 -#, c-format -msgid "Unable to stat device %s. ERR=%s\n" -msgstr "" - -#: src/stored/file_dev.c:289 -#, c-format -msgid "Device %s doesn't support ftruncate(). Recreating file %s.\n" -msgstr "" - -#: src/stored/file_dev.c:301 -#, c-format -msgid "Could not reopen: %s, ERR=%s\n" -msgstr "" - -#: src/stored/file_dev.c:379 src/stored/tape_dev.c:1024 -#, c-format -msgid "Device %s cannot be %smounted. ERR=%s\n" -msgstr "" - -#: src/stored/hello.c:138 -#, c-format -msgid "" -"Connection from unknown Director %s at %s rejected.\n" -"Please see " -msgstr "" - -#: src/stored/hello.c:165 -#, c-format -msgid "Invalid connection from %s. Len=%d\n" -msgstr "" - -#: src/stored/hello.c:179 -#, c-format -msgid "Invalid Hello from %s. Len=%d\n" -msgstr "" - -#: src/stored/hello.c:184 -#, c-format -msgid "Client connect failed: Job name not found: %s\n" -msgstr "" - -#: src/stored/hello.c:193 -#, c-format -msgid "" -"A Client \"%s\" tried to authenticate for Job %s, but the Job is already " -"authenticated with \"%s\".\n" -msgstr "" - -#: src/stored/hello.c:227 -#, c-format -msgid "" -"A Client \"%s\" tried to authenticate for Job %s, but the job is already " -"authenticated.\n" -msgstr "" - -#: src/stored/hello.c:234 src/stored/job.c:197 -msgid "Unable to authenticate File daemon\n" -msgstr "" - -#: src/stored/hello.c:292 -msgid "Client socket not open. Could not connect to Client.\n" -msgstr "" - -#: src/stored/hello.c:308 src/stored/hello.c:310 -#, fuzzy, c-format -msgid "Recv request to Client failed. ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/stored/hello.c:315 src/stored/hello.c:316 -#, c-format -msgid "Bad Hello from Client: %s.\n" -msgstr "" - -#: src/stored/hello.c:442 src/stored/hello.c:444 -#, fuzzy, c-format -msgid "Send caps to Client failed. ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/stored/hello.c:457 src/stored/hello.c:459 -#, fuzzy, c-format -msgid "Recv caps from Client failed. ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/stored/hello.c:463 -#, c-format -msgid "Recv bad caps from Client: %s.\n" -msgstr "" - -#: src/stored/hello.c:464 -#, c-format -msgid "Recv bad caps from Client %s\n" -msgstr "" - -#: src/stored/job.c:353 -msgid "In free_jcr(), but still attached to device!!!!\n" -msgstr "" - -#: src/stored/label.c:90 -#, fuzzy, c-format -msgid "Couldn't rewind %s device %s: ERR=%s\n" -msgstr "Kan Client niet vinden %s: ERR=%s" - -#: src/stored/label.c:108 src/stored/label.c:204 -#, c-format -msgid "Wrong Volume mounted on %s device %s: Wanted %s have %s\n" -msgstr "" - -#: src/stored/label.c:111 src/stored/label.c:192 -#, c-format -msgid "Too many tries: %s" -msgstr "" - -#: src/stored/label.c:128 -#, c-format -msgid "" -"Requested Volume \"%s\" on %s device %s is not a Bacula labeled Volume, " -"because: ERR=%s" -msgstr "" - -#: src/stored/label.c:133 -msgid "Could not read Volume label from block.\n" -msgstr "" - -#: src/stored/label.c:136 -#, c-format -msgid "Could not unserialize Volume label: ERR=%s\n" -msgstr "" - -#: src/stored/label.c:144 -#, c-format -msgid "Volume Header Id bad: %s\n" -msgstr "" - -#: src/stored/label.c:177 -#, c-format -msgid "Volume on %s device %s has wrong Bacula version. Wanted %d got %d\n" -msgstr "" - -#: src/stored/label.c:188 -#, c-format -msgid "Volume on %s device %s has bad Bacula label type: %x\n" -msgstr "" - -#: src/stored/label.c:225 -#, fuzzy, c-format -msgid "Got Aligned or File type Volume %s on Dedup device %s. Wanted File.\n" -msgstr "Nieuw volume \"%s\" aangemaakt in catalogus.\n" - -#: src/stored/label.c:235 -#, fuzzy, c-format -msgid "Got Aligned or Dedup type Volume %s on File device %s. Wanted File.\n" -msgstr "Nieuw volume \"%s\" aangemaakt in catalogus.\n" - -#: src/stored/label.c:245 -#, fuzzy, c-format -msgid "" -"Got File or Dedup type Volume %s on Aligned device %s. Wanted Aligned.\n" -msgstr "Nieuw volume \"%s\" aangemaakt in catalogus.\n" - -#: src/stored/label.c:274 src/stored/label.c:467 src/stored/mount.c:502 -#, fuzzy, c-format -msgid "Could not reserve volume %s on %s device %s\n" -msgstr "Kan Client niet vinden %s: ERR=%s" - -#: src/stored/label.c:364 -#, c-format -msgid "Cannot write Volume label to block for %s device %s\n" -msgstr "" - -#: src/stored/label.c:431 src/stored/label.c:587 -#, c-format -msgid "Open %s device %s Volume \"%s\" failed: ERR=%s\n" -msgstr "" - -#: src/stored/label.c:601 -#, fuzzy, c-format -msgid "Rewind error on %s device %s: ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/stored/label.c:609 -#, fuzzy, c-format -msgid "Truncate error on %s device %s: ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/stored/label.c:616 -#, c-format -msgid "Failed to re-open DVD after truncate on %s device %s: ERR=%s\n" -msgstr "" - -#: src/stored/label.c:661 -#, fuzzy, c-format -msgid "Unable to write %s device %s: ERR=%s\n" -msgstr "Lees fout op bestand %s. FOUT=%s\n" - -#: src/stored/label.c:695 -#, c-format -msgid "Recycled volume \"%s\" on %s device %s, all previous data lost.\n" -msgstr "" - -#: src/stored/label.c:698 -#, c-format -msgid "Wrote label to prelabeled Volume \"%s\" on %s device %s\n" -msgstr "" - -#: src/stored/label.c:940 -#, c-format -msgid "Bad Volume session label request=%d\n" -msgstr "" - -#: src/stored/label.c:1004 -#, c-format -msgid "Expecting Volume Label, got FI=%s Stream=%s len=%d\n" -msgstr "" - -#: src/stored/label.c:1144 -#, c-format -msgid "Unknown %d" -msgstr "" - -#: src/stored/label.c:1148 -#, c-format -msgid "" -"\n" -"Volume Label:\n" -"Adata : %d\n" -"Id : %sVerNo : %d\n" -"VolName : %s\n" -"PrevVolName : %s\n" -"VolFile : %d\n" -"LabelType : %s\n" -"LabelSize : %d\n" -"PoolName : %s\n" -"MediaType : %s\n" -"PoolType : %s\n" -"HostName : %s\n" -msgstr "" - -#: src/stored/label.c:1172 -#, c-format -msgid "Date label written: %s\n" -msgstr "" - -#: src/stored/label.c:1178 -#, c-format -msgid "Date label written: %04d-%02d-%02d at %02d:%02d\n" -msgstr "" - -#: src/stored/label.c:1198 -#, c-format -msgid "" -"\n" -"%s Record:\n" -"JobId : %d\n" -"VerNum : %d\n" -"PoolName : %s\n" -"PoolType : %s\n" -"JobName : %s\n" -"ClientName : %s\n" -msgstr "" - -#: src/stored/label.c:1211 -#, c-format -msgid "" -"Job (unique name) : %s\n" -"FileSet : %s\n" -"JobType : %c\n" -"JobLevel : %c\n" -msgstr "" - -#: src/stored/label.c:1220 -#, c-format -msgid "" -"JobFiles : %s\n" -"JobBytes : %s\n" -"StartBlock : %s\n" -"EndBlock : %s\n" -"StartFile : %s\n" -"EndFile : %s\n" -"JobErrors : %s\n" -"JobStatus : %c\n" -msgstr "" - -#: src/stored/label.c:1241 -#, c-format -msgid "Date written : %s\n" -msgstr "" - -#: src/stored/label.c:1246 -#, c-format -msgid "Date written : %04d-%02d-%02d at %02d:%02d\n" -msgstr "" - -#: src/stored/label.c:1258 -msgid "***** ERROR ****** : Found error with the JobId\n" -msgstr "" - -#: src/stored/label.c:1278 -msgid "***** ERROR ****** : Found error with the JobLevel\n" -msgstr "" - -#: src/stored/label.c:1298 -msgid "***** ERROR ****** : Found error with the JobType\n" -msgstr "" - -#: src/stored/label.c:1305 -#, c-format -msgid "***** ERROR ****** : Found error with the Job name %s\n" -msgstr "" - -#: src/stored/label.c:1326 -msgid "Fresh Volume" -msgstr "" - -#: src/stored/label.c:1329 -msgid "Volume" -msgstr "" - -#: src/stored/label.c:1338 src/stored/read_records.c:406 -msgid "End of Media" -msgstr "" - -#: src/stored/label.c:1341 -msgid "End of Tape" -msgstr "" - -#: src/stored/label.c:1360 src/stored/label.c:1368 src/stored/label.c:1407 -#, c-format -msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d DataLen=%d\n" -msgstr "" - -#: src/stored/label.c:1365 -msgid "Bacula \"End of Tape\" label found.\n" -msgstr "" - -#: src/stored/label.c:1380 src/stored/label.c:1392 -#, c-format -msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d\n" -msgstr "" - -#: src/stored/label.c:1382 -#, c-format -msgid " Job=%s Date=%s Level=%c Type=%c\n" -msgstr "" - -#: src/stored/label.c:1394 -#, c-format -msgid " Date=%s Level=%c Type=%c Files=%s Bytes=%s Errors=%d Status=%c\n" -msgstr "" - -#: src/stored/lock.c:266 src/stored/lock.c:299 -#, c-format -msgid "pthread_cond_wait failure. ERR=%s\n" -msgstr "" - -#: src/stored/lock.c:608 -msgid "unknown blocked code" -msgstr "" - -#: src/stored/mount.c:89 -#, c-format -msgid "Too many errors trying to mount %s device %s.\n" -msgstr "" - -#: src/stored/mount.c:97 -#, c-format -msgid "Job %d canceled.\n" -msgstr "" - -#: src/stored/mount.c:218 -#, c-format -msgid "Open of %s device %s Volume \"%s\" failed: ERR=%s\n" -msgstr "" - -#: src/stored/mount.c:296 -#, c-format -msgid "Volume \"%s\" previously written, moving to end of data.\n" -msgstr "" - -#: src/stored/mount.c:302 -#, fuzzy, c-format -msgid "Unable to position to end of data on %s device %s: ERR=%s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/stored/mount.c:446 src/stored/mount.c:835 -#, fuzzy, c-format -msgid "Volume \"%s\" not loaded on %s device %s.\n" -msgstr "Job \"%s\" niet gevonden.\n" - -#: src/stored/mount.c:482 -#, c-format -msgid "" -"Director wanted Volume \"%s\".\n" -" Current Volume \"%s\" not acceptable because:\n" -" %s" -msgstr "" - -#: src/stored/mount.c:660 -#, c-format -msgid "Ready to append to end of Volume \"%s\" part=%d size=%s\n" -msgstr "" - -#: src/stored/mount.c:664 -#, c-format -msgid "" -"Bacula cannot write on DVD Volume \"%s\" because: The sizes do not match! " -"Volume=%s Catalog=%s\n" -msgstr "" - -#: src/stored/mount.c:678 -#, c-format -msgid "Ready to append to end of Volume \"%s\" at file=%d.\n" -msgstr "" - -#: src/stored/mount.c:681 -#, c-format -msgid "" -"For Volume \"%s\":\n" -"The number of files mismatch! Volume=%u Catalog=%u\n" -"Correcting Catalog\n" -msgstr "" - -#: src/stored/mount.c:688 src/stored/mount.c:747 -msgid "Error updating Catalog\n" -msgstr "" - -#: src/stored/mount.c:693 -#, c-format -msgid "" -"Bacula cannot write on tape Volume \"%s\" because:\n" -"The number of files mismatch! Volume=%u Catalog=%u\n" -msgstr "" - -#: src/stored/mount.c:717 -#, c-format -msgid "Ready to append to end of Volumes \"%s\" ameta size=%s adata size=%s\n" -msgstr "" - -#: src/stored/mount.c:722 -#, c-format -msgid "Ready to append to end of Volume \"%s\" size=%s\n" -msgstr "" - -#: src/stored/mount.c:729 -#, c-format -msgid "" -"For Volume \"%s\":\n" -" The sizes do not match! Metadata Volume=%s Catalog=%s\n" -" Correcting Catalog\n" -msgstr "" - -#: src/stored/mount.c:736 -#, c-format -msgid "" -"For aligned Volume \"%s\":\n" -" Aligned sizes do not match! Aligned Volume=%s Catalog=%s\n" -" Correcting Catalog\n" -msgstr "" - -#: src/stored/mount.c:752 -#, c-format -msgid "" -"Bacula cannot write on disk Volume \"%s\" because: The sizes do not match! " -"Volume=%s Catalog=%s\n" -msgstr "" - -#: src/stored/mount.c:818 -#, fuzzy, c-format -msgid "Labeled new Volume \"%s\" on %s device %s.\n" -msgstr "Nieuw volume \"%s\" aangemaakt in catalogus.\n" - -#: src/stored/mount.c:829 -#, c-format -msgid "%s device %s not configured to autolabel Volumes.\n" -msgstr "" - -#: src/stored/mount.c:853 -#, c-format -msgid "Marking Volume \"%s\" in Error in Catalog.\n" -msgstr "" - -#: src/stored/mount.c:870 -#, c-format -msgid "" -"Autochanger Volume \"%s\" not found in slot %d.\n" -" Setting InChanger to zero in catalog.\n" -msgstr "" - -#: src/stored/mount.c:889 -msgid "Hey!!!!! WroteVol non-zero !!!!!\n" -msgstr "" - -#: src/stored/mount.c:939 -#, c-format -msgid "" -"Invalid tape position on volume \"%s\" on device %s. Expected %d, got %d\n" -msgstr "" - -#: src/stored/mount.c:980 -#, c-format -msgid "Cannot open %s Dev=%s, Vol=%s for reading.\n" -msgstr "" - -#: src/stored/os.c:126 -#, c-format -msgid "Unable to set eotmodel on device %s: ERR=%s\n" -msgstr "" - -#: src/stored/os.c:180 -msgid " Bacula status:" -msgstr "" - -#: src/stored/os.c:181 src/stored/os.c:264 src/stored/os.c:266 -#, c-format -msgid " file=%d block=%d\n" -msgstr "" - -#: src/stored/os.c:185 src/stored/tape_dev.c:345 -#, c-format -msgid "ioctl MTIOCGET error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/os.c:189 -msgid " Device status:" -msgstr "" - -#: src/stored/os.c:365 -#, c-format -msgid "unknown func code %d" -msgstr "" - -#: src/stored/os.c:371 -#, c-format -msgid "I/O function \"%s\" not supported on this device.\n" -msgstr "" - -#: src/stored/parse_bsr.c:116 -#, c-format -msgid "Cannot open bootstrap file %s: %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:220 -#, c-format -msgid "Device \"%s\" in bsr at inappropriate place.\n" -msgstr "" - -#: src/stored/parse_bsr.c:283 -#, c-format -msgid "REGEX '%s' compile error. ERR=%s\n" -msgstr "" - -#: src/stored/parse_bsr.c:326 -msgid "JobType not yet implemented\n" -msgstr "" - -#: src/stored/parse_bsr.c:334 -msgid "JobLevel not yet implemented\n" -msgstr "" - -#: src/stored/parse_bsr.c:379 -#, c-format -msgid "MediaType %s in bsr at inappropriate place.\n" -msgstr "" - -#: src/stored/parse_bsr.c:684 -#, c-format -msgid "Slot %d in bsr at inappropriate place.\n" -msgstr "" - -#: src/stored/parse_bsr.c:708 -#, c-format -msgid "VolFile : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:716 -#, c-format -msgid "VolBlock : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:724 -#, c-format -msgid "VolAddr : %llu-%llu\n" -msgstr "" - -#: src/stored/parse_bsr.c:733 -#, c-format -msgid "FileIndex : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:735 -#, c-format -msgid "FileIndex : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:745 -#, c-format -msgid "JobId : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:747 -#, c-format -msgid "JobId : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:757 -#, c-format -msgid "SessId : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:759 -#, c-format -msgid "SessId : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:768 -#, c-format -msgid "VolumeName : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:769 -#, c-format -msgid " MediaType : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:770 -#, c-format -msgid " Device : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:771 -#, c-format -msgid " Slot : %d\n" -msgstr "" - -#: src/stored/parse_bsr.c:780 -#, c-format -msgid "Client : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:788 -#, c-format -msgid "Job : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:796 -#, c-format -msgid "SessTime : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:807 -msgid "BSR is NULL\n" -msgstr "" - -#: src/stored/parse_bsr.c:811 -#, c-format -msgid "Next : 0x%x\n" -msgstr "" - -#: src/stored/parse_bsr.c:812 -#, c-format -msgid "Root bsr : 0x%x\n" -msgstr "" - -#: src/stored/parse_bsr.c:824 -#, c-format -msgid "count : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:825 -#, c-format -msgid "found : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:828 -#, c-format -msgid "done : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:829 -#, c-format -msgid "positioning : %d\n" -msgstr "" - -#: src/stored/parse_bsr.c:830 -#, c-format -msgid "fast_reject : %d\n" -msgstr "" - -#: src/stored/parse_bsr.c:1054 src/stored/parse_bsr.c:1058 -#, c-format -msgid "" -"Bootstrap file error: %s\n" -" : Line %d, col %d of file %s\n" -"%s\n" -msgstr "" - -#: src/stored/read.c:56 -msgid "No Volume names found for restore.\n" -msgstr "" - -#: src/stored/read.c:201 src/stored/read.c:360 -#, c-format -msgid ">filed: Error Hdr=%s\n" -msgstr "" - -#: src/stored/read.c:202 -#, fuzzy, c-format -msgid "Error sending header to Client. ERR=%s\n" -msgstr "Geen Volumes gevonden om terug te zetten.\n" - -#: src/stored/read.c:248 src/stored/read.c:376 -#, c-format -msgid "Error sending to FD. ERR=%s\n" -msgstr "" - -#: src/stored/read.c:249 -#, fuzzy, c-format -msgid "Error sending data to Client. ERR=%s\n" -msgstr "Geen Volumes gevonden om terug te zetten.\n" - -#: src/stored/read.c:332 src/stored/read.c:361 src/stored/read.c:377 -#, c-format -msgid "Error sending to File daemon. ERR=%s\n" -msgstr "" - -#: src/stored/read_records.c:79 -#, c-format -msgid "End of Volume at file %u on device %s, Volume \"%s\"\n" -msgstr "" - -#: src/stored/read_records.c:83 -msgid "End of all volumes.\n" -msgstr "" - -#: src/stored/read_records.c:133 -msgid "Did fsr in attemp to skip bad record.\n" -msgstr "" - -#: src/stored/read_records.c:375 -#, c-format -msgid "Forward spacing Volume \"%s\" to file:block %u:%u.\n" -msgstr "" - -#: src/stored/read_records.c:399 -msgid "Begin Session" -msgstr "" - -#: src/stored/read_records.c:403 -msgid "End Session" -msgstr "" - -#: src/stored/read_records.c:409 -#, c-format -msgid "Unknown code %d\n" -msgstr "" - -#: src/stored/record_util.c:62 -#, c-format -msgid "unknown: %d" -msgstr "" - -#: src/stored/reserve.c:65 -#, c-format -msgid "Unable to initialize reservation lock. ERR=%s\n" -msgstr "" - -#: src/stored/reserve.c:145 -#, c-format -msgid "Hey! num_writers=%d!!!!\n" -msgstr "" - -#: src/stored/reserve.c:260 -msgid "3939 Could not get dcr\n" -msgstr "" - -#: src/stored/reserve.c:369 -#, c-format -msgid "Device reservation failed for JobId=%d: %s\n" -msgstr "" - -#: src/stored/reserve.c:378 -#, c-format -msgid "Failed command: %s\n" -msgstr "" - -#: src/stored/reserve.c:654 -#, c-format -msgid "" -"\n" -" Device \"%s\" requested by DIR is disabled.\n" -msgstr "" - -#: src/stored/reserve.c:669 -#, c-format -msgid "3926 Could not get dcr for device: %s\n" -msgstr "" - -#: src/stored/reserve.c:809 -#, c-format -msgid "3603 JobId=%u %s device %s is busy reading.\n" -msgstr "" - -#: src/stored/reserve.c:818 -#, c-format -msgid "3604 JobId=%u %s device %s is BLOCKED due to user unmount.\n" -msgstr "" - -#: src/stored/reserve.c:866 -#, c-format -msgid "3601 JobId=%u %s device %s is BLOCKED due to user unmount.\n" -msgstr "" - -#: src/stored/reserve.c:874 -#, c-format -msgid "" -"3602 JobId=%u %s device %s is busy (already reading/writing). read=%d, " -"writers=%d reserved=%d\n" -msgstr "" - -#: src/stored/reserve.c:913 -#, c-format -msgid "3609 JobId=%u Max concurrent jobs=%d exceeded on %s device %s.\n" -msgstr "" - -#: src/stored/reserve.c:931 -#, c-format -msgid "" -"3610 JobId=%u Aligned volume max bytes does not allow concurrency on drive " -"%s.\n" -msgstr "" - -#: src/stored/reserve.c:941 -#, c-format -msgid "3611 JobId=%u Volume max jobs=%d exceeded on %s device %s.\n" -msgstr "" - -#: src/stored/reserve.c:966 -#, c-format -msgid "" -"3608 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" nreserve=%d on %s " -"device %s.\n" -msgstr "" - -#: src/stored/reserve.c:1018 -#, c-format -msgid "3605 JobId=%u wants free drive but %s device %s is busy.\n" -msgstr "" - -#: src/stored/reserve.c:1027 -#, c-format -msgid "3606 JobId=%u prefers mounted drives, but %s device %s has no Volume.\n" -msgstr "" - -#: src/stored/reserve.c:1049 -#, c-format -msgid "3607 JobId=%u wants Vol=\"%s\" drive has Vol=\"%s\" on %s device %s.\n" -msgstr "" - -#: src/stored/reserve.c:1104 -#, c-format -msgid "Logic error!!!! JobId=%u Should not get here.\n" -msgstr "" - -#: src/stored/reserve.c:1105 -#, c-format -msgid "3910 JobId=%u Logic error!!!! %s device %s Should not get here.\n" -msgstr "" - -#: src/stored/reserve.c:1108 -msgid "Logic error!!!! Should not get here.\n" -msgstr "" - -#: src/stored/reserve.c:1111 -#, c-format -msgid "3911 JobId=%u failed reserve %s device %s.\n" -msgstr "" - -#: src/stored/spool.c:72 -msgid "Spooling statistics:\n" -msgstr "" - -#: src/stored/spool.c:75 -#, c-format -msgid "" -"Data spooling: %u active jobs, %s bytes; %u total jobs, %s max bytes/job.\n" -msgstr "" - -#: src/stored/spool.c:83 -#, c-format -msgid "Attr spooling: %u active jobs, %s bytes; %u total jobs, %s max bytes.\n" -msgstr "" - -#: src/stored/spool.c:104 -msgid "Spooling data ...\n" -msgstr "" - -#: src/stored/spool.c:130 -#, c-format -msgid "Bad return from despool WroteVol=%d\n" -msgstr "" - -#: src/stored/spool.c:163 -#, c-format -msgid "Open data spool file %s failed: ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:191 -msgid "Despooling zero bytes. Your disk is probably FULL!\n" -msgstr "" - -#: src/stored/spool.c:200 -#, c-format -msgid "Committing spooled data to Volume \"%s\". Despooling %s bytes ...\n" -msgstr "" - -#: src/stored/spool.c:205 -#, c-format -msgid "Writing spooled data to Volume. Despooling %s bytes ...\n" -msgstr "" - -#: src/stored/spool.c:295 -#, c-format -msgid "" -"Despooling elapsed time = %02d:%02d:%02d, Transfer rate = %s Bytes/second\n" -msgstr "" - -#: src/stored/spool.c:304 src/stored/spool.c:505 src/stored/spool.c:551 -#, c-format -msgid "Ftruncate spool file failed: ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:363 -#, c-format -msgid "Spool header read error. ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:366 -#, c-format -msgid "Spool read error. Wanted %u bytes, got %d\n" -msgstr "" - -#: src/stored/spool.c:367 -#, c-format -msgid "Spool header read error. Wanted %u bytes, got %d\n" -msgstr "" - -#: src/stored/spool.c:374 src/stored/spool.c:375 -#, c-format -msgid "Spool block too big. Max %u bytes, got %u\n" -msgstr "" - -#: src/stored/spool.c:381 src/stored/spool.c:382 -#, c-format -msgid "Spool data read error. Wanted %u bytes, got %d\n" -msgstr "" - -#: src/stored/spool.c:436 -#, c-format -msgid "" -"User specified Job spool size reached: JobSpoolSize=%s MaxJobSpoolSize=%s\n" -msgstr "" - -#: src/stored/spool.c:441 -#, c-format -msgid "" -"User specified Device spool size reached: DevSpoolSize=%s MaxDevSpoolSize=" -"%s\n" -msgstr "" - -#: src/stored/spool.c:448 -msgid "Bad return from despool in write_block.\n" -msgstr "" - -#: src/stored/spool.c:456 -msgid "Spooling data again ...\n" -msgstr "" - -#: src/stored/spool.c:488 -#, c-format -msgid "Error writing header to spool file. ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:493 -#, c-format -msgid "" -"Error writing header to spool file. Disk probably full. Attempting recovery. " -"Wanted to write=%d got=%d\n" -msgstr "" - -#: src/stored/spool.c:511 src/stored/spool.c:557 -msgid "Fatal despooling error." -msgstr "" - -#: src/stored/spool.c:519 -msgid "Retrying after header spooling error failed.\n" -msgstr "" - -#: src/stored/spool.c:535 -#, c-format -msgid "Error writing data to spool file. ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:568 -msgid "Retrying after data spooling error failed.\n" -msgstr "" - -#: src/stored/spool.c:655 -msgid "Network error on BlastAttributes.\n" -msgstr "" - -#: src/stored/spool.c:679 src/stored/spool.c:703 -#, c-format -msgid "Fseek on attributes file failed: ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:691 -#, c-format -msgid "Truncate on attributes file failed: ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:715 -#, c-format -msgid "Sending spooled attrs to the Director. Despooling %s bytes ...\n" -msgstr "" - -#: src/stored/spool.c:741 -#, c-format -msgid "fopen attr spool file %s failed: ERR=%s\n" -msgstr "" - -#: src/stored/status.c:86 -msgid "Used Volume status:\n" -msgstr "" - -#: src/stored/status.c:108 -msgid "" -"\n" -"SD Resources:\n" -msgstr "" - -#: src/stored/status.c:144 -#, c-format -msgid "3900 missing args in .status command: %s\n" -msgstr "" - -#: src/stored/status.c:149 -msgid "" -"\n" -"SD Shared Storage:\n" -msgstr "" - -#: src/stored/status.c:294 -#, c-format -msgid "" -"\n" -"Device \"%s\" is not open or does not exist.\n" -msgstr "" - -#: src/stored/status.c:303 -#, c-format -msgid "" -"\n" -"Device %s is %s %s:\n" -" Volume: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" - -#: src/stored/status.c:308 -msgid "waiting for" -msgstr "" - -#: src/stored/status.c:308 -msgid "mounted with" -msgstr "" - -#: src/stored/status.c:310 -msgid "*unknown*" -msgstr "" - -#: src/stored/status.c:314 -#, c-format -msgid "" -"\n" -"Device %s: %s open but no Bacula volume is currently mounted.\n" -msgstr "" - -#: src/stored/status.c:325 -#, c-format -msgid " Total Bytes=%s Blocks=%s Bytes/block=%s\n" -msgstr "" - -#: src/stored/status.c:340 -#, c-format -msgid " Total Bytes Read=%s Blocks Read=%s Bytes/block=%s\n" -msgstr "" - -#: src/stored/status.c:346 -#, c-format -msgid " Positioned at File=%s Block=%s\n" -msgstr "" - -#: src/stored/status.c:352 -#, c-format -msgid "" -"\n" -"Device %s: %s is not open.\n" -msgstr "" - -#: src/stored/status.c:366 -#, c-format -msgid " Available Space=%sB\n" -msgstr "" - -#: src/stored/status.c:374 -#, c-format -msgid "" -" shstore=%d registered=%d locked=%d blockedbySD=%s\n" -"\n" -msgstr "" - -#: src/stored/status.c:425 -#, c-format -msgid "Autochanger \"%s\" with devices:\n" -msgstr "" - -#: src/stored/status.c:449 -msgid "" -"\n" -"Device status:\n" -msgstr "" - -#: src/stored/status.c:506 -#, c-format -msgid "Daemon started %s. Jobs: run=%d, running=%d.\n" -msgstr "" - -#: src/stored/status.c:521 -#, c-format -msgid " Res: ndevices=%d nautochgr=%d\n" -msgstr "" - -#: src/stored/status.c:534 -msgid "" -"No DEVICE structure.\n" -"\n" -msgstr "" - -#: src/stored/status.c:540 -#, c-format -msgid " Device is BLOCKED by another SD=%s\n" -msgstr "" - -#: src/stored/status.c:545 -msgid " Device is disabled. User command.\n" -msgstr "" - -#: src/stored/status.c:550 -msgid " Device is BLOCKED. User unmounted.\n" -msgstr "" - -#: src/stored/status.c:554 -msgid " Device is BLOCKED. User unmounted during wait for media/mount.\n" -msgstr "" - -#: src/stored/status.c:565 -#, c-format -msgid "" -" Device is BLOCKED waiting for mount of volume \"%s\",\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" - -#: src/stored/status.c:574 -#, c-format -msgid "" -" Device is BLOCKED waiting to create a volume for:\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" - -#: src/stored/status.c:586 -msgid " Device is BLOCKED waiting for media.\n" -msgstr "" - -#: src/stored/status.c:592 -msgid " Device is being initialized.\n" -msgstr "" - -#: src/stored/status.c:596 -msgid " Device is blocked labeling a Volume.\n" -msgstr "" - -#: src/stored/status.c:605 -#, c-format -msgid " Slot %d %s loaded in drive %d.\n" -msgstr "" - -#: src/stored/status.c:609 -#, c-format -msgid " Drive %d is not loaded.\n" -msgstr "" - -#: src/stored/status.c:644 -msgid "Device state:\n" -msgstr "" - -#: src/stored/status.c:660 -#, c-format -msgid " num_writers=%d reserves=%d block=%d enabled=%d\n" -msgstr "" - -#: src/stored/status.c:664 -msgid "Attached JobIds: " -msgstr "" - -#: src/stored/status.c:684 -#, c-format -msgid " Archive name: %s Device name: %s\n" -msgstr "" - -#: src/stored/status.c:687 -#, c-format -msgid " File=%u block=%u\n" -msgstr "" - -#: src/stored/status.c:689 -#, c-format -msgid " Min block=%u Max block=%u\n" -msgstr "" - -#: src/stored/status.c:821 -#, c-format -msgid "%s Job %s waiting for Client connection.\n" -msgstr "" - -#: src/stored/status.c:837 -#, c-format -msgid "" -"Reading: %s %s job %s JobId=%d Volume=\"%s\"\n" -" pool=\"%s\" device=%s\n" -msgstr "" - -#: src/stored/status.c:850 -#, c-format -msgid "" -"Writing: %s %s job %s JobId=%d Volume=\"%s\"\n" -" pool=\"%s\" device=%s\n" -msgstr "" - -#: src/stored/status.c:861 -#, c-format -msgid " spooling=%d despooling=%d despool_wait=%d\n" -msgstr "" - -#: src/stored/status.c:885 -#, c-format -msgid " Files=%s Bytes=%s AveBytes/sec=%s LastBytes/sec=%s\n" -msgstr "" - -#: src/stored/status.c:900 -#, c-format -msgid " FDReadSeqNo=%s in_msg=%u out_msg=%d fd=%d\n" -msgstr "" - -#: src/stored/status.c:906 -msgid " FDSocket closed\n" -msgstr "" - -#: src/stored/status.c:927 -msgid "" -"\n" -"Jobs waiting to reserve a drive:\n" -msgstr "" - -#: src/stored/status.c:1007 -#, c-format -msgid "3900 No arg in .status command: %s\n" -msgstr "" - -#: src/stored/status.c:1076 -msgid "3900 dedupengine is disabled: not compiled in this version.\n" -msgstr "" - -#: src/stored/status.c:1089 -#, c-format -msgid "3900 Unknown arg in .status command: %s\n" -msgstr "" - -#: src/stored/stored.c:79 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bacula-sd [options] [-c config_file] [config_file]\n" -" -c use as configuration file\n" -" -d [,] set debug level to , debug tags to \n" -" -dt print timestamp in debug output\n" -" -f run in foreground (for debugging)\n" -" -g set groupid to group\n" -" -m print kaboom output (for debugging)\n" -" -p proceed despite I/O errors\n" -" -s no signals (for debugging)\n" -" -t test - read config and exit\n" -" -u userid to \n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Versie: %s (%s) %s %s %s\n" -"\n" -"Specificatie: tray-monitor [-c configuratiebestand] [-d debug_level]\n" -" -c gebruik configuratiebestand\n" -" -d instellen debug level op \n" -" -dt weergeven tijd in debug output\n" -" -t test - lees configuratie en stop\n" -" -? geef deze melding.\n" -"\n" - -#: src/stored/stored.c:273 -msgid "Volume Session Time is ZERO!\n" -msgstr "" - -#: src/stored/stored.c:282 -#, c-format -msgid "Unable to create thread. ERR=%s\n" -msgstr "" - -#: src/stored/stored.c:592 -#, fuzzy, c-format -msgid "Unable to stat ControlDevice %s: ERR=%s\n" -msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" - -#: src/stored/stored.c:598 -msgid "No plugin directory configured for SAN shared storage\n" -msgstr "" - -#: src/stored/stored.c:619 -#, c-format -msgid "Could not open device %s\n" -msgstr "" - -#: src/stored/stored.c:637 -#, c-format -msgid "Could not mount device %s\n" -msgstr "" - -#: src/stored/stored_conf.c:237 -#, c-format -msgid "Expected a Device Type keyword, got: %s" -msgstr "" - -#: src/stored/stored_conf.c:251 -#, c-format -msgid "" -"Maximum Block Size configured value %u is greater than allowed maximum: %u" -msgstr "" - -#: src/stored/stored_conf.c:264 -#, c-format -msgid "Warning: no \"%s\" resource (%d) defined.\n" -msgstr "" - -#: src/stored/stored_conf.c:267 -#, c-format -msgid "dump_resource type=%d\n" -msgstr "" - -#: src/stored/stored_conf.c:391 -#, c-format -msgid "Warning: unknown resource type %d\n" -msgstr "" - -#: src/stored/stored_conf.c:601 -#, c-format -msgid "\"%s\" item is required in \"%s\" resource, but not found.\n" -msgstr "" - -#: src/stored/stored_conf.c:607 -#, c-format -msgid "Too many items in \"%s\" resource\n" -msgstr "" - -#: src/stored/stored_conf.c:641 -#, c-format -msgid "Cannot find AutoChanger resource %s\n" -msgstr "" - -#: src/stored/stored_conf.c:657 -#, c-format -msgid "Unable to init lock: ERR=%s\n" -msgstr "" - -#: src/stored/tape_dev.c:227 -#, c-format -msgid "No tape loaded or drive offline on %s.\n" -msgstr "" - -#: src/stored/tape_dev.c:237 -#, c-format -msgid "Rewind error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:262 -#, c-format -msgid "Bad call to eod. Device %s not open\n" -msgstr "" - -#: src/stored/tape_dev.c:334 -#, c-format -msgid "ioctl MTEOM error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:429 -msgid "Bad call to load_dev. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:440 src/stored/tape_dev.c:453 -#, c-format -msgid "ioctl MTLOAD error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:484 -#, c-format -msgid "ioctl MTOFFL error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:525 -msgid "Bad call to fsf. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:536 src/stored/tape_dev.c:663 -#, c-format -msgid "Device %s at End of Tape.\n" -msgstr "" - -#: src/stored/tape_dev.c:567 src/stored/tape_dev.c:643 -#, c-format -msgid "ioctl MTFSF error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:692 -msgid "Bad call to bsf. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:698 -#, c-format -msgid "Device %s cannot BSF because it is not a tape.\n" -msgstr "" - -#: src/stored/tape_dev.c:715 -#, c-format -msgid "ioctl MTBSF error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:734 -msgid "Bad call to fsr. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:744 -#, c-format -msgid "ioctl MTFSR not permitted on %s.\n" -msgstr "" - -#: src/stored/tape_dev.c:772 -#, c-format -msgid "ioctl MTFSR %d error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:790 -msgid "Bad call to bsr_dev. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:800 -#, c-format -msgid "ioctl MTBSR not permitted on %s.\n" -msgstr "" - -#: src/stored/tape_dev.c:814 -#, c-format -msgid "ioctl MTBSR error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:920 -msgid "Bad call to weof_dev. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:930 -msgid "Attempt to WEOF on non-appendable Volume\n" -msgstr "" - -#: src/stored/tape_dev.c:948 -#, c-format -msgid "ioctl MTWEOF error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/vbackup.c:68 -msgid "Read and write devices not properly initialized.\n" -msgstr "" - -#: src/stored/vbackup.c:74 -#, c-format -msgid "No Volume names found for %s.\n" -msgstr "" - -#: src/stored/vol_mgr.c:81 -#, c-format -msgid "Unable to initialize volume list lock. ERR=%s\n" -msgstr "" - -#: src/stored/vol_mgr.c:371 -#, c-format -msgid "Could not reserve volume \"%s\", because job canceled.\n" -msgstr "" - -#: src/stored/vol_mgr.c:382 -#, c-format -msgid "Could not reserve volume \"%s\" for append, because it will be read.\n" -msgstr "" - -#: src/stored/vol_mgr.c:415 -#, c-format -msgid "Cannot free Volume \"%s\", because it is reserved by someone else.\n" -msgstr "" - -#: src/stored/vol_mgr.c:516 -#, c-format -msgid "Volume %s is busy swapping from %s to %s\n" -msgstr "" - -#: src/stored/vol_mgr.c:519 src/stored/vol_mgr.c:526 -#, c-format -msgid "Volume %s is busy swapping.\n" -msgstr "" - -#: src/stored/vol_mgr.c:523 -#, c-format -msgid "%s device %s is busy.\n" -msgstr "" - -#: src/stored/wait.c:122 -#, c-format -msgid "pthread timedwait error. ERR=%s\n" -msgstr "" - -#: src/stored/wait.c:228 -#, c-format -msgid "JobId=%s, Job %s waiting to reserve a device.\n" -msgstr "" - -#: src/stored/wait.c:274 -#, c-format -msgid "JobId=%s, Job %s waiting device %s.\n" -msgstr "" - -#: src/tools/bbatch.c:65 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"Example : bbatch -w /path/to/workdir -h localhost -f dat1 -f dat -f datx\n" -" will start 3 thread and load dat1, dat and datx in your catalog\n" -"See bbatch.c to generate datafile\n" -"\n" -"Usage: bbatch [ options ] -w working/dir -f datafile\n" -" -b with batch mode\n" -" -B without batch mode\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database host (default NULL)\n" -" -w specify working directory\n" -" -r call restore code with given jobids\n" -" -v verbose\n" -" -f specify data file\n" -" -? print this message\n" -"\n" -msgstr "" - -#: src/tools/bbatch.c:187 src/tools/bbatch.c:236 src/tools/bvfs_test.c:203 -msgid "Could not init Bacula database\n" -msgstr "" - -#: src/tools/bbatch.c:197 -#, c-format -msgid "Computing file list for jobid=%s files=%lld secs=%d\n" -msgstr "" - -#: src/tools/bbatch.c:301 -#, c-format -msgid "Error opening datafile %s\n" -msgstr "" - -#: src/tools/bbatch.c:311 -msgid "Error while inserting file\n" -msgstr "" - -#: src/tools/bregex.c:142 src/tools/bregtest.c:126 src/tools/bwild.c:111 -#, c-format -msgid "Could not open data file: %s\n" -msgstr "" - -#: src/tools/bsmtp.c:119 -#, c-format -msgid "Fatal malformed reply from %s: %s\n" -msgstr "" - -#: src/tools/bsmtp.c:127 -#, c-format -msgid "Fatal fgets error: ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:163 -#, c-format -msgid "" -"\n" -"Usage: %s [-f from] [-h mailhost] [-s subject] [-c copy] [recipient ...]\n" -" -4 forces bsmtp to use IPv4 addresses only.\n" -" -6 forces bsmtp to use IPv6 addresses only.\n" -" -8 set charset to UTF-8\n" -" -a use any ip protocol for address resolution\n" -" -c set the Cc: field\n" -" -d set debug level to \n" -" -dt print a timestamp in debug output\n" -" -f set the From: field\n" -" -h use mailhost:port as the SMTP server\n" -" -s set the Subject: field\n" -" -r set the Reply-To: field\n" -" -l set the maximum number of lines to send (default: " -"unlimited)\n" -" -? print this message.\n" -"\n" -msgstr "" - -#: src/tools/bsmtp.c:350 -msgid "Fatal error: no recipient given.\n" -msgstr "" - -#: src/tools/bsmtp.c:378 -#, c-format -msgid "Fatal gethostname error: ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:389 -#, c-format -msgid "Fatal getaddrinfo for myself failed \"%s\": ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:397 -#, c-format -msgid "Fatal gethostbyname for myself failed \"%s\": ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:457 src/tools/bsmtp.c:492 -#, c-format -msgid "Error unknown mail host \"%s\": ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:460 src/tools/bsmtp.c:495 -msgid "Retrying connection using \"localhost\".\n" -msgstr "" - -#: src/tools/bsmtp.c:485 -#, fuzzy, c-format -msgid "Failed to connect to mailhost %s\n" -msgstr "Verbinden met de director mislukt\n" - -#: src/tools/bsmtp.c:503 -#, c-format -msgid "Fatal error: Unknown address family for smtp host: %d\n" -msgstr "" - -#: src/tools/bsmtp.c:512 src/tools/bsmtp.c:517 -#, c-format -msgid "Fatal socket error: ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:522 -#, c-format -msgid "Fatal connect error to %s: ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:531 -#, c-format -msgid "Fatal _open_osfhandle error: ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:538 src/tools/bsmtp.c:542 src/tools/bsmtp.c:551 -#: src/tools/bsmtp.c:555 -#, c-format -msgid "Fatal fdopen error: ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:547 -#, c-format -msgid "Fatal dup error: ERR=%s\n" -msgstr "" - -#: src/tools/bsnapshot.c:47 -#, fuzzy, c-format -msgid "" -"ERROR %s\n" -"\n" -msgstr "FOUT" - -#: src/tools/bsnapshot.c:51 -#, c-format -msgid "" -"Bacula Systems SA(R) %s (%s)\n" -"\n" -"Usage: bsnapshot\n" -" -d level Set debug level\n" -" -v Verbose\n" -" -s Use sudo\n" -" -o logfile send debug to logfile\n" -" -V volume volume\n" -" -T type volume type\n" -" -t check compatibility\n" -" -c specify configuration file\n" -"\n" -msgstr "" - -#: src/tools/bsnapshot.c:1876 -msgid "Unable to open -p argument for reading" -msgstr "" - -#: src/tools/bvfs_test.c:44 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database host (default NULL)\n" -" -w specify working directory\n" -" -j specify jobids\n" -" -p specify path\n" -" -f specify file\n" -" -l maximum tuple to fetch\n" -" -T truncate cache table before starting\n" -" -v verbose\n" -" -? print this message\n" -"\n" -msgstr "" - -#: src/tools/cats_test.c:47 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database host (default NULL)\n" -" -w specify working directory\n" -" -p specify path\n" -" -f specify file\n" -" -l maximum tuple to fetch\n" -" -q print only errors\n" -" -v verbose\n" -" -? print this message\n" -"\n" -msgstr "" - -#: src/tools/cats_test.c:363 -#, c-format -msgid "Could not open, database \"%s\".\n" -msgstr "" - -#: src/tools/dbcheck.c:178 -msgid "" -"Warning skipping the additional parameters for working directory/dbname/user/" -"password/host.\n" -msgstr "" - -#: src/tools/dbcheck.c:196 -#, c-format -msgid "Error can not find the Catalog name[%s] in the given config file [%s]\n" -msgstr "" - -#: src/tools/dbcheck.c:198 -#, c-format -msgid "Error there is no Catalog section in the given config file [%s]\n" -msgstr "" - -#: src/tools/dbcheck.c:207 -msgid "Error no Director resource defined.\n" -msgstr "" - -#: src/tools/dbcheck.c:231 -msgid "Wrong number of arguments.\n" -msgstr "" - -#: src/tools/dbcheck.c:236 -msgid "Working directory not supplied.\n" -msgstr "" - -#: src/tools/dbcheck.c:272 -msgid "Database port must be a numeric value.\n" -msgstr "" - -#: src/tools/dbcheck.c:275 -msgid "Database port must be a int value.\n" -msgstr "" - -#: src/tools/dbcheck.c:346 -#, c-format -msgid "Hello, this is the database check/correct program.\n" -msgstr "" - -#: src/tools/dbcheck.c:348 -#, c-format -msgid "Modify database is on." -msgstr "" - -#: src/tools/dbcheck.c:350 -#, c-format -msgid "Modify database is off." -msgstr "" - -#: src/tools/dbcheck.c:352 src/tools/dbcheck.c:407 -#, c-format -msgid " Verbose is on.\n" -msgstr "" - -#: src/tools/dbcheck.c:354 src/tools/dbcheck.c:409 -#, c-format -msgid " Verbose is off.\n" -msgstr "" - -#: src/tools/dbcheck.c:356 -#, c-format -msgid "Please select the function you want to perform.\n" -msgstr "" - -#: src/tools/dbcheck.c:360 -#, c-format -msgid "" -"\n" -" 1) Toggle modify database flag\n" -" 2) Toggle verbose flag\n" -" 3) Repair bad Path records\n" -" 4) Eliminate duplicate Path records\n" -" 5) Eliminate orphaned Jobmedia records\n" -" 6) Eliminate orphaned File records\n" -" 7) Eliminate orphaned Path records\n" -" 8) Eliminate orphaned FileSet records\n" -" 9) Eliminate orphaned Client records\n" -" 10) Eliminate orphaned Job records\n" -" 11) Eliminate all Admin records\n" -" 12) Eliminate all Restore records\n" -" 13) All (3-12)\n" -" 14) Quit\n" -msgstr "" - -#: src/tools/dbcheck.c:376 -#, c-format -msgid "" -"\n" -" 1) Toggle modify database flag\n" -" 2) Toggle verbose flag\n" -" 3) Check for bad Path records\n" -" 4) Check for duplicate Path records\n" -" 5) Check for orphaned Jobmedia records\n" -" 6) Check for orphaned File records\n" -" 7) Check for orphaned Path records\n" -" 8) Check for orphaned FileSet records\n" -" 9) Check for orphaned Client records\n" -" 10) Check for orphaned Job records\n" -" 11) Check for all Admin records\n" -" 12) Check for all Restore records\n" -" 13) All (3-12)\n" -" 14) Quit\n" -msgstr "" - -#: src/tools/dbcheck.c:393 -msgid "Select function number: " -msgstr "" - -#: src/tools/dbcheck.c:400 -#, c-format -msgid "Database will be modified.\n" -msgstr "" - -#: src/tools/dbcheck.c:402 -#, c-format -msgid "Database will NOT be modified.\n" -msgstr "" - -#: src/tools/dbcheck.c:481 -#, c-format -msgid "JobId=%s Name=\"%s\" StartTime=%s\n" -msgstr "" - -#: src/tools/dbcheck.c:488 -#, c-format -msgid "Orphaned JobMediaId=%s JobId=%s Volume=\"%s\"\n" -msgstr "" - -#: src/tools/dbcheck.c:495 -#, c-format -msgid "Orphaned FileId=%s JobId=%s Volume=\"%s\"\n" -msgstr "" - -#: src/tools/dbcheck.c:502 -#, c-format -msgid "Orphaned FileSetId=%s FileSet=\"%s\" MD5=%s\n" -msgstr "" - -#: src/tools/dbcheck.c:509 -#, c-format -msgid "Orphaned ClientId=%s Name=\"%s\"\n" -msgstr "" - -#: src/tools/dbcheck.c:562 -#, c-format -msgid "Deleting: %s\n" -msgstr "" - -#: src/tools/dbcheck.c:634 -#, c-format -msgid "Checking for duplicate Path entries.\n" -msgstr "" - -#: src/tools/dbcheck.c:645 -#, c-format -msgid "Found %d duplicate Path records.\n" -msgstr "" - -#: src/tools/dbcheck.c:646 src/tools/dbcheck.c:708 src/tools/dbcheck.c:754 -#: src/tools/dbcheck.c:822 src/tools/dbcheck.c:864 src/tools/dbcheck.c:906 -#: src/tools/dbcheck.c:948 src/tools/dbcheck.c:985 src/tools/dbcheck.c:1018 -#: src/tools/dbcheck.c:1052 -msgid "Print them? (yes/no): " -msgstr "" - -#: src/tools/dbcheck.c:669 -#, c-format -msgid "Found %d for: %s\n" -msgstr "" - -#: src/tools/dbcheck.c:699 -#, c-format -msgid "Checking for orphaned JobMedia entries.\n" -msgstr "" - -#: src/tools/dbcheck.c:707 -#, c-format -msgid "Found %d orphaned JobMedia records.\n" -msgstr "" - -#: src/tools/dbcheck.c:725 -#, c-format -msgid "Deleting %d orphaned JobMedia records.\n" -msgstr "" - -#: src/tools/dbcheck.c:742 -#, c-format -msgid "Checking for orphaned File entries. This may take some time!\n" -msgstr "" - -#: src/tools/dbcheck.c:753 -#, c-format -msgid "Found %d orphaned File records.\n" -msgstr "" +#, fuzzy +#~ msgid "Restore Object" +#~ msgstr "Uitvoeren herstel opdracht" -#: src/tools/dbcheck.c:770 -#, c-format -msgid "Deleting %d orphaned File records.\n" -msgstr "" +#, fuzzy +#~ msgid "No addr/port found to listen on.\n" +#~ msgstr "Geen Volumes gevonden om terug te zetten.\n" -#: src/tools/dbcheck.c:789 -#, c-format -msgid "Pruning orphaned Path entries isn't possible when using BVFS.\n" -msgstr "" +#, fuzzy +#~ msgid "Could not init bsock read mutex. ERR=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/tools/dbcheck.c:798 -msgid "Create temporary index? (yes/no): " -msgstr "" +#, fuzzy +#~ msgid "Could not init bsock write mutex. ERR=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/tools/dbcheck.c:810 -#, c-format -msgid "Checking for orphaned Path entries. This may take some time!\n" -msgstr "" +#, fuzzy +#~ msgid "Director authorization error at \"%s:%d\"\n" +#~ msgstr "Geen toegang tot Pool \"%s\"\n" -#: src/tools/dbcheck.c:821 -#, c-format -msgid "Found %d orphaned Path records.\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot open %s file. %s ERR=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/tools/dbcheck.c:834 -#, c-format -msgid "Deleting %d orphaned Path records.\n" -msgstr "" +#, fuzzy +#~ msgid "Could not open %s file. %s ERR=%s\n" +#~ msgstr "Kan Client niet vinden %s: ERR=%s" -#: src/tools/dbcheck.c:853 -#, c-format -msgid "Checking for orphaned FileSet entries. This takes some time!\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot lock %s file. %s ERR=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/tools/dbcheck.c:863 -#, c-format -msgid "Found %d orphaned FileSet records.\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot not open %s file. %s ERR=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/tools/dbcheck.c:878 -#, c-format -msgid "Deleting %d orphaned FileSet records.\n" -msgstr "" +#, fuzzy +#~ msgid "User cancel requested.\n" +#~ msgstr "Terugzetten geannuleerd.\n" -#: src/tools/dbcheck.c:887 -#, c-format -msgid "Checking for orphaned Client entries.\n" -msgstr "" +#, fuzzy +#~ msgid "Can't run command %s. ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/tools/dbcheck.c:905 -#, c-format -msgid "Found %d orphaned Client records.\n" -msgstr "" +#, fuzzy +#~ msgid "Can't create working directory %s. ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/tools/dbcheck.c:920 -#, c-format -msgid "Deleting %d orphaned Client records.\n" -msgstr "" +#, fuzzy +#~ msgid "Can't delete working directory %s. ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/tools/dbcheck.c:929 -#, c-format -msgid "Checking for orphaned Job entries.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to create temporary file %s. ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/tools/dbcheck.c:947 -#, c-format -msgid "Found %d orphaned Job records.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to fdopen file %s. ERR=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/tools/dbcheck.c:962 -#, c-format -msgid "Deleting %d orphaned Job records.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to detect the MySQL data_directory on this system.\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/tools/dbcheck.c:964 -#, c-format -msgid "Deleting JobMedia records of orphaned Job records.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to determine the last binlog %s\n" +#~ msgstr "Kan de geselecteerde client niet vinden." -#: src/tools/dbcheck.c:966 -#, c-format -msgid "Deleting Log records of orphaned Job records.\n" -msgstr "" +#, fuzzy +#~ msgid "Can't get server configuration.\n" +#~ msgstr "Wijziging van configuratiebestand" -#: src/tools/dbcheck.c:975 -#, c-format -msgid "Checking for Admin Job entries.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to get the BINLOG list.\n" +#~ msgstr "Kan de geselecteerde client niet vinden." -#: src/tools/dbcheck.c:984 -#, c-format -msgid "Found %d Admin Job records.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to determine the last LSN for %s (Previous job is %s)\n" +#~ msgstr "Kan de geselecteerde client niet vinden." -#: src/tools/dbcheck.c:999 -#, c-format -msgid "Deleting %d Admin Job records.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to detect datadir from MySQL\n" +#~ msgstr "Kan de geselecteerde client niet vinden." -#: src/tools/dbcheck.c:1008 -#, c-format -msgid "Checking for Restore Job entries.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to get last LSN from the backup\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/tools/dbcheck.c:1017 -#, c-format -msgid "Found %d Restore Job records.\n" -msgstr "" +#, fuzzy +#~ msgid "The current LSN is %s\n" +#~ msgstr "De huidige %s retention periode: %s\n" -#: src/tools/dbcheck.c:1032 -#, c-format -msgid "Deleting %d Restore Job records.\n" -msgstr "" +#, fuzzy +#~ msgid "Database \"%s\" already exists. Skipping creation.\n" +#~ msgstr "" +#~ "Geprobeerd om \"%s\" aan te maken, maar deze bestaat al. Probeer " +#~ "opnieuw.\n" -#: src/tools/dbcheck.c:1042 -#, c-format -msgid "Checking for Paths without a trailing slash\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to parse or to use plugin options, %s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/tools/dbcheck.c:1051 -#, c-format -msgid "Found %d bad Path records.\n" -msgstr "" +#, fuzzy +#~ msgid "Can't get cluster configuration.\n" +#~ msgstr "Wijziging van configuratiebestand" -#: src/tools/dbcheck.c:1068 -#, c-format -msgid "Reparing %d bad Filename records.\n" -msgstr "" +#, fuzzy +#~ msgid "Can't determine the last WAL file\n" +#~ msgstr "Kan de geselecteerde client niet vinden." -#: src/tools/dbcheck.c:1214 -#, c-format -msgid "" -"Ok. Index over the %s column already exists and dbcheck will work faster.\n" -msgstr "" +#, fuzzy +#~ msgid "Can't open WAL directory %s. ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/tools/dbcheck.c:1217 -#, c-format -msgid "" -"Note. Index over the %s column not found, that can greatly slow down " -"dbcheck.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to detect the PostgreSQL data_directory on this system.\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/tools/dbcheck.c:1232 -#, c-format -msgid "Create temporary index... This may take some time!\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to find data_directory=%s on this system. ERR=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/tools/dbcheck.c:1240 -#, c-format -msgid "Temporary index created.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to start the PITR backup on this system.\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/tools/dbcheck.c:1255 -#, c-format -msgid "Drop temporary index.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to determine the first WAL file on this system.\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/tools/dbcheck.c:1265 -#, c-format -msgid "Temporary index %s deleted.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to analyse tablespaces %s on this system. ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/tools/drivetype.c:29 -#, c-format -msgid "" -"\n" -"Usage: drivetype [-v] path ...\n" -"\n" -" Print the drive type a given file/directory is on.\n" -" The following options are supported:\n" -"\n" -" -l print local fixed hard drive\n" -" -a display information on all drives\n" -" -v print both path and file system type.\n" -" -? print this message.\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to analyse data_directory %s on this system. ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/tools/drivetype.c:60 -#, c-format -msgid "%s: unknown\n" -msgstr "" +#, fuzzy +#~ msgid "Can't create the %s file for recovery. ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/tools/fstype.c:29 -#, c-format -msgid "" -"\n" -"Usage: fstype [-v] path ...\n" -"\n" -" Print the file system type for each file/directory argument given.\n" -" The following options are supported:\n" -"\n" -" -l print all file system types in mtab.\n" -" -m print full entries in mtab.\n" -" -v print both path and file system type of each argument.\n" -" -? print this message.\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "Error closing device %s. ERR=%s.\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/tools/fstype.c:163 -#, c-format -msgid "%s: unknown file system type\n" -msgstr "" +#, fuzzy +#~ msgid "DDE commit failed. ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/tools/testfind.c:57 -#, c-format -msgid "" -"\n" -"Usage: testfind [-d debug_level] [-] [pattern1 ...]\n" -" -a print extended attributes (Win32 debug)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -c specify config file containing FileSet resources\n" -" -f specify which FileSet to use\n" -" -? print this message.\n" -"\n" -"Patterns are used for file inclusion -- normally directories.\n" -"Debug level >= 1 prints each file found.\n" -"Debug level >= 10 prints path/file for catalog.\n" -"Errors are always printed.\n" -"Files/paths truncated is the number of files/paths with len > 255.\n" -"Truncation is only in the catalog.\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bcopy [-d debug_level] \n" +#~ " -b bootstrap specify a bootstrap file\n" +#~ " -c specify a Storage configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -i specify input Volume names (separated by |)\n" +#~ " -o specify output Volume names (separated by |)\n" +#~ " -p proceed inspite of errors\n" +#~ " -v verbose\n" +#~ " -w specify working directory (default /tmp)\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Versie: %s (%s) %s %s %s\n" +#~ "\n" +#~ "Specificatie: tray-monitor [-c configuratiebestand] [-d debug_level]\n" +#~ " -c gebruik configuratiebestand\n" +#~ " -d instellen debug level op \n" +#~ " -dt weergeven tijd in debug output\n" +#~ " -t test - lees configuratie en stop\n" +#~ " -? geef deze melding.\n" +#~ "\n" -#: src/tools/testfind.c:223 -#, c-format -msgid "" -"\n" -"Total files : %d\n" -"Max file length: %d\n" -"Max path length: %d\n" -"Files truncated: %d\n" -"Paths truncated: %d\n" -"Hard links : %d\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bextract \n" +#~ " -b specify a bootstrap file\n" +#~ " -c specify a Storage configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -T send debug traces to trace file\n" +#~ " -e exclude list\n" +#~ " -i include list\n" +#~ " -p proceed inspite of I/O errors\n" +#~ " -t read data from volume, do not write anything\n" +#~ " -v verbose\n" +#~ " -V specify Volume names (separated by |)\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Versie: %s (%s) %s %s %s\n" +#~ "\n" +#~ "Specificatie: tray-monitor [-c configuratiebestand] [-d debug_level]\n" +#~ " -c gebruik configuratiebestand\n" +#~ " -d instellen debug level op \n" +#~ " -dt weergeven tijd in debug output\n" +#~ " -t test - lees configuratie en stop\n" +#~ " -? geef deze melding.\n" +#~ "\n" -#: src/tools/testfind.c:264 -#, c-format -msgid "Reg: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Job failed or canceled.\n" +#~ msgstr "Terugzetten geannuleerd.\n" -#: src/tools/testfind.c:286 -msgid "\t[will not descend: recursion turned off]" -msgstr "" +#, fuzzy +#~ msgid "The Volume=%s on device=%s appears to be unlabeled.\n" +#~ msgstr "Nieuw volume \"%s\" aangemaakt in catalogus.\n" -#: src/tools/testfind.c:288 -msgid "\t[will not descend: file system change not allowed]" -msgstr "" +#, fuzzy +#~ msgid "Error sending Volume info to Director.\n" +#~ msgstr "Geen Volumes gevonden om terug te zetten.\n" -#: src/tools/testfind.c:290 -msgid "\t[will not descend: disallowed file system]" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bls [options] \n" +#~ " -b specify a bootstrap file\n" +#~ " -c specify a Storage configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -e exclude list\n" +#~ " -i include list\n" +#~ " -j list jobs\n" +#~ " -k list blocks\n" +#~ " (no j or k option) list saved files\n" +#~ " -L dump label\n" +#~ " -p proceed inspite of errors\n" +#~ " -v be verbose\n" +#~ " -V specify Volume names (separated by |)\n" +#~ " -E Check records to detect errors\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Versie: %s (%s) %s %s %s\n" +#~ "\n" +#~ "Specificatie: tray-monitor [-c configuratiebestand] [-d debug_level]\n" +#~ " -c gebruik configuratiebestand\n" +#~ " -d instellen debug level op \n" +#~ " -dt weergeven tijd in debug output\n" +#~ " -t test - lees configuratie en stop\n" +#~ " -? geef deze melding.\n" +#~ "\n" -#: src/tools/testfind.c:292 -msgid "\t[will not descend: disallowed drive type]" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bsdjson [options] [-c config_file] [config_file]\n" +#~ " -r get resource type \n" +#~ " -n get resource \n" +#~ " -l get only directives matching dirs (use with -r)\n" +#~ " -D get only data\n" +#~ " -c use as configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -t test - read config and exit\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Versie: %s (%s) %s %s %s\n" +#~ "\n" +#~ "Specificatie: tray-monitor [-c configuratiebestand] [-d debug_level]\n" +#~ " -c gebruik configuratiebestand\n" +#~ " -d instellen debug level op \n" +#~ " -dt weergeven tijd in debug output\n" +#~ " -t test - lees configuratie en stop\n" +#~ " -? geef deze melding.\n" +#~ "\n" -#: src/tools/testfind.c:308 src/tools/testls.c:203 -#, c-format -msgid "Err: Could not access %s: %s\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: btape \n" +#~ " -b specify bootstrap file\n" +#~ " -c set configuration file to file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -p proceed inspite of I/O errors\n" +#~ " -s turn off signals\n" +#~ " -v be verbose\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Versie: %s (%s) %s %s %s\n" +#~ "\n" +#~ "Specificatie: tray-monitor [-c configuratiebestand] [-d debug_level]\n" +#~ " -c gebruik configuratiebestand\n" +#~ " -d instellen debug level op \n" +#~ " -dt weergeven tijd in debug output\n" +#~ " -t test - lees configuratie en stop\n" +#~ " -? geef deze melding.\n" +#~ "\n" -#: src/tools/testfind.c:311 src/tools/testls.c:206 -#, c-format -msgid "Err: Could not follow ff->link %s: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Initializing DDE." +#~ msgstr "Initialiseren ..." -#: src/tools/testfind.c:314 src/tools/testls.c:209 -#, c-format -msgid "Err: Could not stat %s: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot create recovery directory: %s" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/tools/testfind.c:317 src/tools/testls.c:212 -#, c-format -msgid "Skip: File not saved. No change. %s\n" -msgstr "" +#, fuzzy +#~ msgid "Error sending chunk request to client\n" +#~ msgstr "Geen Volumes gevonden om terug te zetten.\n" -#: src/tools/testfind.c:320 src/tools/testls.c:215 -#, c-format -msgid "Err: Attempt to backup archive. Not saved. %s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to init spool mutex: ERR=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/tools/testfind.c:323 src/tools/testls.c:224 -#, c-format -msgid "Err: Could not open directory %s: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to init acquire mutex: ERR=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/tools/testfind.c:326 src/tools/testls.c:227 -#, c-format -msgid "Err: Unknown file ff->type %d: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to init read acquire mutex: ERR=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/tools/testfind.c:376 -#, c-format -msgid "===== Filename truncated to 255 chars: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to init adata mutex: ERR=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/tools/testfind.c:393 -#, c-format -msgid "========== Path name truncated to 255 chars: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to init volcat mutex: ERR=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/tools/testfind.c:402 -#, c-format -msgid "========== Path length is zero. File=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to init dcrs mutex: ERR=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/tools/testfind.c:405 -#, c-format -msgid "Path: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Client daemon" +#~ msgstr "Client" -#: src/tools/testls.c:47 -#, c-format -msgid "" -"\n" -"Usage: testls [-d debug_level] [-] [pattern1 ...]\n" -" -a print extended attributes (Win32 debug)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -e specify file of exclude patterns\n" -" -i specify file of include patterns\n" -" -q quiet, don't print filenames (debug)\n" -" - read pattern(s) from stdin\n" -" -? print this message.\n" -"\n" -"Patterns are file inclusion -- normally directories.\n" -"Debug level >= 1 prints each file found.\n" -"Debug level >= 10 prints path/file for catalog.\n" -"Errors always printed.\n" -"Files/paths truncated is number with len > 255.\n" -"Truncation is only in catalog.\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "Failed to connect to Client daemon: %s:%d\n" +#~ msgstr "Verbinden met de director mislukt\n" -#: src/tools/testls.c:143 -#, c-format -msgid "Could not open include file: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Could not open(%s,%s,0640): ERR=%s\n" +#~ msgstr "Kan Client niet vinden %s: ERR=%s" -#: src/tools/testls.c:156 -#, c-format -msgid "Could not open exclude file: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Could not open aligned volume: %s, ERR=%s\n" +#~ msgstr "Kan Client niet vinden %s: ERR=%s" -#: src/tools/testls.c:170 -#, c-format -msgid "Files seen = %d\n" -msgstr "" +#, fuzzy +#~ msgid "Recv request to Client failed. ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/tools/testls.c:218 -#, c-format -msgid "Recursion turned off. Directory not entered. %s\n" -msgstr "" +#, fuzzy +#~ msgid "Send caps to Client failed. ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/tools/testls.c:221 -#, c-format -msgid "Skip: File system change prohibited. Directory not entered. %s\n" -msgstr "" +#, fuzzy +#~ msgid "Recv caps from Client failed. ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/win32/compat/compat.cpp:2855 -msgid "" -"\n" -"\n" -"Bacula ERROR: " -msgstr "" -"\n" -"\n" -"Bacula FOUT: " +#, fuzzy +#~ msgid "Couldn't rewind %s device %s: ERR=%s\n" +#~ msgstr "Kan Client niet vinden %s: ERR=%s" -#: src/win32/filed/plugins/vssapi.c:1428 -#, fuzzy, c-format -msgid "Unable to resolve parent path for %ls\n" -msgstr "Kan de geselecteerde client niet vinden." +#, fuzzy +#~ msgid "" +#~ "Got Aligned or File type Volume %s on Dedup device %s. Wanted File.\n" +#~ msgstr "Nieuw volume \"%s\" aangemaakt in catalogus.\n" -#: src/win32/filed/plugins/vssfs.c:226 src/win32/filed/plugins/vssfs.c:238 #, fuzzy -msgid "Unable to parse user supplied restore configuration\n" -msgstr "Kan configuratiebestand niet lezen" +#~ msgid "" +#~ "Got Aligned or Dedup type Volume %s on File device %s. Wanted File.\n" +#~ msgstr "Nieuw volume \"%s\" aangemaakt in catalogus.\n" -#: src/win32/libwin32/main.cpp:226 -msgid "Bad Command Line Option" -msgstr "Onjuiste opdrachtregel optie" +#, fuzzy +#~ msgid "" +#~ "Got File or Dedup type Volume %s on Aligned device %s. Wanted Aligned.\n" +#~ msgstr "Nieuw volume \"%s\" aangemaakt in catalogus.\n" -#: src/win32/libwin32/service.cpp:96 -msgid "RegisterServiceCtlHandler failed" -msgstr "" +#, fuzzy +#~ msgid "Could not reserve volume %s on %s device %s\n" +#~ msgstr "Kan Client niet vinden %s: ERR=%s" -#: src/win32/libwin32/service.cpp:97 -msgid "Failure contacting the Service Handler" -msgstr "" +#, fuzzy +#~ msgid "Rewind error on %s device %s: ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/win32/libwin32/service.cpp:108 -msgid "Service start report failed" -msgstr "" +#, fuzzy +#~ msgid "Truncate error on %s device %s: ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/win32/libwin32/service.cpp:161 -msgid "StartServiceCtrlDispatcher failed." -msgstr "" +#, fuzzy +#~ msgid "Unable to write %s device %s: ERR=%s\n" +#~ msgstr "Lees fout op bestand %s. FOUT=%s\n" -#: src/win32/libwin32/service.cpp:168 -msgid "KERNEL32.DLL not found: Bacula service not started" -msgstr "KERNEL32.DLL niet gevonden. Bacula service niet gestart" +#, fuzzy +#~ msgid "Unable to position to end of data on %s device %s: ERR=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/win32/libwin32/service.cpp:178 #, fuzzy -msgid "Registry service not found: Bacula service not started" -msgstr "KERNEL32.DLL niet gevonden. Bacula service niet gestart" +#~ msgid "Volume \"%s\" not loaded on %s device %s.\n" +#~ msgstr "Job \"%s\" niet gevonden.\n" -#: src/win32/libwin32/service.cpp:180 -msgid "Registry service entry point not found" -msgstr "" +#, fuzzy +#~ msgid "Labeled new Volume \"%s\" on %s device %s.\n" +#~ msgstr "Nieuw volume \"%s\" aangemaakt in catalogus.\n" -#: src/win32/libwin32/service.cpp:201 -msgid "Report Service failure" -msgstr "" +#, fuzzy +#~ msgid "Error sending header to Client. ERR=%s\n" +#~ msgstr "Geen Volumes gevonden om terug te zetten.\n" -#: src/win32/libwin32/service.cpp:232 -msgid "Unable to install the service" -msgstr "Kan de service niet installeren" +#, fuzzy +#~ msgid "Error sending data to Client. ERR=%s\n" +#~ msgstr "Geen Volumes gevonden om terug te zetten.\n" -#: src/win32/libwin32/service.cpp:240 -msgid "Service command length too long" -msgstr "Lengte service commando te lang" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bacula-sd [options] [-c config_file] [config_file]\n" +#~ " -c use as configuration file\n" +#~ " -d [,] set debug level to , debug tags to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -f run in foreground (for debugging)\n" +#~ " -g set groupid to group\n" +#~ " -m print kaboom output (for debugging)\n" +#~ " -p proceed despite I/O errors\n" +#~ " -s no signals (for debugging)\n" +#~ " -t test - read config and exit\n" +#~ " -u userid to \n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Versie: %s (%s) %s %s %s\n" +#~ "\n" +#~ "Specificatie: tray-monitor [-c configuratiebestand] [-d debug_level]\n" +#~ " -c gebruik configuratiebestand\n" +#~ " -d instellen debug level op \n" +#~ " -dt weergeven tijd in debug output\n" +#~ " -t test - lees configuratie en stop\n" +#~ " -? geef deze melding.\n" +#~ "\n" -#: src/win32/libwin32/service.cpp:241 -msgid "Service command length too long. Service not registered." -msgstr "Lengte service commando te lang. Service niet geregistreerd" +#, fuzzy +#~ msgid "Unable to stat ControlDevice %s: ERR=%s\n" +#~ msgstr "Kan job cond variabele niet initialiseren: ERR=%s\n" -#: src/win32/libwin32/service.cpp:254 -msgid "" -"The Service Control Manager could not be contacted - the service was not " -"installed" -msgstr "" +#, fuzzy +#~ msgid "Failed to connect to mailhost %s\n" +#~ msgstr "Verbinden met de director mislukt\n" -#: src/win32/libwin32/service.cpp:277 src/win32/libwin32/service.cpp:306 -#: src/win32/libwin32/service.cpp:352 src/win32/libwin32/service.cpp:359 -#: src/win32/libwin32/service.cpp:363 -msgid "The Bacula service: " -msgstr "De Bacula service:" +#, fuzzy +#~ msgid "" +#~ "ERROR %s\n" +#~ "\n" +#~ msgstr "FOUT" -#: src/win32/libwin32/service.cpp:284 -msgid "" -"Provides file backup and restore services. Bacula -- the network backup " -"solution." -msgstr "" +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "Bacula ERROR: " +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "Bacula FOUT: " -#: src/win32/libwin32/service.cpp:295 #, fuzzy -msgid "Cannot write System Registry for " -msgstr "Kan Bacula sleutel niet aan Systeem Register toevoegen" +#~ msgid "Unable to resolve parent path for %ls\n" +#~ msgstr "Kan de geselecteerde client niet vinden." -#: src/win32/libwin32/service.cpp:296 -msgid "" -"The System Registry could not be updated - the Bacula service was not " -"installed" -msgstr "" +#, fuzzy +#~ msgid "Unable to parse user supplied restore configuration\n" +#~ msgstr "Kan configuratiebestand niet lezen" -#: src/win32/libwin32/service.cpp:305 -msgid "Cannot add Bacula key to System Registry" -msgstr "Kan Bacula sleutel niet aan Systeem Register toevoegen" +#~ msgid "Bad Command Line Option" +#~ msgstr "Onjuiste opdrachtregel optie" -#: src/win32/libwin32/service.cpp:316 -msgid "The " -msgstr "De" +#~ msgid "KERNEL32.DLL not found: Bacula service not started" +#~ msgstr "KERNEL32.DLL niet gevonden. Bacula service niet gestart" -#: src/win32/libwin32/service.cpp:370 -msgid "An existing Bacula service: " -msgstr "Een bestaande Bacula service:" +#, fuzzy +#~ msgid "Registry service not found: Bacula service not started" +#~ msgstr "KERNEL32.DLL niet gevonden. Bacula service niet gestart" -#: src/win32/libwin32/service.cpp:378 -msgid "" -"The service Manager could not be contacted - the Bacula service was not " -"removed" -msgstr "" +#~ msgid "Unable to install the service" +#~ msgstr "Kan de service niet installeren" -#: src/win32/libwin32/service.cpp:391 -msgid "" -"Could not find registry entry.\n" -"Service probably not registerd - the Bacula service was not removed" -msgstr "" +#~ msgid "Service command length too long" +#~ msgstr "Lengte service commando te lang" -#: src/win32/libwin32/service.cpp:398 -msgid "Could not delete Registry key for " -msgstr "" +#~ msgid "Service command length too long. Service not registered." +#~ msgstr "Lengte service commando te lang. Service niet geregistreerd" -#: src/win32/libwin32/service.cpp:408 -msgid "Bacula could not be contacted, probably not running" -msgstr "Bacula kan niet worden bereikt, waarschijnlijk niet opgestart" +#~ msgid "The Bacula service: " +#~ msgstr "De Bacula service:" -#: src/win32/libwin32/service.cpp:415 -msgid "The Bacula service has been removed" -msgstr "De Bacula service is verwijderd" +#, fuzzy +#~ msgid "Cannot write System Registry for " +#~ msgstr "Kan Bacula sleutel niet aan Systeem Register toevoegen" -#: src/win32/libwin32/service.cpp:456 -msgid "SetServiceStatus failed" -msgstr "" +#~ msgid "Cannot add Bacula key to System Registry" +#~ msgstr "Kan Bacula sleutel niet aan Systeem Register toevoegen" -#: src/win32/libwin32/service.cpp:482 -#, c-format -msgid "" -"\n" -"\n" -"%s error: %ld at %s:%d" -msgstr "" -"\n" -"\n" -"%s fout: %ld op %s:%d" +#~ msgid "The " +#~ msgstr "De" -#: src/win32/libwin32/service.cpp:558 -#, c-format -msgid "Locked by: %s, duration: %ld seconds\n" -msgstr "" +#~ msgid "An existing Bacula service: " +#~ msgstr "Een bestaande Bacula service:" -#: src/win32/libwin32/service.cpp:562 -#, c-format -msgid "No longer locked\n" -msgstr "" +#~ msgid "Bacula could not be contacted, probably not running" +#~ msgstr "Bacula kan niet worden bereikt, waarschijnlijk niet opgestart" -#: src/win32/libwin32/service.cpp:566 -msgid "Could not lock database" -msgstr "" +#~ msgid "The Bacula service has been removed" +#~ msgstr "De Bacula service is verwijderd" + +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "%s error: %ld at %s:%d" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "%s fout: %ld op %s:%d" #, fuzzy #~ msgid "Storage from Job's NextPool resource" diff --git a/bacula/po/pl.po b/bacula/po/pl.po index ddd31e62a2..1d22335823 100644 --- a/bacula/po/pl.po +++ b/bacula/po/pl.po @@ -1,7 +1,7 @@ # bacula translations # Copyright (C) 2010 Inteos Sp. z o.o. -# Copyright (C) 2000-2015, Kern Sibbald -# License: BSD 2-Clause +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # Translated by Inteos Translation Team: pl@inteos.pl # diff --git a/bacula/po/sv.po b/bacula/po/sv.po index 41be825f31..0756cf3cdf 100644 --- a/bacula/po/sv.po +++ b/bacula/po/sv.po @@ -1,12 +1,12 @@ # Swedish translations for PACKAGE package. -# Copyright (C) 2000-1015 Kern Sibbald -# License: BSD 2-Clause +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # msgid "" msgstr "" "Project-Id-Version: Bacula 2.1.x\n" "Report-Msgid-Bugs-To: bacula-devel@lists.sourceforge.net\n" -"POT-Creation-Date: 2015-05-21 11:42+0200\n" +"POT-Creation-Date: 2015-08-09 15:05+0200\n" "PO-Revision-Date: 2007-06-22 19:18+0200\n" "Last-Translator: Kern Sibbald \n" "Language-Team: Swedish \n" @@ -16,18804 +16,470 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: examples/nagios/check_bacula/check_bacula.c:57 +#: src/baconfig.h:64 src/baconfig.h:65 src/baconfig.h:70 src/baconfig.h:71 +#: src/baconfig.h:82 src/baconfig.h:83 #, c-format -msgid "" -"Copyright (C) 2005 Christian Masopust\n" -"Written by Christian Masopust (2005)\n" -"\n" -"Version: " -msgstr "" - -#: src/baconfig.h:61 src/baconfig.h:62 src/baconfig.h:67 src/baconfig.h:68 -#: src/baconfig.h:79 src/baconfig.h:80 -#, c-format -msgid "Failed ASSERT: %s\n" -msgstr "" - -#: src/baconfig.h:88 src/dird/ua_dotcmds.c:1675 src/dird/ua_dotcmds.c:1683 -#: src/dird/ua_run.c:810 src/dird/ua_run.c:1863 src/dird/ua_run.c:1890 -#: src/dird/ua_run.c:1921 src/dird/ua_run.c:1948 src/dird/ua_run.c:1986 -#: src/dird/ua_select.c:622 src/dird/ua_select.c:642 src/dird/ua_update.c:364 -msgid "*None*" -msgstr "" - -#: src/cats/cats.c:132 src/cats/mysql.c:408 src/cats/postgresql.c:529 -#: src/cats/postgresql.c:579 src/cats/sqlite.c:478 -#, c-format -msgid "Query failed: %s: ERR=%s\n" -msgstr "" - -#: src/cats/cats_null.c:30 -msgid "Please replace this null libbaccats library with a proper one.\n" -msgstr "" - -#: src/cats/mysql.c:91 -msgid "A user name for MySQL must be supplied.\n" -msgstr "" - -#: src/cats/mysql.c:178 src/cats/postgresql.c:232 src/cats/sqlite.c:177 -#, c-format -msgid "Unable to initialize DB lock. ERR=%s\n" -msgstr "" - -#: src/cats/mysql.c:221 -#, c-format -msgid "" -"Unable to connect to MySQL server.\n" -"Database=%s User=%s\n" -"MySQL connect failed either server not running or your authorization is " -"incorrect.\n" -msgstr "" - -#: src/cats/mysql.c:385 src/cats/postgresql.c:476 src/cats/sqlite.c:402 -#: src/dird/fd_cmds.c:926 src/dird/fd_cmds.c:987 -#, c-format -msgid "Attribute create error. %s" -msgstr "" - -#: src/cats/postgresql.c:103 -msgid "A user name for PostgreSQL must be supplied.\n" -msgstr "" - -#: src/cats/postgresql.c:187 src/cats/sql.c:336 src/cats/sql.c:343 -#: src/cats/sql_create.c:550 src/cats/sql_get.c:199 src/cats/sql_get.c:570 -#: src/cats/sql_get.c:780 src/cats/sql_get.c:1096 src/cats/sql_get.c:1468 -#, c-format -msgid "error fetching row: %s\n" -msgstr "" - -#: src/cats/postgresql.c:203 -#, c-format -msgid "Encoding error for database \"%s\". Wanted SQL_ASCII, got %s\n" -msgstr "" - -#: src/cats/postgresql.c:268 -#, c-format -msgid "" -"Unable to connect to PostgreSQL server. Database=%s User=%s\n" -"Possible causes: SQL server not running; password incorrect; max_connections " -"exceeded.\n" -msgstr "" - -#: src/cats/postgresql.c:372 -msgid "PQescapeStringConn returned non-zero.\n" -msgstr "" - -#: src/cats/postgresql.c:390 -msgid "PQescapeByteaConn returned NULL.\n" -msgstr "" - -#: src/cats/postgresql.c:421 -msgid "PQunescapeByteaConn returned NULL.\n" -msgstr "" - -#: src/cats/postgresql.c:536 -#, c-format -msgid "Fetch failed: ERR=%s\n" -msgstr "" - -#: src/cats/postgresql.c:839 -#, c-format -msgid "error fetching currval: %s\n" -msgstr "" - -#: src/cats/postgresql.c:1030 -#, c-format -msgid "error starting batch mode: %s" -msgstr "" - -#: src/cats/postgresql.c:1059 src/cats/postgresql.c:1066 -#, c-format -msgid "error ending batch mode: %s" -msgstr "" - -#: src/cats/postgresql.c:1115 -#, c-format -msgid "error copying in batch mode: %s" -msgstr "" - -#: src/cats/sql.c:185 -#, c-format -msgid "" -"Potential performance problem:\n" -"max_connections=%d set for %s database \"%s\" should be larger than " -"Director's MaxConcurrentJobs=%d\n" -msgstr "" - -#: src/cats/sql.c:229 -#, c-format -msgid "" -"query %s failed:\n" -"%s\n" -msgstr "" - -#: src/cats/sql.c:250 -#, c-format -msgid "" -"insert %s failed:\n" -"%s\n" -msgstr "" - -#: src/cats/sql.c:262 -#, c-format -msgid "Insertion problem: affected_rows=%s\n" -msgstr "" - -#: src/cats/sql.c:280 -#, c-format -msgid "" -"update %s failed:\n" -"%s\n" -msgstr "" - -#: src/cats/sql.c:290 -#, c-format -msgid "Update failed: affected_rows=%s for %s\n" -msgstr "" - -#: src/cats/sql.c:310 -#, c-format -msgid "" -"delete %s failed:\n" -"%s\n" -msgstr "" - -#: src/cats/sql.c:396 -#, c-format -msgid "Path length is zero. File=%s\n" -msgstr "" - -#: src/cats/sql.c:610 -msgid "No results to list.\n" -msgstr "" - -#: src/cats/sql.c:751 -msgid "Could not init database batch connection\n" -msgstr "" - -#: src/cats/sql.c:757 -#, c-format -msgid "Could not open database \"%s\": ERR=%s\n" -msgstr "" - -#: src/cats/sql.c:857 -msgid "" -"Your database is no longer functional. This is most likely due to\n" -"the fact that your Bacula Enterprise Edition period has expired.\n" -"You can continue testing by re-initializing the catalog database orcontact " -"Bacula Systems to order a subscription.\n" -msgstr "" - -#: src/cats/sql_create.c:82 -#, c-format -msgid "Create DB Job record %s failed. ERR=%s\n" -msgstr "" - -#: src/cats/sql_create.c:125 -#, c-format -msgid "Create JobMedia record %s failed: ERR=%s\n" -msgstr "" - -#: src/cats/sql_create.c:134 -#, c-format -msgid "Update Media record %s failed: ERR=%s\n" -msgstr "" - -#: src/cats/sql_create.c:164 -#, c-format -msgid "pool record %s already exists\n" -msgstr "" - -#: src/cats/sql_create.c:196 -#, c-format -msgid "Create db Pool record %s failed: ERR=%s\n" -msgstr "" - -#: src/cats/sql_create.c:225 -#, c-format -msgid "Device record %s already exists\n" -msgstr "" - -#: src/cats/sql_create.c:241 -#, c-format -msgid "Create db Device record %s failed: ERR=%s\n" -msgstr "" - -#: src/cats/sql_create.c:274 -#, c-format -msgid "More than one Storage record!: %d\n" -msgstr "" - -#: src/cats/sql_create.c:279 -#, c-format -msgid "error fetching Storage row: %s\n" -msgstr "" - -#: src/cats/sql_create.c:299 -#, c-format -msgid "Create DB Storage record %s failed. ERR=%s\n" -msgstr "" - -#: src/cats/sql_create.c:330 -#, c-format -msgid "mediatype record %s already exists\n" -msgstr "" - -#: src/cats/sql_create.c:346 -#, c-format -msgid "Create db mediatype record %s failed: ERR=%s\n" -msgstr "" - -#: src/cats/sql_create.c:384 -#, c-format -msgid "Volume \"%s\" already exists.\n" -msgstr "" - -#: src/cats/sql_create.c:429 -#, c-format -msgid "Create DB Media record %s failed. ERR=%s\n" -msgstr "" - -#: src/cats/sql_create.c:478 -#, c-format -msgid "More than one Client!: %d\n" -msgstr "" - -#: src/cats/sql_create.c:483 -#, c-format -msgid "error fetching Client row: %s\n" -msgstr "" - -#: src/cats/sql_create.c:510 -#, c-format -msgid "Create DB Client record %s failed. ERR=%s\n" -msgstr "" - -#: src/cats/sql_create.c:543 src/cats/sql_get.c:192 -#, c-format -msgid "More than one Path!: %s for path: %s\n" -msgstr "" - -#: src/cats/sql_create.c:576 -#, c-format -msgid "Create db Path record %s failed. ERR=%s\n" -msgstr "" - -#: src/cats/sql_create.c:621 -#, c-format -msgid "Create DB Counters record %s failed. ERR=%s\n" -msgstr "" - -#: src/cats/sql_create.c:657 -#, c-format -msgid "More than one FileSet!: %d\n" -msgstr "" - -#: src/cats/sql_create.c:662 -#, c-format -msgid "error fetching FileSet row: ERR=%s\n" -msgstr "" - -#: src/cats/sql_create.c:692 -#, c-format -msgid "Create DB FileSet record %s failed. ERR=%s\n" -msgstr "" - -#: src/cats/sql_create.c:930 -#, c-format -msgid "Create db File record %s failed. ERR=%s" -msgstr "" - -#: src/cats/sql_create.c:953 -#, c-format -msgid "Attempt to put non-attributes into catalog. Stream=%d\n" -msgstr "" - -#: src/cats/sql_create.c:969 -msgid "Cannot Copy/Migrate job using BaseJob.\n" -msgstr "" - -#: src/cats/sql_create.c:1069 src/cats/sql_get.c:1196 -msgid "ERR=JobIds are empty\n" -msgstr "" - -#: src/cats/sql_create.c:1122 -#, c-format -msgid "Create db Object record %s failed. ERR=%s" -msgstr "" - -#: src/cats/sql_delete.c:60 -#, c-format -msgid "No pool record %s exists\n" -msgstr "" - -#: src/cats/sql_delete.c:65 -#, c-format -msgid "Expecting one pool record, got %d\n" -msgstr "" - -#: src/cats/sql_delete.c:71 -#, c-format -msgid "Error fetching row %s\n" -msgstr "" - -#: src/cats/sql_find.c:84 src/cats/sql_find.c:113 src/cats/sql_find.c:167 -#, c-format -msgid "" -"Query error for start time request: ERR=%s\n" -"CMD=%s\n" -msgstr "" - -#: src/cats/sql_find.c:90 src/cats/sql_find.c:173 -msgid "No prior Full backup Job record found.\n" -msgstr "" - -#: src/cats/sql_find.c:102 -#, c-format -msgid "Unknown level=%d\n" -msgstr "" - -#: src/cats/sql_find.c:119 -#, c-format -msgid "" -"No Job record found: ERR=%s\n" -"CMD=%s\n" -msgstr "" - -#: src/cats/sql_find.c:274 -#, c-format -msgid "Unknown Job level=%d\n" -msgstr "" - -#: src/cats/sql_find.c:284 -#, c-format -msgid "No Job found for: %s.\n" -msgstr "" - -#: src/cats/sql_find.c:295 -#, c-format -msgid "No Job found for: %s\n" -msgstr "" - -#: src/cats/sql_find.c:396 -#, c-format -msgid "Request for Volume item %d greater than max %d or less than 1\n" -msgstr "" - -#: src/cats/sql_find.c:411 -#, c-format -msgid "No Volume record found for item %d.\n" -msgstr "" - -#: src/cats/sql_get.c:140 -#, c-format -msgid "Error fetching row: %s\n" -msgstr "" - -#: src/cats/sql_get.c:147 -#, c-format -msgid "get_file_record want 1 got rows=%d PathId=%s Filename=%s\n" -msgstr "" - -#: src/cats/sql_get.c:155 -#, c-format -msgid "File record for PathId=%s Filename=%s not found.\n" -msgstr "" - -#: src/cats/sql_get.c:161 -msgid "File record not found in Catalog.\n" -msgstr "" - -#: src/cats/sql_get.c:203 -#, c-format -msgid "Get DB path record %s found bad record: %s\n" -msgstr "" - -#: src/cats/sql_get.c:216 -#, c-format -msgid "Path record: %s not found.\n" -msgstr "" - -#: src/cats/sql_get.c:220 -#, c-format -msgid "Path record: %s not found in Catalog.\n" -msgstr "" - -#: src/cats/sql_get.c:259 -#, c-format -msgid "No Job found for JobId %s\n" -msgstr "" - -#: src/cats/sql_get.c:330 src/cats/sql_get.c:385 -#, c-format -msgid "No volumes found for JobId=%d\n" -msgstr "" - -#: src/cats/sql_get.c:336 src/cats/sql_get.c:396 -#, c-format -msgid "Error fetching row %d: ERR=%s\n" -msgstr "" - -#: src/cats/sql_get.c:350 -#, c-format -msgid "No Volume for JobId %d found in Catalog.\n" -msgstr "" - -#: src/cats/sql_get.c:489 -#, c-format -msgid "Pool id select failed: ERR=%s\n" -msgstr "" - -#: src/cats/sql_get.c:526 -#, c-format -msgid "Client id select failed: ERR=%s\n" -msgstr "" - -#: src/cats/sql_get.c:565 -#, c-format -msgid "More than one Pool! Num=%s\n" -msgstr "" - -#: src/cats/sql_get.c:628 -msgid "Pool record not found in Catalog.\n" -msgstr "" - -#: src/cats/sql_get.c:691 -#, c-format -msgid "Error got %s RestoreObjects but expected only one!\n" -msgstr "" - -#: src/cats/sql_get.c:696 -#, c-format -msgid "RestoreObject record \"%d\" not found.\n" -msgstr "" - -#: src/cats/sql_get.c:721 src/dird/ua_run.c:703 -#, c-format -msgid "Decompression failed. Len wanted=%d got=%d. Object=%s\n" -msgstr "" - -#: src/cats/sql_get.c:739 -msgid "RestoreObject record not found in Catalog.\n" -msgstr "" - -#: src/cats/sql_get.c:775 -#, c-format -msgid "More than one Client!: %s\n" -msgstr "" - -#: src/cats/sql_get.c:792 src/cats/sql_get.c:796 -msgid "Client record not found in Catalog.\n" -msgstr "" - -#: src/cats/sql_get.c:821 -#, c-format -msgid "More than one Counter!: %d\n" -msgstr "" - -#: src/cats/sql_get.c:826 -#, c-format -msgid "error fetching Counter row: %s\n" -msgstr "" - -#: src/cats/sql_get.c:846 -#, c-format -msgid "Counter record: %s not found in Catalog.\n" -msgstr "" - -#: src/cats/sql_get.c:884 -#, c-format -msgid "Error got %s FileSets but expected only one!\n" -msgstr "" - -#: src/cats/sql_get.c:889 -#, c-format -msgid "FileSet record \"%s\" not found.\n" -msgstr "" - -#: src/cats/sql_get.c:899 -msgid "FileSet record not found in Catalog.\n" -msgstr "" - -#: src/cats/sql_get.c:998 -#, c-format -msgid "Media id select failed: ERR=%s\n" -msgstr "" - -#: src/cats/sql_get.c:1036 -#, c-format -msgid "query dbids failed: ERR=%s\n" -msgstr "" - -#: src/cats/sql_get.c:1091 -#, c-format -msgid "More than one Volume!: %s\n" -msgstr "" - -#: src/cats/sql_get.c:1150 -#, c-format -msgid "Media record with MediaId=%s not found.\n" -msgstr "" - -#: src/cats/sql_get.c:1153 -#, c-format -msgid "Media record for Volume name \"%s\" not found.\n" -msgstr "" - -#: src/cats/sql_get.c:1160 -#, c-format -msgid "Media record for MediaId=%u not found in Catalog.\n" -msgstr "" - -#: src/cats/sql_get.c:1163 -#, c-format -msgid "Media record for Volume Name \"%s\" not found in Catalog.\n" -msgstr "" - -#: src/cats/sql_get.c:1463 -#, c-format -msgid "More than one Snapshot!: %s\n" -msgstr "" - -#: src/cats/sql_get.c:1492 src/cats/sql_get.c:1502 -#, c-format -msgid "Snapshot record with SnapshotId=%s not found.\n" -msgstr "" - -#: src/cats/sql_get.c:1495 src/cats/sql_get.c:1505 -#, c-format -msgid "Snapshot record for Snapshot name \"%s\" not found.\n" -msgstr "" - -#: src/cats/sql_list.c:45 -#, c-format -msgid "Query failed: %s\n" -msgstr "" - -#: src/cats/sql_list.c:314 -msgid "These JobIds have copies as follows:\n" -msgstr "" - -#: src/cats/sql_list.c:316 -msgid "The catalog contains copies as follows:\n" -msgstr "" - -#: src/cats/sqlite.c:192 -#, c-format -msgid "Database %s does not exist, please create it.\n" -msgstr "" - -#: src/cats/sqlite.c:214 -#, c-format -msgid "Unable to open Database=%s. ERR=%s\n" -msgstr "" - -#: src/cats/sqlite.c:215 -msgid "unknown" -msgstr "" - -#: src/console/authenticate.c:119 src/dird/authenticate.c:122 -msgid "" -"Authorization problem: Remote server did not advertise required TLS " -"support.\n" -msgstr "" - -#: src/console/authenticate.c:126 src/dird/authenticate.c:129 -#: src/filed/authenticate.c:102 src/filed/authenticate.c:208 -#: src/stored/authenticate.c:94 src/stored/authenticate.c:187 -#: src/stored/authenticate.c:295 -msgid "Authorization problem: Remote server requires TLS.\n" -msgstr "" - -#: src/console/authenticate.c:135 -msgid "TLS negotiation failed\n" -msgstr "" - -#: src/console/authenticate.c:149 -#: src/qt-console/tray-monitor/authenticate.cpp:85 -#, c-format -msgid "Bad response to Hello command: ERR=%s\n" -msgstr "" - -#: src/console/authenticate.c:156 -#: src/qt-console/tray-monitor/authenticate.cpp:92 -msgid "Director rejected Hello command\n" -msgstr "" - -#: src/console/authenticate.c:174 -msgid "" -"Director authorization problem.\n" -"Most likely the passwords do not agree.\n" -"If you are using TLS, there may have been a certificate validation error " -"during the TLS handshake.\n" -"For help, please see " -msgstr "" - -#: src/console/bbconsjson.c:79 src/console/console.c:118 -#, c-format -msgid "" -"\n" -"%sVersion: " -msgstr "" - -#: src/console/bbconsjson.c:152 src/dird/bdirjson.c:141 -#: src/filed/bfdjson.c:116 src/stored/bsdjson.c:126 -#, c-format -msgid "Please use valid -l argument: %s\n" -msgstr "" - -#: src/console/bbconsjson.c:213 src/console/console.c:1157 -#: src/dird/bdirjson.c:235 src/dird/dird.c:283 src/dird/dird.c:311 -#: src/dird/dird.c:548 src/dird/dird.c:551 src/filed/bfdjson.c:199 -#: src/filed/filed.c:210 src/qt-console/main.cpp:161 src/stored/bsdjson.c:211 -#: src/stored/stored.c:236 -#, c-format -msgid "Please correct configuration file: %s\n" -msgstr "" - -#: src/console/bbconsjson.c:430 src/console/bbconsjson.c:461 -#: src/console/console.c:1347 src/console/console.c:1377 -#: src/dird/bdirjson.c:1163 src/dird/bdirjson.c:1201 src/dird/bdirjson.c:1256 -#: src/dird/dird.c:688 src/dird/dird.c:906 src/dird/dird.c:961 -#: src/dird/dird.c:1168 src/filed/bfdjson.c:483 src/filed/bfdjson.c:526 -#: src/filed/filed.c:379 src/filed/filed.c:579 src/qt-console/main.cpp:218 -#: src/qt-console/main.cpp:248 src/stored/bsdjson.c:494 -#: src/stored/stored.c:362 -msgid "TLS required but not configured in Bacula.\n" -msgstr "" - -#: src/console/bbconsjson.c:439 src/console/console.c:1355 -#: src/qt-console/main.cpp:226 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Director \"%s\" in %s. At least one CA certificate store is required.\n" -msgstr "" - -#: src/console/bbconsjson.c:448 src/console/console.c:1364 -#: src/qt-console/main.cpp:235 -#, c-format -msgid "" -"No Director resource defined in %s\n" -"Without that I don't how to speak to the Director :-(\n" -msgstr "" - -#: src/console/bbconsjson.c:468 src/console/console.c:1384 -#: src/qt-console/main.cpp:256 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Console \"%s\" in %s.\n" -msgstr "" - -#: src/console/console.c:170 -msgid "input from file" -msgstr "" - -#: src/console/console.c:171 -msgid "output to file" -msgstr "" - -#: src/console/console.c:172 -msgid "quit" -msgstr "" - -#: src/console/console.c:173 -msgid "output to file and terminal" -msgstr "" - -#: src/console/console.c:174 -msgid "sleep specified time" -msgstr "" - -#: src/console/console.c:175 -msgid "print current time" -msgstr "" - -#: src/console/console.c:176 -msgid "print Console's version" -msgstr "" - -#: src/console/console.c:177 -msgid "echo command string" -msgstr "" - -#: src/console/console.c:178 -msgid "encode command string" -msgstr "" - -#: src/console/console.c:179 -msgid "execute an external command" -msgstr "" - -#: src/console/console.c:180 -msgid "exit = quit" -msgstr "" - -#: src/console/console.c:181 -msgid "send a file to the director" -msgstr "" - -#: src/console/console.c:182 -msgid "zed_keys = use zed keys instead of bash keys" -msgstr "" - -#: src/console/console.c:183 -msgid "help listing" -msgstr "" - -#: src/console/console.c:185 -msgid "set command separator" -msgstr "" - -#: src/console/console.c:219 -msgid ": is an invalid command\n" -msgstr "" - -#: src/console/console.c:714 -msgid "Illegal separator character.\n" -msgstr "" - -#: src/console/console.c:747 -msgid "Command logic problem\n" -msgstr "" - -#: src/console/console.c:962 -#, c-format -msgid "Can't find %s in Director list\n" -msgstr "" - -#: src/console/console.c:970 -msgid "Available Directors:\n" -msgstr "" - -#: src/console/console.c:974 -#, c-format -msgid "%2d: %s at %s:%d\n" -msgstr "" - -#: src/console/console.c:978 -msgid "Select Director by entering a number: " -msgstr "" - -#: src/console/console.c:985 -#, c-format -msgid "%s is not a number. You must enter a number between 1 and %d\n" -msgstr "" - -#: src/console/console.c:992 -#, c-format -msgid "You must enter a number between 1 and %d\n" -msgstr "" - -#: src/console/console.c:1153 src/dird/dird.c:279 src/filed/filed.c:205 -#: src/qt-console/main.cpp:157 src/stored/stored.c:232 -#: src/stored/test-dedup.c:836 src/stored/tune-dde.c:330 -msgid "Cryptography library initialization failed.\n" -msgstr "" - -#: src/console/console.c:1188 -#, c-format -msgid "Connecting to Director %s:%d\n" -msgstr "" - -#: src/console/console.c:1205 src/qt-console/bcomm/dircomm.cpp:151 -#, c-format -msgid "Failed to initialize TLS context for Console \"%s\".\n" -msgstr "" - -#: src/console/console.c:1225 src/qt-console/bcomm/dircomm.cpp:174 -#, c-format -msgid "Failed to initialize TLS context for Director \"%s\".\n" -msgstr "" - -#: src/console/console.c:1259 -msgid "Enter a period to cancel a command.\n" -msgstr "" - -#: src/console/console.c:1410 -msgid "Too many arguments on input command.\n" -msgstr "" - -#: src/console/console.c:1414 -msgid "First argument to input command must be a filename.\n" -msgstr "" - -#: src/console/console.c:1420 -#, c-format -msgid "Cannot open file %s for input. ERR=%s\n" -msgstr "" - -#: src/console/console.c:1452 -msgid "Too many arguments on output/tee command.\n" -msgstr "" - -#: src/console/console.c:1469 -#, c-format -msgid "Cannot open file %s for output. ERR=%s\n" -msgstr "" - -#: src/console/console.c:1488 -msgid "Too many arguments. Enclose command in double quotes.\n" -msgstr "" - -#: src/console/console.c:1497 -#, c-format -msgid "Cannot popen(\"%s\", \"r\"): ERR=%s\n" -msgstr "" - -#: src/console/console.c:1509 -#, c-format -msgid "@exec error: ERR=%s\n" -msgstr "" - -#: src/console/console.c:1542 -msgid "The String to encode is too long\n" -msgstr "" - -#: src/console/console_conf.c:130 src/qt-console/bat_conf.cpp:131 -#, c-format -msgid "No record for %d %s\n" -msgstr "" - -#: src/console/console_conf.c:139 -#, c-format -msgid "Console: name=%s rcfile=%s histfile=%s\n" -msgstr "" - -#: src/console/console_conf.c:143 src/qt-console/bat_conf.cpp:140 -#, c-format -msgid "Director: name=%s address=%s DIRport=%d\n" -msgstr "" - -#: src/console/console_conf.c:147 src/console/console_conf.c:227 -#: src/console/console_conf.c:268 src/console/console_conf.c:295 -#: src/filed/filed_conf.c:422 src/filed/filed_conf.c:486 -#: src/filed/filed_conf.c:516 src/qt-console/bat_conf.cpp:151 -#: src/qt-console/bat_conf.cpp:233 src/qt-console/bat_conf.cpp:279 -#: src/qt-console/bat_conf.cpp:309 src/stored/stored_conf.c:575 -#: src/stored/stored_conf.c:662 src/stored/stored_conf.c:697 -#, c-format -msgid "Unknown resource type %d\n" -msgstr "" - -#: src/console/console_conf.c:249 src/dird/dird_conf.c:1466 -#: src/dird/dird_conf.c:1481 src/filed/filed_conf.c:447 -#: src/qt-console/bat_conf.cpp:257 -#: src/qt-console/tray-monitor/tray_conf.cpp:274 -#, c-format -msgid "%s item is required in %s resource, but not found.\n" -msgstr "" - -#: src/dird/admin.c:54 -#, c-format -msgid "Start Admin JobId %d, Job=%s\n" -msgstr "" - -#: src/dird/admin.c:79 src/dird/backup.c:801 src/dird/mac.c:719 -#: src/dird/vbackup.c:362 -#, c-format -msgid "Error getting Job record for Job report: ERR=%s" -msgstr "" - -#: src/dird/admin.c:87 -msgid "Admin OK" -msgstr "" - -#: src/dird/admin.c:91 -msgid "*** Admin Error ***" -msgstr "" - -#: src/dird/admin.c:95 -msgid "Admin Canceled" -msgstr "" - -#: src/dird/admin.c:99 src/dird/backup.c:857 src/dird/restore.c:671 -#: src/dird/vbackup.c:412 -#, c-format -msgid "Inappropriate term code: %c\n" -msgstr "" - -#: src/dird/admin.c:107 src/lib/status.h:205 src/lib/status.h:216 -#: src/lib/status.h:230 src/lib/status.h:234 src/lib/status.h:238 -msgid "Bacula " -msgstr "" - -#: src/dird/authenticate.c:78 src/dird/authenticate.c:79 -#: src/qt-console/tray-monitor/authenticate.cpp:120 -#, c-format -msgid "Error sending Hello to Storage daemon. ERR=%s\n" -msgstr "" - -#: src/dird/authenticate.c:108 -msgid "Director and Storage daemon passwords or names not the same.\n" -msgstr "" - -#: src/dird/authenticate.c:110 -#, c-format -msgid "" -"Director unable to authenticate with Storage daemon at \"%s:%d\". Possible " -"causes:\n" -"Passwords or names not the same or\n" -"Maximum Concurrent Jobs exceeded on the SD or\n" -"SD networking messed up (restart daemon).\n" -"For help, please see: " -msgstr "" - -#: src/dird/authenticate.c:138 -#, c-format -msgid "TLS negotiation failed with SD at \"%s:%d\"\n" -msgstr "" - -#: src/dird/authenticate.c:150 -#, c-format -msgid "bdird get resource type \n" -" -n get resource \n" -" -l get only directives matching dirs (use with -r)\n" -" -D get only data\n" -" -R do not apply JobDefs to Job\n" -" -c set configuration file to file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -t test - read configuration and exit\n" -" -s output in show text format\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" - -#: src/dird/bdirjson.c:1141 src/dird/dird.c:666 -#, c-format -msgid "" -"No Director resource defined in %s\n" -"Without that I don't know who I am :-(\n" -msgstr "" - -#: src/dird/bdirjson.c:1149 src/dird/dird.c:674 src/filed/bfdjson.c:476 -#: src/filed/filed.c:341 -#, c-format -msgid "No Messages resource defined in %s\n" -msgstr "" - -#: src/dird/bdirjson.c:1154 src/dird/dird.c:679 -#, c-format -msgid "Only one Director resource permitted in %s\n" -msgstr "" - -#: src/dird/bdirjson.c:1171 src/dird/dird.c:696 src/filed/bfdjson.c:536 -#: src/filed/filed.c:589 src/stored/bsdjson.c:533 src/stored/stored.c:418 -#, c-format -msgid "\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n" -msgstr "" - -#: src/dird/bdirjson.c:1177 src/dird/dird.c:702 src/filed/bfdjson.c:542 -#: src/filed/filed.c:595 src/stored/bsdjson.c:539 src/stored/stored.c:424 -#, c-format -msgid "\"TLS Key\" file not defined for Director \"%s\" in %s.\n" -msgstr "" - -#: src/dird/bdirjson.c:1184 src/dird/dird.c:709 src/filed/bfdjson.c:548 -#: src/filed/filed.c:601 src/stored/bsdjson.c:545 src/stored/stored.c:430 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Director \"%s\" in %s. At least one CA certificate store is required when " -"using \"TLS Verify Peer\".\n" -msgstr "" - -#: src/dird/bdirjson.c:1210 src/dird/dird.c:915 -#, c-format -msgid "\"TLS Certificate\" file not defined for Console \"%s\" in %s.\n" -msgstr "" - -#: src/dird/bdirjson.c:1216 src/dird/dird.c:921 -#, c-format -msgid "\"TLS Key\" file not defined for Console \"%s\" in %s.\n" -msgstr "" - -#: src/dird/bdirjson.c:1223 src/dird/dird.c:928 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Console \"%s\" in %s. At least one CA certificate store is required when " -"using \"TLS Verify Peer\".\n" -msgstr "" - -#: src/dird/bdirjson.c:1240 src/dird/dird.c:945 src/dird/dird.c:985 -#: src/filed/filed.c:404 -#, c-format -msgid "Failed to initialize TLS context for File daemon \"%s\" in %s.\n" -msgstr "" - -#: src/dird/bdirjson.c:1263 src/dird/dird.c:968 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"File daemon \"%s\" in %s.\n" -msgstr "" - -#: src/dird/bdirjson.c:1272 src/dird/dird.c:736 -#, c-format -msgid "No Job records defined in %s\n" -msgstr "" - -#: src/dird/bdirjson.c:1339 src/dird/bdirjson.c:1352 src/dird/dird.c:805 -#: src/dird/dird.c:818 -#, c-format -msgid "Hey something is wrong. p=0x%lu\n" -msgstr "" - -#: src/dird/bdirjson.c:1413 src/dird/dird.c:880 -#, c-format -msgid "\"%s\" directive in Job \"%s\" resource is required, but not found.\n" -msgstr "" - -#: src/dird/bdirjson.c:1420 src/dird/dird.c:887 -msgid "Too many items in Job resource\n" -msgstr "" - -#: src/dird/bdirjson.c:1424 src/dird/dird.c:891 -#, c-format -msgid "No storage specified in Job \"%s\" nor in Pool.\n" -msgstr "" - -#: src/dird/bsr.c:190 -#, c-format -msgid "Unable to get Job record. ERR=%s\n" -msgstr "" - -#: src/dird/bsr.c:201 -#, c-format -msgid "Unable to get Job Volume Parameters. ERR=%s\n" -msgstr "" - -#: src/dird/bsr.c:249 -#, c-format -msgid "Unable to create bootstrap file %s. ERR=%s\n" -msgstr "" - -#: src/dird/bsr.c:258 -msgid "No files found to read. No bootstrap file written.\n" -msgstr "" - -#: src/dird/bsr.c:262 -msgid "Error writing bsr file.\n" -msgstr "" - -#: src/dird/bsr.c:313 -msgid "" -"The Job will require the following (*=>InChanger):\n" -" Volume(s) Storage(s) SD Device(s)\n" -"===========================================================================\n" -msgstr "" - -#: src/dird/bsr.c:333 -msgid "No Volumes found to restore.\n" -msgstr "" - -#: src/dird/bsr.c:335 -msgid "" -"\n" -"Volumes marked with \"*\" are in the Autochanger.\n" -msgstr "" - -#: src/dird/catreq.c:128 src/dird/catreq.c:382 -#, c-format -msgid "1990 Invalid Catalog Request: %s" -msgstr "" - -#: src/dird/catreq.c:129 -#, c-format -msgid "Invalid Catalog request; DB not open: %s" -msgstr "" - -#: src/dird/catreq.c:150 -#, c-format -msgid "Pool \"%s\" not found for SD find media request.\n" -msgstr "" - -#: src/dird/catreq.c:159 -msgid "1901 No Media.\n" -msgstr "" - -#: src/dird/catreq.c:191 -msgid "not in Pool" -msgstr "" - -#: src/dird/catreq.c:193 -msgid "not correct MediaType" -msgstr "" - -#: src/dird/catreq.c:203 -msgid "is not Enabled" -msgstr "" - -#: src/dird/catreq.c:212 -#, c-format -msgid "1998 Volume \"%s\" catalog status is %s, %s.\n" -msgstr "" - -#: src/dird/catreq.c:217 -#, c-format -msgid "1997 Volume \"%s\" not in catalog.\n" -msgstr "" - -#: src/dird/catreq.c:244 -#, c-format -msgid "Unable to get Media record for Volume %s: ERR=%s\n" -msgstr "" - -#: src/dird/catreq.c:246 -#, c-format -msgid "1991 Catalog Request for vol=%s failed: %s" -msgstr "" - -#: src/dird/catreq.c:273 -#, c-format -msgid "Attempt to set Volume Files from %u to %u for Volume \"%s\". Ignored.\n" -msgstr "" - -#: src/dird/catreq.c:332 -#, c-format -msgid "Catalog error updating Media record. %s" -msgstr "" - -#: src/dird/catreq.c:334 -msgid "1993 Update Media error\n" -msgstr "" - -#: src/dird/catreq.c:361 -#, c-format -msgid "Catalog error creating JobMedia record. %s" -msgstr "" - -#: src/dird/catreq.c:363 -msgid "1992 Create JobMedia error\n" -msgstr "" - -#: src/dird/catreq.c:383 -#, c-format -msgid "Invalid Catalog request: %s" -msgstr "" - -#: src/dird/catreq.c:470 -#, c-format -msgid "Attribute create error: ERR=%s" -msgstr "" - -#: src/dird/catreq.c:567 -#, c-format -msgid "Restore object create error. %s" -msgstr "" - -#: src/dird/catreq.c:574 -#, c-format -msgid "%s not same File=%d as attributes=%d\n" -msgstr "" - -#: src/dird/catreq.c:601 -#, c-format -msgid "Catalog error updating file digest. Unsupported digest stream type: %d" -msgstr "" - -#: src/dird/catreq.c:616 -#, c-format -msgid "attribute create error. %s" -msgstr "" - -#: src/dird/catreq.c:622 -#, c-format -msgid "Catalog error updating file digest. %s" -msgstr "" - -#: src/dird/catreq.c:645 -#, c-format -msgid "1994 Invalid Catalog Update: %s" -msgstr "" - -#: src/dird/catreq.c:646 -#, c-format -msgid "Invalid Catalog Update; DB not open: %s" -msgstr "" - -#: src/dird/catreq.c:702 src/dird/catreq.c:717 -#, c-format -msgid "fread attr spool error. ERR=%s\n" -msgstr "" - -#: src/dird/dir_plugins.c:170 src/filed/fd_plugins.c:1129 -#: src/stored/sd_plugins.c:221 -#, c-format -msgid "Loaded plugin: %s\n" -msgstr "" - -#: src/dird/dir_plugins.c:190 src/filed/fd_plugins.c:1150 -#: src/stored/sd_plugins.c:241 -#, c-format -msgid "Plugin magic wrong. Plugin=%s wanted=%s got=%s\n" -msgstr "" - -#: src/dird/dir_plugins.c:198 src/filed/fd_plugins.c:1158 -#: src/stored/sd_plugins.c:249 -#, c-format -msgid "Plugin version incorrect. Plugin=%s wanted=%d got=%d\n" -msgstr "" - -#: src/dird/dir_plugins.c:207 src/filed/fd_plugins.c:1168 -#: src/stored/sd_plugins.c:258 -#, c-format -msgid "Plugin license incompatible. Plugin=%s license=%s\n" -msgstr "" - -#: src/dird/dir_plugins.c:215 src/filed/fd_plugins.c:1176 -#: src/stored/sd_plugins.c:266 -#, c-format -msgid "Plugin size incorrect. Plugin=%s wanted=%d got=%d\n" -msgstr "" - -#: src/dird/dird.c:121 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bacula-dir [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c set configuration file to file\n" -" -d [,] set debug level to , debug tags to \n" -" -dt print timestamp in debug output\n" -" -T set trace on\n" -" -f run in foreground (for debugging)\n" -" -g groupid\n" -" -m print kaboom output (for debugging)\n" -" -r run now\n" -" -s no signals\n" -" -t test - read configuration and exit\n" -" -u userid\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" - -#: src/dird/dird.c:502 -msgid "Already doing a reload request, request ignored.\n" -msgstr "" - -#: src/dird/dird.c:526 -msgid "Too many open reload requests. Request ignored.\n" -msgstr "" - -#: src/dird/dird.c:549 -msgid "Out of reload table entries. Giving up.\n" -msgstr "" - -#: src/dird/dird.c:552 -msgid "Resetting previous configuration.\n" -msgstr "" - -#: src/dird/dird.c:728 src/filed/filed.c:620 src/stored/stored.c:449 -#, c-format -msgid "Failed to initialize TLS context for Director \"%s\" in %s.\n" -msgstr "" - -#: src/dird/dird.c:1044 src/dird/dird.c:1046 src/stored/bscan.c:287 -#: src/stored/bscan.c:294 -#, c-format -msgid "Could not open Catalog \"%s\", database \"%s\".\n" -msgstr "" - -#: src/dird/dird.c:1049 src/stored/bscan.c:290 src/tools/cats_test.c:364 -#, c-format -msgid "%s" -msgstr "" - -#: src/dird/dird.c:1149 -#, c-format -msgid "Could not create storage record for %s\n" -msgstr "" - -#: src/dird/dird.c:1157 -#, c-format -msgid "Could not update storage record for %s\n" -msgstr "" - -#: src/dird/dird.c:1176 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Storage \"%s\" in %s.\n" -msgstr "" - -#: src/dird/dird.c:1192 src/stored/stored.c:402 -#, c-format -msgid "Failed to initialize TLS context for Storage \"%s\" in %s.\n" -msgstr "" - -#: src/dird/dird.c:1306 src/dird/mac_sql.c:548 src/stored/stored.c:505 -#, c-format -msgid "Could not compile regex pattern \"%s\" ERR=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:579 src/qt-console/tray-monitor/tray_conf.cpp:158 -#, c-format -msgid "No %s resource defined\n" -msgstr "" - -#: src/dird/dird_conf.c:588 -#, c-format -msgid "Director: name=%s MaxJobs=%d FDtimeout=%s SDtimeout=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:593 -#, c-format -msgid " query_file=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:596 src/dird/dird_conf.c:616 src/dird/dird_conf.c:641 -#: src/dird/dird_conf.c:733 src/dird/dird_conf.c:737 src/dird/dird_conf.c:741 -#: src/dird/dird_conf.c:774 src/dird/dird_conf.c:797 src/dird/dird_conf.c:813 -#: src/dird/dird_conf.c:826 src/dird/dird_conf.c:1069 -#: src/dird/dird_conf.c:1076 -msgid " --> " -msgstr "" - -#: src/dird/dird_conf.c:601 -#, c-format -msgid "Console: name=%s SSL=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:606 -#, c-format -msgid "Counter: name=%s min=%d max=%d cur=%d wrapcntr=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:611 -#, c-format -msgid "Counter: name=%s min=%d max=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:625 -#, c-format -msgid "Client: Name=%s Enabled=%d Address=%s FDport=%d MaxJobs=%u\n" -msgstr "" - -#: src/dird/dird_conf.c:629 -#, c-format -msgid " JobRetention=%s FileRetention=%s AutoPrune=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:637 src/dird/dird_conf.c:726 -#, c-format -msgid " MaximumBandwidth=%lld\n" -msgstr "" - -#: src/dird/dird_conf.c:649 -#, c-format -msgid "" -"Device: name=%s ok=%d num_writers=%d max_writers=%d\n" -" reserved=%d open=%d append=%d read=%d labeled=%d offline=%d autochgr=" -"%d\n" -" poolid=%s volname=%s MediaType=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:664 -#, c-format -msgid "" -"%s: name=%s address=%s SDport=%d MaxJobs=%u\n" -" DeviceName=%s MediaType=%s StorageId=%s Autochanger=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:682 -msgid " Parent --> " -msgstr "" - -#: src/dird/dird_conf.c:687 -msgid " Shared --> " -msgstr "" - -#: src/dird/dird_conf.c:696 -#, c-format -msgid "" -"Catalog: name=%s address=%s DBport=%d db_name=%s\n" -" db_driver=%s db_user=%s MutliDBConn=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:709 -#, c-format -msgid "%s: name=%s JobType=%d level=%s Priority=%d Enabled=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:710 src/dird/ua_prune.c:603 src/dird/ua_run.c:1013 -#: src/dird/ua_select.c:292 src/dird/ua_select.c:315 src/dird/ua_select.c:356 -#: src/dird/ua_select.c:1453 -msgid "Job" -msgstr "" - -#: src/dird/dird_conf.c:710 -msgid "JobDefs" -msgstr "" - -#: src/dird/dird_conf.c:714 -#, c-format -msgid "" -" MaxJobs=%u Resched=%d Times=%d Interval=%s Spool=%d WritePartAfterJob=" -"%d\n" -msgstr "" - -#: src/dird/dird_conf.c:720 -#, c-format -msgid " SpoolSize=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:723 -#, c-format -msgid " Accurate=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:730 -#, c-format -msgid " SelectionType=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:745 -#, c-format -msgid " --> Where=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:748 -#, c-format -msgid " --> RegexWhere=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:751 -#, c-format -msgid " --> Bootstrap=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:754 -#, c-format -msgid " --> WriteBootstrap=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:757 -#, c-format -msgid " --> PluginOptions=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:760 -#, c-format -msgid " --> MaxRunTime=%u\n" -msgstr "" - -#: src/dird/dird_conf.c:763 -#, c-format -msgid " --> MaxWaitTime=%u\n" -msgstr "" - -#: src/dird/dird_conf.c:766 -#, c-format -msgid " --> MaxStartDelay=%u\n" -msgstr "" - -#: src/dird/dird_conf.c:769 -#, c-format -msgid " --> MaxRunSchedTime=%u\n" -msgstr "" - -#: src/dird/dird_conf.c:781 -#, c-format -msgid " --> Base %s\n" -msgstr "" - -#: src/dird/dird_conf.c:787 src/lib/runscript.c:286 -msgid " --> RunScript\n" -msgstr "" - -#: src/dird/dird_conf.c:788 src/lib/runscript.c:287 -#, c-format -msgid " --> Command=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:789 src/lib/runscript.c:288 -#, c-format -msgid " --> Target=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:790 src/lib/runscript.c:289 -#, c-format -msgid " --> RunOnSuccess=%u\n" -msgstr "" - -#: src/dird/dird_conf.c:791 src/lib/runscript.c:290 -#, c-format -msgid " --> RunOnFailure=%u\n" -msgstr "" - -#: src/dird/dird_conf.c:792 src/lib/runscript.c:291 -#, c-format -msgid " --> FailJobOnError=%u\n" -msgstr "" - -#: src/dird/dird_conf.c:793 src/lib/runscript.c:292 -#, c-format -msgid " --> RunWhen=%u\n" -msgstr "" - -#: src/dird/dird_conf.c:801 -msgid " --> FullBackup" -msgstr "" - -#: src/dird/dird_conf.c:805 -msgid " --> IncrementalBackup" -msgstr "" - -#: src/dird/dird_conf.c:809 -msgid " --> DifferentialBackup" -msgstr "" - -#: src/dird/dird_conf.c:819 -#, c-format -msgid " --> Run=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:823 -#, c-format -msgid " --> SelectionPattern=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:837 -#, c-format -msgid "FileSet: name=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:931 -#, c-format -msgid "Schedule: Name=%s Enabled=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:937 -#, c-format -msgid " --> Run Level=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:939 -#, c-format -msgid " MaxRunSchedTime=%u\n" -msgstr "" - -#: src/dird/dird_conf.c:942 -#, c-format -msgid " Priority=%u\n" -msgstr "" - -#: src/dird/dird_conf.c:944 -msgid " hour=" -msgstr "" - -#: src/dird/dird_conf.c:953 -msgid " mday=" -msgstr "" - -#: src/dird/dird_conf.c:962 -msgid " month=" -msgstr "" - -#: src/dird/dird_conf.c:971 -msgid " wday=" -msgstr "" - -#: src/dird/dird_conf.c:980 -msgid " wom=" -msgstr "" - -#: src/dird/dird_conf.c:989 -msgid " woy=" -msgstr "" - -#: src/dird/dird_conf.c:998 -#, c-format -msgid " mins=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:1000 src/dird/dird_conf.c:1004 -#: src/dird/dird_conf.c:1008 -msgid " --> " -msgstr "" - -#: src/dird/dird_conf.c:1017 -#, c-format -msgid "Schedule: name=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1025 -#, c-format -msgid "Pool: name=%s PoolType=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1027 -#, c-format -msgid " use_cat=%d use_once=%d cat_files=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:1030 -#, c-format -msgid " max_vols=%d auto_prune=%d VolRetention=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1033 -#, c-format -msgid " VolUse=%s recycle=%d LabelFormat=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1037 -#, c-format -msgid " CleaningPrefix=%s LabelType=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:1039 -#, c-format -msgid " RecyleOldest=%d PurgeOldest=%d ActionOnPurge=%d\n" -msgstr "" - -#: src/dird/dird_conf.c:1043 -#, c-format -msgid " MaxVolJobs=%d MaxVolFiles=%d MaxVolBytes=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1047 -#, c-format -msgid " MigTime=%s MigHiBytes=%s MigLoBytes=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1051 -#, c-format -msgid " JobRetention=%s FileRetention=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1055 -#, c-format -msgid " NextPool=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1058 -#, c-format -msgid " RecyclePool=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1061 -#, c-format -msgid " ScratchPool=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1064 -#, c-format -msgid " Catalog=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1084 -#, c-format -msgid "Messages: name=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1086 -#, c-format -msgid " mailcmd=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1088 -#, c-format -msgid " opcmd=%s\n" -msgstr "" - -#: src/dird/dird_conf.c:1092 src/qt-console/tray-monitor/tray_conf.cpp:189 -#, c-format -msgid "Unknown resource type %d in dump_resource.\n" -msgstr "" - -#: src/dird/dird_conf.c:1437 src/qt-console/tray-monitor/tray_conf.cpp:247 -#, c-format -msgid "Unknown resource type %d in free_resource.\n" -msgstr "" - -#: src/dird/dird_conf.c:1472 src/lib/parse_conf.c:259 -#: src/qt-console/tray-monitor/tray_conf.cpp:280 -#, c-format -msgid "Too many items in %s resource\n" -msgstr "" - -#: src/dird/dird_conf.c:1512 -#, c-format -msgid "Cannot find Pool resource %s\n" -msgstr "" - -#: src/dird/dird_conf.c:1523 -#, c-format -msgid "Cannot find Console resource %s\n" -msgstr "" - -#: src/dird/dird_conf.c:1529 src/filed/filed_conf.c:467 -#: src/stored/stored_conf.c:628 -#, c-format -msgid "Cannot find Director resource %s\n" -msgstr "" - -#: src/dird/dird_conf.c:1538 src/stored/stored_conf.c:634 -#, c-format -msgid "Cannot find Storage resource %s\n" -msgstr "" - -#: src/dird/dird_conf.c:1554 -#, c-format -msgid "Cannot find Job resource %s\n" -msgstr "" - -#: src/dird/dird_conf.c:1605 -#, c-format -msgid "Cannot find Counter resource %s\n" -msgstr "" - -#: src/dird/dird_conf.c:1613 src/filed/filed_conf.c:474 -#, c-format -msgid "Cannot find Client resource %s\n" -msgstr "" - -#: src/dird/dird_conf.c:1626 -#, c-format -msgid "Cannot find Schedule resource %s\n" -msgstr "" - -#: src/dird/dird_conf.c:1631 src/dird/dird_conf.c:1697 -#: src/qt-console/tray-monitor/tray_conf.cpp:300 -#: src/qt-console/tray-monitor/tray_conf.cpp:338 -#, c-format -msgid "Unknown resource type %d in save_resource.\n" -msgstr "" - -#: src/dird/dird_conf.c:1714 -#, c-format -msgid "Expected one of: %s, got: %s" -msgstr "" - -#: src/dird/dird_conf.c:1753 -#, c-format -msgid "Could not find Storage Resource %s referenced on line %d : %s\n" -msgstr "" - -#: src/dird/dird_conf.c:1758 -#, c-format -msgid "" -"Attempt to redefine Storage resource \"%s\" referenced on line %d : %s\n" -msgstr "" - -#: src/dird/dird_conf.c:1833 -#, c-format -msgid "Expected a Migration Job Type keyword, got: %s" -msgstr "" - -#: src/dird/dird_conf.c:1859 -#, c-format -msgid "Expected a Job Type keyword, got: %s" -msgstr "" - -#: src/dird/dird_conf.c:1883 -#, c-format -msgid "Expected a Job Level keyword, got: %s" -msgstr "" - -#: src/dird/dird_conf.c:1903 -#, c-format -msgid "Expected a Restore replacement option, got: %s" -msgstr "" - -#: src/dird/dird_conf.c:1955 src/dird/dird_conf.c:2071 src/lib/ini.c:636 -#: src/lib/parse_conf.c:828 src/lib/parse_conf.c:844 -#, c-format -msgid "Expect %s, got: %s" -msgstr "" - -#: src/dird/dird_conf.c:1977 src/lib/parse_conf.c:537 -#, c-format -msgid "Could not find config Resource %s referenced on line %d : %s\n" -msgstr "" - -#: src/dird/dird_conf.c:2111 src/dird/inc_conf.c:701 -#, c-format -msgid "Expecting open brace. Got %s" -msgstr "" - -#: src/dird/dird_conf.c:2125 src/dird/inc_conf.c:370 src/dird/inc_conf.c:716 -#, c-format -msgid "Expecting keyword, got: %s\n" -msgstr "" - -#: src/dird/dird_conf.c:2131 src/dird/inc_conf.c:378 src/dird/inc_conf.c:722 -#: src/lib/parse_conf.c:1037 -#, c-format -msgid "expected an equals, got: %s" -msgstr "" - -#: src/dird/dird_conf.c:2142 src/dird/inc_conf.c:388 src/dird/inc_conf.c:731 -#, c-format -msgid "Keyword %s not permitted in this resource" -msgstr "" - -#: src/dird/expand.c:244 -#, c-format -msgid "Count not update counter %s: ERR=%s\n" -msgstr "" - -#: src/dird/expand.c:416 -#, c-format -msgid "Cannot create var context: ERR=%s\n" -msgstr "" - -#: src/dird/expand.c:421 -#, c-format -msgid "Cannot set var callback: ERR=%s\n" -msgstr "" - -#: src/dird/expand.c:427 -#, c-format -msgid "Cannot set var operate: ERR=%s\n" -msgstr "" - -#: src/dird/expand.c:433 src/dird/expand.c:448 -#, c-format -msgid "Cannot unescape string: ERR=%s\n" -msgstr "" - -#: src/dird/expand.c:441 -#, c-format -msgid "Cannot expand expression \"%s\": ERR=%s\n" -msgstr "" - -#: src/dird/expand.c:459 -#, c-format -msgid "Cannot destroy var context: ERR=%s\n" -msgstr "" - -#: src/dird/fd_cmds.c:81 -msgid "File daemon not defined for current Job\n" -msgstr "" - -#: src/dird/fd_cmds.c:98 -msgid "Client: " -msgstr "" - -#: src/dird/fd_cmds.c:134 -#, c-format -msgid "File daemon \"%s\" rejected Job command: %s\n" -msgstr "" - -#: src/dird/fd_cmds.c:147 -#, c-format -msgid "Error updating Client record. ERR=%s\n" -msgstr "" - -#: src/dird/fd_cmds.c:152 -#, c-format -msgid "FD gave bad response to JobId command: %s\n" -msgstr "" - -#: src/dird/fd_cmds.c:181 src/dird/fd_cmds.c:269 -msgid ", since=" -msgstr "" - -#: src/dird/fd_cmds.c:246 -msgid "No prior or suitable Full backup found in catalog. Doing FULL backup.\n" -msgstr "" - -#: src/dird/fd_cmds.c:247 src/dird/fd_cmds.c:253 src/dird/fd_cmds.c:262 -#, c-format -msgid " (upgraded from %s)" -msgstr "" - -#: src/dird/fd_cmds.c:252 -msgid "" -"No prior or suitable Differential backup found in catalog. Doing " -"Differential backup.\n" -msgstr "" - -#: src/dird/fd_cmds.c:260 -#, c-format -msgid "Prior failed job found in catalog. Upgrading to %s.\n" -msgstr "" - -#: src/dird/fd_cmds.c:338 -#, c-format -msgid "Unimplemented backup level %d %c\n" -msgstr "" - -#: src/dird/fd_cmds.c:420 -msgid "" -"FD compression disabled for this Job because AllowCompress=No in Storage " -"resource.\n" -msgstr "" - -#: src/dird/fd_cmds.c:520 src/filed/job.c:1094 -#, c-format -msgid "Cannot run program: %s. ERR=%s\n" -msgstr "" - -#: src/dird/fd_cmds.c:532 src/dird/fd_cmds.c:558 src/dird/fd_cmds.c:572 -msgid ">filed: write error on socket\n" -msgstr "" - -#: src/dird/fd_cmds.c:538 -#, c-format -msgid "Error running program: %s. ERR=%s\n" -msgstr "" - -#: src/dird/fd_cmds.c:547 -#, c-format -msgid "Cannot open included file: %s. ERR=%s\n" -msgstr "" - -#: src/dird/fd_cmds.c:720 -#, c-format -msgid "Client \"%s\" RunScript failed.\n" -msgstr "" - -#: src/dird/fd_cmds.c:743 -#, c-format -msgid "" -"Client \"%s\" may not be used to restore this job. Please upgrade your " -"client.\n" -msgstr "" - -#: src/dird/fd_cmds.c:824 -msgid "RestoreObject failed.\n" -msgstr "" - -#: src/dird/fd_cmds.c:861 -msgid "ComponentInfo failed.\n" -msgstr "" - -#: src/dird/fd_cmds.c:906 -#, c-format -msgid "" -"fixed name. Max=%d: " -msgstr "" - -#: src/dird/ua_cmds.c:341 -#, c-format -msgid "The number must be between 0 and %d\n" -msgstr "" - -#: src/dird/ua_cmds.c:349 -msgid "Enter Volume name: " -msgstr "" - -#: src/dird/ua_cmds.c:353 -msgid "Enter base volume name: " -msgstr "" - -#: src/dird/ua_cmds.c:362 src/dird/ua_label.c:652 -msgid "Volume name too long.\n" -msgstr "" - -#: src/dird/ua_cmds.c:366 src/dird/ua_label.c:658 src/lib/edit.c:514 -msgid "Volume name must be at least one character long.\n" -msgstr "" - -#: src/dird/ua_cmds.c:377 -msgid "Enter the starting number: " -msgstr "" - -#: src/dird/ua_cmds.c:382 -msgid "Start number must be greater than zero.\n" -msgstr "" - -#: src/dird/ua_cmds.c:393 -msgid "Enter slot (0 for none): " -msgstr "" - -#: src/dird/ua_cmds.c:397 -msgid "InChanger? yes/no: " -msgstr "" - -#: src/dird/ua_cmds.c:425 -#, c-format -msgid "%d Volumes created in pool %s\n" -msgstr "" - -#: src/dird/ua_cmds.c:441 src/dird/ua_cmds.c:1241 -msgid "Turn on or off? " -msgstr "" - -#: src/dird/ua_cmds.c:569 -#, c-format -msgid "" -"Can't set %s RecyclePool to %s, %s is not in database.\n" -"Try to update it with 'update pool=%s'\n" -msgstr "" - -#: src/dird/ua_cmds.c:587 -#, c-format -msgid "" -"Can't set %s ScratchPool to %s, %s is not in database.\n" -"Try to update it with 'update pool=%s'\n" -msgstr "" - -#: src/dird/ua_cmds.c:654 -#, c-format -msgid "" -"Error: Pool %s already exists.\n" -"Use update to change it.\n" -msgstr "" - -#: src/dird/ua_cmds.c:665 -#, c-format -msgid "Pool %s created.\n" -msgstr "" - -#: src/dird/ua_cmds.c:696 -msgid "Failed to set bandwidth limit to Client.\n" -msgstr "" - -#: src/dird/ua_cmds.c:700 -#, c-format -msgid "2000 OK Limiting bandwidth to %lldkb/s %s\n" -msgstr "" - -#: src/dird/ua_cmds.c:701 -msgid "on running and future jobs" -msgstr "" - -#: src/dird/ua_cmds.c:725 -msgid "Set Bandwidth choice:\n" -msgstr "" - -#: src/dird/ua_cmds.c:726 -msgid "Running Job" -msgstr "" - -#: src/dird/ua_cmds.c:727 -msgid "Running and future Jobs for a Client" -msgstr "" - -#: src/dird/ua_cmds.c:728 -msgid "Choose where to limit the bandwidth" -msgstr "" - -#: src/dird/ua_cmds.c:740 -msgid "Enter new bandwidth limit kb/s: " -msgstr "" - -#: src/dird/ua_cmds.c:777 src/dird/ua_cmds.c:840 src/dird/ua_cmds.c:862 -#: src/dird/ua_cmds.c:884 -msgid "Unauthorized command from this console.\n" -msgstr "" - -#: src/dird/ua_cmds.c:784 src/dird/ua_cmds.c:1292 src/dird/ua_dotcmds.c:201 -#: src/dird/ua_run.c:343 -#, c-format -msgid "Client \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_cmds.c:794 -#, c-format -msgid "Client \"%s\" address set to %s\n" -msgstr "" - -#: src/dird/ua_cmds.c:813 -#, c-format -msgid "Job Attributes Insertion %sabled\n" -msgstr "" - -#: src/dird/ua_cmds.c:844 -#, c-format -msgid "Job \"%s\" %sabled\n" -msgstr "" - -#: src/dird/ua_cmds.c:866 -#, c-format -msgid "Client \"%s\" %sabled\n" -msgstr "" - -#: src/dird/ua_cmds.c:888 -#, c-format -msgid "Schedule \"%s\" %sabled\n" -msgstr "" - -#: src/dird/ua_cmds.c:897 -msgid "" -"You must enter one of the following keywords: job, client, schedule, or " -"storage.\n" -msgstr "" - -#: src/dird/ua_cmds.c:926 src/dird/ua_dotcmds.c:1086 src/dird/ua_status.c:411 -#, c-format -msgid "Connecting to Storage daemon %s at %s:%d\n" -msgstr "" - -#: src/dird/ua_cmds.c:932 src/dird/ua_dotcmds.c:1092 -msgid "Connected to storage daemon\n" -msgstr "" - -#: src/dird/ua_cmds.c:1103 -msgid "Enter new debug level: " -msgstr "" - -#: src/dird/ua_cmds.c:1116 -#, c-format -msgid "Incorrect tags found on command line %s\n" -msgstr "" - -#: src/dird/ua_cmds.c:1199 src/dird/ua_dotcmds.c:1194 -msgid "Available daemons are: \n" -msgstr "" - -#: src/dird/ua_cmds.c:1200 src/dird/ua_dotcmds.c:1195 -msgid "Director" -msgstr "" - -#: src/dird/ua_cmds.c:1201 src/dird/ua_dotcmds.c:1196 src/dird/ua_run.c:1012 -#: src/dird/ua_select.c:189 -msgid "Storage" -msgstr "" - -#: src/dird/ua_cmds.c:1202 src/dird/ua_dotcmds.c:1197 src/dird/ua_run.c:1018 -#: src/dird/ua_select.c:383 src/dird/ua_select.c:407 src/dird/ua_select.c:544 -msgid "Client" -msgstr "" - -#: src/dird/ua_cmds.c:1203 -msgid "All" -msgstr "" - -#: src/dird/ua_cmds.c:1204 -msgid "Select daemon type to set debug level" -msgstr "" - -#: src/dird/ua_cmds.c:1296 src/dird/ua_cmds.c:2119 src/dird/ua_dotcmds.c:205 -#: src/dird/ua_status.c:462 -#, c-format -msgid "No authorization for Client \"%s\"\n" -msgstr "" - -#: src/dird/ua_cmds.c:1301 src/dird/ua_dotcmds.c:210 -msgid "Client name missing.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1309 src/dird/ua_select.c:1471 src/dird/ua_select.c:1478 -#, c-format -msgid "Job \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1313 src/dird/ua_cmds.c:1380 src/dird/ua_cmds.c:2141 -#, c-format -msgid "No authorization for Job \"%s\"\n" -msgstr "" - -#: src/dird/ua_cmds.c:1318 -msgid "Job name missing.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1327 -#, c-format -msgid "Fileset \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1331 -#, c-format -msgid "No authorization for FileSet \"%s\"\n" -msgstr "" - -#: src/dird/ua_cmds.c:1336 -msgid "Fileset name missing.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1347 src/dird/ua_run.c:1402 -#, c-format -msgid "Level \"%s\" not valid.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1351 -msgid "Level value missing.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1358 -msgid "Invalid value for accurate. It must be yes or no.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1363 -msgid "Accurate value missing.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1376 -msgid "No job specified.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1436 -msgid "Error sending include list.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1441 -msgid "Error sending exclude list.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1535 -msgid "" -"In general it is not a good idea to delete either a\n" -"Pool or a Volume since they may contain data.\n" -"\n" -msgstr "" - -#: src/dird/ua_cmds.c:1538 -msgid "Choose catalog item to delete" -msgstr "" - -#: src/dird/ua_cmds.c:1552 -msgid "Nothing done.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1580 -#, c-format -msgid "Are you sure you want to delete %d JobIds ? (yes/no): " -msgstr "" - -#: src/dird/ua_cmds.c:1590 -msgid "Enter JobId to delete: " -msgstr "" - -#: src/dird/ua_cmds.c:1608 -#, c-format -msgid "Jobid %s and associated records deleted from the catalog.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1623 -#, c-format -msgid "" -"\n" -"This command will delete volume %s\n" -"and all Jobs saved on that volume from the Catalog\n" -msgstr "" - -#: src/dird/ua_cmds.c:1630 -#, c-format -msgid "Are you sure you want to delete Volume \"%s\"? (yes/no): " -msgstr "" - -#: src/dird/ua_cmds.c:1643 -msgid "Can't list jobs on this volume\n" -msgstr "" - -#: src/dird/ua_cmds.c:1668 -#, c-format -msgid "Are you sure you want to delete Pool \"%s\"? (yes/no): " -msgstr "" - -#: src/dird/ua_cmds.c:1714 -#, c-format -msgid "Invalid device name. %s" -msgstr "" - -#: src/dird/ua_cmds.c:1791 -#, c-format -msgid "Using Catalog name=%s DB=%s\n" -msgstr "" - -#: src/dird/ua_cmds.c:1859 -msgid "ERR: Can't open db\n" -msgstr "" - -#: src/dird/ua_cmds.c:1906 -msgid "Wait on mount timed out\n" -msgstr "" - -#: src/dird/ua_cmds.c:1916 -msgid "ERR: Job was not found\n" -msgstr "" - -#: src/dird/ua_cmds.c:1992 -msgid "" -" Command Description\n" -" ======= ===========\n" -msgstr "" - -#: src/dird/ua_cmds.c:1996 -#, c-format -msgid "" -" %-13s %s\n" -"\n" -"Arguments:\n" -"\t%s\n" -msgstr "" - -#: src/dird/ua_cmds.c:2001 -#, c-format -msgid " %-13s %s\n" -msgstr "" - -#: src/dird/ua_cmds.c:2005 -#, c-format -msgid "" -"\n" -"Can't find %s command.\n" -"\n" -msgstr "" - -#: src/dird/ua_cmds.c:2007 -msgid "" -"\n" -"When at a prompt, entering a period cancels the command.\n" -"\n" -msgstr "" - -#: src/dird/ua_cmds.c:2043 -#, c-format -msgid "%s Version: %s (%s) %s %s %s %s\n" -msgstr "" - -#: src/dird/ua_cmds.c:2102 src/dird/ua_cmds.c:2129 src/dird/ua_cmds.c:2151 -#, c-format -msgid "No authorization for Catalog \"%s\"\n" -msgstr "" - -#: src/dird/ua_cmds.c:2187 src/dird/ua_select.c:242 -msgid "Could not find a Catalog resource\n" -msgstr "" - -#: src/dird/ua_cmds.c:2208 -#, c-format -msgid "Could not open catalog database \"%s\".\n" -msgstr "" - -#: src/dird/ua_cmds.c:2227 -#, c-format -msgid "Using Catalog \"%s\"\n" -msgstr "" - -#: src/dird/ua_dde.c:62 src/dird/ua_dotcmds.c:1594 -#, c-format -msgid "List Media failed: ERR=%s\n" -msgstr "" - -#: src/dird/ua_dde.c:110 -msgid "Command line" -msgstr "" - -#: src/dird/ua_dde.c:211 -#, c-format -msgid "Invalid keyword found: %s\n" -msgstr "" - -#: src/dird/ua_dde.c:216 -msgid "Dedup Engine choice: \n" -msgstr "" - -#: src/dird/ua_dde.c:217 -msgid "Vacuum data files" -msgstr "" - -#: src/dird/ua_dde.c:218 -msgid "Cancel running vacuum" -msgstr "" - -#: src/dird/ua_dde.c:219 -msgid "Display data files usage" -msgstr "" - -#: src/dird/ua_dde.c:223 -msgid "Select action to perform on Dedup Engine" -msgstr "" - -#: src/dird/ua_dotcmds.c:180 -msgid ": is an invalid command.\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:219 -msgid "path name missing.\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:238 -msgid "Failed to send command to Client.\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:894 -#, c-format -msgid "Unable to get Job record for Job=%s\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:909 -#, c-format -msgid "Unable to get last Job record for Job=%s\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:925 -#, c-format -msgid "Unable to get Client record for Client=%s\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:941 -#, c-format -msgid "Unable to get last Job record for Client=%s\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:952 src/dird/ua_restore.c:960 -#: src/dird/ua_restore.c:1003 src/dird/vbackup.c:142 -#, c-format -msgid "Unable to get Job record for JobId=%s: ERR=%s\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1156 src/dird/ua_dotcmds.c:1250 -#, c-format -msgid "Unknown command: %s\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1198 -msgid "Select daemon type to make die" -msgstr "" - -#: src/dird/ua_dotcmds.c:1224 -msgid "The Director will generate a deadlock.\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1228 -msgid "The Director will segment fault.\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1509 -msgid "Access to specified Client or FileSet not allowed.\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1514 src/dird/ua_dotcmds.c:1558 -#: src/dird/ua_restore.c:1121 src/dird/ua_restore.c:1149 -#: src/dird/ua_restore.c:1170 -#, c-format -msgid "Query failed: %s. ERR=%s\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1553 -msgid "query keyword not found.\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1580 -#, c-format -msgid "List MediaType failed: ERR=%s\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1608 -#, c-format -msgid "List Location failed: ERR=%s\n" -msgstr "" - -#: src/dird/ua_input.c:114 -msgid "Enter slot" -msgstr "" - -#: src/dird/ua_input.c:118 src/dird/ua_input.c:124 -#, c-format -msgid "Expected a positive integer, got: %s\n" -msgstr "" - -#: src/dird/ua_input.c:181 -msgid "Invalid response. You must answer yes or no.\n" -msgstr "" - -#: src/dird/ua_input.c:204 -msgid "Invalid Enabled value, it must be yes, no, archived, 0, 1, or 2\n" -msgstr "" - -#: src/dird/ua_input.c:231 -#, c-format -msgid "Illegal character \"%c\" in a comment.\n" -msgstr "" - -#: src/dird/ua_input.c:238 -msgid "Comment too long.\n" -msgstr "" - -#: src/dird/ua_input.c:244 -msgid "Comment must be at least one character long.\n" -msgstr "" - -#: src/dird/ua_label.c:93 -msgid "Negative numbers not permitted\n" -msgstr "" - -#: src/dird/ua_label.c:99 src/lib/sellist.c:65 -msgid "Range end is not integer.\n" -msgstr "" - -#: src/dird/ua_label.c:104 src/lib/sellist.c:70 -msgid "Range start is not an integer.\n" -msgstr "" - -#: src/dird/ua_label.c:110 src/lib/sellist.c:77 -msgid "Range end not bigger than start.\n" -msgstr "" - -#: src/dird/ua_label.c:116 src/lib/sellist.c:95 -msgid "Input value is not an integer.\n" -msgstr "" - -#: src/dird/ua_label.c:122 -msgid "Values must be be greater than zero.\n" -msgstr "" - -#: src/dird/ua_label.c:126 -msgid "Slot too large.\n" -msgstr "" - -#: src/dird/ua_label.c:178 src/dird/ua_label.c:356 src/dird/ua_label.c:1191 -#: src/dird/ua_run.c:417 -msgid "command line" -msgstr "" - -#: src/dird/ua_label.c:196 src/dird/ua_label.c:520 src/dird/ua_label.c:1198 -msgid "No slots in changer to scan.\n" -msgstr "" - -#: src/dird/ua_label.c:208 src/dird/ua_label.c:531 -msgid "No Volumes found to label, or no barcodes.\n" -msgstr "" - -#: src/dird/ua_label.c:218 src/dird/ua_label.c:1219 -#, c-format -msgid "Slot %d greater than max %d ignored.\n" -msgstr "" - -#: src/dird/ua_label.c:256 -#, c-format -msgid "No VolName for Slot=%d InChanger set to zero.\n" -msgstr "" - -#: src/dird/ua_label.c:277 -#, c-format -msgid "Catalog record for Volume \"%s\" updated to reference slot %d.\n" -msgstr "" - -#: src/dird/ua_label.c:281 -#, c-format -msgid "Catalog record for Volume \"%s\" is up to date.\n" -msgstr "" - -#: src/dird/ua_label.c:287 -#, c-format -msgid "Volume \"%s\" not found in catalog. Slot=%d InChanger set to zero.\n" -msgstr "" - -#: src/dird/ua_label.c:385 -#, c-format -msgid "" -"Volume \"%s\" has VolStatus %s. It must be Purged or Recycled before " -"relabeling.\n" -msgstr "" - -#: src/dird/ua_label.c:401 -msgid "Enter new Volume name: " -msgstr "" - -#: src/dird/ua_label.c:414 -#, c-format -msgid "Media record for new Volume \"%s\" already exists.\n" -msgstr "" - -#: src/dird/ua_label.c:432 -msgid "Enter slot (0 or Enter for none): " -msgstr "" - -#: src/dird/ua_label.c:460 -#, c-format -msgid "Delete of Volume \"%s\" failed. ERR=%s" -msgstr "" - -#: src/dird/ua_label.c:463 -#, c-format -msgid "Old volume \"%s\" deleted from catalog.\n" -msgstr "" - -#: src/dird/ua_label.c:474 -#, c-format -msgid "Requesting to mount %s ...\n" -msgstr "" - -#: src/dird/ua_label.c:496 -msgid "Do not forget to mount the drive!!!\n" -msgstr "" - -#: src/dird/ua_label.c:536 -msgid "" -"The following Volumes will be labeled:\n" -"Slot Volume\n" -"==============\n" -msgstr "" - -#: src/dird/ua_label.c:545 -msgid "Do you want to label these Volumes? (yes|no): " -msgstr "" - -#: src/dird/ua_label.c:565 -#, c-format -msgid "Media record for Slot %d Volume \"%s\" already exists.\n" -msgstr "" - -#: src/dird/ua_label.c:571 -#, c-format -msgid "Error setting InChanger: ERR=%s" -msgstr "" - -#: src/dird/ua_label.c:594 -#, c-format -msgid "Maximum pool Volumes=%d reached.\n" -msgstr "" - -#: src/dird/ua_label.c:602 -#, c-format -msgid "Catalog record for cleaning tape \"%s\" successfully created.\n" -msgstr "" - -#: src/dird/ua_label.c:609 -#, c-format -msgid "Catalog error on cleaning tape: %s" -msgstr "" - -#: src/dird/ua_label.c:645 -#, c-format -msgid "Illegal character \"%c\" in a volume name.\n" -msgstr "" - -#: src/dird/ua_label.c:693 -#, c-format -msgid "Sending relabel command from \"%s\" to \"%s\" ...\n" -msgstr "" - -#: src/dird/ua_label.c:700 -#, c-format -msgid "Sending label command for Volume \"%s\" Slot %d ...\n" -msgstr "" - -#: src/dird/ua_label.c:738 -#, c-format -msgid "Catalog record for Volume \"%s\", Slot %d successfully created.\n" -msgstr "" - -#: src/dird/ua_label.c:751 -#, c-format -msgid "Label command failed for Volume %s.\n" -msgstr "" - -#: src/dird/ua_label.c:765 -msgid "Could not open SD socket.\n" -msgstr "" - -#: src/dird/ua_label.c:837 src/dird/ua_label.c:847 -#, c-format -msgid "Invalid Slot number: %s\n" -msgstr "" - -#: src/dird/ua_label.c:856 -#, c-format -msgid "Invalid Volume name: %s. Volume skipped.\n" -msgstr "" - -#: src/dird/ua_label.c:950 -#, c-format -msgid "Device \"%s\" has %d slots.\n" -msgstr "" - -#: src/dird/ua_label.c:996 -#, c-format -msgid "Pool \"%s\" resource not found for volume \"%s\"!\n" -msgstr "" - -#: src/dird/ua_label.c:1210 -msgid "No Volumes found, or no barcodes.\n" -msgstr "" - -#: src/dird/ua_label.c:1213 -msgid "" -" Slot | Volume Name | Status | Media Type | " -"Pool |\n" -msgstr "" - -#: src/dird/ua_label.c:1214 -msgid "" -"------+------------------+-----------+----------------------" -"+--------------------|\n" -msgstr "" - -#: src/dird/ua_output.c:56 src/dird/ua_output.c:80 -msgid "ON or OFF keyword missing.\n" -msgstr "" - -#: src/dird/ua_output.c:100 -msgid "Disabled Jobs:\n" -msgstr "" - -#: src/dird/ua_output.c:106 -msgid "No disabled Jobs.\n" -msgstr "" - -#: src/dird/ua_output.c:208 -msgid "Keywords for the show command are:\n" -msgstr "" - -#: src/dird/ua_output.c:215 -#, c-format -msgid "%s resource %s not found.\n" -msgstr "" - -#: src/dird/ua_output.c:219 -#, c-format -msgid "Resource %s not found\n" -msgstr "" - -#: src/dird/ua_output.c:360 -msgid "Hey! DB is NULL\n" -msgstr "" - -#: src/dird/ua_output.c:522 -msgid "Invalid jobid argument\n" -msgstr "" - -#: src/dird/ua_output.c:546 -#, c-format -msgid "Unknown ObjectType %s\n" -msgstr "" - -#: src/dird/ua_output.c:556 -msgid "list pluginrestoreconf requires jobid argument\n" -msgstr "" - -#: src/dird/ua_output.c:594 -#, c-format -msgid "Jobid %d used %d Volume(s): %s\n" -msgstr "" - -#: src/dird/ua_output.c:613 -msgid "No Pool specified.\n" -msgstr "" - -#: src/dird/ua_output.c:624 src/dird/ua_select.c:612 src/dird/ua_update.c:435 -#, c-format -msgid "Error obtaining pool ids. ERR=%s\n" -msgstr "" - -#: src/dird/ua_output.c:634 -#, c-format -msgid "Pool: %s\n" -msgstr "" - -#: src/dird/ua_output.c:650 -msgid "Ignoring invalid value for days. Max is 50.\n" -msgstr "" - -#: src/dird/ua_output.c:679 -#, c-format -msgid "Unknown list keyword: %s\n" -msgstr "" - -#: src/dird/ua_output.c:704 -#, c-format -msgid "%s is not a job name.\n" -msgstr "" - -#: src/dird/ua_output.c:718 -#, c-format -msgid "Could not find Pool for Job %s\n" -msgstr "" - -#: src/dird/ua_output.c:731 -#, c-format -msgid "Could not find next Volume for Job %s (Pool=%s, Level=%s).\n" -msgstr "" - -#: src/dird/ua_output.c:735 -#, c-format -msgid "" -"The next Volume to be used by Job \"%s\" (Pool=%s, Level=%s) will be %s\n" -msgstr "" - -#: src/dird/ua_output.c:746 -#, c-format -msgid "Could not find next Volume for Job %s.\n" -msgstr "" - -#: src/dird/ua_output.c:892 -#, c-format -msgid "Pool %s not in database. %s" -msgstr "" - -#: src/dird/ua_output.c:900 -#, c-format -msgid "Pool %s created in database.\n" -msgstr "" - -#: src/dird/ua_output.c:956 -msgid "You have no messages.\n" -msgstr "" - -#: src/dird/ua_output.c:1036 -msgid "Message too long to display.\n" -msgstr "" - -#: src/dird/ua_prune.c:118 -msgid "Choose item to prune" -msgstr "" - -#: src/dird/ua_prune.c:174 -#, c-format -msgid "Cannot prune Volume \"%s\" because it is archived.\n" -msgstr "" - -#: src/dird/ua_prune.c:219 -msgid "Pruned Jobs from JobHisto catalog.\n" -msgstr "" - -#: src/dird/ua_prune.c:307 -msgid "Begin pruning Files.\n" -msgstr "" - -#: src/dird/ua_prune.c:322 -msgid "No Files found to prune.\n" -msgstr "" - -#: src/dird/ua_prune.c:345 -#, c-format -msgid "Pruned Files from %s Jobs for client %s from catalog.\n" -msgstr "" - -#: src/dird/ua_prune.c:491 -#, c-format -msgid "Begin pruning Jobs older than %s.\n" -msgstr "" - -#: src/dird/ua_prune.c:602 -#, c-format -msgid "Pruned %d %s for client %s from catalog.\n" -msgstr "" - -#: src/dird/ua_prune.c:603 -msgid "Jobs" -msgstr "" - -#: src/dird/ua_prune.c:605 -msgid "No Jobs found to prune.\n" -msgstr "" - -#: src/dird/ua_prune.c:666 -msgid "Expecting limit argument as integer\n" -msgstr "" - -#: src/dird/ua_prune.c:679 -#, c-format -msgid "Volume \"%s\"" -msgstr "" - -#: src/dird/ua_purge.c:85 -msgid "" -"\n" -"This command can be DANGEROUS!!!\n" -"\n" -"It purges (deletes) all Files from a Job,\n" -"JobId, Client or Volume; or it purges (deletes)\n" -"all Jobs from a Client or Volume without regard\n" -"to retention periods. Normally you should use the\n" -"PRUNE command, which respects retention periods.\n" -msgstr "" - -#: src/dird/ua_purge.c:153 -msgid "Choose item to purge" -msgstr "" - -#: src/dird/ua_purge.c:200 -#, c-format -msgid "Begin purging files for Client \"%s\"\n" -msgstr "" - -#: src/dird/ua_purge.c:209 src/dird/ua_purge.c:259 -#, c-format -msgid "No Files found for client %s to purge from %s catalog.\n" -msgstr "" - -#: src/dird/ua_purge.c:212 -#, c-format -msgid "Files for %d Jobs for client \"%s\" purged from %s catalog.\n" -msgstr "" - -#: src/dird/ua_purge.c:250 -#, c-format -msgid "Begin purging jobs from Client \"%s\"\n" -msgstr "" - -#: src/dird/ua_purge.c:262 -#, c-format -msgid "%d Jobs for client %s purged from %s catalog.\n" -msgstr "" - -#: src/dird/ua_purge.c:466 -#, c-format -msgid "" -"\n" -"Volume \"%s\" has VolStatus \"%s\" and cannot be purged.\n" -"The VolStatus must be: Append, Full, Used, or Error to be purged.\n" -msgstr "" - -#: src/dird/ua_purge.c:494 -#, c-format -msgid "%d File%s on Volume \"%s\" purged from catalog.\n" -msgstr "" - -#: src/dird/ua_purge.c:544 -#, c-format -msgid "" -"There are no more Jobs associated with Volume \"%s\". Marking it purged.\n" -msgstr "" - -#: src/dird/ua_purge.c:617 -msgid "Can't update volume size in the catalog\n" -msgstr "" - -#: src/dird/ua_purge.c:619 -#, c-format -msgid "The volume \"%s\" has been truncated\n" -msgstr "" - -#: src/dird/ua_purge.c:621 -#, c-format -msgid "Unable to truncate volume \"%s\"\n" -msgstr "" - -#: src/dird/ua_purge.c:714 -msgid "No Volumes found to perform \"truncate\" command.\n" -msgstr "" - -#: src/dird/ua_purge.c:781 -#, c-format -msgid "Unable move recycled Volume in full Pool \"%s\" MaxVols=%d\n" -msgstr "" - -#: src/dird/ua_purge.c:795 -#, c-format -msgid "All records pruned from Volume \"%s\"; marking it \"Purged\"\n" -msgstr "" - -#: src/dird/ua_purge.c:800 -#, c-format -msgid "Cannot purge Volume with VolStatus=%s\n" -msgstr "" - -#: src/dird/ua_query.c:62 src/findlib/create_file.c:283 -#: src/findlib/create_file.c:385 -#, c-format -msgid "Could not open %s: ERR=%s\n" -msgstr "" - -#: src/dird/ua_query.c:67 -msgid "Available queries:\n" -msgstr "" - -#: src/dird/ua_query.c:74 -msgid "Choose a query" -msgstr "" - -#: src/dird/ua_query.c:88 -msgid "Could not find query.\n" -msgstr "" - -#: src/dird/ua_query.c:106 -msgid "Too many prompts in query, max is 9.\n" -msgstr "" - -#: src/dird/ua_query.c:209 -#, c-format -msgid "Warning prompt %d missing.\n" -msgstr "" - -#: src/dird/ua_query.c:254 -msgid "" -"Entering SQL query mode.\n" -"Terminate each query with a semicolon.\n" -"Terminate query mode with a blank line.\n" -msgstr "" - -#: src/dird/ua_query.c:257 src/dird/ua_query.c:273 -msgid "Enter SQL query: " -msgstr "" - -#: src/dird/ua_query.c:275 -msgid "Add to SQL query: " -msgstr "" - -#: src/dird/ua_query.c:278 -msgid "End query mode.\n" -msgstr "" - -#: src/dird/ua_restore.c:295 -msgid "\"RegexWhere\" specification not authorized.\n" -msgstr "" - -#: src/dird/ua_restore.c:302 -msgid "\"where\" specification not authorized.\n" -msgstr "" - -#: src/dird/ua_restore.c:320 -msgid "" -"No Restore Job Resource found in bacula-dir.conf.\n" -"You must create at least one before running this command.\n" -msgstr "" - -#: src/dird/ua_restore.c:337 -msgid "Restore not done.\n" -msgstr "" - -#: src/dird/ua_restore.c:348 -msgid "Unable to construct a valid BSR. Cannot continue.\n" -msgstr "" - -#: src/dird/ua_restore.c:352 src/dird/ua_restore.c:366 -msgid "No files selected to be restored.\n" -msgstr "" - -#: src/dird/ua_restore.c:356 -#, c-format -msgid "Bootstrap records written to %s\n" -msgstr "" - -#: src/dird/ua_restore.c:360 -msgid "" -"\n" -"1 file selected to be restored.\n" -"\n" -msgstr "" - -#: src/dird/ua_restore.c:362 -#, c-format -msgid "" -"\n" -"%s files selected to be restored.\n" -"\n" -msgstr "" - -#: src/dird/ua_restore.c:381 -msgid "No Client resource found!\n" -msgstr "" - -#: src/dird/ua_restore.c:499 -msgid "The restore will use the following job(s) as Base\n" -msgstr "" - -#: src/dird/ua_restore.c:532 -#, c-format -msgid "Missing value for keyword: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:612 -msgid "List last 20 Jobs run" -msgstr "" - -#: src/dird/ua_restore.c:613 -msgid "List Jobs where a given File is saved" -msgstr "" - -#: src/dird/ua_restore.c:614 -msgid "Enter list of comma separated JobIds to select" -msgstr "" - -#: src/dird/ua_restore.c:615 -msgid "Enter SQL list command" -msgstr "" - -#: src/dird/ua_restore.c:616 -msgid "Select the most recent backup for a client" -msgstr "" - -#: src/dird/ua_restore.c:617 -msgid "Select backup for a client before a specified time" -msgstr "" - -#: src/dird/ua_restore.c:618 -msgid "Enter a list of files to restore" -msgstr "" - -#: src/dird/ua_restore.c:619 -msgid "Enter a list of files to restore before a specified time" -msgstr "" - -#: src/dird/ua_restore.c:620 -msgid "Find the JobIds of the most recent backup for a client" -msgstr "" - -#: src/dird/ua_restore.c:621 -msgid "Find the JobIds for a backup for a client before a specified time" -msgstr "" - -#: src/dird/ua_restore.c:622 -msgid "Enter a list of directories to restore for found JobIds" -msgstr "" - -#: src/dird/ua_restore.c:623 -msgid "Select full restore to a specified Job date" -msgstr "" - -#: src/dird/ua_restore.c:624 src/dird/ua_status.c:1213 src/lib/status.h:120 -msgid "Cancel" -msgstr "" - -#: src/dird/ua_restore.c:671 -#, c-format -msgid "Unknown keyword: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:700 src/dird/ua_update.c:947 -#, c-format -msgid "Improper date format: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:735 src/dird/ua_select.c:770 -#, c-format -msgid "Error: Pool resource \"%s\" does not exist.\n" -msgstr "" - -#: src/dird/ua_restore.c:740 -#, c-format -msgid "Error: Pool resource \"%s\" access not allowed.\n" -msgstr "" - -#: src/dird/ua_restore.c:756 -msgid "" -"\n" -"First you select one or more JobIds that contain files\n" -"to be restored. You will be presented several methods\n" -"of specifying the JobIds. Then you will be allowed to\n" -"select which files from those JobIds are to be restored.\n" -"\n" -msgstr "" - -#: src/dird/ua_restore.c:769 -msgid "To select the JobIds, you have the following choices:\n" -msgstr "" - -#: src/dird/ua_restore.c:774 -msgid "Select item: " -msgstr "" - -#: src/dird/ua_restore.c:779 src/dird/ua_restore.c:814 -msgid "SQL query not authorized.\n" -msgstr "" - -#: src/dird/ua_restore.c:792 -msgid "Enter Filename (no path):" -msgstr "" - -#: src/dird/ua_restore.c:807 src/dird/ua_restore.c:915 -msgid "Enter JobId(s), comma separated, to restore: " -msgstr "" - -#: src/dird/ua_restore.c:817 -msgid "Enter SQL list command: " -msgstr "" - -#: src/dird/ua_restore.c:851 src/dird/ua_restore.c:874 -msgid "" -"Enter file names with paths, or < to enter a filename\n" -"containing a list of file names with paths, and terminate\n" -"them with a blank line.\n" -msgstr "" - -#: src/dird/ua_restore.c:855 src/dird/ua_restore.c:878 -msgid "Enter full filename: " -msgstr "" - -#: src/dird/ua_restore.c:913 -#, c-format -msgid "You have already selected the following JobIds: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:931 -msgid "" -"Enter full directory names or start the name\n" -"with a < to indicate it is a filename containing a list\n" -"of directories and terminate them with a blank line.\n" -msgstr "" - -#: src/dird/ua_restore.c:935 -msgid "Enter directory name: " -msgstr "" - -#: src/dird/ua_restore.c:951 -msgid "Enter JobId to get the state to restore: " -msgstr "" - -#: src/dird/ua_restore.c:964 src/dird/vbackup.c:146 -#, c-format -msgid "Selecting jobs to build the Full state at %s\n" -msgstr "" - -#: src/dird/ua_restore.c:990 -msgid "Invalid JobId in list.\n" -msgstr "" - -#: src/dird/ua_restore.c:1009 -#, c-format -msgid "Access to JobId=%s (Job \"%s\") not authorized. Not selected.\n" -msgstr "" - -#: src/dird/ua_restore.c:1022 -msgid "No Jobs selected.\n" -msgstr "" - -#: src/dird/ua_restore.c:1027 -#, c-format -msgid "You have selected the following JobIds: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:1029 -#, c-format -msgid "You have selected the following JobId: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:1039 -msgid "" -"The restored files will the most current backup\n" -"BEFORE the date you specify below.\n" -"\n" -msgstr "" - -#: src/dird/ua_restore.c:1042 -msgid "Enter date as YYYY-MM-DD HH:MM:SS :" -msgstr "" - -#: src/dird/ua_restore.c:1048 -msgid "Improper date format.\n" -msgstr "" - -#: src/dird/ua_restore.c:1069 -#, c-format -msgid "Cannot open file %s: ERR=%s\n" -msgstr "" - -#: src/dird/ua_restore.c:1077 src/dird/ua_restore.c:1081 -#, c-format -msgid "Error occurred on line %d of file \"%s\"\n" -msgstr "" - -#: src/dird/ua_restore.c:1125 src/dird/ua_restore.c:1153 -#, c-format -msgid "No database record found for: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:1141 -msgid "No JobId specified cannot continue.\n" -msgstr "" - -#: src/dird/ua_restore.c:1174 -#, c-format -msgid "No table found: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:1232 -msgid "" -"\n" -"\n" -"For one or more of the JobIds selected, no files were found,\n" -"so file selection is not possible.\n" -"Most likely your retention policy pruned the files.\n" -msgstr "" - -#: src/dird/ua_restore.c:1235 -msgid "" -"\n" -"Do you want to restore all the files? (yes|no): " -msgstr "" - -#: src/dird/ua_restore.c:1238 -msgid "" -"\n" -"Regexp matching files to restore? (empty to abort): " -msgstr "" - -#: src/dird/ua_restore.c:1254 -#, c-format -msgid "Regex compile error: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:1297 -#, c-format -msgid "Unable to create component file %s. ERR=%s\n" -msgstr "" - -#: src/dird/ua_restore.c:1304 -#, c-format -msgid "Unable to fdopen component file %s. ERR=%s\n" -msgstr "" - -#: src/dird/ua_restore.c:1311 -msgid "Error writing component file.\n" -msgstr "" - -#: src/dird/ua_restore.c:1356 -#, c-format -msgid "" -"\n" -"Building directory tree for JobId(s) %s ... " -msgstr "" - -#: src/dird/ua_restore.c:1426 -#, c-format -msgid "" -"\n" -"%s files inserted into the tree and marked for extraction.\n" -msgstr "" - -#: src/dird/ua_restore.c:1429 -#, c-format -msgid "" -"\n" -"%s files inserted into the tree.\n" -msgstr "" - -#: src/dird/ua_restore.c:1517 -#, c-format -msgid "Error getting FileSet \"%s\": ERR=%s\n" -msgstr "" - -#: src/dird/ua_restore.c:1522 -#, c-format -msgid "FileSet argument: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:1528 src/dird/ua_select.c:204 -msgid "The defined FileSet resources are:\n" -msgstr "" - -#: src/dird/ua_restore.c:1532 src/dird/ua_run.c:1014 src/dird/ua_select.c:212 -msgid "FileSet" -msgstr "" - -#: src/dird/ua_restore.c:1532 src/dird/ua_select.c:212 -msgid "Select FileSet resource" -msgstr "" - -#: src/dird/ua_restore.c:1534 -#, c-format -msgid "No FileSet found for client \"%s\".\n" -msgstr "" - -#: src/dird/ua_restore.c:1540 -#, c-format -msgid "Error getting FileSet record: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:1541 -msgid "" -"This probably means you modified the FileSet.\n" -"Continuing anyway.\n" -msgstr "" - -#: src/dird/ua_restore.c:1556 -#, c-format -msgid "Pool \"%s\" not found, using any pool.\n" -msgstr "" - -#: src/dird/ua_restore.c:1583 src/dird/ua_restore.c:1599 -#, c-format -msgid "No Full backup before %s found.\n" -msgstr "" - -#: src/dird/ua_restore.c:1628 -msgid "No jobs found.\n" -msgstr "" - -#: src/dird/ua_restore.c:1763 -#, c-format -msgid "" -"\n" -"Warning Storage is overridden by \"%s\" on the command line.\n" -msgstr "" - -#: src/dird/ua_restore.c:1768 -#, c-format -msgid "" -"This may not work because of two different MediaTypes:\n" -" Storage MediaType=\"%s\"\n" -" Volume MediaType=\"%s\".\n" -"\n" -msgstr "" - -#: src/dird/ua_restore.c:1787 -#, c-format -msgid "Using Storage \"%s\" from MediaType \"%s\".\n" -msgstr "" - -#: src/dird/ua_restore.c:1790 -#, c-format -msgid "Storage \"%s\" not found, using Storage \"%s\" from MediaType \"%s\".\n" -msgstr "" - -#: src/dird/ua_restore.c:1799 -#, c-format -msgid "" -"\n" -"Unable to find Storage resource for\n" -"MediaType \"%s\", needed by the Jobs you selected.\n" -msgstr "" - -#: src/dird/ua_run.c:165 -msgid "OK to run? (yes/mod/no): " -msgstr "" - -#: src/dird/ua_run.c:194 -#, c-format -msgid "" -"\n" -"Bad response: %s. You must answer yes, mod, or no.\n" -"\n" -msgstr "" - -#: src/dird/ua_run.c:198 -msgid "Job not run.\n" -msgstr "" - -#: src/dird/ua_run.c:237 -msgid "Job failed.\n" -msgstr "" - -#: src/dird/ua_run.c:240 -#, c-format -msgid "Job queued. JobId=%s\n" -msgstr "" - -#: src/dird/ua_run.c:258 -#, c-format -msgid "Job \"%s\" not found\n" -msgstr "" - -#: src/dird/ua_run.c:265 -msgid "A job name must be specified.\n" -msgstr "" - -#: src/dird/ua_run.c:271 -#, c-format -msgid "No authorization. Job \"%s\".\n" -msgstr "" - -#: src/dird/ua_run.c:289 -#, c-format -msgid "Pool \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_run.c:299 -#, c-format -msgid "No authorization. Pool \"%s\".\n" -msgstr "" - -#: src/dird/ua_run.c:313 -#, c-format -msgid "NextPool \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_run.c:322 -#, c-format -msgid "No authorization. NextPool \"%s\".\n" -msgstr "" - -#: src/dird/ua_run.c:353 src/dird/ua_run.c:373 -#, c-format -msgid "No authorization. Client \"%s\".\n" -msgstr "" - -#: src/dird/ua_run.c:363 -#, c-format -msgid "Restore Client \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_run.c:392 -#, c-format -msgid "FileSet \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_run.c:401 -#, c-format -msgid "No authorization. FileSet \"%s\".\n" -msgstr "" - -#: src/dird/ua_run.c:420 -#, c-format -msgid "Storage \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_run.c:423 src/dird/ua_run.c:1054 -msgid "user selection" -msgstr "" - -#: src/dird/ua_run.c:432 -#, c-format -msgid "No authorization. Storage \"%s\".\n" -msgstr "" - -#: src/dird/ua_run.c:456 -msgid "No JobId specified.\n" -msgstr "" - -#: src/dird/ua_run.c:470 -msgid "Invalid or no Job name specified.\n" -msgstr "" - -#: src/dird/ua_run.c:485 -msgid "Enter the JobId list to select: " -msgstr "" - -#: src/dird/ua_run.c:501 -#, c-format -msgid "JobId=%d entered is not in the list.\n" -msgstr "" - -#: src/dird/ua_run.c:525 -#, c-format -msgid "Could not get job record for selected JobId=%d. ERR=%s" -msgstr "" - -#: src/dird/ua_run.c:593 src/dird/ua_run.c:846 src/dird/ua_select.c:154 -msgid "You have the following choices:\n" -msgstr "" - -#: src/dird/ua_run.c:597 -msgid "Select termination code: " -msgstr "" - -#: src/dird/ua_run.c:781 -msgid "Unable to use current plugin configuration, discarding it." -msgstr "" - -#: src/dird/ua_run.c:796 -msgid "Plugin Restore Options\n" -msgstr "" - -#: src/dird/ua_run.c:807 -msgid "*None, but required*" -msgstr "" - -#: src/dird/ua_run.c:827 -msgid "Use above plugin configuration? (yes/mod/no): " -msgstr "" - -#: src/dird/ua_run.c:845 src/dird/ua_run.c:1007 src/dird/ua_select.c:73 -msgid "mod" -msgstr "" - -#: src/dird/ua_run.c:869 -#, c-format -msgid "Please enter a value for %s: " -msgstr "" - -#: src/dird/ua_run.c:943 -msgid "No plugin to configure\n" -msgstr "" - -#: src/dird/ua_run.c:951 -msgid "Plugins to configure:\n" -msgstr "" - -#: src/dird/ua_run.c:960 -msgid "Select plugin to configure" -msgstr "" - -#: src/dird/ua_run.c:976 -#, c-format -msgid "Can't configure %32s\n" -msgstr "" - -#: src/dird/ua_run.c:1011 -msgid "Level" -msgstr "" - -#: src/dird/ua_run.c:1016 -msgid "Restore Client" -msgstr "" - -#: src/dird/ua_run.c:1020 -msgid "When" -msgstr "" - -#: src/dird/ua_run.c:1021 -msgid "Priority" -msgstr "" - -#: src/dird/ua_run.c:1026 src/dird/ua_select.c:633 src/dird/ua_select.c:746 -#: src/dird/ua_update.c:615 -msgid "Pool" -msgstr "" - -#: src/dird/ua_run.c:1031 -msgid "NextPool" -msgstr "" - -#: src/dird/ua_run.c:1033 -msgid "Verify Job" -msgstr "" - -#: src/dird/ua_run.c:1036 -msgid "Bootstrap" -msgstr "" - -#: src/dird/ua_run.c:1037 -msgid "Where" -msgstr "" - -#: src/dird/ua_run.c:1038 -msgid "File Relocation" -msgstr "" - -#: src/dird/ua_run.c:1039 -msgid "Replace" -msgstr "" - -#: src/dird/ua_run.c:1040 -msgid "JobId" -msgstr "" - -#: src/dird/ua_run.c:1043 -msgid "Plugin Options" -msgstr "" - -#: src/dird/ua_run.c:1086 -msgid "" -"Please enter desired start time as YYYY-MM-DD HH:MM:SS (return for now): " -msgstr "" - -#: src/dird/ua_run.c:1094 src/dird/ua_run.c:1311 -msgid "Invalid time, using current time.\n" -msgstr "" - -#: src/dird/ua_run.c:1101 -msgid "Enter new Priority: " -msgstr "" - -#: src/dird/ua_run.c:1105 -msgid "Priority must be a positive integer.\n" -msgstr "" - -#: src/dird/ua_run.c:1126 -msgid "Please enter the Bootstrap file name: " -msgstr "" - -#: src/dird/ua_run.c:1138 -#, c-format -msgid "Warning cannot open %s: ERR=%s\n" -msgstr "" - -#: src/dird/ua_run.c:1168 -msgid "Please enter the full path prefix for restore (/ for none): " -msgstr "" - -#: src/dird/ua_run.c:1190 -msgid "Replace:\n" -msgstr "" - -#: src/dird/ua_run.c:1194 -msgid "Select replace option" -msgstr "" - -#: src/dird/ua_run.c:1205 -msgid "" -"You must set the bootstrap file to NULL to be able to specify a JobId.\n" -msgstr "" - -#: src/dird/ua_run.c:1217 -msgid "Please Plugin Options string: " -msgstr "" - -#: src/dird/ua_run.c:1260 src/dird/ua_run.c:1265 -msgid "Command input" -msgstr "" - -#: src/dird/ua_run.c:1262 src/dird/ua_run.c:1267 src/dird/ua_run.c:1287 -msgid "User input" -msgstr "" - -#: src/dird/ua_run.c:1350 -#, c-format -msgid "Invalid replace option: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1449 -#, c-format -msgid "strip_prefix=%s add_prefix=%s add_suffix=%s\n" -msgstr "" - -#: src/dird/ua_run.c:1452 -msgid "This will replace your current Where value\n" -msgstr "" - -#: src/dird/ua_run.c:1453 -msgid "Strip prefix" -msgstr "" - -#: src/dird/ua_run.c:1454 -msgid "Add prefix" -msgstr "" - -#: src/dird/ua_run.c:1455 -msgid "Add file suffix" -msgstr "" - -#: src/dird/ua_run.c:1456 -msgid "Enter a regexp" -msgstr "" - -#: src/dird/ua_run.c:1457 -msgid "Test filename manipulation" -msgstr "" - -#: src/dird/ua_run.c:1458 -msgid "Use this ?" -msgstr "" - -#: src/dird/ua_run.c:1463 -msgid "Please enter the path prefix to strip: " -msgstr "" - -#: src/dird/ua_run.c:1471 -msgid "Please enter the path prefix to add (/ for none): " -msgstr "" - -#: src/dird/ua_run.c:1482 -msgid "Please enter the file suffix to add: " -msgstr "" - -#: src/dird/ua_run.c:1489 -msgid "Please enter a valid regexp (!from!to!): " -msgstr "" - -#: src/dird/ua_run.c:1502 -#, c-format -msgid "regexwhere=%s\n" -msgstr "" - -#: src/dird/ua_run.c:1508 -#, c-format -msgid "strip_prefix=%s add_prefix=%s add_suffix=%s result=%s\n" -msgstr "" - -#: src/dird/ua_run.c:1515 -msgid "Cannot use your regexp\n" -msgstr "" - -#: src/dird/ua_run.c:1518 -msgid "Enter a period (.) to stop this test\n" -msgstr "" - -#: src/dird/ua_run.c:1519 -msgid "Please enter filename to test: " -msgstr "" - -#: src/dird/ua_run.c:1521 -#, c-format -msgid "%s -> %s\n" -msgstr "" - -#: src/dird/ua_run.c:1565 -msgid "Cannot use your regexp.\n" -msgstr "" - -#: src/dird/ua_run.c:1578 src/dird/ua_run.c:1608 -msgid "Levels:\n" -msgstr "" - -#: src/dird/ua_run.c:1580 src/lib/util.c:505 src/lib/util.c:551 -msgid "Full" -msgstr "" - -#: src/dird/ua_run.c:1581 src/lib/util.c:508 -msgid "Incremental" -msgstr "" - -#: src/dird/ua_run.c:1582 src/lib/util.c:511 -msgid "Differential" -msgstr "" - -#: src/dird/ua_run.c:1583 src/lib/util.c:514 -msgid "Since" -msgstr "" - -#: src/dird/ua_run.c:1584 -msgid "VirtualFull" -msgstr "" - -#: src/dird/ua_run.c:1585 src/dird/ua_run.c:1614 -msgid "Select level" -msgstr "" - -#: src/dird/ua_run.c:1609 -msgid "Initialize Catalog" -msgstr "" - -#: src/dird/ua_run.c:1610 src/lib/util.c:517 -msgid "Verify Catalog" -msgstr "" - -#: src/dird/ua_run.c:1611 src/lib/util.c:523 -msgid "Verify Volume to Catalog" -msgstr "" - -#: src/dird/ua_run.c:1612 src/lib/util.c:526 -msgid "Verify Disk to Catalog" -msgstr "" - -#: src/dird/ua_run.c:1613 -msgid "Verify Volume Data (not yet implemented)" -msgstr "" - -#: src/dird/ua_run.c:1634 -msgid "Level not appropriate for this Job. Cannot be changed.\n" -msgstr "" - -#: src/dird/ua_run.c:1665 -#, c-format -msgid "" -"Run Admin Job\n" -"JobName: %s\n" -"FileSet: %s\n" -"Client: %s\n" -"Storage: %s\n" -"When: %s\n" -"Priority: %d\n" -msgstr "" - -#: src/dird/ua_run.c:1723 -#, c-format -msgid "" -"Run Backup job\n" -"JobName: %s\n" -"Level: %s\n" -"Client: %s\n" -"FileSet: %s\n" -"Pool: %s (From %s)\n" -"%sStorage: %s (From %s)\n" -"When: %s\n" -"Priority: %d\n" -"%s%s%s" -msgstr "" - -#: src/dird/ua_run.c:1756 -#, c-format -msgid "Could not get job record for selected JobId. ERR=%s" -msgstr "" - -#: src/dird/ua_run.c:1795 -#, c-format -msgid "" -"Run Verify Job\n" -"JobName: %s\n" -"Level: %s\n" -"Client: %s\n" -"FileSet: %s\n" -"Pool: %s (From %s)\n" -"Storage: %s (From %s)\n" -"Verify Job: %s\n" -"Verify List: %s\n" -"When: %s\n" -"Priority: %d\n" -msgstr "" - -#: src/dird/ua_run.c:1824 -msgid "Please enter a JobId for restore: " -msgstr "" - -#: src/dird/ua_run.c:1863 src/dird/ua_run.c:1890 src/dird/ua_run.c:1921 -#: src/dird/ua_run.c:1948 src/dird/ua_run.c:1986 -msgid "User specified" -msgstr "" - -#: src/dird/ua_run.c:1865 -#, c-format -msgid "" -"Run Restore job\n" -"JobName: %s\n" -"Bootstrap: %s\n" -"RegexWhere: %s\n" -"Replace: %s\n" -"FileSet: %s\n" -"Backup Client: %s\n" -"Restore Client: %s\n" -"Storage: %s\n" -"When: %s\n" -"Catalog: %s\n" -"Priority: %d\n" -"Plugin Options: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1923 -#, c-format -msgid "" -"Run Restore job\n" -"JobName: %s\n" -"Bootstrap: %s\n" -"Where: %s\n" -"Replace: %s\n" -"FileSet: %s\n" -"Backup Client: %s\n" -"Restore Client: %s\n" -"Storage: %s\n" -"When: %s\n" -"Catalog: %s\n" -"Priority: %d\n" -"Plugin Options: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1955 -#, c-format -msgid "" -"Run Restore job\n" -"JobName: %s\n" -"Bootstrap: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1963 -#, c-format -msgid "RegexWhere: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1966 -#, c-format -msgid "Where: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1970 -#, c-format -msgid "" -"Replace: %s\n" -"Client: %s\n" -"Storage: %s\n" -"JobId: %s\n" -"When: %s\n" -"Catalog: %s\n" -"Priority: %d\n" -"Plugin Options: %s\n" -msgstr "" - -#: src/dird/ua_run.c:2028 -msgid "Run Copy job\n" -msgstr "" - -#: src/dird/ua_run.c:2030 -msgid "Run Migration job\n" -msgstr "" - -#: src/dird/ua_run.c:2062 -#, c-format -msgid "Unknown Job Type=%d\n" -msgstr "" - -#: src/dird/ua_run.c:2136 -#, c-format -msgid "Value missing for keyword %s\n" -msgstr "" - -#: src/dird/ua_run.c:2146 -msgid "JobId specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2155 src/dird/ua_run.c:2295 -msgid "Client specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2163 -msgid "FileSet specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2171 -msgid "Level specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2180 -msgid "Storage specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2188 -msgid "RegexWhere or Where specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2193 -msgid "No authorization for \"regexwhere\" specification.\n" -msgstr "" - -#: src/dird/ua_run.c:2200 -msgid "Where or RegexWhere specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2205 -msgid "No authoriztion for \"where\" specification.\n" -msgstr "" - -#: src/dird/ua_run.c:2212 -msgid "Bootstrap specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2220 -msgid "Replace specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2228 -msgid "When specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2236 -msgid "Priority specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2241 -msgid "Priority must be positive nonzero setting it to 10.\n" -msgstr "" - -#: src/dird/ua_run.c:2251 -msgid "Verify Job specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2279 -msgid "Migration Job specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2287 -msgid "Pool specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2303 -msgid "Restore Client specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2310 -msgid "Plugin Options not yet implemented.\n" -msgstr "" - -#: src/dird/ua_run.c:2313 -msgid "Plugin Options specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2318 -msgid "No authoriztion for \"PluginOptions\" specification.\n" -msgstr "" - -#: src/dird/ua_run.c:2325 -msgid "Spool flag specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2332 -msgid "Invalid spooldata flag.\n" -msgstr "" - -#: src/dird/ua_run.c:2341 -msgid "IgnoreDuplicateCheck flag specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2348 -msgid "Invalid ignoreduplicatecheck flag.\n" -msgstr "" - -#: src/dird/ua_run.c:2353 -msgid "Accurate flag specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2360 -msgid "Invalid accurate flag.\n" -msgstr "" - -#: src/dird/ua_run.c:2365 -msgid "Job name specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2373 -msgid "Media Type specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2381 -msgid "NextPool specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2406 -#, c-format -msgid "Invalid keyword: %s\n" -msgstr "" - -#: src/dird/ua_run.c:2421 -#, c-format -msgid "Catalog \"%s\" not found\n" -msgstr "" - -#: src/dird/ua_run.c:2425 -#, c-format -msgid "No authorization. Catalog \"%s\".\n" -msgstr "" - -#: src/dird/ua_run.c:2459 -#, c-format -msgid "Verify Job \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_run.c:2469 -#, c-format -msgid "Migration Job \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_select.c:39 src/dird/ua_select.c:65 -#, c-format -msgid "The current %s retention period is: %s\n" -msgstr "" - -#: src/dird/ua_select.c:44 -msgid "Continue? (yes/no): " -msgstr "" - -#: src/dird/ua_select.c:70 -msgid "Continue? (yes/mod/no): " -msgstr "" - -#: src/dird/ua_select.c:74 -msgid "Enter new retention period: " -msgstr "" - -#: src/dird/ua_select.c:78 -msgid "Invalid period.\n" -msgstr "" - -#: src/dird/ua_select.c:177 -msgid "The defined Storage resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:189 -msgid "Select Storage resource" -msgstr "" - -#: src/dird/ua_select.c:245 -msgid "You must specify a \"use \" command before continuing.\n" -msgstr "" - -#: src/dird/ua_select.c:251 -msgid "The defined Catalog resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:259 -msgid "Catalog" -msgstr "" - -#: src/dird/ua_select.c:259 -msgid "Select Catalog resource" -msgstr "" - -#: src/dird/ua_select.c:278 -msgid "The disabled Job resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:280 -msgid "The enabled Job resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:292 src/dird/ua_select.c:315 -msgid "Select Job resource" -msgstr "" - -#: src/dird/ua_select.c:307 -msgid "The defined Job resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:334 -#, c-format -msgid "Error: Restore Job resource \"%s\" does not exist.\n" -msgstr "" - -#: src/dird/ua_select.c:348 -msgid "The defined Restore Job resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:356 -msgid "Select Restore Job" -msgstr "" - -#: src/dird/ua_select.c:372 src/dird/ua_select.c:399 -msgid "The defined Client resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:383 -msgid "Select Client resource" -msgstr "" - -#: src/dird/ua_select.c:407 -msgid "Select Client (File daemon) resource" -msgstr "" - -#: src/dird/ua_select.c:434 -#, c-format -msgid "Error: Client resource %s does not exist.\n" -msgstr "" - -#: src/dird/ua_select.c:450 -msgid "The defined Schedule resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:461 -msgid "Schedule" -msgstr "" - -#: src/dird/ua_select.c:461 -msgid "Select Schedule resource" -msgstr "" - -#: src/dird/ua_select.c:487 -#, c-format -msgid "Could not find Client %s: ERR=%s" -msgstr "" - -#: src/dird/ua_select.c:497 src/dird/ua_select.c:551 -#, c-format -msgid "Could not find Client \"%s\": ERR=%s" -msgstr "" - -#: src/dird/ua_select.c:526 -#, c-format -msgid "Error obtaining client ids. ERR=%s\n" -msgstr "" - -#: src/dird/ua_select.c:530 -msgid "No clients defined. You must run a job before using this command.\n" -msgstr "" - -#: src/dird/ua_select.c:534 -msgid "Defined Clients:\n" -msgstr "" - -#: src/dird/ua_select.c:544 -msgid "Select the Client" -msgstr "" - -#: src/dird/ua_select.c:577 src/dird/ua_select.c:601 src/dird/ua_select.c:646 -#, c-format -msgid "Could not find Pool \"%s\": ERR=%s" -msgstr "" - -#: src/dird/ua_select.c:616 -msgid "No pools defined. Use the \"create\" command to create one.\n" -msgstr "" - -#: src/dird/ua_select.c:620 -msgid "Defined Pools:\n" -msgstr "" - -#: src/dird/ua_select.c:633 -msgid "Select the Pool" -msgstr "" - -#: src/dird/ua_select.c:671 -#, c-format -msgid "No access to Pool \"%s\"\n" -msgstr "" - -#: src/dird/ua_select.c:703 -msgid "Enter a Volume name or *MediaId: " -msgstr "" - -#: src/dird/ua_select.c:738 -msgid "The defined Pool resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:746 -msgid "Select Pool resource" -msgstr "" - -#: src/dird/ua_select.c:781 -msgid "Enter the JobId to select: " -msgstr "" - -#: src/dird/ua_select.c:819 -#, c-format -msgid "Could not find Job \"%s\": ERR=%s" -msgstr "" - -#: src/dird/ua_select.c:910 src/dird/ua_select.c:1006 -#, c-format -msgid "Automatically selected %s: %s\n" -msgstr "" - -#: src/dird/ua_select.c:921 src/dird/ua_select.c:1017 -#, c-format -msgid "" -"Your request has multiple choices for \"%s\". Selection is not possible in " -"batch mode.\n" -msgstr "" - -#: src/dird/ua_select.c:939 src/dird/ua_select.c:999 -#, c-format -msgid "Selection list for \"%s\" is empty!\n" -msgstr "" - -#: src/dird/ua_select.c:945 -#, c-format -msgid "Automatically selected: %s\n" -msgstr "" - -#: src/dird/ua_select.c:957 -msgid "Selection aborted, nothing done.\n" -msgstr "" - -#: src/dird/ua_select.c:962 src/dird/ua_select.c:1051 -#, c-format -msgid "Please enter a number between 1 and %d\n" -msgstr "" - -#: src/dird/ua_select.c:1105 -msgid "Storage name given twice.\n" -msgstr "" - -#: src/dird/ua_select.c:1122 -#, c-format -msgid "Expecting jobid=nn command, got: %s\n" -msgstr "" - -#: src/dird/ua_select.c:1126 -#, c-format -msgid "JobId %s is not running.\n" -msgstr "" - -#: src/dird/ua_select.c:1136 -#, c-format -msgid "Expecting job=xxx, got: %s.\n" -msgstr "" - -#: src/dird/ua_select.c:1140 -#, c-format -msgid "Job \"%s\" is not running.\n" -msgstr "" - -#: src/dird/ua_select.c:1148 -#, c-format -msgid "Expecting ujobid=xxx, got: %s.\n" -msgstr "" - -#: src/dird/ua_select.c:1169 -#, c-format -msgid "Storage resource \"%s\": not found\n" -msgstr "" - -#: src/dird/ua_select.c:1201 -msgid "Enter autochanger drive[0]: " -msgstr "" - -#: src/dird/ua_select.c:1222 -msgid "Enter autochanger slot: " -msgstr "" - -#: src/dird/ua_select.c:1252 -msgid "Media Types defined in conf file:\n" -msgstr "" - -#: src/dird/ua_select.c:1258 -msgid "Media Type" -msgstr "" - -#: src/dird/ua_select.c:1258 -msgid "Select the Media Type" -msgstr "" - -#: src/dird/ua_select.c:1296 src/filed/status.c:322 src/stored/status.c:915 -msgid "No Jobs running.\n" -msgstr "" - -#: src/dird/ua_select.c:1298 -msgid "None of your jobs are running.\n" -msgstr "" - -#: src/dird/ua_select.c:1326 -msgid "No value given for \"jobid\".\n" -msgstr "" - -#: src/dird/ua_select.c:1338 -#, c-format -msgid "Unauthorized command from this console for JobId=%d.\n" -msgstr "" - -#: src/dird/ua_select.c:1342 -#, c-format -msgid "Warning Job JobId=%d is not running.\n" -msgstr "" - -#: src/dird/ua_select.c:1367 src/dird/ua_select.c:1462 -#, c-format -msgid "Confirm %s of %d Job%s (yes/no): " -msgstr "" - -#: src/dird/ua_select.c:1380 -msgid "No value given for \"job\".\n" -msgstr "" - -#: src/dird/ua_select.c:1390 -#, c-format -msgid "Unauthorized command from this console for job=%s.\n" -msgstr "" - -#: src/dird/ua_select.c:1396 src/dird/ua_select.c:1421 -#, c-format -msgid "Warning Job %s is not running.\n" -msgstr "" - -#: src/dird/ua_select.c:1405 -msgid "No value given for \"ujobid\".\n" -msgstr "" - -#: src/dird/ua_select.c:1415 -#, c-format -msgid "Unauthorized command from this console for ujobid=%s.\n" -msgstr "" - -#: src/dird/ua_select.c:1441 -msgid "Select Job(s):\n" -msgstr "" - -#: src/dird/ua_select.c:1447 -#, c-format -msgid "JobId=%s Job=%s" -msgstr "" - -#: src/dird/ua_select.c:1451 -#, c-format -msgid "Choose Job list to %s" -msgstr "" - -#: src/dird/ua_server.c:57 -#, c-format -msgid "Cannot create UA thread: %s\n" -msgstr "" - -#: src/dird/ua_server.c:147 -msgid "You have messages.\n" -msgstr "" - -#: src/dird/ua_status.c:171 -msgid "Status available for:\n" -msgstr "" - -#: src/dird/ua_status.c:178 -msgid "Select daemon type for status" -msgstr "" - -#: src/dird/ua_status.c:324 src/stored/status.c:499 -#, c-format -msgid "%s %sVersion: %s (%s) %s %s %s\n" -msgstr "" - -#: src/dird/ua_status.c:328 -#, c-format -msgid "Daemon started %s, conf reloaded %s\n" -msgstr "" - -#: src/dird/ua_status.c:329 -#, c-format -msgid " Jobs: run=%d, running=%d mode=%d,%d\n" -msgstr "" - -#: src/dird/ua_status.c:331 src/filed/status.c:175 src/stored/status.c:509 -#, c-format -msgid " Heap: heap=%s smbytes=%s max_bytes=%s bufs=%s max_bufs=%s\n" -msgstr "" - -#: src/dird/ua_status.c:337 -#, c-format -msgid "" -" Res: njobs=%d nclients=%d nstores=%d npools=%d ncats=%d nfsets=%d nscheds=" -"%d\n" -msgstr "" - -#: src/dird/ua_status.c:394 -#, c-format -msgid "No authorization for Storage \"%s\"\n" -msgstr "" - -#: src/dird/ua_status.c:404 -msgid "Restricted Client or Job does not permit access to Storage daemons\n" -msgstr "" - -#: src/dird/ua_status.c:414 -#, c-format -msgid "" -"\n" -"Failed to connect to Storage daemon %s.\n" -"====\n" -msgstr "" - -#: src/dird/ua_status.c:429 -msgid "Must have three aguments\n" -msgstr "" - -#: src/dird/ua_status.c:478 -#, c-format -msgid "" -"Failed to connect to Client %s.\n" -"====\n" -msgstr "" - -#: src/dird/ua_status.c:483 -msgid "Connected to file daemon\n" -msgstr "" - -#: src/dird/ua_status.c:502 src/dird/ua_status.c:511 -msgid "" -"\n" -"Scheduled Jobs:\n" -msgstr "" - -#: src/dird/ua_status.c:503 -msgid "" -"Level Type Pri Scheduled Job Name Volume\n" -msgstr "" - -#: src/dird/ua_status.c:504 -msgid "===================================================================================\n" -msgstr "" - -#: src/dird/ua_status.c:512 -msgid "" -"Level Type Pri Scheduled Job Name Schedule\n" -msgstr "" - -#: src/dird/ua_status.c:513 -msgid "=====================================================================================\n" -msgstr "" - -#: src/dird/ua_status.c:570 src/dird/ua_status.c:753 -#, c-format -msgid "%-14s\t%-8s\t%3d\t%-18s\t%-18s\t%s\n" -msgstr "" - -#: src/dird/ua_status.c:591 src/dird/ua_status.c:757 -#, c-format -msgid "%-14s %-8s %3d %-18s %-18s %s\n" -msgstr "" - -#: src/dird/ua_status.c:627 -msgid "Ignoring invalid value for days. Max is 3000.\n" -msgstr "" - -#: src/dird/ua_status.c:638 -msgid "Ignoring invalid value for limit. Max is 2000.\n" -msgstr "" - -#: src/dird/ua_status.c:649 -msgid "Ignoring invalid time.\n" -msgstr "" - -#: src/dird/ua_status.c:772 src/dird/ua_status.c:877 -msgid "No Scheduled Jobs.\n" -msgstr "" - -#: src/dird/ua_status.c:824 -msgid "Ignoring invalid value for days. Max is 500.\n" -msgstr "" - -#: src/dird/ua_status.c:903 src/filed/status.c:228 src/stored/status.c:816 -msgid "" -"\n" -"Running Jobs:\n" -msgstr "" - -#: src/dird/ua_status.c:911 -#, c-format -msgid "Console connected %sat %s\n" -msgstr "" - -#: src/dird/ua_status.c:912 src/filed/status.c:240 -msgid "using TLS " -msgstr "" - -#: src/dird/ua_status.c:922 -msgid "" -"No Jobs running.\n" -"====\n" -msgstr "" - -#: src/dird/ua_status.c:929 -msgid " JobId Type Level Files Bytes Name Status\n" -msgstr "" - -#: src/dird/ua_status.c:930 -msgid "======================================================================\n" -msgstr "" - -#: src/dird/ua_status.c:945 -msgid "is waiting execution" -msgstr "" - -#: src/dird/ua_status.c:948 -msgid "is running" -msgstr "" - -#: src/dird/ua_status.c:951 -msgid "is blocked" -msgstr "" - -#: src/dird/ua_status.c:954 -msgid "has terminated" -msgstr "" - -#: src/dird/ua_status.c:957 -msgid "has terminated with warnings" -msgstr "" - -#: src/dird/ua_status.c:960 -msgid "has terminated in incomplete state" -msgstr "" - -#: src/dird/ua_status.c:963 -msgid "has erred" -msgstr "" - -#: src/dird/ua_status.c:966 -msgid "has errors" -msgstr "" - -#: src/dird/ua_status.c:969 -msgid "has a fatal error" -msgstr "" - -#: src/dird/ua_status.c:972 -msgid "has verify differences" -msgstr "" - -#: src/dird/ua_status.c:975 -msgid "has been canceled" -msgstr "" - -#: src/dird/ua_status.c:980 -msgid "is waiting on Client" -msgstr "" - -#: src/dird/ua_status.c:982 -#, c-format -msgid "is waiting on Client %s" -msgstr "" - -#: src/dird/ua_status.c:990 src/dird/ua_status.c:992 -#, c-format -msgid "is waiting on Storage \"%s\"" -msgstr "" - -#: src/dird/ua_status.c:994 -msgid "is waiting on Storage" -msgstr "" - -#: src/dird/ua_status.c:1000 -msgid "is waiting on max Storage jobs" -msgstr "" - -#: src/dird/ua_status.c:1003 -msgid "is waiting on max Client jobs" -msgstr "" - -#: src/dird/ua_status.c:1006 -msgid "is waiting on max Job jobs" -msgstr "" - -#: src/dird/ua_status.c:1009 -msgid "is waiting on max total jobs" -msgstr "" - -#: src/dird/ua_status.c:1013 -#, c-format -msgid "is waiting for its start time (%s)" -msgstr "" - -#: src/dird/ua_status.c:1019 -msgid "is waiting for higher priority jobs to finish" -msgstr "" - -#: src/dird/ua_status.c:1022 -msgid "is waiting for a Shared Storage device" -msgstr "" - -#: src/dird/ua_status.c:1025 src/dird/ua_status.c:1076 src/lib/util.c:317 -msgid "SD committing Data" -msgstr "" - -#: src/dird/ua_status.c:1028 src/dird/ua_status.c:1079 src/lib/util.c:320 -msgid "SD despooling Data" -msgstr "" - -#: src/dird/ua_status.c:1031 src/dird/ua_status.c:1082 src/lib/util.c:323 -msgid "SD despooling Attributes" -msgstr "" - -#: src/dird/ua_status.c:1034 src/dird/ua_status.c:1085 src/lib/util.c:326 -msgid "Dir inserting Attributes" -msgstr "" - -#: src/dird/ua_status.c:1039 -#, c-format -msgid "is in unknown state %c" -msgstr "" - -#: src/dird/ua_status.c:1053 -msgid "is waiting for a mount request" -msgstr "" - -#: src/dird/ua_status.c:1060 -msgid "is waiting for an appendable Volume" -msgstr "" - -#: src/dird/ua_status.c:1068 -msgid "is waiting for Client to connect to Storage daemon" -msgstr "" - -#: src/dird/ua_status.c:1070 -#, c-format -msgid "is waiting for Client %s to connect to Storage %s" -msgstr "" - -#: src/dird/ua_status.c:1101 -#, c-format -msgid "%6d\t%-6s\t%-20s\t%s\t%s\n" -msgstr "" - -#: src/dird/ua_status.c:1133 -#, c-format -msgid "%6d %-4s %-3s %10s %10s %-17s %s\n" -msgstr "" - -#: src/dird/ua_status.c:1161 -msgid "No Terminated Jobs.\n" -msgstr "" - -#: src/dird/ua_status.c:1167 src/lib/status.h:77 -msgid "" -"\n" -"Terminated Jobs:\n" -msgstr "" - -#: src/dird/ua_status.c:1168 src/lib/status.h:84 -msgid " JobId Level Files Bytes Status Finished Name \n" -msgstr "" - -#: src/dird/ua_status.c:1169 -msgid "====================================================================\n" -msgstr "" - -#: src/dird/ua_status.c:1203 src/lib/status.h:110 src/lib/util.c:256 -msgid "Created" -msgstr "" - -#: src/dird/ua_status.c:1210 src/lib/status.h:117 -msgid "Diffs" -msgstr "" - -#: src/dird/ua_status.c:1219 src/lib/status.h:126 src/lib/util.c:278 -#: src/lib/util.c:400 src/lib/util.c:406 -msgid "OK -- with warnings" -msgstr "" - -#: src/dird/ua_status.c:1222 src/lib/status.h:129 -msgid "Incomplete" -msgstr "" - -#: src/dird/ua_status.c:1225 src/lib/status.h:132 -msgid "Other" -msgstr "" - -#: src/dird/ua_status.c:1229 src/lib/status.h:144 -#, c-format -msgid "%6d\t%-6s\t%8s\t%10s\t%-7s\t%-8s\t%s\n" -msgstr "" - -#: src/dird/ua_status.c:1255 src/lib/status.h:173 -#, c-format -msgid "%6d %-6s %8s %10s %-7s %-8s %s\n" -msgstr "" - -#: src/dird/ua_status.c:1265 -msgid "\n" -msgstr "" - -#: src/dird/ua_tree.c:63 -msgid "add dir/file to be restored recursively, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:64 -msgid "change current directory" -msgstr "" - -#: src/dird/ua_tree.c:65 -msgid "count marked files in and below the cd" -msgstr "" - -#: src/dird/ua_tree.c:66 -msgid "delete dir/file to be restored recursively in dir" -msgstr "" - -#: src/dird/ua_tree.c:67 src/dird/ua_tree.c:68 -msgid "long list current directory, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:69 -msgid "leave file selection mode" -msgstr "" - -#: src/dird/ua_tree.c:70 -msgid "estimate restore size" -msgstr "" - -#: src/dird/ua_tree.c:71 -msgid "same as done command" -msgstr "" - -#: src/dird/ua_tree.c:72 -msgid "find files, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:73 src/dird/ua_tree.c:86 src/dird/ua_tree.c:87 -msgid "print help" -msgstr "" - -#: src/dird/ua_tree.c:74 src/dird/ua_tree.c:75 -msgid "list current directory, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:76 -msgid "list subdir in current directory, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:77 -msgid "list the marked files in and below the cd" -msgstr "" - -#: src/dird/ua_tree.c:78 -msgid "list the marked files in" -msgstr "" - -#: src/dird/ua_tree.c:79 -msgid "mark dir/file to be restored recursively, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:80 -msgid "mark directory name to be restored (no files)" -msgstr "" - -#: src/dird/ua_tree.c:81 src/dird/ua_tree.c:82 -msgid "print current working directory" -msgstr "" - -#: src/dird/ua_tree.c:83 -msgid "unmark dir/file to be restored recursively in dir" -msgstr "" - -#: src/dird/ua_tree.c:84 -msgid "unmark directory name only no recursion" -msgstr "" - -#: src/dird/ua_tree.c:85 -msgid "quit and do not do restore" -msgstr "" - -#: src/dird/ua_tree.c:107 -msgid "" -"\n" -"You are now entering file selection mode where you add (mark) and\n" -"remove (unmark) files to be restored. No files are initially added, unless\n" -"you used the \"all\" keyword on the command line.\n" -"Enter \"done\" to leave this mode.\n" -"\n" -msgstr "" - -#: src/dird/ua_tree.c:118 src/dird/ua_tree.c:848 -#, c-format -msgid "cwd is: %s\n" -msgstr "" - -#: src/dird/ua_tree.c:127 src/dird/ua_tree.c:146 -#, c-format -msgid "Invalid command \"%s\". Enter \"done\" to exit.\n" -msgstr "" - -#: src/dird/ua_tree.c:218 -#, c-format -msgid "" -"Something is wrong with the Delta sequence of %s, skiping new parts. Current " -"sequence is %d\n" -msgstr "" - -#: src/dird/ua_tree.c:390 src/dird/ua_tree.c:402 src/dird/ua_tree.c:419 -msgid "No files marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:404 -msgid "1 file marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:406 -#, c-format -msgid "%s files marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:434 -msgid "No directories marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:436 -msgid "1 directory marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:438 -#, c-format -msgid "%s directories marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:459 -#, c-format -msgid "%s total files/dirs. %s marked to be restored.\n" -msgstr "" - -#: src/dird/ua_tree.c:470 -msgid "No file specification given.\n" -msgstr "" - -#: src/dird/ua_tree.c:691 -#, c-format -msgid "Node %s has no children.\n" -msgstr "" - -#: src/dird/ua_tree.c:784 -#, c-format -msgid "%d total files; %d marked to be restored; %s bytes.\n" -msgstr "" - -#: src/dird/ua_tree.c:795 src/stored/btape.c:2948 -#, c-format -msgid "" -" Command Description\n" -" ======= ===========\n" -msgstr "" - -#: src/dird/ua_tree.c:818 -msgid "Too few or too many arguments. Try using double quotes.\n" -msgstr "" - -#: src/dird/ua_tree.c:831 -msgid "Invalid path given.\n" -msgstr "" - -#: src/dird/ua_tree.c:867 src/dird/ua_tree.c:879 -msgid "No files unmarked.\n" -msgstr "" - -#: src/dird/ua_tree.c:881 -msgid "1 file unmarked.\n" -msgstr "" - -#: src/dird/ua_tree.c:884 -#, c-format -msgid "%s files unmarked.\n" -msgstr "" - -#: src/dird/ua_tree.c:895 src/dird/ua_tree.c:912 -msgid "No directories unmarked.\n" -msgstr "" - -#: src/dird/ua_tree.c:914 -msgid "1 directory unmarked.\n" -msgstr "" - -#: src/dird/ua_tree.c:916 -#, c-format -msgid "%d directories unmarked.\n" -msgstr "" - -#: src/dird/ua_update.c:92 -msgid "Update choice:\n" -msgstr "" - -#: src/dird/ua_update.c:93 -msgid "Volume parameters" -msgstr "" - -#: src/dird/ua_update.c:94 -msgid "Pool from resource" -msgstr "" - -#: src/dird/ua_update.c:95 -msgid "Slots from autochanger" -msgstr "" - -#: src/dird/ua_update.c:96 -msgid "Long term statistics" -msgstr "" - -#: src/dird/ua_update.c:97 -msgid "Snapshot parameters" -msgstr "" - -#: src/dird/ua_update.c:98 -msgid "item" -msgstr "" - -#: src/dird/ua_update.c:98 -msgid "Choose catalog item to update" -msgstr "" - -#: src/dird/ua_update.c:144 -#, c-format -msgid "Invalid VolStatus specified: %s\n" -msgstr "" - -#: src/dird/ua_update.c:153 -#, c-format -msgid "New Volume status is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:182 -#, c-format -msgid "Invalid use duration specified: %s\n" -msgstr "" - -#: src/dird/ua_update.c:190 -#, c-format -msgid "New use duration is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:204 -#, c-format -msgid "New max jobs is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:217 -#, c-format -msgid "New max files is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:228 -#, c-format -msgid "Invalid max. bytes specification: %s\n" -msgstr "" - -#: src/dird/ua_update.c:236 -#, c-format -msgid "New Max bytes is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:247 src/dird/ua_update.c:267 -msgid "Invalid value. It must be yes or no.\n" -msgstr "" - -#: src/dird/ua_update.c:255 -#, c-format -msgid "New Recycle flag is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:275 -#, c-format -msgid "New InChanger flag is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:293 -#, c-format -msgid "Invalid slot, it must be between 0 and MaxVols=%d\n" -msgstr "" - -#: src/dird/ua_update.c:303 src/dird/ua_update.c:727 -#, c-format -msgid "Error updating media record Slot: ERR=%s" -msgstr "" - -#: src/dird/ua_update.c:305 -#, c-format -msgid "New Slot is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:330 -#, c-format -msgid "New Pool is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:373 -#, c-format -msgid "New RecyclePool is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:393 -#, c-format -msgid "Error updating Volume record: ERR=%s" -msgstr "" - -#: src/dird/ua_update.c:395 -#, c-format -msgid "Volume defaults updated from \"%s\" Pool record.\n" -msgstr "" - -#: src/dird/ua_update.c:418 src/dird/ua_update.c:450 -#, c-format -msgid "Error updating Volume records: ERR=%s" -msgstr "" - -#: src/dird/ua_update.c:420 src/dird/ua_update.c:452 -#, c-format -msgid "All Volume defaults updated from \"%s\" Pool record.\n" -msgstr "" - -#: src/dird/ua_update.c:442 -#, c-format -msgid "Updating all pools, but skipped PoolId=%d. ERR=%s\n" -msgstr "" - -#: src/dird/ua_update.c:468 -#, c-format -msgid "Error updating media record Enabled: ERR=%s" -msgstr "" - -#: src/dird/ua_update.c:471 -#, c-format -msgid "New Enabled is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:486 -#, c-format -msgid "Error updating media record ActionOnPurge: ERR=%s" -msgstr "" - -#: src/dird/ua_update.c:489 -#, c-format -msgid "New ActionOnPurge is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:605 -msgid "Volume Status" -msgstr "" - -#: src/dird/ua_update.c:606 -msgid "Volume Retention Period" -msgstr "" - -#: src/dird/ua_update.c:607 -msgid "Volume Use Duration" -msgstr "" - -#: src/dird/ua_update.c:608 -msgid "Maximum Volume Jobs" -msgstr "" - -#: src/dird/ua_update.c:609 -msgid "Maximum Volume Files" -msgstr "" - -#: src/dird/ua_update.c:610 -msgid "Maximum Volume Bytes" -msgstr "" - -#: src/dird/ua_update.c:611 -msgid "Recycle Flag" -msgstr "" - -#: src/dird/ua_update.c:612 -msgid "Slot" -msgstr "" - -#: src/dird/ua_update.c:613 -msgid "InChanger Flag" -msgstr "" - -#: src/dird/ua_update.c:614 -msgid "Volume Files" -msgstr "" - -#: src/dird/ua_update.c:616 -msgid "Volume from Pool" -msgstr "" - -#: src/dird/ua_update.c:617 -msgid "All Volumes from Pool" -msgstr "" - -#: src/dird/ua_update.c:618 -msgid "All Volumes from all Pools" -msgstr "" - -#: src/dird/ua_update.c:619 -msgid "Enabled" -msgstr "" - -#: src/dird/ua_update.c:620 -msgid "RecyclePool" -msgstr "" - -#: src/dird/ua_update.c:621 -msgid "Action On Purge" -msgstr "" - -#: src/dird/ua_update.c:631 -#, c-format -msgid "Updating Volume \"%s\"\n" -msgstr "" - -#: src/dird/ua_update.c:636 -#, c-format -msgid "Current Volume status is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:637 -msgid "Possible Values are:\n" -msgstr "" - -#: src/dird/ua_update.c:648 -msgid "Choose new Volume Status" -msgstr "" - -#: src/dird/ua_update.c:656 -msgid "Enter Volume Retention period: " -msgstr "" - -#: src/dird/ua_update.c:663 -#, c-format -msgid "Current use duration is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:665 -msgid "Enter Volume Use Duration: " -msgstr "" - -#: src/dird/ua_update.c:672 -#, c-format -msgid "Current max jobs is: %u\n" -msgstr "" - -#: src/dird/ua_update.c:673 -msgid "Enter new Maximum Jobs: " -msgstr "" - -#: src/dird/ua_update.c:680 -#, c-format -msgid "Current max files is: %u\n" -msgstr "" - -#: src/dird/ua_update.c:681 -msgid "Enter new Maximum Files: " -msgstr "" - -#: src/dird/ua_update.c:688 -#, c-format -msgid "Current value is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:689 -msgid "Enter new Maximum Bytes: " -msgstr "" - -#: src/dird/ua_update.c:697 -#, c-format -msgid "Current recycle flag is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:699 -msgid "Enter new Recycle status: " -msgstr "" - -#: src/dird/ua_update.c:706 -#, c-format -msgid "Current Slot is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:707 -msgid "Enter new Slot: " -msgstr "" - -#: src/dird/ua_update.c:714 -#, c-format -msgid "Current InChanger flag is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:715 -#, c-format -msgid "Set InChanger flag for Volume \"%s\": yes/no: " -msgstr "" - -#: src/dird/ua_update.c:729 -#, c-format -msgid "New InChanger flag is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:736 -msgid "" -"Warning changing Volume Files can result\n" -"in loss of data on your Volume\n" -"\n" -msgstr "" - -#: src/dird/ua_update.c:738 -#, c-format -msgid "Current Volume Files is: %u\n" -msgstr "" - -#: src/dird/ua_update.c:739 -msgid "Enter new number of Files for Volume: " -msgstr "" - -#: src/dird/ua_update.c:744 -msgid "Normally, you should only increase Volume Files by one!\n" -msgstr "" - -#: src/dird/ua_update.c:745 -msgid "Increase Volume Files? (yes/no): " -msgstr "" - -#: src/dird/ua_update.c:755 -#, c-format -msgid "New Volume Files is: %u\n" -msgstr "" - -#: src/dird/ua_update.c:767 -#, c-format -msgid "Current Pool is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:768 -msgid "Enter new Pool name: " -msgstr "" - -#: src/dird/ua_update.c:789 -#, c-format -msgid "Current Enabled is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:790 -msgid "Enter new Enabled: " -msgstr "" - -#: src/dird/ua_update.c:800 -#, c-format -msgid "Current RecyclePool is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:802 -msgid "No current RecyclePool\n" -msgstr "" - -#: src/dird/ua_update.c:812 -#, c-format -msgid "Current ActionOnPurge is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:814 -msgid "Enter new ActionOnPurge (one of: Truncate, None): " -msgstr "" - -#: src/dird/ua_update.c:842 -#, c-format -msgid "Updating %i job(s).\n" -msgstr "" - -#: src/dird/ua_update.c:874 -#, c-format -msgid "db_update_pool_record returned %d. ERR=%s\n" -msgstr "" - -#: src/dird/ua_update.c:881 -msgid "Pool DB record updated from resource.\n" -msgstr "" - -#: src/dird/ua_update.c:908 -msgid "Expect JobId keyword, not found.\n" -msgstr "" - -#: src/dird/ua_update.c:933 -msgid "Neither Client nor StartTime specified.\n" -msgstr "" - -#: src/dird/vbackup.c:122 -#, c-format -msgid "Start Virtual Backup JobId %s, Job=%s\n" -msgstr "" - -#: src/dird/vbackup.c:126 -msgid "" -"This Job is not an Accurate backup so is not equivalent to a Full backup.\n" -msgstr "" - -#: src/dird/vbackup.c:172 -msgid "No valid Jobs found from user selection.\n" -msgstr "" - -#: src/dird/vbackup.c:176 -#, c-format -msgid "Using user supplied JobIds=%s\n" -msgstr "" - -#: src/dird/vbackup.c:195 -msgid "No previous Full found in list, using Differential level\n" -msgstr "" - -#: src/dird/vbackup.c:200 -msgid "No previous Full found in list, using Incremental level\n" -msgstr "" - -#: src/dird/vbackup.c:213 -msgid "No previous Jobs found.\n" -msgstr "" - -#: src/dird/vbackup.c:236 -#, c-format -msgid "Error getting Job record for previous Job: ERR=%s" -msgstr "" - -#: src/dird/vbackup.c:449 -#, c-format -msgid "" -"%s %s %s (%s):\n" -" Build OS: %s %s %s\n" -" JobId: %d\n" -" Job: %s\n" -" Backup Level: Virtual Full\n" -" Client: \"%s\" %s\n" -" FileSet: \"%s\" %s\n" -" Pool: \"%s\" (From %s)\n" -" Catalog: \"%s\" (From %s)\n" -" Storage: \"%s\" (From %s)\n" -" Scheduled time: %s\n" -" Start time: %s\n" -" End time: %s\n" -" Elapsed time: %s\n" -" Priority: %d\n" -" SD Files Written: %s\n" -" SD Bytes Written: %s (%sB)\n" -" Rate: %.1f KB/s\n" -" Volume name(s): %s\n" -" Volume Session Id: %d\n" -" Volume Session Time: %d\n" -" Last Volume Bytes: %s (%sB)\n" -" SD Errors: %d\n" -" SD termination status: %s\n" -" Termination: %s\n" -"\n" -msgstr "" - -#: src/dird/verify.c:72 src/dird/verify.c:319 -#, c-format -msgid "Unimplemented Verify level %d(%c)\n" -msgstr "" - -#: src/dird/verify.c:136 -msgid "" -"Unable to find JobId of previous InitCatalog Job.\n" -"Please run a Verify with Level=InitCatalog before\n" -"running the current Job.\n" -msgstr "" - -#: src/dird/verify.c:141 -msgid "Unable to find JobId of previous Job for this client.\n" -msgstr "" - -#: src/dird/verify.c:158 -#, c-format -msgid "Could not get job record for previous Job. ERR=%s" -msgstr "" - -#: src/dird/verify.c:164 -#, c-format -msgid "Last Job %d did not terminate normally. JobStatus=%c\n" -msgstr "" - -#: src/dird/verify.c:168 -#, c-format -msgid "Verifying against JobId=%d Job=%s\n" -msgstr "" - -#: src/dird/verify.c:207 -#, c-format -msgid "Start Verify JobId=%s Level=%s Job=%s\n" -msgstr "" - -#: src/dird/verify.c:306 -msgid "Deprecated feature ... use bootstrap.\n" -msgstr "" - -#: src/dird/verify.c:373 -#, c-format -msgid "Unimplemented verify level %d\n" -msgstr "" - -#: src/dird/verify.c:422 -msgid "Verify OK" -msgstr "" - -#: src/dird/verify.c:426 -msgid "*** Verify Error ***" -msgstr "" - -#: src/dird/verify.c:430 -msgid "Verify warnings" -msgstr "" - -#: src/dird/verify.c:433 -msgid "Verify Canceled" -msgstr "" - -#: src/dird/verify.c:436 -msgid "Verify Differences" -msgstr "" - -#: src/dird/verify.c:441 -#, c-format -msgid "Inappropriate term code: %d %c\n" -msgstr "" - -#: src/dird/verify.c:455 -#, c-format -msgid "" -"%s %s %s (%s):\n" -" Build OS: %s %s %s\n" -" JobId: %d\n" -" Job: %s\n" -" FileSet: %s\n" -" Verify Level: %s\n" -" Client: %s\n" -" Verify JobId: %d\n" -" Verify Job: %s\n" -" Start time: %s\n" -" End time: %s\n" -" Files Expected: %s\n" -" Files Examined: %s\n" -" Non-fatal FD errors: %d\n" -" FD termination status: %s\n" -" SD termination status: %s\n" -" Termination: %s\n" -"\n" -msgstr "" - -#: src/dird/verify.c:490 -#, c-format -msgid "" -"%s %s %s (%s):\n" -" Build: %s %s %s\n" -" JobId: %d\n" -" Job: %s\n" -" FileSet: %s\n" -" Verify Level: %s\n" -" Client: %s\n" -" Verify JobId: %d\n" -" Verify Job: %s\n" -" Start time: %s\n" -" End time: %s\n" -" Files Examined: %s\n" -" Non-fatal FD errors: %d\n" -" FD termination status: %s\n" -" Termination: %s\n" -"\n" -msgstr "" - -#: src/dird/verify.c:569 -#, c-format -msgid "" -"birdSD.\n" -msgstr "" - -#: src/filed/backup.c:176 -msgid "The heartbeat didn't start in time.\n" -msgstr "" - -#: src/filed/backup.c:190 -#, c-format -msgid "Had %ld acl errors while doing backup\n" -msgstr "" - -#: src/filed/backup.c:196 -#, c-format -msgid "Had %ld xattr errors while doing backup\n" -msgstr "" - -#: src/filed/backup.c:323 -#, c-format -msgid " Recursion turned off. Will not descend from %s into %s\n" -msgstr "" - -#: src/filed/backup.c:330 -#, c-format -msgid " %s is a different filesystem. Will not descend from %s into it.\n" -msgstr "" - -#: src/filed/backup.c:336 -#, c-format -msgid " Disallowed filesystem. Will not descend from %s into %s\n" -msgstr "" - -#: src/filed/backup.c:341 -#, c-format -msgid " Disallowed drive type. Will not descend into %s\n" -msgstr "" - -#: src/filed/backup.c:352 -#, c-format -msgid " Socket file skipped: %s\n" -msgstr "" - -#: src/filed/backup.c:365 -#, c-format -msgid " Could not access \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/backup.c:372 -#, c-format -msgid " Could not follow link \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/backup.c:379 -#, c-format -msgid " Could not stat \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/backup.c:386 src/filed/verify.c:130 -#, c-format -msgid " Unchanged file skipped: %s\n" -msgstr "" - -#: src/filed/backup.c:389 -#, c-format -msgid " Archive file not saved: %s\n" -msgstr "" - -#: src/filed/backup.c:393 -#, c-format -msgid " Could not open directory \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/backup.c:402 -#, c-format -msgid " Unknown file type %d; not saved: %s\n" -msgstr "" - -#: src/filed/backup.c:511 -#, c-format -msgid " Cannot open \"%s\": ERR=%s.\n" -msgstr "" - -#: src/filed/backup.c:690 src/filed/restore.c:1449 -msgid "Windows Encrypted data not supported on this OS.\n" -msgstr "" - -#: src/filed/backup.c:717 -#, c-format -msgid "Read error on file %s. ERR=%s\n" -msgstr "" - -#: src/filed/backup.c:720 -#, c-format -msgid "Too many errors. JobErrors=%d.\n" -msgstr "" - -#: src/filed/backup.c:730 -msgid "Encryption padding error\n" -msgstr "" - -#: src/filed/backup.c:873 src/filed/backup.c:889 -msgid "Encryption error\n" -msgstr "" - -#: src/filed/backup.c:910 -msgid "main thread is stopping because heartbeat thread stopped\n" -msgstr "" - -#: src/filed/backup.c:967 -msgid "Invalid file flags, no supported data stream type.\n" -msgstr "" - -#: src/filed/backup.c:1007 -#, c-format -msgid "Network send error to SD. Data=%s ERR=%s\n" -msgstr "" - -#: src/filed/backup.c:1148 -#, c-format -msgid "Compression deflateParams error: %d\n" -msgstr "" - -#: src/filed/backup.c:1201 -#, c-format -msgid " Cannot open resource fork for \"%s\": ERR=%s.\n" -msgstr "" - -#: src/filed/backup.c:1259 -#, c-format -msgid "Compression deflate error: %d\n" -msgstr "" - -#: src/filed/backup.c:1266 -#, c-format -msgid "Compression deflateReset error: %d\n" -msgstr "" - -#: src/filed/backup.c:1308 -#, c-format -msgid "Compression LZO error: %d\n" -msgstr "" - -#: src/filed/backup.c:1518 -#, c-format -msgid "VSS Writer (BackupComplete): %s\n" -msgstr "" - -#: src/filed/bfdjson.c:68 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bfdjson [-c config_file] [-d debug_level]\n" -" -r get resource type \n" -" -n get resource \n" -" -l get only directives matching dirs (use with -r)\n" -" -D get only data\n" -" -c use as configuration file\n" -" -d set debug level to \n" -" -dt print a timestamp in debug output\n" -" -t test configuration file and exit\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" - -#: src/filed/bfdjson.c:463 src/filed/filed.c:328 -#, c-format -msgid "" -"No File daemon resource defined in %s\n" -"Without that I don't know who I am :-(\n" -msgstr "" - -#: src/filed/bfdjson.c:468 src/filed/filed.c:333 -#, c-format -msgid "Only one Client resource permitted in %s\n" -msgstr "" - -#: src/filed/bfdjson.c:492 src/filed/filed.c:388 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"File daemon in %s.\n" -msgstr "" - -#: src/filed/bfdjson.c:504 src/filed/filed.c:423 -#, c-format -msgid "" -"\"PKI Key Pair\" must be defined for File daemon \"%s\" in %s if either " -"\"PKI Sign\" or \"PKI Encrypt\" are enabled.\n" -msgstr "" - -#: src/filed/bfdjson.c:517 src/filed/filed.c:538 -#, c-format -msgid "No Director resource defined in %s\n" -msgstr "" - -#: src/filed/crypto.c:37 -msgid "Encrypting sparse or offset data not supported.\n" -msgstr "" - -#: src/filed/crypto.c:44 -msgid "Failed to initialize encryption context.\n" -msgstr "" - -#: src/filed/crypto.c:117 -#, c-format -msgid "%s signature digest initialization failed\n" -msgstr "" - -#: src/filed/crypto.c:147 -msgid "Unsupported cipher on this system.\n" -msgstr "" - -#: src/filed/crypto.c:153 src/filed/crypto.c:162 -msgid "An error occurred while encrypting the stream.\n" -msgstr "" - -#: src/filed/crypto.c:225 -msgid "Failed to allocate memory for crypto signature.\n" -msgstr "" - -#: src/filed/crypto.c:230 -msgid "An error occurred while adding signer the stream.\n" -msgstr "" - -#: src/filed/crypto.c:236 src/filed/crypto.c:251 -msgid "An error occurred while signing the stream.\n" -msgstr "" - -#: src/filed/crypto.c:275 -msgid "An error occurred finalizing signing the stream.\n" -msgstr "" - -#: src/filed/dedupfiled.c:88 -#, c-format -msgid "Quarantine, got ACK for unknown block #%08x\n" -msgstr "" - -#: src/filed/dedupfiled.c:100 -#, c-format -msgid "Quarantine, got request for unknown block #%08x\n" -msgstr "" - -#: src/filed/dedupfiled.c:130 -#, c-format -msgid "Quarantine, got unexpected command %d len=%d \"%s\" \n" -msgstr "" - -#: src/filed/dedupfiled.c:332 -#, c-format -msgid "DEDUP SD didn't found #%08x, use zeroes instead\n" -msgstr "" - -#: src/filed/dedupfiled.c:338 -#, c-format -msgid "DEDUP got a BNET_CMD_UNK_HASH but don't know the hash #%08x.\n" -msgstr "" - -#: src/filed/dedupfiled.c:368 -#, c-format -msgid "DEDUP got a BNET_CMD_STO_BLOCK but don't know the hash #%08x.\n" -msgstr "" - -#: src/filed/fd_plugins.c:546 src/filed/fd_plugins.c:690 -#, c-format -msgid "Command plugin \"%s\": no type in startBackupFile packet.\n" -msgstr "" - -#: src/filed/fd_plugins.c:559 -#, c-format -msgid "Command plugin \"%s\": no object_name in startBackupFile packet.\n" -msgstr "" - -#: src/filed/fd_plugins.c:572 src/filed/fd_plugins.c:697 -#, c-format -msgid "Command plugin \"%s\": no fname in startBackupFile packet.\n" -msgstr "" - -#: src/filed/fd_plugins.c:771 -msgid "Plugin save packet not found.\n" -msgstr "" - -#: src/filed/fd_plugins.c:906 -#, c-format -msgid "Plugin=%s not found.\n" -msgstr "" - -#: src/filed/fd_plugins.c:973 -#, c-format -msgid "Plugin createFile call failed. Stat=%d file=%s\n" -msgstr "" - -#: src/filed/fd_plugins.c:978 -#, c-format -msgid "Plugin createFile call failed. Returned CF_ERROR file=%s\n" -msgstr "" - -#: src/filed/fd_plugins.c:1008 src/findlib/create_file.c:220 -#, c-format -msgid "Could not create %s: ERR=%s\n" -msgstr "" - -#: src/filed/fd_plugins.c:1875 -msgid "Command plugin: no fname in baculaCheckChanges packet.\n" -msgstr "" - -#: src/filed/fd_snapshot.c:939 -#, c-format -msgid "Error while creating command string %s.\n" -msgstr "" - -#: src/filed/fd_snapshot.c:959 -#, c-format -msgid "Error while executing \"%s\" %s. %s %s\n" -msgstr "" - -#: src/filed/fd_snapshot.c:970 -msgid "Unable to parse snapshot command output\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1104 -#, c-format -msgid "Unable to create snapshot record. ERR=%s\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1108 -#, c-format -msgid "Unable to create snapshot record, got %s\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1125 -#, c-format -msgid "Unable to delete snapshot record. ERR=%s\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1129 -#, c-format -msgid "Unable to delete snapshot record, got %s\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1153 -#, c-format -msgid "Unable to get snapshot record. ERR=%s\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1157 -#, c-format -msgid "Unable to get snapshot record, got %s\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1162 -msgid "Unable to parse command output\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1342 -msgid "Un-Quiescing applications\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1354 -msgid "Quiescing applications\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1391 -#, c-format -msgid " Delete Snapshot for %s\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1394 -#, c-format -msgid " Unable to delete snapshot of %s ERR=%s\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1430 -#, c-format -msgid " Create Snapshot for %s\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1438 -#, c-format -msgid " Unable to create snapshot of %s ERR=%s\n" -msgstr "" - -#: src/filed/filed.c:52 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bacula-fd [-f -s] [-c config_file] [-d debug_level]\n" -" -c use as configuration file\n" -" -d [,] set debug level to , debug tags to \n" -" -dt print a timestamp in debug output\n" -" -f run in foreground (for debugging)\n" -" -g groupid\n" -" -k keep readall capabilities\n" -" -m print kaboom output (for debugging)\n" -" -s no signals (for debugging)\n" -" -t test configuration file and exit\n" -" -T set trace on\n" -" -u userid\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" - -#: src/filed/filed.c:185 -msgid "-k option has no meaning without -u option.\n" -msgstr "" - -#: src/filed/filed.c:361 src/filed/filed.c:560 -#, c-format -msgid "Disable Command \"%s\" not found.\n" -msgstr "" - -#: src/filed/filed.c:412 -msgid "PKI encryption/signing enabled but not compiled into Bacula.\n" -msgstr "" - -#: src/filed/filed.c:435 src/filed/filed.c:466 src/filed/filed.c:516 -msgid "Failed to allocate a new keypair object.\n" -msgstr "" - -#: src/filed/filed.c:439 -#, c-format -msgid "Failed to load public certificate for File daemon \"%s\" in %s.\n" -msgstr "" - -#: src/filed/filed.c:445 -#, c-format -msgid "Failed to load private key for File daemon \"%s\" in %s.\n" -msgstr "" - -#: src/filed/filed.c:475 -#, c-format -msgid "Failed to load private key from file %s for File daemon \"%s\" in %s.\n" -msgstr "" - -#: src/filed/filed.c:482 -#, c-format -msgid "" -"Failed to load trusted signer certificate from file %s for File daemon \"%s" -"\" in %s.\n" -msgstr "" - -#: src/filed/filed.c:522 -#, c-format -msgid "" -"Failed to load master key certificate from file %s for File daemon \"%s\" in " -"%s.\n" -msgstr "" - -#: src/filed/filed_conf.c:200 src/filed/filed_conf.c:224 -#, c-format -msgid "Expected a Cipher Type keyword, got: %s" -msgstr "" - -#: src/filed/hello.c:79 src/stored/hello.c:102 -#, c-format -msgid "Bad Hello command from Director at %s. Len=%d.\n" -msgstr "" - -#: src/filed/hello.c:93 src/stored/hello.c:116 -#, c-format -msgid "Bad Hello command from Director at %s: %s\n" -msgstr "" - -#: src/filed/hello.c:111 -#, c-format -msgid "Connection from unknown Director %s at %s rejected.\n" -msgstr "" - -#: src/filed/hello.c:145 -msgid "SD connect failed: Bad Hello command\n" -msgstr "" - -#: src/filed/hello.c:153 -#, c-format -msgid "SD connect failed: Job name not found: %s\n" -msgstr "" - -#: src/filed/hello.c:164 -#, c-format -msgid "SD \"%s\" tried to connect two times.\n" -msgstr "" - -#: src/filed/hello.c:269 src/filed/hello.c:271 src/stored/hello.c:500 -#: src/stored/hello.c:502 -#, c-format -msgid "Recv caps from SD failed. ERR=%s\n" -msgstr "" - -#: src/filed/hello.c:277 src/stored/hello.c:508 -#, c-format -msgid "Bad caps from SD: %s.\n" -msgstr "" - -#: src/filed/hello.c:278 src/stored/hello.c:509 -#, c-format -msgid "Bad caps from SD: %s\n" -msgstr "" - -#: src/filed/job.c:322 -#, c-format -msgid "Command: \"%s\" is disabled.\n" -msgstr "" - -#: src/filed/job.c:491 -#, c-format -msgid "Bad command from %s. Len=%d.\n" -msgstr "" - -#: src/filed/job.c:552 -msgid "2902 Error scanning cancel command.\n" -msgstr "" - -#: src/filed/job.c:556 src/filed/job.c:595 -#, c-format -msgid "2901 Job %s not found.\n" -msgstr "" - -#: src/filed/job.c:566 -#, c-format -msgid "2001 Job \"%s\" marked to be %s.\n" -msgstr "" - -#: src/filed/job.c:589 -#, c-format -msgid "2991 Bad setbandwidth command: %s\n" -msgstr "" - -#: src/filed/job.c:645 -#, c-format -msgid "2991 Bad setdebug command: %s\n" -msgstr "" - -#: src/filed/job.c:695 -#, c-format -msgid "Bad estimate command: %s" -msgstr "" - -#: src/filed/job.c:696 -msgid "2992 Bad estimate command.\n" -msgstr "" - -#: src/filed/job.c:719 -#, c-format -msgid "Bad Job Command: %s" -msgstr "" - -#: src/filed/job.c:759 -#, c-format -msgid "Bad RunBeforeJob command: %s\n" -msgstr "" - -#: src/filed/job.c:760 src/filed/job.c:779 -msgid "2905 Bad RunBeforeJob command.\n" -msgstr "" - -#: src/filed/job.c:790 -msgid "2905 Bad RunBeforeNow command.\n" -msgstr "" - -#: src/filed/job.c:809 -#, c-format -msgid "Bad RunAfter command: %s\n" -msgstr "" - -#: src/filed/job.c:810 -msgid "2905 Bad RunAfterJob command.\n" -msgstr "" - -#: src/filed/job.c:846 -#, c-format -msgid "Bad RunScript command: %s\n" -msgstr "" - -#: src/filed/job.c:847 -msgid "2905 Bad RunScript command.\n" -msgstr "" - -#: src/filed/job.c:902 -#, c-format -msgid "Bad RestoreObject command: %s\n" -msgstr "" - -#: src/filed/job.c:967 -msgid "2909 Bad RestoreObject command.\n" -msgstr "" - -#: src/filed/job.c:1064 -#, c-format -msgid "Plugin Directory not defined. Cannot use plugin: \"%s\"\n" -msgstr "" - -#: src/filed/job.c:1106 -#, c-format -msgid "Error running program: %s. stat=%d: ERR=%s\n" -msgstr "" - -#: src/filed/job.c:1117 -#, c-format -msgid "Cannot open FileSet input file: %s. ERR=%s\n" -msgstr "" - -#: src/filed/job.c:1271 -#, c-format -msgid "REGEX %s compile error. ERR=%s\n" -msgstr "" - -#: src/filed/job.c:1422 -#, c-format -msgid "Invalid FileSet command: %s\n" -msgstr "" - -#: src/filed/job.c:1708 src/findlib/match.c:205 src/tools/testfind.c:640 -#, c-format -msgid "Unknown include/exclude option: %c\n" -msgstr "" - -#: src/filed/job.c:1862 -#, c-format -msgid "" -"DIR and FD clocks differ by %lld seconds, FD automatically compensating.\n" -msgstr "" - -#: src/filed/job.c:1871 -#, c-format -msgid "Unknown backup level: %s\n" -msgstr "" - -#: src/filed/job.c:1884 -#, c-format -msgid "Bad level command: %s\n" -msgstr "" - -#: src/filed/job.c:1906 -#, c-format -msgid "Bad session command: %s" -msgstr "" - -#: src/filed/job.c:1965 src/stored/dircmd.c:348 -#, c-format -msgid "Bad storage command: %s" -msgstr "" - -#: src/filed/job.c:1993 src/stored/dircmd.c:370 -#, c-format -msgid "Failed to connect to Storage daemon: %s:%d\n" -msgstr "" - -#: src/filed/job.c:2034 -msgid "Failed connect from Storage daemon. SD bsock=NULL.\n" -msgstr "" - -#: src/filed/job.c:2282 -msgid "ACL support not configured for your machine.\n" -msgstr "" - -#: src/filed/job.c:2286 -msgid "XATTR support not configured for your machine.\n" -msgstr "" - -#: src/filed/job.c:2295 -msgid "Cannot contact Storage daemon\n" -msgstr "" - -#: src/filed/job.c:2314 -#, c-format -msgid "Bad response to append open: %s\n" -msgstr "" - -#: src/filed/job.c:2319 -msgid "Bad response from stored to open command\n" -msgstr "" - -#: src/filed/job.c:2350 -#, c-format -msgid "Generate VSS snapshots. Driver=\"%s\"\n" -msgstr "" - -#: src/filed/job.c:2355 -#, c-format -msgid "VSS CreateSnapshots failed. ERR=%s\n" -msgstr "" - -#: src/filed/job.c:2361 -#, c-format -msgid "VSS Writer (PrepareForBackup): %s\n" -msgstr "" - -#: src/filed/job.c:2366 -msgid "No drive letters found for generating VSS snapshots.\n" -msgstr "" - -#: src/filed/job.c:2370 -#, c-format -msgid "VSS was not initialized properly. ERR=%s\n" -msgstr "" - -#: src/filed/job.c:2428 -msgid "Append Close with SD failed.\n" -msgstr "" - -#: src/filed/job.c:2433 -#, c-format -msgid "Bad status %d %c returned from Storage Daemon.\n" -msgstr "" - -#: src/filed/job.c:2463 -#, c-format -msgid "2994 Bad verify command: %s\n" -msgstr "" - -#: src/filed/job.c:2478 src/filed/job.c:2519 -#, c-format -msgid "2994 Bad verify level: %s\n" -msgstr "" - -#: src/filed/job.c:2624 -#, c-format -msgid "Bad replace command. CMD=%s\n" -msgstr "" - -#: src/filed/job.c:2650 -#, c-format -msgid "Bad where regexp. where=%s\n" -msgstr "" - -#: src/filed/job.c:2686 -#, c-format -msgid "VSS was not initialized properly. VSS support is disabled. ERR=%s\n" -msgstr "" - -#: src/filed/job.c:2731 -#, c-format -msgid "VSS Writer (RestoreComplete): %s\n" -msgstr "" - -#: src/filed/job.c:2786 -msgid "Improper calling sequence.\n" -msgstr "" - -#: src/filed/job.c:2806 -#, c-format -msgid "Bad response to SD read open: %s\n" -msgstr "" - -#: src/filed/job.c:2811 -msgid "Bad response from stored to read open command\n" -msgstr "" - -#: src/filed/job.c:2900 -#, c-format -msgid "Bad response from SD to %s command. Wanted %s, got len=%ld msg=\"%s\"\n" -msgstr "" - -#: src/filed/restore.c:99 -#, c-format -msgid "Size of data or stream of %s not correct. Original %s, restored %s.\n" -msgstr "" - -#: src/filed/restore.c:119 -#, c-format -msgid "Invalid length of Finder Info (got %d, not 32)\n" -msgstr "" - -#: src/filed/restore.c:124 -#, c-format -msgid "Could not set Finder Info on %s\n" -msgstr "" - -#: src/filed/restore.c:312 src/filed/restore.c:995 src/stored/bextract.c:696 -#, c-format -msgid "Unknown stream=%d ignored. This shouldn't happen!\n" -msgstr "" - -#: src/filed/restore.c:410 -msgid "LZO init failed\n" -msgstr "" - -#: src/filed/restore.c:472 src/filed/verify_vol.c:95 -#, c-format -msgid "Record header scan error: %s\n" -msgstr "" - -#: src/filed/restore.c:482 src/filed/verify_vol.c:105 -#, c-format -msgid "Data record error. ERR=%s\n" -msgstr "" - -#: src/filed/restore.c:486 src/filed/verify_vol.c:109 -#, c-format -msgid "Actual data size %d not same as header %d\n" -msgstr "" - -#: src/filed/restore.c:548 src/stored/bextract.c:436 -#, c-format -msgid "%s stream not supported on this Client.\n" -msgstr "" - -#: src/filed/restore.c:629 -msgid "Unexpected cryptographic session data stream.\n" -msgstr "" - -#: src/filed/restore.c:637 -msgid "" -"No private decryption keys have been defined to decrypt encrypted backup " -"data.\n" -msgstr "" - -#: src/filed/restore.c:648 -msgid "Could not create digest.\n" -msgstr "" - -#: src/filed/restore.c:662 -msgid "Missing private key required to decrypt encrypted backup data.\n" -msgstr "" - -#: src/filed/restore.c:665 -msgid "Decrypt of the session key failed.\n" -msgstr "" - -#: src/filed/restore.c:668 -msgid "Signer not found. Decryption failed.\n" -msgstr "" - -#: src/filed/restore.c:671 -msgid "Unsupported digest algorithm. Decrypt failed.\n" -msgstr "" - -#: src/filed/restore.c:674 -msgid "Unsupported encryption algorithm. Decrypt failed.\n" -msgstr "" - -#: src/filed/restore.c:678 -#, c-format -msgid "" -"An error=%d occurred while decoding encrypted session data stream: ERR=%s\n" -msgstr "" - -#: src/filed/restore.c:747 src/filed/restore.c:795 -#, c-format -msgid "Missing encryption session data stream for %s\n" -msgstr "" - -#: src/filed/restore.c:755 src/filed/restore.c:802 -#, c-format -msgid "Failed to initialize decryption context for %s\n" -msgstr "" - -#: src/filed/restore.c:814 -#, c-format -msgid "Cannot open resource fork for %s.\n" -msgstr "" - -#: src/filed/restore.c:956 -msgid "Unexpected cryptographic signature data stream.\n" -msgstr "" - -#: src/filed/restore.c:962 -#, c-format -msgid "Failed to decode message signature for %s\n" -msgstr "" - -#: src/filed/restore.c:1033 -#, c-format -msgid "Encountered %ld acl errors while doing restore\n" -msgstr "" - -#: src/filed/restore.c:1037 -#, c-format -msgid "Encountered %ld xattr errors while doing restore\n" -msgstr "" - -#: src/filed/restore.c:1041 -#, c-format -msgid "" -"%d non-supported data streams and %d non-supported attrib streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1045 -#, c-format -msgid "%d non-supported resource fork streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1048 -#, c-format -msgid "%d non-supported Finder Info streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1051 -#, c-format -msgid "%d non-supported acl streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1054 -#, c-format -msgid "%d non-supported crypto streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1057 -#, c-format -msgid "%d non-supported xattr streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1136 src/lib/util.c:488 -msgid "None" -msgstr "" - -#: src/filed/restore.c:1140 -msgid "Zlib errno" -msgstr "" - -#: src/filed/restore.c:1142 -msgid "Zlib stream error" -msgstr "" - -#: src/filed/restore.c:1144 -msgid "Zlib data error" -msgstr "" - -#: src/filed/restore.c:1146 -msgid "Zlib memory error" -msgstr "" - -#: src/filed/restore.c:1148 -msgid "Zlib buffer error" -msgstr "" - -#: src/filed/restore.c:1150 -msgid "Zlib version error" -msgstr "" - -#: src/filed/restore.c:1152 src/lib/util.c:832 src/lib/util.c:842 -#: src/lib/util.c:853 src/lib/util.c:860 src/lib/util.c:867 src/lib/util.c:881 -#: src/lib/util.c:891 src/lib/util.c:904 src/lib/util.c:915 -msgid "*none*" -msgstr "" - -#: src/filed/restore.c:1189 -#, c-format -msgid "Missing cryptographic signature for %s\n" -msgstr "" - -#: src/filed/restore.c:1219 src/filed/restore.c:1243 -#, c-format -msgid "Signature validation failed for file %s: ERR=%s\n" -msgstr "" - -#: src/filed/restore.c:1233 -#, c-format -msgid "Digest one file failed for file: %s\n" -msgstr "" - -#: src/filed/restore.c:1264 -#, c-format -msgid "Signature validation failed for %s: %s\n" -msgstr "" - -#: src/filed/restore.c:1290 src/stored/bextract.c:531 -#: src/stored/bextract.c:596 -#, c-format -msgid "Seek to %s error on %s: ERR=%s\n" -msgstr "" - -#: src/filed/restore.c:1331 -#, c-format -msgid "Compressed header version error. Got=0x%x want=0x%x\n" -msgstr "" - -#: src/filed/restore.c:1336 src/stored/bextract.c:625 -#, c-format -msgid "Compressed header size error. comp_len=%d, msglen=%d\n" -msgstr "" - -#: src/filed/restore.c:1359 -#, c-format -msgid "LZO uncompression error on file %s. ERR=%d\n" -msgstr "" - -#: src/filed/restore.c:1369 src/stored/bextract.c:660 -#, c-format -msgid "Compression algorithm 0x%x found, but not supported!\n" -msgstr "" - -#: src/filed/restore.c:1394 -#, c-format -msgid "Uncompression error on file %s. ERR=%s\n" -msgstr "" - -#: src/filed/restore.c:1403 src/stored/bextract.c:564 -msgid "GZIP data stream found, but GZIP not configured!\n" -msgstr "" - -#: src/filed/restore.c:1431 -#, c-format -msgid "Write error in Win32 Block Decomposition on %s: %s\n" -msgstr "" - -#: src/filed/restore.c:1439 src/filed/restore.c:1454 -#, c-format -msgid "Write write error on %s: ERR=%s\n" -msgstr "" - -#: src/filed/restore.c:1482 -#, c-format -msgid "Wrong write size error at %lld block=%d wanted=%d wrote=%d\n" -msgstr "" - -#: src/filed/restore.c:1486 -#, c-format -msgid "" -"Write write error at %lld block=%d write_len=%d lerror=%d on %s: ERR=%s\n" -msgstr "" - -#: src/filed/restore.c:1543 -msgid "Decryption error\n" -msgstr "" - -#: src/filed/restore.c:1627 -msgid "Logic error: output file should be open\n" -msgstr "" - -#: src/filed/restore.c:1663 -msgid "Logic error: output file should not be open\n" -msgstr "" - -#: src/filed/restore.c:1694 -#, c-format -msgid "Decryption error. buf_len=%d decrypt_len=%d on file %s\n" -msgstr "" - -#: src/filed/status.c:115 -#, c-format -msgid "%s %sVersion: %s (%s) %s %s %s %s\n" -msgstr "" - -#: src/filed/status.c:120 -#, c-format -msgid "Daemon started %s. Jobs: run=%d running=%d.\n" -msgstr "" - -#: src/filed/status.c:182 -#, c-format -msgid "" -" Sizes: boffset_t=%d size_t=%d debug=%s trace=%d mode=%d,%d bwlimit=%skB/s\n" -msgstr "" - -#: src/filed/status.c:239 -#, c-format -msgid "Director connected %sat: %s\n" -msgstr "" - -#: src/filed/status.c:243 -#, c-format -msgid "JobId %d Job %s is running.\n" -msgstr "" - -#: src/filed/status.c:246 -#, c-format -msgid " %s%s %s Job started: %s\n" -msgstr "" - -#: src/filed/status.c:274 -#, c-format -msgid "" -" Files=%s Bytes=%s AveBytes/sec=%s LastBytes/sec=%s Errors=%d\n" -" Bwlimit=%s ReadBytes=%s\n" -msgstr "" - -#: src/filed/status.c:285 -#, c-format -msgid " Files: Restored=%s Expected=%s Completed=%d%%\n" -msgstr "" - -#: src/filed/status.c:290 -#, c-format -msgid " Files: Examined=%s Backed up=%s\n" -msgstr "" - -#: src/filed/status.c:303 -#, c-format -msgid " Processing file: %s\n" -msgstr "" - -#: src/filed/status.c:315 -msgid " SDSocket closed.\n" -msgstr "" - -#: src/filed/status.c:325 -msgid "====\n" -msgstr "" - -#: src/filed/status.c:458 src/filed/status.c:492 -#, c-format -msgid "Bad .status command: %s\n" -msgstr "" - -#: src/filed/status.c:459 -msgid "2900 Bad .status command, missing argument.\n" -msgstr "" - -#: src/filed/status.c:493 -msgid "2900 Bad .status command, wrong argument.\n" -msgstr "" - -#: src/filed/verify.c:40 -#, c-format -msgid "Cannot malloc %d network read buffer\n" -msgstr "" - -#: src/filed/verify.c:110 -#, c-format -msgid " Could not access %s: ERR=%s\n" -msgstr "" - -#: src/filed/verify.c:117 -#, c-format -msgid " Could not follow link %s: ERR=%s\n" -msgstr "" - -#: src/filed/verify.c:124 -#, c-format -msgid " Could not stat %s: ERR=%s\n" -msgstr "" - -#: src/filed/verify.c:133 -#, c-format -msgid " Archive file skipped: %s\n" -msgstr "" - -#: src/filed/verify.c:136 -#, c-format -msgid " Recursion turned off. Directory skipped: %s\n" -msgstr "" - -#: src/filed/verify.c:140 -#, c-format -msgid " File system change prohibited. Directory skipped: %s\n" -msgstr "" - -#: src/filed/verify.c:148 -#, c-format -msgid " Could not open directory %s: ERR=%s\n" -msgstr "" - -#: src/filed/verify.c:153 -#, c-format -msgid " Unknown file type %d: %s\n" -msgstr "" - -#: src/filed/verify.c:197 src/filed/verify_vol.c:205 -#, c-format -msgid "Network error in send to Director: ERR=%s\n" -msgstr "" - -#: src/filed/verify.c:291 -#, c-format -msgid " Cannot open %s: ERR=%s.\n" -msgstr "" - -#: src/filed/verify.c:305 -#, c-format -msgid " Cannot open resource fork for %s: ERR=%s.\n" -msgstr "" - -#: src/filed/verify.c:367 -#, c-format -msgid "Error reading file %s: ERR=%s\n" -msgstr "" - -#: src/filed/verify_vol.c:52 -msgid "Storage command not issued before Verify.\n" -msgstr "" - -#: src/filed/verify_vol.c:142 -#, c-format -msgid "Error scanning record header: %s\n" -msgstr "" - -#: src/filed/win_efs.c:106 -#, c-format -msgid "Restore data %ld bytes too long for Microsoft buffer %ld bytes.\n" -msgstr "" - -#: src/filed/win_efs.c:192 -#, c-format -msgid "Restore data %ld bytes too long for Microsoft buffer %lld bytes.\n" -msgstr "" - -#: src/filed/win_efs.c:227 -#, c-format -msgid "WriteEncryptedFileRaw failure: ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:235 -#, c-format -msgid "Illegal xattr stream, no XATTR_MAGIC on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:249 -#, c-format -msgid "Illegal xattr stream, xattr name length <= 0 on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:371 src/filed/xattr.c:407 -#, c-format -msgid "llistea error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:457 src/filed/xattr.c:511 -#, c-format -msgid "lgetea error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:547 src/filed/xattr.c:869 src/filed/xattr.c:1344 -#: src/filed/xattr.c:1812 src/filed/xattr.c:2169 src/filed/xattr.c:2961 -#, c-format -msgid "Xattr stream on file \"%s\" exceeds maximum size of %d bytes\n" -msgstr "" - -#: src/filed/xattr.c:567 src/filed/xattr.c:895 src/filed/xattr.c:1364 -#: src/filed/xattr.c:1842 src/filed/xattr.c:2186 -#, c-format -msgid "Failed to serialize extended attributes on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:634 -#, c-format -msgid "lsetea error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:722 src/filed/xattr.c:760 src/filed/xattr.c:824 -#: src/filed/xattr.c:836 -#, c-format -msgid "attr_list error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:960 -#, c-format -msgid "Received illegal xattr named %s on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:993 src/filed/xattr.c:1003 -#, c-format -msgid "attr_set error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:1153 src/filed/xattr.c:1188 -#, c-format -msgid "llistxattr error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:1256 src/filed/xattr.c:1308 -#, c-format -msgid "lgetxattr error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:1427 -#, c-format -msgid "lsetxattr error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:1585 src/filed/xattr.c:1620 -#, c-format -msgid "extattr_list_link error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:1640 -#, c-format -msgid "Failed to convert %d into namespace on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:1720 src/filed/xattr.c:1775 -#, c-format -msgid "extattr_get_link error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:1899 -#, c-format -msgid "Failed to split %s into namespace and name part on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:1912 -#, c-format -msgid "Failed to convert %s into namespace on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:1933 -#, c-format -msgid "extattr_set_link error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:2036 src/filed/xattr.c:2061 -#, c-format -msgid "getproplist error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:2255 -#, c-format -msgid "Unable create proper proplist to restore xattrs on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:2284 -#, c-format -msgid "setproplist error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:2602 src/filed/xattr.c:2655 -#, c-format -msgid "Unable to get acl on xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:2672 -#, c-format -msgid "Unable to get acl text on xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:2746 -#, c-format -msgid "Unable to get status on xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:2879 -#, c-format -msgid "Unable to open xattr %s on \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:2902 -#, c-format -msgid "Unable to read symlin %s on \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:2977 -#, c-format -msgid "Unable to read content of xattr %s on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:3017 -#, c-format -msgid "Unable to chdir to xattr space of file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3074 src/filed/xattr.c:3323 -#, c-format -msgid "Unable to open file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3102 src/filed/xattr.c:3384 -#, c-format -msgid "Unable to open xattr space %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3118 src/filed/xattr.c:3348 -#, c-format -msgid "Unable to chdir to xattr space on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3139 -#, c-format -msgid "Unable to list the xattr space on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3231 -#, c-format -msgid "Unable to convert acl from text on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:3241 src/filed/xattr.c:3264 -#, c-format -msgid "Unable to restore acl of xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3337 -#, c-format -msgid "Unable to open xattr space on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3367 src/filed/xattr.c:3529 -#, c-format -msgid "Unable to open xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3401 -#, c-format -msgid "Unable to chdir to xattr space %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3441 -#, c-format -msgid "Unable to mkfifo xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3459 -#, c-format -msgid "Unable to mknod xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3477 -#, c-format -msgid "Unable to mkdir xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3497 -#, c-format -msgid "Unable to link xattr %s to %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3550 -#, c-format -msgid "" -"Unable to restore data of xattr %s on file \"%s\": Not all data available in " -"xattr stream\n" -msgstr "" - -#: src/filed/xattr.c:3563 -#, c-format -msgid "Unable to restore data of xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3586 -#, c-format -msgid "Unable to symlink xattr %s to %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3622 -#, c-format -msgid "Unable to restore owner of xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3650 -#, c-format -msgid "Unable to restore filetimes of xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3666 -#, c-format -msgid "Illegal xattr stream, failed to parse xattr stream on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:3727 -#, c-format -msgid "Failed to restore extensible attributes on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:3740 -#, c-format -msgid "Failed to restore extended attributes on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:3909 -#, c-format -msgid "" -"Can't restore Extended Attributes of %s - incompatible xattr stream " -"encountered - %d\n" -msgstr "" - -#: src/findlib/attribs.c:94 src/findlib/attribs.c:131 -#: src/findlib/attribs.c:613 -#, c-format -msgid "Unable to set file owner %s: ERR=%s\n" -msgstr "" - -#: src/findlib/attribs.c:105 src/findlib/attribs.c:137 -#, c-format -msgid "Unable to set file modes %s: ERR=%s\n" -msgstr "" - -#: src/findlib/attribs.c:124 src/findlib/attribs.c:149 -#, c-format -msgid "Unable to set file times %s: ERR=%s\n" -msgstr "" - -#: src/findlib/attribs.c:590 -#, c-format -msgid "File size of restored file %s not correct. Original %s, restored %s.\n" -msgstr "" - -#: src/findlib/attribs.c:633 -#, c-format -msgid "Unable to set file flags %s: ERR=%s\n" -msgstr "" - -#: src/findlib/attribs.c:920 -#, c-format -msgid "Error in %s file %s: ERR=%s\n" -msgstr "" - -#: src/findlib/attribs.c:942 -#, c-format -msgid "Error in %s: ERR=%s\n" -msgstr "" - -#: src/findlib/bfile.c:86 -msgid "Unix attributes" -msgstr "" - -#: src/findlib/bfile.c:88 -msgid "File data" -msgstr "" - -#: src/findlib/bfile.c:90 -msgid "MD5 digest" -msgstr "" - -#: src/findlib/bfile.c:92 -msgid "GZIP data" -msgstr "" - -#: src/findlib/bfile.c:94 -msgid "Compressed data" -msgstr "" - -#: src/findlib/bfile.c:96 -msgid "Extended attributes" -msgstr "" - -#: src/findlib/bfile.c:98 -msgid "Sparse data" -msgstr "" - -#: src/findlib/bfile.c:100 -msgid "GZIP sparse data" -msgstr "" - -#: src/findlib/bfile.c:102 -msgid "Compressed sparse data" -msgstr "" - -#: src/findlib/bfile.c:104 -msgid "Program names" -msgstr "" - -#: src/findlib/bfile.c:106 -msgid "Program data" -msgstr "" - -#: src/findlib/bfile.c:108 -msgid "SHA1 digest" -msgstr "" - -#: src/findlib/bfile.c:110 -msgid "Win32 data" -msgstr "" - -#: src/findlib/bfile.c:112 -msgid "Win32 GZIP data" -msgstr "" - -#: src/findlib/bfile.c:114 -msgid "Win32 compressed data" -msgstr "" - -#: src/findlib/bfile.c:116 -msgid "MacOS Fork data" -msgstr "" - -#: src/findlib/bfile.c:118 -msgid "HFS+ attribs" -msgstr "" - -#: src/findlib/bfile.c:120 -msgid "Standard Unix ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:122 -msgid "Default Unix ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:124 -msgid "SHA256 digest" -msgstr "" - -#: src/findlib/bfile.c:126 -msgid "SHA512 digest" -msgstr "" - -#: src/findlib/bfile.c:128 -msgid "Signed digest" -msgstr "" - -#: src/findlib/bfile.c:130 -msgid "Encrypted File data" -msgstr "" - -#: src/findlib/bfile.c:132 -msgid "Encrypted Win32 data" -msgstr "" - -#: src/findlib/bfile.c:134 -msgid "Encrypted session data" -msgstr "" - -#: src/findlib/bfile.c:136 -msgid "Encrypted GZIP data" -msgstr "" - -#: src/findlib/bfile.c:138 -msgid "Encrypted compressed data" -msgstr "" - -#: src/findlib/bfile.c:140 -msgid "Encrypted Win32 GZIP data" -msgstr "" - -#: src/findlib/bfile.c:142 -msgid "Encrypted Win32 Compressed data" -msgstr "" - -#: src/findlib/bfile.c:144 -msgid "Encrypted MacOS fork data" -msgstr "" - -#: src/findlib/bfile.c:146 -msgid "Plugin Name" -msgstr "" - -#: src/findlib/bfile.c:148 -msgid "Plugin Data" -msgstr "" - -#: src/findlib/bfile.c:150 -msgid "Restore Object" -msgstr "" - -#: src/findlib/bfile.c:152 -msgid "AIX ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:154 -msgid "Darwin ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:156 -msgid "FreeBSD Default ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:158 -msgid "FreeBSD Access ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:160 -msgid "HPUX ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:162 -msgid "Irix Default ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:164 -msgid "Irix Access ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:166 -msgid "Linux Default ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:168 -msgid "Linux Access ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:170 -msgid "TRU64 Default ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:172 -msgid "TRU64 Access ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:174 -msgid "Solaris POSIX ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:176 -msgid "Solaris NFSv4/ZFS ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:178 -msgid "AFS ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:180 -msgid "AIX POSIX ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:182 -msgid "AIX NFSv4 ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:184 -msgid "FreeBSD NFSv4/ZFS ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:186 -msgid "GNU Hurd Default ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:188 -msgid "GNU Hurd Access ACL attribs" -msgstr "" - -#: src/findlib/bfile.c:190 -msgid "GNU Hurd Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:192 -msgid "IRIX Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:194 -msgid "TRU64 Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:196 -msgid "AIX Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:198 -msgid "OpenBSD Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:200 -msgid "Solaris Extensible attribs or System Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:202 -msgid "Solaris Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:204 -msgid "Darwin Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:206 -msgid "FreeBSD Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:208 -msgid "Linux Extended attribs" -msgstr "" - -#: src/findlib/bfile.c:210 -msgid "NetBSD Extended attribs" -msgstr "" - -#: src/findlib/create_file.c:118 -#, c-format -msgid "File skipped. Not newer: %s\n" -msgstr "" - -#: src/findlib/create_file.c:125 -#, c-format -msgid "File skipped. Not older: %s\n" -msgstr "" - -#: src/findlib/create_file.c:135 -#, c-format -msgid "File skipped. Already exists: %s\n" -msgstr "" - -#: src/findlib/create_file.c:161 -#, c-format -msgid "File %s already exists and could not be replaced. ERR=%s.\n" -msgstr "" - -#: src/findlib/create_file.c:212 src/findlib/create_file.c:276 -#: src/findlib/create_file.c:371 -#, c-format -msgid "bpkt already open fid=%d\n" -msgstr "" - -#: src/findlib/create_file.c:235 -#, c-format -msgid "Cannot make fifo %s: ERR=%s\n" -msgstr "" - -#: src/findlib/create_file.c:253 -#, c-format -msgid "Cannot make node %s: ERR=%s\n" -msgstr "" - -#: src/findlib/create_file.c:299 -#, c-format -msgid "Could not symlink %s -> %s: ERR=%s\n" -msgstr "" - -#: src/findlib/create_file.c:322 src/findlib/create_file.c:335 -#, c-format -msgid "Could not restore file flags for file %s: ERR=%s\n" -msgstr "" - -#: src/findlib/create_file.c:326 src/findlib/create_file.c:343 -#, c-format -msgid "Could not hard link %s -> %s: ERR=%s\n" -msgstr "" - -#: src/findlib/create_file.c:339 -#, c-format -msgid "Could not reset file flags for file %s: ERR=%s\n" -msgstr "" - -#: src/findlib/create_file.c:395 -#, c-format -msgid "Original file %s have been deleted: type=%d\n" -msgstr "" - -#: src/findlib/create_file.c:407 -#, c-format -msgid "Original file %s not saved: type=%d\n" -msgstr "" - -#: src/findlib/create_file.c:410 -#, c-format -msgid "Unknown file type %d; not restored: %s\n" -msgstr "" - -#: src/findlib/create_file.c:455 -#, c-format -msgid "Zero length filename: %s\n" -msgstr "" - -#: src/findlib/enable_priv.c:81 -msgid "AdjustTokenPrivileges set " -msgstr "" - -#: src/findlib/find.c:185 -#, c-format -msgid "Plugin: \"%s\" not found.\n" -msgstr "" - -#: src/findlib/find_one.c:223 -#, c-format -msgid " NODUMP flag set - will not process %s\n" -msgstr "" - -#: src/findlib/find_one.c:244 -#, c-format -msgid "Cannot stat file %s: ERR=%s\n" -msgstr "" - -#: src/findlib/find_one.c:249 -#, c-format -msgid "%s mtime changed during backup.\n" -msgstr "" - -#: src/findlib/find_one.c:256 -#, c-format -msgid "%s ctime changed during backup.\n" -msgstr "" - -#: src/findlib/find_one.c:263 -#, c-format -msgid "%s size of %lld changed during backup to %lld.n" -msgstr "" - -#: src/findlib/find_one.c:391 -#, c-format -msgid "Top level directory \"%s\" has unlisted fstype \"%s\"\n" -msgstr "" - -#: src/findlib/find_one.c:406 -#, c-format -msgid "Top level directory \"%s\" has an unlisted drive type \"%s\"\n" -msgstr "" - -#: src/findlib/mkpath.c:137 src/stored/dedupengine.c:250 -#, c-format -msgid "Cannot create directory %s: ERR=%s\n" -msgstr "" - -#: src/findlib/mkpath.c:141 src/findlib/mkpath.c:217 -#: src/stored/dedupengine.c:254 -#, c-format -msgid "%s exists but is not a directory.\n" -msgstr "" - -#: src/findlib/mkpath.c:153 -#, c-format -msgid "Security problem!! We created directory %s, but it is a link.\n" -msgstr "" - -#: src/findlib/mkpath.c:179 -#, c-format -msgid "Cannot change owner and/or group of %s: ERR=%s\n" -msgstr "" - -#: src/findlib/mkpath.c:184 -#, c-format -msgid "Cannot change permissions of %s: ERR=%s\n" -msgstr "" - -#: src/findlib/mkpath.c:254 -#, c-format -msgid "%c: is not a valid drive.\n" -msgstr "" - -#: src/findlib/mkpath.c:298 -msgid "Too many subdirectories. Some permissions not reset.\n" -msgstr "" - -#: src/findlib/savecwd.c:49 -#, c-format -msgid "Cannot open current directory: ERR=%s\n" -msgstr "" - -#: src/findlib/savecwd.c:60 -#, c-format -msgid "Cannot get current directory: ERR=%s\n" -msgstr "" - -#: src/findlib/savecwd.c:84 src/findlib/savecwd.c:95 -#, c-format -msgid "Cannot reset current directory: ERR=%s\n" -msgstr "" - -#: src/lib/address_conf.c:51 -#, c-format -msgid "Only ipv4 and ipv6 are supported (%d)\n" -msgstr "" - -#: src/lib/address_conf.c:55 -#, c-format -msgid "Only ipv4 is supported (%d)\n" -msgstr "" - -#: src/lib/address_conf.c:178 -#, c-format -msgid "You tried to assign a ipv6 address to an ipv4(%d)\n" -msgstr "" - -#: src/lib/address_conf.c:187 -#, c-format -msgid "You tried to assign an ipv4 address to an ipv6(%d)\n" -msgstr "" - -#: src/lib/address_conf.c:270 -#, c-format -msgid "Can't add default IPv4 address (%s)\n" -msgstr "" - -#: src/lib/address_conf.c:301 -msgid "" -"Old style addresses cannot be mixed with new style. Try removing Port=nnn." -msgstr "" - -#: src/lib/address_conf.c:323 -#, c-format -msgid "Cannot resolve service(%s)" -msgstr "" - -#: src/lib/address_conf.c:333 -#, c-format -msgid "Cannot resolve hostname(%s) %s" -msgstr "" - -#: src/lib/address_conf.c:441 src/lib/address_conf.c:474 -#, c-format -msgid "Expected a block to begin with { but got: %s" -msgstr "" - -#: src/lib/address_conf.c:446 -msgid "Empty addr block is not allowed" -msgstr "" - -#: src/lib/address_conf.c:450 -#, c-format -msgid "Expected a string but got: %s" -msgstr "" - -#: src/lib/address_conf.c:461 -#, c-format -msgid "Expected a string [ip|ipv4|ipv6] but got: %s" -msgstr "" - -#: src/lib/address_conf.c:465 -#, c-format -msgid "Expected a string [ip|ipv4] but got: %s" -msgstr "" - -#: src/lib/address_conf.c:470 -#, c-format -msgid "Expected an equal = but got: %s" -msgstr "" - -#: src/lib/address_conf.c:481 -#, c-format -msgid "Expected an identifier [addr|port] but got: %s" -msgstr "" - -#: src/lib/address_conf.c:486 -msgid "Only one port per address block" -msgstr "" - -#: src/lib/address_conf.c:492 -msgid "Only one addr per address block" -msgstr "" - -#: src/lib/address_conf.c:496 -#, c-format -msgid "Expected a identifier [addr|port] but got: %s" -msgstr "" - -#: src/lib/address_conf.c:500 -#, c-format -msgid "Expected a equal =, got: %s" -msgstr "" - -#: src/lib/address_conf.c:508 -#, c-format -msgid "Expected a number or a string but got: %s" -msgstr "" - -#: src/lib/address_conf.c:514 -#, c-format -msgid "Expected an IP number or a hostname but got: %s" -msgstr "" - -#: src/lib/address_conf.c:520 -msgid "State machine missmatch" -msgstr "" - -#: src/lib/address_conf.c:526 -#, c-format -msgid "Expected a end of block with } but got: %s" -msgstr "" - -#: src/lib/address_conf.c:532 -#, c-format -msgid "Cannot add hostname(%s) and port(%s) to addrlist (%s)" -msgstr "" - -#: src/lib/address_conf.c:538 -#, c-format -msgid "Expected an end of block with } but got: %s" -msgstr "" - -#: src/lib/address_conf.c:547 -#, c-format -msgid "Expected an IP number or a hostname, got: %s" -msgstr "" - -#: src/lib/address_conf.c:552 src/lib/address_conf.c:566 -#, c-format -msgid "Cannot add port (%s) to (%s)" -msgstr "" - -#: src/lib/address_conf.c:561 -#, c-format -msgid "Expected a port number or string, got: %s" -msgstr "" - -#: src/lib/attr.c:70 -#, c-format -msgid "Error scanning attributes: %s\n" -msgstr "" - -#: src/lib/berrno.c:52 -msgid "Child exited normally." -msgstr "" - -#: src/lib/berrno.c:59 -msgid "Unknown error during program execvp" -msgstr "" - -#: src/lib/berrno.c:62 -#, c-format -msgid "Child exited with code %d" -msgstr "" - -#: src/lib/berrno.c:70 -#, c-format -msgid "Child died from signal %d: %s" -msgstr "" - -#: src/lib/berrno.c:76 -msgid "Invalid errno. No error message possible." -msgstr "" - -#: src/lib/bget_msg.c:90 -msgid "Status OK\n" -msgstr "" - -#: src/lib/bget_msg.c:94 -#, c-format -msgid "bget_msg: unknown signal %d\n" -msgstr "" - -#: src/lib/bnet.c:130 -#, c-format -msgid "Attr spool write error. wrote=%d wanted=%d bytes. ERR=%s\n" -msgstr "" - -#: src/lib/bnet.c:215 src/lib/bnet.c:256 -msgid "TLS connection initialization failed.\n" -msgstr "" - -#: src/lib/bnet.c:223 -msgid "TLS Negotiation failed.\n" -msgstr "" - -#: src/lib/bnet.c:229 src/lib/bnet.c:271 -msgid "" -"TLS certificate verification failed. Peer certificate did not match a " -"required commonName\n" -msgstr "" - -#: src/lib/bnet.c:280 -#, c-format -msgid "" -"TLS host certificate verification failed. Host name \"%s\" did not match " -"presented certificate\n" -msgstr "" - -#: src/lib/bnet.c:297 -msgid "TLS enabled but not configured.\n" -msgstr "" - -#: src/lib/bnet.c:303 -msgid "TLS enable but not configured.\n" -msgstr "" - -#: src/lib/bnet.c:400 -msgid "No problem." -msgstr "" - -#: src/lib/bnet.c:403 -msgid "Authoritative answer for host not found." -msgstr "" - -#: src/lib/bnet.c:406 -msgid "Non-authoritative for host not found, or ServerFail." -msgstr "" - -#: src/lib/bnet.c:409 -msgid "Non-recoverable errors, FORMERR, REFUSED, or NOTIMP." -msgstr "" - -#: src/lib/bnet.c:412 -msgid "Valid name, no data record of resquested type." -msgstr "" - -#: src/lib/bnet.c:415 -msgid "Unknown error." -msgstr "" - -#: src/lib/bnet.c:557 -#, c-format -msgid "Unknown sig %d" -msgstr "" - -#: src/lib/bnet_server.c:99 -#, c-format -msgid "Cannot open stream socket. ERR=%s. Current %s All %s\n" -msgstr "" - -#: src/lib/bnet_server.c:112 -#, c-format -msgid "Cannot set SO_REUSEADDR on socket: %s\n" -msgstr "" - -#: src/lib/bnet_server.c:121 -#, c-format -msgid "Cannot bind port %d: ERR=%s: Retrying ...\n" -msgstr "" - -#: src/lib/bnet_server.c:129 src/lib/bnet_server.c:137 -#, c-format -msgid "Cannot bind port %d: ERR=%s.\n" -msgstr "" - -#: src/lib/bnet_server.c:144 -msgid "No addr/port found to listen on.\n" -msgstr "" - -#: src/lib/bnet_server.c:150 -#, c-format -msgid "Could not init client queue: ERR=%s\n" -msgstr "" - -#: src/lib/bnet_server.c:169 -#, c-format -msgid "Error in select: %s\n" -msgstr "" - -#: src/lib/bnet_server.c:192 -#, c-format -msgid "Connection from %s:%d refused by hosts.access\n" -msgstr "" - -#: src/lib/bnet_server.c:208 src/lib/bsock.c:363 src/lib/bsock.c:402 -#, c-format -msgid "Cannot set SO_KEEPALIVE on socket: %s\n" -msgstr "" - -#: src/lib/bnet_server.c:220 -msgid "Could not create client BSOCK.\n" -msgstr "" - -#: src/lib/bnet_server.c:227 -#, c-format -msgid "Could not add job to client queue: ERR=%s\n" -msgstr "" - -#: src/lib/bnet_server.c:244 -#, c-format -msgid "Could not destroy client queue: ERR=%s\n" -msgstr "" - -#: src/lib/bpipe.c:373 src/lib/bpipe.c:456 -msgid "Program killed by Bacula (timeout)\n" -msgstr "" - -#: src/lib/bsock.c:221 -#, c-format -msgid "" -"Could not connect to %s on %s:%d. ERR=%s\n" -"Retrying ...\n" -msgstr "" - -#: src/lib/bsock.c:227 -#, c-format -msgid "Unable to connect to %s on %s:%d. ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:303 -#, c-format -msgid "gethostbyname() for host \"%s\" failed: ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:334 src/lib/bsock.c:336 -#, c-format -msgid "Socket open error. proto=%d port=%d. ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:349 src/lib/bsock.c:351 -#, c-format -msgid "Source address bind error. proto=%d. ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:371 -#, c-format -msgid "Cannot set TCP_KEEPIDLE on socket: %s\n" -msgstr "" - -#: src/lib/bsock.c:438 -#, c-format -msgid "Could not init bsock read mutex. ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:444 -#, c-format -msgid "Could not init bsock write mutex. ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:594 -msgid "Socket is closed\n" -msgstr "" - -#: src/lib/bsock.c:600 -#, c-format -msgid "Socket has errors=%d on call to %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:607 -#, c-format -msgid "Socket is terminated=%d on call to %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:616 -#, c-format -msgid "Socket has insane msglen=%d on call to %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:626 -#, c-format -msgid "Flowcontrol failure on %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:711 -#, c-format -msgid "Write error sending %d bytes to %s:%s:%d: ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:717 -#, c-format -msgid "Wrote %d bytes to %s:%s:%d, but only %d accepted.\n" -msgstr "" - -#: src/lib/bsock.c:818 src/lib/bsock.c:846 src/lib/bsock.c:920 -#: src/lib/bsock.c:963 -#, c-format -msgid "Read expected %d got %d from %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:879 -#, c-format -msgid "Packet size=%d too big from \"%s:%s:%d. Terminating connection.\n" -msgstr "" - -#: src/lib/bsock.c:909 -#, c-format -msgid "Read error from %s:%s:%d: ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:1041 -#, c-format -msgid "fread attr spool error. Wanted=%d got=%d bytes. ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:1059 -msgid "fread attr spool I/O error.\n" -msgstr "" - -#: src/lib/bsock.c:1120 -msgid "Could not malloc BSOCK data buffer\n" -msgstr "" - -#: src/lib/bsock.c:1138 src/lib/bsock.c:1157 -#, c-format -msgid "sockopt error: %s\n" -msgstr "" - -#: src/lib/bsock.c:1144 src/lib/bsock.c:1163 -#, c-format -msgid "Warning network buffer = %d bytes not max size.\n" -msgstr "" - -#: src/lib/bsock.c:1183 src/lib/bsock.c:1217 -#, c-format -msgid "fcntl F_GETFL error. ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:1189 src/lib/bsock.c:1223 src/lib/bsock.c:1255 -#, c-format -msgid "fcntl F_SETFL error. ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:1470 -#, c-format -msgid "Director authorization error at \"%s:%d\"\n" -msgstr "" - -#: src/lib/bsock.c:1477 -#, c-format -msgid "" -"Authorization error: Remote server at \"%s:%d\" did not advertise required " -"TLS support.\n" -msgstr "" - -#: src/lib/bsock.c:1485 -#, c-format -msgid "" -"Authorization error with Director at \"%s:%d\": Remote server requires TLS.\n" -msgstr "" - -#: src/lib/bsock.c:1497 src/qt-console/bcomm/dircomm_auth.cpp:134 -#, c-format -msgid "TLS negotiation failed with Director at \"%s:%d\"\n" -msgstr "" - -#: src/lib/bsock.c:1507 -#, c-format -msgid "" -"Bad errmsg to Hello command: ERR=%s\n" -"The Director at \"%s:%d\" may not be running.\n" -msgstr "" - -#: src/lib/bsock.c:1516 src/qt-console/bcomm/dircomm_auth.cpp:155 -#, c-format -msgid "Director at \"%s:%d\" rejected Hello command\n" -msgstr "" - -#: src/lib/bsock.c:1526 -#, c-format -msgid "" -"Authorization error with Director at \"%s:%d\"\n" -"Most likely the passwords do not agree.\n" -"If you are using TLS, there may have been a certificate validation error " -"during the TLS handshake.\n" -"For help, please see: " -msgstr "" - -#: src/lib/bsys.c:142 -#, c-format -msgid "safe_unlink could not compile regex pattern \"%s\" ERR=%s\n" -msgstr "" - -#: src/lib/bsys.c:342 src/lib/bsys.c:359 src/lib/bsys.c:383 src/lib/bsys.c:396 -#, c-format -msgid "Out of memory: ERR=%s\n" -msgstr "" - -#: src/lib/bsys.c:438 -msgid "Buffer overflow.\n" -msgstr "" - -#: src/lib/bsys.c:504 -msgid "Bad errno" -msgstr "" - -#: src/lib/bsys.c:519 -#, c-format -msgid "Memset for %d bytes at %s:%d\n" -msgstr "" - -#: src/lib/bsys.c:568 -#, c-format -msgid "Cannot open %s file. %s ERR=%s\n" -msgstr "" - -#: src/lib/bsys.c:585 src/lib/bsys.c:621 -#, c-format -msgid "" -"%s is already running. pid=%d\n" -"Check file %s\n" -msgstr "" - -#: src/lib/bsys.c:601 -#, c-format -msgid "Could not open %s file. %s ERR=%s\n" -msgstr "" - -#: src/lib/bsys.c:624 -#, c-format -msgid "Cannot lock %s file. %s ERR=%s\n" -msgstr "" - -#: src/lib/bsys.c:637 -#, c-format -msgid "Cannot not open %s file. %s ERR=%s\n" -msgstr "" - -#: src/lib/bsys.c:769 -#, c-format -msgid "Could not create state file. %s ERR=%s\n" -msgstr "" - -#: src/lib/bsys.c:788 -#, c-format -msgid "Write final hdr error: ERR=%s\n" -msgstr "" - -#: src/lib/btimers.c:254 -msgid "stop_btimer called with NULL btimer_id\n" -msgstr "" - -#: src/lib/cram-md5.c:106 src/lib/cram-md5.c:138 -msgid "1999 Authorization failed.\n" -msgstr "" - -#: src/lib/crypto.c:428 -msgid "Unable to open certificate file" -msgstr "" - -#: src/lib/crypto.c:435 -msgid "Unable to read certificate from file" -msgstr "" - -#: src/lib/crypto.c:441 -msgid "Unable to extract public key from certificate" -msgstr "" - -#: src/lib/crypto.c:448 -msgid "" -"Provided certificate does not include the required subjectKeyIdentifier " -"extension." -msgstr "" - -#: src/lib/crypto.c:455 -#, c-format -msgid "Unsupported key type provided: %d\n" -msgstr "" - -#: src/lib/crypto.c:492 src/lib/crypto.c:540 -msgid "Unable to open private key file" -msgstr "" - -#: src/lib/crypto.c:522 src/lib/crypto.c:556 -msgid "Unable to read private key from file" -msgstr "" - -#: src/lib/crypto.c:615 -#, c-format -msgid "Unsupported digest type: %d\n" -msgstr "" - -#: src/lib/crypto.c:629 -msgid "OpenSSL digest initialization failed" -msgstr "" - -#: src/lib/crypto.c:643 -msgid "OpenSSL digest update failed" -msgstr "" - -#: src/lib/crypto.c:661 -msgid "OpenSSL digest finalize failed" -msgstr "" - -#: src/lib/crypto.c:759 -msgid "OpenSSL digest_new failed" -msgstr "" - -#: src/lib/crypto.c:765 -msgid "OpenSSL sign get digest failed" -msgstr "" - -#: src/lib/crypto.c:804 src/lib/crypto.c:808 -msgid "OpenSSL digest Verify final failed" -msgstr "" - -#: src/lib/crypto.c:813 -msgid "No signers found for crypto verify.\n" -msgstr "" - -#: src/lib/crypto.c:874 -msgid "Signature creation failed" -msgstr "" - -#: src/lib/crypto.c:952 -msgid "Signature decoding failed" -msgstr "" - -#: src/lib/crypto.c:1029 -msgid "Unsupported cipher type specified\n" -msgstr "" - -#: src/lib/crypto.c:1178 -msgid "CryptoData decoding failed" -msgstr "" - -#: src/lib/crypto.c:1222 -msgid "Failure decrypting the session key" -msgstr "" - -#: src/lib/crypto.c:1273 -#, c-format -msgid "Unsupported contentEncryptionAlgorithm: %d\n" -msgstr "" - -#: src/lib/crypto.c:1283 src/lib/crypto.c:1289 -msgid "OpenSSL cipher context initialization failed" -msgstr "" - -#: src/lib/crypto.c:1296 -msgid "Encryption session provided an invalid symmetric key" -msgstr "" - -#: src/lib/crypto.c:1302 -msgid "Encryption session provided an invalid IV" -msgstr "" - -#: src/lib/crypto.c:1308 -msgid "OpenSSL cipher context key/IV initialization failed" -msgstr "" - -#: src/lib/crypto.c:1407 -#, c-format -msgid "Unsupported digest type=%d specified\n" -msgstr "" - -#: src/lib/crypto.c:1427 -#, c-format -msgid "SHA1Update() returned an error: %d\n" -msgstr "" - -#: src/lib/crypto.c:1566 -msgid "No error" -msgstr "" - -#: src/lib/crypto.c:1568 -msgid "Signer not found" -msgstr "" - -#: src/lib/crypto.c:1570 -msgid "Recipient not found" -msgstr "" - -#: src/lib/crypto.c:1572 -msgid "Unsupported digest algorithm" -msgstr "" - -#: src/lib/crypto.c:1574 -msgid "Unsupported encryption algorithm" -msgstr "" - -#: src/lib/crypto.c:1576 -msgid "Signature is invalid" -msgstr "" - -#: src/lib/crypto.c:1578 -msgid "Decryption error" -msgstr "" - -#: src/lib/crypto.c:1581 -msgid "Internal error" -msgstr "" - -#: src/lib/crypto.c:1583 -msgid "Unknown error" -msgstr "" - -#: src/lib/daemon.c:51 -#, c-format -msgid "Cannot fork to become daemon: ERR=%s\n" -msgstr "" - -#: src/lib/devlock.c:319 -msgid "writeunlock called too many times.\n" -msgstr "" - -#: src/lib/devlock.c:324 -msgid "writeunlock by non-owner.\n" -msgstr "" - -#: src/lib/devlock.c:490 src/lib/rwlock.c:427 -#, c-format -msgid "Thread %d found unchanged elements %d times\n" -msgstr "" - -#: src/lib/devlock.c:558 src/lib/rwlock.c:494 -#, c-format -msgid "%02d: interval %d, writes %d, reads %d\n" -msgstr "" - -#: src/lib/devlock.c:568 src/lib/rwlock.c:504 -#, c-format -msgid "data %02d: value %d, %d writes\n" -msgstr "" - -#: src/lib/devlock.c:573 src/lib/rwlock.c:509 -#, c-format -msgid "Total: %d thread writes, %d data writes\n" -msgstr "" - -#: src/lib/devlock.c:645 src/lib/rwlock.c:581 -msgid "Try write lock" -msgstr "" - -#: src/lib/devlock.c:651 src/lib/rwlock.c:587 -msgid "Try read lock" -msgstr "" - -#: src/lib/devlock.c:705 src/lib/rwlock.c:640 -msgid "Create thread" -msgstr "" - -#: src/lib/devlock.c:715 src/lib/rwlock.c:650 -msgid "Join thread" -msgstr "" - -#: src/lib/devlock.c:717 src/lib/rwlock.c:652 -#, c-format -msgid "%02d: interval %d, updates %d, r_collisions %d, w_collisions %d\n" -msgstr "" - -#: src/lib/devlock.c:729 src/lib/rwlock.c:664 -#, c-format -msgid "data %02d: value %d, %d updates\n" -msgstr "" - -#: src/lib/edit.c:491 -msgid "Empty name not allowed.\n" -msgstr "" - -#: src/lib/edit.c:501 -#, c-format -msgid "Illegal character \"%c\" in name.\n" -msgstr "" - -#: src/lib/edit.c:508 -msgid "Name too long.\n" -msgstr "" - -#: src/lib/ini.c:97 src/lib/ini.c:109 -#, c-format -msgid "" -"Config file error: %s\n" -" : Line %d, col %d of file %s\n" -"%s\n" -msgstr "" - -#: src/lib/ini.c:367 src/lib/ini.c:414 -#, c-format -msgid "Cannot open config file %s: %s\n" -msgstr "" - -#: src/lib/ini.c:382 -msgid "Cannot open lex\n" -msgstr "" - -#: src/lib/jcr.c:221 src/lib/util.c:438 -msgid "Backup" -msgstr "" - -#: src/lib/jcr.c:223 -msgid "Verifying" -msgstr "" - -#: src/lib/jcr.c:225 -msgid "Restoring" -msgstr "" - -#: src/lib/jcr.c:227 -msgid "Archiving" -msgstr "" - -#: src/lib/jcr.c:229 -msgid "Copying" -msgstr "" - -#: src/lib/jcr.c:231 -msgid "Migration" -msgstr "" - -#: src/lib/jcr.c:233 -msgid "Scanning" -msgstr "" - -#: src/lib/jcr.c:235 -msgid "Unknown operation" -msgstr "" - -#: src/lib/jcr.c:244 -msgid "backup" -msgstr "" - -#: src/lib/jcr.c:246 -msgid "verified" -msgstr "" - -#: src/lib/jcr.c:246 -msgid "verify" -msgstr "" - -#: src/lib/jcr.c:248 -msgid "restored" -msgstr "" - -#: src/lib/jcr.c:248 -msgid "restore" -msgstr "" - -#: src/lib/jcr.c:250 -msgid "archived" -msgstr "" - -#: src/lib/jcr.c:250 -msgid "archive" -msgstr "" - -#: src/lib/jcr.c:252 -msgid "copied" -msgstr "" - -#: src/lib/jcr.c:252 -msgid "copy" -msgstr "" - -#: src/lib/jcr.c:254 -msgid "migrated" -msgstr "" - -#: src/lib/jcr.c:254 -msgid "migrate" -msgstr "" - -#: src/lib/jcr.c:256 -msgid "scanned" -msgstr "" - -#: src/lib/jcr.c:256 -msgid "scan" -msgstr "" - -#: src/lib/jcr.c:258 -msgid "unknown action" -msgstr "" - -#: src/lib/jcr.c:310 src/lib/lockmgr.c:305 src/lib/lockmgr.c:780 -#: src/lib/lockmgr.c:808 -#, c-format -msgid "pthread key create failed: ERR=%s\n" -msgstr "" - -#: src/lib/jcr.c:331 -#, c-format -msgid "pthread_once failed. ERR=%s\n" -msgstr "" - -#: src/lib/jcr.c:340 -#, c-format -msgid "Could not init msg_queue mutex. ERR=%s\n" -msgstr "" - -#: src/lib/jcr.c:397 -msgid "NULL jcr.\n" -msgstr "" - -#: src/lib/jcr.c:606 -#, c-format -msgid "pthread_setspecific failed: ERR=%s\n" -msgstr "" - -#: src/lib/jcr.c:1097 -#, c-format -msgid "" -"Watchdog sending kill after %d secs to thread stalled reading Storage " -"daemon.\n" -msgstr "" - -#: src/lib/jcr.c:1109 -#, c-format -msgid "" -"Watchdog sending kill after %d secs to thread stalled reading File daemon.\n" -msgstr "" - -#: src/lib/jcr.c:1121 -#, c-format -msgid "" -"Watchdog sending kill after %d secs to thread stalled reading Director.\n" -msgstr "" - -#: src/lib/lex.c:81 -#, c-format -msgid "Problem probably begins at line %d.\n" -msgstr "" - -#: src/lib/lex.c:86 -#, c-format -msgid "" -"Config error: %s\n" -" : line %d, col %d of file %s\n" -"%s\n" -"%s" -msgstr "" - -#: src/lib/lex.c:90 -#, c-format -msgid "Config error: %s\n" -msgstr "" - -#: src/lib/lex.c:119 -msgid "Close of NULL file\n" -msgstr "" - -#: src/lib/lex.c:273 src/lib/xml.c:149 -msgid "" -"get_char: called after EOF. You may have a open double quote without the " -"closing double quote.\n" -msgstr "" - -#: src/lib/lex.c:333 src/lib/xml.c:192 src/lib/xml.c:205 -#, c-format -msgid "Config token too long, file: %s, line %d, begins at line %d\n" -msgstr "" - -#: src/lib/lex.c:357 -msgid "none" -msgstr "" - -#: src/lib/lex.c:358 -msgid "comment" -msgstr "" - -#: src/lib/lex.c:359 -msgid "number" -msgstr "" - -#: src/lib/lex.c:360 -msgid "ip_addr" -msgstr "" - -#: src/lib/lex.c:361 -msgid "identifier" -msgstr "" - -#: src/lib/lex.c:362 -msgid "string" -msgstr "" - -#: src/lib/lex.c:363 -msgid "quoted_string" -msgstr "" - -#: src/lib/lex.c:364 -msgid "include" -msgstr "" - -#: src/lib/lex.c:365 -msgid "include_quoted_string" -msgstr "" - -#: src/lib/lex.c:366 -msgid "UTF-8 Byte Order Mark" -msgstr "" - -#: src/lib/lex.c:367 -msgid "UTF-16le Byte Order Mark" -msgstr "" - -#: src/lib/lex.c:405 src/lib/lex.c:411 src/lib/lex.c:422 src/lib/lex.c:428 -#, c-format -msgid "expected a positive integer number, got: %s" -msgstr "" - -#: src/lib/lex.c:544 src/lib/xml.c:344 -msgid "" -"This config file appears to be in an unsupported Unicode format (UTF-16be). " -"Please resave as UTF-8\n" -msgstr "" - -#: src/lib/lex.c:690 src/lib/lex.c:718 -#, c-format -msgid "Cannot open included config file %s: %s\n" -msgstr "" - -#: src/lib/lex.c:777 src/lib/lex.c:834 -#, c-format -msgid "expected an integer or a range, got %s: %s" -msgstr "" - -#: src/lib/lex.c:791 src/lib/lex.c:799 src/lib/lex.c:810 src/lib/lex.c:818 -#, c-format -msgid "expected an integer number, got %s: %s" -msgstr "" - -#: src/lib/lex.c:848 -#, c-format -msgid "expected a name, got %s: %s" -msgstr "" - -#: src/lib/lex.c:852 -#, c-format -msgid "name %s length %d too long, max is %d\n" -msgstr "" - -#: src/lib/lex.c:860 -#, c-format -msgid "expected a string, got %s: %s" -msgstr "" - -#: src/lib/lockmgr.c:54 -#, c-format -msgid "ASSERT failed at %s:%i: %s\n" -msgstr "" - -#: src/lib/lockmgr.c:59 -#, c-format -msgid "ASSERT failed at %s:%i: %s \n" -msgstr "" - -#: src/lib/lockmgr.c:65 -#, c-format -msgid "ASSERT failed at %s:%i: %s (%s)\n" -msgstr "" - -#: src/lib/lockmgr.c:96 -#, c-format -msgid "Mutex lock failure. ERR=%s\n" -msgstr "" - -#: src/lib/lockmgr.c:106 -#, c-format -msgid "Mutex unlock failure. ERR=%s\n" -msgstr "" - -#: src/lib/lockmgr.c:792 -#, c-format -msgid "pthread_create failed: ERR=%s\n" -msgstr "" - -#: src/lib/mem_pool.c:103 -#, c-format -msgid "MemPool index %d larger than max %d\n" -msgstr "" - -#: src/lib/mem_pool.c:121 src/lib/mem_pool.c:141 src/lib/mem_pool.c:177 -#: src/lib/mem_pool.c:250 src/lib/mem_pool.c:270 src/lib/mem_pool.c:305 -#: src/lib/mem_pool.c:616 -#, c-format -msgid "Out of memory requesting %d bytes\n" -msgstr "" - -#: src/lib/mem_pool.c:158 -msgid "obuf is NULL\n" -msgstr "" - -#: src/lib/message.c:418 src/lib/message.c:428 -#, c-format -msgid "Could not open console message file %s: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:433 -#, c-format -msgid "Could not get con mutex: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:538 -msgid "Bacula Message" -msgstr "" - -#: src/lib/message.c:542 -#, c-format -msgid "open mail pipe %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:633 -msgid "open mail pipe failed.\n" -msgstr "" - -#: src/lib/message.c:646 -#, c-format -msgid "close error: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:657 -#, c-format -msgid "Mail prog: %s" -msgstr "" - -#: src/lib/message.c:666 -#, c-format -msgid "" -"Mail program terminated in error.\n" -"CMD=%s\n" -"ERR=%s\n" -msgstr "" - -#: src/lib/message.c:773 -#, c-format -msgid "fopen %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:895 src/lib/message.c:898 -msgid "Msg delivery error: Unable to store data in database.\n" -msgstr "" - -#: src/lib/message.c:950 -#, c-format -msgid "" -"Msg delivery error: Operator mail program terminated in error.\n" -"CMD=%s\n" -"ERR=%s\n" -msgstr "" - -#: src/lib/message.c:971 -#, c-format -msgid "Msg delivery error: fopen %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:1318 -#, c-format -msgid "%s: ABORTING due to ERROR in %s:%d\n" -msgstr "" - -#: src/lib/message.c:1322 -#, c-format -msgid "%s: ERROR TERMINATION at %s:%d\n" -msgstr "" - -#: src/lib/message.c:1327 -#, c-format -msgid "%s: Fatal Error because: " -msgstr "" - -#: src/lib/message.c:1329 -#, c-format -msgid "%s: Fatal Error at %s:%d because:\n" -msgstr "" - -#: src/lib/message.c:1333 -#, c-format -msgid "%s: ERROR: " -msgstr "" - -#: src/lib/message.c:1335 -#, c-format -msgid "%s: ERROR in %s:%d " -msgstr "" - -#: src/lib/message.c:1338 -#, c-format -msgid "%s: Warning: " -msgstr "" - -#: src/lib/message.c:1341 -#, c-format -msgid "%s: Security violation: " -msgstr "" - -#: src/lib/message.c:1430 -#, c-format -msgid "%s ABORTING due to ERROR\n" -msgstr "" - -#: src/lib/message.c:1433 -#, c-format -msgid "%s ERROR TERMINATION\n" -msgstr "" - -#: src/lib/message.c:1436 -#, c-format -msgid "%s JobId %u: Fatal error: " -msgstr "" - -#: src/lib/message.c:1445 -#, c-format -msgid "%s JobId %u: Error: " -msgstr "" - -#: src/lib/message.c:1451 -#, c-format -msgid "%s JobId %u: Warning: " -msgstr "" - -#: src/lib/message.c:1457 -#, c-format -msgid "%s JobId %u: Security violation: " -msgstr "" - -#: src/lib/message.c:1732 -msgid "Debug lock information" -msgstr "" - -#: src/lib/message.c:1733 -msgid "Debug network information" -msgstr "" - -#: src/lib/message.c:1734 -msgid "Debug plugin information" -msgstr "" - -#: src/lib/message.c:1735 -msgid "Debug volume information" -msgstr "" - -#: src/lib/message.c:1736 -msgid "Debug SQL queries" -msgstr "" - -#: src/lib/message.c:1737 -msgid "Debug BVFS queries" -msgstr "" - -#: src/lib/message.c:1738 -msgid "Debug memory allocation" -msgstr "" - -#: src/lib/message.c:1739 -msgid "Debug scheduler information" -msgstr "" - -#: src/lib/message.c:1740 -msgid "Debug protocol information" -msgstr "" - -#: src/lib/message.c:1741 -msgid "Debug dedup information" -msgstr "" - -#: src/lib/message.c:1742 -msgid "Debug snapshots" -msgstr "" - -#: src/lib/message.c:1743 -msgid "Debug dedup engine" -msgstr "" - -#: src/lib/message.c:1744 -msgid "ASX personal's debugging" -msgstr "" - -#: src/lib/message.c:1745 -msgid "Debug all information" -msgstr "" - -#: src/lib/openssl.c:113 src/lib/openssl.c:172 src/stored/dev.c:385 -#: src/stored/dev.c:443 -#, c-format -msgid "Unable to init mutex: ERR=%s\n" -msgstr "" - -#: src/lib/openssl.c:134 src/lib/openssl.c:205 -#, c-format -msgid "Unable to destroy mutex: ERR=%s\n" -msgstr "" - -#: src/lib/openssl.c:273 -#, c-format -msgid "Unable to init OpenSSL threading: ERR=%s\n" -msgstr "" - -#: src/lib/openssl.c:286 -msgid "Failed to seed OpenSSL PRNG\n" -msgstr "" - -#: src/lib/openssl.c:312 -msgid "Failed to save OpenSSL PRNG\n" -msgstr "" - -#: src/lib/parse_conf.c:164 -msgid "***UNKNOWN***" -msgstr "" - -#: src/lib/parse_conf.c:208 -#, c-format -msgid "Attempt to define second %s resource named \"%s\" is not permitted.\n" -msgstr "" - -#: src/lib/parse_conf.c:214 -#, c-format -msgid "Inserted res: %s index=%d\n" -msgstr "" - -#: src/lib/parse_conf.c:328 src/lib/parse_conf.c:349 -#, c-format -msgid "expected an =, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:358 -#, c-format -msgid "Unknown item code: %d\n" -msgstr "" - -#: src/lib/parse_conf.c:398 -#, c-format -msgid "message type: %s not found" -msgstr "" - -#: src/lib/parse_conf.c:437 -#, c-format -msgid "Attempt to redefine name \"%s\" to \"%s\"." -msgstr "" - -#: src/lib/parse_conf.c:542 -#, c-format -msgid "Attempt to redefine resource \"%s\" referenced on line %d : %s\n" -msgstr "" - -#: src/lib/parse_conf.c:578 -#, c-format -msgid "Too many %s directives. Max. is %d. line %d: %s\n" -msgstr "" - -#: src/lib/parse_conf.c:589 -#, c-format -msgid "Could not find config Resource \"%s\" referenced on line %d : %s\n" -msgstr "" - -#: src/lib/parse_conf.c:657 -#, c-format -msgid "Missing config Resource \"%s\" referenced on line %d : %s\n" -msgstr "" - -#: src/lib/parse_conf.c:732 -#, c-format -msgid "expected a size number, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:737 -#, c-format -msgid "expected a speed number, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:748 -#, c-format -msgid "expected a %s, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:749 -msgid "size" -msgstr "" - -#: src/lib/parse_conf.c:749 -msgid "speed" -msgstr "" - -#: src/lib/parse_conf.c:870 -#, c-format -msgid "Expected a Tape Label keyword, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:939 -#, c-format -msgid "Unable to initialize resource lock. ERR=%s\n" -msgstr "" - -#: src/lib/parse_conf.c:947 -msgid "Config filename too long.\n" -msgstr "" - -#: src/lib/parse_conf.c:971 -#, c-format -msgid "Cannot open config file \"%s\": %s\n" -msgstr "" - -#: src/lib/parse_conf.c:989 -msgid "" -"Currently we cannot handle UTF-16 source files. Please convert the conf file " -"to UTF-8\n" -msgstr "" - -#: src/lib/parse_conf.c:993 -#, c-format -msgid "Expected a Resource name identifier, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:1009 -#, c-format -msgid "expected resource name, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:1020 -#, c-format -msgid "not in resource definition: %s" -msgstr "" - -#: src/lib/parse_conf.c:1051 -#, c-format -msgid "" -"Keyword \"%s\" not permitted in this resource.\n" -"Perhaps you left the trailing brace off of the previous resource." -msgstr "" - -#: src/lib/parse_conf.c:1062 -msgid "Name not specified for resource" -msgstr "" - -#: src/lib/parse_conf.c:1072 -#, c-format -msgid "unexpected token %d %s in resource definition" -msgstr "" - -#: src/lib/parse_conf.c:1078 -#, c-format -msgid "Unknown parser state %d\n" -msgstr "" - -#: src/lib/parse_conf.c:1083 -msgid "End of conf file reached with unclosed resource." -msgstr "" - -#: src/lib/plugins.c:106 -#, c-format -msgid "Failed to open Plugin directory %s: ERR=%s\n" -msgstr "" - -#: src/lib/plugins.c:123 -#, c-format -msgid "Failed to find any plugins in %s\n" -msgstr "" - -#: src/lib/plugins.c:157 -#, c-format -msgid "dlopen plugin %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/plugins.c:168 -#, c-format -msgid "Lookup of loadPlugin in plugin %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/plugins.c:177 -#, c-format -msgid "Lookup of unloadPlugin in plugin %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:57 -#, c-format -msgid "Could not find userid=%s: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:63 -#, c-format -msgid "Could not find password entry. ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:76 -#, c-format -msgid "Could not find group=%s: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:84 -#, c-format -msgid "Could not initgroups for group=%s, userid=%s: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:87 -#, c-format -msgid "Could not initgroups for userid=%s: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:94 -#, c-format -msgid "Could not set group=%s: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:104 -#, c-format -msgid "prctl failed: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:108 -#, c-format -msgid "setreuid failed: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:112 -#, c-format -msgid "cap_from_text failed: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:116 -#, c-format -msgid "cap_set_proc failed: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:120 -msgid "Keep readall caps not implemented this OS or missing libraries.\n" -msgstr "" - -#: src/lib/priv.c:124 -#, c-format -msgid "Could not set specified userid: %s\n" -msgstr "" - -#: src/lib/pythonlib.c:105 -msgid "Could not initialize Python\n" -msgstr "" - -#: src/lib/pythonlib.c:110 -#, c-format -msgid "Could not Run Python string %s\n" -msgstr "" - -#: src/lib/pythonlib.c:122 -msgid "Could not initialize Python Job type.\n" -msgstr "" - -#: src/lib/pythonlib.c:127 -#, c-format -msgid "Could not import Python script %s/%s. Python disabled.\n" -msgstr "" - -#: src/lib/pythonlib.c:229 -msgid "Could not create Python Job Object.\n" -msgstr "" - -#: src/lib/pythonlib.c:242 src/lib/pythonlib.c:266 -#, c-format -msgid "Python function \"%s\" not found.\n" -msgstr "" - -#: src/lib/pythonlib.c:281 -#, c-format -msgid "Unknown Python daemon event %s\n" -msgstr "" - -#: src/lib/pythonlib.c:306 -#, c-format -msgid "Unable to initialize the Python lock. ERR=%s\n" -msgstr "" - -#: src/lib/res.c:54 -#, c-format -msgid "rwl_writelock failure at %s:%d: ERR=%s\n" -msgstr "" - -#: src/lib/res.c:64 -#, c-format -msgid "rwl_writeunlock failure at %s:%d:. ERR=%s\n" -msgstr "" - -#: src/lib/runscript.c:225 -#, c-format -msgid "%s: run %s \"%s\"\n" -msgstr "" - -#: src/lib/runscript.c:234 -#, c-format -msgid "Runscript: %s could not execute. ERR=%s\n" -msgstr "" - -#: src/lib/runscript.c:243 -#, c-format -msgid "%s: %s\n" -msgstr "" - -#: src/lib/runscript.c:248 -#, c-format -msgid "Runscript: %s returned non-zero status=%d. ERR=%s\n" -msgstr "" - -#: src/lib/rwlock.c:291 -msgid "rwl_writeunlock called too many times.\n" -msgstr "" - -#: src/lib/rwlock.c:296 -msgid "rwl_writeunlock by non-owner.\n" -msgstr "" - -#: src/lib/sellist.c:58 -msgid "Negative numbers not permitted.\n" -msgstr "" - -#: src/lib/sellist.c:84 -msgid "User cancel requested.\n" -msgstr "" - -#: src/lib/sellist.c:107 -msgid "Selection items must be be greater than zero.\n" -msgstr "" - -#: src/lib/signal.c:57 -msgid "Invalid signal number" -msgstr "" - -#: src/lib/signal.c:147 src/lib/signal.c:149 -#, c-format -msgid "Bacula interrupted by signal %d: %s\n" -msgstr "" - -#: src/lib/signal.c:165 -#, c-format -msgid "Kaboom! %s, %s got signal %d - %s at %s. Attempting traceback.\n" -msgstr "" - -#: src/lib/signal.c:167 -#, c-format -msgid "Kaboom! exepath=%s\n" -msgstr "" - -#: src/lib/signal.c:208 -#, c-format -msgid "Fork error: ERR=%s\n" -msgstr "" - -#: src/lib/signal.c:216 -#, c-format -msgid "Calling: %s %s %s %s\n" -msgstr "" - -#: src/lib/signal.c:220 -#, c-format -msgid "execv: %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/signal.c:242 -#, c-format -msgid "It looks like the traceback worked...\n" -msgstr "" - -#: src/lib/signal.c:244 -#, c-format -msgid "The btraceback call returned %d\n" -msgstr "" - -#: src/lib/signal.c:304 -#, c-format -msgid "BA_NSIG too small (%d) should be (%d)\n" -msgstr "" - -#: src/lib/signal.c:310 -msgid "UNKNOWN SIGNAL" -msgstr "" - -#: src/lib/signal.c:311 -msgid "Hangup" -msgstr "" - -#: src/lib/signal.c:312 -msgid "Interrupt" -msgstr "" - -#: src/lib/signal.c:313 -msgid "Quit" -msgstr "" - -#: src/lib/signal.c:314 -msgid "Illegal instruction" -msgstr "" - -#: src/lib/signal.c:315 -msgid "Trace/Breakpoint trap" -msgstr "" - -#: src/lib/signal.c:316 -msgid "Abort" -msgstr "" - -#: src/lib/signal.c:318 -msgid "EMT instruction (Emulation Trap)" -msgstr "" - -#: src/lib/signal.c:321 -msgid "IOT trap" -msgstr "" - -#: src/lib/signal.c:323 -msgid "BUS error" -msgstr "" - -#: src/lib/signal.c:324 -msgid "Floating-point exception" -msgstr "" - -#: src/lib/signal.c:325 -msgid "Kill, unblockable" -msgstr "" - -#: src/lib/signal.c:326 -msgid "User-defined signal 1" -msgstr "" - -#: src/lib/signal.c:327 -msgid "Segmentation violation" -msgstr "" - -#: src/lib/signal.c:328 -msgid "User-defined signal 2" -msgstr "" - -#: src/lib/signal.c:329 -msgid "Broken pipe" -msgstr "" - -#: src/lib/signal.c:330 -msgid "Alarm clock" -msgstr "" - -#: src/lib/signal.c:331 -msgid "Termination" -msgstr "" - -#: src/lib/signal.c:333 -msgid "Stack fault" -msgstr "" - -#: src/lib/signal.c:335 -msgid "Child status has changed" -msgstr "" - -#: src/lib/signal.c:336 -msgid "Continue" -msgstr "" - -#: src/lib/signal.c:337 -msgid "Stop, unblockable" -msgstr "" - -#: src/lib/signal.c:338 -msgid "Keyboard stop" -msgstr "" - -#: src/lib/signal.c:339 -msgid "Background read from tty" -msgstr "" - -#: src/lib/signal.c:340 -msgid "Background write to tty" -msgstr "" - -#: src/lib/signal.c:341 -msgid "Urgent condition on socket" -msgstr "" - -#: src/lib/signal.c:342 -msgid "CPU limit exceeded" -msgstr "" - -#: src/lib/signal.c:343 -msgid "File size limit exceeded" -msgstr "" - -#: src/lib/signal.c:344 -msgid "Virtual alarm clock" -msgstr "" - -#: src/lib/signal.c:345 -msgid "Profiling alarm clock" -msgstr "" - -#: src/lib/signal.c:346 -msgid "Window size change" -msgstr "" - -#: src/lib/signal.c:347 -msgid "I/O now possible" -msgstr "" - -#: src/lib/signal.c:349 -msgid "Power failure restart" -msgstr "" - -#: src/lib/signal.c:352 -msgid "No runnable lwp" -msgstr "" - -#: src/lib/signal.c:355 -msgid "SIGLWP special signal used by thread library" -msgstr "" - -#: src/lib/signal.c:358 -msgid "Checkpoint Freeze" -msgstr "" - -#: src/lib/signal.c:361 -msgid "Checkpoint Thaw" -msgstr "" - -#: src/lib/signal.c:364 -msgid "Thread Cancellation" -msgstr "" - -#: src/lib/signal.c:367 -msgid "Resource Lost (e.g. record-lock lost)" -msgstr "" - -#: src/lib/smartall.c:134 src/lib/smartall.c:247 src/lib/smartall.c:262 -msgid "Out of memory\n" -msgstr "" - -#: src/lib/smartall.c:139 -msgid "Too much memory used." -msgstr "" - -#: src/lib/smartall.c:171 -#, c-format -msgid "Attempt to free NULL called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:185 -#, c-format -msgid "in-use bit not set: double free from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:193 -#, c-format -msgid "qp->qnext->qprev != qp called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:197 -#, c-format -msgid "qp->qprev->qnext != qp called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:206 -#, c-format -msgid "Overrun buffer: len=%d addr=%p allocated: %s:%d called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:284 -#, c-format -msgid "sm_realloc size: %d\n" -msgstr "" - -#: src/lib/smartall.c:322 -#, c-format -msgid "sm_realloc %d at %p from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:382 -#, c-format -msgid "" -"\n" -"Orphaned buffers exist. Dump terminated following\n" -" discovery of bad links in chain of orphaned buffers.\n" -" Buffer address with bad links: %p\n" -msgstr "" - -#: src/lib/smartall.c:427 -#, c-format -msgid "Damaged buffer found. Called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:460 -#, c-format -msgid "" -"\n" -"Damaged buffers found at %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:463 -msgid " discovery of bad prev link.\n" -msgstr "" - -#: src/lib/smartall.c:466 -msgid " discovery of bad next link.\n" -msgstr "" - -#: src/lib/smartall.c:469 -msgid " discovery of data overrun.\n" -msgstr "" - -#: src/lib/smartall.c:472 -msgid " NULL pointer.\n" -msgstr "" - -#: src/lib/smartall.c:478 -#, c-format -msgid " Buffer address: %p\n" -msgstr "" - -#: src/lib/smartall.c:485 -#, c-format -msgid "Damaged buffer: %6u bytes allocated at line %d of %s %s\n" -msgstr "" - -#: src/lib/status.h:86 -msgid "===================================================================\n" -msgstr "" - -#: src/lib/tls.c:81 -#, c-format -msgid "" -"Error with certificate at depth: %d, issuer = %s, subject = %s, ERR=%d:%s\n" -msgstr "" - -#: src/lib/tls.c:118 -msgid "Error initializing SSL context" -msgstr "" - -#: src/lib/tls.c:139 -msgid "Error loading certificate verification stores" -msgstr "" - -#: src/lib/tls.c:144 -msgid "" -"Either a certificate file or a directory must be specified as a verification " -"store\n" -msgstr "" - -#: src/lib/tls.c:155 -msgid "Error loading certificate file" -msgstr "" - -#: src/lib/tls.c:163 -msgid "Error loading private key" -msgstr "" - -#: src/lib/tls.c:171 -msgid "Unable to open DH parameters file" -msgstr "" - -#: src/lib/tls.c:177 -msgid "Unable to load DH parameters from specified file" -msgstr "" - -#: src/lib/tls.c:181 -msgid "Failed to set TLS Diffie-Hellman parameters" -msgstr "" - -#: src/lib/tls.c:191 -msgid "Error setting cipher list, no valid ciphers available\n" -msgstr "" - -#: src/lib/tls.c:250 -msgid "Peer failed to present a TLS certificate\n" -msgstr "" - -#: src/lib/tls.c:296 src/lib/tls.c:297 -#, c-format -msgid "Peer %s failed to present a TLS certificate\n" -msgstr "" - -#: src/lib/tls.c:429 -msgid "Error creating file descriptor-based BIO" -msgstr "" - -#: src/lib/tls.c:440 -msgid "Error creating new SSL object" -msgstr "" - -#: src/lib/tls.c:509 src/lib/tls.c:532 -msgid "Connect failure" -msgstr "" - -#: src/lib/tls.c:612 src/lib/tls.c:616 -msgid "TLS shutdown failure." -msgstr "" - -#: src/lib/tls.c:677 src/lib/tls.c:703 -msgid "TLS read/write failure." -msgstr "" - -#: src/lib/util.c:259 -msgid "Running" -msgstr "" - -#: src/lib/util.c:262 -msgid "Blocked" -msgstr "" - -#: src/lib/util.c:268 -msgid "Incomplete job" -msgstr "" - -#: src/lib/util.c:275 -msgid "Non-fatal error" -msgstr "" - -#: src/lib/util.c:281 src/lib/util.c:416 -msgid "Canceled" -msgstr "" - -#: src/lib/util.c:284 -msgid "Verify differences" -msgstr "" - -#: src/lib/util.c:287 -msgid "Waiting on FD" -msgstr "" - -#: src/lib/util.c:290 -msgid "Wait on SD" -msgstr "" - -#: src/lib/util.c:293 -msgid "Wait for new Volume" -msgstr "" - -#: src/lib/util.c:296 -msgid "Waiting for mount" -msgstr "" - -#: src/lib/util.c:299 -msgid "Waiting for Storage resource" -msgstr "" - -#: src/lib/util.c:302 -msgid "Waiting for Job resource" -msgstr "" - -#: src/lib/util.c:305 -msgid "Waiting for Client resource" -msgstr "" - -#: src/lib/util.c:308 -msgid "Waiting on Max Jobs" -msgstr "" - -#: src/lib/util.c:311 -msgid "Waiting for Start Time" -msgstr "" - -#: src/lib/util.c:314 -msgid "Waiting on Priority" -msgstr "" - -#: src/lib/util.c:333 -#, c-format -msgid "Unknown Job termination status=%d" -msgstr "" - -#: src/lib/util.c:349 -msgid "Completed successfully" -msgstr "" - -#: src/lib/util.c:352 -msgid "Completed with warnings" -msgstr "" - -#: src/lib/util.c:355 -msgid "Terminated with errors" -msgstr "" - -#: src/lib/util.c:358 -msgid "Fatal error" -msgstr "" - -#: src/lib/util.c:361 -msgid "Created, not yet running" -msgstr "" - -#: src/lib/util.c:364 -msgid "Canceled by user" -msgstr "" - -#: src/lib/util.c:367 -msgid "Verify found differences" -msgstr "" - -#: src/lib/util.c:370 -msgid "Waiting for File daemon" -msgstr "" - -#: src/lib/util.c:373 -msgid "Waiting for Storage daemon" -msgstr "" - -#: src/lib/util.c:376 -msgid "Waiting for higher priority jobs" -msgstr "" - -#: src/lib/util.c:379 -msgid "Batch inserting file records" -msgstr "" - -#: src/lib/util.c:413 -msgid "Fatal Error" -msgstr "" - -#: src/lib/util.c:419 -msgid "Differences" -msgstr "" - -#: src/lib/util.c:422 -msgid "Unknown term code" -msgstr "" - -#: src/lib/util.c:441 -msgid "Migrated Job" -msgstr "" - -#: src/lib/util.c:444 -msgid "Verify" -msgstr "" - -#: src/lib/util.c:447 -msgid "Restore" -msgstr "" - -#: src/lib/util.c:450 -msgid "Console" -msgstr "" - -#: src/lib/util.c:453 -msgid "System or Console" -msgstr "" - -#: src/lib/util.c:456 -msgid "Admin" -msgstr "" - -#: src/lib/util.c:459 src/lib/util.c:549 -msgid "Archive" -msgstr "" - -#: src/lib/util.c:462 -msgid "Job Copy" -msgstr "" - -#: src/lib/util.c:465 -msgid "Copy" -msgstr "" - -#: src/lib/util.c:468 -msgid "Migrate" -msgstr "" - -#: src/lib/util.c:471 -msgid "Scan" -msgstr "" - -#: src/lib/util.c:475 -msgid "Unknown Type" -msgstr "" - -#: src/lib/util.c:485 -msgid "Truncate" -msgstr "" - -#: src/lib/util.c:502 -msgid "Base" -msgstr "" - -#: src/lib/util.c:520 -msgid "Verify Init Catalog" -msgstr "" - -#: src/lib/util.c:529 -msgid "Verify Data" -msgstr "" - -#: src/lib/util.c:532 -msgid "Virtual Full" -msgstr "" - -#: src/lib/util.c:538 -msgid "Unknown Job Level" -msgstr "" - -#: src/lib/util.c:548 -msgid "Append" -msgstr "" - -#: src/lib/util.c:550 -msgid "Disabled" -msgstr "" - -#: src/lib/util.c:552 -msgid "Used" -msgstr "" - -#: src/lib/util.c:553 -msgid "Cleaning" -msgstr "" - -#: src/lib/util.c:554 -msgid "Purged" -msgstr "" - -#: src/lib/util.c:555 -msgid "Recycle" -msgstr "" - -#: src/lib/util.c:556 -msgid "Read-Only" -msgstr "" - -#: src/lib/util.c:568 -msgid "Invalid volume status" -msgstr "" - -#: src/lib/util.c:956 -msgid "Working directory not defined. Cannot continue.\n" -msgstr "" - -#: src/lib/util.c:959 -#, c-format -msgid "Working Directory: \"%s\" not found. Cannot continue.\n" -msgstr "" - -#: src/lib/util.c:963 -#, c-format -msgid "Working Directory: \"%s\" is not a directory. Cannot continue.\n" -msgstr "" - -#: src/lib/var.c:2659 -msgid "everything ok" -msgstr "" - -#: src/lib/var.c:2660 -msgid "incomplete named character" -msgstr "" - -#: src/lib/var.c:2661 -msgid "incomplete hexadecimal value" -msgstr "" - -#: src/lib/var.c:2662 -msgid "invalid hexadecimal value" -msgstr "" - -#: src/lib/var.c:2663 -msgid "octal value too large" -msgstr "" - -#: src/lib/var.c:2664 -msgid "invalid octal value" -msgstr "" - -#: src/lib/var.c:2665 -msgid "incomplete octal value" -msgstr "" - -#: src/lib/var.c:2666 -msgid "incomplete grouped hexadecimal value" -msgstr "" - -#: src/lib/var.c:2667 -msgid "incorrect character class specification" -msgstr "" - -#: src/lib/var.c:2668 -msgid "invalid expansion configuration" -msgstr "" - -#: src/lib/var.c:2669 -msgid "out of memory" -msgstr "" - -#: src/lib/var.c:2670 -msgid "incomplete variable specification" -msgstr "" - -#: src/lib/var.c:2671 -msgid "undefined variable" -msgstr "" - -#: src/lib/var.c:2672 -msgid "input is neither text nor variable" -msgstr "" - -#: src/lib/var.c:2673 -msgid "unknown command character in variable" -msgstr "" - -#: src/lib/var.c:2674 -msgid "malformatted search and replace operation" -msgstr "" - -#: src/lib/var.c:2675 -msgid "unknown flag in search and replace operation" -msgstr "" - -#: src/lib/var.c:2676 -msgid "invalid regex in search and replace operation" -msgstr "" - -#: src/lib/var.c:2677 -msgid "missing parameter in command" -msgstr "" - -#: src/lib/var.c:2678 -msgid "empty search string in search and replace operation" -msgstr "" - -#: src/lib/var.c:2679 -msgid "start offset missing in cut operation" -msgstr "" - -#: src/lib/var.c:2680 -msgid "offsets in cut operation delimited by unknown character" -msgstr "" - -#: src/lib/var.c:2681 -msgid "range out of bounds in cut operation" -msgstr "" - -#: src/lib/var.c:2682 -msgid "offset out of bounds in cut operation" -msgstr "" - -#: src/lib/var.c:2683 -msgid "logic error in cut operation" -msgstr "" - -#: src/lib/var.c:2684 -msgid "malformatted transpose operation" -msgstr "" - -#: src/lib/var.c:2685 -msgid "source and target class mismatch in transpose operation" -msgstr "" - -#: src/lib/var.c:2686 -msgid "empty character class in transpose operation" -msgstr "" - -#: src/lib/var.c:2687 -msgid "incorrect character class in transpose operation" -msgstr "" - -#: src/lib/var.c:2688 -msgid "malformatted padding operation" -msgstr "" - -#: src/lib/var.c:2689 -msgid "width parameter missing in padding operation" -msgstr "" - -#: src/lib/var.c:2690 -msgid "fill string missing in padding operation" -msgstr "" - -#: src/lib/var.c:2691 -msgid "unknown quoted pair in search and replace operation" -msgstr "" - -#: src/lib/var.c:2692 -msgid "sub-matching reference out of range" -msgstr "" - -#: src/lib/var.c:2693 -msgid "invalid argument" -msgstr "" - -#: src/lib/var.c:2694 -msgid "incomplete quoted pair" -msgstr "" - -#: src/lib/var.c:2695 -msgid "lookup function does not support variable arrays" -msgstr "" - -#: src/lib/var.c:2696 -msgid "index of array variable contains an invalid character" -msgstr "" - -#: src/lib/var.c:2697 -msgid "index of array variable is incomplete" -msgstr "" - -#: src/lib/var.c:2698 -msgid "bracket expression in array variable's index not closed" -msgstr "" - -#: src/lib/var.c:2699 -msgid "division by zero error in index specification" -msgstr "" - -#: src/lib/var.c:2700 -msgid "unterminated loop construct" -msgstr "" - -#: src/lib/var.c:2701 -msgid "invalid character in loop limits" -msgstr "" - -#: src/lib/var.c:2702 -msgid "malformed operation argument list" -msgstr "" - -#: src/lib/var.c:2703 -msgid "undefined operation" -msgstr "" - -#: src/lib/var.c:2704 -msgid "formatting failure" -msgstr "" - -#: src/lib/var.c:2713 -msgid "unknown error" -msgstr "" - -#: src/lib/watchdog.c:85 -#, c-format -msgid "Unable to initialize watchdog lock. ERR=%s\n" -msgstr "" - -#: src/lib/watchdog.c:182 -msgid "BUG! register_watchdog called before start_watchdog\n" -msgstr "" - -#: src/lib/watchdog.c:185 -#, c-format -msgid "BUG! Watchdog %p has NULL callback\n" -msgstr "" - -#: src/lib/watchdog.c:188 -#, c-format -msgid "BUG! Watchdog %p has zero interval\n" -msgstr "" - -#: src/lib/watchdog.c:208 -msgid "BUG! unregister_watchdog_unlocked called before start_watchdog\n" -msgstr "" - -#: src/lib/watchdog.c:328 -#, c-format -msgid "rwl_writelock failure. ERR=%s\n" -msgstr "" - -#: src/lib/watchdog.c:343 -#, c-format -msgid "rwl_writeunlock failure. ERR=%s\n" -msgstr "" - -#: src/lib/xml.c:407 -msgid "Malformed XML expecting start of tag.\n" -msgstr "" - -#: src/lib/xml.c:460 -msgid "Bad file start bytes (utf8 bom).\n" -msgstr "" - -#: src/lib/xml.c:472 -msgid "Bad file start bytes (utf16 bom).\n" -msgstr "" - -#: src/plugins/fd/delta-fd.c:1359 -#, c-format -msgid "Can't use replace=ifnewer with Delta plugin on %s\n" -msgstr "" - -#: src/plugins/fd/delta-fd.c:1366 -#, c-format -msgid "Can't use replace=ifolder with Delta plugin on %s\n" -msgstr "" - -#: src/plugins/fd/delta-fd.c:1376 -#, c-format -msgid "" -"Can't restore %s, file already exists. Delta plugin doesn't support " -"replace=never option\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:698 src/plugins/fd/mysql-fd.c:1178 -#: src/plugins/fd/postgresql-fd.c:731 -#, c-format -msgid "Can't run command %s. ERR=%s\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:844 -#, c-format -msgid "Can't create working directory %s. ERR=%s\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:864 -#, c-format -msgid "Can't delete working directory %s. ERR=%s\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:1007 src/plugins/fd/mysql-fd.c:1496 -#, c-format -msgid "Unknown parameter or missing argument for %s.\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:1046 -#, c-format -msgid "Unknown parameter for %s. Expecting block or file\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:1051 src/plugins/fd/mysql-fd.c:1573 -#: src/plugins/fd/postgresql-fd.c:1035 -#, c-format -msgid "Unknown parameter %s.\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:1217 src/plugins/fd/hvplugin.c:1231 -#: src/plugins/fd/hvplugin.c:1261 src/plugins/fd/mysql-fd.c:2813 -#: src/plugins/fd/mysql-fd.c:2841 src/plugins/fd/mysql-fd.c:3171 -#: src/plugins/fd/postgresql-fd.c:2198 src/plugins/fd/postgresql-fd.c:2220 -#: src/plugins/fd/postgresql-fd.c:2478 -msgid "Can't analyse plugin command line\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:1221 -msgid "Unable to access guest volume\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:1238 -msgid "The hvplugin plugin doesn't support regexwhere parameter.\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:1271 -msgid "" -"The hvplugin plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=hvplugin command in the\n" -"Include {} block.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:824 -#, c-format -msgid "Found MASTER_LOG position %s:%lld for \"%s\"\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:868 -#, c-format -msgid "Unable to get MySQL version %s, might cause errors\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:961 -#, c-format -msgid "Can't reach MySQL server to get database list. ERR=%d\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1069 -#, c-format -msgid "Can't reach MySQL server to get database config. ERR=%d\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1267 src/plugins/fd/mysql-fd.c:1290 -#: src/plugins/fd/mysql-fd.c:1302 src/plugins/fd/mysql-fd.c:1356 -#: src/plugins/fd/mysql-fd.c:1669 src/plugins/fd/postgresql-fd.c:1167 -#, c-format -msgid "Unable to create temporary file %s. ERR=%s\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1527 -#, c-format -msgid "Invalid argument for %s. Expecting tar or xbstream\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1531 -msgid "" -"bin_format=tar is incompatible with Incremental backup. Using xbstream " -"instead\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1547 -#, c-format -msgid "Can't use mode=%s in MySQL plugin\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1584 -msgid "Unable to detect where my.cnf is located. Use config_file=" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1679 src/plugins/fd/postgresql-fd.c:1177 -#, c-format -msgid "Unable to fdopen file %s. ERR=%s\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1774 -msgid "log_bin mysqld parameter is not suitable for Incremental backup.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1776 -msgid "Generating Full dump instead...\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2039 -#, c-format -msgid " Dumping database \"%s\"\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2181 -msgid "Unable to detect the MySQL data_directory on this system.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2188 -#, c-format -msgid "Configuration of log_bin=%s is not suitable for PITR backup.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2217 -#, c-format -msgid "Unable to determine the last binlog %s\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2269 -msgid "Can't get server configuration.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2290 -msgid "Unable to get the BINLOG list.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2375 -#, c-format -msgid "" -"Unable to read %s. ERR=%s\n" -"Check permissions and/or use config_file parameter.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2418 -#, c-format -msgid "Unable to determine the last LSN for %s (Previous job is %s)\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2426 -#, c-format -msgid "Will use LSN=%s for the current backup\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2461 -msgid "Unable to detect datadir from MySQL\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2507 -msgid "Unable to get last LSN from the backup\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2512 -#, c-format -msgid "The current LSN is %s\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2866 -msgid "" -"The MySQL plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=mysql command in the\n" -"Include {} block.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3250 src/plugins/fd/postgresql-fd.c:2698 -msgid "replace=ifnewer/ifolder are not supported, switching to replace=never\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3294 src/plugins/fd/postgresql-fd.c:2739 -#: src/plugins/fd/postgresql-fd.c:2802 -#, c-format -msgid "" -"Database \"%s\" already exists, can't replace it when using replace=never\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3310 -#, c-format -msgid "Restoring target database \"%s\"\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3327 src/plugins/fd/postgresql-fd.c:2771 -msgid "Re-creating roles, may produce errors if roles already exist\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3335 -#, c-format -msgid "Creating target database \"%s\"\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3346 -#, c-format -msgid "Database \"%s\" already exists. Skipping creation.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3351 -msgid "" -"To restore all databases from a single dump file, use replace=always restore " -"option." -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3355 -msgid "" -"To restore all databases from a single dump file, use where=/ restore option." -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3358 -msgid "Restoring all databases from all-databases.sql file\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3379 -msgid "" -"bin-log should be restored separately as files using where=/a/directory and " -"applied using mysqlbinlog program and MASTER_LOG position found in the " -"restore log.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3381 -#, c-format -msgid "Skipping \"%s\".\n" -msgstr "" - -#: src/plugins/fd/ndmp-fd.c:1081 -msgid "" -"Unable to get where= argument for the restore.\n" -"Using regexwhere is unsupported with the ndmp plugin.\n" -msgstr "" - -#: src/plugins/fd/ndmp-fd.c:1105 -#, c-format -msgid "Unable to parse or to use plugin options, %s\n" -msgstr "" - -#: src/plugins/fd/ndmp-fd.c:1116 -msgid "" -"The ndmp plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=ndmp command in the\n" -"Include {} block.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:608 -#, c-format -msgid "Can't reach PostgreSQL server to get database list. ERR=%d\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:662 -#, c-format -msgid "Can't reach PostgreSQL server to get database config. ERR=%d\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:982 -#, c-format -msgid "Unknown parameter or bad argument for %s.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1002 -#, c-format -msgid "Can't use mode=%s in postgresql plugin\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1011 -#, c-format -msgid "Can't use service=%s in postgresql plugin ERR=%s\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1030 -#, c-format -msgid "Bad compress=%s parameter expect 0-9.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1272 -msgid "Can't get cluster configuration.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1283 -msgid "Can't stop the current backup\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1289 src/plugins/fd/postgresql-fd.c:1297 -msgid "Can't determine the last WAL file\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1312 src/plugins/fd/postgresql-fd.c:1919 -msgid "Can't determine WAL directory\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1319 -#, c-format -msgid "Can't open WAL directory %s. ERR=%s\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1861 -msgid "Your PostgreSQL version is too old for PITR mode\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1866 -msgid "Unable to detect the PostgreSQL data_directory on this system.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1873 -#, c-format -msgid "Unable to find data_directory=%s on this system. ERR=%s\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1882 -msgid "Configuration wal_level=minimal is not suitable for PITR backup.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1892 -msgid "Configuration archive_command is not suitable for PITR backup.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1994 -msgid "Unable to start the PITR backup on this system.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:2000 -msgid "Unable to determine the first WAL file on this system.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:2015 -#, c-format -msgid "Unable to analyse tablespaces %s on this system. ERR=%s\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:2065 -#, c-format -msgid "Unable to analyse data_directory %s on this system. ERR=%s\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:2245 -msgid "" -"The postgresql plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=postgresql command in the\n" -"Include {} block.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:2490 -msgid "" -"You need to set PrefixLinks=Yes in your Restore job definition, or you will " -"need to fix all symlinks yourself." -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:2544 -#, c-format -msgid "Creating %s to help you starting the recovery.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:2549 -#, c-format -msgid "Can't create the %s file for recovery. ERR=%s\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:2758 -msgid "" -"The destination database already exists,it might generate some harmless " -"error messages." -msgstr "" - -#: src/plugins/sd/shstore-sd.c:179 -#, c-format -msgid "3612 JobId=%u waiting because device %s is reserved by: %s.\n" -msgstr "" - -#: src/plugins/sd/shstore-sd.c:435 -#, c-format -msgid "" -"3998 Bad return from storage \"%s\" command: ERR=%s.\n" -"Results=%s\n" -msgstr "" - -#: src/qt-console/bat_conf.cpp:144 -#, c-format -msgid "Console: name=%s\n" -msgstr "" - -#: src/qt-console/bat_conf.cpp:147 -#: src/qt-console/tray-monitor/tray_conf.cpp:185 -#, c-format -msgid "ConsoleFont: name=%s font face=%s\n" -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:86 -#, c-format -msgid "Already connected\"%s\".\n" -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:97 -#: src/qt-console/tray-monitor/tray-monitor.cpp:351 -#, c-format -msgid "Connecting to Director %s:%d" -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:99 -#, c-format -msgid "" -"Connecting to Director %s:%d\n" -"\n" -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:196 -#: src/qt-console/tray-monitor/tray-monitor.cpp:356 -msgid "Director daemon" -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:234 -msgid "Initializing ..." -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:250 src/qt-console/console/console.cpp:131 -msgid "Connected" -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:374 -msgid "Command completed ..." -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:381 src/qt-console/console/console.cpp:368 -msgid "Processing command ..." -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:388 -msgid "At main prompt waiting for input ..." -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:395 src/qt-console/bcomm/dircomm.cpp:405 -msgid "At prompt waiting for input ..." -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:413 -msgid "Command failed." -msgstr "" - -#: src/qt-console/bcomm/dircomm.cpp:485 -msgid "Director disconnected." -msgstr "" - -#: src/qt-console/bcomm/dircomm_auth.cpp:108 -#, c-format -msgid "Director authorization problem at \"%s:%d\"\n" -msgstr "" - -#: src/qt-console/bcomm/dircomm_auth.cpp:115 -#, c-format -msgid "" -"Authorization problem: Remote server at \"%s:%d\" did not advertise required " -"TLS support.\n" -msgstr "" - -#: src/qt-console/bcomm/dircomm_auth.cpp:123 -#, c-format -msgid "" -"Authorization problem with Director at \"%s:%d\": Remote server requires " -"TLS.\n" -msgstr "" - -#: src/qt-console/bcomm/dircomm_auth.cpp:146 -#, c-format -msgid "" -"Bad response to Hello command: ERR=%s\n" -"The Director at \"%s:%d\" is probably not running.\n" -msgstr "" - -#: src/qt-console/bcomm/dircomm_auth.cpp:174 -#, c-format -msgid "" -"Authorization problem with Director at \"%s:%d\"\n" -"Most likely the passwords do not agree.\n" -"If you are using TLS, there may have been a certificate validation error " -"during the TLS handshake.\n" -"For help, please see " -msgstr "" - -#: src/qt-console/main.cpp:185 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s) %s %s %s\n" -"\n" -"Usage: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" -" -c set configuration file to file\n" -" -dnn set debug level to nn\n" -" -s no signals\n" -" -t test - read configuration and exit\n" -" -? print this message.\n" -"\n" -msgstr "" - -#: src/qt-console/tray-monitor/authenticate.cpp:76 -msgid "" -"Director authorization problem.\n" -"Most likely the passwords do not agree.\n" -"For help, please see " -msgstr "" - -#: src/qt-console/tray-monitor/authenticate.cpp:126 -msgid "" -"Director and Storage daemon passwords or names not the same.\n" -"For help, please see " -msgstr "" - -#: src/qt-console/tray-monitor/authenticate.cpp:133 -#, c-format -msgid "bdird set configuration file to file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -t test - read configuration and exit\n" -" -? print this message.\n" -"\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:208 -#, c-format -msgid "" -"Error: %d Monitor resources defined in %s. You must define one and only one " -"Monitor resource.\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:240 -#, c-format -msgid "" -"No Client, Storage or Director resource defined in %s\n" -"Without that I don't how to get status from the File, Storage or Director " -"Daemon :-(\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:255 -#, c-format -msgid "" -"Invalid refresh interval defined in %s\n" -"This value must be greater or equal to 1 second and less or equal to 10 " -"minutes (read value: %d).\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:323 -#, c-format -msgid "Error, currentitem is not a Client or a Storage..\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:361 -#, c-format -msgid "Connecting to Client %s:%d" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:366 -msgid "File daemon" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:371 -#, c-format -msgid "Connecting to Storage %s:%d" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:380 -#: src/qt-console/tray-monitor/tray-monitor.cpp:410 -#, c-format -msgid "Error, currentitem is not a Client, a Storage or a Director..\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:385 -msgid "Cannot connect to daemon." -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:394 -#, c-format -msgid "Authentication error : %s" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:401 -msgid "Opened connection with Director daemon." -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:404 -msgid "Opened connection with File daemon." -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:407 -msgid "Opened connection with Storage daemon." -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:458 -msgid "Error : BNET_HARDEOF or BNET_ERROR" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:467 -msgid "Error : Connection closed." -msgstr "" - -#: src/qt-console/tray-monitor/tray_conf.cpp:167 -#, c-format -msgid "Monitor: name=%s FDtimeout=%s SDtimeout=%s\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray_conf.cpp:173 -#, c-format -msgid "Director: name=%s address=%s FDport=%d\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray_conf.cpp:177 -#, c-format -msgid "Client: name=%s address=%s FDport=%d\n" -msgstr "" - -#: src/qt-console/tray-monitor/tray_conf.cpp:181 -#, c-format -msgid "Storage: name=%s address=%s SDport=%d\n" -msgstr "" - -#: src/stored/acquire.c:62 -#, c-format -msgid "Acquire read: num_writers=%d not zero. Job %d canceled.\n" -msgstr "" - -#: src/stored/acquire.c:71 -#, c-format -msgid "No volumes specified for reading. Job %s canceled.\n" -msgstr "" - -#: src/stored/acquire.c:80 -#, c-format -msgid "Logic error: no next volume to read. Numvol=%d Curvol=%d\n" -msgstr "" - -#: src/stored/acquire.c:87 src/stored/acquire.c:164 src/stored/acquire.c:439 -#: src/stored/stored.c:614 -msgid "generate_plugin_event(bsdEventDeviceOpen) Failed\n" -msgstr "" - -#: src/stored/acquire.c:111 -#, c-format -msgid "" -"Changing read device. Want Media Type=\"%s\" have=\"%s\"\n" -" %s device=%s\n" -msgstr "" - -#: src/stored/acquire.c:159 -#, c-format -msgid "Media Type change. New read %s device %s chosen.\n" -msgstr "" - -#: src/stored/acquire.c:176 -#, c-format -msgid "No suitable device found to read Volume \"%s\"\n" -msgstr "" - -#: src/stored/acquire.c:215 -#, c-format -msgid "Job %s canceled.\n" -msgstr "" - -#: src/stored/acquire.c:233 -#, c-format -msgid "Read open %s device %s Volume \"%s\" failed: ERR=%s\n" -msgstr "" - -#: src/stored/acquire.c:326 -#, c-format -msgid "Too many errors trying to mount %s device %s for reading.\n" -msgstr "" - -#: src/stored/acquire.c:334 -#, c-format -msgid "Ready to read from volume \"%s\" on %s device %s.\n" -msgstr "" - -#: src/stored/acquire.c:424 -#, c-format -msgid "Could not ready %s device %s for append.\n" -msgstr "" - -#: src/stored/acquire.c:520 src/stored/block_util.c:669 -#: src/stored/block_util.c:742 src/stored/block_util.c:772 -#: src/stored/spool.c:277 -#, c-format -msgid "Could not create JobMedia record for Volume=\"%s\" Job=%s\n" -msgstr "" - -#: src/stored/acquire.c:575 -#, c-format -msgid "Alert: %s" -msgstr "" - -#: src/stored/acquire.c:583 -#, c-format -msgid "3997 Bad alert command: %s: ERR=%s.\n" -msgstr "" - -#: src/stored/aligned_dev.c:44 src/stored/dev.c:122 src/stored/stored.c:583 -#, c-format -msgid "Could not initialize %s\n" -msgstr "" - -#: src/stored/aligned_dev.c:132 src/stored/dev.c:667 -#, c-format -msgid "Error closing device %s. ERR=%s.\n" -msgstr "" - -#: src/stored/aligned_dev.c:432 src/stored/dvd.c:102 -msgid "No FreeSpace command defined.\n" -msgstr "" - -#: src/stored/aligned_dev.c:465 src/stored/dvd.c:136 -#, c-format -msgid "Cannot run free space command. Results=%s ERR=%s\n" -msgstr "" - -#: src/stored/aligned_read.c:199 -#, c-format -msgid "Record not properly reconstructed. Remainder wanted=%d got=%d\n" -msgstr "" - -#: src/stored/aligned_read.c:249 src/stored/record_read.c:177 -#, c-format -msgid "Sanity check failed. maxlen=%d datalen=%d. Block discarded.\n" -msgstr "" - -#: src/stored/ansi_label.c:82 -#, c-format -msgid "Read error on device %s in ANSI label. ERR=%s\n" -msgstr "" - -#: src/stored/ansi_label.c:92 -msgid "Insane! End of tape while reading ANSI label.\n" -msgstr "" - -#: src/stored/ansi_label.c:118 -msgid "No VOL1 label while reading ANSI/IBM label.\n" -msgstr "" - -#: src/stored/ansi_label.c:141 -#, c-format -msgid "Wanted ANSI Volume \"%s\" got \"%s\"\n" -msgstr "" - -#: src/stored/ansi_label.c:152 -msgid "No HDR1 label while reading ANSI label.\n" -msgstr "" - -#: src/stored/ansi_label.c:158 -#, c-format -msgid "ANSI/IBM Volume \"%s\" does not belong to Bacula.\n" -msgstr "" - -#: src/stored/ansi_label.c:170 -msgid "No HDR2 label while reading ANSI/IBM label.\n" -msgstr "" - -#: src/stored/ansi_label.c:185 -msgid "Unknown or bad ANSI/IBM label record.\n" -msgstr "" - -#: src/stored/ansi_label.c:193 -msgid "Too many records in while reading ANSI/IBM label.\n" -msgstr "" - -#: src/stored/ansi_label.c:293 -#, c-format -msgid "ANSI Volume label name \"%s\" longer than 6 chars.\n" -msgstr "" - -#: src/stored/ansi_label.c:319 -#, c-format -msgid "Could not write ANSI VOL1 label. Wanted size=%d got=%d ERR=%s\n" -msgstr "" - -#: src/stored/ansi_label.c:357 src/stored/ansi_label.c:386 -#, c-format -msgid "Could not write ANSI HDR1 label. ERR=%s\n" -msgstr "" - -#: src/stored/ansi_label.c:362 src/stored/ansi_label.c:393 -msgid "Could not write ANSI HDR1 label.\n" -msgstr "" - -#: src/stored/ansi_label.c:398 -#, c-format -msgid "Error writing EOF to tape. ERR=%s" -msgstr "" - -#: src/stored/ansi_label.c:403 -msgid "write_ansi_ibm_label called for non-ANSI/IBM type\n" -msgstr "" - -#: src/stored/append.c:77 -msgid "DCR is NULL!!!\n" -msgstr "" - -#: src/stored/append.c:83 -msgid "DEVICE is NULL!!!\n" -msgstr "" - -#: src/stored/append.c:94 -msgid "Unable to set network buffer size.\n" -msgstr "" - -#: src/stored/append.c:108 src/stored/append.c:118 src/stored/append.c:132 -#: src/stored/askdir.c:378 src/stored/askdir.c:379 -msgid "NULL Volume name. This shouldn't happen!!!\n" -msgstr "" - -#: src/stored/append.c:124 src/stored/btape.c:2231 -#, c-format -msgid "Write session label failed. ERR=%s\n" -msgstr "" - -#: src/stored/append.c:138 -#, c-format -msgid "Network send error to FD. ERR=%s\n" -msgstr "" - -#: src/stored/append.c:195 -#, c-format -msgid "Error reading data header from FD. n=%d msglen=%d ERR=%s\n" -msgstr "" - -#: src/stored/append.c:206 -#, c-format -msgid "Malformed data header from FD: %s\n" -msgstr "" - -#: src/stored/append.c:228 -#, c-format -msgid "FI=%d from FD not positive or last_FI=%d\n" -msgstr "" - -#: src/stored/append.c:353 -#, c-format -msgid "Network error reading from FD. ERR=%s\n" -msgstr "" - -#: src/stored/append.c:373 -#, c-format -msgid "DDE commit failed. ERR=%s\n" -msgstr "" - -#: src/stored/append.c:404 src/stored/append.c:431 src/stored/spool.c:266 -#: src/stored/vbackup.c:120 src/stored/vbackup.c:130 src/stored/vbackup.c:300 -#, c-format -msgid "Fatal append error on device %s: ERR=%s\n" -msgstr "" - -#: src/stored/append.c:406 src/stored/vbackup.c:122 -msgid "Set ok=FALSE after write_block_to_device.\n" -msgstr "" - -#: src/stored/append.c:418 src/stored/btape.c:2350 -#, c-format -msgid "Error writing end session label. ERR=%s\n" -msgstr "" - -#: src/stored/append.c:433 src/stored/vbackup.c:132 -msgid "Set ok=FALSE after write_final_block_to_device.\n" -msgstr "" - -#: src/stored/append.c:458 src/stored/read.c:110 src/stored/vbackup.c:155 -#, c-format -msgid "Elapsed time=%02d:%02d:%02d, Transfer rate=%s Bytes/second\n" -msgstr "" - -#: src/stored/append.c:495 -#, c-format -msgid "Error updating file attributes. ERR=%s\n" -msgstr "" - -#: src/stored/askdir.c:174 -msgid "Network error on bnet_recv in req_vol_info.\n" -msgstr "" - -#: src/stored/askdir.c:198 -#, c-format -msgid "Error getting Volume info: %s" -msgstr "" - -#: src/stored/askdir.c:433 -#, c-format -msgid "Didn't get vol info vol=%s: ERR=%s" -msgstr "" - -#: src/stored/askdir.c:531 -#, c-format -msgid "Error creating JobMedia record: ERR=%s\n" -msgstr "" - -#: src/stored/askdir.c:538 -#, c-format -msgid "Error creating JobMedia record: %s\n" -msgstr "" - -#: src/stored/askdir.c:630 -#, c-format -msgid "Job %s canceled while waiting for mount on Storage Device \"%s\".\n" -msgstr "" - -#: src/stored/askdir.c:643 -#, c-format -msgid "" -"Job %s is waiting. Cannot find any appendable volumes.\n" -"Please use the \"label\" command to create a new Volume for:\n" -" Storage: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" - -#: src/stored/askdir.c:668 src/stored/askdir.c:780 -#, c-format -msgid "Max time exceeded waiting to mount Storage Device %s for Job %s\n" -msgstr "" - -#: src/stored/askdir.c:679 -msgid "pthread error in mount_next_volume.\n" -msgstr "" - -#: src/stored/askdir.c:714 -msgid "Cannot request another volume: no volume name given.\n" -msgstr "" - -#: src/stored/askdir.c:720 -msgid "The current operation doesn't support mount request\n" -msgstr "" - -#: src/stored/askdir.c:727 -#, c-format -msgid "Job %s canceled while waiting for mount on Storage Device %s.\n" -msgstr "" - -#: src/stored/askdir.c:745 -#, c-format -msgid "" -"%sPlease mount append Volume \"%s\" or label a new one for:\n" -" Job: %s\n" -" Storage: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" - -#: src/stored/askdir.c:751 -#, c-format -msgid "" -"%sPlease mount read Volume \"%s\" for:\n" -" Job: %s\n" -" Storage: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" - -#: src/stored/askdir.c:758 -msgid "" -"\n" -"\n" -"WARNING: device is full! Please add more disk space then ...\n" -"\n" -msgstr "" - -#: src/stored/askdir.c:791 -msgid "pthread error in mount_volume\n" -msgstr "" - -#: src/stored/authenticate.c:77 -msgid "" -"Incorrect password given by Director.\n" -"For help, please see: " -msgstr "" - -#: src/stored/authenticate.c:103 -#, c-format -msgid "TLS negotiation failed with DIR at \"%s:%d\"\n" -msgstr "" - -#: src/stored/authenticate.c:121 -#, c-format -msgid "Unable to authenticate Director at %s.\n" -msgstr "" - -#: src/stored/authenticate.c:169 src/stored/authenticate.c:209 -#, c-format -msgid "" -"Incorrect authorization key from File daemon at %s rejected.\n" -"For help, please see: " -msgstr "" - -#: src/stored/authenticate.c:196 -#, c-format -msgid "TLS negotiation failed with FD at \"%s:%d\"\n" -msgstr "" - -#: src/stored/authenticate.c:277 -msgid "" -"Authorization key rejected by Storage daemon.\n" -"Please see " -msgstr "" - -#: src/stored/autochanger.c:67 -#, c-format -msgid "No Changer Name given for device %s. Cannot continue.\n" -msgstr "" - -#: src/stored/autochanger.c:73 -#, c-format -msgid "No Changer Command given for device %s. Cannot continue.\n" -msgstr "" - -#: src/stored/autochanger.c:142 -#, c-format -msgid "No slot defined in catalog (slot=%d) for Volume \"%s\" on %s.\n" -msgstr "" - -#: src/stored/autochanger.c:144 -msgid "Cartridge change or \"update slots\" may be required.\n" -msgstr "" - -#: src/stored/autochanger.c:150 -#, c-format -msgid "No \"Changer Device\" for %s. Manual load of Volume may be required.\n" -msgstr "" - -#: src/stored/autochanger.c:157 -#, c-format -msgid "No \"Changer Command\" for %s. Manual load of Volume may be requird.\n" -msgstr "" - -#: src/stored/autochanger.c:191 -#, c-format -msgid "3304 Issuing autochanger \"load slot %d, drive %d\" command.\n" -msgstr "" - -#: src/stored/autochanger.c:199 -#, c-format -msgid "3305 Autochanger \"load slot %d, drive %d\", status is OK.\n" -msgstr "" - -#: src/stored/autochanger.c:212 -#, c-format -msgid "" -"3992 Bad autochanger \"load slot %d, drive %d\": ERR=%s.\n" -"Results=%s\n" -msgstr "" - -#: src/stored/autochanger.c:275 -#, c-format -msgid "3301 Issuing autochanger \"loaded? drive %d\" command.\n" -msgstr "" - -#: src/stored/autochanger.c:287 -#, c-format -msgid "3302 Autochanger \"loaded? drive %d\", result is Slot %d.\n" -msgstr "" - -#: src/stored/autochanger.c:294 -#, c-format -msgid "3302 Autochanger \"loaded? drive %d\", result: nothing loaded.\n" -msgstr "" - -#: src/stored/autochanger.c:306 -#, c-format -msgid "" -"3991 Bad autochanger \"loaded? drive %d\" command: ERR=%s.\n" -"Results=%s\n" -msgstr "" - -#: src/stored/autochanger.c:326 -#, c-format -msgid "Lock failure on autochanger. ERR=%s\n" -msgstr "" - -#: src/stored/autochanger.c:340 -#, c-format -msgid "Unlock failure on autochanger. ERR=%s\n" -msgstr "" - -#: src/stored/autochanger.c:387 src/stored/autochanger.c:553 -#, c-format -msgid "3307 Issuing autochanger \"unload slot %d, drive %d\" command.\n" -msgstr "" - -#: src/stored/autochanger.c:400 -#, c-format -msgid "" -"3995 Bad autochanger \"unload slot %d, drive %d\": ERR=%s\n" -"Results=%s\n" -msgstr "" - -#: src/stored/autochanger.c:503 -#, c-format -msgid "Volume \"%s\" wanted on %s is in use by device %s\n" -msgstr "" - -#: src/stored/autochanger.c:570 -#, c-format -msgid "3997 Bad autochanger \"unload slot %d, drive %d\": ERR=%s.\n" -msgstr "" - -#: src/stored/autochanger.c:613 -#, c-format -msgid "3993 Device %s not an autochanger device.\n" -msgstr "" - -#: src/stored/autochanger.c:640 -#, c-format -msgid "3306 Issuing autochanger \"%s\" command.\n" -msgstr "" - -#: src/stored/autochanger.c:643 -msgid "3996 Open bpipe failed.\n" -msgstr "" - -#: src/stored/autochanger.c:670 -#, c-format -msgid "Autochanger error: ERR=%s\n" -msgstr "" - -#: src/stored/bcopy.c:62 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bcopy [-d debug_level] \n" -" -b bootstrap specify a bootstrap file\n" -" -c specify a Storage configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -i specify input Volume names (separated by |)\n" -" -o specify output Volume names (separated by |)\n" -" -p proceed inspite of errors\n" -" -v verbose\n" -" -w specify working directory (default /tmp)\n" -" -? print this message\n" -"\n" -msgstr "" - -#: src/stored/bcopy.c:149 src/stored/bextract.c:206 src/stored/bscan.c:236 -#: src/tools/bbatch.c:176 src/tools/bvfs_test.c:189 src/tools/cats_test.c:308 -msgid "Wrong number of arguments: \n" -msgstr "" - -#: src/stored/bcopy.c:193 src/stored/btape.c:468 src/stored/device.c:338 -#, c-format -msgid "dev open failed: %s\n" -msgstr "" - -#: src/stored/bcopy.c:208 -msgid "Write of last block failed.\n" -msgstr "" - -#: src/stored/bcopy.c:212 -#, c-format -msgid "%u Jobs copied. %u records copied.\n" -msgstr "" - -#: src/stored/bcopy.c:229 src/stored/bscan.c:419 -#, c-format -msgid "Record: SessId=%u SessTim=%u FileIndex=%d Stream=%d len=%u\n" -msgstr "" - -#: src/stored/bcopy.c:245 -msgid "Volume is prelabeled. This volume cannot be copied.\n" -msgstr "" - -#: src/stored/bcopy.c:248 -msgid "Volume label not copied.\n" -msgstr "" - -#: src/stored/bcopy.c:254 -msgid "Copy skipped. Record does not match BSR filter.\n" -msgstr "" - -#: src/stored/bcopy.c:271 src/stored/bcopy.c:279 src/stored/bcopy.c:307 -#: src/stored/btape.c:2755 -#, c-format -msgid "Cannot fixup device error. %s\n" -msgstr "" - -#: src/stored/bcopy.c:285 -msgid "EOM label not copied.\n" -msgstr "" - -#: src/stored/bcopy.c:288 -msgid "EOT label not copied.\n" -msgstr "" - -#: src/stored/bcopy.c:321 src/stored/bls.c:439 src/stored/read_records.c:392 -msgid "Fresh Volume Label" -msgstr "" - -#: src/stored/bcopy.c:324 src/stored/bls.c:442 src/stored/read_records.c:395 -msgid "Volume Label" -msgstr "" - -#: src/stored/bcopy.c:328 src/stored/bls.c:446 src/stored/label.c:1332 -msgid "Begin Job Session" -msgstr "" - -#: src/stored/bcopy.c:332 src/stored/bls.c:451 src/stored/label.c:1335 -msgid "End Job Session" -msgstr "" - -#: src/stored/bcopy.c:337 src/stored/bls.c:455 -msgid "End of Medium" -msgstr "" - -#: src/stored/bcopy.c:340 src/stored/bls.c:467 src/stored/label.c:1344 -msgid "Unknown" -msgstr "" - -#: src/stored/bcopy.c:346 src/stored/bls.c:474 src/stored/read_records.c:413 -#, c-format -msgid "%s Record: VolSessionId=%d VolSessionTime=%d JobId=%d DataLen=%d\n" -msgstr "" - -#: src/stored/bcopy.c:364 src/stored/bextract.c:721 src/stored/bls.c:493 -#: src/stored/bscan.c:1359 src/stored/btape.c:3049 -#, c-format -msgid "Mount Volume \"%s\" on device %s and press return when ready: " -msgstr "" - -#: src/stored/bextract.c:80 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bextract \n" -" -b specify a bootstrap file\n" -" -c specify a Storage configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -T send debug traces to trace file\n" -" -e exclude list\n" -" -i include list\n" -" -p proceed inspite of I/O errors\n" -" -t read data from volume, do not write anything\n" -" -v verbose\n" -" -V specify Volume names (separated by |)\n" -" -? print this message\n" -"\n" -msgstr "" - -#: src/stored/bextract.c:156 src/stored/bls.c:143 -#, c-format -msgid "Could not open exclude file: %s, ERR=%s\n" -msgstr "" - -#: src/stored/bextract.c:171 src/stored/bls.c:158 -#, c-format -msgid "Could not open include file: %s, ERR=%s\n" -msgstr "" - -#: src/stored/bextract.c:231 -#, c-format -msgid "%d Program Name and/or Program Data Stream records ignored.\n" -msgstr "" - -#: src/stored/bextract.c:235 -#, c-format -msgid "%d Win32 data or Win32 gzip data stream records. Ignored.\n" -msgstr "" - -#: src/stored/bextract.c:263 -#, c-format -msgid "Cannot stat %s. It must exist. ERR=%s\n" -msgstr "" - -#: src/stored/bextract.c:267 -#, c-format -msgid "%s must be a directory.\n" -msgstr "" - -#: src/stored/bextract.c:296 -#, c-format -msgid "%u files restored.\n" -msgstr "" - -#: src/stored/bextract.c:298 -#, c-format -msgid "Found %s error%s\n" -msgstr "" - -#: src/stored/bextract.c:309 src/stored/bextract.c:315 -#, c-format -msgid "Write error on %s: %s\n" -msgstr "" - -#: src/stored/bextract.c:346 src/stored/read.c:163 src/stored/read.c:290 -#: src/stored/vbackup.c:265 -msgid "Cannot do rehydration, device is not dedup aware\n" -msgstr "" - -#: src/stored/bextract.c:354 -#, c-format -msgid "" -"Got rehydration error at file=%d record=%s fname=%s volsessionid=%d " -"volsessiontime=%d Msg=%s" -msgstr "" - -#: src/stored/bextract.c:388 src/stored/bextract.c:426 src/stored/bls.c:400 -#: src/stored/bscan.c:679 -msgid "Cannot continue.\n" -msgstr "" - -#: src/stored/bextract.c:419 src/stored/bextract.c:691 -msgid "Logic error output file should be open but is not.\n" -msgstr "" - -#: src/stored/bextract.c:446 -#, c-format -msgid "%s was deleted.\n" -msgstr "" - -#: src/stored/bextract.c:495 -#, c-format -msgid "Seek error on %s: %s\n" -msgstr "" - -#: src/stored/bextract.c:550 -#, c-format -msgid "Uncompression error. ERR=%d\n" -msgstr "" - -#: src/stored/bextract.c:619 -#, c-format -msgid "Compressed header version error. version=0x%x\n" -msgstr "" - -#: src/stored/bextract.c:648 -#, c-format -msgid "LZO uncompression error. ERR=%d\n" -msgstr "" - -#: src/stored/bextract.c:682 -msgid "Got Program Name or Data Stream. Ignored.\n" -msgstr "" - -#: src/stored/block.c:100 -msgid "Error writing final JobMedia record to catalog.\n" -msgstr "" - -#: src/stored/block.c:148 -#, c-format -msgid "Cannot write block. Device at EOM. dev=%s\n" -msgstr "" - -#: src/stored/block.c:153 -#, c-format -msgid "Attempt to write on read-only Volume. dev=%s\n" -msgstr "" - -#: src/stored/block.c:159 -#, c-format -msgid "Attempt to write on closed device=%s\n" -msgstr "" - -#: src/stored/block.c:198 -#, c-format -msgid "Unable to write EOF. ERR=%s\n" -msgstr "" - -#: src/stored/block.c:234 src/stored/block.c:292 -msgid "Write block header zeroed.\n" -msgstr "" - -#: src/stored/block.c:284 -#, c-format -msgid "Block checksum changed during write: before=%ud after=%ud\n" -msgstr "" - -#: src/stored/block.c:311 -#, c-format -msgid "Write error at %u:%u on device %s. ERR=%s.\n" -msgstr "" - -#: src/stored/block.c:321 -#, c-format -msgid "" -"Out of freespace caused End of Volume \"%s\" at %u:%u on device %s. Write of " -"%u bytes got %d.\n" -msgstr "" - -#: src/stored/block.c:326 -#, c-format -msgid "End of Volume \"%s\" at %u:%u on device %s. Write of %u bytes got %d.\n" -msgstr "" - -#: src/stored/block.c:456 -msgid "Job failed or canceled.\n" -msgstr "" - -#: src/stored/block.c:462 -msgid "Attempt to read past end of tape or file.\n" -msgstr "" - -#: src/stored/block.c:470 -#, c-format -msgid "Attempt to read closed device: fd=%d at file:blk %u:%u on device %s\n" -msgstr "" - -#: src/stored/block.c:483 -#, c-format -msgid "Block buffer size looping problem on device %s\n" -msgstr "" - -#: src/stored/block.c:498 -#, c-format -msgid "Unable to open device part=%d %s: ERR=%s\n" -msgstr "" - -#: src/stored/block.c:534 -#, c-format -msgid "The Volume=%s on device=%s appears to be unlabeled.\n" -msgstr "" - -#: src/stored/block.c:537 -#, c-format -msgid "Read error on fd=%d at file:blk %u:%u on device %s. ERR=%s.\n" -msgstr "" - -#: src/stored/block.c:548 -#, c-format -msgid "The %sVolume=%s on device=%s appears to be unlabeled.\n" -msgstr "" - -#: src/stored/block.c:551 -#, c-format -msgid "Read zero %sbytes Vol=%s at %lld on device %s.\n" -msgstr "" - -#: src/stored/block.c:585 -#, c-format -msgid "" -"Volume data error at %u:%u! Very short block of %d bytes on device %s " -"discarded.\n" -msgstr "" - -#: src/stored/block.c:613 -#, c-format -msgid "Block length %u is greater than buffer %u. Attempting recovery.\n" -msgstr "" - -#: src/stored/block.c:633 -#, c-format -msgid "Setting block buffer size to %u bytes.\n" -msgstr "" - -#: src/stored/block.c:648 -#, c-format -msgid "" -"Volume data error at %u:%u! Short block of %d bytes on device %s discarded.\n" -msgstr "" - -#: src/stored/block_util.c:93 -#, c-format -msgid "" -"Dump block %s %p: adata=%d size=%d BlkNum=%d\n" -" Hdrcksum=%x cksum=%x\n" -msgstr "" - -#: src/stored/block_util.c:118 -#, c-format -msgid " Rec: VId=%u VT=%u FI=%s Strm=%s len=%d reclen=%d\n" -msgstr "" - -#: src/stored/block_util.c:203 -#, c-format -msgid "%d block read errors not printed.\n" -msgstr "" - -#: src/stored/block_util.c:341 -#, c-format -msgid "" -"Volume data error at %lld!\n" -"Adata block checksum mismatch in block=%u len=%d: calc=%x blk=%x\n" -msgstr "" - -#: src/stored/block_util.c:376 src/stored/block_util.c:394 -#: src/stored/block_util.c:404 -#, c-format -msgid "" -"Volume data error at %u:%u! Wanted ID: \"%s\", got \"%s\". Buffer " -"discarded.\n" -msgstr "" - -#: src/stored/block_util.c:419 -#, c-format -msgid "" -"Volume data error at %u:%u! Block length %u is insane (too large), probably " -"due to a bad archive.\n" -msgstr "" - -#: src/stored/block_util.c:446 -#, c-format -msgid "" -"Volume data error at %u:%u!\n" -"Block checksum mismatch in block=%u len=%d: calc=%x blk=%x\n" -msgstr "" - -#: src/stored/block_util.c:542 -#, c-format -msgid "" -"User defined maximum volume size %s will be exceeded on device %s.\n" -" Marking Volume \"%s\" as Full.\n" -msgstr "" - -#: src/stored/block_util.c:579 src/stored/block_util.c:585 -#, c-format -msgid "Backspace file at EOT failed. ERR=%s\n" -msgstr "" - -#: src/stored/block_util.c:592 -#, c-format -msgid "Backspace record at EOT failed. ERR=%s\n" -msgstr "" - -#: src/stored/block_util.c:609 -#, c-format -msgid "Re-read last block at EOT failed. ERR=%s" -msgstr "" - -#: src/stored/block_util.c:619 -#, c-format -msgid "" -"Re-read of last block: block numbers differ by more than one.\n" -"Probable tape misconfiguration and data loss. Read block=%u Want block=%u.\n" -msgstr "" - -#: src/stored/block_util.c:624 -#, c-format -msgid "" -"Re-read of last block OK, but block numbers differ. Read block=%u Want block=" -"%u.\n" -msgstr "" - -#: src/stored/block_util.c:628 -msgid "Re-read of last block succeeded.\n" -msgstr "" - -#: src/stored/block_util.c:677 -#, c-format -msgid "" -"Error writing final EOF to tape. This Volume may not be readable.\n" -"%s" -msgstr "" - -#: src/stored/block_util.c:695 -msgid "Error sending Volume info to Director.\n" -msgstr "" - -#: src/stored/block_util.c:815 -#, c-format -msgid "" -"Error while writing, current part number is less than the total number of " -"parts (%d/%d, device=%s)\n" -msgstr "" - -#: src/stored/block_util.c:823 -#, c-format -msgid "Unable to open device next part %s: ERR=%s\n" -msgstr "" - -#: src/stored/block_util.c:843 -#, c-format -msgid "" -"End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, " -"free_space_errno=%d, errmsg=%s).\n" -msgstr "" - -#: src/stored/block_util.c:856 -#, c-format -msgid "" -"End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, " -"free_space_errno=%d).\n" -msgstr "" - -#: src/stored/bls.c:68 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bls [options] \n" -" -b specify a bootstrap file\n" -" -c specify a Storage configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -e exclude list\n" -" -i include list\n" -" -j list jobs\n" -" -k list blocks\n" -" (no j or k option) list saved files\n" -" -L dump label\n" -" -p proceed inspite of errors\n" -" -v be verbose\n" -" -V specify Volume names (separated by |)\n" -" -E Check records to detect errors\n" -" -? print this message\n" -"\n" -msgstr "" - -#: src/stored/bls.c:205 -msgid "No archive name specified\n" -msgstr "" - -#: src/stored/bls.c:244 -#, c-format -msgid "" -"\n" -"Warning, this Volume is a continuation of Volume %s\n" -msgstr "" - -#: src/stored/bls.c:291 -#, c-format -msgid "Got EOM at file %u on device %s, Volume \"%s\"\n" -msgstr "" - -#: src/stored/bls.c:302 -#, c-format -msgid "Mounted Volume \"%s\".\n" -msgstr "" - -#: src/stored/bls.c:304 -#, c-format -msgid "End of file %u on device %s, Volume \"%s\"\n" -msgstr "" - -#: src/stored/bls.c:329 -#, c-format -msgid "" -"File:blk=%u:%u blk_num=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=" -"%s rlen=%d\n" -msgstr "" - -#: src/stored/bls.c:338 -#, c-format -msgid "Block: %d size=%d\n" -msgstr "" - -#: src/stored/bls.c:402 -msgid "Attrib unpack error!\n" -msgstr "" - -#: src/stored/bls.c:413 -#, c-format -msgid "FileIndex=%d VolSessionId=%d VolSessionTime=%d Stream=%d DataLen=%d\n" -msgstr "" - -#: src/stored/bls.c:458 -msgid "End of Physical Medium" -msgstr "" - -#: src/stored/bls.c:461 -msgid "Start of object" -msgstr "" - -#: src/stored/bls.c:464 -msgid "End of object" -msgstr "" - -#: src/stored/bscan.c:105 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bscan [ options ] \n" -" -b bootstrap specify a bootstrap file\n" -" -c specify configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -m update media info in database\n" -" -D specify the driver database name (default NULL)\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database password (default none)\n" -" -h specify database host (default NULL)\n" -" -t specify database port (default 0)\n" -" -p proceed inspite of I/O errors\n" -" -r list records\n" -" -s synchronize or store in database\n" -" -S show scan progress periodically\n" -" -v verbose\n" -" -V specify Volume names (separated by |)\n" -" -w specify working directory (default from conf file)\n" -" -? print this message\n" -"\n" -msgstr "" - -#: src/stored/bscan.c:254 src/stored/bsdjson.c:481 src/stored/stored.c:349 -#, c-format -msgid "No Working Directory defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bscan.c:262 -#, c-format -msgid "Working Directory: %s not found. Cannot continue.\n" -msgstr "" - -#: src/stored/bscan.c:266 -#, c-format -msgid "Working Directory: %s is not a directory. Cannot continue.\n" -msgstr "" - -#: src/stored/bscan.c:280 src/stored/bscan.c:363 -#, c-format -msgid "First Volume Size = %s\n" -msgstr "" - -#: src/stored/bscan.c:299 src/tools/bbatch.c:243 src/tools/bvfs_test.c:212 -#, c-format -msgid "Using Database: %s, User: %s\n" -msgstr "" - -#: src/stored/bscan.c:334 -#, c-format -msgid "Create JobMedia for Job %s\n" -msgstr "" - -#: src/stored/bscan.c:344 -#, c-format -msgid "Could not create JobMedia record for Volume=%s Job=%s\n" -msgstr "" - -#: src/stored/bscan.c:411 -#, c-format -msgid "done: %d%%\n" -msgstr "" - -#: src/stored/bscan.c:435 -msgid "Volume is prelabeled. This tape cannot be scanned.\n" -msgstr "" - -#: src/stored/bscan.c:447 -#, c-format -msgid "Pool record for %s found in DB.\n" -msgstr "" - -#: src/stored/bscan.c:451 -#, c-format -msgid "VOL_LABEL: Pool record not found for Pool: %s\n" -msgstr "" - -#: src/stored/bscan.c:457 -#, c-format -msgid "VOL_LABEL: PoolType mismatch. DB=%s Vol=%s\n" -msgstr "" - -#: src/stored/bscan.c:461 -#, c-format -msgid "Pool type \"%s\" is OK.\n" -msgstr "" - -#: src/stored/bscan.c:471 -#, c-format -msgid "Media record for %s found in DB.\n" -msgstr "" - -#: src/stored/bscan.c:478 -#, c-format -msgid "VOL_LABEL: Media record not found for Volume: %s\n" -msgstr "" - -#: src/stored/bscan.c:485 -#, c-format -msgid "VOL_LABEL: MediaType mismatch. DB=%s Vol=%s\n" -msgstr "" - -#: src/stored/bscan.c:489 -#, c-format -msgid "Media type \"%s\" is OK.\n" -msgstr "" - -#: src/stored/bscan.c:499 -#, c-format -msgid "VOL_LABEL: OK for Volume: %s\n" -msgstr "" - -#: src/stored/bscan.c:506 -#, c-format -msgid "%d \"errors\" ignored before first Start of Session record.\n" -msgstr "" - -#: src/stored/bscan.c:517 -#, c-format -msgid "SOS_LABEL: Found Job record for JobId: %d\n" -msgstr "" - -#: src/stored/bscan.c:522 -#, c-format -msgid "SOS_LABEL: Job record not found for JobId: %d\n" -msgstr "" - -#: src/stored/bscan.c:562 -#, c-format -msgid "SOS_LABEL: VolSessId mismatch for JobId=%u. DB=%d Vol=%d\n" -msgstr "" - -#: src/stored/bscan.c:568 -#, c-format -msgid "SOS_LABEL: VolSessTime mismatch for JobId=%u. DB=%d Vol=%d\n" -msgstr "" - -#: src/stored/bscan.c:574 -#, c-format -msgid "SOS_LABEL: PoolId mismatch for JobId=%u. DB=%d Vol=%d\n" -msgstr "" - -#: src/stored/bscan.c:592 src/stored/bscan.c:1146 -#, c-format -msgid "Could not find SessId=%d SessTime=%d for EOS record.\n" -msgstr "" - -#: src/stored/bscan.c:638 -#, c-format -msgid "Could not update job record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:649 -#, c-format -msgid "End of all Volumes. VolFiles=%u VolBlocks=%u VolBytes=%s\n" -msgstr "" - -#: src/stored/bscan.c:661 -#, c-format -msgid "Could not find Job for SessId=%d SessTime=%d record.\n" -msgstr "" - -#: src/stored/bscan.c:692 -#, c-format -msgid "%s file records. At file:blk=%s:%s bytes=%s\n" -msgstr "" - -#: src/stored/bscan.c:757 -#, c-format -msgid "Got MD5 record: %s\n" -msgstr "" - -#: src/stored/bscan.c:765 -#, c-format -msgid "Got SHA1 record: %s\n" -msgstr "" - -#: src/stored/bscan.c:773 -#, c-format -msgid "Got SHA256 record: %s\n" -msgstr "" - -#: src/stored/bscan.c:781 -#, c-format -msgid "Got SHA512 record: %s\n" -msgstr "" - -#: src/stored/bscan.c:789 src/stored/bscan.c:796 -msgid "Got signed digest record\n" -msgstr "" - -#: src/stored/bscan.c:802 -#, c-format -msgid "Got Prog Names Stream: %s\n" -msgstr "" - -#: src/stored/bscan.c:808 -msgid "Got Prog Data Stream record.\n" -msgstr "" - -#: src/stored/bscan.c:853 -#, c-format -msgid "Unknown stream type!!! stream=%d len=%i\n" -msgstr "" - -#: src/stored/bscan.c:915 -#, c-format -msgid "Could not create File Attributes record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:921 -#, c-format -msgid "Created File record: %s\n" -msgstr "" - -#: src/stored/bscan.c:966 -#, c-format -msgid "Could not create media record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:970 src/stored/bscan.c:991 -#, c-format -msgid "Could not update media record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:974 -#, c-format -msgid "Created Media record for Volume: %s\n" -msgstr "" - -#: src/stored/bscan.c:995 -#, c-format -msgid "Updated Media record at end of Volume: %s\n" -msgstr "" - -#: src/stored/bscan.c:1012 -#, c-format -msgid "Could not create pool record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1016 -#, c-format -msgid "Created Pool record for Pool: %s\n" -msgstr "" - -#: src/stored/bscan.c:1035 -#, c-format -msgid "Could not get Client record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1045 -#, c-format -msgid "Created Client record for Client: %s\n" -msgstr "" - -#: src/stored/bscan.c:1062 -#, c-format -msgid "Fileset \"%s\" already exists.\n" -msgstr "" - -#: src/stored/bscan.c:1066 -#, c-format -msgid "Could not create FileSet record \"%s\". ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1071 -#, c-format -msgid "Created FileSet record \"%s\"\n" -msgstr "" - -#: src/stored/bscan.c:1118 -#, c-format -msgid "Could not create JobId record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1124 -#, c-format -msgid "Could not update job start record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1127 -#, c-format -msgid "Created new JobId=%u record for original JobId=%u\n" -msgstr "" - -#: src/stored/bscan.c:1180 -#, c-format -msgid "Could not update JobId=%u record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1185 -#, c-format -msgid "Updated Job termination record for JobId=%u Level=%s TermStat=%c\n" -msgstr "" - -#: src/stored/bscan.c:1210 -#, c-format -msgid "Job Termination code: %d" -msgstr "" - -#: src/stored/bscan.c:1215 -#, c-format -msgid "" -"%s\n" -"JobId: %d\n" -"Job: %s\n" -"FileSet: %s\n" -"Backup Level: %s\n" -"Client: %s\n" -"Start time: %s\n" -"End time: %s\n" -"Files Written: %s\n" -"Bytes Written: %s\n" -"Volume Session Id: %d\n" -"Volume Session Time: %d\n" -"Last Volume Bytes: %s\n" -"Termination: %s\n" -"\n" -msgstr "" - -#: src/stored/bscan.c:1273 -#, c-format -msgid "Could not create JobMedia record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1277 -#, c-format -msgid "Created JobMedia record JobId %d, MediaId %d\n" -msgstr "" - -#: src/stored/bscan.c:1293 -#, c-format -msgid "Could not find SessId=%d SessTime=%d for MD5/SHA1 record.\n" -msgstr "" - -#: src/stored/bscan.c:1307 -#, c-format -msgid "Could not add MD5/SHA1 to File record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1312 -msgid "Updated MD5/SHA1 record\n" -msgstr "" - -#: src/stored/bsdjson.c:74 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bsdjson [options] [-c config_file] [config_file]\n" -" -r get resource type \n" -" -n get resource \n" -" -l get only directives matching dirs (use with -r)\n" -" -D get only data\n" -" -c use as configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -t test - read config and exit\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" - -#: src/stored/bsdjson.c:450 src/stored/butil.c:78 src/stored/stored.c:318 -#, c-format -msgid "No Storage resource defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bsdjson.c:456 src/stored/stored.c:324 -#, c-format -msgid "Only one Storage resource permitted in %s\n" -msgstr "" - -#: src/stored/bsdjson.c:461 src/stored/stored.c:329 -#, c-format -msgid "No Director resource defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bsdjson.c:466 src/stored/stored.c:334 -#, c-format -msgid "No Device resource defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bsdjson.c:474 src/stored/stored.c:342 -#, c-format -msgid "No Messages resource defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bsdjson.c:503 src/stored/stored.c:371 -#, c-format -msgid "\"TLS Certificate\" file not defined for Storage \"%s\" in %s.\n" -msgstr "" - -#: src/stored/bsdjson.c:509 src/stored/stored.c:377 -#, c-format -msgid "\"TLS Key\" file not defined for Storage \"%s\" in %s.\n" -msgstr "" - -#: src/stored/bsdjson.c:515 src/stored/stored.c:383 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Storage \"%s\" in %s. At least one CA certificate store is required when " -"using \"TLS Verify Peer\".\n" -msgstr "" - -#: src/stored/btape.c:165 src/stored/stored.c:132 -#, c-format -msgid "Tape block size (%d) not multiple of system size (%d)\n" -msgstr "" - -#: src/stored/btape.c:169 src/stored/stored.c:136 -#, c-format -msgid "Tape block size (%d) is not a power of 2\n" -msgstr "" - -#: src/stored/btape.c:172 -#, c-format -msgid "" -"\n" -"\n" -"!!!! Warning large disk addressing disabled. boffset_t=%d should be 8 or " -"more !!!!!\n" -"\n" -"\n" -msgstr "" - -#: src/stored/btape.c:179 -#, c-format -msgid "32 bit printf/scanf problem. i=%d x32=%u y32=%u\n" -msgstr "" - -#: src/stored/btape.c:188 -msgid "64 bit printf/scanf problem. i=%d x64=%" -msgstr "" - -#: src/stored/btape.c:193 -#, c-format -msgid "Tape block granularity is %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:269 -msgid "No archive name specified.\n" -msgstr "" - -#: src/stored/btape.c:273 -msgid "Improper number of arguments specified.\n" -msgstr "" - -#: src/stored/btape.c:287 -msgid "btape does not work with DVD storage.\n" -msgstr "" - -#: src/stored/btape.c:292 -msgid "btape only works with tape storage.\n" -msgstr "" - -#: src/stored/btape.c:378 -#, c-format -msgid "Total Volume bytes=%sB. Total Write rate = %sB/s\n" -msgstr "" - -#: src/stored/btape.c:404 -#, c-format -msgid "Volume bytes=%sB. Write rate = %sB/s\n" -msgstr "" - -#: src/stored/btape.c:472 -#, c-format -msgid "open device %s: OK\n" -msgstr "" - -#: src/stored/btape.c:495 -msgid "Enter Volume Name: " -msgstr "" - -#: src/stored/btape.c:502 -#, c-format -msgid "Device open failed. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:507 -#, c-format -msgid "Wrote Volume label for volume \"%s\".\n" -msgstr "" - -#: src/stored/btape.c:521 -msgid "Volume has no label.\n" -msgstr "" - -#: src/stored/btape.c:524 -msgid "Volume label read correctly.\n" -msgstr "" - -#: src/stored/btape.c:527 -#, c-format -msgid "I/O error on device: ERR=%s" -msgstr "" - -#: src/stored/btape.c:530 -#, c-format -msgid "Volume type error: ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:533 -msgid "Volume name error\n" -msgstr "" - -#: src/stored/btape.c:536 -#, c-format -msgid "Error creating label. ERR=%s" -msgstr "" - -#: src/stored/btape.c:539 -msgid "Volume version error.\n" -msgstr "" - -#: src/stored/btape.c:542 -msgid "Bad Volume label type.\n" -msgstr "" - -#: src/stored/btape.c:545 -msgid "Unknown error.\n" -msgstr "" - -#: src/stored/btape.c:563 -#, c-format -msgid "Bad status from load. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:565 -#, c-format -msgid "Loaded %s\n" -msgstr "" - -#: src/stored/btape.c:574 src/stored/btape.c:1137 src/stored/btape.c:1210 -#: src/stored/btape.c:1289 src/stored/btape.c:1559 -#, c-format -msgid "Bad status from rewind. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:577 src/stored/btape.c:1567 -#, c-format -msgid "Rewound %s\n" -msgstr "" - -#: src/stored/btape.c:603 src/stored/btape.c:1571 -#, c-format -msgid "Bad status from weof. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:607 -#, c-format -msgid "Wrote 1 EOF to %s\n" -msgstr "" - -#: src/stored/btape.c:610 -#, c-format -msgid "Wrote %d EOFs to %s\n" -msgstr "" - -#: src/stored/btape.c:628 -msgid "Moved to end of medium.\n" -msgstr "" - -#: src/stored/btape.c:655 -#, c-format -msgid "Bad status from bsf. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:657 -#, c-format -msgid "Backspaced %d file%s.\n" -msgstr "" - -#: src/stored/btape.c:674 -#, c-format -msgid "Bad status from bsr. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:676 -#, c-format -msgid "Backspaced %d record%s.\n" -msgstr "" - -#: src/stored/btape.c:686 src/stored/status.c:626 -#, c-format -msgid "Configured device capabilities:\n" -msgstr "" - -#: src/stored/btape.c:704 -#, c-format -msgid "Device status:\n" -msgstr "" - -#: src/stored/btape.c:718 src/stored/status.c:682 -#, c-format -msgid "Device parameters:\n" -msgstr "" - -#: src/stored/btape.c:723 -#, c-format -msgid "Status:\n" -msgstr "" - -#: src/stored/btape.c:738 -msgid "" -"Test writing larger and larger records.\n" -"This is a torture test for records.\n" -"I am going to write\n" -"larger and larger records. It will stop when the record size\n" -"plus the header exceeds the block size (by default about 64K)\n" -msgstr "" - -#: src/stored/btape.c:744 -msgid "Do you want to continue? (y/n): " -msgstr "" - -#: src/stored/btape.c:746 src/stored/btape.c:2196 -msgid "Command aborted.\n" -msgstr "" - -#: src/stored/btape.c:763 -#, c-format -msgid "Block %d i=%d\n" -msgstr "" - -#: src/stored/btape.c:790 -msgid "Skipping read backwards test because BSR turned off.\n" -msgstr "" - -#: src/stored/btape.c:794 -msgid "" -"\n" -"=== Write, backup, and re-read test ===\n" -"\n" -"I'm going to write three records and an EOF\n" -"then backup over the EOF and re-read the last record.\n" -"Bacula does this after writing the last block on the\n" -"tape to verify that the block was written correctly.\n" -"\n" -"This is not an *essential* feature ...\n" -"\n" -msgstr "" - -#: src/stored/btape.c:807 src/stored/btape.c:818 src/stored/btape.c:829 -#: src/stored/btape.c:1147 src/stored/btape.c:1163 src/stored/btape.c:1903 -#: src/stored/btape.c:2822 -msgid "Error writing record to block.\n" -msgstr "" - -#: src/stored/btape.c:811 src/stored/btape.c:822 src/stored/btape.c:833 -#: src/stored/btape.c:1151 src/stored/btape.c:1167 src/stored/btape.c:1907 -#: src/stored/btape.c:2826 -msgid "Error writing block to device.\n" -msgstr "" - -#: src/stored/btape.c:814 -#, c-format -msgid "Wrote first record of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:825 -#, c-format -msgid "Wrote second record of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:836 -#, c-format -msgid "Wrote third record of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:843 src/stored/btape.c:848 -#, c-format -msgid "Backspace file failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:852 -msgid "Backspaced over EOF OK.\n" -msgstr "" - -#: src/stored/btape.c:854 -#, c-format -msgid "Backspace record failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:857 -msgid "Backspace record OK.\n" -msgstr "" - -#: src/stored/btape.c:859 src/stored/btape.c:865 -#, c-format -msgid "Read block failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:870 -msgid "Bad data in record. Test failed!\n" -msgstr "" - -#: src/stored/btape.c:874 -msgid "" -"\n" -"Block re-read correct. Test succeeded!\n" -msgstr "" - -#: src/stored/btape.c:875 -msgid "" -"=== End Write, backup, and re-read test ===\n" -"\n" -msgstr "" - -#: src/stored/btape.c:882 -msgid "" -"This is not terribly serious since Bacula only uses\n" -"this function to verify the last block written to the\n" -"tape. Bacula will skip the last block verification\n" -"if you add:\n" -"\n" -"Backward Space Record = No\n" -"\n" -"to your Storage daemon's Device resource definition.\n" -msgstr "" - -#: src/stored/btape.c:904 -#, c-format -msgid "Begin writing %i files of %sB with raw blocks of %u bytes.\n" -msgstr "" - -#: src/stored/btape.c:925 src/stored/btape.c:2878 -#, c-format -msgid "Write failed at block %u. stat=%d ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:959 -#, c-format -msgid "Begin writing %i files of %sB with blocks of %u bytes.\n" -msgstr "" - -#: src/stored/btape.c:968 -msgid "" -"\n" -"Error writing record to block.\n" -msgstr "" - -#: src/stored/btape.c:972 -msgid "" -"\n" -"Error writing block to device.\n" -msgstr "" - -#: src/stored/btape.c:1027 -msgid "The file_size is too big, stop this test with Ctrl-c.\n" -msgstr "" - -#: src/stored/btape.c:1055 -msgid "Test with zero data, should give the maximum throughput.\n" -msgstr "" - -#: src/stored/btape.c:1067 src/stored/btape.c:1093 -msgid "Test with random data, should give the minimum throughput.\n" -msgstr "" - -#: src/stored/btape.c:1082 -msgid "Test with zero data and bacula block structure.\n" -msgstr "" - -#: src/stored/btape.c:1123 -#, c-format -msgid "" -"\n" -"=== Write, rewind, and re-read test ===\n" -"\n" -"I'm going to write %d records and an EOF\n" -"then write %d records and an EOF, then rewind,\n" -"and re-read the data to verify that it is correct.\n" -"\n" -"This is an *essential* feature ...\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1155 src/stored/btape.c:1171 -#, c-format -msgid "Wrote %d blocks of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:1213 src/stored/btape.c:1292 -msgid "Rewind OK.\n" -msgstr "" - -#: src/stored/btape.c:1225 src/stored/btape.c:1343 -msgid "Got EOF on tape.\n" -msgstr "" - -#: src/stored/btape.c:1230 -#, c-format -msgid "Read block %d failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1236 -#, c-format -msgid "Read record failed. Block %d! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1242 src/stored/btape.c:1373 -#, c-format -msgid "Bad data in record. Expected %d, got %d at byte %d. Test failed!\n" -msgstr "" - -#: src/stored/btape.c:1249 -#, c-format -msgid "%d blocks re-read correctly.\n" -msgstr "" - -#: src/stored/btape.c:1252 src/stored/btape.c:1380 -msgid "" -"=== Test Succeeded. End Write, rewind, and re-read test ===\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1280 -msgid "Block position test\n" -msgstr "" - -#: src/stored/btape.c:1335 -#, c-format -msgid "Reposition to file:block %d:%d\n" -msgstr "" - -#: src/stored/btape.c:1337 -msgid "Reposition error.\n" -msgstr "" - -#: src/stored/btape.c:1349 -#, c-format -msgid "" -"Read block %d failed! file=%d blk=%d. ERR=%s\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1351 -msgid "" -"This may be because the tape drive block size is not\n" -" set to variable blocking as normally used by Bacula.\n" -" Please see the Tape Testing chapter in the manual and \n" -" look for using mt with defblksize and setoptions\n" -"If your tape drive block size is correct, then perhaps\n" -" your SCSI driver is *really* stupid and does not\n" -" correctly report the file:block after a FSF. In this\n" -" case try setting:\n" -" Fast Forward Space File = no\n" -" in your Device resource.\n" -msgstr "" - -#: src/stored/btape.c:1367 -#, c-format -msgid "Read record failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1378 -#, c-format -msgid "Block %d re-read correctly.\n" -msgstr "" - -#: src/stored/btape.c:1399 -msgid "" -"\n" -"\n" -"=== Append files test ===\n" -"\n" -"This test is essential to Bacula.\n" -"\n" -"I'm going to write one record in file 0,\n" -" two records in file 1,\n" -" and three records in file 2\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1423 -msgid "Now moving to end of medium.\n" -msgstr "" - -#: src/stored/btape.c:1425 src/stored/btape.c:1654 -#, c-format -msgid "We should be in file 3. I am at file %d. %s\n" -msgstr "" - -#: src/stored/btape.c:1426 src/stored/btape.c:1444 src/stored/btape.c:1643 -#: src/stored/btape.c:1655 src/stored/btape.c:1668 src/stored/btape.c:1685 -msgid "This is correct!" -msgstr "" - -#: src/stored/btape.c:1426 src/stored/btape.c:1444 src/stored/btape.c:1643 -#: src/stored/btape.c:1655 src/stored/btape.c:1668 src/stored/btape.c:1685 -msgid "This is NOT correct!!!!" -msgstr "" - -#: src/stored/btape.c:1432 -msgid "" -"\n" -"Now the important part, I am going to attempt to append to the tape.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1439 -msgid "" -"Done appending, there should be no I/O errors\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1440 -msgid "Doing Bacula scan of blocks:\n" -msgstr "" - -#: src/stored/btape.c:1442 -msgid "End scanning the tape.\n" -msgstr "" - -#: src/stored/btape.c:1443 src/stored/btape.c:1667 -#, c-format -msgid "We should be in file 4. I am at file %d. %s\n" -msgstr "" - -#: src/stored/btape.c:1468 -msgid "" -"\n" -"Autochanger enabled, but no name or no command device specified.\n" -msgstr "" - -#: src/stored/btape.c:1472 -msgid "" -"\n" -"Ah, I see you have an autochanger configured.\n" -"To test the autochanger you must have a blank tape\n" -" that I can write on in Slot 1.\n" -msgstr "" - -#: src/stored/btape.c:1475 -msgid "" -"\n" -"Do you wish to continue with the Autochanger test? (y/n): " -msgstr "" - -#: src/stored/btape.c:1482 -msgid "" -"\n" -"\n" -"=== Autochanger test ===\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1491 -msgid "3301 Issuing autochanger \"loaded\" command.\n" -msgstr "" - -#: src/stored/btape.c:1500 -#, c-format -msgid "3991 Bad autochanger command: %s\n" -msgstr "" - -#: src/stored/btape.c:1501 -#, c-format -msgid "3991 result=\"%s\": ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1505 -#, c-format -msgid "Slot %d loaded. I am going to unload it.\n" -msgstr "" - -#: src/stored/btape.c:1507 -msgid "Nothing loaded in the drive. OK.\n" -msgstr "" - -#: src/stored/btape.c:1514 -#, c-format -msgid "3302 Issuing autochanger \"unload %d %d\" command.\n" -msgstr "" - -#: src/stored/btape.c:1519 -#, c-format -msgid "unload status=%s %d\n" -msgstr "" - -#: src/stored/btape.c:1519 -msgid "Bad" -msgstr "" - -#: src/stored/btape.c:1522 -#, c-format -msgid "3992 Bad autochanger command: %s\n" -msgstr "" - -#: src/stored/btape.c:1523 -#, c-format -msgid "3992 result=\"%s\": ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1533 -#, c-format -msgid "3303 Issuing autochanger \"load %d %d\" command.\n" -msgstr "" - -#: src/stored/btape.c:1541 -#, c-format -msgid "3303 Autochanger \"load %d %d\" status is OK.\n" -msgstr "" - -#: src/stored/btape.c:1545 -#, c-format -msgid "3993 Bad autochanger command: %s\n" -msgstr "" - -#: src/stored/btape.c:1546 -#, c-format -msgid "3993 result=\"%s\": ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1561 -msgid "" -"\n" -"The test failed, probably because you need to put\n" -"a longer sleep time in the mtx-script in the load) case.\n" -"Adding a 30 second sleep and trying again ...\n" -msgstr "" - -#: src/stored/btape.c:1574 -#, c-format -msgid "Wrote EOF to %s\n" -msgstr "" - -#: src/stored/btape.c:1578 -#, c-format -msgid "" -"\n" -"The test worked this time. Please add:\n" -"\n" -" sleep %d\n" -"\n" -"to your mtx-changer script in the load) case.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1583 -msgid "" -"\n" -"The test autochanger worked!!\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1594 -msgid "You must correct this error or the Autochanger will not work.\n" -msgstr "" - -#: src/stored/btape.c:1612 -msgid "" -"\n" -"\n" -"=== Forward space files test ===\n" -"\n" -"This test is essential to Bacula.\n" -"\n" -"I'm going to write five files then test forward spacing\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1637 -msgid "Now forward spacing 1 file.\n" -msgstr "" - -#: src/stored/btape.c:1639 src/stored/btape.c:1651 src/stored/btape.c:1664 -#: src/stored/btape.c:1682 src/stored/btape.c:1858 -#, c-format -msgid "Bad status from fsr. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1642 -#, c-format -msgid "We should be in file 1. I am at file %d. %s\n" -msgstr "" - -#: src/stored/btape.c:1649 -msgid "Now forward spacing 2 files.\n" -msgstr "" - -#: src/stored/btape.c:1662 -msgid "Now forward spacing 4 files.\n" -msgstr "" - -#: src/stored/btape.c:1674 -msgid "" -"The test worked this time. Please add:\n" -"\n" -" Fast Forward Space File = no\n" -"\n" -"to your Device resource for this drive.\n" -msgstr "" - -#: src/stored/btape.c:1680 -msgid "Now forward spacing 1 more file.\n" -msgstr "" - -#: src/stored/btape.c:1684 -#, c-format -msgid "We should be in file 5. I am at file %d. %s\n" -msgstr "" - -#: src/stored/btape.c:1689 -msgid "" -"\n" -"=== End Forward space files test ===\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1693 -msgid "" -"\n" -"The forward space file test failed.\n" -msgstr "" - -#: src/stored/btape.c:1695 -msgid "" -"You have Fast Forward Space File enabled.\n" -"I am turning it off then retrying the test.\n" -msgstr "" - -#: src/stored/btape.c:1701 -msgid "" -"You must correct this error or Bacula will not work.\n" -"Some systems, e.g. OpenBSD, require you to set\n" -" Use MTIOCGET= no\n" -"in your device resource. Use with caution.\n" -msgstr "" - -#: src/stored/btape.c:1735 -msgid "" -"\n" -"Append test failed. Attempting again.\n" -"Setting \"Hardware End of Medium = no\n" -" and \"Fast Forward Space File = no\n" -"and retrying append test.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1743 -msgid "" -"\n" -"\n" -"It looks like the test worked this time, please add:\n" -"\n" -" Hardware End of Medium = No\n" -"\n" -" Fast Forward Space File = No\n" -"to your Device resource in the Storage conf file.\n" -msgstr "" - -#: src/stored/btape.c:1750 -msgid "" -"\n" -"\n" -"That appears *NOT* to have corrected the problem.\n" -msgstr "" - -#: src/stored/btape.c:1755 -msgid "" -"\n" -"\n" -"It looks like the append failed. Attempting again.\n" -"Setting \"BSF at EOM = yes\" and retrying append test.\n" -msgstr "" - -#: src/stored/btape.c:1760 -msgid "" -"\n" -"\n" -"It looks like the test worked this time, please add:\n" -"\n" -" Hardware End of Medium = No\n" -" Fast Forward Space File = No\n" -" BSF at EOM = yes\n" -"\n" -"to your Device resource in the Storage conf file.\n" -msgstr "" - -#: src/stored/btape.c:1771 -msgid "" -"\n" -"Append test failed.\n" -"\n" -"\n" -"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" -"Unable to correct the problem. You MUST fix this\n" -"problem before Bacula can use your tape drive correctly\n" -"\n" -"Perhaps running Bacula in fixed block mode will work.\n" -"Do so by setting:\n" -"\n" -"Minimum Block Size = nnn\n" -"Maximum Block Size = nnn\n" -"\n" -"in your Storage daemon's Device definition.\n" -"nnn must match your tape driver's block size, which\n" -"can be determined by reading your tape manufacturers\n" -"information, and the information on your kernel dirver.\n" -"Fixed block sizes, however, are not normally an ideal solution.\n" -"\n" -"Some systems, e.g. OpenBSD, require you to set\n" -" Use MTIOCGET= no\n" -"in your device resource. Use with caution.\n" -msgstr "" - -#: src/stored/btape.c:1793 -msgid "" -"\n" -"The above Bacula scan should have output identical to what follows.\n" -"Please double check it ...\n" -"=== Sample correct output ===\n" -"1 block of 64448 bytes in file 1\n" -"End of File mark.\n" -"2 blocks of 64448 bytes in file 2\n" -"End of File mark.\n" -"3 blocks of 64448 bytes in file 3\n" -"End of File mark.\n" -"1 block of 64448 bytes in file 4\n" -"End of File mark.\n" -"Total files=4, blocks=7, bytes = 451,136\n" -"=== End sample correct output ===\n" -"\n" -"If the above scan output is not identical to the\n" -"sample output, you MUST correct the problem\n" -"or Bacula will not be able to write multiple Jobs to \n" -"the tape.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1836 -#, c-format -msgid "Bad status from fsf. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1840 -msgid "Forward spaced 1 file.\n" -msgstr "" - -#: src/stored/btape.c:1843 -#, c-format -msgid "Forward spaced %d files.\n" -msgstr "" - -#: src/stored/btape.c:1862 -msgid "Forward spaced 1 record.\n" -msgstr "" - -#: src/stored/btape.c:1865 -#, c-format -msgid "Forward spaced %d records.\n" -msgstr "" - -#: src/stored/btape.c:1910 -#, c-format -msgid "Wrote one record of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:1912 -msgid "Wrote block to device.\n" -msgstr "" - -#: src/stored/btape.c:1926 -msgid "Enter length to read: " -msgstr "" - -#: src/stored/btape.c:1931 -msgid "Bad length entered, using default of 1024 bytes.\n" -msgstr "" - -#: src/stored/btape.c:1940 -#, c-format -msgid "Read of %d bytes gives stat=%d. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1963 src/stored/btape.c:2012 -#, c-format -msgid "End of tape\n" -msgstr "" - -#: src/stored/btape.c:1968 -#, c-format -msgid "Starting scan at file %u\n" -msgstr "" - -#: src/stored/btape.c:1973 src/stored/tape_dev.c:614 -#, c-format -msgid "read error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/btape.c:1975 -#, c-format -msgid "Bad status from read %d. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1978 src/stored/btape.c:1992 src/stored/btape.c:2056 -#: src/stored/btape.c:2068 src/stored/btape.c:2081 src/stored/btape.c:2097 -#, c-format -msgid "1 block of %d bytes in file %d\n" -msgstr "" - -#: src/stored/btape.c:1981 src/stored/btape.c:1995 src/stored/btape.c:2059 -#: src/stored/btape.c:2071 src/stored/btape.c:2084 src/stored/btape.c:2100 -#, c-format -msgid "%d blocks of %d bytes in file %d\n" -msgstr "" - -#: src/stored/btape.c:2003 src/stored/btape.c:2075 -#, c-format -msgid "End of File mark.\n" -msgstr "" - -#: src/stored/btape.c:2024 src/stored/btape.c:2128 -#, c-format -msgid "Total files=%d, blocks=%d, bytes = %s\n" -msgstr "" - -#: src/stored/btape.c:2088 -#, c-format -msgid "Short block read.\n" -msgstr "" - -#: src/stored/btape.c:2091 -#, c-format -msgid "Error reading block. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2115 -#, c-format -msgid "" -"Block=%u file,blk=%u,%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%s " -"rlen=%d\n" -msgstr "" - -#: src/stored/btape.c:2137 -#, c-format -msgid "Device status: %u. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2169 -#, c-format -msgid "" -"\n" -"This command simulates Bacula writing to a tape.\n" -"It requires either one or two blank tapes, which it\n" -"will label and write.\n" -"\n" -"If you have an autochanger configured, it will use\n" -"the tapes that are in slots 1 and 2, otherwise, you will\n" -"be prompted to insert the tapes when necessary.\n" -"\n" -"It will print a status approximately\n" -"every 322 MB, and write an EOF every %s. If you have\n" -"selected the simple test option, after writing the first tape\n" -"it will rewind it and re-read the last block written.\n" -"\n" -"If you have selected the multiple tape test, when the first tape\n" -"fills, it will ask for a second, and after writing a few more \n" -"blocks, it will stop. Then it will begin re-reading the\n" -"two tapes.\n" -"\n" -"This may take a long time -- hours! ...\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2187 -msgid "" -"Do you want to run the simplified test (s) with one tape\n" -"or the complete multiple tape (m) test: (s/m) " -msgstr "" - -#: src/stored/btape.c:2190 -msgid "Simple test (single tape) selected.\n" -msgstr "" - -#: src/stored/btape.c:2193 -msgid "Multiple tape test selected.\n" -msgstr "" - -#: src/stored/btape.c:2235 -msgid "Wrote Start of Session label.\n" -msgstr "" - -#: src/stored/btape.c:2254 -#, c-format -msgid "%s Begin writing Bacula records to tape ...\n" -msgstr "" - -#: src/stored/btape.c:2256 -#, c-format -msgid "%s Begin writing Bacula records to first tape ...\n" -msgstr "" - -#: src/stored/btape.c:2282 -msgid "Flush block failed.\n" -msgstr "" - -#: src/stored/btape.c:2296 -#, c-format -msgid "Wrote block=%u, file,blk=%u,%u VolBytes=%s rate=%sB/s\n" -msgstr "" - -#: src/stored/btape.c:2307 -#, c-format -msgid "%s Flush block, write EOF\n" -msgstr "" - -#: src/stored/btape.c:2316 -msgid "Wrote 1000 blocks on second tape. Done.\n" -msgstr "" - -#: src/stored/btape.c:2321 -msgid "Not OK\n" -msgstr "" - -#: src/stored/btape.c:2345 -msgid "Job canceled.\n" -msgstr "" - -#: src/stored/btape.c:2356 -msgid "Set ok=false after write_block_to_device.\n" -msgstr "" - -#: src/stored/btape.c:2360 -msgid "Wrote End of Session label.\n" -msgstr "" - -#: src/stored/btape.c:2384 -#, c-format -msgid "Wrote state file last_block_num1=%d last_block_num2=%d\n" -msgstr "" - -#: src/stored/btape.c:2388 -#, c-format -msgid "Could not create state file: %s ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2399 -#, c-format -msgid "" -"\n" -"\n" -"%s Done filling tape at %d:%d. Now beginning re-read of tape ...\n" -msgstr "" - -#: src/stored/btape.c:2402 -#, c-format -msgid "" -"\n" -"\n" -"%s Done filling tapes at %d:%d. Now beginning re-read of first tape ...\n" -msgstr "" - -#: src/stored/btape.c:2408 -msgid "do_unfill failed.\n" -msgstr "" - -#: src/stored/btape.c:2413 -#, c-format -msgid "%s: Error during test.\n" -msgstr "" - -#: src/stored/btape.c:2448 -msgid "" -"\n" -"The state file level has changed. You must redo\n" -"the fill command.\n" -msgstr "" - -#: src/stored/btape.c:2455 -#, c-format -msgid "" -"\n" -"Could not find the state file: %s ERR=%s\n" -"You must redo the fill command.\n" -msgstr "" - -#: src/stored/btape.c:2521 -msgid "Mount first tape. Press enter when ready: " -msgstr "" - -#: src/stored/btape.c:2538 -msgid "Rewinding.\n" -msgstr "" - -#: src/stored/btape.c:2543 -#, c-format -msgid "Reading the first 10000 records from %u:%u.\n" -msgstr "" - -#: src/stored/btape.c:2547 src/stored/btape.c:2616 -#, c-format -msgid "Reposition from %u:%u to %u:%u\n" -msgstr "" - -#: src/stored/btape.c:2550 src/stored/btape.c:2603 src/stored/btape.c:2619 -#, c-format -msgid "Reposition error. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2553 -#, c-format -msgid "Reading block %u.\n" -msgstr "" - -#: src/stored/btape.c:2555 src/stored/btape.c:2608 src/stored/btape.c:2624 -#, c-format -msgid "Error reading block: ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2560 -msgid "" -"\n" -"The last block on the tape matches. Test succeeded.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2563 -msgid "" -"\n" -"The last block of the first tape matches.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2587 -msgid "Mount second tape. Press enter when ready: " -msgstr "" - -#: src/stored/btape.c:2601 -#, c-format -msgid "Reposition from %u:%u to 0:1\n" -msgstr "" - -#: src/stored/btape.c:2606 src/stored/btape.c:2622 -#, c-format -msgid "Reading block %d.\n" -msgstr "" - -#: src/stored/btape.c:2612 -msgid "" -"\n" -"The first block on the second tape matches.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2628 -msgid "" -"\n" -"The last block on the second tape matches. Test succeeded.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2646 -#, c-format -msgid "10000 records read now at %d:%d\n" -msgstr "" - -#: src/stored/btape.c:2672 src/stored/btape.c:2683 src/stored/btape.c:2728 -msgid "Last block written" -msgstr "" - -#: src/stored/btape.c:2674 src/stored/btape.c:2684 -msgid "Block read back" -msgstr "" - -#: src/stored/btape.c:2675 -#, c-format -msgid "" -"\n" -"\n" -"The blocks differ at byte %u\n" -msgstr "" - -#: src/stored/btape.c:2676 -msgid "" -"\n" -"\n" -"!!!! The last block written and the block\n" -"that was read back differ. The test FAILED !!!!\n" -"This must be corrected before you use Bacula\n" -"to write multi-tape Volumes.!!!!\n" -msgstr "" - -#: src/stored/btape.c:2712 -#, c-format -msgid "Last block at: %u:%u this_dev_block_num=%d\n" -msgstr "" - -#: src/stored/btape.c:2726 -#, c-format -msgid "Block not written: FileIndex=%u blk_block=%u Size=%u\n" -msgstr "" - -#: src/stored/btape.c:2730 -msgid "Block not written" -msgstr "" - -#: src/stored/btape.c:2745 -#, c-format -msgid "End of tape %d:%d. Volume Bytes=%s. Write rate = %sB/s\n" -msgstr "" - -#: src/stored/btape.c:2796 -msgid "Test writing blocks of 64512 bytes to tape.\n" -msgstr "" - -#: src/stored/btape.c:2798 -msgid "How many blocks do you want to write? (1000): " -msgstr "" - -#: src/stored/btape.c:2815 -#, c-format -msgid "Begin writing %d Bacula blocks to tape ...\n" -msgstr "" - -#: src/stored/btape.c:2858 -#, c-format -msgid "Begin writing raw blocks of %u bytes.\n" -msgstr "" - -#: src/stored/btape.c:2889 -msgid "test autochanger" -msgstr "" - -#: src/stored/btape.c:2890 -msgid "backspace file" -msgstr "" - -#: src/stored/btape.c:2891 -msgid "backspace record" -msgstr "" - -#: src/stored/btape.c:2892 -msgid "list device capabilities" -msgstr "" - -#: src/stored/btape.c:2893 -msgid "clear tape errors" -msgstr "" - -#: src/stored/btape.c:2894 -msgid "go to end of Bacula data for append" -msgstr "" - -#: src/stored/btape.c:2895 -msgid "go to the physical end of medium" -msgstr "" - -#: src/stored/btape.c:2896 -msgid "fill tape, write onto second volume" -msgstr "" - -#: src/stored/btape.c:2897 -msgid "read filled tape" -msgstr "" - -#: src/stored/btape.c:2898 -msgid "forward space a file" -msgstr "" - -#: src/stored/btape.c:2899 -msgid "forward space a record" -msgstr "" - -#: src/stored/btape.c:2900 -msgid "print this command" -msgstr "" - -#: src/stored/btape.c:2901 -msgid "write a Bacula label to the tape" -msgstr "" - -#: src/stored/btape.c:2902 -msgid "load a tape" -msgstr "" - -#: src/stored/btape.c:2903 -msgid "quit btape" -msgstr "" - -#: src/stored/btape.c:2904 -msgid "use write() to fill tape" -msgstr "" - -#: src/stored/btape.c:2905 -msgid "read and print the Bacula tape label" -msgstr "" - -#: src/stored/btape.c:2906 -msgid "test record handling functions" -msgstr "" - -#: src/stored/btape.c:2907 -msgid "rewind the tape" -msgstr "" - -#: src/stored/btape.c:2908 -msgid "read() tape block by block to EOT and report" -msgstr "" - -#: src/stored/btape.c:2909 -msgid "Bacula read block by block to EOT and report" -msgstr "" - -#: src/stored/btape.c:2910 -msgid "" -"[file_size=n(GB)|nb_file=3|skip_zero|skip_random|skip_raw|skip_block] report " -"drive speed" -msgstr "" - -#: src/stored/btape.c:2911 -msgid "print tape status" -msgstr "" - -#: src/stored/btape.c:2912 -msgid "General test Bacula tape functions" -msgstr "" - -#: src/stored/btape.c:2913 -msgid "write an EOF on the tape" -msgstr "" - -#: src/stored/btape.c:2914 -msgid "write a single Bacula block" -msgstr "" - -#: src/stored/btape.c:2915 -msgid "read a single record" -msgstr "" - -#: src/stored/btape.c:2916 -msgid "read a single Bacula block" -msgstr "" - -#: src/stored/btape.c:2917 -msgid "quick fill command" -msgstr "" - -#: src/stored/btape.c:2938 -#, c-format -msgid "\"%s\" is an invalid command\n" -msgstr "" - -#: src/stored/btape.c:2947 -#, c-format -msgid "Interactive commands:\n" -msgstr "" - -#: src/stored/btape.c:2958 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: btape \n" -" -b specify bootstrap file\n" -" -c set configuration file to file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -p proceed inspite of I/O errors\n" -" -s turn off signals\n" -" -v be verbose\n" -" -? print this message.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:3046 -#, c-format -msgid "Mount second Volume on device %s and press return when ready: " -msgstr "" - -#: src/stored/btape.c:3074 -#, c-format -msgid "Mount blank Volume on device %s and press return when ready: " -msgstr "" - -#: src/stored/btape.c:3094 -#, c-format -msgid "End of Volume \"%s\" %d records.\n" -msgstr "" - -#: src/stored/btape.c:3108 -#, c-format -msgid "Read block=%u, VolBytes=%s rate=%sB/s\n" -msgstr "" - -#: src/stored/btape.c:3121 -#, c-format -msgid "Cannot open Dev=%s, Vol=%s\n" -msgstr "" - -#: src/stored/butil.c:48 -msgid "Nohdr," -msgstr "" - -#: src/stored/butil.c:51 -msgid "partial," -msgstr "" - -#: src/stored/butil.c:54 -msgid "empty," -msgstr "" - -#: src/stored/butil.c:57 -msgid "Nomatch," -msgstr "" - -#: src/stored/butil.c:60 -msgid "cont," -msgstr "" - -#: src/stored/butil.c:150 -msgid "Volume name or names is too long. Please use a .bsr file.\n" -msgstr "" - -#: src/stored/butil.c:170 -#, c-format -msgid "Cannot find device \"%s\" in config file %s.\n" -msgstr "" - -#: src/stored/butil.c:177 -#, c-format -msgid "Cannot init device %s\n" -msgstr "" - -#: src/stored/butil.c:203 -#, c-format -msgid "Cannot open %s\n" -msgstr "" - -#: src/stored/butil.c:290 -#, c-format -msgid "Could not find device \"%s\" in config file %s.\n" -msgstr "" - -#: src/stored/butil.c:295 -#, c-format -msgid "Using device: \"%s\" for writing.\n" -msgstr "" - -#: src/stored/butil.c:297 -#, c-format -msgid "Using device: \"%s\" for reading.\n" -msgstr "" - -#: src/stored/butil.c:313 -msgid "Unexpected End of Data\n" -msgstr "" - -#: src/stored/butil.c:315 -msgid "Unexpected End of Tape\n" -msgstr "" - -#: src/stored/butil.c:317 -msgid "Unexpected End of File\n" -msgstr "" - -#: src/stored/butil.c:319 -msgid "Tape Door is Open\n" -msgstr "" - -#: src/stored/butil.c:321 -msgid "Unexpected Tape is Off-line\n" -msgstr "" - -#: src/stored/dde_status.c:149 -msgid "Dedupengine status:\n" -msgstr "" - -#: src/stored/dde_status.c:159 -#, c-format -msgid "" -" DDE: hash_count=%llu ref_count=%llu ref_size=%sB\n" -" ref_ratio=%.2f size_ratio=%.2f dde_errors=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:167 -#, c-format -msgid "" -" Config: bnum=%lld bmin=%lld bmax=%lld mlock_strategy=%ld mlocked=%lldMB " -"mlock_max=%lldMB\n" -msgstr "" - -#: src/stored/dde_status.c:173 -#, c-format -msgid " Addr: bad_addr=%llu bad_bucket=%llu wrong=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:178 -#, c-format -msgid "" -" Containers: chunk_allocated=%llu chunk_used=%llu\n" -" disk_space_allocated=%sB disk_space_used=%sB containers_errors=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:199 -#, c-format -msgid "" -" Vacuum: last_run=\"%s\" duration=%llus ref_count=%llu ref_size=%sB\n" -" vacuum_errors=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:205 -#, c-format -msgid " Stats: read_chunk=%llu query_hash=%llu new_hash=%llu calc_hash=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:213 -#, c-format -msgid " acc_container_cnt[%d]:%s %14llu\n" -msgstr "" - -#: src/stored/dde_status.c:226 -#, c-format -msgid " [%d]%s filesize=%sB/%sB usage=%llu/%llu/%llu %3llu%% %s\n" -msgstr "" - -#: src/stored/dde_status.c:239 -#, c-format -msgid " [%d]%s filesize=%sB/%sB usage=%llu/%llu/%llu %3llu%%\n" -msgstr "" - -#: src/stored/dde_vacuum.c:84 -#, c-format -msgid "" -"Skipping volume \"%s\" from vacuum process, the volume is only created in " -"the catalog.\n" -msgstr "" - -#: src/stored/dde_vacuum.c:91 -#, c-format -msgid "" -"Error: Volume \"%s\" (status %s) not found in %s. All volumes should be " -"available for a Vacuum. ERR=%s\n" -msgstr "" - -#: src/stored/dedupengine.c:384 -msgid "Initializing DDE." -msgstr "" - -#: src/stored/dedupengine.c:392 -msgid "DedupDirectory directive in Storage resource missing." -msgstr "" - -#: src/stored/dedupengine.c:399 -#, c-format -msgid "Cannot create DedupDirectory: %s" -msgstr "" - -#: src/stored/dedupengine.c:405 -#, c-format -msgid "Cannot create DedupIndexDirectory: %s" -msgstr "" - -#: src/stored/dedupengine.c:414 src/stored/dedupengine.c:421 -#, c-format -msgid "Cannot create recovery directory: %s" -msgstr "" - -#: src/stored/dedupengine.c:428 -#, c-format -msgid "Cannot delete temporary recovery directory: %s" -msgstr "" - -#: src/stored/dedupengine.c:1246 -#, c-format -msgid "bucket version (%ld) is posterior to the software (%ld)\n" -msgstr "" - -#: src/stored/dedupengine.c:1772 -#, c-format -msgid "" -"The Deduplication Engine filesystem \"%s\" is full (only %sB free). Running " -"jobs will be stopped and marked as Incomplete. Extend the storage space and " -"run the vacuum procedure\n" -msgstr "" - -#: src/stored/dedupengine.c:1782 -#, c-format -msgid "" -"The Deduplication Engine filesystem \"%s\" is nearly full (%sB free). Please " -"run the vacuum procedure\n" -msgstr "" - -#: src/stored/dedupengine.c:1965 -msgid "Header not found in DDE index\n" -msgstr "" - -#: src/stored/dedupengine.c:1971 -msgid "DDE index bad magic in header\n" -msgstr "" - -#: src/stored/dedupengine.c:1976 -#, c-format -msgid "" -"Cannot open DDE because the version (%ld) is posterior to the software " -"(%ld)\n" -msgstr "" - -#: src/stored/dedupengine.c:1996 -#, c-format -msgid "Cannot open DDE, unknown hash ID: %ld\n" -msgstr "" - -#: src/stored/dedupstored.c:99 -#, c-format -msgid "Transport thread error: joining thread (%d)\n" -msgstr "" - -#: src/stored/dedupstored.c:208 -#, c-format -msgid "Socket error or stop during rehydration. ERR=%d\n" -msgstr "" - -#: src/stored/dedupstored.c:226 -#, c-format -msgid "Unexpected message from FD, n=%d msglen=%d msg=%s\n" -msgstr "" - -#: src/stored/dedupstored.c:415 -#, c-format -msgid "BAD HASH: computed=#%08x expected=#%08x size=%d\n" -msgstr "" - -#: src/stored/dedupstored.c:521 -#, c-format -msgid "GOT chunk #%08x, now do a CANCEL\n" -msgstr "" - -#: src/stored/dedupstored.c:528 -#, c-format -msgid "Received unexpected chunk #%08x\n" -msgstr "" - -#: src/stored/dedupstored.c:535 -#, c-format -msgid "Cannot lz4decode received chunk #%08x\n" -msgstr "" - -#: src/stored/dedupstored.c:541 -#, c-format -msgid "Received chunk #%08x with the wrong size %d (expected %ld) \n" -msgstr "" - -#: src/stored/dedupstored.c:550 -#, c-format -msgid "Received a chunk with a bad hash #%08x (expected #%08x) size=%d\n" -msgstr "" - -#: src/stored/dedupstored.c:585 -msgid "Ignore dedup flow control protocol error\n" -msgstr "" - -#: src/stored/dedupstored.c:599 -#, c-format -msgid "Ignore unknown inter-daemon command: %ld\n" -msgstr "" - -#: src/stored/dedupstored.c:678 -msgid "Got Dedup data but dedupengine is not started\n" -msgstr "" - -#: src/stored/dedupstored.c:718 -msgid "Error sending chunk request to client\n" -msgstr "" - -#: src/stored/dev.c:146 -#, c-format -msgid "Unable to stat device %s: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:164 -#, c-format -msgid "" -"%s is an unknown device type. Must be tape or directory\n" -" or have RequiresMount=yes for DVD. st_mode=%x\n" -msgstr "" - -#: src/stored/dev.c:177 -msgid "DVD support is now deprecated.\n" -msgstr "" - -#: src/stored/dev.c:180 -msgid "Aligned device not supported. Please use \"DeviceType = File\"\n" -msgstr "" - -#: src/stored/dev.c:183 -msgid "Deduplication device not supported. Please use \"DeviceType = File\"\n" -msgstr "" - -#: src/stored/dev.c:212 -msgid "Deduplication device not properly configured.\n" -msgstr "" - -#: src/stored/dev.c:303 -#, c-format -msgid "Using default block size %u on dedup device %s\n" -msgstr "" - -#: src/stored/dev.c:341 -#, c-format -msgid "Unable to stat mount point %s: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:346 -msgid "" -"Mount and unmount commands must defined for a device which requires mount.\n" -msgstr "" - -#: src/stored/dev.c:362 -#, c-format -msgid "Min block size > max on device %s\n" -msgstr "" - -#: src/stored/dev.c:366 -#, c-format -msgid "Block size %u on device %s is too large, using default %u\n" -msgstr "" - -#: src/stored/dev.c:371 -#, c-format -msgid "Max block size %u not multiple of device %s block size=%d.\n" -msgstr "" - -#: src/stored/dev.c:375 -#, c-format -msgid "Max Vol Size < 8 * Max Block Size for device %s\n" -msgstr "" - -#: src/stored/dev.c:391 src/stored/dev.c:397 -#, c-format -msgid "Unable to init cond variable: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:403 -#, c-format -msgid "Unable to init spool mutex: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:409 -#, c-format -msgid "Unable to init acquire mutex: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:415 -#, c-format -msgid "Unable to init read acquire mutex: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:421 -#, c-format -msgid "Unable to init adata mutex: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:427 -#, c-format -msgid "Unable to init volcat mutex: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:433 -#, c-format -msgid "Unable to init dcrs mutex: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:523 -msgid "Illegal mode given to open dev.\n" -msgstr "" - -#: src/stored/dev.c:575 -msgid "Bad device call. Device not open\n" -msgstr "" - -#: src/stored/dev.c:587 -#, c-format -msgid "Seek error: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:588 src/stored/file_dev.c:78 src/stored/file_dev.c:105 -#: src/stored/tape_dev.c:294 -#, c-format -msgid "lseek error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/device.c:126 -#, c-format -msgid "End of medium on Volume \"%s\" Bytes=%s Blocks=%s at %s.\n" -msgstr "" - -#: src/stored/device.c:157 -#, c-format -msgid "New volume \"%s\" mounted on device %s at %s.\n" -msgstr "" - -#: src/stored/device.c:169 -#, c-format -msgid "write_block_to_device Volume label failed. ERR=%s" -msgstr "" - -#: src/stored/device.c:201 -#, c-format -msgid "write_block_to_device overflow block failed. ERR=%s" -msgstr "" - -#: src/stored/device.c:206 -#, c-format -msgid "Catastrophic error. Cannot write overflow block to device %s. ERR=%s" -msgstr "" - -#: src/stored/device.c:367 src/stored/tape_dev.c:161 -#, c-format -msgid "Unable to open device %s: ERR=%s\n" -msgstr "" - -#: src/stored/device.c:369 -#, c-format -msgid "Unable to open archive %s: ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:164 -#, c-format -msgid "Connection request from %s failed.\n" -msgstr "" - -#: src/stored/dircmd.c:202 -msgid "Unable to authenticate Director\n" -msgstr "" - -#: src/stored/dircmd.c:296 -#, c-format -msgid "Bad client command: %s" -msgstr "" - -#: src/stored/dircmd.c:306 -msgid "Client daemon" -msgstr "" - -#: src/stored/dircmd.c:309 -#, c-format -msgid "Failed to connect to Client daemon: %s:%d\n" -msgstr "" - -#: src/stored/dircmd.c:387 -msgid "In storage_cmd port==0, no prior Storage connection.\n" -msgstr "" - -#: src/stored/dircmd.c:439 -#, c-format -msgid "3991 Bad setdebug command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:484 -msgid "3000 Deduplication vacuum marked to be canceled.\n" -msgstr "" - -#: src/stored/dircmd.c:486 -msgid "3900 No deduplication vacuum process found.\n" -msgstr "" - -#: src/stored/dircmd.c:490 -msgid "3903 Error scanning cancel command.\n" -msgstr "" - -#: src/stored/dircmd.c:494 -#, c-format -msgid "3904 Job %s not found.\n" -msgstr "" - -#: src/stored/dircmd.c:523 -#, c-format -msgid "3000 JobId=%ld Job=\"%s\" marked to be %s.\n" -msgstr "" - -#: src/stored/dircmd.c:602 src/stored/dircmd.c:1003 src/stored/dircmd.c:1163 -#: src/stored/dircmd.c:1274 src/stored/dircmd.c:1396 src/stored/dircmd.c:1438 -#, c-format -msgid "3999 Device \"%s\" not found or could not be opened.\n" -msgstr "" - -#: src/stored/dircmd.c:607 -#, c-format -msgid "3903 Error scanning label command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:659 -#, c-format -msgid "3910 Unable to open device \"%s\": ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:676 -#, c-format -msgid "3920 Cannot label Volume because it is already labeled: \"%s\"\n" -msgstr "" - -#: src/stored/dircmd.c:683 -msgid "3921 Wrong volume mounted.\n" -msgstr "" - -#: src/stored/dircmd.c:687 -msgid "3922 Cannot relabel an ANSI/IBM labeled Volume.\n" -msgstr "" - -#: src/stored/dircmd.c:695 -#, c-format -msgid "3912 Failed to label Volume: ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:711 -#, c-format -msgid "3915 Failed to label Volume: ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:714 -#, c-format -msgid "3914 Failed to label Volume (no media): ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:717 -#, c-format -msgid "3913 Cannot label Volume. Unknown status %d from read_volume_label()\n" -msgstr "" - -#: src/stored/dircmd.c:755 -#, c-format -msgid "3001 Mounted Volume: %s\n" -msgstr "" - -#: src/stored/dircmd.c:759 src/stored/dircmd.c:1474 -#, c-format -msgid "" -"3902 Cannot mount Volume on Storage Device \"%s\" because:\n" -"%s" -msgstr "" - -#: src/stored/dircmd.c:790 src/stored/reserve.c:648 -#, c-format -msgid "" -"\n" -" Device \"%s\" requested by DIR could not be opened or does not exist.\n" -msgstr "" - -#: src/stored/dircmd.c:812 src/stored/reserve.c:644 -#, c-format -msgid "" -"\n" -" Device \"%s\" in changer \"%s\" requested by DIR could not be opened or " -"does not exist.\n" -msgstr "" - -#: src/stored/dircmd.c:876 -msgid "Specified slot ignored. " -msgstr "" - -#: src/stored/dircmd.c:896 src/stored/dircmd.c:959 -#, c-format -msgid "3901 Unable to open device \"%s\": ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:917 src/stored/dircmd.c:947 -#, c-format -msgid "3001 Device \"%s\" is mounted with Volume \"%s\"\n" -msgstr "" - -#: src/stored/dircmd.c:920 src/stored/dircmd.c:950 src/stored/dircmd.c:969 -#, c-format -msgid "" -"3905 Device \"%s\" open but no Bacula volume is mounted.\n" -"If this is not a blank tape, try unmounting and remounting the Volume.\n" -msgstr "" - -#: src/stored/dircmd.c:931 -#, c-format -msgid "3001 Device \"%s\" is doing acquire.\n" -msgstr "" - -#: src/stored/dircmd.c:936 src/stored/dircmd.c:1134 -#, c-format -msgid "3903 Device \"%s\" is being labeled.\n" -msgstr "" - -#: src/stored/dircmd.c:966 -#, c-format -msgid "3001 Device \"%s\" is already mounted with Volume \"%s\"\n" -msgstr "" - -#: src/stored/dircmd.c:979 -#, c-format -msgid "3002 Device \"%s\" is mounted.\n" -msgstr "" - -#: src/stored/dircmd.c:981 src/stored/dircmd.c:1103 src/stored/dircmd.c:1122 -#: src/stored/dircmd.c:1154 -#, c-format -msgid "3907 %s" -msgstr "" - -#: src/stored/dircmd.c:984 -#, c-format -msgid "3906 File device \"%s\" is always mounted.\n" -msgstr "" - -#: src/stored/dircmd.c:993 -#, c-format -msgid "3930 Device \"%s\" is being released.\n" -msgstr "" - -#: src/stored/dircmd.c:997 -#, c-format -msgid "3905 Unknown wait state %d\n" -msgstr "" - -#: src/stored/dircmd.c:1007 -#, c-format -msgid "3909 Error scanning mount command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1032 -#, c-format -msgid "3002 Device \"%s\" enabled.\n" -msgstr "" - -#: src/stored/dircmd.c:1039 -#, c-format -msgid "3907 Error scanning \"enable\" command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1064 -#, c-format -msgid "3002 Device \"%s\" disabled.\n" -msgstr "" - -#: src/stored/dircmd.c:1071 -#, c-format -msgid "3907 Error scanning \"disable\" command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1100 src/stored/dircmd.c:1156 -#, c-format -msgid "3002 Device \"%s\" unmounted.\n" -msgstr "" - -#: src/stored/dircmd.c:1107 -#, c-format -msgid "3901 Device \"%s\" is already unmounted.\n" -msgstr "" - -#: src/stored/dircmd.c:1125 -#, c-format -msgid "3001 Device \"%s\" unmounted.\n" -msgstr "" - -#: src/stored/dircmd.c:1130 -#, c-format -msgid "3902 Device \"%s\" is busy in acquire.\n" -msgstr "" - -#: src/stored/dircmd.c:1168 -#, c-format -msgid "3907 Error scanning unmount command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1196 -msgid "3916 Error scanning action_on_purge command\n" -msgstr "" - -#: src/stored/dircmd.c:1239 -#, c-format -msgid "3921 Device \"%s\" already released.\n" -msgstr "" - -#: src/stored/dircmd.c:1246 -#, c-format -msgid "3922 Device \"%s\" waiting for sysop.\n" -msgstr "" - -#: src/stored/dircmd.c:1252 -#, c-format -msgid "3922 Device \"%s\" waiting for mount.\n" -msgstr "" - -#: src/stored/dircmd.c:1256 -#, c-format -msgid "3923 Device \"%s\" is busy in acquire.\n" -msgstr "" - -#: src/stored/dircmd.c:1260 -#, c-format -msgid "3914 Device \"%s\" is being labeled.\n" -msgstr "" - -#: src/stored/dircmd.c:1268 -#, c-format -msgid "3022 Device \"%s\" released.\n" -msgstr "" - -#: src/stored/dircmd.c:1279 -#, c-format -msgid "3927 Error scanning release command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1308 -#, c-format -msgid "Could not create bootstrap file %s: ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:1321 -msgid "Error parsing bootstrap file.\n" -msgstr "" - -#: src/stored/dircmd.c:1383 -#, c-format -msgid "3998 Device \"%s\" is not an autochanger.\n" -msgstr "" - -#: src/stored/dircmd.c:1400 -#, c-format -msgid "3909 Error scanning autochanger drives/list/slots command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1442 -#, c-format -msgid "3909 Error scanning readlabel command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1470 -#, c-format -msgid "3001 Volume=%s Slot=%d\n" -msgstr "" - -#: src/stored/dircmd.c:1502 -#, c-format -msgid "3931 Device \"%s\" is BLOCKED. user unmounted.\n" -msgstr "" - -#: src/stored/dircmd.c:1506 -#, c-format -msgid "" -"3932 Device \"%s\" is BLOCKED. user unmounted during wait for media/mount.\n" -msgstr "" - -#: src/stored/dircmd.c:1510 -#, c-format -msgid "3933 Device \"%s\" is BLOCKED waiting for media.\n" -msgstr "" - -#: src/stored/dircmd.c:1514 -#, c-format -msgid "3934 Device \"%s\" is being initialized.\n" -msgstr "" - -#: src/stored/dircmd.c:1518 -#, c-format -msgid "3935 Device \"%s\" is blocked labeling a Volume.\n" -msgstr "" - -#: src/stored/dircmd.c:1522 -#, c-format -msgid "3935 Device \"%s\" is blocked for unknown reason.\n" -msgstr "" - -#: src/stored/dircmd.c:1527 -#, c-format -msgid "3936 Device \"%s\" is busy reading.\n" -msgstr "" - -#: src/stored/dircmd.c:1530 -#, c-format -msgid "3937 Device \"%s\" is busy with writers=%d reserved=%d.\n" -msgstr "" - -#: src/stored/dircmd.c:1550 -#, c-format -msgid "" -"3999 Device \"%s\" requested by DIR could not be locked for shared storage.\n" -msgstr "" - -#: src/stored/dvd.c:252 -#, c-format -msgid "Error writing part %d to the DVD: ERR=%s\n" -msgstr "" - -#: src/stored/dvd.c:254 -#, c-format -msgid "Error while writing current part to the DVD: %s" -msgstr "" - -#: src/stored/dvd.c:264 -#, c-format -msgid "Part %d (%lld bytes) written to DVD.\n" -msgstr "" - -#: src/stored/dvd.c:281 -#, c-format -msgid "Remaining free space %s on %s\n" -msgstr "" - -#: src/stored/dvd.c:347 -#, c-format -msgid "Next Volume part already exists on DVD. Cannot continue: %s\n" -msgstr "" - -#: src/stored/dvd.c:552 -#, c-format -msgid "" -"Error writing. Current part less than total number of parts (%d/%d, device=" -"%s)\n" -msgstr "" - -#: src/stored/dvd.c:559 -#, c-format -msgid "Unable to write last on %s: ERR=%s\n" -msgstr "" - -#: src/stored/fd_cmds.c:209 -#, c-format -msgid "Command error with FD, hanging up. ERR=%s\n" -msgstr "" - -#: src/stored/fd_cmds.c:212 -msgid "Command error with FD, hanging up.\n" -msgstr "" - -#: src/stored/fd_cmds.c:223 -#, c-format -msgid "FD command not found: %s\n" -msgstr "" - -#: src/stored/fd_cmds.c:254 -msgid "Attempt to append on non-open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:266 src/stored/fd_cmds.c:309 -msgid "Attempt to close non-open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:284 -msgid "Attempt to open already open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:338 -msgid "Attempt to read on non-open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:356 -msgid "Attempt to open an already open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:372 -msgid "Cannot open session, received bad parameters.\n" -msgstr "" - -#: src/stored/file_dev.c:95 src/stored/tape_dev.c:859 -msgid "Bad call to reposition. Device not open\n" -msgstr "" - -#: src/stored/file_dev.c:157 -#, c-format -msgid "Could not open file device %s. No Volume name given.\n" -msgstr "" - -#: src/stored/file_dev.c:183 -#, c-format -msgid "Could not open(%s,%s,0640): ERR=%s\n" -msgstr "" - -#: src/stored/file_dev.c:202 -#, c-format -msgid "Could not open aligned volume: %s, ERR=%s\n" -msgstr "" - -#: src/stored/file_dev.c:255 -#, c-format -msgid "Unable to truncate device %s. ERR=%s\n" -msgstr "" - -#: src/stored/file_dev.c:272 -#, c-format -msgid "Unable to stat device %s. ERR=%s\n" -msgstr "" - -#: src/stored/file_dev.c:289 -#, c-format -msgid "Device %s doesn't support ftruncate(). Recreating file %s.\n" -msgstr "" - -#: src/stored/file_dev.c:301 -#, c-format -msgid "Could not reopen: %s, ERR=%s\n" -msgstr "" - -#: src/stored/file_dev.c:379 src/stored/tape_dev.c:1024 -#, c-format -msgid "Device %s cannot be %smounted. ERR=%s\n" -msgstr "" - -#: src/stored/hello.c:138 -#, c-format -msgid "" -"Connection from unknown Director %s at %s rejected.\n" -"Please see " -msgstr "" - -#: src/stored/hello.c:165 -#, c-format -msgid "Invalid connection from %s. Len=%d\n" -msgstr "" - -#: src/stored/hello.c:179 -#, c-format -msgid "Invalid Hello from %s. Len=%d\n" -msgstr "" - -#: src/stored/hello.c:184 -#, c-format -msgid "Client connect failed: Job name not found: %s\n" -msgstr "" - -#: src/stored/hello.c:193 -#, c-format -msgid "" -"A Client \"%s\" tried to authenticate for Job %s, but the Job is already " -"authenticated with \"%s\".\n" -msgstr "" - -#: src/stored/hello.c:227 -#, c-format -msgid "" -"A Client \"%s\" tried to authenticate for Job %s, but the job is already " -"authenticated.\n" -msgstr "" - -#: src/stored/hello.c:234 src/stored/job.c:197 -msgid "Unable to authenticate File daemon\n" -msgstr "" - -#: src/stored/hello.c:292 -msgid "Client socket not open. Could not connect to Client.\n" -msgstr "" - -#: src/stored/hello.c:308 src/stored/hello.c:310 -#, c-format -msgid "Recv request to Client failed. ERR=%s\n" -msgstr "" - -#: src/stored/hello.c:315 src/stored/hello.c:316 -#, c-format -msgid "Bad Hello from Client: %s.\n" -msgstr "" - -#: src/stored/hello.c:442 src/stored/hello.c:444 -#, c-format -msgid "Send caps to Client failed. ERR=%s\n" -msgstr "" - -#: src/stored/hello.c:457 src/stored/hello.c:459 -#, c-format -msgid "Recv caps from Client failed. ERR=%s\n" -msgstr "" - -#: src/stored/hello.c:463 -#, c-format -msgid "Recv bad caps from Client: %s.\n" -msgstr "" - -#: src/stored/hello.c:464 -#, c-format -msgid "Recv bad caps from Client %s\n" -msgstr "" - -#: src/stored/job.c:353 -msgid "In free_jcr(), but still attached to device!!!!\n" -msgstr "" - -#: src/stored/label.c:90 -#, c-format -msgid "Couldn't rewind %s device %s: ERR=%s\n" -msgstr "" - -#: src/stored/label.c:108 src/stored/label.c:204 -#, c-format -msgid "Wrong Volume mounted on %s device %s: Wanted %s have %s\n" -msgstr "" - -#: src/stored/label.c:111 src/stored/label.c:192 -#, c-format -msgid "Too many tries: %s" -msgstr "" - -#: src/stored/label.c:128 -#, c-format -msgid "" -"Requested Volume \"%s\" on %s device %s is not a Bacula labeled Volume, " -"because: ERR=%s" -msgstr "" - -#: src/stored/label.c:133 -msgid "Could not read Volume label from block.\n" -msgstr "" - -#: src/stored/label.c:136 -#, c-format -msgid "Could not unserialize Volume label: ERR=%s\n" -msgstr "" - -#: src/stored/label.c:144 -#, c-format -msgid "Volume Header Id bad: %s\n" -msgstr "" - -#: src/stored/label.c:177 -#, c-format -msgid "Volume on %s device %s has wrong Bacula version. Wanted %d got %d\n" -msgstr "" - -#: src/stored/label.c:188 -#, c-format -msgid "Volume on %s device %s has bad Bacula label type: %x\n" -msgstr "" - -#: src/stored/label.c:225 -#, c-format -msgid "Got Aligned or File type Volume %s on Dedup device %s. Wanted File.\n" -msgstr "" - -#: src/stored/label.c:235 -#, c-format -msgid "Got Aligned or Dedup type Volume %s on File device %s. Wanted File.\n" -msgstr "" - -#: src/stored/label.c:245 -#, c-format -msgid "" -"Got File or Dedup type Volume %s on Aligned device %s. Wanted Aligned.\n" -msgstr "" - -#: src/stored/label.c:274 src/stored/label.c:467 src/stored/mount.c:502 -#, c-format -msgid "Could not reserve volume %s on %s device %s\n" -msgstr "" - -#: src/stored/label.c:364 -#, c-format -msgid "Cannot write Volume label to block for %s device %s\n" -msgstr "" - -#: src/stored/label.c:431 src/stored/label.c:587 -#, c-format -msgid "Open %s device %s Volume \"%s\" failed: ERR=%s\n" -msgstr "" - -#: src/stored/label.c:601 -#, c-format -msgid "Rewind error on %s device %s: ERR=%s\n" -msgstr "" - -#: src/stored/label.c:609 -#, c-format -msgid "Truncate error on %s device %s: ERR=%s\n" -msgstr "" - -#: src/stored/label.c:616 -#, c-format -msgid "Failed to re-open DVD after truncate on %s device %s: ERR=%s\n" -msgstr "" - -#: src/stored/label.c:661 -#, c-format -msgid "Unable to write %s device %s: ERR=%s\n" -msgstr "" - -#: src/stored/label.c:695 -#, c-format -msgid "Recycled volume \"%s\" on %s device %s, all previous data lost.\n" -msgstr "" - -#: src/stored/label.c:698 -#, c-format -msgid "Wrote label to prelabeled Volume \"%s\" on %s device %s\n" -msgstr "" - -#: src/stored/label.c:940 -#, c-format -msgid "Bad Volume session label request=%d\n" -msgstr "" - -#: src/stored/label.c:1004 -#, c-format -msgid "Expecting Volume Label, got FI=%s Stream=%s len=%d\n" -msgstr "" - -#: src/stored/label.c:1144 -#, c-format -msgid "Unknown %d" -msgstr "" - -#: src/stored/label.c:1148 -#, c-format -msgid "" -"\n" -"Volume Label:\n" -"Adata : %d\n" -"Id : %sVerNo : %d\n" -"VolName : %s\n" -"PrevVolName : %s\n" -"VolFile : %d\n" -"LabelType : %s\n" -"LabelSize : %d\n" -"PoolName : %s\n" -"MediaType : %s\n" -"PoolType : %s\n" -"HostName : %s\n" -msgstr "" - -#: src/stored/label.c:1172 -#, c-format -msgid "Date label written: %s\n" -msgstr "" - -#: src/stored/label.c:1178 -#, c-format -msgid "Date label written: %04d-%02d-%02d at %02d:%02d\n" -msgstr "" - -#: src/stored/label.c:1198 -#, c-format -msgid "" -"\n" -"%s Record:\n" -"JobId : %d\n" -"VerNum : %d\n" -"PoolName : %s\n" -"PoolType : %s\n" -"JobName : %s\n" -"ClientName : %s\n" -msgstr "" - -#: src/stored/label.c:1211 -#, c-format -msgid "" -"Job (unique name) : %s\n" -"FileSet : %s\n" -"JobType : %c\n" -"JobLevel : %c\n" -msgstr "" - -#: src/stored/label.c:1220 -#, c-format -msgid "" -"JobFiles : %s\n" -"JobBytes : %s\n" -"StartBlock : %s\n" -"EndBlock : %s\n" -"StartFile : %s\n" -"EndFile : %s\n" -"JobErrors : %s\n" -"JobStatus : %c\n" -msgstr "" - -#: src/stored/label.c:1241 -#, c-format -msgid "Date written : %s\n" -msgstr "" - -#: src/stored/label.c:1246 -#, c-format -msgid "Date written : %04d-%02d-%02d at %02d:%02d\n" -msgstr "" - -#: src/stored/label.c:1258 -msgid "***** ERROR ****** : Found error with the JobId\n" -msgstr "" - -#: src/stored/label.c:1278 -msgid "***** ERROR ****** : Found error with the JobLevel\n" -msgstr "" - -#: src/stored/label.c:1298 -msgid "***** ERROR ****** : Found error with the JobType\n" -msgstr "" - -#: src/stored/label.c:1305 -#, c-format -msgid "***** ERROR ****** : Found error with the Job name %s\n" -msgstr "" - -#: src/stored/label.c:1326 -msgid "Fresh Volume" -msgstr "" - -#: src/stored/label.c:1329 -msgid "Volume" -msgstr "" - -#: src/stored/label.c:1338 src/stored/read_records.c:406 -msgid "End of Media" -msgstr "" - -#: src/stored/label.c:1341 -msgid "End of Tape" -msgstr "" - -#: src/stored/label.c:1360 src/stored/label.c:1368 src/stored/label.c:1407 -#, c-format -msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d DataLen=%d\n" -msgstr "" - -#: src/stored/label.c:1365 -msgid "Bacula \"End of Tape\" label found.\n" -msgstr "" - -#: src/stored/label.c:1380 src/stored/label.c:1392 -#, c-format -msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d\n" -msgstr "" - -#: src/stored/label.c:1382 -#, c-format -msgid " Job=%s Date=%s Level=%c Type=%c\n" -msgstr "" - -#: src/stored/label.c:1394 -#, c-format -msgid " Date=%s Level=%c Type=%c Files=%s Bytes=%s Errors=%d Status=%c\n" -msgstr "" - -#: src/stored/lock.c:266 src/stored/lock.c:299 -#, c-format -msgid "pthread_cond_wait failure. ERR=%s\n" -msgstr "" - -#: src/stored/lock.c:608 -msgid "unknown blocked code" -msgstr "" - -#: src/stored/mount.c:89 -#, c-format -msgid "Too many errors trying to mount %s device %s.\n" -msgstr "" - -#: src/stored/mount.c:97 -#, c-format -msgid "Job %d canceled.\n" -msgstr "" - -#: src/stored/mount.c:218 -#, c-format -msgid "Open of %s device %s Volume \"%s\" failed: ERR=%s\n" -msgstr "" - -#: src/stored/mount.c:296 -#, c-format -msgid "Volume \"%s\" previously written, moving to end of data.\n" -msgstr "" - -#: src/stored/mount.c:302 -#, c-format -msgid "Unable to position to end of data on %s device %s: ERR=%s\n" -msgstr "" - -#: src/stored/mount.c:446 src/stored/mount.c:835 -#, c-format -msgid "Volume \"%s\" not loaded on %s device %s.\n" -msgstr "" - -#: src/stored/mount.c:482 -#, c-format -msgid "" -"Director wanted Volume \"%s\".\n" -" Current Volume \"%s\" not acceptable because:\n" -" %s" -msgstr "" - -#: src/stored/mount.c:660 -#, c-format -msgid "Ready to append to end of Volume \"%s\" part=%d size=%s\n" -msgstr "" - -#: src/stored/mount.c:664 -#, c-format -msgid "" -"Bacula cannot write on DVD Volume \"%s\" because: The sizes do not match! " -"Volume=%s Catalog=%s\n" -msgstr "" - -#: src/stored/mount.c:678 -#, c-format -msgid "Ready to append to end of Volume \"%s\" at file=%d.\n" -msgstr "" - -#: src/stored/mount.c:681 -#, c-format -msgid "" -"For Volume \"%s\":\n" -"The number of files mismatch! Volume=%u Catalog=%u\n" -"Correcting Catalog\n" -msgstr "" - -#: src/stored/mount.c:688 src/stored/mount.c:747 -msgid "Error updating Catalog\n" -msgstr "" - -#: src/stored/mount.c:693 -#, c-format -msgid "" -"Bacula cannot write on tape Volume \"%s\" because:\n" -"The number of files mismatch! Volume=%u Catalog=%u\n" -msgstr "" - -#: src/stored/mount.c:717 -#, c-format -msgid "Ready to append to end of Volumes \"%s\" ameta size=%s adata size=%s\n" -msgstr "" - -#: src/stored/mount.c:722 -#, c-format -msgid "Ready to append to end of Volume \"%s\" size=%s\n" -msgstr "" - -#: src/stored/mount.c:729 -#, c-format -msgid "" -"For Volume \"%s\":\n" -" The sizes do not match! Metadata Volume=%s Catalog=%s\n" -" Correcting Catalog\n" -msgstr "" - -#: src/stored/mount.c:736 -#, c-format -msgid "" -"For aligned Volume \"%s\":\n" -" Aligned sizes do not match! Aligned Volume=%s Catalog=%s\n" -" Correcting Catalog\n" -msgstr "" - -#: src/stored/mount.c:752 -#, c-format -msgid "" -"Bacula cannot write on disk Volume \"%s\" because: The sizes do not match! " -"Volume=%s Catalog=%s\n" -msgstr "" - -#: src/stored/mount.c:818 -#, c-format -msgid "Labeled new Volume \"%s\" on %s device %s.\n" -msgstr "" - -#: src/stored/mount.c:829 -#, c-format -msgid "%s device %s not configured to autolabel Volumes.\n" -msgstr "" - -#: src/stored/mount.c:853 -#, c-format -msgid "Marking Volume \"%s\" in Error in Catalog.\n" -msgstr "" - -#: src/stored/mount.c:870 -#, c-format -msgid "" -"Autochanger Volume \"%s\" not found in slot %d.\n" -" Setting InChanger to zero in catalog.\n" -msgstr "" - -#: src/stored/mount.c:889 -msgid "Hey!!!!! WroteVol non-zero !!!!!\n" -msgstr "" - -#: src/stored/mount.c:939 -#, c-format -msgid "" -"Invalid tape position on volume \"%s\" on device %s. Expected %d, got %d\n" -msgstr "" - -#: src/stored/mount.c:980 -#, c-format -msgid "Cannot open %s Dev=%s, Vol=%s for reading.\n" -msgstr "" - -#: src/stored/os.c:126 -#, c-format -msgid "Unable to set eotmodel on device %s: ERR=%s\n" -msgstr "" - -#: src/stored/os.c:180 -msgid " Bacula status:" -msgstr "" - -#: src/stored/os.c:181 src/stored/os.c:264 src/stored/os.c:266 -#, c-format -msgid " file=%d block=%d\n" -msgstr "" - -#: src/stored/os.c:185 src/stored/tape_dev.c:345 -#, c-format -msgid "ioctl MTIOCGET error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/os.c:189 -msgid " Device status:" -msgstr "" - -#: src/stored/os.c:365 -#, c-format -msgid "unknown func code %d" -msgstr "" - -#: src/stored/os.c:371 -#, c-format -msgid "I/O function \"%s\" not supported on this device.\n" -msgstr "" - -#: src/stored/parse_bsr.c:116 -#, c-format -msgid "Cannot open bootstrap file %s: %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:220 -#, c-format -msgid "Device \"%s\" in bsr at inappropriate place.\n" -msgstr "" - -#: src/stored/parse_bsr.c:283 -#, c-format -msgid "REGEX '%s' compile error. ERR=%s\n" -msgstr "" - -#: src/stored/parse_bsr.c:326 -msgid "JobType not yet implemented\n" -msgstr "" - -#: src/stored/parse_bsr.c:334 -msgid "JobLevel not yet implemented\n" -msgstr "" - -#: src/stored/parse_bsr.c:379 -#, c-format -msgid "MediaType %s in bsr at inappropriate place.\n" -msgstr "" - -#: src/stored/parse_bsr.c:684 -#, c-format -msgid "Slot %d in bsr at inappropriate place.\n" -msgstr "" - -#: src/stored/parse_bsr.c:708 -#, c-format -msgid "VolFile : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:716 -#, c-format -msgid "VolBlock : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:724 -#, c-format -msgid "VolAddr : %llu-%llu\n" -msgstr "" - -#: src/stored/parse_bsr.c:733 -#, c-format -msgid "FileIndex : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:735 -#, c-format -msgid "FileIndex : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:745 -#, c-format -msgid "JobId : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:747 -#, c-format -msgid "JobId : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:757 -#, c-format -msgid "SessId : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:759 -#, c-format -msgid "SessId : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:768 -#, c-format -msgid "VolumeName : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:769 -#, c-format -msgid " MediaType : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:770 -#, c-format -msgid " Device : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:771 -#, c-format -msgid " Slot : %d\n" -msgstr "" - -#: src/stored/parse_bsr.c:780 -#, c-format -msgid "Client : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:788 -#, c-format -msgid "Job : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:796 -#, c-format -msgid "SessTime : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:807 -msgid "BSR is NULL\n" -msgstr "" - -#: src/stored/parse_bsr.c:811 -#, c-format -msgid "Next : 0x%x\n" -msgstr "" - -#: src/stored/parse_bsr.c:812 -#, c-format -msgid "Root bsr : 0x%x\n" -msgstr "" - -#: src/stored/parse_bsr.c:824 -#, c-format -msgid "count : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:825 -#, c-format -msgid "found : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:828 -#, c-format -msgid "done : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:829 -#, c-format -msgid "positioning : %d\n" -msgstr "" - -#: src/stored/parse_bsr.c:830 -#, c-format -msgid "fast_reject : %d\n" -msgstr "" - -#: src/stored/parse_bsr.c:1054 src/stored/parse_bsr.c:1058 -#, c-format -msgid "" -"Bootstrap file error: %s\n" -" : Line %d, col %d of file %s\n" -"%s\n" -msgstr "" - -#: src/stored/read.c:56 -msgid "No Volume names found for restore.\n" -msgstr "" - -#: src/stored/read.c:201 src/stored/read.c:360 -#, c-format -msgid ">filed: Error Hdr=%s\n" -msgstr "" - -#: src/stored/read.c:202 -#, c-format -msgid "Error sending header to Client. ERR=%s\n" -msgstr "" - -#: src/stored/read.c:248 src/stored/read.c:376 -#, c-format -msgid "Error sending to FD. ERR=%s\n" -msgstr "" - -#: src/stored/read.c:249 -#, c-format -msgid "Error sending data to Client. ERR=%s\n" -msgstr "" - -#: src/stored/read.c:332 src/stored/read.c:361 src/stored/read.c:377 -#, c-format -msgid "Error sending to File daemon. ERR=%s\n" -msgstr "" - -#: src/stored/read_records.c:79 -#, c-format -msgid "End of Volume at file %u on device %s, Volume \"%s\"\n" -msgstr "" - -#: src/stored/read_records.c:83 -msgid "End of all volumes.\n" -msgstr "" - -#: src/stored/read_records.c:133 -msgid "Did fsr in attemp to skip bad record.\n" -msgstr "" - -#: src/stored/read_records.c:375 -#, c-format -msgid "Forward spacing Volume \"%s\" to file:block %u:%u.\n" -msgstr "" - -#: src/stored/read_records.c:399 -msgid "Begin Session" -msgstr "" - -#: src/stored/read_records.c:403 -msgid "End Session" -msgstr "" - -#: src/stored/read_records.c:409 -#, c-format -msgid "Unknown code %d\n" -msgstr "" - -#: src/stored/record_util.c:62 -#, c-format -msgid "unknown: %d" -msgstr "" - -#: src/stored/reserve.c:65 -#, c-format -msgid "Unable to initialize reservation lock. ERR=%s\n" -msgstr "" - -#: src/stored/reserve.c:145 -#, c-format -msgid "Hey! num_writers=%d!!!!\n" -msgstr "" - -#: src/stored/reserve.c:260 -msgid "3939 Could not get dcr\n" -msgstr "" - -#: src/stored/reserve.c:369 -#, c-format -msgid "Device reservation failed for JobId=%d: %s\n" -msgstr "" - -#: src/stored/reserve.c:378 -#, c-format -msgid "Failed command: %s\n" -msgstr "" - -#: src/stored/reserve.c:654 -#, c-format -msgid "" -"\n" -" Device \"%s\" requested by DIR is disabled.\n" -msgstr "" - -#: src/stored/reserve.c:669 -#, c-format -msgid "3926 Could not get dcr for device: %s\n" -msgstr "" - -#: src/stored/reserve.c:809 -#, c-format -msgid "3603 JobId=%u %s device %s is busy reading.\n" -msgstr "" - -#: src/stored/reserve.c:818 -#, c-format -msgid "3604 JobId=%u %s device %s is BLOCKED due to user unmount.\n" -msgstr "" - -#: src/stored/reserve.c:866 -#, c-format -msgid "3601 JobId=%u %s device %s is BLOCKED due to user unmount.\n" -msgstr "" - -#: src/stored/reserve.c:874 -#, c-format -msgid "" -"3602 JobId=%u %s device %s is busy (already reading/writing). read=%d, " -"writers=%d reserved=%d\n" -msgstr "" - -#: src/stored/reserve.c:913 -#, c-format -msgid "3609 JobId=%u Max concurrent jobs=%d exceeded on %s device %s.\n" -msgstr "" - -#: src/stored/reserve.c:931 -#, c-format -msgid "" -"3610 JobId=%u Aligned volume max bytes does not allow concurrency on drive " -"%s.\n" -msgstr "" - -#: src/stored/reserve.c:941 -#, c-format -msgid "3611 JobId=%u Volume max jobs=%d exceeded on %s device %s.\n" -msgstr "" - -#: src/stored/reserve.c:966 -#, c-format -msgid "" -"3608 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" nreserve=%d on %s " -"device %s.\n" -msgstr "" - -#: src/stored/reserve.c:1018 -#, c-format -msgid "3605 JobId=%u wants free drive but %s device %s is busy.\n" -msgstr "" - -#: src/stored/reserve.c:1027 -#, c-format -msgid "3606 JobId=%u prefers mounted drives, but %s device %s has no Volume.\n" -msgstr "" - -#: src/stored/reserve.c:1049 -#, c-format -msgid "3607 JobId=%u wants Vol=\"%s\" drive has Vol=\"%s\" on %s device %s.\n" -msgstr "" - -#: src/stored/reserve.c:1104 -#, c-format -msgid "Logic error!!!! JobId=%u Should not get here.\n" -msgstr "" - -#: src/stored/reserve.c:1105 -#, c-format -msgid "3910 JobId=%u Logic error!!!! %s device %s Should not get here.\n" -msgstr "" - -#: src/stored/reserve.c:1108 -msgid "Logic error!!!! Should not get here.\n" -msgstr "" - -#: src/stored/reserve.c:1111 -#, c-format -msgid "3911 JobId=%u failed reserve %s device %s.\n" -msgstr "" - -#: src/stored/spool.c:72 -msgid "Spooling statistics:\n" -msgstr "" - -#: src/stored/spool.c:75 -#, c-format -msgid "" -"Data spooling: %u active jobs, %s bytes; %u total jobs, %s max bytes/job.\n" -msgstr "" - -#: src/stored/spool.c:83 -#, c-format -msgid "Attr spooling: %u active jobs, %s bytes; %u total jobs, %s max bytes.\n" -msgstr "" - -#: src/stored/spool.c:104 -msgid "Spooling data ...\n" -msgstr "" - -#: src/stored/spool.c:130 -#, c-format -msgid "Bad return from despool WroteVol=%d\n" -msgstr "" - -#: src/stored/spool.c:163 -#, c-format -msgid "Open data spool file %s failed: ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:191 -msgid "Despooling zero bytes. Your disk is probably FULL!\n" -msgstr "" - -#: src/stored/spool.c:200 -#, c-format -msgid "Committing spooled data to Volume \"%s\". Despooling %s bytes ...\n" -msgstr "" - -#: src/stored/spool.c:205 -#, c-format -msgid "Writing spooled data to Volume. Despooling %s bytes ...\n" -msgstr "" - -#: src/stored/spool.c:295 -#, c-format -msgid "" -"Despooling elapsed time = %02d:%02d:%02d, Transfer rate = %s Bytes/second\n" -msgstr "" - -#: src/stored/spool.c:304 src/stored/spool.c:505 src/stored/spool.c:551 -#, c-format -msgid "Ftruncate spool file failed: ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:363 -#, c-format -msgid "Spool header read error. ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:366 -#, c-format -msgid "Spool read error. Wanted %u bytes, got %d\n" -msgstr "" - -#: src/stored/spool.c:367 -#, c-format -msgid "Spool header read error. Wanted %u bytes, got %d\n" -msgstr "" - -#: src/stored/spool.c:374 src/stored/spool.c:375 -#, c-format -msgid "Spool block too big. Max %u bytes, got %u\n" -msgstr "" - -#: src/stored/spool.c:381 src/stored/spool.c:382 -#, c-format -msgid "Spool data read error. Wanted %u bytes, got %d\n" -msgstr "" - -#: src/stored/spool.c:436 -#, c-format -msgid "" -"User specified Job spool size reached: JobSpoolSize=%s MaxJobSpoolSize=%s\n" -msgstr "" - -#: src/stored/spool.c:441 -#, c-format -msgid "" -"User specified Device spool size reached: DevSpoolSize=%s MaxDevSpoolSize=" -"%s\n" -msgstr "" - -#: src/stored/spool.c:448 -msgid "Bad return from despool in write_block.\n" -msgstr "" - -#: src/stored/spool.c:456 -msgid "Spooling data again ...\n" -msgstr "" - -#: src/stored/spool.c:488 -#, c-format -msgid "Error writing header to spool file. ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:493 -#, c-format -msgid "" -"Error writing header to spool file. Disk probably full. Attempting recovery. " -"Wanted to write=%d got=%d\n" -msgstr "" - -#: src/stored/spool.c:511 src/stored/spool.c:557 -msgid "Fatal despooling error." -msgstr "" - -#: src/stored/spool.c:519 -msgid "Retrying after header spooling error failed.\n" -msgstr "" - -#: src/stored/spool.c:535 -#, c-format -msgid "Error writing data to spool file. ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:568 -msgid "Retrying after data spooling error failed.\n" -msgstr "" - -#: src/stored/spool.c:655 -msgid "Network error on BlastAttributes.\n" -msgstr "" - -#: src/stored/spool.c:679 src/stored/spool.c:703 -#, c-format -msgid "Fseek on attributes file failed: ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:691 -#, c-format -msgid "Truncate on attributes file failed: ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:715 -#, c-format -msgid "Sending spooled attrs to the Director. Despooling %s bytes ...\n" -msgstr "" - -#: src/stored/spool.c:741 -#, c-format -msgid "fopen attr spool file %s failed: ERR=%s\n" -msgstr "" - -#: src/stored/status.c:86 -msgid "Used Volume status:\n" -msgstr "" - -#: src/stored/status.c:108 -msgid "" -"\n" -"SD Resources:\n" -msgstr "" - -#: src/stored/status.c:144 -#, c-format -msgid "3900 missing args in .status command: %s\n" -msgstr "" - -#: src/stored/status.c:149 -msgid "" -"\n" -"SD Shared Storage:\n" -msgstr "" - -#: src/stored/status.c:294 -#, c-format -msgid "" -"\n" -"Device \"%s\" is not open or does not exist.\n" -msgstr "" - -#: src/stored/status.c:303 -#, c-format -msgid "" -"\n" -"Device %s is %s %s:\n" -" Volume: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" - -#: src/stored/status.c:308 -msgid "waiting for" -msgstr "" - -#: src/stored/status.c:308 -msgid "mounted with" -msgstr "" - -#: src/stored/status.c:310 -msgid "*unknown*" -msgstr "" - -#: src/stored/status.c:314 -#, c-format -msgid "" -"\n" -"Device %s: %s open but no Bacula volume is currently mounted.\n" -msgstr "" - -#: src/stored/status.c:325 -#, c-format -msgid " Total Bytes=%s Blocks=%s Bytes/block=%s\n" -msgstr "" - -#: src/stored/status.c:340 -#, c-format -msgid " Total Bytes Read=%s Blocks Read=%s Bytes/block=%s\n" -msgstr "" - -#: src/stored/status.c:346 -#, c-format -msgid " Positioned at File=%s Block=%s\n" -msgstr "" - -#: src/stored/status.c:352 -#, c-format -msgid "" -"\n" -"Device %s: %s is not open.\n" -msgstr "" - -#: src/stored/status.c:366 -#, c-format -msgid " Available Space=%sB\n" -msgstr "" - -#: src/stored/status.c:374 -#, c-format -msgid "" -" shstore=%d registered=%d locked=%d blockedbySD=%s\n" -"\n" -msgstr "" - -#: src/stored/status.c:425 -#, c-format -msgid "Autochanger \"%s\" with devices:\n" -msgstr "" - -#: src/stored/status.c:449 -msgid "" -"\n" -"Device status:\n" -msgstr "" - -#: src/stored/status.c:506 -#, c-format -msgid "Daemon started %s. Jobs: run=%d, running=%d.\n" -msgstr "" - -#: src/stored/status.c:521 -#, c-format -msgid " Res: ndevices=%d nautochgr=%d\n" -msgstr "" - -#: src/stored/status.c:534 -msgid "" -"No DEVICE structure.\n" -"\n" -msgstr "" - -#: src/stored/status.c:540 -#, c-format -msgid " Device is BLOCKED by another SD=%s\n" -msgstr "" - -#: src/stored/status.c:545 -msgid " Device is disabled. User command.\n" -msgstr "" - -#: src/stored/status.c:550 -msgid " Device is BLOCKED. User unmounted.\n" -msgstr "" - -#: src/stored/status.c:554 -msgid " Device is BLOCKED. User unmounted during wait for media/mount.\n" -msgstr "" - -#: src/stored/status.c:565 -#, c-format -msgid "" -" Device is BLOCKED waiting for mount of volume \"%s\",\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" - -#: src/stored/status.c:574 -#, c-format -msgid "" -" Device is BLOCKED waiting to create a volume for:\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" - -#: src/stored/status.c:586 -msgid " Device is BLOCKED waiting for media.\n" -msgstr "" - -#: src/stored/status.c:592 -msgid " Device is being initialized.\n" -msgstr "" - -#: src/stored/status.c:596 -msgid " Device is blocked labeling a Volume.\n" -msgstr "" - -#: src/stored/status.c:605 -#, c-format -msgid " Slot %d %s loaded in drive %d.\n" -msgstr "" - -#: src/stored/status.c:609 -#, c-format -msgid " Drive %d is not loaded.\n" -msgstr "" - -#: src/stored/status.c:644 -msgid "Device state:\n" -msgstr "" - -#: src/stored/status.c:660 -#, c-format -msgid " num_writers=%d reserves=%d block=%d enabled=%d\n" -msgstr "" - -#: src/stored/status.c:664 -msgid "Attached JobIds: " -msgstr "" - -#: src/stored/status.c:684 -#, c-format -msgid " Archive name: %s Device name: %s\n" -msgstr "" - -#: src/stored/status.c:687 -#, c-format -msgid " File=%u block=%u\n" -msgstr "" - -#: src/stored/status.c:689 -#, c-format -msgid " Min block=%u Max block=%u\n" -msgstr "" - -#: src/stored/status.c:821 -#, c-format -msgid "%s Job %s waiting for Client connection.\n" -msgstr "" - -#: src/stored/status.c:837 -#, c-format -msgid "" -"Reading: %s %s job %s JobId=%d Volume=\"%s\"\n" -" pool=\"%s\" device=%s\n" -msgstr "" - -#: src/stored/status.c:850 -#, c-format -msgid "" -"Writing: %s %s job %s JobId=%d Volume=\"%s\"\n" -" pool=\"%s\" device=%s\n" -msgstr "" - -#: src/stored/status.c:861 -#, c-format -msgid " spooling=%d despooling=%d despool_wait=%d\n" -msgstr "" - -#: src/stored/status.c:885 -#, c-format -msgid " Files=%s Bytes=%s AveBytes/sec=%s LastBytes/sec=%s\n" -msgstr "" - -#: src/stored/status.c:900 -#, c-format -msgid " FDReadSeqNo=%s in_msg=%u out_msg=%d fd=%d\n" -msgstr "" - -#: src/stored/status.c:906 -msgid " FDSocket closed\n" -msgstr "" - -#: src/stored/status.c:927 -msgid "" -"\n" -"Jobs waiting to reserve a drive:\n" -msgstr "" - -#: src/stored/status.c:1007 -#, c-format -msgid "3900 No arg in .status command: %s\n" -msgstr "" - -#: src/stored/status.c:1076 -msgid "3900 dedupengine is disabled: not compiled in this version.\n" -msgstr "" - -#: src/stored/status.c:1089 -#, c-format -msgid "3900 Unknown arg in .status command: %s\n" -msgstr "" - -#: src/stored/stored.c:79 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bacula-sd [options] [-c config_file] [config_file]\n" -" -c use as configuration file\n" -" -d [,] set debug level to , debug tags to \n" -" -dt print timestamp in debug output\n" -" -f run in foreground (for debugging)\n" -" -g set groupid to group\n" -" -m print kaboom output (for debugging)\n" -" -p proceed despite I/O errors\n" -" -s no signals (for debugging)\n" -" -t test - read config and exit\n" -" -u userid to \n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" - -#: src/stored/stored.c:273 -msgid "Volume Session Time is ZERO!\n" -msgstr "" - -#: src/stored/stored.c:282 -#, c-format -msgid "Unable to create thread. ERR=%s\n" -msgstr "" - -#: src/stored/stored.c:592 -#, c-format -msgid "Unable to stat ControlDevice %s: ERR=%s\n" -msgstr "" - -#: src/stored/stored.c:598 -msgid "No plugin directory configured for SAN shared storage\n" -msgstr "" - -#: src/stored/stored.c:619 -#, c-format -msgid "Could not open device %s\n" -msgstr "" - -#: src/stored/stored.c:637 -#, c-format -msgid "Could not mount device %s\n" -msgstr "" - -#: src/stored/stored_conf.c:237 -#, c-format -msgid "Expected a Device Type keyword, got: %s" -msgstr "" - -#: src/stored/stored_conf.c:251 -#, c-format -msgid "" -"Maximum Block Size configured value %u is greater than allowed maximum: %u" -msgstr "" - -#: src/stored/stored_conf.c:264 -#, c-format -msgid "Warning: no \"%s\" resource (%d) defined.\n" -msgstr "" - -#: src/stored/stored_conf.c:267 -#, c-format -msgid "dump_resource type=%d\n" -msgstr "" - -#: src/stored/stored_conf.c:391 -#, c-format -msgid "Warning: unknown resource type %d\n" -msgstr "" - -#: src/stored/stored_conf.c:601 -#, c-format -msgid "\"%s\" item is required in \"%s\" resource, but not found.\n" -msgstr "" - -#: src/stored/stored_conf.c:607 -#, c-format -msgid "Too many items in \"%s\" resource\n" -msgstr "" - -#: src/stored/stored_conf.c:641 -#, c-format -msgid "Cannot find AutoChanger resource %s\n" -msgstr "" - -#: src/stored/stored_conf.c:657 -#, c-format -msgid "Unable to init lock: ERR=%s\n" -msgstr "" - -#: src/stored/tape_dev.c:227 -#, c-format -msgid "No tape loaded or drive offline on %s.\n" -msgstr "" - -#: src/stored/tape_dev.c:237 -#, c-format -msgid "Rewind error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:262 -#, c-format -msgid "Bad call to eod. Device %s not open\n" -msgstr "" - -#: src/stored/tape_dev.c:334 -#, c-format -msgid "ioctl MTEOM error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:429 -msgid "Bad call to load_dev. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:440 src/stored/tape_dev.c:453 -#, c-format -msgid "ioctl MTLOAD error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:484 -#, c-format -msgid "ioctl MTOFFL error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:525 -msgid "Bad call to fsf. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:536 src/stored/tape_dev.c:663 -#, c-format -msgid "Device %s at End of Tape.\n" -msgstr "" - -#: src/stored/tape_dev.c:567 src/stored/tape_dev.c:643 -#, c-format -msgid "ioctl MTFSF error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:692 -msgid "Bad call to bsf. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:698 -#, c-format -msgid "Device %s cannot BSF because it is not a tape.\n" -msgstr "" - -#: src/stored/tape_dev.c:715 -#, c-format -msgid "ioctl MTBSF error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:734 -msgid "Bad call to fsr. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:744 -#, c-format -msgid "ioctl MTFSR not permitted on %s.\n" -msgstr "" - -#: src/stored/tape_dev.c:772 -#, c-format -msgid "ioctl MTFSR %d error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:790 -msgid "Bad call to bsr_dev. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:800 -#, c-format -msgid "ioctl MTBSR not permitted on %s.\n" -msgstr "" - -#: src/stored/tape_dev.c:814 -#, c-format -msgid "ioctl MTBSR error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:920 -msgid "Bad call to weof_dev. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:930 -msgid "Attempt to WEOF on non-appendable Volume\n" -msgstr "" - -#: src/stored/tape_dev.c:948 -#, c-format -msgid "ioctl MTWEOF error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/vbackup.c:68 -msgid "Read and write devices not properly initialized.\n" -msgstr "" - -#: src/stored/vbackup.c:74 -#, c-format -msgid "No Volume names found for %s.\n" -msgstr "" - -#: src/stored/vol_mgr.c:81 -#, c-format -msgid "Unable to initialize volume list lock. ERR=%s\n" -msgstr "" - -#: src/stored/vol_mgr.c:371 -#, c-format -msgid "Could not reserve volume \"%s\", because job canceled.\n" -msgstr "" - -#: src/stored/vol_mgr.c:382 -#, c-format -msgid "Could not reserve volume \"%s\" for append, because it will be read.\n" -msgstr "" - -#: src/stored/vol_mgr.c:415 -#, c-format -msgid "Cannot free Volume \"%s\", because it is reserved by someone else.\n" -msgstr "" - -#: src/stored/vol_mgr.c:516 -#, c-format -msgid "Volume %s is busy swapping from %s to %s\n" -msgstr "" - -#: src/stored/vol_mgr.c:519 src/stored/vol_mgr.c:526 -#, c-format -msgid "Volume %s is busy swapping.\n" -msgstr "" - -#: src/stored/vol_mgr.c:523 -#, c-format -msgid "%s device %s is busy.\n" -msgstr "" - -#: src/stored/wait.c:122 -#, c-format -msgid "pthread timedwait error. ERR=%s\n" -msgstr "" - -#: src/stored/wait.c:228 -#, c-format -msgid "JobId=%s, Job %s waiting to reserve a device.\n" -msgstr "" - -#: src/stored/wait.c:274 -#, c-format -msgid "JobId=%s, Job %s waiting device %s.\n" -msgstr "" - -#: src/tools/bbatch.c:65 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"Example : bbatch -w /path/to/workdir -h localhost -f dat1 -f dat -f datx\n" -" will start 3 thread and load dat1, dat and datx in your catalog\n" -"See bbatch.c to generate datafile\n" -"\n" -"Usage: bbatch [ options ] -w working/dir -f datafile\n" -" -b with batch mode\n" -" -B without batch mode\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database host (default NULL)\n" -" -w specify working directory\n" -" -r call restore code with given jobids\n" -" -v verbose\n" -" -f specify data file\n" -" -? print this message\n" -"\n" -msgstr "" - -#: src/tools/bbatch.c:187 src/tools/bbatch.c:236 src/tools/bvfs_test.c:203 -msgid "Could not init Bacula database\n" -msgstr "" - -#: src/tools/bbatch.c:197 -#, c-format -msgid "Computing file list for jobid=%s files=%lld secs=%d\n" -msgstr "" - -#: src/tools/bbatch.c:301 -#, c-format -msgid "Error opening datafile %s\n" -msgstr "" - -#: src/tools/bbatch.c:311 -msgid "Error while inserting file\n" -msgstr "" - -#: src/tools/bregex.c:142 src/tools/bregtest.c:126 src/tools/bwild.c:111 -#, c-format -msgid "Could not open data file: %s\n" -msgstr "" - -#: src/tools/bsmtp.c:119 -#, c-format -msgid "Fatal malformed reply from %s: %s\n" -msgstr "" - -#: src/tools/bsmtp.c:127 -#, c-format -msgid "Fatal fgets error: ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:163 -#, c-format -msgid "" -"\n" -"Usage: %s [-f from] [-h mailhost] [-s subject] [-c copy] [recipient ...]\n" -" -4 forces bsmtp to use IPv4 addresses only.\n" -" -6 forces bsmtp to use IPv6 addresses only.\n" -" -8 set charset to UTF-8\n" -" -a use any ip protocol for address resolution\n" -" -c set the Cc: field\n" -" -d set debug level to \n" -" -dt print a timestamp in debug output\n" -" -f set the From: field\n" -" -h use mailhost:port as the SMTP server\n" -" -s set the Subject: field\n" -" -r set the Reply-To: field\n" -" -l set the maximum number of lines to send (default: " -"unlimited)\n" -" -? print this message.\n" -"\n" -msgstr "" - -#: src/tools/bsmtp.c:350 -msgid "Fatal error: no recipient given.\n" -msgstr "" - -#: src/tools/bsmtp.c:378 -#, c-format -msgid "Fatal gethostname error: ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:389 -#, c-format -msgid "Fatal getaddrinfo for myself failed \"%s\": ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:397 -#, c-format -msgid "Fatal gethostbyname for myself failed \"%s\": ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:457 src/tools/bsmtp.c:492 -#, c-format -msgid "Error unknown mail host \"%s\": ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:460 src/tools/bsmtp.c:495 -msgid "Retrying connection using \"localhost\".\n" -msgstr "" - -#: src/tools/bsmtp.c:485 -#, c-format -msgid "Failed to connect to mailhost %s\n" -msgstr "" - -#: src/tools/bsmtp.c:503 -#, c-format -msgid "Fatal error: Unknown address family for smtp host: %d\n" -msgstr "" - -#: src/tools/bsmtp.c:512 src/tools/bsmtp.c:517 -#, c-format -msgid "Fatal socket error: ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:522 -#, c-format -msgid "Fatal connect error to %s: ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:531 -#, c-format -msgid "Fatal _open_osfhandle error: ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:538 src/tools/bsmtp.c:542 src/tools/bsmtp.c:551 -#: src/tools/bsmtp.c:555 -#, c-format -msgid "Fatal fdopen error: ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:547 -#, c-format -msgid "Fatal dup error: ERR=%s\n" -msgstr "" - -#: src/tools/bsnapshot.c:47 -#, c-format -msgid "" -"ERROR %s\n" -"\n" -msgstr "" - -#: src/tools/bsnapshot.c:51 -#, c-format -msgid "" -"Bacula Systems SA(R) %s (%s)\n" -"\n" -"Usage: bsnapshot\n" -" -d level Set debug level\n" -" -v Verbose\n" -" -s Use sudo\n" -" -o logfile send debug to logfile\n" -" -V volume volume\n" -" -T type volume type\n" -" -t check compatibility\n" -" -c specify configuration file\n" -"\n" -msgstr "" - -#: src/tools/bsnapshot.c:1876 -msgid "Unable to open -p argument for reading" -msgstr "" - -#: src/tools/bvfs_test.c:44 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database host (default NULL)\n" -" -w specify working directory\n" -" -j specify jobids\n" -" -p specify path\n" -" -f specify file\n" -" -l maximum tuple to fetch\n" -" -T truncate cache table before starting\n" -" -v verbose\n" -" -? print this message\n" -"\n" -msgstr "" - -#: src/tools/cats_test.c:47 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database host (default NULL)\n" -" -w specify working directory\n" -" -p specify path\n" -" -f specify file\n" -" -l maximum tuple to fetch\n" -" -q print only errors\n" -" -v verbose\n" -" -? print this message\n" -"\n" -msgstr "" - -#: src/tools/cats_test.c:363 -#, c-format -msgid "Could not open, database \"%s\".\n" -msgstr "" - -#: src/tools/dbcheck.c:178 -msgid "" -"Warning skipping the additional parameters for working directory/dbname/user/" -"password/host.\n" -msgstr "" - -#: src/tools/dbcheck.c:196 -#, c-format -msgid "Error can not find the Catalog name[%s] in the given config file [%s]\n" -msgstr "" - -#: src/tools/dbcheck.c:198 -#, c-format -msgid "Error there is no Catalog section in the given config file [%s]\n" -msgstr "" - -#: src/tools/dbcheck.c:207 -msgid "Error no Director resource defined.\n" -msgstr "" - -#: src/tools/dbcheck.c:231 -msgid "Wrong number of arguments.\n" -msgstr "" - -#: src/tools/dbcheck.c:236 -msgid "Working directory not supplied.\n" -msgstr "" - -#: src/tools/dbcheck.c:272 -msgid "Database port must be a numeric value.\n" -msgstr "" - -#: src/tools/dbcheck.c:275 -msgid "Database port must be a int value.\n" -msgstr "" - -#: src/tools/dbcheck.c:346 -#, c-format -msgid "Hello, this is the database check/correct program.\n" -msgstr "" - -#: src/tools/dbcheck.c:348 -#, c-format -msgid "Modify database is on." -msgstr "" - -#: src/tools/dbcheck.c:350 -#, c-format -msgid "Modify database is off." -msgstr "" - -#: src/tools/dbcheck.c:352 src/tools/dbcheck.c:407 -#, c-format -msgid " Verbose is on.\n" -msgstr "" - -#: src/tools/dbcheck.c:354 src/tools/dbcheck.c:409 -#, c-format -msgid " Verbose is off.\n" -msgstr "" - -#: src/tools/dbcheck.c:356 -#, c-format -msgid "Please select the function you want to perform.\n" +msgid "Failed ASSERT: %s\n" msgstr "" -#: src/tools/dbcheck.c:360 -#, c-format -msgid "" -"\n" -" 1) Toggle modify database flag\n" -" 2) Toggle verbose flag\n" -" 3) Repair bad Path records\n" -" 4) Eliminate duplicate Path records\n" -" 5) Eliminate orphaned Jobmedia records\n" -" 6) Eliminate orphaned File records\n" -" 7) Eliminate orphaned Path records\n" -" 8) Eliminate orphaned FileSet records\n" -" 9) Eliminate orphaned Client records\n" -" 10) Eliminate orphaned Job records\n" -" 11) Eliminate all Admin records\n" -" 12) Eliminate all Restore records\n" -" 13) All (3-12)\n" -" 14) Quit\n" +#: src/baconfig.h:91 +msgid "*None*" msgstr "" -#: src/tools/dbcheck.c:376 -#, c-format +#: src/lib/status.h:78 msgid "" "\n" -" 1) Toggle modify database flag\n" -" 2) Toggle verbose flag\n" -" 3) Check for bad Path records\n" -" 4) Check for duplicate Path records\n" -" 5) Check for orphaned Jobmedia records\n" -" 6) Check for orphaned File records\n" -" 7) Check for orphaned Path records\n" -" 8) Check for orphaned FileSet records\n" -" 9) Check for orphaned Client records\n" -" 10) Check for orphaned Job records\n" -" 11) Check for all Admin records\n" -" 12) Check for all Restore records\n" -" 13) All (3-12)\n" -" 14) Quit\n" -msgstr "" - -#: src/tools/dbcheck.c:393 -msgid "Select function number: " -msgstr "" - -#: src/tools/dbcheck.c:400 -#, c-format -msgid "Database will be modified.\n" -msgstr "" - -#: src/tools/dbcheck.c:402 -#, c-format -msgid "Database will NOT be modified.\n" -msgstr "" - -#: src/tools/dbcheck.c:481 -#, c-format -msgid "JobId=%s Name=\"%s\" StartTime=%s\n" -msgstr "" - -#: src/tools/dbcheck.c:488 -#, c-format -msgid "Orphaned JobMediaId=%s JobId=%s Volume=\"%s\"\n" -msgstr "" - -#: src/tools/dbcheck.c:495 -#, c-format -msgid "Orphaned FileId=%s JobId=%s Volume=\"%s\"\n" -msgstr "" - -#: src/tools/dbcheck.c:502 -#, c-format -msgid "Orphaned FileSetId=%s FileSet=\"%s\" MD5=%s\n" -msgstr "" - -#: src/tools/dbcheck.c:509 -#, c-format -msgid "Orphaned ClientId=%s Name=\"%s\"\n" +"Terminated Jobs:\n" msgstr "" -#: src/tools/dbcheck.c:562 -#, c-format -msgid "Deleting: %s\n" +#: src/lib/status.h:85 +msgid " JobId Level Files Bytes Status Finished Name \n" msgstr "" -#: src/tools/dbcheck.c:634 -#, c-format -msgid "Checking for duplicate Path entries.\n" +#: src/lib/status.h:87 +msgid "===================================================================\n" msgstr "" -#: src/tools/dbcheck.c:645 -#, c-format -msgid "Found %d duplicate Path records.\n" +#: src/lib/status.h:107 +msgid "Created" msgstr "" -#: src/tools/dbcheck.c:646 src/tools/dbcheck.c:708 src/tools/dbcheck.c:754 -#: src/tools/dbcheck.c:822 src/tools/dbcheck.c:864 src/tools/dbcheck.c:906 -#: src/tools/dbcheck.c:948 src/tools/dbcheck.c:985 src/tools/dbcheck.c:1018 -#: src/tools/dbcheck.c:1052 -msgid "Print them? (yes/no): " +#: src/lib/status.h:111 +msgid "Error" msgstr "" -#: src/tools/dbcheck.c:669 -#, c-format -msgid "Found %d for: %s\n" +#: src/lib/status.h:114 +msgid "Diffs" msgstr "" -#: src/tools/dbcheck.c:699 -#, c-format -msgid "Checking for orphaned JobMedia entries.\n" +#: src/lib/status.h:117 +msgid "Cancel" msgstr "" -#: src/tools/dbcheck.c:707 -#, c-format -msgid "Found %d orphaned JobMedia records.\n" +#: src/lib/status.h:120 +msgid "OK" msgstr "" -#: src/tools/dbcheck.c:725 -#, c-format -msgid "Deleting %d orphaned JobMedia records.\n" +#: src/lib/status.h:123 +msgid "OK -- with warnings" msgstr "" -#: src/tools/dbcheck.c:742 -#, c-format -msgid "Checking for orphaned File entries. This may take some time!\n" +#: src/lib/status.h:126 +msgid "Incomplete" msgstr "" -#: src/tools/dbcheck.c:753 -#, c-format -msgid "Found %d orphaned File records.\n" +#: src/lib/status.h:129 +msgid "Other" msgstr "" -#: src/tools/dbcheck.c:770 +#: src/lib/status.h:141 #, c-format -msgid "Deleting %d orphaned File records.\n" +msgid "%6d\t%-6s\t%8s\t%10s\t%-7s\t%-8s\t%s\n" msgstr "" -#: src/tools/dbcheck.c:789 +#: src/lib/status.h:149 #, c-format -msgid "Pruning orphaned Path entries isn't possible when using BVFS.\n" -msgstr "" - -#: src/tools/dbcheck.c:798 -msgid "Create temporary index? (yes/no): " +msgid "%6d %-6s %8s %10s %-7s %-8s %s\n" msgstr "" -#: src/tools/dbcheck.c:810 -#, c-format -msgid "Checking for orphaned Path entries. This may take some time!\n" +#: src/lib/status.h:178 src/lib/status.h:189 src/lib/status.h:203 +#: src/lib/status.h:207 src/lib/status.h:211 +msgid "Bacula " msgstr "" -#: src/tools/dbcheck.c:821 +#: src/qt-console/bat_conf.cpp:133 #, c-format -msgid "Found %d orphaned Path records.\n" +msgid "No record for %d %s\n" msgstr "" -#: src/tools/dbcheck.c:834 +#: src/qt-console/bat_conf.cpp:142 #, c-format -msgid "Deleting %d orphaned Path records.\n" +msgid "Director: name=%s address=%s DIRport=%d\n" msgstr "" -#: src/tools/dbcheck.c:853 +#: src/qt-console/bat_conf.cpp:146 #, c-format -msgid "Checking for orphaned FileSet entries. This takes some time!\n" +msgid "Console: name=%s\n" msgstr "" -#: src/tools/dbcheck.c:863 +#: src/qt-console/bat_conf.cpp:149 +#: src/qt-console/tray-monitor/tray_conf.cpp:187 #, c-format -msgid "Found %d orphaned FileSet records.\n" +msgid "ConsoleFont: name=%s font face=%s\n" msgstr "" -#: src/tools/dbcheck.c:878 +#: src/qt-console/bat_conf.cpp:153 src/qt-console/bat_conf.cpp:234 +#: src/qt-console/bat_conf.cpp:284 src/qt-console/bat_conf.cpp:314 #, c-format -msgid "Deleting %d orphaned FileSet records.\n" +msgid "Unknown resource type %d\n" msgstr "" -#: src/tools/dbcheck.c:887 +#: src/qt-console/bat_conf.cpp:262 +#: src/qt-console/tray-monitor/tray_conf.cpp:280 #, c-format -msgid "Checking for orphaned Client entries.\n" +msgid "%s item is required in %s resource, but not found.\n" msgstr "" -#: src/tools/dbcheck.c:905 +#: src/qt-console/bat_conf.cpp:331 +#: src/qt-console/tray-monitor/tray_conf.cpp:364 #, c-format -msgid "Found %d orphaned Client records.\n" +msgid "Attempt to define second %s resource named \"%s\" is not permitted.\n" msgstr "" -#: src/tools/dbcheck.c:920 +#: src/qt-console/bcomm/dircomm.cpp:89 #, c-format -msgid "Deleting %d orphaned Client records.\n" +msgid "Already connected\"%s\".\n" msgstr "" -#: src/tools/dbcheck.c:929 +#: src/qt-console/bcomm/dircomm.cpp:100 +#: src/qt-console/tray-monitor/tray-monitor.cpp:353 #, c-format -msgid "Checking for orphaned Job entries.\n" +msgid "Connecting to Director %s:%d" msgstr "" -#: src/tools/dbcheck.c:947 +#: src/qt-console/bcomm/dircomm.cpp:102 #, c-format -msgid "Found %d orphaned Job records.\n" +msgid "" +"Connecting to Director %s:%d\n" +"\n" msgstr "" -#: src/tools/dbcheck.c:962 +#: src/qt-console/bcomm/dircomm.cpp:154 #, c-format -msgid "Deleting %d orphaned Job records.\n" +msgid "Failed to initialize TLS context for Console \"%s\".\n" msgstr "" -#: src/tools/dbcheck.c:964 +#: src/qt-console/bcomm/dircomm.cpp:177 #, c-format -msgid "Deleting JobMedia records of orphaned Job records.\n" +msgid "Failed to initialize TLS context for Director \"%s\".\n" msgstr "" -#: src/tools/dbcheck.c:966 -#, c-format -msgid "Deleting Log records of orphaned Job records.\n" +#: src/qt-console/bcomm/dircomm.cpp:199 +#: src/qt-console/tray-monitor/tray-monitor.cpp:358 +msgid "Director daemon" msgstr "" -#: src/tools/dbcheck.c:975 -#, c-format -msgid "Checking for Admin Job entries.\n" +#: src/qt-console/bcomm/dircomm.cpp:237 +msgid "Initializing ..." msgstr "" -#: src/tools/dbcheck.c:984 -#, c-format -msgid "Found %d Admin Job records.\n" +#: src/qt-console/bcomm/dircomm.cpp:253 src/qt-console/console/console.cpp:134 +msgid "Connected" msgstr "" -#: src/tools/dbcheck.c:999 -#, c-format -msgid "Deleting %d Admin Job records.\n" +#: src/qt-console/bcomm/dircomm.cpp:377 +msgid "Command completed ..." msgstr "" -#: src/tools/dbcheck.c:1008 -#, c-format -msgid "Checking for Restore Job entries.\n" +#: src/qt-console/bcomm/dircomm.cpp:384 src/qt-console/console/console.cpp:371 +msgid "Processing command ..." msgstr "" -#: src/tools/dbcheck.c:1017 -#, c-format -msgid "Found %d Restore Job records.\n" +#: src/qt-console/bcomm/dircomm.cpp:391 +msgid "At main prompt waiting for input ..." msgstr "" -#: src/tools/dbcheck.c:1032 -#, c-format -msgid "Deleting %d Restore Job records.\n" +#: src/qt-console/bcomm/dircomm.cpp:398 src/qt-console/bcomm/dircomm.cpp:408 +msgid "At prompt waiting for input ..." msgstr "" -#: src/tools/dbcheck.c:1042 -#, c-format -msgid "Checking for Paths without a trailing slash\n" +#: src/qt-console/bcomm/dircomm.cpp:416 +msgid "Command failed." msgstr "" -#: src/tools/dbcheck.c:1051 -#, c-format -msgid "Found %d bad Path records.\n" +#: src/qt-console/bcomm/dircomm.cpp:488 +msgid "Director disconnected." msgstr "" -#: src/tools/dbcheck.c:1068 +#: src/qt-console/bcomm/dircomm_auth.cpp:111 #, c-format -msgid "Reparing %d bad Filename records.\n" +msgid "Director authorization problem at \"%s:%d\"\n" msgstr "" -#: src/tools/dbcheck.c:1214 +#: src/qt-console/bcomm/dircomm_auth.cpp:118 #, c-format msgid "" -"Ok. Index over the %s column already exists and dbcheck will work faster.\n" +"Authorization problem: Remote server at \"%s:%d\" did not advertise required " +"TLS support.\n" msgstr "" -#: src/tools/dbcheck.c:1217 +#: src/qt-console/bcomm/dircomm_auth.cpp:126 #, c-format msgid "" -"Note. Index over the %s column not found, that can greatly slow down " -"dbcheck.\n" +"Authorization problem with Director at \"%s:%d\": Remote server requires " +"TLS.\n" msgstr "" -#: src/tools/dbcheck.c:1232 +#: src/qt-console/bcomm/dircomm_auth.cpp:137 #, c-format -msgid "Create temporary index... This may take some time!\n" +msgid "TLS negotiation failed with Director at \"%s:%d\"\n" msgstr "" -#: src/tools/dbcheck.c:1240 +#: src/qt-console/bcomm/dircomm_auth.cpp:149 #, c-format -msgid "Temporary index created.\n" +msgid "" +"Bad response to Hello command: ERR=%s\n" +"The Director at \"%s:%d\" is probably not running.\n" msgstr "" -#: src/tools/dbcheck.c:1255 +#: src/qt-console/bcomm/dircomm_auth.cpp:158 #, c-format -msgid "Drop temporary index.\n" +msgid "Director at \"%s:%d\" rejected Hello command\n" msgstr "" -#: src/tools/dbcheck.c:1265 +#: src/qt-console/bcomm/dircomm_auth.cpp:173 #, c-format -msgid "Temporary index %s deleted.\n" +msgid "" +"Authorization problem with Director at \"%s:%d\"\n" +"Most likely the passwords do not agree.\n" +"If you are using TLS, there may have been a certificate validation error " +"during the TLS handshake.\n" +"For help, please see " msgstr "" -#: src/tools/drivetype.c:29 -#, c-format -msgid "" -"\n" -"Usage: drivetype [-v] path ...\n" -"\n" -" Print the drive type a given file/directory is on.\n" -" The following options are supported:\n" -"\n" -" -l print local fixed hard drive\n" -" -a display information on all drives\n" -" -v print both path and file system type.\n" -" -? print this message.\n" -"\n" +#: src/qt-console/main.cpp:159 +msgid "Cryptography library initialization failed.\n" msgstr "" -#: src/tools/drivetype.c:60 +#: src/qt-console/main.cpp:163 #, c-format -msgid "%s: unknown\n" +msgid "Please correct configuration file: %s\n" msgstr "" -#: src/tools/fstype.c:29 +#: src/qt-console/main.cpp:187 #, c-format msgid "" "\n" -"Usage: fstype [-v] path ...\n" +"Version: %s (%s) %s %s %s\n" "\n" -" Print the file system type for each file/directory argument given.\n" -" The following options are supported:\n" -"\n" -" -l print all file system types in mtab.\n" -" -m print full entries in mtab.\n" -" -v print both path and file system type of each argument.\n" -" -? print this message.\n" +"Usage: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" +" -c set configuration file to file\n" +" -dnn set debug level to nn\n" +" -s no signals\n" +" -t test - read configuration and exit\n" +" -? print this message.\n" "\n" msgstr "" -#: src/tools/fstype.c:163 -#, c-format -msgid "%s: unknown file system type\n" +#: src/qt-console/main.cpp:220 src/qt-console/main.cpp:250 +msgid "TLS required but not configured in Bacula.\n" msgstr "" -#: src/tools/testfind.c:57 +#: src/qt-console/main.cpp:228 #, c-format msgid "" -"\n" -"Usage: testfind [-d debug_level] [-] [pattern1 ...]\n" -" -a print extended attributes (Win32 debug)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -c specify config file containing FileSet resources\n" -" -f specify which FileSet to use\n" -" -? print this message.\n" -"\n" -"Patterns are used for file inclusion -- normally directories.\n" -"Debug level >= 1 prints each file found.\n" -"Debug level >= 10 prints path/file for catalog.\n" -"Errors are always printed.\n" -"Files/paths truncated is the number of files/paths with len > 255.\n" -"Truncation is only in the catalog.\n" -"\n" +"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " +"Director \"%s\" in %s. At least one CA certificate store is required.\n" msgstr "" -#: src/tools/testfind.c:223 +#: src/qt-console/main.cpp:237 #, c-format msgid "" -"\n" -"Total files : %d\n" -"Max file length: %d\n" -"Max path length: %d\n" -"Files truncated: %d\n" -"Paths truncated: %d\n" -"Hard links : %d\n" +"No Director resource defined in %s\n" +"Without that I don't how to speak to the Director :-(\n" msgstr "" -#: src/tools/testfind.c:264 +#: src/qt-console/main.cpp:258 #, c-format -msgid "Reg: %s\n" -msgstr "" - -#: src/tools/testfind.c:286 -msgid "\t[will not descend: recursion turned off]" -msgstr "" - -#: src/tools/testfind.c:288 -msgid "\t[will not descend: file system change not allowed]" -msgstr "" - -#: src/tools/testfind.c:290 -msgid "\t[will not descend: disallowed file system]" -msgstr "" - -#: src/tools/testfind.c:292 -msgid "\t[will not descend: disallowed drive type]" +msgid "" +"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " +"Console \"%s\" in %s.\n" msgstr "" -#: src/tools/testfind.c:308 src/tools/testls.c:203 -#, c-format -msgid "Err: Could not access %s: %s\n" +#: src/qt-console/tray-monitor/authenticate.cpp:79 +msgid "" +"Director authorization problem.\n" +"Most likely the passwords do not agree.\n" +"For help, please see " msgstr "" -#: src/tools/testfind.c:311 src/tools/testls.c:206 +#: src/qt-console/tray-monitor/authenticate.cpp:88 #, c-format -msgid "Err: Could not follow ff->link %s: %s\n" +msgid "Bad response to Hello command: ERR=%s\n" msgstr "" -#: src/tools/testfind.c:314 src/tools/testls.c:209 -#, c-format -msgid "Err: Could not stat %s: %s\n" +#: src/qt-console/tray-monitor/authenticate.cpp:95 +msgid "Director rejected Hello command\n" msgstr "" -#: src/tools/testfind.c:317 src/tools/testls.c:212 +#: src/qt-console/tray-monitor/authenticate.cpp:123 #, c-format -msgid "Skip: File not saved. No change. %s\n" +msgid "Error sending Hello to Storage daemon. ERR=%s\n" msgstr "" -#: src/tools/testfind.c:320 src/tools/testls.c:215 -#, c-format -msgid "Err: Attempt to backup archive. Not saved. %s\n" +#: src/qt-console/tray-monitor/authenticate.cpp:129 +msgid "" +"Director and Storage daemon passwords or names not the same.\n" +"For help, please see " msgstr "" -#: src/tools/testfind.c:323 src/tools/testls.c:224 +#: src/qt-console/tray-monitor/authenticate.cpp:136 #, c-format -msgid "Err: Could not open directory %s: %s\n" +msgid "bdirdtype %d: %s\n" +#: src/qt-console/tray-monitor/authenticate.cpp:143 +msgid "Storage daemon rejected Hello command\n" msgstr "" -#: src/tools/testfind.c:376 +#: src/qt-console/tray-monitor/authenticate.cpp:169 #, c-format -msgid "===== Filename truncated to 255 chars: %s\n" +msgid "Error sending Hello to File daemon. ERR=%s\n" msgstr "" -#: src/tools/testfind.c:393 -#, c-format -msgid "========== Path name truncated to 255 chars: %s\n" +#: src/qt-console/tray-monitor/authenticate.cpp:175 +msgid "" +"Director and File daemon passwords or names not the same.\n" +"For help, please see " msgstr "" -#: src/tools/testfind.c:402 +#: src/qt-console/tray-monitor/authenticate.cpp:182 #, c-format -msgid "========== Path length is zero. File=%s\n" +msgid "Bad response from File daemon to Hello command: ERR=%s\n" msgstr "" -#: src/tools/testfind.c:405 -#, c-format -msgid "Path: %s\n" +#: src/qt-console/tray-monitor/authenticate.cpp:189 +msgid "File daemon rejected Hello command\n" msgstr "" -#: src/tools/testls.c:47 +#: src/qt-console/tray-monitor/tray-monitor.cpp:59 #, c-format msgid "" "\n" -"Usage: testls [-d debug_level] [-] [pattern1 ...]\n" -" -a print extended attributes (Win32 debug)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -e specify file of exclude patterns\n" -" -i specify file of include patterns\n" -" -q quiet, don't print filenames (debug)\n" -" - read pattern(s) from stdin\n" -" -? print this message.\n" +"Version: %s (%s) %s %s %s\n" "\n" -"Patterns are file inclusion -- normally directories.\n" -"Debug level >= 1 prints each file found.\n" -"Debug level >= 10 prints path/file for catalog.\n" -"Errors always printed.\n" -"Files/paths truncated is number with len > 255.\n" -"Truncation is only in catalog.\n" +"Usage: tray-monitor [-c config_file] [-d debug_level]\n" +" -c set configuration file to file\n" +" -d set debug level to \n" +" -dt print timestamp in debug output\n" +" -t test - read configuration and exit\n" +" -? print this message.\n" "\n" msgstr "" -#: src/tools/testls.c:143 +#: src/qt-console/tray-monitor/tray-monitor.cpp:210 #, c-format -msgid "Could not open include file: %s\n" +msgid "" +"Error: %d Monitor resources defined in %s. You must define one and only one " +"Monitor resource.\n" msgstr "" -#: src/tools/testls.c:156 +#: src/qt-console/tray-monitor/tray-monitor.cpp:242 #, c-format -msgid "Could not open exclude file: %s\n" +msgid "" +"No Client, Storage or Director resource defined in %s\n" +"Without that I don't how to get status from the File, Storage or Director " +"Daemon :-(\n" msgstr "" -#: src/tools/testls.c:170 +#: src/qt-console/tray-monitor/tray-monitor.cpp:257 #, c-format -msgid "Files seen = %d\n" +msgid "" +"Invalid refresh interval defined in %s\n" +"This value must be greater or equal to 1 second and less or equal to 10 " +"minutes (read value: %d).\n" msgstr "" -#: src/tools/testls.c:218 +#: src/qt-console/tray-monitor/tray-monitor.cpp:325 #, c-format -msgid "Recursion turned off. Directory not entered. %s\n" +msgid "Error, currentitem is not a Client or a Storage..\n" msgstr "" -#: src/tools/testls.c:221 +#: src/qt-console/tray-monitor/tray-monitor.cpp:363 #, c-format -msgid "Skip: File system change prohibited. Directory not entered. %s\n" +msgid "Connecting to Client %s:%d" msgstr "" -#: src/win32/compat/compat.cpp:2855 -msgid "" -"\n" -"\n" -"Bacula ERROR: " +#: src/qt-console/tray-monitor/tray-monitor.cpp:368 +msgid "File daemon" msgstr "" -#: src/win32/filed/plugins/vssapi.c:1428 +#: src/qt-console/tray-monitor/tray-monitor.cpp:373 #, c-format -msgid "Unable to resolve parent path for %ls\n" -msgstr "" - -#: src/win32/filed/plugins/vssfs.c:226 src/win32/filed/plugins/vssfs.c:238 -msgid "Unable to parse user supplied restore configuration\n" -msgstr "" - -#: src/win32/libwin32/main.cpp:226 -msgid "Bad Command Line Option" -msgstr "" - -#: src/win32/libwin32/service.cpp:96 -msgid "RegisterServiceCtlHandler failed" -msgstr "" - -#: src/win32/libwin32/service.cpp:97 -msgid "Failure contacting the Service Handler" -msgstr "" - -#: src/win32/libwin32/service.cpp:108 -msgid "Service start report failed" -msgstr "" - -#: src/win32/libwin32/service.cpp:161 -msgid "StartServiceCtrlDispatcher failed." -msgstr "" - -#: src/win32/libwin32/service.cpp:168 -msgid "KERNEL32.DLL not found: Bacula service not started" -msgstr "" - -#: src/win32/libwin32/service.cpp:178 -msgid "Registry service not found: Bacula service not started" -msgstr "" - -#: src/win32/libwin32/service.cpp:180 -msgid "Registry service entry point not found" -msgstr "" - -#: src/win32/libwin32/service.cpp:201 -msgid "Report Service failure" -msgstr "" - -#: src/win32/libwin32/service.cpp:232 -msgid "Unable to install the service" -msgstr "" - -#: src/win32/libwin32/service.cpp:240 -msgid "Service command length too long" -msgstr "" - -#: src/win32/libwin32/service.cpp:241 -msgid "Service command length too long. Service not registered." +msgid "Connecting to Storage %s:%d" msgstr "" -#: src/win32/libwin32/service.cpp:254 -msgid "" -"The Service Control Manager could not be contacted - the service was not " -"installed" +#: src/qt-console/tray-monitor/tray-monitor.cpp:378 +msgid "Storage daemon" msgstr "" -#: src/win32/libwin32/service.cpp:277 src/win32/libwin32/service.cpp:306 -#: src/win32/libwin32/service.cpp:352 src/win32/libwin32/service.cpp:359 -#: src/win32/libwin32/service.cpp:363 -msgid "The Bacula service: " +#: src/qt-console/tray-monitor/tray-monitor.cpp:382 +#: src/qt-console/tray-monitor/tray-monitor.cpp:412 +#, c-format +msgid "Error, currentitem is not a Client, a Storage or a Director..\n" msgstr "" -#: src/win32/libwin32/service.cpp:284 -msgid "" -"Provides file backup and restore services. Bacula -- the network backup " -"solution." +#: src/qt-console/tray-monitor/tray-monitor.cpp:387 +msgid "Cannot connect to daemon." msgstr "" -#: src/win32/libwin32/service.cpp:295 -msgid "Cannot write System Registry for " +#: src/qt-console/tray-monitor/tray-monitor.cpp:396 +#, c-format +msgid "Authentication error : %s" msgstr "" -#: src/win32/libwin32/service.cpp:296 -msgid "" -"The System Registry could not be updated - the Bacula service was not " -"installed" +#: src/qt-console/tray-monitor/tray-monitor.cpp:403 +msgid "Opened connection with Director daemon." msgstr "" -#: src/win32/libwin32/service.cpp:305 -msgid "Cannot add Bacula key to System Registry" +#: src/qt-console/tray-monitor/tray-monitor.cpp:406 +msgid "Opened connection with File daemon." msgstr "" -#: src/win32/libwin32/service.cpp:316 -msgid "The " +#: src/qt-console/tray-monitor/tray-monitor.cpp:409 +msgid "Opened connection with Storage daemon." msgstr "" -#: src/win32/libwin32/service.cpp:370 -msgid "An existing Bacula service: " +#: src/qt-console/tray-monitor/tray-monitor.cpp:460 +msgid "Error : BNET_HARDEOF or BNET_ERROR" msgstr "" -#: src/win32/libwin32/service.cpp:378 -msgid "" -"The service Manager could not be contacted - the Bacula service was not " -"removed" +#: src/qt-console/tray-monitor/tray-monitor.cpp:469 +msgid "Error : Connection closed." msgstr "" -#: src/win32/libwin32/service.cpp:391 -msgid "" -"Could not find registry entry.\n" -"Service probably not registerd - the Bacula service was not removed" +#: src/qt-console/tray-monitor/tray_conf.cpp:160 +#, c-format +msgid "No %s resource defined\n" msgstr "" -#: src/win32/libwin32/service.cpp:398 -msgid "Could not delete Registry key for " +#: src/qt-console/tray-monitor/tray_conf.cpp:169 +#, c-format +msgid "Monitor: name=%s FDtimeout=%s SDtimeout=%s\n" msgstr "" -#: src/win32/libwin32/service.cpp:408 -msgid "Bacula could not be contacted, probably not running" +#: src/qt-console/tray-monitor/tray_conf.cpp:175 +#, c-format +msgid "Director: name=%s address=%s FDport=%d\n" msgstr "" -#: src/win32/libwin32/service.cpp:415 -msgid "The Bacula service has been removed" +#: src/qt-console/tray-monitor/tray_conf.cpp:179 +#, c-format +msgid "Client: name=%s address=%s FDport=%d\n" msgstr "" -#: src/win32/libwin32/service.cpp:456 -msgid "SetServiceStatus failed" +#: src/qt-console/tray-monitor/tray_conf.cpp:183 +#, c-format +msgid "Storage: name=%s address=%s SDport=%d\n" msgstr "" -#: src/win32/libwin32/service.cpp:482 +#: src/qt-console/tray-monitor/tray_conf.cpp:191 #, c-format -msgid "" -"\n" -"\n" -"%s error: %ld at %s:%d" +msgid "Unknown resource type %d in dump_resource.\n" msgstr "" -#: src/win32/libwin32/service.cpp:558 +#: src/qt-console/tray-monitor/tray_conf.cpp:249 #, c-format -msgid "Locked by: %s, duration: %ld seconds\n" +msgid "Unknown resource type %d in free_resource.\n" msgstr "" -#: src/win32/libwin32/service.cpp:562 +#: src/qt-console/tray-monitor/tray_conf.cpp:286 #, c-format -msgid "No longer locked\n" +msgid "Too many items in %s resource\n" msgstr "" -#: src/win32/libwin32/service.cpp:566 -msgid "Could not lock database" +#: src/qt-console/tray-monitor/tray_conf.cpp:306 +#: src/qt-console/tray-monitor/tray_conf.cpp:344 +#, c-format +msgid "Unknown resource type %d in save_resource.\n" msgstr "" diff --git a/bacula/po/uk.po b/bacula/po/uk.po index aeb5b0ed04..89af817aab 100644 --- a/bacula/po/uk.po +++ b/bacula/po/uk.po @@ -1,14 +1,14 @@ # Ukrainian translations for bacula package # Український переклад bacula. # Copyright (C) 2000-2015 Kern Sibbald -# License: BSD 2-Clause +# License: BSD 2-Clause; see file LICENSE-FOSS # Vitaliy Kosharskiy , 2010. # msgid "" msgstr "" "Project-Id-Version: bacula 3.0.3\n" "Report-Msgid-Bugs-To: bacula-devel@lists.sourceforge.net\n" -"POT-Creation-Date: 2015-05-21 11:42+0200\n" +"POT-Creation-Date: 2015-08-09 15:05+0200\n" "PO-Revision-Date: 2010-01-08 17:32+0300\n" "Last-Translator: Vitaliy Kosharskiy \n" "Language-Team: Ukrainian\n" @@ -19,19089 +19,2361 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: examples/nagios/check_bacula/check_bacula.c:57 -#, c-format -msgid "" -"Copyright (C) 2005 Christian Masopust\n" -"Written by Christian Masopust (2005)\n" -"\n" -"Version: " -msgstr "" - -#: src/baconfig.h:61 src/baconfig.h:62 src/baconfig.h:67 src/baconfig.h:68 -#: src/baconfig.h:79 src/baconfig.h:80 +#: src/baconfig.h:64 src/baconfig.h:65 src/baconfig.h:70 src/baconfig.h:71 +#: src/baconfig.h:82 src/baconfig.h:83 #, c-format msgid "Failed ASSERT: %s\n" msgstr "" -#: src/baconfig.h:88 src/dird/ua_dotcmds.c:1675 src/dird/ua_dotcmds.c:1683 -#: src/dird/ua_run.c:810 src/dird/ua_run.c:1863 src/dird/ua_run.c:1890 -#: src/dird/ua_run.c:1921 src/dird/ua_run.c:1948 src/dird/ua_run.c:1986 -#: src/dird/ua_select.c:622 src/dird/ua_select.c:642 src/dird/ua_update.c:364 +#: src/baconfig.h:91 msgid "*None*" msgstr "" -#: src/cats/cats.c:132 src/cats/mysql.c:408 src/cats/postgresql.c:529 -#: src/cats/postgresql.c:579 src/cats/sqlite.c:478 -#, c-format -msgid "Query failed: %s: ERR=%s\n" -msgstr "" - -#: src/cats/cats_null.c:30 -msgid "Please replace this null libbaccats library with a proper one.\n" -msgstr "" - -#: src/cats/mysql.c:91 -msgid "A user name for MySQL must be supplied.\n" +#: src/lib/status.h:78 +msgid "" +"\n" +"Terminated Jobs:\n" msgstr "" -#: src/cats/mysql.c:178 src/cats/postgresql.c:232 src/cats/sqlite.c:177 -#, c-format -msgid "Unable to initialize DB lock. ERR=%s\n" +#: src/lib/status.h:85 +msgid " JobId Level Files Bytes Status Finished Name \n" msgstr "" -#: src/cats/mysql.c:221 -#, c-format -msgid "" -"Unable to connect to MySQL server.\n" -"Database=%s User=%s\n" -"MySQL connect failed either server not running or your authorization is " -"incorrect.\n" +#: src/lib/status.h:87 +msgid "===================================================================\n" msgstr "" -#: src/cats/mysql.c:385 src/cats/postgresql.c:476 src/cats/sqlite.c:402 -#: src/dird/fd_cmds.c:926 src/dird/fd_cmds.c:987 -#, c-format -msgid "Attribute create error. %s" +#: src/lib/status.h:107 +msgid "Created" msgstr "" -#: src/cats/postgresql.c:103 -msgid "A user name for PostgreSQL must be supplied.\n" +#: src/lib/status.h:111 +msgid "Error" msgstr "" -#: src/cats/postgresql.c:187 src/cats/sql.c:336 src/cats/sql.c:343 -#: src/cats/sql_create.c:550 src/cats/sql_get.c:199 src/cats/sql_get.c:570 -#: src/cats/sql_get.c:780 src/cats/sql_get.c:1096 src/cats/sql_get.c:1468 -#, c-format -msgid "error fetching row: %s\n" +#: src/lib/status.h:114 +msgid "Diffs" msgstr "" -#: src/cats/postgresql.c:203 -#, c-format -msgid "Encoding error for database \"%s\". Wanted SQL_ASCII, got %s\n" +#: src/lib/status.h:117 +msgid "Cancel" msgstr "" -#: src/cats/postgresql.c:268 -#, c-format -msgid "" -"Unable to connect to PostgreSQL server. Database=%s User=%s\n" -"Possible causes: SQL server not running; password incorrect; max_connections " -"exceeded.\n" +#: src/lib/status.h:120 +msgid "OK" msgstr "" -#: src/cats/postgresql.c:372 -msgid "PQescapeStringConn returned non-zero.\n" +#: src/lib/status.h:123 +msgid "OK -- with warnings" msgstr "" -#: src/cats/postgresql.c:390 -msgid "PQescapeByteaConn returned NULL.\n" +#: src/lib/status.h:126 +msgid "Incomplete" msgstr "" -#: src/cats/postgresql.c:421 -msgid "PQunescapeByteaConn returned NULL.\n" +#: src/lib/status.h:129 +msgid "Other" msgstr "" -#: src/cats/postgresql.c:536 -#, fuzzy, c-format -msgid "Fetch failed: ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/cats/postgresql.c:839 +#: src/lib/status.h:141 #, c-format -msgid "error fetching currval: %s\n" +msgid "%6d\t%-6s\t%8s\t%10s\t%-7s\t%-8s\t%s\n" msgstr "" -#: src/cats/postgresql.c:1030 +#: src/lib/status.h:149 #, c-format -msgid "error starting batch mode: %s" +msgid "%6d %-6s %8s %10s %-7s %-8s %s\n" msgstr "" -#: src/cats/postgresql.c:1059 src/cats/postgresql.c:1066 -#, c-format -msgid "error ending batch mode: %s" +#: src/lib/status.h:178 src/lib/status.h:189 src/lib/status.h:203 +#: src/lib/status.h:207 src/lib/status.h:211 +msgid "Bacula " msgstr "" -#: src/cats/postgresql.c:1115 +#: src/qt-console/bat_conf.cpp:133 #, c-format -msgid "error copying in batch mode: %s" -msgstr "" +msgid "No record for %d %s\n" +msgstr "Відсутні записи для %d %s\n" -#: src/cats/sql.c:185 +#: src/qt-console/bat_conf.cpp:142 #, c-format -msgid "" -"Potential performance problem:\n" -"max_connections=%d set for %s database \"%s\" should be larger than " -"Director's MaxConcurrentJobs=%d\n" -msgstr "" +msgid "Director: name=%s address=%s DIRport=%d\n" +msgstr "Керівник: назва=%s адреса=%s DIRport=%d\n" -#: src/cats/sql.c:229 +#: src/qt-console/bat_conf.cpp:146 #, c-format -msgid "" -"query %s failed:\n" -"%s\n" -msgstr "" +msgid "Console: name=%s\n" +msgstr "Консоль: назва=%s\n" -#: src/cats/sql.c:250 -#, c-format -msgid "" -"insert %s failed:\n" -"%s\n" -msgstr "" +#: src/qt-console/bat_conf.cpp:149 +#: src/qt-console/tray-monitor/tray_conf.cpp:187 +#, fuzzy, c-format +msgid "ConsoleFont: name=%s font face=%s\n" +msgstr "Консоль: назва=%s rcfile=%s histfile=%s\n" -#: src/cats/sql.c:262 +#: src/qt-console/bat_conf.cpp:153 src/qt-console/bat_conf.cpp:234 +#: src/qt-console/bat_conf.cpp:284 src/qt-console/bat_conf.cpp:314 #, c-format -msgid "Insertion problem: affected_rows=%s\n" -msgstr "" +msgid "Unknown resource type %d\n" +msgstr "Невідомий тип ресурсу %d\n" -#: src/cats/sql.c:280 +#: src/qt-console/bat_conf.cpp:262 +#: src/qt-console/tray-monitor/tray_conf.cpp:280 #, c-format -msgid "" -"update %s failed:\n" -"%s\n" -msgstr "" +msgid "%s item is required in %s resource, but not found.\n" +msgstr "Не знайдено необхідний елемент %s для ресурсу %s.\n" -#: src/cats/sql.c:290 +#: src/qt-console/bat_conf.cpp:331 +#: src/qt-console/tray-monitor/tray_conf.cpp:364 #, c-format -msgid "Update failed: affected_rows=%s for %s\n" -msgstr "" +msgid "Attempt to define second %s resource named \"%s\" is not permitted.\n" +msgstr "Спроба визначити другий %s ресурс із назвою \"%s\" не дозволяється.\n" -#: src/cats/sql.c:310 +#: src/qt-console/bcomm/dircomm.cpp:89 #, c-format -msgid "" -"delete %s failed:\n" -"%s\n" -msgstr "" +msgid "Already connected\"%s\".\n" +msgstr "Вже приєднано\"%s\".\n" -#: src/cats/sql.c:396 +#: src/qt-console/bcomm/dircomm.cpp:100 +#: src/qt-console/tray-monitor/tray-monitor.cpp:353 #, c-format -msgid "Path length is zero. File=%s\n" -msgstr "" - -#: src/cats/sql.c:610 -msgid "No results to list.\n" -msgstr "" - -#: src/cats/sql.c:751 -#, fuzzy -msgid "Could not init database batch connection\n" -msgstr "Не вдалось відкрити%s: ERR=%s\n" +msgid "Connecting to Director %s:%d" +msgstr "Приєднуюсь до Керівника %s:%d" -#: src/cats/sql.c:757 +#: src/qt-console/bcomm/dircomm.cpp:102 #, c-format -msgid "Could not open database \"%s\": ERR=%s\n" -msgstr "" - -#: src/cats/sql.c:857 msgid "" -"Your database is no longer functional. This is most likely due to\n" -"the fact that your Bacula Enterprise Edition period has expired.\n" -"You can continue testing by re-initializing the catalog database orcontact " -"Bacula Systems to order a subscription.\n" +"Connecting to Director %s:%d\n" +"\n" msgstr "" +"З'єднуюсь із Керівником %s:%d\n" +"\n" -#: src/cats/sql_create.c:82 +#: src/qt-console/bcomm/dircomm.cpp:154 #, c-format -msgid "Create DB Job record %s failed. ERR=%s\n" -msgstr "" +msgid "Failed to initialize TLS context for Console \"%s\".\n" +msgstr "Ініціалізація контексту TLS для Консолі невдала \"%s\".\n" -#: src/cats/sql_create.c:125 +#: src/qt-console/bcomm/dircomm.cpp:177 #, c-format -msgid "Create JobMedia record %s failed: ERR=%s\n" -msgstr "" +msgid "Failed to initialize TLS context for Director \"%s\".\n" +msgstr "Ініціалізація контексту TLS для Керівника невдала \"%s\".\n" -#: src/cats/sql_create.c:134 -#, c-format -msgid "Update Media record %s failed: ERR=%s\n" -msgstr "" +#: src/qt-console/bcomm/dircomm.cpp:199 +#: src/qt-console/tray-monitor/tray-monitor.cpp:358 +msgid "Director daemon" +msgstr "Керівник" -#: src/cats/sql_create.c:164 -#, c-format -msgid "pool record %s already exists\n" -msgstr "" +#: src/qt-console/bcomm/dircomm.cpp:237 +msgid "Initializing ..." +msgstr "Ініціалізація ..." -#: src/cats/sql_create.c:196 -#, c-format -msgid "Create db Pool record %s failed: ERR=%s\n" -msgstr "" +#: src/qt-console/bcomm/dircomm.cpp:253 src/qt-console/console/console.cpp:134 +msgid "Connected" +msgstr "З'єднано" -#: src/cats/sql_create.c:225 -#, c-format -msgid "Device record %s already exists\n" -msgstr "" +#: src/qt-console/bcomm/dircomm.cpp:377 +msgid "Command completed ..." +msgstr "Команду виконано ..." -#: src/cats/sql_create.c:241 -#, c-format -msgid "Create db Device record %s failed: ERR=%s\n" -msgstr "" +#: src/qt-console/bcomm/dircomm.cpp:384 src/qt-console/console/console.cpp:371 +msgid "Processing command ..." +msgstr "Виконання команди ..." -#: src/cats/sql_create.c:274 -#, c-format -msgid "More than one Storage record!: %d\n" -msgstr "" +#: src/qt-console/bcomm/dircomm.cpp:391 +msgid "At main prompt waiting for input ..." +msgstr "Очікуться введення у основній рядку ..." -#: src/cats/sql_create.c:279 -#, c-format -msgid "error fetching Storage row: %s\n" -msgstr "" +#: src/qt-console/bcomm/dircomm.cpp:398 src/qt-console/bcomm/dircomm.cpp:408 +msgid "At prompt waiting for input ..." +msgstr "Очікуться введення у рядку ..." -#: src/cats/sql_create.c:299 -#, c-format -msgid "Create DB Storage record %s failed. ERR=%s\n" -msgstr "" +#: src/qt-console/bcomm/dircomm.cpp:416 +msgid "Command failed." +msgstr "Помилка команди" -#: src/cats/sql_create.c:330 -#, c-format -msgid "mediatype record %s already exists\n" -msgstr "" +#: src/qt-console/bcomm/dircomm.cpp:488 +msgid "Director disconnected." +msgstr "Керівник від'єднано" -#: src/cats/sql_create.c:346 +#: src/qt-console/bcomm/dircomm_auth.cpp:111 #, c-format -msgid "Create db mediatype record %s failed: ERR=%s\n" -msgstr "" +msgid "Director authorization problem at \"%s:%d\"\n" +msgstr "Проблеми авторизації Директора \"%s:%d\"\n" -#: src/cats/sql_create.c:384 +#: src/qt-console/bcomm/dircomm_auth.cpp:118 #, c-format -msgid "Volume \"%s\" already exists.\n" +msgid "" +"Authorization problem: Remote server at \"%s:%d\" did not advertise required " +"TLS support.\n" msgstr "" +"Проблеми авторизації: Віддалений сервер \"%s:%d\" не повідомляє про " +"необхідність використання TLS.\n" -#: src/cats/sql_create.c:429 +#: src/qt-console/bcomm/dircomm_auth.cpp:126 #, c-format -msgid "Create DB Media record %s failed. ERR=%s\n" +msgid "" +"Authorization problem with Director at \"%s:%d\": Remote server requires " +"TLS.\n" msgstr "" +"Проблеми авторизації Керівника \"%s:%d\": Віддалений сепвер вимагає TLS.\n" -#: src/cats/sql_create.c:478 +#: src/qt-console/bcomm/dircomm_auth.cpp:137 #, c-format -msgid "More than one Client!: %d\n" -msgstr "" +msgid "TLS negotiation failed with Director at \"%s:%d\"\n" +msgstr "Встановлення TLS із Керівником невдале \"%s:%d\"\n" -#: src/cats/sql_create.c:483 +#: src/qt-console/bcomm/dircomm_auth.cpp:149 #, c-format -msgid "error fetching Client row: %s\n" +msgid "" +"Bad response to Hello command: ERR=%s\n" +"The Director at \"%s:%d\" is probably not running.\n" msgstr "" +"Погана відповідь на команду Hello: ERR=%s\n" +"Керівник \"%s:%d\" ймовірно не запущений.\n" -#: src/cats/sql_create.c:510 +#: src/qt-console/bcomm/dircomm_auth.cpp:158 #, c-format -msgid "Create DB Client record %s failed. ERR=%s\n" -msgstr "" +msgid "Director at \"%s:%d\" rejected Hello command\n" +msgstr "Керівник \"%s:%d\" відкинув команду Hello\n" -#: src/cats/sql_create.c:543 src/cats/sql_get.c:192 -#, c-format -msgid "More than one Path!: %s for path: %s\n" +#: src/qt-console/bcomm/dircomm_auth.cpp:173 +#, fuzzy, c-format +msgid "" +"Authorization problem with Director at \"%s:%d\"\n" +"Most likely the passwords do not agree.\n" +"If you are using TLS, there may have been a certificate validation error " +"during the TLS handshake.\n" +"For help, please see " msgstr "" +"Проблеми авторизації із Керівником \"%s:%d\"\n" +"Швидше за все, проблема у паролях.\n" +"Якщо Ви використовуєте TLS, можливо, невдала перевірка сертифікату під час " +"TLS handshake.\n" +"Для отримання допомоги, будь ласка, перегляньте http://www.bacula.org/en/rel-" +"manual/Bacula_Freque_Asked_Questi.html#SECTION003760000000000000000.\n" -#: src/cats/sql_create.c:576 -#, c-format -msgid "Create db Path record %s failed. ERR=%s\n" -msgstr "" +#: src/qt-console/main.cpp:159 +msgid "Cryptography library initialization failed.\n" +msgstr "Ініціалізація криптографії невдала.\n" -#: src/cats/sql_create.c:621 +#: src/qt-console/main.cpp:163 #, c-format -msgid "Create DB Counters record %s failed. ERR=%s\n" -msgstr "" +msgid "Please correct configuration file: %s\n" +msgstr "Будьласка виправте файл конфігурації: %s\n" -#: src/cats/sql_create.c:657 -#, c-format -msgid "More than one FileSet!: %d\n" +#: src/qt-console/main.cpp:187 +#, fuzzy, c-format +msgid "" +"\n" +"Version: %s (%s) %s %s %s\n" +"\n" +"Usage: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" +" -c set configuration file to file\n" +" -dnn set debug level to nn\n" +" -s no signals\n" +" -t test - read configuration and exit\n" +" -? print this message.\n" +"\n" msgstr "" +"\n" +"Версія: %s (%s) %s %s %s\n" +"\n" +"Використання: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" +" -c set configuration file to file\n" +" -dnn set debug level to nn\n" +" -s без сигналів\n" +" -t перевірка - прочитати конфігурацію і вийти\n" +" -? print this message.\n" +"\n" -#: src/cats/sql_create.c:662 -#, c-format -msgid "error fetching FileSet row: ERR=%s\n" -msgstr "" +#: src/qt-console/main.cpp:220 src/qt-console/main.cpp:250 +msgid "TLS required but not configured in Bacula.\n" +msgstr "TLS необхідний, але не налаштовано у Bacula.\n" -#: src/cats/sql_create.c:692 +#: src/qt-console/main.cpp:228 #, c-format -msgid "Create DB FileSet record %s failed. ERR=%s\n" +msgid "" +"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " +"Director \"%s\" in %s. At least one CA certificate store is required.\n" msgstr "" +"Жоден із параметрів \"TLS CA Certificate\" або \"TLS CA Certificate Dir\" не " +"задано для Керівника \"%s\" у %s. Необхідне щонайменше одне сховище для " +"сертифікату CA.\n" -#: src/cats/sql_create.c:930 +#: src/qt-console/main.cpp:237 #, c-format -msgid "Create db File record %s failed. ERR=%s" +msgid "" +"No Director resource defined in %s\n" +"Without that I don't how to speak to the Director :-(\n" msgstr "" +"У %s не задано ресурсу Керівника\n" +"Без цього я не знаю як спілкуватись із Керівником :-(\n" -#: src/cats/sql_create.c:953 +#: src/qt-console/main.cpp:258 #, c-format -msgid "Attempt to put non-attributes into catalog. Stream=%d\n" -msgstr "" - -#: src/cats/sql_create.c:969 -msgid "Cannot Copy/Migrate job using BaseJob.\n" +msgid "" +"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " +"Console \"%s\" in %s.\n" msgstr "" +"Жоден із параметрів \"TLS CA Certificate\" або \"TLS CA Certificate Dir\" не " +"задано для Консолі \"%s\" у %s.\n" -#: src/cats/sql_create.c:1069 src/cats/sql_get.c:1196 -msgid "ERR=JobIds are empty\n" +#: src/qt-console/tray-monitor/authenticate.cpp:79 +#, fuzzy +msgid "" +"Director authorization problem.\n" +"Most likely the passwords do not agree.\n" +"For help, please see " msgstr "" +"Проблеми під час авторизації Керівником.\n" +"Швидше за все, невірні паролі.\n" +"Для отримання допомоги, будь ласка, перегляньте http://www.bacula.org/en/rel-" +"manual/Bacula_Freque_Asked_Questi.html#SECTION003760000000000000000.\n" -#: src/cats/sql_create.c:1122 -#, fuzzy, c-format -msgid "Create db Object record %s failed. ERR=%s" -msgstr "Не можливо створити теку %s: ERR=%s\n" - -#: src/cats/sql_delete.c:60 +#: src/qt-console/tray-monitor/authenticate.cpp:88 #, c-format -msgid "No pool record %s exists\n" -msgstr "" +msgid "Bad response to Hello command: ERR=%s\n" +msgstr "Погана відповідь на команду Hello: ERR=%s\n" -#: src/cats/sql_delete.c:65 -#, c-format -msgid "Expecting one pool record, got %d\n" -msgstr "" +#: src/qt-console/tray-monitor/authenticate.cpp:95 +msgid "Director rejected Hello command\n" +msgstr "Керівник не прийняв команду Hello\n" -#: src/cats/sql_delete.c:71 +#: src/qt-console/tray-monitor/authenticate.cpp:123 #, c-format -msgid "Error fetching row %s\n" -msgstr "" +msgid "Error sending Hello to Storage daemon. ERR=%s\n" +msgstr "Не вдалося надіслати Hello до Зберігача. ERR=%s\n" -#: src/cats/sql_find.c:84 src/cats/sql_find.c:113 src/cats/sql_find.c:167 -#, c-format +#: src/qt-console/tray-monitor/authenticate.cpp:129 msgid "" -"Query error for start time request: ERR=%s\n" -"CMD=%s\n" -msgstr "" - -#: src/cats/sql_find.c:90 src/cats/sql_find.c:173 -msgid "No prior Full backup Job record found.\n" +"Director and Storage daemon passwords or names not the same.\n" +"For help, please see " msgstr "" -#: src/cats/sql_find.c:102 +#: src/qt-console/tray-monitor/authenticate.cpp:136 #, c-format -msgid "Unknown level=%d\n" +msgid "bdird set configuration file to file\n" +" -d set debug level to \n" +" -dt print timestamp in debug output\n" +" -t test - read configuration and exit\n" +" -? print this message.\n" +"\n" msgstr "" +"Автор Nicolas Boichat (2004)\n" +"\n" +"Версія: %s (%s) %s %s %s\n" +"\n" +"Використання: tray-monitor [-c config_file] [-d debug_level]\n" +" -c задати конфігураційний файл \n" +" -d встановити рівень відлагоджування у \n" +" -dt виводити часову мітку у даних відлагоджування\n" +" -t перевірка - прогитати конфігурацію і завершити\n" +" -? показати це повідомлення.\n" +"\n" -#: src/cats/sql_get.c:140 +#: src/qt-console/tray-monitor/tray-monitor.cpp:210 #, c-format -msgid "Error fetching row: %s\n" +msgid "" +"Error: %d Monitor resources defined in %s. You must define one and only one " +"Monitor resource.\n" msgstr "" +"Помилка: %d ресурсів Спостерігача визначено у %s. Ви повинні визначити одині " +"тільки один ресурс Спостерігача.\n" -#: src/cats/sql_get.c:147 +#: src/qt-console/tray-monitor/tray-monitor.cpp:242 #, c-format -msgid "get_file_record want 1 got rows=%d PathId=%s Filename=%s\n" +msgid "" +"No Client, Storage or Director resource defined in %s\n" +"Without that I don't how to get status from the File, Storage or Director " +"Daemon :-(\n" msgstr "" +"У %s не визначено жодного ресурсу Клієнту, Зберігача або Керівника\n" +"Без цього я не знаю як отримати статус Зберігача, Збирача або Керівника\n" -#: src/cats/sql_get.c:155 +#: src/qt-console/tray-monitor/tray-monitor.cpp:257 #, c-format -msgid "File record for PathId=%s Filename=%s not found.\n" -msgstr "" - -#: src/cats/sql_get.c:161 -msgid "File record not found in Catalog.\n" +msgid "" +"Invalid refresh interval defined in %s\n" +"This value must be greater or equal to 1 second and less or equal to 10 " +"minutes (read value: %d).\n" msgstr "" +"Задано поганий інтервал оновлення у %s\n" +"Це значення повинно бути не меньше 1 секунди та не більше 10 хвилин " +"(теперішнє значення: %d).\n" -#: src/cats/sql_get.c:203 +#: src/qt-console/tray-monitor/tray-monitor.cpp:325 #, c-format -msgid "Get DB path record %s found bad record: %s\n" -msgstr "" +msgid "Error, currentitem is not a Client or a Storage..\n" +msgstr "Помилка. Поточний пункт не є Клієнтом або Зберігачем.\n" -#: src/cats/sql_get.c:216 +#: src/qt-console/tray-monitor/tray-monitor.cpp:363 #, c-format -msgid "Path record: %s not found.\n" -msgstr "" +msgid "Connecting to Client %s:%d" +msgstr "Приєднуюсь до Клієнта %s:%d" -#: src/cats/sql_get.c:220 -#, c-format -msgid "Path record: %s not found in Catalog.\n" -msgstr "" +#: src/qt-console/tray-monitor/tray-monitor.cpp:368 +msgid "File daemon" +msgstr "Збирач" -#: src/cats/sql_get.c:259 +#: src/qt-console/tray-monitor/tray-monitor.cpp:373 #, c-format -msgid "No Job found for JobId %s\n" -msgstr "" +msgid "Connecting to Storage %s:%d" +msgstr "Приєднуюсь до Зберігача %s:%d" -#: src/cats/sql_get.c:330 src/cats/sql_get.c:385 -#, c-format -msgid "No volumes found for JobId=%d\n" -msgstr "" +#: src/qt-console/tray-monitor/tray-monitor.cpp:378 +msgid "Storage daemon" +msgstr "Зберігач" -#: src/cats/sql_get.c:336 src/cats/sql_get.c:396 +#: src/qt-console/tray-monitor/tray-monitor.cpp:382 +#: src/qt-console/tray-monitor/tray-monitor.cpp:412 #, c-format -msgid "Error fetching row %d: ERR=%s\n" -msgstr "" +msgid "Error, currentitem is not a Client, a Storage or a Director..\n" +msgstr "Помилка. Поточний пункт не є Клієнтом або Зберігачем.\n" -#: src/cats/sql_get.c:350 -#, c-format -msgid "No Volume for JobId %d found in Catalog.\n" -msgstr "" +#: src/qt-console/tray-monitor/tray-monitor.cpp:387 +msgid "Cannot connect to daemon." +msgstr "Не можу приєднатись до демону." -#: src/cats/sql_get.c:489 +#: src/qt-console/tray-monitor/tray-monitor.cpp:396 #, c-format -msgid "Pool id select failed: ERR=%s\n" -msgstr "" +msgid "Authentication error : %s" +msgstr "Помилка автентифікації : %s" -#: src/cats/sql_get.c:526 -#, c-format -msgid "Client id select failed: ERR=%s\n" -msgstr "" +#: src/qt-console/tray-monitor/tray-monitor.cpp:403 +msgid "Opened connection with Director daemon." +msgstr "Відкриті з'єднання із Керівником." -#: src/cats/sql_get.c:565 -#, c-format -msgid "More than one Pool! Num=%s\n" -msgstr "" +#: src/qt-console/tray-monitor/tray-monitor.cpp:406 +msgid "Opened connection with File daemon." +msgstr "Відкриті з'єднання із Збирачем." -#: src/cats/sql_get.c:628 -msgid "Pool record not found in Catalog.\n" -msgstr "" +#: src/qt-console/tray-monitor/tray-monitor.cpp:409 +msgid "Opened connection with Storage daemon." +msgstr "Відкриті з'єднання із Зберігачем." -#: src/cats/sql_get.c:691 -#, c-format -msgid "Error got %s RestoreObjects but expected only one!\n" +#: src/qt-console/tray-monitor/tray-monitor.cpp:460 +msgid "Error : BNET_HARDEOF or BNET_ERROR" msgstr "" -#: src/cats/sql_get.c:696 -#, c-format -msgid "RestoreObject record \"%d\" not found.\n" -msgstr "" +#: src/qt-console/tray-monitor/tray-monitor.cpp:469 +msgid "Error : Connection closed." +msgstr "Помилка : З'єднання завершено" -#: src/cats/sql_get.c:721 src/dird/ua_run.c:703 +#: src/qt-console/tray-monitor/tray_conf.cpp:160 #, c-format -msgid "Decompression failed. Len wanted=%d got=%d. Object=%s\n" -msgstr "" - -#: src/cats/sql_get.c:739 -msgid "RestoreObject record not found in Catalog.\n" -msgstr "" +msgid "No %s resource defined\n" +msgstr "Ресурс %s не визначено\n" -#: src/cats/sql_get.c:775 +#: src/qt-console/tray-monitor/tray_conf.cpp:169 #, c-format -msgid "More than one Client!: %s\n" -msgstr "" - -#: src/cats/sql_get.c:792 src/cats/sql_get.c:796 -msgid "Client record not found in Catalog.\n" -msgstr "" +msgid "Monitor: name=%s FDtimeout=%s SDtimeout=%s\n" +msgstr "Споглядач: назва=%s FDtimeout=%s SDtimeout=%s\n" -#: src/cats/sql_get.c:821 +#: src/qt-console/tray-monitor/tray_conf.cpp:175 #, c-format -msgid "More than one Counter!: %d\n" -msgstr "" +msgid "Director: name=%s address=%s FDport=%d\n" +msgstr "Керівник: назва=%s address=%s FDport=%d\n" -#: src/cats/sql_get.c:826 +#: src/qt-console/tray-monitor/tray_conf.cpp:179 #, c-format -msgid "error fetching Counter row: %s\n" -msgstr "" +msgid "Client: name=%s address=%s FDport=%d\n" +msgstr "Клієнт: назва=%s address=%s FDport=%d\n" -#: src/cats/sql_get.c:846 +#: src/qt-console/tray-monitor/tray_conf.cpp:183 #, c-format -msgid "Counter record: %s not found in Catalog.\n" -msgstr "" +msgid "Storage: name=%s address=%s SDport=%d\n" +msgstr "Сховище: назва=%s address=%s SDport=%d\n" -#: src/cats/sql_get.c:884 +#: src/qt-console/tray-monitor/tray_conf.cpp:191 #, c-format -msgid "Error got %s FileSets but expected only one!\n" -msgstr "" +msgid "Unknown resource type %d in dump_resource.\n" +msgstr "Невідомий тип ресурсу %d у dump_resource.\n" -#: src/cats/sql_get.c:889 +#: src/qt-console/tray-monitor/tray_conf.cpp:249 #, c-format -msgid "FileSet record \"%s\" not found.\n" -msgstr "" - -#: src/cats/sql_get.c:899 -msgid "FileSet record not found in Catalog.\n" -msgstr "" +msgid "Unknown resource type %d in free_resource.\n" +msgstr "Невідомий тип ресурсу %d у free_resource.\n" -#: src/cats/sql_get.c:998 +#: src/qt-console/tray-monitor/tray_conf.cpp:286 #, c-format -msgid "Media id select failed: ERR=%s\n" -msgstr "" +msgid "Too many items in %s resource\n" +msgstr "Забагато елементів у ресурсі %s\n" -#: src/cats/sql_get.c:1036 +#: src/qt-console/tray-monitor/tray_conf.cpp:306 +#: src/qt-console/tray-monitor/tray_conf.cpp:344 #, c-format -msgid "query dbids failed: ERR=%s\n" -msgstr "" +msgid "Unknown resource type %d in save_resource.\n" +msgstr "Невідомий тип ресурсу %d у save_resource.\n" -#: src/cats/sql_get.c:1091 -#, c-format -msgid "More than one Volume!: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Fetch failed: ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/cats/sql_get.c:1150 -#, c-format -msgid "Media record with MediaId=%s not found.\n" -msgstr "" +#, fuzzy +#~ msgid "Could not init database batch connection\n" +#~ msgstr "Не вдалось відкрити%s: ERR=%s\n" -#: src/cats/sql_get.c:1153 -#, fuzzy, c-format -msgid "Media record for Volume name \"%s\" not found.\n" -msgstr "Заборонені символи у назві Тому \"%s\"\n" +#, fuzzy +#~ msgid "Create db Object record %s failed. ERR=%s" +#~ msgstr "Не можливо створити теку %s: ERR=%s\n" -#: src/cats/sql_get.c:1160 -#, c-format -msgid "Media record for MediaId=%u not found in Catalog.\n" -msgstr "" +#, fuzzy +#~ msgid "Media record for Volume name \"%s\" not found.\n" +#~ msgstr "Заборонені символи у назві Тому \"%s\"\n" -#: src/cats/sql_get.c:1163 -#, c-format -msgid "Media record for Volume Name \"%s\" not found in Catalog.\n" -msgstr "" +#, fuzzy +#~ msgid "Snapshot record for Snapshot name \"%s\" not found.\n" +#~ msgstr "Заборонені символи у назві Тому \"%s\"\n" -#: src/cats/sql_get.c:1463 -#, c-format -msgid "More than one Snapshot!: %s\n" -msgstr "" +#~ msgid "" +#~ "Authorization problem: Remote server did not advertise required TLS " +#~ "support.\n" +#~ msgstr "" +#~ "Проблеми авторизації: Віддалений сервер не повідомив про необхідність " +#~ "використання TLS.\n" -#: src/cats/sql_get.c:1492 src/cats/sql_get.c:1502 -#, c-format -msgid "Snapshot record with SnapshotId=%s not found.\n" -msgstr "" +#~ msgid "Authorization problem: Remote server requires TLS.\n" +#~ msgstr "Проблеми авторизації: Віддалений сервер вимагає використання TLS.\n" -#: src/cats/sql_get.c:1495 src/cats/sql_get.c:1505 -#, fuzzy, c-format -msgid "Snapshot record for Snapshot name \"%s\" not found.\n" -msgstr "Заборонені символи у назві Тому \"%s\"\n" +#~ msgid "TLS negotiation failed\n" +#~ msgstr "Невдале встановлення з'єднання TLS\n" -#: src/cats/sql_list.c:45 -#, c-format -msgid "Query failed: %s\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Director authorization problem.\n" +#~ "Most likely the passwords do not agree.\n" +#~ "If you are using TLS, there may have been a certificate validation error " +#~ "during the TLS handshake.\n" +#~ "For help, please see " +#~ msgstr "" +#~ "Проблеми авторизації Керівника.\n" +#~ "Швидше за все, проблема у паролях.\n" +#~ "Якщо Ви використовуєте TLS, можливо, невдала перевірка сертифікату під " +#~ "час TLS handshake.\n" +#~ "Для отримання допомоги, будь ласка, перегляньте http://www.bacula.org/en/" +#~ "rel-manual/Bacula_Freque_Asked_Questi.html#SECTION003760000000000000000.\n" -#: src/cats/sql_list.c:314 -msgid "These JobIds have copies as follows:\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: " +#~ msgstr "" +#~ "\n" +#~ "Вірсія: " -#: src/cats/sql_list.c:316 -msgid "The catalog contains copies as follows:\n" -msgstr "" +#~ msgid "input from file" +#~ msgstr "введення із файлу" -#: src/cats/sqlite.c:192 -#, c-format -msgid "Database %s does not exist, please create it.\n" -msgstr "" +#~ msgid "output to file" +#~ msgstr "вивід до файлу" -#: src/cats/sqlite.c:214 -#, c-format -msgid "Unable to open Database=%s. ERR=%s\n" -msgstr "" +#~ msgid "output to file and terminal" +#~ msgstr "вивід до файлу та консолі" -#: src/cats/sqlite.c:215 -msgid "unknown" -msgstr "" +#~ msgid "sleep specified time" +#~ msgstr "зазначений час сну" -#: src/console/authenticate.c:119 src/dird/authenticate.c:122 -msgid "" -"Authorization problem: Remote server did not advertise required TLS " -"support.\n" -msgstr "" -"Проблеми авторизації: Віддалений сервер не повідомив про необхідність " -"використання TLS.\n" - -#: src/console/authenticate.c:126 src/dird/authenticate.c:129 -#: src/filed/authenticate.c:102 src/filed/authenticate.c:208 -#: src/stored/authenticate.c:94 src/stored/authenticate.c:187 -#: src/stored/authenticate.c:295 -msgid "Authorization problem: Remote server requires TLS.\n" -msgstr "Проблеми авторизації: Віддалений сервер вимагає використання TLS.\n" - -#: src/console/authenticate.c:135 -msgid "TLS negotiation failed\n" -msgstr "Невдале встановлення з'єднання TLS\n" - -#: src/console/authenticate.c:149 -#: src/qt-console/tray-monitor/authenticate.cpp:85 -#, c-format -msgid "Bad response to Hello command: ERR=%s\n" -msgstr "Погана відповідь на команду Hello: ERR=%s\n" +#~ msgid "print current time" +#~ msgstr "вивести поточний час" -#: src/console/authenticate.c:156 -#: src/qt-console/tray-monitor/authenticate.cpp:92 -msgid "Director rejected Hello command\n" -msgstr "Керівник не прийняв команду Hello\n" +#~ msgid "print Console's version" +#~ msgstr "вивести версію Консолі" + +#~ msgid "echo command string" +#~ msgstr "луна командного рядку" -#: src/console/authenticate.c:174 #, fuzzy -msgid "" -"Director authorization problem.\n" -"Most likely the passwords do not agree.\n" -"If you are using TLS, there may have been a certificate validation error " -"during the TLS handshake.\n" -"For help, please see " -msgstr "" -"Проблеми авторизації Керівника.\n" -"Швидше за все, проблема у паролях.\n" -"Якщо Ви використовуєте TLS, можливо, невдала перевірка сертифікату під час " -"TLS handshake.\n" -"Для отримання допомоги, будь ласка, перегляньте http://www.bacula.org/en/rel-" -"manual/Bacula_Freque_Asked_Questi.html#SECTION003760000000000000000.\n" +#~ msgid "encode command string" +#~ msgstr "луна командного рядку" -#: src/console/bbconsjson.c:79 src/console/console.c:118 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: " -msgstr "" -"\n" -"Вірсія: " +#~ msgid "execute an external command" +#~ msgstr "виконати зовнішню команду" -#: src/console/bbconsjson.c:152 src/dird/bdirjson.c:141 -#: src/filed/bfdjson.c:116 src/stored/bsdjson.c:126 -#, c-format -msgid "Please use valid -l argument: %s\n" -msgstr "" +#~ msgid "zed_keys = use zed keys instead of bash keys" +#~ msgstr "zed_keys = використовувати zed keys замість bash keys" -#: src/console/bbconsjson.c:213 src/console/console.c:1157 -#: src/dird/bdirjson.c:235 src/dird/dird.c:283 src/dird/dird.c:311 -#: src/dird/dird.c:548 src/dird/dird.c:551 src/filed/bfdjson.c:199 -#: src/filed/filed.c:210 src/qt-console/main.cpp:161 src/stored/bsdjson.c:211 -#: src/stored/stored.c:236 -#, c-format -msgid "Please correct configuration file: %s\n" -msgstr "Будьласка виправте файл конфігурації: %s\n" +#~ msgid "help listing" +#~ msgstr "допомога" -#: src/console/bbconsjson.c:430 src/console/bbconsjson.c:461 -#: src/console/console.c:1347 src/console/console.c:1377 -#: src/dird/bdirjson.c:1163 src/dird/bdirjson.c:1201 src/dird/bdirjson.c:1256 -#: src/dird/dird.c:688 src/dird/dird.c:906 src/dird/dird.c:961 -#: src/dird/dird.c:1168 src/filed/bfdjson.c:483 src/filed/bfdjson.c:526 -#: src/filed/filed.c:379 src/filed/filed.c:579 src/qt-console/main.cpp:218 -#: src/qt-console/main.cpp:248 src/stored/bsdjson.c:494 -#: src/stored/stored.c:362 -msgid "TLS required but not configured in Bacula.\n" -msgstr "TLS необхідний, але не налаштовано у Bacula.\n" +#~ msgid "set command separator" +#~ msgstr "задати роздільник команд" -#: src/console/bbconsjson.c:439 src/console/console.c:1355 -#: src/qt-console/main.cpp:226 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Director \"%s\" in %s. At least one CA certificate store is required.\n" -msgstr "" -"Жоден із параметрів \"TLS CA Certificate\" або \"TLS CA Certificate Dir\" не " -"задано для Керівника \"%s\" у %s. Необхідне щонайменше одне сховище для " -"сертифікату CA.\n" +#~ msgid ": is an invalid command\n" +#~ msgstr ": неправильна команда\n" -#: src/console/bbconsjson.c:448 src/console/console.c:1364 -#: src/qt-console/main.cpp:235 -#, c-format -msgid "" -"No Director resource defined in %s\n" -"Without that I don't how to speak to the Director :-(\n" -msgstr "" -"У %s не задано ресурсу Керівника\n" -"Без цього я не знаю як спілкуватись із Керівником :-(\n" +#~ msgid "Illegal separator character.\n" +#~ msgstr "Невірний символ роздільника.\n" -#: src/console/bbconsjson.c:468 src/console/console.c:1384 -#: src/qt-console/main.cpp:256 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Console \"%s\" in %s.\n" -msgstr "" -"Жоден із параметрів \"TLS CA Certificate\" або \"TLS CA Certificate Dir\" не " -"задано для Консолі \"%s\" у %s.\n" +#~ msgid "Command logic problem\n" +#~ msgstr "Проблеми логіки команди\n" -#: src/console/console.c:170 -msgid "input from file" -msgstr "введення із файлу" +#, fuzzy +#~ msgid "Can't find %s in Director list\n" +#~ msgstr ": неправильна команда\n" -#: src/console/console.c:171 -msgid "output to file" -msgstr "вивід до файлу" +#~ msgid "Available Directors:\n" +#~ msgstr "Наявні Керівники:\n" -#: src/console/console.c:172 -msgid "quit" -msgstr "" +#~ msgid "Select Director by entering a number: " +#~ msgstr "Оберіть Керівника, увівши номер: " -#: src/console/console.c:173 -msgid "output to file and terminal" -msgstr "вивід до файлу та консолі" +#~ msgid "%s is not a number. You must enter a number between 1 and %d\n" +#~ msgstr "%s не є номером. Ви повинні увести номер із проміжку 1..%d\n" -#: src/console/console.c:174 -msgid "sleep specified time" -msgstr "зазначений час сну" +#~ msgid "You must enter a number between 1 and %d\n" +#~ msgstr "Ви повинні увести номер із проміжку 1..%d\n" -#: src/console/console.c:175 -msgid "print current time" -msgstr "вивести поточний час" +#~ msgid "Connecting to Director %s:%d\n" +#~ msgstr "Підключаюсь до Керівника %s:%d\n" -#: src/console/console.c:176 -msgid "print Console's version" -msgstr "вивести версію Консолі" +#~ msgid "Enter a period to cancel a command.\n" +#~ msgstr "Уведіть цятку для переривання команди.\n" -#: src/console/console.c:177 -msgid "echo command string" -msgstr "луна командного рядку" +#~ msgid "Too many arguments on input command.\n" +#~ msgstr "Забагато параметрів команди.\n" -#: src/console/console.c:178 -#, fuzzy -msgid "encode command string" -msgstr "луна командного рядку" +#~ msgid "First argument to input command must be a filename.\n" +#~ msgstr "Перший параметр команди повинен бути назвою файлу.\n" -#: src/console/console.c:179 -msgid "execute an external command" -msgstr "виконати зовнішню команду" +#~ msgid "Cannot open file %s for input. ERR=%s\n" +#~ msgstr "Не вдається відкрити файл %s для введення. ERR=%s\n" -#: src/console/console.c:180 -msgid "exit = quit" -msgstr "" +#~ msgid "Too many arguments on output/tee command.\n" +#~ msgstr "Забагато параметрів на виході команди.\n" -#: src/console/console.c:181 -msgid "send a file to the director" -msgstr "" +#~ msgid "Cannot open file %s for output. ERR=%s\n" +#~ msgstr "Не вдається відкрити файл %s для виведення. ERR=%s\n" -#: src/console/console.c:182 -msgid "zed_keys = use zed keys instead of bash keys" -msgstr "zed_keys = використовувати zed keys замість bash keys" +#~ msgid "Too many arguments. Enclose command in double quotes.\n" +#~ msgstr "Забагато параметрів. Оточіть комінду подвійними лапками.\n" -#: src/console/console.c:183 -msgid "help listing" -msgstr "допомога" +#, fuzzy +#~ msgid "@exec error: ERR=%s\n" +#~ msgstr "Не вдалось створити %s: ERR=%s\n" -#: src/console/console.c:185 -msgid "set command separator" -msgstr "задати роздільник команд" +#~ msgid "Console: name=%s rcfile=%s histfile=%s\n" +#~ msgstr "Консоль: назва=%s rcfile=%s histfile=%s\n" -#: src/console/console.c:219 -msgid ": is an invalid command\n" -msgstr ": неправильна команда\n" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bdirjson [-f -s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -r get resource type \n" +#~ " -n get resource \n" +#~ " -l get only directives matching dirs (use with -r)\n" +#~ " -D get only data\n" +#~ " -R do not apply JobDefs to Job\n" +#~ " -c set configuration file to file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -t test - read configuration and exit\n" +#~ " -s output in show text format\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Версія: %s (%s) %s %s %s\n" +#~ "\n" +#~ "Використання: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c set configuration file to file\n" +#~ " -dnn set debug level to nn\n" +#~ " -s без сигналів\n" +#~ " -t перевірка - прочитати конфігурацію і вийти\n" +#~ " -? print this message.\n" +#~ "\n" -#: src/console/console.c:714 -msgid "Illegal separator character.\n" -msgstr "Невірний символ роздільника.\n" +#, fuzzy +#~ msgid "Attribute create error: ERR=%s" +#~ msgstr "Не вдалось створити %s: ERR=%s\n" -#: src/console/console.c:747 -msgid "Command logic problem\n" -msgstr "Проблеми логіки команди\n" +#~ msgid "Catalog error updating file digest. %s" +#~ msgstr "Помилка під час оновлення відбитку файлу. %s" -#: src/console/console.c:962 -#, fuzzy, c-format -msgid "Can't find %s in Director list\n" -msgstr ": неправильна команда\n" +#~ msgid "1994 Invalid Catalog Update: %s" +#~ msgstr "1994 Помилка оновлення Каталогу: %s" -#: src/console/console.c:970 -msgid "Available Directors:\n" -msgstr "Наявні Керівники:\n" +#~ msgid "Invalid Catalog Update; DB not open: %s" +#~ msgstr "Помилка оновлення Каталогу: БД не відкрита: %s" -#: src/console/console.c:974 -#, c-format -msgid "%2d: %s at %s:%d\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bacula-dir [-f -s] [-c config_file] [-d debug_level] " +#~ "[config_file]\n" +#~ " -c set configuration file to file\n" +#~ " -d [,] set debug level to , debug tags to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -T set trace on\n" +#~ " -f run in foreground (for debugging)\n" +#~ " -g groupid\n" +#~ " -m print kaboom output (for debugging)\n" +#~ " -r run now\n" +#~ " -s no signals\n" +#~ " -t test - read configuration and exit\n" +#~ " -u userid\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Версія: %s (%s) %s %s %s\n" +#~ "\n" +#~ "Використання: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c set configuration file to file\n" +#~ " -dnn set debug level to nn\n" +#~ " -s без сигналів\n" +#~ " -t перевірка - прочитати конфігурацію і вийти\n" +#~ " -? print this message.\n" +#~ "\n" -#: src/console/console.c:978 -msgid "Select Director by entering a number: " -msgstr "Оберіть Керівника, увівши номер: " +#, fuzzy +#~ msgid "Could not create storage record for %s\n" +#~ msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" -#: src/console/console.c:985 -#, c-format -msgid "%s is not a number. You must enter a number between 1 and %d\n" -msgstr "%s не є номером. Ви повинні увести номер із проміжку 1..%d\n" +#, fuzzy +#~ msgid "Could not update storage record for %s\n" +#~ msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" -#: src/console/console.c:992 -#, c-format -msgid "You must enter a number between 1 and %d\n" -msgstr "Ви повинні увести номер із проміжку 1..%d\n" +#, fuzzy +#~ msgid "Client: Name=%s Enabled=%d Address=%s FDport=%d MaxJobs=%u\n" +#~ msgstr "Клієнт: назва=%s address=%s FDport=%d\n" -#: src/console/console.c:1153 src/dird/dird.c:279 src/filed/filed.c:205 -#: src/qt-console/main.cpp:157 src/stored/stored.c:232 -#: src/stored/test-dedup.c:836 src/stored/tune-dde.c:330 -msgid "Cryptography library initialization failed.\n" -msgstr "Ініціалізація криптографії невдала.\n" +#, fuzzy +#~ msgid "" +#~ "Attempt to redefine Storage resource \"%s\" referenced on line %d : %s\n" +#~ msgstr "" +#~ "Спроба визначити другий %s ресурс із назвою \"%s\" не дозволяється.\n" -#: src/console/console.c:1188 -#, c-format -msgid "Connecting to Director %s:%d\n" -msgstr "Підключаюсь до Керівника %s:%d\n" +#~ msgid "Count not update counter %s: ERR=%s\n" +#~ msgstr "Лічильник %s не оновлено: ERR=%s\n" -#: src/console/console.c:1205 src/qt-console/bcomm/dircomm.cpp:151 -#, c-format -msgid "Failed to initialize TLS context for Console \"%s\".\n" -msgstr "Ініціалізація контексту TLS для Консолі невдала \"%s\".\n" +#, fuzzy +#~ msgid "ComponentInfo failed.\n" +#~ msgstr "Помилка команди" -#: src/console/console.c:1225 src/qt-console/bcomm/dircomm.cpp:174 -#, c-format -msgid "Failed to initialize TLS context for Director \"%s\".\n" -msgstr "Ініціалізація контексту TLS для Керівника невдала \"%s\".\n" +#, fuzzy +#~ msgid "Failed to select Storage daemon.\n" +#~ msgstr "Відкриті з'єднання із Зберігачем.\n" -#: src/console/console.c:1259 -msgid "Enter a period to cancel a command.\n" -msgstr "Уведіть цятку для переривання команди.\n" +#, fuzzy +#~ msgid "canceled" +#~ msgstr "Статус задачі: Відмінена" -#: src/console/console.c:1410 -msgid "Too many arguments on input command.\n" -msgstr "Забагато параметрів команди.\n" +#, fuzzy +#~ msgid "Cannot create pool \"%s\" in database. ERR=%s" +#~ msgstr "Не можливо створити теку %s: ERR=%s\n" -#: src/console/console.c:1414 -msgid "First argument to input command must be a filename.\n" -msgstr "Перший параметр команди повинен бути назвою файлу.\n" +#, fuzzy +#~ msgid "No Client specified.\n" +#~ msgstr "зазначений час сну" -#: src/console/console.c:1420 -#, c-format -msgid "Cannot open file %s for input. ERR=%s\n" -msgstr "Не вдається відкрити файл %s для введення. ERR=%s\n" +#~ msgid "FileSet MD5 digest not found.\n" +#~ msgstr "Не знайдено відбиток MD5 Набору Файлів.\n" -#: src/console/console.c:1452 -msgid "Too many arguments on output/tee command.\n" -msgstr "Забагато параметрів на виході команди.\n" +#~ msgid "Illegal character in Volume name \"%s\"\n" +#~ msgstr "Заборонені символи у назві Тому \"%s\"\n" -#: src/console/console.c:1469 -#, c-format -msgid "Cannot open file %s for output. ERR=%s\n" -msgstr "Не вдається відкрити файл %s для виведення. ERR=%s\n" +#, fuzzy +#~ msgid "" +#~ "Created new Volume=\"%s\", Pool=\"%s\", MediaType=\"%s\" in catalog.\n" +#~ msgstr "У картотеці створено новий Том \"%s\".\n" -#: src/console/console.c:1488 -msgid "Too many arguments. Enclose command in double quotes.\n" -msgstr "Забагато параметрів. Оточіть комінду подвійними лапками.\n" +#~ msgid "SQL failed, but ignored. ERR=%s\n" +#~ msgstr "Проігноровано помилку SQL. ERR=%s\n" -#: src/console/console.c:1497 -#, c-format -msgid "Cannot popen(\"%s\", \"r\"): ERR=%s\n" -msgstr "" +#~ msgid "" +#~ "Wanted to create Volume \"%s\", but it already exists. Trying again.\n" +#~ msgstr "Спроба створити вже існуючий Том \"%s\". Спробуйте ще раз.\n" -#: src/console/console.c:1509 -#, fuzzy, c-format -msgid "@exec error: ERR=%s\n" -msgstr "Не вдалось створити %s: ERR=%s\n" +#~ msgid "Too many failures. Giving up creating Volume name.\n" +#~ msgstr "Занадто багато провалів. Відмова у створенні імені Тому.\n" -#: src/console/console.c:1542 -msgid "The String to encode is too long\n" -msgstr "" +#, fuzzy +#~ msgid "Could not get storage resource '%s'.\n" +#~ msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" -#: src/console/console_conf.c:130 src/qt-console/bat_conf.cpp:131 -#, c-format -msgid "No record for %d %s\n" -msgstr "Відсутні записи для %d %s\n" +#, fuzzy +#~ msgid "Could not acquire read storage lock for \"%s\"" +#~ msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" -#: src/console/console_conf.c:139 -#, c-format -msgid "Console: name=%s rcfile=%s histfile=%s\n" -msgstr "Консоль: назва=%s rcfile=%s histfile=%s\n" +#, fuzzy +#~ msgid "Bad response from SD to %s command. Wanted %s, got %s len=%ld\n" +#~ msgstr "Невірна відповідь від Збирача на команду Hello: ERR=%s\n" -#: src/console/console_conf.c:143 src/qt-console/bat_conf.cpp:140 -#, c-format -msgid "Director: name=%s address=%s DIRport=%d\n" -msgstr "Керівник: назва=%s адреса=%s DIRport=%d\n" +#, fuzzy +#~ msgid "Client resource not found\n" +#~ msgstr "Не знайдено відбиток MD5 Набору Файлів.\n" -#: src/console/console_conf.c:147 src/console/console_conf.c:227 -#: src/console/console_conf.c:268 src/console/console_conf.c:295 -#: src/filed/filed_conf.c:422 src/filed/filed_conf.c:486 -#: src/filed/filed_conf.c:516 src/qt-console/bat_conf.cpp:151 -#: src/qt-console/bat_conf.cpp:233 src/qt-console/bat_conf.cpp:279 -#: src/qt-console/bat_conf.cpp:309 src/stored/stored_conf.c:575 -#: src/stored/stored_conf.c:662 src/stored/stored_conf.c:697 -#, c-format -msgid "Unknown resource type %d\n" -msgstr "Невідомий тип ресурсу %d\n" +#, fuzzy +#~ msgid "Unable to get Snapshot record.\n" +#~ msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" -#: src/console/console_conf.c:249 src/dird/dird_conf.c:1466 -#: src/dird/dird_conf.c:1481 src/filed/filed_conf.c:447 -#: src/qt-console/bat_conf.cpp:257 -#: src/qt-console/tray-monitor/tray_conf.cpp:274 -#, c-format -msgid "%s item is required in %s resource, but not found.\n" -msgstr "Не знайдено необхідний елемент %s для ресурсу %s.\n" +#, fuzzy +#~ msgid "Terminate Bconsole session" +#~ msgstr "вивести версію Консолі" -#: src/dird/admin.c:54 -#, c-format -msgid "Start Admin JobId %d, Job=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Print current memory usage" +#~ msgstr "вивести поточний час" -#: src/dird/admin.c:79 src/dird/backup.c:801 src/dird/mac.c:719 -#: src/dird/vbackup.c:362 -#, c-format -msgid "Error getting Job record for Job report: ERR=%s" -msgstr "" +#, fuzzy +#~ msgid "Stop a job" +#~ msgstr "Останні задачі відсутні" -#: src/dird/admin.c:87 -msgid "Admin OK" -msgstr "" +#, fuzzy +#~ msgid "Show resource records" +#~ msgstr "Невідомий тип ресурсу %d\n" -#: src/dird/admin.c:91 -msgid "*** Admin Error ***" -msgstr "" +#, fuzzy +#~ msgid "Print current time" +#~ msgstr "вивести поточний час" -#: src/dird/admin.c:95 -msgid "Admin Canceled" -msgstr "" +#, fuzzy +#~ msgid "Print Director version" +#~ msgstr "Керівник" -#: src/dird/admin.c:99 src/dird/backup.c:857 src/dird/restore.c:671 -#: src/dird/vbackup.c:412 -#, c-format -msgid "Inappropriate term code: %c\n" -msgstr "" +#, fuzzy +#~ msgid "Client \"%s\" %sabled\n" +#~ msgstr "Помилка команди" -#: src/dird/admin.c:107 src/lib/status.h:205 src/lib/status.h:216 -#: src/lib/status.h:230 src/lib/status.h:234 src/lib/status.h:238 -msgid "Bacula " -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Can't find %s command.\n" +#~ "\n" +#~ msgstr ": неправильна команда\n" -#: src/dird/authenticate.c:78 src/dird/authenticate.c:79 -#: src/qt-console/tray-monitor/authenticate.cpp:120 -#, c-format -msgid "Error sending Hello to Storage daemon. ERR=%s\n" -msgstr "Не вдалося надіслати Hello до Зберігача. ERR=%s\n" +#, fuzzy +#~ msgid "Command line" +#~ msgstr "Не зрозумілий параметр командного рядка" -#: src/dird/authenticate.c:108 -msgid "Director and Storage daemon passwords or names not the same.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to get Job record for Job=%s\n" +#~ msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" -#: src/dird/authenticate.c:110 -#, c-format -msgid "" -"Director unable to authenticate with Storage daemon at \"%s:%d\". Possible " -"causes:\n" -"Passwords or names not the same or\n" -"Maximum Concurrent Jobs exceeded on the SD or\n" -"SD networking messed up (restart daemon).\n" -"For help, please see: " -msgstr "" +#, fuzzy +#~ msgid "Unable to get last Job record for Job=%s\n" +#~ msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" -#: src/dird/authenticate.c:138 -#, c-format -msgid "TLS negotiation failed with SD at \"%s:%d\"\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to get Client record for Client=%s\n" +#~ msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" -#: src/dird/authenticate.c:150 -#, c-format -msgid "bdird get resource type \n" +#~ " -n get resource \n" +#~ " -l get only directives matching dirs (use with -r)\n" +#~ " -D get only data\n" +#~ " -c use as configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print a timestamp in debug output\n" +#~ " -t test configuration file and exit\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "Автор Nicolas Boichat (2004)\n" +#~ "\n" +#~ "Версія: %s (%s) %s %s %s\n" +#~ "\n" +#~ "Використання: tray-monitor [-c config_file] [-d debug_level]\n" +#~ " -c задати конфігураційний файл \n" +#~ " -d встановити рівень відлагоджування у \n" +#~ " -dt виводити часову мітку у даних відлагоджування\n" +#~ " -t перевірка - прогитати конфігурацію і завершити\n" +#~ " -? показати це повідомлення.\n" +#~ "\n" -#: src/dird/backup.c:996 src/dird/backup.c:997 src/dird/backup.c:998 -#: src/dird/ua_input.c:142 src/dird/ua_run.c:188 src/dird/ua_run.c:833 -#: src/dird/ua_update.c:256 src/dird/ua_update.c:276 src/dird/ua_update.c:698 -#: src/stored/parse_bsr.c:828 src/tools/dbcheck.c:1124 -msgid "yes" -msgstr "" +#, fuzzy +#~ msgid "Unsupported cipher on this system.\n" +#~ msgstr "Цей тип відбитку не підтримується: %d\n" -#: src/dird/backup.c:996 src/dird/backup.c:997 src/dird/backup.c:998 -#: src/dird/ua_input.c:146 src/dird/ua_run.c:191 src/dird/ua_run.c:837 -#: src/dird/ua_update.c:256 src/dird/ua_update.c:276 src/dird/ua_update.c:698 -#: src/stored/parse_bsr.c:828 -msgid "no" -msgstr "" +#, fuzzy +#~ msgid "An error occurred while adding signer the stream.\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/dird/backup.c:1039 -#, c-format -msgid "Could not get Job Volume Parameters to update Bootstrap file. ERR=%s\n" -msgstr "" +#~ msgid "Could not create %s: ERR=%s\n" +#~ msgstr "Не вдалось створити %s: ERR=%s\n" -#: src/dird/backup.c:1075 -#, c-format -msgid "" -"Could not open WriteBootstrap file:\n" -"%s: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Error while creating command string %s.\n" +#~ msgstr "Помилка надсилання Hello до Збирача. ERR=%s\n" -#: src/dird/bdirjson.c:69 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bdirjson [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -r get resource type \n" -" -n get resource \n" -" -l get only directives matching dirs (use with -r)\n" -" -D get only data\n" -" -R do not apply JobDefs to Job\n" -" -c set configuration file to file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -t test - read configuration and exit\n" -" -s output in show text format\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Версія: %s (%s) %s %s %s\n" -"\n" -"Використання: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" -" -c set configuration file to file\n" -" -dnn set debug level to nn\n" -" -s без сигналів\n" -" -t перевірка - прочитати конфігурацію і вийти\n" -" -? print this message.\n" -"\n" +#, fuzzy +#~ msgid "Unable to create snapshot record. ERR=%s\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/dird/bdirjson.c:1141 src/dird/dird.c:666 -#, c-format -msgid "" -"No Director resource defined in %s\n" -"Without that I don't know who I am :-(\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to create snapshot record, got %s\n" +#~ msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" -#: src/dird/bdirjson.c:1149 src/dird/dird.c:674 src/filed/bfdjson.c:476 -#: src/filed/filed.c:341 -#, c-format -msgid "No Messages resource defined in %s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to delete snapshot record. ERR=%s\n" +#~ msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" -#: src/dird/bdirjson.c:1154 src/dird/dird.c:679 -#, c-format -msgid "Only one Director resource permitted in %s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to delete snapshot record, got %s\n" +#~ msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" -#: src/dird/bdirjson.c:1171 src/dird/dird.c:696 src/filed/bfdjson.c:536 -#: src/filed/filed.c:589 src/stored/bsdjson.c:533 src/stored/stored.c:418 -#, c-format -msgid "\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to get snapshot record. ERR=%s\n" +#~ msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" -#: src/dird/bdirjson.c:1177 src/dird/dird.c:702 src/filed/bfdjson.c:542 -#: src/filed/filed.c:595 src/stored/bsdjson.c:539 src/stored/stored.c:424 -#, c-format -msgid "\"TLS Key\" file not defined for Director \"%s\" in %s.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to get snapshot record, got %s\n" +#~ msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" -#: src/dird/bdirjson.c:1184 src/dird/dird.c:709 src/filed/bfdjson.c:548 -#: src/filed/filed.c:601 src/stored/bsdjson.c:545 src/stored/stored.c:430 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Director \"%s\" in %s. At least one CA certificate store is required when " -"using \"TLS Verify Peer\".\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to parse command output\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/dird/bdirjson.c:1210 src/dird/dird.c:915 -#, c-format -msgid "\"TLS Certificate\" file not defined for Console \"%s\" in %s.\n" -msgstr "" +#, fuzzy +#~ msgid " Unable to delete snapshot of %s ERR=%s\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/dird/bdirjson.c:1216 src/dird/dird.c:921 -#, c-format -msgid "\"TLS Key\" file not defined for Console \"%s\" in %s.\n" -msgstr "" +#, fuzzy +#~ msgid " Create Snapshot for %s\n" +#~ msgstr "Не можливо створити теку %s: ERR=%s\n" -#: src/dird/bdirjson.c:1223 src/dird/dird.c:928 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Console \"%s\" in %s. At least one CA certificate store is required when " -"using \"TLS Verify Peer\".\n" -msgstr "" +#, fuzzy +#~ msgid " Unable to create snapshot of %s ERR=%s\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/dird/bdirjson.c:1240 src/dird/dird.c:945 src/dird/dird.c:985 -#: src/filed/filed.c:404 -#, c-format -msgid "Failed to initialize TLS context for File daemon \"%s\" in %s.\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bacula-fd [-f -s] [-c config_file] [-d debug_level]\n" +#~ " -c use as configuration file\n" +#~ " -d [,] set debug level to , debug tags to \n" +#~ " -dt print a timestamp in debug output\n" +#~ " -f run in foreground (for debugging)\n" +#~ " -g groupid\n" +#~ " -k keep readall capabilities\n" +#~ " -m print kaboom output (for debugging)\n" +#~ " -s no signals (for debugging)\n" +#~ " -t test configuration file and exit\n" +#~ " -T set trace on\n" +#~ " -u userid\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Версія: %s (%s) %s %s %s\n" +#~ "\n" +#~ "Використання: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c set configuration file to file\n" +#~ " -dnn set debug level to nn\n" +#~ " -s без сигналів\n" +#~ " -t перевірка - прочитати конфігурацію і вийти\n" +#~ " -? print this message.\n" +#~ "\n" -#: src/dird/bdirjson.c:1263 src/dird/dird.c:968 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"File daemon \"%s\" in %s.\n" -msgstr "" +#, fuzzy +#~ msgid "Bad Hello command from Director at %s: %s\n" +#~ msgstr "Від'єднуюсь від Керівника %s:%d\n" -#: src/dird/bdirjson.c:1272 src/dird/dird.c:736 -#, c-format -msgid "No Job records defined in %s\n" -msgstr "" +#, fuzzy +#~ msgid "Connection from unknown Director %s at %s rejected.\n" +#~ msgstr "Від'єднуюсь від Керівника %s:%d\n" -#: src/dird/bdirjson.c:1339 src/dird/bdirjson.c:1352 src/dird/dird.c:805 -#: src/dird/dird.c:818 -#, c-format -msgid "Hey something is wrong. p=0x%lu\n" -msgstr "" +#, fuzzy +#~ msgid "SD connect failed: Bad Hello command\n" +#~ msgstr "Керівник не прийняв команду Hello\n" -#: src/dird/bdirjson.c:1413 src/dird/dird.c:880 -#, c-format -msgid "\"%s\" directive in Job \"%s\" resource is required, but not found.\n" -msgstr "" +#, fuzzy +#~ msgid "SD connect failed: Job name not found: %s\n" +#~ msgstr "Керівник не прийняв команду Hello\n" -#: src/dird/bdirjson.c:1420 src/dird/dird.c:887 -msgid "Too many items in Job resource\n" -msgstr "" +#, fuzzy +#~ msgid "SD \"%s\" tried to connect two times.\n" +#~ msgstr "Ініціалізація контексту TLS для Консолі невдала \"%s\".\n" -#: src/dird/bdirjson.c:1424 src/dird/dird.c:891 -#, c-format -msgid "No storage specified in Job \"%s\" nor in Pool.\n" -msgstr "" +#, fuzzy +#~ msgid "Recv caps from SD failed. ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/dird/bsr.c:190 -#, c-format -msgid "Unable to get Job record. ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Command: \"%s\" is disabled.\n" +#~ msgstr "Помилка команди" -#: src/dird/bsr.c:201 -#, c-format -msgid "Unable to get Job Volume Parameters. ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Bad RestoreObject command: %s\n" +#~ msgstr "Погана відповідь на команду Hello: ERR=%s\n" -#: src/dird/bsr.c:249 -#, c-format -msgid "Unable to create bootstrap file %s. ERR=%s\n" -msgstr "" +#~ msgid "Unknown include/exclude option: %c\n" +#~ msgstr "Не зрозуміла опція параметру include/exclude: %c\n" -#: src/dird/bsr.c:258 -msgid "No files found to read. No bootstrap file written.\n" -msgstr "" +#, fuzzy +#~ msgid "Failed connect from Storage daemon. SD bsock=NULL.\n" +#~ msgstr "Відкриті з'єднання із Зберігачем.\n" -#: src/dird/bsr.c:262 -msgid "Error writing bsr file.\n" -msgstr "" +#, fuzzy +#~ msgid "Generate VSS snapshots. Driver=\"%s\"\n" +#~ msgstr "Не можливо створити теку %s: ERR=%s\n" -#: src/dird/bsr.c:313 -msgid "" -"The Job will require the following (*=>InChanger):\n" -" Volume(s) Storage(s) SD Device(s)\n" -"===========================================================================\n" -msgstr "" +#, fuzzy +#~ msgid "VSS CreateSnapshots failed. ERR=%s\n" +#~ msgstr "Не можливо створити теку %s: ERR=%s\n" -#: src/dird/bsr.c:333 -msgid "No Volumes found to restore.\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Bad response from SD to %s command. Wanted %s, got len=%ld msg=\"%s\"\n" +#~ msgstr "Невірна відповідь від Збирача на команду Hello: ERR=%s\n" -#: src/dird/bsr.c:335 -msgid "" -"\n" -"Volumes marked with \"*\" are in the Autochanger.\n" -msgstr "" +#, fuzzy +#~ msgid "Could not set Finder Info on %s\n" +#~ msgstr "Не вдалось перевстановити прапорці для файлу %s: ERR=%s\n" -#: src/dird/catreq.c:128 src/dird/catreq.c:382 -#, c-format -msgid "1990 Invalid Catalog Request: %s" -msgstr "" +#, fuzzy +#~ msgid "LZO init failed\n" +#~ msgstr "Невдале встановлення з'єднання TLS\n" -#: src/dird/catreq.c:129 -#, c-format -msgid "Invalid Catalog request; DB not open: %s" -msgstr "" +#~ msgid "Could not create digest.\n" +#~ msgstr "Не можливо створити відбиток.\n" -#: src/dird/catreq.c:150 -#, c-format -msgid "Pool \"%s\" not found for SD find media request.\n" -msgstr "" +#, fuzzy +#~ msgid "Unsupported digest algorithm. Decrypt failed.\n" +#~ msgstr "Відбиток" -#: src/dird/catreq.c:159 -msgid "1901 No Media.\n" -msgstr "" +#, fuzzy +#~ msgid "Unsupported encryption algorithm. Decrypt failed.\n" +#~ msgstr "Відбиток" -#: src/dird/catreq.c:191 -msgid "not in Pool" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "An error=%d occurred while decoding encrypted session data stream: ERR=" +#~ "%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/dird/catreq.c:193 -msgid "not correct MediaType" -msgstr "" +#, fuzzy +#~ msgid "Cannot open resource fork for %s.\n" +#~ msgstr "Не вдається відкрити файл %s для виведення. ERR=%s\n" -#: src/dird/catreq.c:203 -msgid "is not Enabled" -msgstr "" +#, fuzzy +#~ msgid "LZO uncompression error on file %s. ERR=%d\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/dird/catreq.c:212 -#, c-format -msgid "1998 Volume \"%s\" catalog status is %s, %s.\n" -msgstr "" +#, fuzzy +#~ msgid "Write write error on %s: ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/dird/catreq.c:217 -#, c-format -msgid "1997 Volume \"%s\" not in catalog.\n" -msgstr "" +#, fuzzy +#~ msgid "Director connected %sat: %s\n" +#~ msgstr "Керівник від'єднано" -#: src/dird/catreq.c:244 -#, c-format -msgid "Unable to get Media record for Volume %s: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "WriteEncryptedFileRaw failure: ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/dird/catreq.c:246 -#, c-format -msgid "1991 Catalog Request for vol=%s failed: %s" -msgstr "" +#, fuzzy +#~ msgid "llistea error on file \"%s\": ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/dird/catreq.c:273 -#, c-format -msgid "Attempt to set Volume Files from %u to %u for Volume \"%s\". Ignored.\n" -msgstr "" +#, fuzzy +#~ msgid "lgetea error on file \"%s\": ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/dird/catreq.c:332 -#, c-format -msgid "Catalog error updating Media record. %s" -msgstr "" +#, fuzzy +#~ msgid "lsetea error on file \"%s\": ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/dird/catreq.c:334 -msgid "1993 Update Media error\n" -msgstr "" +#, fuzzy +#~ msgid "attr_list error on file \"%s\": ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/dird/catreq.c:361 -#, c-format -msgid "Catalog error creating JobMedia record. %s" -msgstr "" +#, fuzzy +#~ msgid "attr_set error on file \"%s\": ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/dird/catreq.c:363 -msgid "1992 Create JobMedia error\n" -msgstr "" +#, fuzzy +#~ msgid "extattr_list_link error on file \"%s\": ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/dird/catreq.c:383 -#, c-format -msgid "Invalid Catalog request: %s" -msgstr "" +#, fuzzy +#~ msgid "extattr_get_link error on file \"%s\": ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/dird/catreq.c:470 -#, fuzzy, c-format -msgid "Attribute create error: ERR=%s" -msgstr "Не вдалось створити %s: ERR=%s\n" +#, fuzzy +#~ msgid "extattr_set_link error on file \"%s\": ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/dird/catreq.c:567 -#, c-format -msgid "Restore object create error. %s" -msgstr "" +#, fuzzy +#~ msgid "getproplist error on file \"%s\": ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/dird/catreq.c:574 -#, c-format -msgid "%s not same File=%d as attributes=%d\n" -msgstr "" +#, fuzzy +#~ msgid "setproplist error on file \"%s\": ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/dird/catreq.c:601 -#, c-format -msgid "Catalog error updating file digest. Unsupported digest stream type: %d" -msgstr "" +#~ msgid "Unable to set file owner %s: ERR=%s\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/dird/catreq.c:616 -#, c-format -msgid "attribute create error. %s" -msgstr "" +#~ msgid "Unable to set file modes %s: ERR=%s\n" +#~ msgstr "Не можливо встановити параметри файлу %s: ERR=%s\n" -#: src/dird/catreq.c:622 -#, c-format -msgid "Catalog error updating file digest. %s" -msgstr "Помилка під час оновлення відбитку файлу. %s" +#~ msgid "Unable to set file times %s: ERR=%s\n" +#~ msgstr "Не можливо встановити час файлу %s: ERR=%s\n" -#: src/dird/catreq.c:645 -#, c-format -msgid "1994 Invalid Catalog Update: %s" -msgstr "1994 Помилка оновлення Каталогу: %s" +#~ msgid "" +#~ "File size of restored file %s not correct. Original %s, restored %s.\n" +#~ msgstr "" +#~ "Не правильний розмір відновленого файлу %s. Оригінальний %s, відновлений " +#~ "%s.\n" -#: src/dird/catreq.c:646 -#, c-format -msgid "Invalid Catalog Update; DB not open: %s" -msgstr "Помилка оновлення Каталогу: БД не відкрита: %s" +#~ msgid "Unable to set file flags %s: ERR=%s\n" +#~ msgstr "Не можливо встановити прапорці файлу %s: ERR=%s\n" -#: src/dird/catreq.c:702 src/dird/catreq.c:717 -#, c-format -msgid "fread attr spool error. ERR=%s\n" -msgstr "" +#~ msgid "Error in %s file %s: ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/dird/dir_plugins.c:170 src/filed/fd_plugins.c:1129 -#: src/stored/sd_plugins.c:221 -#, c-format -msgid "Loaded plugin: %s\n" -msgstr "" +#~ msgid "Error in %s: ERR=%s\n" +#~ msgstr "Помилка у %s: ERR=%s\n" -#: src/dird/dir_plugins.c:190 src/filed/fd_plugins.c:1150 -#: src/stored/sd_plugins.c:241 -#, c-format -msgid "Plugin magic wrong. Plugin=%s wanted=%s got=%s\n" -msgstr "" +#~ msgid "Unix attributes" +#~ msgstr "Атрибули Unix" -#: src/dird/dir_plugins.c:198 src/filed/fd_plugins.c:1158 -#: src/stored/sd_plugins.c:249 -#, c-format -msgid "Plugin version incorrect. Plugin=%s wanted=%d got=%d\n" -msgstr "" +#~ msgid "File data" +#~ msgstr "Дата файлу" -#: src/dird/dir_plugins.c:207 src/filed/fd_plugins.c:1168 -#: src/stored/sd_plugins.c:258 -#, c-format -msgid "Plugin license incompatible. Plugin=%s license=%s\n" -msgstr "" +#~ msgid "MD5 digest" +#~ msgstr "Відбиток MD5" -#: src/dird/dir_plugins.c:215 src/filed/fd_plugins.c:1176 -#: src/stored/sd_plugins.c:266 -#, c-format -msgid "Plugin size incorrect. Plugin=%s wanted=%d got=%d\n" -msgstr "" +#~ msgid "GZIP data" +#~ msgstr "Дані, запаковані GZIP" -#: src/dird/dird.c:121 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bacula-dir [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c set configuration file to file\n" -" -d [,] set debug level to , debug tags to \n" -" -dt print timestamp in debug output\n" -" -T set trace on\n" -" -f run in foreground (for debugging)\n" -" -g groupid\n" -" -m print kaboom output (for debugging)\n" -" -r run now\n" -" -s no signals\n" -" -t test - read configuration and exit\n" -" -u userid\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Версія: %s (%s) %s %s %s\n" -"\n" -"Використання: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" -" -c set configuration file to file\n" -" -dnn set debug level to nn\n" -" -s без сигналів\n" -" -t перевірка - прочитати конфігурацію і вийти\n" -" -? print this message.\n" -"\n" +#, fuzzy +#~ msgid "Compressed data" +#~ msgstr "Замало даних" -#: src/dird/dird.c:502 -msgid "Already doing a reload request, request ignored.\n" -msgstr "" +#~ msgid "Extended attributes" +#~ msgstr "Додаткові атрибути" -#: src/dird/dird.c:526 -msgid "Too many open reload requests. Request ignored.\n" -msgstr "" +#~ msgid "Sparse data" +#~ msgstr "Замало даних" -#: src/dird/dird.c:549 -msgid "Out of reload table entries. Giving up.\n" -msgstr "" +#~ msgid "GZIP sparse data" +#~ msgstr "Замало даних GZIP " -#: src/dird/dird.c:552 -msgid "Resetting previous configuration.\n" -msgstr "" +#, fuzzy +#~ msgid "Compressed sparse data" +#~ msgstr "Замало даних GZIP " -#: src/dird/dird.c:728 src/filed/filed.c:620 src/stored/stored.c:449 -#, c-format -msgid "Failed to initialize TLS context for Director \"%s\" in %s.\n" -msgstr "" +#~ msgid "Program names" +#~ msgstr "Назви програми" -#: src/dird/dird.c:1044 src/dird/dird.c:1046 src/stored/bscan.c:287 -#: src/stored/bscan.c:294 -#, c-format -msgid "Could not open Catalog \"%s\", database \"%s\".\n" -msgstr "" +#~ msgid "Program data" +#~ msgstr "Програмні дані" -#: src/dird/dird.c:1049 src/stored/bscan.c:290 src/tools/cats_test.c:364 -#, c-format -msgid "%s" -msgstr "" +#~ msgid "SHA1 digest" +#~ msgstr "Відбиток HA1" -#: src/dird/dird.c:1149 -#, fuzzy, c-format -msgid "Could not create storage record for %s\n" -msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" +#~ msgid "Win32 data" +#~ msgstr "Дані Win32" -#: src/dird/dird.c:1157 -#, fuzzy, c-format -msgid "Could not update storage record for %s\n" -msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" +#~ msgid "Win32 GZIP data" +#~ msgstr "Дані Win32 GZIP" -#: src/dird/dird.c:1176 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Storage \"%s\" in %s.\n" -msgstr "" +#, fuzzy +#~ msgid "Win32 compressed data" +#~ msgstr "Дані Win32" -#: src/dird/dird.c:1192 src/stored/stored.c:402 -#, c-format -msgid "Failed to initialize TLS context for Storage \"%s\" in %s.\n" -msgstr "" +#~ msgid "MacOS Fork data" +#~ msgstr "Дані MacOS Fork" -#: src/dird/dird.c:1306 src/dird/mac_sql.c:548 src/stored/stored.c:505 -#, c-format -msgid "Could not compile regex pattern \"%s\" ERR=%s\n" -msgstr "" +#~ msgid "HFS+ attribs" +#~ msgstr "Атрибути HFS+" -#: src/dird/dird_conf.c:579 src/qt-console/tray-monitor/tray_conf.cpp:158 -#, c-format -msgid "No %s resource defined\n" -msgstr "Ресурс %s не визначено\n" +#~ msgid "Standard Unix ACL attribs" +#~ msgstr "Стандартні атрибути Unix ACL" -#: src/dird/dird_conf.c:588 -#, c-format -msgid "Director: name=%s MaxJobs=%d FDtimeout=%s SDtimeout=%s\n" -msgstr "" +#~ msgid "Default Unix ACL attribs" +#~ msgstr "Звичійні атрибути Unix ACL" -#: src/dird/dird_conf.c:593 -#, c-format -msgid " query_file=%s\n" -msgstr "" +#~ msgid "SHA256 digest" +#~ msgstr "Відбиток SHA256" -#: src/dird/dird_conf.c:596 src/dird/dird_conf.c:616 src/dird/dird_conf.c:641 -#: src/dird/dird_conf.c:733 src/dird/dird_conf.c:737 src/dird/dird_conf.c:741 -#: src/dird/dird_conf.c:774 src/dird/dird_conf.c:797 src/dird/dird_conf.c:813 -#: src/dird/dird_conf.c:826 src/dird/dird_conf.c:1069 -#: src/dird/dird_conf.c:1076 -msgid " --> " -msgstr "" +#~ msgid "SHA512 digest" +#~ msgstr "Відбиток SHA512" -#: src/dird/dird_conf.c:601 -#, c-format -msgid "Console: name=%s SSL=%d\n" -msgstr "" +#~ msgid "Signed digest" +#~ msgstr "Підписаний відбиток" -#: src/dird/dird_conf.c:606 -#, c-format -msgid "Counter: name=%s min=%d max=%d cur=%d wrapcntr=%s\n" -msgstr "" +#~ msgid "Encrypted File data" +#~ msgstr "Зашифровані файли" -#: src/dird/dird_conf.c:611 -#, c-format -msgid "Counter: name=%s min=%d max=%d\n" -msgstr "" +#~ msgid "Encrypted Win32 data" +#~ msgstr "Зашифровані дані Win32" -#: src/dird/dird_conf.c:625 -#, fuzzy, c-format -msgid "Client: Name=%s Enabled=%d Address=%s FDport=%d MaxJobs=%u\n" -msgstr "Клієнт: назва=%s address=%s FDport=%d\n" +#~ msgid "Encrypted session data" +#~ msgstr "Зашифровані дані сесій" -#: src/dird/dird_conf.c:629 -#, c-format -msgid " JobRetention=%s FileRetention=%s AutoPrune=%d\n" -msgstr "" +#~ msgid "Encrypted GZIP data" +#~ msgstr "Зашифровані дані GZIP" -#: src/dird/dird_conf.c:637 src/dird/dird_conf.c:726 -#, c-format -msgid " MaximumBandwidth=%lld\n" -msgstr "" +#, fuzzy +#~ msgid "Encrypted compressed data" +#~ msgstr "Зашифровані дані сесій" -#: src/dird/dird_conf.c:649 -#, c-format -msgid "" -"Device: name=%s ok=%d num_writers=%d max_writers=%d\n" -" reserved=%d open=%d append=%d read=%d labeled=%d offline=%d autochgr=" -"%d\n" -" poolid=%s volname=%s MediaType=%s\n" -msgstr "" +#~ msgid "Encrypted Win32 GZIP data" +#~ msgstr "Зашифровані дані Win32 GZIP" -#: src/dird/dird_conf.c:664 -#, c-format -msgid "" -"%s: name=%s address=%s SDport=%d MaxJobs=%u\n" -" DeviceName=%s MediaType=%s StorageId=%s Autochanger=%d\n" -msgstr "" +#, fuzzy +#~ msgid "Encrypted Win32 Compressed data" +#~ msgstr "Зашифровані дані Win32" -#: src/dird/dird_conf.c:682 -msgid " Parent --> " -msgstr "" +#~ msgid "Encrypted MacOS fork data" +#~ msgstr "Зашифровані дані MacOS Fork " -#: src/dird/dird_conf.c:687 -msgid " Shared --> " -msgstr "" +#, fuzzy +#~ msgid "AIX ACL attribs" +#~ msgstr "Специфічні атрибути AIX ACL" -#: src/dird/dird_conf.c:696 -#, c-format -msgid "" -"Catalog: name=%s address=%s DBport=%d db_name=%s\n" -" db_driver=%s db_user=%s MutliDBConn=%d\n" -msgstr "" +#, fuzzy +#~ msgid "Darwin ACL attribs" +#~ msgstr "Специфічні атрибути Darwin ACL" -#: src/dird/dird_conf.c:709 -#, c-format -msgid "%s: name=%s JobType=%d level=%s Priority=%d Enabled=%d\n" -msgstr "" +#, fuzzy +#~ msgid "FreeBSD Default ACL attribs" +#~ msgstr "Специфічні атрибути FreeBSD Default ACL" -#: src/dird/dird_conf.c:710 src/dird/ua_prune.c:603 src/dird/ua_run.c:1013 -#: src/dird/ua_select.c:292 src/dird/ua_select.c:315 src/dird/ua_select.c:356 -#: src/dird/ua_select.c:1453 -msgid "Job" -msgstr "" +#, fuzzy +#~ msgid "FreeBSD Access ACL attribs" +#~ msgstr "Специфічні атрибути FreeBSD Access ACL" -#: src/dird/dird_conf.c:710 -msgid "JobDefs" -msgstr "" +#, fuzzy +#~ msgid "HPUX ACL attribs" +#~ msgstr "Специфічні атрибути HPUX ACL" -#: src/dird/dird_conf.c:714 -#, c-format -msgid "" -" MaxJobs=%u Resched=%d Times=%d Interval=%s Spool=%d WritePartAfterJob=" -"%d\n" -msgstr "" +#, fuzzy +#~ msgid "Irix Default ACL attribs" +#~ msgstr "Специфічні атрибути Irix Default ACL" -#: src/dird/dird_conf.c:720 -#, c-format -msgid " SpoolSize=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Irix Access ACL attribs" +#~ msgstr "Специфічні атрибути Irix Access ACL" -#: src/dird/dird_conf.c:723 -#, c-format -msgid " Accurate=%d\n" -msgstr "" +#, fuzzy +#~ msgid "Linux Default ACL attribs" +#~ msgstr "Специфічні атрибути Linux Default ACL" -#: src/dird/dird_conf.c:730 -#, c-format -msgid " SelectionType=%d\n" -msgstr "" +#, fuzzy +#~ msgid "Linux Access ACL attribs" +#~ msgstr "Специфічні атрибути Linux Access ACL" -#: src/dird/dird_conf.c:745 -#, c-format -msgid " --> Where=%s\n" -msgstr "" +#, fuzzy +#~ msgid "TRU64 Default ACL attribs" +#~ msgstr "Специфічні атрибути Irix Default ACL" -#: src/dird/dird_conf.c:748 -#, c-format -msgid " --> RegexWhere=%s\n" -msgstr "" +#, fuzzy +#~ msgid "TRU64 Access ACL attribs" +#~ msgstr "Специфічні атрибути Irix Access ACL" -#: src/dird/dird_conf.c:751 -#, c-format -msgid " --> Bootstrap=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Solaris POSIX ACL attribs" +#~ msgstr "Специфічні атрибути Solaris ACL" -#: src/dird/dird_conf.c:754 -#, c-format -msgid " --> WriteBootstrap=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Solaris NFSv4/ZFS ACL attribs" +#~ msgstr "Специфічні атрибути Solaris ACL" -#: src/dird/dird_conf.c:757 -#, c-format -msgid " --> PluginOptions=%s\n" -msgstr "" +#, fuzzy +#~ msgid "AFS ACL attribs" +#~ msgstr "Специфічні атрибути AIX ACL" -#: src/dird/dird_conf.c:760 -#, c-format -msgid " --> MaxRunTime=%u\n" -msgstr "" +#, fuzzy +#~ msgid "AIX POSIX ACL attribs" +#~ msgstr "Специфічні атрибути AIX ACL" -#: src/dird/dird_conf.c:763 -#, c-format -msgid " --> MaxWaitTime=%u\n" -msgstr "" +#, fuzzy +#~ msgid "AIX NFSv4 ACL attribs" +#~ msgstr "Специфічні атрибути AIX ACL" -#: src/dird/dird_conf.c:766 -#, c-format -msgid " --> MaxStartDelay=%u\n" -msgstr "" +#, fuzzy +#~ msgid "FreeBSD NFSv4/ZFS ACL attribs" +#~ msgstr "Специфічні атрибути FreeBSD Access ACL" -#: src/dird/dird_conf.c:769 -#, c-format -msgid " --> MaxRunSchedTime=%u\n" -msgstr "" +#, fuzzy +#~ msgid "GNU Hurd Default ACL attribs" +#~ msgstr "Специфічні атрибути Irix Default ACL" -#: src/dird/dird_conf.c:781 -#, c-format -msgid " --> Base %s\n" -msgstr "" +#, fuzzy +#~ msgid "GNU Hurd Access ACL attribs" +#~ msgstr "Специфічні атрибути Irix Access ACL" -#: src/dird/dird_conf.c:787 src/lib/runscript.c:286 -msgid " --> RunScript\n" -msgstr "" +#, fuzzy +#~ msgid "GNU Hurd Extended attribs" +#~ msgstr "Специфічні додаткові атрибути Linux" -#: src/dird/dird_conf.c:788 src/lib/runscript.c:287 -#, c-format -msgid " --> Command=%s\n" -msgstr "" +#, fuzzy +#~ msgid "IRIX Extended attribs" +#~ msgstr "Специфічні додаткові атрибути Linux" -#: src/dird/dird_conf.c:789 src/lib/runscript.c:288 -#, c-format -msgid " --> Target=%s\n" -msgstr "" +#, fuzzy +#~ msgid "TRU64 Extended attribs" +#~ msgstr "Специфічні додаткові атрибути Linux" -#: src/dird/dird_conf.c:790 src/lib/runscript.c:289 -#, c-format -msgid " --> RunOnSuccess=%u\n" -msgstr "" +#, fuzzy +#~ msgid "AIX Extended attribs" +#~ msgstr "Додаткові атрибути" -#: src/dird/dird_conf.c:791 src/lib/runscript.c:290 -#, c-format -msgid " --> RunOnFailure=%u\n" -msgstr "" +#, fuzzy +#~ msgid "OpenBSD Extended attribs" +#~ msgstr "Специфічні додаткові атрибути NetBSD" -#: src/dird/dird_conf.c:792 src/lib/runscript.c:291 -#, c-format -msgid " --> FailJobOnError=%u\n" -msgstr "" +#, fuzzy +#~ msgid "Solaris Extensible attribs or System Extended attribs" +#~ msgstr "Специфічні додаткові атрибути Solaris" -#: src/dird/dird_conf.c:793 src/lib/runscript.c:292 -#, c-format -msgid " --> RunWhen=%u\n" -msgstr "" +#, fuzzy +#~ msgid "Solaris Extended attribs" +#~ msgstr "Специфічні додаткові атрибути Solaris" -#: src/dird/dird_conf.c:801 -msgid " --> FullBackup" -msgstr "" +#, fuzzy +#~ msgid "Darwin Extended attribs" +#~ msgstr "Специфічні додаткові атрибути Darwin" -#: src/dird/dird_conf.c:805 -msgid " --> IncrementalBackup" -msgstr "" +#, fuzzy +#~ msgid "FreeBSD Extended attribs" +#~ msgstr "Специфічні додаткові атрибути FreeBS" -#: src/dird/dird_conf.c:809 -msgid " --> DifferentialBackup" -msgstr "" +#, fuzzy +#~ msgid "Linux Extended attribs" +#~ msgstr "Специфічні додаткові атрибути Linux" -#: src/dird/dird_conf.c:819 -#, c-format -msgid " --> Run=%s\n" -msgstr "" +#, fuzzy +#~ msgid "NetBSD Extended attribs" +#~ msgstr "Специфічні додаткові атрибути NetBSD" -#: src/dird/dird_conf.c:823 -#, c-format -msgid " --> SelectionPattern=%s\n" -msgstr "" +#~ msgid "File skipped. Not newer: %s\n" +#~ msgstr "Файл пропущено. Не новий: %s\n" -#: src/dird/dird_conf.c:837 -#, c-format -msgid "FileSet: name=%s\n" -msgstr "" +#~ msgid "File skipped. Not older: %s\n" +#~ msgstr "Файл пропущено. Не застарілий: %s\n" -#: src/dird/dird_conf.c:931 -#, c-format -msgid "Schedule: Name=%s Enabled=%d\n" -msgstr "" +#~ msgid "File skipped. Already exists: %s\n" +#~ msgstr "Файл пропущено. Вже існує: %s\n" -#: src/dird/dird_conf.c:937 -#, c-format -msgid " --> Run Level=%s\n" -msgstr "" +#~ msgid "File %s already exists and could not be replaced. ERR=%s.\n" +#~ msgstr "Файл %s існує та його не вдалось замінити. ERR=%s.\n" -#: src/dird/dird_conf.c:939 -#, c-format -msgid " MaxRunSchedTime=%u\n" -msgstr "" +#~ msgid "Cannot make fifo %s: ERR=%s\n" +#~ msgstr "Не можливо створити чергу(fifo) %s: ERR=%s\n" -#: src/dird/dird_conf.c:942 -#, c-format -msgid " Priority=%u\n" -msgstr "" +#~ msgid "Cannot make node %s: ERR=%s\n" +#~ msgstr "Не вдалось створити ноду(node) %s: ERR=%s\n" -#: src/dird/dird_conf.c:944 -msgid " hour=" -msgstr "" +#~ msgid "Could not symlink %s -> %s: ERR=%s\n" +#~ msgstr "Не вдалось створити лінку(symlink) %s -> %s: ERR=%s\n" -#: src/dird/dird_conf.c:953 -msgid " mday=" -msgstr "" +#~ msgid "Could not restore file flags for file %s: ERR=%s\n" +#~ msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" -#: src/dird/dird_conf.c:962 -msgid " month=" -msgstr "" +#~ msgid "Could not hard link %s -> %s: ERR=%s\n" +#~ msgstr "Не вдалось створити жорстку лінку(hardlink) %s -> %s: ERR=%s\n" -#: src/dird/dird_conf.c:971 -msgid " wday=" -msgstr "" +#~ msgid "Could not reset file flags for file %s: ERR=%s\n" +#~ msgstr "Не вдалось перевстановити прапорці для файлу %s: ERR=%s\n" -#: src/dird/dird_conf.c:980 -msgid " wom=" -msgstr "" +#~ msgid "Original file %s have been deleted: type=%d\n" +#~ msgstr "Оригінальний файл %s було видалено: тип=%d\n" -#: src/dird/dird_conf.c:989 -msgid " woy=" -msgstr "" +#~ msgid "Original file %s not saved: type=%d\n" +#~ msgstr "Оригінальний файл %s не збережено: тип=%d\n" -#: src/dird/dird_conf.c:998 -#, c-format -msgid " mins=%d\n" -msgstr "" +#~ msgid "Unknown file type %d; not restored: %s\n" +#~ msgstr "Невідомий тип файлу %d: не відновлено: %s\n" -#: src/dird/dird_conf.c:1000 src/dird/dird_conf.c:1004 -#: src/dird/dird_conf.c:1008 -msgid " --> " -msgstr "" +#~ msgid "Zero length filename: %s\n" +#~ msgstr "Пуста назва файлу: %s\n" -#: src/dird/dird_conf.c:1017 -#, c-format -msgid "Schedule: name=%s\n" -msgstr "" +#~ msgid "%s mtime changed during backup.\n" +#~ msgstr "%s mtime змінився під час резервування.\n" -#: src/dird/dird_conf.c:1025 -#, c-format -msgid "Pool: name=%s PoolType=%s\n" -msgstr "" +#~ msgid "%s ctime changed during backup.\n" +#~ msgstr "%s ctime змінився під час резервування.\n" -#: src/dird/dird_conf.c:1027 -#, c-format -msgid " use_cat=%d use_once=%d cat_files=%d\n" -msgstr "" +#, fuzzy +#~ msgid "%s size of %lld changed during backup to %lld.n" +#~ msgstr "%s розмір змінився під час резервування.\n" -#: src/dird/dird_conf.c:1030 -#, c-format -msgid " max_vols=%d auto_prune=%d VolRetention=%s\n" -msgstr "" +#~ msgid "Top level directory \"%s\" has unlisted fstype \"%s\"\n" +#~ msgstr "Вища тека \"%s\" має незрозумілий тип файлової системи \"%s\"\n" -#: src/dird/dird_conf.c:1033 -#, c-format -msgid " VolUse=%s recycle=%d LabelFormat=%s\n" -msgstr "" +#~ msgid "Top level directory \"%s\" has an unlisted drive type \"%s\"\n" +#~ msgstr "Вища тека \"%s\" має незрозумілий тип пристрою \"%s\"\n" -#: src/dird/dird_conf.c:1037 -#, c-format -msgid " CleaningPrefix=%s LabelType=%d\n" -msgstr "" +#~ msgid "Cannot create directory %s: ERR=%s\n" +#~ msgstr "Не можливо створити теку %s: ERR=%s\n" -#: src/dird/dird_conf.c:1039 -#, c-format -msgid " RecyleOldest=%d PurgeOldest=%d ActionOnPurge=%d\n" -msgstr "" +#~ msgid "%s exists but is not a directory.\n" +#~ msgstr "%s існує, але не є текою.\n" -#: src/dird/dird_conf.c:1043 -#, c-format -msgid " MaxVolJobs=%d MaxVolFiles=%d MaxVolBytes=%s\n" -msgstr "" +#~ msgid "Cannot change owner and/or group of %s: ERR=%s\n" +#~ msgstr "Не можливо змінити власника та/або групу для %s: ERR=%s\n" -#: src/dird/dird_conf.c:1047 -#, c-format -msgid " MigTime=%s MigHiBytes=%s MigLoBytes=%s\n" -msgstr "" +#~ msgid "Cannot change permissions of %s: ERR=%s\n" +#~ msgstr "Не можливо змінити дозволи для %s: ERR=%s\n" -#: src/dird/dird_conf.c:1051 -#, c-format -msgid " JobRetention=%s FileRetention=%s\n" -msgstr "" +#~ msgid "%c: is not a valid drive.\n" +#~ msgstr "%c: не вірний пристрій.\n" -#: src/dird/dird_conf.c:1055 -#, c-format -msgid " NextPool=%s\n" -msgstr "" +#~ msgid "Too many subdirectories. Some permissions not reset.\n" +#~ msgstr "Забагато підтек. Деякі обмеження не перевстановлено.\n" -#: src/dird/dird_conf.c:1058 -#, c-format -msgid " RecyclePool=%s\n" -msgstr "" +#~ msgid "Cannot open current directory: ERR=%s\n" +#~ msgstr "Не можливо відкрити поточну теку: ERR=%s\n" -#: src/dird/dird_conf.c:1061 -#, c-format -msgid " ScratchPool=%s\n" -msgstr "" +#~ msgid "Cannot get current directory: ERR=%s\n" +#~ msgstr "Не можливо отримати поточну теку: ERR=%s\n" -#: src/dird/dird_conf.c:1064 -#, c-format -msgid " Catalog=%s\n" -msgstr "" +#~ msgid "Cannot reset current directory: ERR=%s\n" +#~ msgstr "Не можливо перевстановити поточну теку: ERR=%s\n" -#: src/dird/dird_conf.c:1084 -#, c-format -msgid "Messages: name=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Could not init bsock read mutex. ERR=%s\n" +#~ msgstr "Не вдалось відкрити%s: ERR=%s\n" -#: src/dird/dird_conf.c:1086 -#, c-format -msgid " mailcmd=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Could not init bsock write mutex. ERR=%s\n" +#~ msgstr "Не вдалось відкрити%s: ERR=%s\n" -#: src/dird/dird_conf.c:1088 -#, c-format -msgid " opcmd=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Director authorization error at \"%s:%d\"\n" +#~ msgstr "Проблеми авторизації Директора \"%s:%d\"\n" -#: src/dird/dird_conf.c:1092 src/qt-console/tray-monitor/tray_conf.cpp:189 -#, c-format -msgid "Unknown resource type %d in dump_resource.\n" -msgstr "Невідомий тип ресурсу %d у dump_resource.\n" +#, fuzzy +#~ msgid "" +#~ "Authorization error: Remote server at \"%s:%d\" did not advertise " +#~ "required TLS support.\n" +#~ msgstr "" +#~ "Проблеми авторизації: Віддалений сервер \"%s:%d\" не повідомляє про " +#~ "необхідність використання TLS.\n" -#: src/dird/dird_conf.c:1437 src/qt-console/tray-monitor/tray_conf.cpp:247 -#, c-format -msgid "Unknown resource type %d in free_resource.\n" -msgstr "Невідомий тип ресурсу %d у free_resource.\n" +#, fuzzy +#~ msgid "" +#~ "Authorization error with Director at \"%s:%d\": Remote server requires " +#~ "TLS.\n" +#~ msgstr "" +#~ "Проблеми авторизації Керівника \"%s:%d\": Віддалений сепвер вимагає TLS.\n" -#: src/dird/dird_conf.c:1472 src/lib/parse_conf.c:259 -#: src/qt-console/tray-monitor/tray_conf.cpp:280 -#, c-format -msgid "Too many items in %s resource\n" -msgstr "Забагато елементів у ресурсі %s\n" +#, fuzzy +#~ msgid "" +#~ "Bad errmsg to Hello command: ERR=%s\n" +#~ "The Director at \"%s:%d\" may not be running.\n" +#~ msgstr "" +#~ "Погана відповідь на команду Hello: ERR=%s\n" +#~ "Керівник \"%s:%d\" ймовірно не запущений.\n" -#: src/dird/dird_conf.c:1512 -#, c-format -msgid "Cannot find Pool resource %s\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Authorization error with Director at \"%s:%d\"\n" +#~ "Most likely the passwords do not agree.\n" +#~ "If you are using TLS, there may have been a certificate validation error " +#~ "during the TLS handshake.\n" +#~ "For help, please see: " +#~ msgstr "" +#~ "Проблеми авторизації із Керівником \"%s:%d\"\n" +#~ "Швидше за все, проблема у паролях.\n" +#~ "Якщо Ви використовуєте TLS, можливо, невдала перевірка сертифікату під " +#~ "час TLS handshake.\n" +#~ "Для отримання допомоги, будь ласка, перегляньте http://www.bacula.org/en/" +#~ "rel-manual/Bacula_Freque_Asked_Questi.html#SECTION003760000000000000000.\n" -#: src/dird/dird_conf.c:1523 -#, c-format -msgid "Cannot find Console resource %s\n" -msgstr "" +#, fuzzy +#~ msgid "safe_unlink could not compile regex pattern \"%s\" ERR=%s\n" +#~ msgstr "Не вдалось створити %s: ERR=%s\n" -#: src/dird/dird_conf.c:1529 src/filed/filed_conf.c:467 -#: src/stored/stored_conf.c:628 -#, c-format -msgid "Cannot find Director resource %s\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot open %s file. %s ERR=%s\n" +#~ msgstr "Не вдалось відкрити%s: ERR=%s\n" -#: src/dird/dird_conf.c:1538 src/stored/stored_conf.c:634 -#, c-format -msgid "Cannot find Storage resource %s\n" -msgstr "" +#, fuzzy +#~ msgid "Could not open %s file. %s ERR=%s\n" +#~ msgstr "Не вдалось відкрити%s: ERR=%s\n" -#: src/dird/dird_conf.c:1554 -#, c-format -msgid "Cannot find Job resource %s\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot lock %s file. %s ERR=%s\n" +#~ msgstr "Не вдалось відкрити%s: ERR=%s\n" -#: src/dird/dird_conf.c:1605 -#, c-format -msgid "Cannot find Counter resource %s\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot not open %s file. %s ERR=%s\n" +#~ msgstr "Не вдалось відкрити%s: ERR=%s\n" -#: src/dird/dird_conf.c:1613 src/filed/filed_conf.c:474 -#, c-format -msgid "Cannot find Client resource %s\n" -msgstr "" +#~ msgid "Unsupported digest type: %d\n" +#~ msgstr "Цей тип відбитку не підтримується: %d\n" -#: src/dird/dird_conf.c:1626 -#, c-format -msgid "Cannot find Schedule resource %s\n" -msgstr "" +#~ msgid "OpenSSL digest initialization failed" +#~ msgstr "Відбиток" -#: src/dird/dird_conf.c:1631 src/dird/dird_conf.c:1697 -#: src/qt-console/tray-monitor/tray_conf.cpp:300 -#: src/qt-console/tray-monitor/tray_conf.cpp:338 -#, c-format -msgid "Unknown resource type %d in save_resource.\n" -msgstr "Невідомий тип ресурсу %d у save_resource.\n" +#~ msgid "OpenSSL digest update failed" +#~ msgstr "Відбиток" -#: src/dird/dird_conf.c:1714 -#, c-format -msgid "Expected one of: %s, got: %s" -msgstr "" +#~ msgid "OpenSSL digest finalize failed" +#~ msgstr "Відбиток" -#: src/dird/dird_conf.c:1753 -#, c-format -msgid "Could not find Storage Resource %s referenced on line %d : %s\n" -msgstr "" +#~ msgid "OpenSSL sign get digest failed" +#~ msgstr "Відбиток" -#: src/dird/dird_conf.c:1758 -#, fuzzy, c-format -msgid "" -"Attempt to redefine Storage resource \"%s\" referenced on line %d : %s\n" -msgstr "Спроба визначити другий %s ресурс із назвою \"%s\" не дозволяється.\n" +#~ msgid "OpenSSL digest Verify final failed" +#~ msgstr "Відбиток" -#: src/dird/dird_conf.c:1833 -#, c-format -msgid "Expected a Migration Job Type keyword, got: %s" -msgstr "" +#~ msgid "Unsupported digest type=%d specified\n" +#~ msgstr "Заданий тип відбитку=%d не підтримується\n" -#: src/dird/dird_conf.c:1859 -#, c-format -msgid "Expected a Job Type keyword, got: %s" -msgstr "" +#~ msgid "Unsupported digest algorithm" +#~ msgstr "Відбиток" -#: src/dird/dird_conf.c:1883 -#, c-format -msgid "Expected a Job Level keyword, got: %s" -msgstr "" +#, fuzzy +#~ msgid "Cannot open config file %s: %s\n" +#~ msgstr "Не можливо створити чергу(fifo) %s: ERR=%s\n" -#: src/dird/dird_conf.c:1903 -#, c-format -msgid "Expected a Restore replacement option, got: %s" -msgstr "" +#, fuzzy +#~ msgid "Cannot open lex\n" +#~ msgstr "Не можливо створити чергу(fifo) %s: ERR=%s\n" -#: src/dird/dird_conf.c:1955 src/dird/dird_conf.c:2071 src/lib/ini.c:636 -#: src/lib/parse_conf.c:828 src/lib/parse_conf.c:844 -#, c-format -msgid "Expect %s, got: %s" -msgstr "" +#, fuzzy +#~ msgid "Could not init msg_queue mutex. ERR=%s\n" +#~ msgstr "Не вдалось відкрити%s: ERR=%s\n" -#: src/dird/dird_conf.c:1977 src/lib/parse_conf.c:537 -#, c-format -msgid "Could not find config Resource %s referenced on line %d : %s\n" -msgstr "" +#, fuzzy +#~ msgid "Msg delivery error: fopen %s failed: ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/dird/dird_conf.c:2111 src/dird/inc_conf.c:701 -#, c-format -msgid "Expecting open brace. Got %s" -msgstr "" +#, fuzzy +#~ msgid "dlopen plugin %s failed: ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/dird/dird_conf.c:2125 src/dird/inc_conf.c:370 src/dird/inc_conf.c:716 -#, c-format -msgid "Expecting keyword, got: %s\n" -msgstr "" +#, fuzzy +#~ msgid "prctl failed: ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/dird/dird_conf.c:2131 src/dird/inc_conf.c:378 src/dird/inc_conf.c:722 -#: src/lib/parse_conf.c:1037 -#, c-format -msgid "expected an equals, got: %s" -msgstr "" +#, fuzzy +#~ msgid "setreuid failed: ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/dird/dird_conf.c:2142 src/dird/inc_conf.c:388 src/dird/inc_conf.c:731 -#, c-format -msgid "Keyword %s not permitted in this resource" -msgstr "" +#, fuzzy +#~ msgid "Can't run command %s. ERR=%s\n" +#~ msgstr "Не вдалось створити ноду(node) %s: ERR=%s\n" -#: src/dird/expand.c:244 -#, c-format -msgid "Count not update counter %s: ERR=%s\n" -msgstr "Лічильник %s не оновлено: ERR=%s\n" +#, fuzzy +#~ msgid "Can't create working directory %s. ERR=%s\n" +#~ msgstr "Не можливо створити теку %s: ERR=%s\n" -#: src/dird/expand.c:416 -#, c-format -msgid "Cannot create var context: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Can't delete working directory %s. ERR=%s\n" +#~ msgstr "Не можливо створити теку %s: ERR=%s\n" -#: src/dird/expand.c:421 -#, c-format -msgid "Cannot set var callback: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unknown parameter or missing argument for %s.\n" +#~ msgstr "Невідомий статус" -#: src/dird/expand.c:427 -#, c-format -msgid "Cannot set var operate: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unknown parameter for %s. Expecting block or file\n" +#~ msgstr "Невідомий статус" -#: src/dird/expand.c:433 src/dird/expand.c:448 -#, c-format -msgid "Cannot unescape string: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unknown parameter %s.\n" +#~ msgstr "Невідомий статус" -#: src/dird/expand.c:441 -#, c-format -msgid "Cannot expand expression \"%s\": ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to access guest volume\n" +#~ msgstr "Не можливо встановити параметри файлу %s: ERR=%s\n" -#: src/dird/expand.c:459 -#, c-format -msgid "Cannot destroy var context: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to create temporary file %s. ERR=%s\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/dird/fd_cmds.c:81 -msgid "File daemon not defined for current Job\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to fdopen file %s. ERR=%s\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/dird/fd_cmds.c:98 -msgid "Client: " -msgstr "" +#, fuzzy +#~ msgid " Dumping database \"%s\"\n" +#~ msgstr "Не вдалось відкрити%s: ERR=%s\n" -#: src/dird/fd_cmds.c:134 -#, c-format -msgid "File daemon \"%s\" rejected Job command: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to detect the MySQL data_directory on this system.\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/dird/fd_cmds.c:147 -#, c-format -msgid "Error updating Client record. ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to determine the last binlog %s\n" +#~ msgstr "Не можливо встановити час файлу %s: ERR=%s\n" -#: src/dird/fd_cmds.c:152 -#, c-format -msgid "FD gave bad response to JobId command: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to get the BINLOG list.\n" +#~ msgstr "Не можливо встановити час файлу %s: ERR=%s\n" -#: src/dird/fd_cmds.c:181 src/dird/fd_cmds.c:269 -msgid ", since=" -msgstr "" +#, fuzzy +#~ msgid "Unable to determine the last LSN for %s (Previous job is %s)\n" +#~ msgstr "Не можливо встановити час файлу %s: ERR=%s\n" -#: src/dird/fd_cmds.c:246 -msgid "No prior or suitable Full backup found in catalog. Doing FULL backup.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to detect datadir from MySQL\n" +#~ msgstr "Не можливо встановити час файлу %s: ERR=%s\n" -#: src/dird/fd_cmds.c:247 src/dird/fd_cmds.c:253 src/dird/fd_cmds.c:262 -#, c-format -msgid " (upgraded from %s)" -msgstr "" +#, fuzzy +#~ msgid "Unable to get last LSN from the backup\n" +#~ msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" -#: src/dird/fd_cmds.c:252 -msgid "" -"No prior or suitable Differential backup found in catalog. Doing " -"Differential backup.\n" -msgstr "" +#, fuzzy +#~ msgid "Restoring target database \"%s\"\n" +#~ msgstr "Не вдалось відкрити%s: ERR=%s\n" -#: src/dird/fd_cmds.c:260 -#, c-format -msgid "Prior failed job found in catalog. Upgrading to %s.\n" -msgstr "" +#, fuzzy +#~ msgid "Creating target database \"%s\"\n" +#~ msgstr "Не вдалось відкрити%s: ERR=%s\n" -#: src/dird/fd_cmds.c:338 -#, c-format -msgid "Unimplemented backup level %d %c\n" -msgstr "" +#, fuzzy +#~ msgid "Database \"%s\" already exists. Skipping creation.\n" +#~ msgstr "Спроба створити вже існуючий Том \"%s\". Спробуйте ще раз.\n" -#: src/dird/fd_cmds.c:420 -msgid "" -"FD compression disabled for this Job because AllowCompress=No in Storage " -"resource.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to parse or to use plugin options, %s\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/dird/fd_cmds.c:520 src/filed/job.c:1094 -#, c-format -msgid "Cannot run program: %s. ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Unknown parameter or bad argument for %s.\n" +#~ msgstr "Невідомий статус" -#: src/dird/fd_cmds.c:532 src/dird/fd_cmds.c:558 src/dird/fd_cmds.c:572 -msgid ">filed: write error on socket\n" -msgstr "" +#, fuzzy +#~ msgid "Can't determine the last WAL file\n" +#~ msgstr "Не можливо встановити час файлу %s: ERR=%s\n" -#: src/dird/fd_cmds.c:538 -#, c-format -msgid "Error running program: %s. ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Can't determine WAL directory\n" +#~ msgstr "Не можливо створити теку %s: ERR=%s\n" -#: src/dird/fd_cmds.c:547 -#, c-format -msgid "Cannot open included file: %s. ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Can't open WAL directory %s. ERR=%s\n" +#~ msgstr "Не можливо створити теку %s: ERR=%s\n" -#: src/dird/fd_cmds.c:720 -#, c-format -msgid "Client \"%s\" RunScript failed.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to detect the PostgreSQL data_directory on this system.\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/dird/fd_cmds.c:743 -#, c-format -msgid "" -"Client \"%s\" may not be used to restore this job. Please upgrade your " -"client.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to find data_directory=%s on this system. ERR=%s\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/dird/fd_cmds.c:824 -msgid "RestoreObject failed.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to start the PITR backup on this system.\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/dird/fd_cmds.c:861 #, fuzzy -msgid "ComponentInfo failed.\n" -msgstr "Помилка команди" +#~ msgid "Unable to determine the first WAL file on this system.\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/dird/fd_cmds.c:906 -#, c-format -msgid "" -" \n" +#~ " -b bootstrap specify a bootstrap file\n" +#~ " -c specify a Storage configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -i specify input Volume names (separated by |)\n" +#~ " -o specify output Volume names (separated by |)\n" +#~ " -p proceed inspite of errors\n" +#~ " -v verbose\n" +#~ " -w specify working directory (default /tmp)\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Версія: %s (%s) %s %s %s\n" +#~ "\n" +#~ "Використання: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c set configuration file to file\n" +#~ " -dnn set debug level to nn\n" +#~ " -s без сигналів\n" +#~ " -t перевірка - прочитати конфігурацію і вийти\n" +#~ " -? print this message.\n" +#~ "\n" -#: src/dird/inc_conf.c:441 -#, c-format -msgid "Regex compile error. ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bextract \n" +#~ " -b specify a bootstrap file\n" +#~ " -c specify a Storage configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -T send debug traces to trace file\n" +#~ " -e exclude list\n" +#~ " -i include list\n" +#~ " -p proceed inspite of I/O errors\n" +#~ " -t read data from volume, do not write anything\n" +#~ " -v verbose\n" +#~ " -V specify Volume names (separated by |)\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Версія: %s (%s) %s %s %s\n" +#~ "\n" +#~ "Використання: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c set configuration file to file\n" +#~ " -dnn set debug level to nn\n" +#~ " -s без сигналів\n" +#~ " -t перевірка - прочитати конфігурацію і вийти\n" +#~ " -? print this message.\n" +#~ "\n" -#: src/dird/inc_conf.c:462 -#, c-format -msgid "Expected a regex string, got: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Found %s error%s\n" +#~ msgstr " (%d помилок)" -#: src/dird/inc_conf.c:536 -#, c-format -msgid "Expected a wild-card string, got: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Job failed or canceled.\n" +#~ msgstr "Статус задачі: Відмінена" -#: src/dird/inc_conf.c:571 -msgid "ExcludeDirContaining directive not permitted in Exclude.\n" -msgstr "" +#, fuzzy +#~ msgid "The Volume=%s on device=%s appears to be unlabeled.\n" +#~ msgstr "У картотеці створено новий Том \"%s\".\n" -#: src/dird/inc_conf.c:621 src/dird/inc_conf.c:664 -#, c-format -msgid "Backslash found. Use forward slashes or quote the string.: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Error sending Volume info to Director.\n" +#~ msgstr "Помилка надсилання Hello до Збирача. ERR=%s\n" -#: src/dird/inc_conf.c:636 src/dird/inc_conf.c:679 -#, c-format -msgid "Expected a filename, got: %s" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bls [options] \n" +#~ " -b specify a bootstrap file\n" +#~ " -c specify a Storage configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -e exclude list\n" +#~ " -i include list\n" +#~ " -j list jobs\n" +#~ " -k list blocks\n" +#~ " (no j or k option) list saved files\n" +#~ " -L dump label\n" +#~ " -p proceed inspite of errors\n" +#~ " -v be verbose\n" +#~ " -V specify Volume names (separated by |)\n" +#~ " -E Check records to detect errors\n" +#~ " -? print this message\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Версія: %s (%s) %s %s %s\n" +#~ "\n" +#~ "Використання: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c set configuration file to file\n" +#~ " -dnn set debug level to nn\n" +#~ " -s без сигналів\n" +#~ " -t перевірка - прочитати конфігурацію і вийти\n" +#~ " -? print this message.\n" +#~ "\n" -#: src/dird/inc_conf.c:653 -msgid "Plugin directive not permitted in Exclude\n" -msgstr "" +#~ msgid "Got signed digest record\n" +#~ msgstr "Отримано підписаний відбиток запису\n" -#: src/dird/inc_conf.c:696 -msgid "Options section not permitted in Exclude\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bsdjson [options] [-c config_file] [config_file]\n" +#~ " -r get resource type \n" +#~ " -n get resource \n" +#~ " -l get only directives matching dirs (use with -r)\n" +#~ " -D get only data\n" +#~ " -c use as configuration file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -t test - read config and exit\n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "Автор Nicolas Boichat (2004)\n" +#~ "\n" +#~ "Версія: %s (%s) %s %s %s\n" +#~ "\n" +#~ "Використання: tray-monitor [-c config_file] [-d debug_level]\n" +#~ " -c задати конфігураційний файл \n" +#~ " -d встановити рівень відлагоджування у \n" +#~ " -dt виводити часову мітку у даних відлагоджування\n" +#~ " -t перевірка - прогитати конфігурацію і завершити\n" +#~ " -? показати це повідомлення.\n" +#~ "\n" -#: src/dird/inc_conf.c:763 -#, c-format -msgid "Expected a FileSet keyword, got: %s" -msgstr "" +#, fuzzy +#~ msgid "Volume type error: ERR=%s\n" +#~ msgstr "Не вдалось створити %s: ERR=%s\n" -#: src/dird/job.c:51 -#, c-format -msgid "Could not init job queue: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "Job canceled.\n" +#~ msgstr "Статус задачі: Відмінена" -#: src/dird/job.c:83 src/dird/job.c:398 -#, c-format -msgid "Could not add job queue: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "do_unfill failed.\n" +#~ msgstr "Помилка команди" -#: src/dird/job.c:110 src/dird/job.c:282 src/dird/jobq.c:209 -#: src/filed/job.c:286 src/stored/dircmd.c:189 src/stored/stored.c:575 -#, c-format -msgid "Unable to init job cond variable: ERR=%s\n" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: btape \n" +#~ " -b specify bootstrap file\n" +#~ " -c set configuration file to file\n" +#~ " -d set debug level to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -p proceed inspite of I/O errors\n" +#~ " -s turn off signals\n" +#~ " -v be verbose\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "Автор Nicolas Boichat (2004)\n" +#~ "\n" +#~ "Версія: %s (%s) %s %s %s\n" +#~ "\n" +#~ "Використання: tray-monitor [-c config_file] [-d debug_level]\n" +#~ " -c задати конфігураційний файл \n" +#~ " -d встановити рівень відлагоджування у \n" +#~ " -dt виводити часову мітку у даних відлагоджування\n" +#~ " -t перевірка - прогитати конфігурацію і завершити\n" +#~ " -? показати це повідомлення.\n" +#~ "\n" -#: src/dird/job.c:130 src/dird/job.c:301 src/dird/ua_output.c:879 -#: src/tools/cats_test.c:362 -#, c-format -msgid "Could not open database \"%s\".\n" -msgstr "" +#, fuzzy +#~ msgid "Initializing DDE." +#~ msgstr "Ініціалізація ..." -#: src/dird/job.c:157 src/dird/job.c:161 src/dird/job.c:167 src/dird/job.c:316 -#: src/dird/job.c:320 src/dird/ua_cmds.c:923 src/dird/ua_cmds.c:1705 -#: src/dird/ua_dotcmds.c:1083 src/dird/ua_status.c:408 -msgid "unknown source" -msgstr "" +#, fuzzy +#~ msgid "Cannot create DedupDirectory: %s" +#~ msgstr "Не можливо створити теку %s: ERR=%s\n" -#: src/dird/job.c:197 src/dird/job.c:574 src/dird/job.c:576 src/dird/job.c:794 -#: src/dird/job.c:796 src/dird/job.c:1500 src/dird/job.c:1542 -#: src/dird/job.c:1553 -msgid "Job resource" -msgstr "" +#, fuzzy +#~ msgid "Cannot create DedupIndexDirectory: %s" +#~ msgstr "Не можливо створити теку %s: ERR=%s\n" -#: src/dird/job.c:244 src/dird/job.c:376 src/dird/job.c:512 -#, c-format -msgid "Unimplemented job type: %d\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot create recovery directory: %s" +#~ msgstr "Не можливо створити теку %s: ERR=%s\n" -#: src/dird/job.c:436 -msgid "Job canceled because max start delay time exceeded.\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot delete temporary recovery directory: %s" +#~ msgstr "Не можливо перевстановити поточну теку: ERR=%s\n" -#: src/dird/job.c:441 -msgid "Job canceled because max run sched time exceeded.\n" -msgstr "" +#, fuzzy +#~ msgid "Error sending chunk request to client\n" +#~ msgstr "Помилка надсилання Hello до Збирача. ERR=%s\n" -#: src/dird/job.c:554 -msgid "Failed to connect to File daemon.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to init spool mutex: ERR=%s\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/dird/job.c:589 #, fuzzy -msgid "Failed to select Storage daemon.\n" -msgstr "Відкриті з'єднання із Зберігачем.\n" +#~ msgid "Unable to init acquire mutex: ERR=%s\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/dird/job.c:594 src/dird/msgchan.c:70 src/dird/ua_cmds.c:929 -#: src/dird/ua_cmds.c:1730 src/dird/ua_dotcmds.c:1089 -msgid "Failed to connect to Storage daemon.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to init read acquire mutex: ERR=%s\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/dird/job.c:646 -#, c-format -msgid "Client resource \"%s\" does not exist.\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to init adata mutex: ERR=%s\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/dird/job.c:697 #, fuzzy -msgid "canceled" -msgstr "Статус задачі: Відмінена" +#~ msgid "Unable to init volcat mutex: ERR=%s\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/dird/job.c:701 -msgid "stopped" -msgstr "" +#, fuzzy +#~ msgid "Unable to init dcrs mutex: ERR=%s\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/dird/job.c:717 -#, c-format -msgid "JobId %s, Job %s marked to be %s.\n" -msgstr "" +#, fuzzy +#~ msgid "Bad client command: %s" +#~ msgstr "Погана відповідь на команду Hello: ERR=%s\n" -#: src/dird/job.c:856 -msgid "Max wait time exceeded. Job canceled.\n" -msgstr "" +#, fuzzy +#~ msgid "Client daemon" +#~ msgstr "Збирач" -#: src/dird/job.c:861 -msgid "Max run time exceeded. Job canceled.\n" -msgstr "" +#, fuzzy +#~ msgid "Failed to connect to Client daemon: %s:%d\n" +#~ msgstr "Ініціалізація контексту TLS для Консолі невдала \"%s\".\n" -#: src/dird/job.c:866 -msgid "Max run sched time exceeded. Job canceled.\n" -msgstr "" +#, fuzzy +#~ msgid "3910 Unable to open device \"%s\": ERR=%s\n" +#~ msgstr "Не можливо встановити час файлу %s: ERR=%s\n" -#: src/dird/job.c:988 -#, fuzzy, c-format -msgid "Cannot create pool \"%s\" in database. ERR=%s" -msgstr "Не можливо створити теку %s: ERR=%s\n" +#, fuzzy +#~ msgid "3915 Failed to label Volume: ERR=%s\n" +#~ msgstr "Не можливо встановити час файлу %s: ERR=%s\n" -#: src/dird/job.c:992 -#, c-format -msgid "Created database record for Pool \"%s\".\n" -msgstr "" - -#: src/dird/job.c:1066 src/dird/job.c:1102 -#, c-format -msgid "JobId %d already running. Duplicate job not allowed.\n" -msgstr "" - -#: src/dird/job.c:1092 -#, c-format -msgid "Cancelling duplicate JobId=%d.\n" -msgstr "" - -#: src/dird/job.c:1128 src/dird/job.c:1129 src/dird/job.c:1130 -msgid "Run NextPool override" -msgstr "" - -#: src/dird/job.c:1134 src/dird/job.c:1135 src/dird/job.c:1136 -#: src/dird/job.c:1557 -msgid "Job's NextPool resource" -msgstr "" - -#: src/dird/job.c:1144 src/dird/job.c:1145 src/dird/job.c:1561 -msgid "Job Pool's NextPool resource" -msgstr "" - -#: src/dird/job.c:1146 -msgid "Pool's NextPool resource" -msgstr "" - -#: src/dird/job.c:1177 -msgid "Run Pool override" -msgstr "" - -#: src/dird/job.c:1188 -msgid "Run FullPool override" -msgstr "" - -#: src/dird/job.c:1190 -msgid "Job FullPool override" -msgstr "" - -#: src/dird/job.c:1199 -msgid "Run IncPool override" -msgstr "" - -#: src/dird/job.c:1201 -msgid "Job IncPool override" -msgstr "" - -#: src/dird/job.c:1210 -msgid "Run DiffPool override" -msgstr "" - -#: src/dird/job.c:1212 -msgid "Job DiffPool override" -msgstr "" - -#: src/dird/job.c:1233 -#, fuzzy -msgid "No Client specified.\n" -msgstr "зазначений час сну" - -#: src/dird/job.c:1246 src/stored/bscan.c:1041 -#, c-format -msgid "Could not create Client record. ERR=%s\n" -msgstr "" - -#: src/dird/job.c:1283 -msgid "FileSet MD5 digest not found.\n" -msgstr "Не знайдено відбиток MD5 Набору Файлів.\n" - -#: src/dird/job.c:1288 -#, c-format -msgid "Could not create FileSet \"%s\" record. ERR=%s\n" -msgstr "" - -#: src/dird/job.c:1330 -#, c-format -msgid "Error updating job record. %s" -msgstr "" - -#: src/dird/job.c:1487 -msgid "Run pool override" -msgstr "" - -#: src/dird/job.c:1492 -msgid "Run storage override" -msgstr "" - -#: src/dird/job.c:1571 -msgid "Client resource" -msgstr "" - -#: src/dird/job.c:1627 src/dird/ua_run.c:429 -msgid "No storage specified.\n" -msgstr "" - -#: src/dird/job.c:1788 -#, c-format -msgid "Could not start clone job: \"%s\".\n" -msgstr "" - -#: src/dird/job.c:1791 -#, c-format -msgid "Clone JobId %d started.\n" -msgstr "" - -#: src/dird/jobq.c:63 -#, c-format -msgid "pthread_attr_init: ERR=%s\n" -msgstr "" - -#: src/dird/jobq.c:72 -#, c-format -msgid "pthread_mutex_init: ERR=%s\n" -msgstr "" - -#: src/dird/jobq.c:78 -#, c-format -msgid "pthread_cond_init: ERR=%s\n" -msgstr "" - -#: src/dird/jobq.c:120 -#, c-format -msgid "pthread_cond_broadcast: ERR=%s\n" -msgstr "" - -#: src/dird/jobq.c:128 -#, c-format -msgid "pthread_cond_wait: ERR=%s\n" -msgstr "" - -#: src/dird/jobq.c:169 -#, c-format -msgid "Job %s waiting %d seconds for scheduled start time.\n" -msgstr "" - -#: src/dird/jobq.c:231 -#, c-format -msgid "pthread_thread_create: ERR=%s\n" -msgstr "" - -#: src/dird/jobq.c:341 -#, c-format -msgid "pthread_cond_signal: ERR=%s\n" -msgstr "" - -#: src/dird/jobq.c:352 -#, c-format -msgid "pthread_create: ERR=%s\n" -msgstr "" - -#: src/dird/jobq.c:640 -#, c-format -msgid "Rescheduled Job %s at %s to re-run in %d seconds (%s).\n" -msgstr "" - -#: src/dird/jobq.c:704 src/dird/jobq.c:709 -msgid "previous Job" -msgstr "" - -#: src/dird/jobq.c:746 -#, c-format -msgid "" -"Job canceled. Attempt to read and write same device.\n" -" Read storage \"%s\" (From %s) -- Write storage \"%s\" (From %s)\n" -msgstr "" - -#: src/dird/mac.c:98 src/dird/vbackup.c:65 -msgid "Could not get or create a Pool record.\n" -msgstr "" - -#: src/dird/mac.c:113 src/dird/vbackup.c:242 -msgid "Could not get or create the FileSet record.\n" -msgstr "" - -#: src/dird/mac.c:131 src/dird/mac.c:145 -#, c-format -msgid "No previous Job found to %s.\n" -msgstr "" - -#: src/dird/mac.c:137 -msgid "Create bootstrap file failed.\n" -msgstr "" - -#: src/dird/mac.c:147 -#, c-format -msgid "Previous Job has no data to %s.\n" -msgstr "" - -#: src/dird/mac.c:164 -#, c-format -msgid "Job resource not found for \"%s\".\n" -msgstr "" - -#: src/dird/mac.c:168 -#, c-format -msgid "Previous Job resource not found for \"%s\".\n" -msgstr "" - -#: src/dird/mac.c:191 -msgid "setup job failed.\n" -msgstr "" - -#: src/dird/mac.c:247 -#, c-format -msgid "Pool for JobId %s not in database. ERR=%s\n" -msgstr "" - -#: src/dird/mac.c:255 -#, c-format -msgid "Pool resource \"%s\" not found.\n" -msgstr "" - -#: src/dird/mac.c:330 src/dird/mac_sql.c:422 -#, c-format -msgid "Could not get job record for JobId %s to %s. ERR=%s" -msgstr "" - -#: src/dird/mac.c:341 -#, c-format -msgid "JobId %s already %s probably by another Job. %s stopped.\n" -msgstr "" - -#: src/dird/mac.c:351 -#, c-format -msgid "Start %s JobId %s, Job=%s\n" -msgstr "" - -#: src/dird/mac.c:491 -msgid "The Storage daemon does not support SDCallsClient.\n" -msgstr "" - -#: src/dird/mac.c:605 -msgid "Could not start migration/copy job.\n" -msgstr "" - -#: src/dird/mac.c:607 -#, c-format -msgid "%s JobId %d started.\n" -msgstr "" - -#: src/dird/mac.c:757 -#, c-format -msgid "%s OK -- with warnings" -msgstr "" - -#: src/dird/mac.c:759 -#, c-format -msgid "%s OK" -msgstr "" - -#: src/dird/mac.c:764 -#, c-format -msgid "*** %s Error ***" -msgstr "" - -#: src/dird/mac.c:780 -#, c-format -msgid "%s Canceled" -msgstr "" - -#: src/dird/mac.c:795 -#, c-format -msgid "Inappropriate %s term code" -msgstr "" - -#: src/dird/mac.c:805 -#, c-format -msgid "%s -- no files to %s" -msgstr "" - -#: src/dird/mac.c:833 -#, c-format -msgid "" -"%s %s %s (%s):\n" -" Build OS: %s %s %s\n" -" Prev Backup JobId: %s\n" -" Prev Backup Job: %s\n" -" New Backup JobId: %s\n" -" Current JobId: %s\n" -" Current Job: %s\n" -" Backup Level: %s%s\n" -" Client: %s\n" -" FileSet: \"%s\" %s\n" -" Read Pool: \"%s\" (From %s)\n" -" Read Storage: \"%s\" (From %s)\n" -" Write Pool: \"%s\" (From %s)\n" -" Write Storage: \"%s\" (From %s)\n" -" Catalog: \"%s\" (From %s)\n" -" Start time: %s\n" -" End time: %s\n" -" Elapsed time: %s\n" -" Priority: %d\n" -" SD Files Written: %s\n" -" SD Bytes Written: %s (%sB)\n" -" Rate: %.1f KB/s\n" -" Volume name(s): %s\n" -" Volume Session Id: %d\n" -" Volume Session Time: %d\n" -" Last Volume Bytes: %s\n" -" SD Errors: %d\n" -" SD termination status: %s\n" -" Termination: %s\n" -"\n" -msgstr "" - -#: src/dird/mac.c:903 src/dird/mac.c:906 -#, c-format -msgid "No Next Pool specification found in Pool \"%s\".\n" -msgstr "" - -#: src/dird/mac.c:913 -#, c-format -msgid "No Storage specification found in Next Pool \"%s\".\n" -msgstr "" - -#: src/dird/mac_sql.c:236 -#, c-format -msgid "No %s SQL selection pattern specified.\n" -msgstr "" - -#: src/dird/mac_sql.c:243 src/dird/mac_sql.c:262 src/dird/mac_sql.c:283 -#: src/dird/mac_sql.c:319 src/dird/mac_sql.c:346 src/dird/mac_sql.c:465 -#: src/dird/mac_sql.c:594 src/dird/mac_sql.c:622 -#, c-format -msgid "SQL failed. ERR=%s\n" -msgstr "" - -#: src/dird/mac_sql.c:266 src/dird/mac_sql.c:273 src/dird/mac_sql.c:287 -#: src/dird/mac_sql.c:350 -#, c-format -msgid "No Volumes found to %s.\n" -msgstr "" - -#: src/dird/mac_sql.c:301 src/dird/mac_sql.c:390 src/dird/mac_sql.c:410 -msgid "Invalid JobId found.\n" -msgstr "" - -#: src/dird/mac_sql.c:361 -#, c-format -msgid "Unknown %s Selection Type.\n" -msgstr "" - -#: src/dird/mac_sql.c:372 src/dird/mac_sql.c:393 src/dird/mac_sql.c:413 -#, c-format -msgid "No JobIds found to %s.\n" -msgstr "" - -#: src/dird/mac_sql.c:376 -#, c-format -msgid "The following %u JobId%s chosen to be %s: %s\n" -msgstr "" - -#: src/dird/mac_sql.c:377 -msgid " was" -msgstr "" - -#: src/dird/mac_sql.c:377 -msgid "s were" -msgstr "" - -#: src/dird/mac_sql.c:429 -#, c-format -msgid "%s using JobId=%s Job=%s\n" -msgstr "" - -#: src/dird/mac_sql.c:469 src/dird/mac_sql.c:599 -#, c-format -msgid "No %ss found to %s.\n" -msgstr "" - -#: src/dird/mac_sql.c:491 -msgid "Selection Type 'pooluncopiedjobs' only applies to Copy Jobs" -msgstr "" - -#: src/dird/mac_sql.c:500 -#, c-format -msgid "SQL to get uncopied jobs failed. ERR=%s\n" -msgstr "" - -#: src/dird/mac_sql.c:523 -#, c-format -msgid "No %s %s selection pattern specified.\n" -msgstr "" - -#: src/dird/mac_sql.c:534 -#, c-format -msgid "SQL to get %s failed. ERR=%s\n" -msgstr "" - -#: src/dird/mac_sql.c:539 -#, c-format -msgid "Query of Pool \"%s\" returned no Jobs to %s.\n" -msgstr "" - -#: src/dird/mac_sql.c:577 -#, c-format -msgid "Regex pattern matched no Jobs to %s.\n" -msgstr "" - -#: src/dird/mac_sql.c:626 -#, c-format -msgid "No %s found to %s.\n" -msgstr "" - -#: src/dird/mac_sql.c:630 -#, c-format -msgid "SQL error. Expected 1 MediaId got %d\n" -msgstr "" - -#: src/dird/msgchan.c:67 -#, c-format -msgid "Connecting to Storage daemon %s at %s:%d ...\n" -msgstr "" - -#: src/dird/msgchan.c:122 src/filed/job.c:1990 -#: src/qt-console/tray-monitor/tray-monitor.cpp:376 src/stored/dircmd.c:367 -msgid "Storage daemon" -msgstr "Зберігач" - -#: src/dird/msgchan.c:235 -#, c-format -msgid "Storage daemon rejected Job command: %s\n" -msgstr "" - -#: src/dird/msgchan.c:243 -#, c-format -msgid "fixed name. Max=%d: " -msgstr "" - -#: src/dird/ua_cmds.c:341 -#, c-format -msgid "The number must be between 0 and %d\n" -msgstr "" - -#: src/dird/ua_cmds.c:349 -msgid "Enter Volume name: " -msgstr "" - -#: src/dird/ua_cmds.c:353 -msgid "Enter base volume name: " -msgstr "" - -#: src/dird/ua_cmds.c:362 src/dird/ua_label.c:652 -msgid "Volume name too long.\n" -msgstr "" - -#: src/dird/ua_cmds.c:366 src/dird/ua_label.c:658 src/lib/edit.c:514 -msgid "Volume name must be at least one character long.\n" -msgstr "" - -#: src/dird/ua_cmds.c:377 -msgid "Enter the starting number: " -msgstr "" - -#: src/dird/ua_cmds.c:382 -msgid "Start number must be greater than zero.\n" -msgstr "" - -#: src/dird/ua_cmds.c:393 -msgid "Enter slot (0 for none): " -msgstr "" - -#: src/dird/ua_cmds.c:397 -msgid "InChanger? yes/no: " -msgstr "" - -#: src/dird/ua_cmds.c:425 -#, c-format -msgid "%d Volumes created in pool %s\n" -msgstr "" - -#: src/dird/ua_cmds.c:441 src/dird/ua_cmds.c:1241 -msgid "Turn on or off? " -msgstr "" - -#: src/dird/ua_cmds.c:569 -#, c-format -msgid "" -"Can't set %s RecyclePool to %s, %s is not in database.\n" -"Try to update it with 'update pool=%s'\n" -msgstr "" - -#: src/dird/ua_cmds.c:587 -#, c-format -msgid "" -"Can't set %s ScratchPool to %s, %s is not in database.\n" -"Try to update it with 'update pool=%s'\n" -msgstr "" - -#: src/dird/ua_cmds.c:654 -#, c-format -msgid "" -"Error: Pool %s already exists.\n" -"Use update to change it.\n" -msgstr "" - -#: src/dird/ua_cmds.c:665 -#, c-format -msgid "Pool %s created.\n" -msgstr "" - -#: src/dird/ua_cmds.c:696 -msgid "Failed to set bandwidth limit to Client.\n" -msgstr "" - -#: src/dird/ua_cmds.c:700 -#, c-format -msgid "2000 OK Limiting bandwidth to %lldkb/s %s\n" -msgstr "" - -#: src/dird/ua_cmds.c:701 -msgid "on running and future jobs" -msgstr "" - -#: src/dird/ua_cmds.c:725 -msgid "Set Bandwidth choice:\n" -msgstr "" - -#: src/dird/ua_cmds.c:726 -msgid "Running Job" -msgstr "" - -#: src/dird/ua_cmds.c:727 -msgid "Running and future Jobs for a Client" -msgstr "" - -#: src/dird/ua_cmds.c:728 -msgid "Choose where to limit the bandwidth" -msgstr "" - -#: src/dird/ua_cmds.c:740 -msgid "Enter new bandwidth limit kb/s: " -msgstr "" - -#: src/dird/ua_cmds.c:777 src/dird/ua_cmds.c:840 src/dird/ua_cmds.c:862 -#: src/dird/ua_cmds.c:884 -msgid "Unauthorized command from this console.\n" -msgstr "" - -#: src/dird/ua_cmds.c:784 src/dird/ua_cmds.c:1292 src/dird/ua_dotcmds.c:201 -#: src/dird/ua_run.c:343 -#, c-format -msgid "Client \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_cmds.c:794 -#, c-format -msgid "Client \"%s\" address set to %s\n" -msgstr "" - -#: src/dird/ua_cmds.c:813 -#, c-format -msgid "Job Attributes Insertion %sabled\n" -msgstr "" - -#: src/dird/ua_cmds.c:844 -#, c-format -msgid "Job \"%s\" %sabled\n" -msgstr "" - -#: src/dird/ua_cmds.c:866 -#, fuzzy, c-format -msgid "Client \"%s\" %sabled\n" -msgstr "Помилка команди" - -#: src/dird/ua_cmds.c:888 -#, c-format -msgid "Schedule \"%s\" %sabled\n" -msgstr "" - -#: src/dird/ua_cmds.c:897 -msgid "" -"You must enter one of the following keywords: job, client, schedule, or " -"storage.\n" -msgstr "" - -#: src/dird/ua_cmds.c:926 src/dird/ua_dotcmds.c:1086 src/dird/ua_status.c:411 -#, c-format -msgid "Connecting to Storage daemon %s at %s:%d\n" -msgstr "" - -#: src/dird/ua_cmds.c:932 src/dird/ua_dotcmds.c:1092 -msgid "Connected to storage daemon\n" -msgstr "" - -#: src/dird/ua_cmds.c:1103 -msgid "Enter new debug level: " -msgstr "" - -#: src/dird/ua_cmds.c:1116 -#, c-format -msgid "Incorrect tags found on command line %s\n" -msgstr "" - -#: src/dird/ua_cmds.c:1199 src/dird/ua_dotcmds.c:1194 -msgid "Available daemons are: \n" -msgstr "" - -#: src/dird/ua_cmds.c:1200 src/dird/ua_dotcmds.c:1195 -msgid "Director" -msgstr "" - -#: src/dird/ua_cmds.c:1201 src/dird/ua_dotcmds.c:1196 src/dird/ua_run.c:1012 -#: src/dird/ua_select.c:189 -msgid "Storage" -msgstr "" - -#: src/dird/ua_cmds.c:1202 src/dird/ua_dotcmds.c:1197 src/dird/ua_run.c:1018 -#: src/dird/ua_select.c:383 src/dird/ua_select.c:407 src/dird/ua_select.c:544 -msgid "Client" -msgstr "" - -#: src/dird/ua_cmds.c:1203 -msgid "All" -msgstr "" - -#: src/dird/ua_cmds.c:1204 -msgid "Select daemon type to set debug level" -msgstr "" - -#: src/dird/ua_cmds.c:1296 src/dird/ua_cmds.c:2119 src/dird/ua_dotcmds.c:205 -#: src/dird/ua_status.c:462 -#, c-format -msgid "No authorization for Client \"%s\"\n" -msgstr "" - -#: src/dird/ua_cmds.c:1301 src/dird/ua_dotcmds.c:210 -msgid "Client name missing.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1309 src/dird/ua_select.c:1471 src/dird/ua_select.c:1478 -#, c-format -msgid "Job \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1313 src/dird/ua_cmds.c:1380 src/dird/ua_cmds.c:2141 -#, c-format -msgid "No authorization for Job \"%s\"\n" -msgstr "" - -#: src/dird/ua_cmds.c:1318 -msgid "Job name missing.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1327 -#, c-format -msgid "Fileset \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1331 -#, c-format -msgid "No authorization for FileSet \"%s\"\n" -msgstr "" - -#: src/dird/ua_cmds.c:1336 -msgid "Fileset name missing.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1347 src/dird/ua_run.c:1402 -#, c-format -msgid "Level \"%s\" not valid.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1351 -msgid "Level value missing.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1358 -msgid "Invalid value for accurate. It must be yes or no.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1363 -msgid "Accurate value missing.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1376 -msgid "No job specified.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1436 -msgid "Error sending include list.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1441 -msgid "Error sending exclude list.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1535 -msgid "" -"In general it is not a good idea to delete either a\n" -"Pool or a Volume since they may contain data.\n" -"\n" -msgstr "" - -#: src/dird/ua_cmds.c:1538 -msgid "Choose catalog item to delete" -msgstr "" - -#: src/dird/ua_cmds.c:1552 -msgid "Nothing done.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1580 -#, c-format -msgid "Are you sure you want to delete %d JobIds ? (yes/no): " -msgstr "" - -#: src/dird/ua_cmds.c:1590 -msgid "Enter JobId to delete: " -msgstr "" - -#: src/dird/ua_cmds.c:1608 -#, c-format -msgid "Jobid %s and associated records deleted from the catalog.\n" -msgstr "" - -#: src/dird/ua_cmds.c:1623 -#, c-format -msgid "" -"\n" -"This command will delete volume %s\n" -"and all Jobs saved on that volume from the Catalog\n" -msgstr "" - -#: src/dird/ua_cmds.c:1630 -#, c-format -msgid "Are you sure you want to delete Volume \"%s\"? (yes/no): " -msgstr "" - -#: src/dird/ua_cmds.c:1643 -msgid "Can't list jobs on this volume\n" -msgstr "" - -#: src/dird/ua_cmds.c:1668 -#, c-format -msgid "Are you sure you want to delete Pool \"%s\"? (yes/no): " -msgstr "" - -#: src/dird/ua_cmds.c:1714 -#, c-format -msgid "Invalid device name. %s" -msgstr "" - -#: src/dird/ua_cmds.c:1791 -#, c-format -msgid "Using Catalog name=%s DB=%s\n" -msgstr "" - -#: src/dird/ua_cmds.c:1859 -msgid "ERR: Can't open db\n" -msgstr "" - -#: src/dird/ua_cmds.c:1906 -msgid "Wait on mount timed out\n" -msgstr "" - -#: src/dird/ua_cmds.c:1916 -msgid "ERR: Job was not found\n" -msgstr "" - -#: src/dird/ua_cmds.c:1992 -msgid "" -" Command Description\n" -" ======= ===========\n" -msgstr "" - -#: src/dird/ua_cmds.c:1996 -#, c-format -msgid "" -" %-13s %s\n" -"\n" -"Arguments:\n" -"\t%s\n" -msgstr "" - -#: src/dird/ua_cmds.c:2001 -#, c-format -msgid " %-13s %s\n" -msgstr "" - -#: src/dird/ua_cmds.c:2005 -#, fuzzy, c-format -msgid "" -"\n" -"Can't find %s command.\n" -"\n" -msgstr ": неправильна команда\n" - -#: src/dird/ua_cmds.c:2007 -msgid "" -"\n" -"When at a prompt, entering a period cancels the command.\n" -"\n" -msgstr "" - -#: src/dird/ua_cmds.c:2043 -#, c-format -msgid "%s Version: %s (%s) %s %s %s %s\n" -msgstr "" - -#: src/dird/ua_cmds.c:2102 src/dird/ua_cmds.c:2129 src/dird/ua_cmds.c:2151 -#, c-format -msgid "No authorization for Catalog \"%s\"\n" -msgstr "" - -#: src/dird/ua_cmds.c:2187 src/dird/ua_select.c:242 -msgid "Could not find a Catalog resource\n" -msgstr "" - -#: src/dird/ua_cmds.c:2208 -#, c-format -msgid "Could not open catalog database \"%s\".\n" -msgstr "" - -#: src/dird/ua_cmds.c:2227 -#, c-format -msgid "Using Catalog \"%s\"\n" -msgstr "" - -#: src/dird/ua_dde.c:62 src/dird/ua_dotcmds.c:1594 -#, c-format -msgid "List Media failed: ERR=%s\n" -msgstr "" - -#: src/dird/ua_dde.c:110 -#, fuzzy -msgid "Command line" -msgstr "Не зрозумілий параметр командного рядка" - -#: src/dird/ua_dde.c:211 -#, c-format -msgid "Invalid keyword found: %s\n" -msgstr "" - -#: src/dird/ua_dde.c:216 -msgid "Dedup Engine choice: \n" -msgstr "" - -#: src/dird/ua_dde.c:217 -msgid "Vacuum data files" -msgstr "" - -#: src/dird/ua_dde.c:218 -msgid "Cancel running vacuum" -msgstr "" - -#: src/dird/ua_dde.c:219 -msgid "Display data files usage" -msgstr "" - -#: src/dird/ua_dde.c:223 -msgid "Select action to perform on Dedup Engine" -msgstr "" - -#: src/dird/ua_dotcmds.c:180 -msgid ": is an invalid command.\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:219 -msgid "path name missing.\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:238 -msgid "Failed to send command to Client.\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:894 -#, fuzzy, c-format -msgid "Unable to get Job record for Job=%s\n" -msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" - -#: src/dird/ua_dotcmds.c:909 -#, fuzzy, c-format -msgid "Unable to get last Job record for Job=%s\n" -msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" - -#: src/dird/ua_dotcmds.c:925 -#, fuzzy, c-format -msgid "Unable to get Client record for Client=%s\n" -msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" - -#: src/dird/ua_dotcmds.c:941 -#, fuzzy, c-format -msgid "Unable to get last Job record for Client=%s\n" -msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" - -#: src/dird/ua_dotcmds.c:952 src/dird/ua_restore.c:960 -#: src/dird/ua_restore.c:1003 src/dird/vbackup.c:142 -#, c-format -msgid "Unable to get Job record for JobId=%s: ERR=%s\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1156 src/dird/ua_dotcmds.c:1250 -#, c-format -msgid "Unknown command: %s\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1198 -msgid "Select daemon type to make die" -msgstr "" - -#: src/dird/ua_dotcmds.c:1224 -msgid "The Director will generate a deadlock.\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1228 -msgid "The Director will segment fault.\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1509 -msgid "Access to specified Client or FileSet not allowed.\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1514 src/dird/ua_dotcmds.c:1558 -#: src/dird/ua_restore.c:1121 src/dird/ua_restore.c:1149 -#: src/dird/ua_restore.c:1170 -#, c-format -msgid "Query failed: %s. ERR=%s\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1553 -msgid "query keyword not found.\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1580 -#, c-format -msgid "List MediaType failed: ERR=%s\n" -msgstr "" - -#: src/dird/ua_dotcmds.c:1608 -#, fuzzy, c-format -msgid "List Location failed: ERR=%s\n" -msgstr "Невдале встановлення з'єднання TLS\n" - -#: src/dird/ua_input.c:114 -msgid "Enter slot" -msgstr "" - -#: src/dird/ua_input.c:118 src/dird/ua_input.c:124 -#, c-format -msgid "Expected a positive integer, got: %s\n" -msgstr "" - -#: src/dird/ua_input.c:181 -msgid "Invalid response. You must answer yes or no.\n" -msgstr "" - -#: src/dird/ua_input.c:204 -msgid "Invalid Enabled value, it must be yes, no, archived, 0, 1, or 2\n" -msgstr "" - -#: src/dird/ua_input.c:231 -#, fuzzy, c-format -msgid "Illegal character \"%c\" in a comment.\n" -msgstr "Заборонені символи у назві Тому \"%s\"\n" - -#: src/dird/ua_input.c:238 -msgid "Comment too long.\n" -msgstr "" - -#: src/dird/ua_input.c:244 -msgid "Comment must be at least one character long.\n" -msgstr "" - -#: src/dird/ua_label.c:93 -msgid "Negative numbers not permitted\n" -msgstr "" - -#: src/dird/ua_label.c:99 src/lib/sellist.c:65 -msgid "Range end is not integer.\n" -msgstr "" - -#: src/dird/ua_label.c:104 src/lib/sellist.c:70 -msgid "Range start is not an integer.\n" -msgstr "" - -#: src/dird/ua_label.c:110 src/lib/sellist.c:77 -msgid "Range end not bigger than start.\n" -msgstr "" - -#: src/dird/ua_label.c:116 src/lib/sellist.c:95 -msgid "Input value is not an integer.\n" -msgstr "" - -#: src/dird/ua_label.c:122 -msgid "Values must be be greater than zero.\n" -msgstr "" - -#: src/dird/ua_label.c:126 -msgid "Slot too large.\n" -msgstr "" - -#: src/dird/ua_label.c:178 src/dird/ua_label.c:356 src/dird/ua_label.c:1191 -#: src/dird/ua_run.c:417 -msgid "command line" -msgstr "" - -#: src/dird/ua_label.c:196 src/dird/ua_label.c:520 src/dird/ua_label.c:1198 -msgid "No slots in changer to scan.\n" -msgstr "" - -#: src/dird/ua_label.c:208 src/dird/ua_label.c:531 -msgid "No Volumes found to label, or no barcodes.\n" -msgstr "" - -#: src/dird/ua_label.c:218 src/dird/ua_label.c:1219 -#, c-format -msgid "Slot %d greater than max %d ignored.\n" -msgstr "" - -#: src/dird/ua_label.c:256 -#, c-format -msgid "No VolName for Slot=%d InChanger set to zero.\n" -msgstr "" - -#: src/dird/ua_label.c:277 -#, c-format -msgid "Catalog record for Volume \"%s\" updated to reference slot %d.\n" -msgstr "" - -#: src/dird/ua_label.c:281 -#, c-format -msgid "Catalog record for Volume \"%s\" is up to date.\n" -msgstr "" - -#: src/dird/ua_label.c:287 -#, c-format -msgid "Volume \"%s\" not found in catalog. Slot=%d InChanger set to zero.\n" -msgstr "" - -#: src/dird/ua_label.c:385 -#, c-format -msgid "" -"Volume \"%s\" has VolStatus %s. It must be Purged or Recycled before " -"relabeling.\n" -msgstr "" - -#: src/dird/ua_label.c:401 -msgid "Enter new Volume name: " -msgstr "" - -#: src/dird/ua_label.c:414 -#, c-format -msgid "Media record for new Volume \"%s\" already exists.\n" -msgstr "" - -#: src/dird/ua_label.c:432 -msgid "Enter slot (0 or Enter for none): " -msgstr "" - -#: src/dird/ua_label.c:460 -#, c-format -msgid "Delete of Volume \"%s\" failed. ERR=%s" -msgstr "" - -#: src/dird/ua_label.c:463 -#, c-format -msgid "Old volume \"%s\" deleted from catalog.\n" -msgstr "" - -#: src/dird/ua_label.c:474 -#, c-format -msgid "Requesting to mount %s ...\n" -msgstr "" - -#: src/dird/ua_label.c:496 -msgid "Do not forget to mount the drive!!!\n" -msgstr "" - -#: src/dird/ua_label.c:536 -msgid "" -"The following Volumes will be labeled:\n" -"Slot Volume\n" -"==============\n" -msgstr "" - -#: src/dird/ua_label.c:545 -msgid "Do you want to label these Volumes? (yes|no): " -msgstr "" - -#: src/dird/ua_label.c:565 -#, c-format -msgid "Media record for Slot %d Volume \"%s\" already exists.\n" -msgstr "" - -#: src/dird/ua_label.c:571 -#, c-format -msgid "Error setting InChanger: ERR=%s" -msgstr "" - -#: src/dird/ua_label.c:594 -#, c-format -msgid "Maximum pool Volumes=%d reached.\n" -msgstr "" - -#: src/dird/ua_label.c:602 -#, c-format -msgid "Catalog record for cleaning tape \"%s\" successfully created.\n" -msgstr "" - -#: src/dird/ua_label.c:609 -#, c-format -msgid "Catalog error on cleaning tape: %s" -msgstr "" - -#: src/dird/ua_label.c:645 -#, c-format -msgid "Illegal character \"%c\" in a volume name.\n" -msgstr "" - -#: src/dird/ua_label.c:693 -#, c-format -msgid "Sending relabel command from \"%s\" to \"%s\" ...\n" -msgstr "" - -#: src/dird/ua_label.c:700 -#, c-format -msgid "Sending label command for Volume \"%s\" Slot %d ...\n" -msgstr "" - -#: src/dird/ua_label.c:738 -#, c-format -msgid "Catalog record for Volume \"%s\", Slot %d successfully created.\n" -msgstr "" - -#: src/dird/ua_label.c:751 -#, c-format -msgid "Label command failed for Volume %s.\n" -msgstr "" - -#: src/dird/ua_label.c:765 -msgid "Could not open SD socket.\n" -msgstr "" - -#: src/dird/ua_label.c:837 src/dird/ua_label.c:847 -#, c-format -msgid "Invalid Slot number: %s\n" -msgstr "" - -#: src/dird/ua_label.c:856 -#, c-format -msgid "Invalid Volume name: %s. Volume skipped.\n" -msgstr "" - -#: src/dird/ua_label.c:950 -#, c-format -msgid "Device \"%s\" has %d slots.\n" -msgstr "" - -#: src/dird/ua_label.c:996 -#, c-format -msgid "Pool \"%s\" resource not found for volume \"%s\"!\n" -msgstr "" - -#: src/dird/ua_label.c:1210 -msgid "No Volumes found, or no barcodes.\n" -msgstr "" - -#: src/dird/ua_label.c:1213 -msgid "" -" Slot | Volume Name | Status | Media Type | " -"Pool |\n" -msgstr "" - -#: src/dird/ua_label.c:1214 -msgid "" -"------+------------------+-----------+----------------------" -"+--------------------|\n" -msgstr "" - -#: src/dird/ua_output.c:56 src/dird/ua_output.c:80 -msgid "ON or OFF keyword missing.\n" -msgstr "" - -#: src/dird/ua_output.c:100 -msgid "Disabled Jobs:\n" -msgstr "" - -#: src/dird/ua_output.c:106 -msgid "No disabled Jobs.\n" -msgstr "" - -#: src/dird/ua_output.c:208 -msgid "Keywords for the show command are:\n" -msgstr "" - -#: src/dird/ua_output.c:215 -#, c-format -msgid "%s resource %s not found.\n" -msgstr "" - -#: src/dird/ua_output.c:219 -#, c-format -msgid "Resource %s not found\n" -msgstr "" - -#: src/dird/ua_output.c:360 -msgid "Hey! DB is NULL\n" -msgstr "" - -#: src/dird/ua_output.c:522 -msgid "Invalid jobid argument\n" -msgstr "" - -#: src/dird/ua_output.c:546 -#, fuzzy, c-format -msgid "Unknown ObjectType %s\n" -msgstr "Невідомий тип ресурсу %d\n" - -#: src/dird/ua_output.c:556 -msgid "list pluginrestoreconf requires jobid argument\n" -msgstr "" - -#: src/dird/ua_output.c:594 -#, c-format -msgid "Jobid %d used %d Volume(s): %s\n" -msgstr "" - -#: src/dird/ua_output.c:613 -msgid "No Pool specified.\n" -msgstr "" - -#: src/dird/ua_output.c:624 src/dird/ua_select.c:612 src/dird/ua_update.c:435 -#, c-format -msgid "Error obtaining pool ids. ERR=%s\n" -msgstr "" - -#: src/dird/ua_output.c:634 -#, c-format -msgid "Pool: %s\n" -msgstr "" - -#: src/dird/ua_output.c:650 -msgid "Ignoring invalid value for days. Max is 50.\n" -msgstr "" - -#: src/dird/ua_output.c:679 -#, c-format -msgid "Unknown list keyword: %s\n" -msgstr "" - -#: src/dird/ua_output.c:704 -#, c-format -msgid "%s is not a job name.\n" -msgstr "" - -#: src/dird/ua_output.c:718 -#, c-format -msgid "Could not find Pool for Job %s\n" -msgstr "" - -#: src/dird/ua_output.c:731 -#, c-format -msgid "Could not find next Volume for Job %s (Pool=%s, Level=%s).\n" -msgstr "" - -#: src/dird/ua_output.c:735 -#, c-format -msgid "" -"The next Volume to be used by Job \"%s\" (Pool=%s, Level=%s) will be %s\n" -msgstr "" - -#: src/dird/ua_output.c:746 -#, c-format -msgid "Could not find next Volume for Job %s.\n" -msgstr "" - -#: src/dird/ua_output.c:892 -#, c-format -msgid "Pool %s not in database. %s" -msgstr "" - -#: src/dird/ua_output.c:900 -#, c-format -msgid "Pool %s created in database.\n" -msgstr "" - -#: src/dird/ua_output.c:956 -msgid "You have no messages.\n" -msgstr "" - -#: src/dird/ua_output.c:1036 -msgid "Message too long to display.\n" -msgstr "" - -#: src/dird/ua_prune.c:118 -msgid "Choose item to prune" -msgstr "" - -#: src/dird/ua_prune.c:174 -#, c-format -msgid "Cannot prune Volume \"%s\" because it is archived.\n" -msgstr "" - -#: src/dird/ua_prune.c:219 -msgid "Pruned Jobs from JobHisto catalog.\n" -msgstr "" - -#: src/dird/ua_prune.c:307 -#, fuzzy -msgid "Begin pruning Files.\n" -msgstr "Починається чистка файлів Клієнта \"%s\"\n" - -#: src/dird/ua_prune.c:322 -msgid "No Files found to prune.\n" -msgstr "" - -#: src/dird/ua_prune.c:345 -#, c-format -msgid "Pruned Files from %s Jobs for client %s from catalog.\n" -msgstr "" - -#: src/dird/ua_prune.c:491 -#, fuzzy, c-format -msgid "Begin pruning Jobs older than %s.\n" -msgstr "Починається чистка файлів Клієнта \"%s\"\n" - -#: src/dird/ua_prune.c:602 -#, c-format -msgid "Pruned %d %s for client %s from catalog.\n" -msgstr "" - -#: src/dird/ua_prune.c:603 -msgid "Jobs" -msgstr "" - -#: src/dird/ua_prune.c:605 -msgid "No Jobs found to prune.\n" -msgstr "" - -#: src/dird/ua_prune.c:666 -msgid "Expecting limit argument as integer\n" -msgstr "" - -#: src/dird/ua_prune.c:679 -#, c-format -msgid "Volume \"%s\"" -msgstr "" - -#: src/dird/ua_purge.c:85 -#, fuzzy -msgid "" -"\n" -"This command can be DANGEROUS!!!\n" -"\n" -"It purges (deletes) all Files from a Job,\n" -"JobId, Client or Volume; or it purges (deletes)\n" -"all Jobs from a Client or Volume without regard\n" -"to retention periods. Normally you should use the\n" -"PRUNE command, which respects retention periods.\n" -msgstr "" -"\n" -"Ця команда НЕБЕЗПЕЧНА!!!\n" -"\n" -"Вона вичистить(знищить) усі Файли із Задачі,\n" -"Номера Задачі, Клієнта або Тома; або вичистить(знищить)\n" -"усі Задачі із Клієнта або Тома не враховуючи\n" -"термінів зберігання. Зазвичай ви повинні використовувати\n" -"команду PRUNE для дотримання термінів зберігання.\n" - -#: src/dird/ua_purge.c:153 -msgid "Choose item to purge" -msgstr "Оберіть те, що Ви хочете вичистити" - -#: src/dird/ua_purge.c:200 -#, c-format -msgid "Begin purging files for Client \"%s\"\n" -msgstr "Починається чистка файлів Клієнта \"%s\"\n" - -#: src/dird/ua_purge.c:209 src/dird/ua_purge.c:259 -#, c-format -msgid "No Files found for client %s to purge from %s catalog.\n" -msgstr "" - -#: src/dird/ua_purge.c:212 -#, c-format -msgid "Files for %d Jobs for client \"%s\" purged from %s catalog.\n" -msgstr "" - -#: src/dird/ua_purge.c:250 -#, c-format -msgid "Begin purging jobs from Client \"%s\"\n" -msgstr "" - -#: src/dird/ua_purge.c:262 -#, c-format -msgid "%d Jobs for client %s purged from %s catalog.\n" -msgstr "" - -#: src/dird/ua_purge.c:466 -#, c-format -msgid "" -"\n" -"Volume \"%s\" has VolStatus \"%s\" and cannot be purged.\n" -"The VolStatus must be: Append, Full, Used, or Error to be purged.\n" -msgstr "" - -#: src/dird/ua_purge.c:494 -#, c-format -msgid "%d File%s on Volume \"%s\" purged from catalog.\n" -msgstr "" - -#: src/dird/ua_purge.c:544 -#, c-format -msgid "" -"There are no more Jobs associated with Volume \"%s\". Marking it purged.\n" -msgstr "" - -#: src/dird/ua_purge.c:617 -#, fuzzy -msgid "Can't update volume size in the catalog\n" -msgstr "У картотеці створено новий Том \"%s\".\n" - -#: src/dird/ua_purge.c:619 -#, c-format -msgid "The volume \"%s\" has been truncated\n" -msgstr "" - -#: src/dird/ua_purge.c:621 -#, c-format -msgid "Unable to truncate volume \"%s\"\n" -msgstr "" - -#: src/dird/ua_purge.c:714 -msgid "No Volumes found to perform \"truncate\" command.\n" -msgstr "" - -#: src/dird/ua_purge.c:781 -#, c-format -msgid "Unable move recycled Volume in full Pool \"%s\" MaxVols=%d\n" -msgstr "" - -#: src/dird/ua_purge.c:795 -#, c-format -msgid "All records pruned from Volume \"%s\"; marking it \"Purged\"\n" -msgstr "" - -#: src/dird/ua_purge.c:800 -#, c-format -msgid "Cannot purge Volume with VolStatus=%s\n" -msgstr "" - -#: src/dird/ua_query.c:62 src/findlib/create_file.c:283 -#: src/findlib/create_file.c:385 -#, c-format -msgid "Could not open %s: ERR=%s\n" -msgstr "Не вдалось відкрити%s: ERR=%s\n" - -#: src/dird/ua_query.c:67 -msgid "Available queries:\n" -msgstr "" - -#: src/dird/ua_query.c:74 -msgid "Choose a query" -msgstr "" - -#: src/dird/ua_query.c:88 -msgid "Could not find query.\n" -msgstr "" - -#: src/dird/ua_query.c:106 -msgid "Too many prompts in query, max is 9.\n" -msgstr "" - -#: src/dird/ua_query.c:209 -#, c-format -msgid "Warning prompt %d missing.\n" -msgstr "" - -#: src/dird/ua_query.c:254 -msgid "" -"Entering SQL query mode.\n" -"Terminate each query with a semicolon.\n" -"Terminate query mode with a blank line.\n" -msgstr "" - -#: src/dird/ua_query.c:257 src/dird/ua_query.c:273 -msgid "Enter SQL query: " -msgstr "" - -#: src/dird/ua_query.c:275 -msgid "Add to SQL query: " -msgstr "" - -#: src/dird/ua_query.c:278 -msgid "End query mode.\n" -msgstr "" - -#: src/dird/ua_restore.c:295 -msgid "\"RegexWhere\" specification not authorized.\n" -msgstr "" - -#: src/dird/ua_restore.c:302 -msgid "\"where\" specification not authorized.\n" -msgstr "" - -#: src/dird/ua_restore.c:320 -msgid "" -"No Restore Job Resource found in bacula-dir.conf.\n" -"You must create at least one before running this command.\n" -msgstr "" - -#: src/dird/ua_restore.c:337 -msgid "Restore not done.\n" -msgstr "" - -#: src/dird/ua_restore.c:348 -msgid "Unable to construct a valid BSR. Cannot continue.\n" -msgstr "" - -#: src/dird/ua_restore.c:352 src/dird/ua_restore.c:366 -msgid "No files selected to be restored.\n" -msgstr "" - -#: src/dird/ua_restore.c:356 -#, c-format -msgid "Bootstrap records written to %s\n" -msgstr "" - -#: src/dird/ua_restore.c:360 -msgid "" -"\n" -"1 file selected to be restored.\n" -"\n" -msgstr "" - -#: src/dird/ua_restore.c:362 -#, c-format -msgid "" -"\n" -"%s files selected to be restored.\n" -"\n" -msgstr "" - -#: src/dird/ua_restore.c:381 -msgid "No Client resource found!\n" -msgstr "" - -#: src/dird/ua_restore.c:499 -msgid "The restore will use the following job(s) as Base\n" -msgstr "" - -#: src/dird/ua_restore.c:532 -#, c-format -msgid "Missing value for keyword: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:612 -msgid "List last 20 Jobs run" -msgstr "" - -#: src/dird/ua_restore.c:613 -msgid "List Jobs where a given File is saved" -msgstr "" - -#: src/dird/ua_restore.c:614 -msgid "Enter list of comma separated JobIds to select" -msgstr "" - -#: src/dird/ua_restore.c:615 -msgid "Enter SQL list command" -msgstr "" - -#: src/dird/ua_restore.c:616 -msgid "Select the most recent backup for a client" -msgstr "" - -#: src/dird/ua_restore.c:617 -msgid "Select backup for a client before a specified time" -msgstr "" - -#: src/dird/ua_restore.c:618 -msgid "Enter a list of files to restore" -msgstr "" - -#: src/dird/ua_restore.c:619 -msgid "Enter a list of files to restore before a specified time" -msgstr "" - -#: src/dird/ua_restore.c:620 -msgid "Find the JobIds of the most recent backup for a client" -msgstr "" - -#: src/dird/ua_restore.c:621 -msgid "Find the JobIds for a backup for a client before a specified time" -msgstr "" - -#: src/dird/ua_restore.c:622 -msgid "Enter a list of directories to restore for found JobIds" -msgstr "" - -#: src/dird/ua_restore.c:623 -msgid "Select full restore to a specified Job date" -msgstr "" - -#: src/dird/ua_restore.c:624 src/dird/ua_status.c:1213 src/lib/status.h:120 -msgid "Cancel" -msgstr "" - -#: src/dird/ua_restore.c:671 -#, c-format -msgid "Unknown keyword: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:700 src/dird/ua_update.c:947 -#, c-format -msgid "Improper date format: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:735 src/dird/ua_select.c:770 -#, c-format -msgid "Error: Pool resource \"%s\" does not exist.\n" -msgstr "" - -#: src/dird/ua_restore.c:740 -#, c-format -msgid "Error: Pool resource \"%s\" access not allowed.\n" -msgstr "" - -#: src/dird/ua_restore.c:756 -msgid "" -"\n" -"First you select one or more JobIds that contain files\n" -"to be restored. You will be presented several methods\n" -"of specifying the JobIds. Then you will be allowed to\n" -"select which files from those JobIds are to be restored.\n" -"\n" -msgstr "" - -#: src/dird/ua_restore.c:769 -msgid "To select the JobIds, you have the following choices:\n" -msgstr "" - -#: src/dird/ua_restore.c:774 -msgid "Select item: " -msgstr "" - -#: src/dird/ua_restore.c:779 src/dird/ua_restore.c:814 -msgid "SQL query not authorized.\n" -msgstr "" - -#: src/dird/ua_restore.c:792 -msgid "Enter Filename (no path):" -msgstr "" - -#: src/dird/ua_restore.c:807 src/dird/ua_restore.c:915 -msgid "Enter JobId(s), comma separated, to restore: " -msgstr "" - -#: src/dird/ua_restore.c:817 -msgid "Enter SQL list command: " -msgstr "" - -#: src/dird/ua_restore.c:851 src/dird/ua_restore.c:874 -msgid "" -"Enter file names with paths, or < to enter a filename\n" -"containing a list of file names with paths, and terminate\n" -"them with a blank line.\n" -msgstr "" - -#: src/dird/ua_restore.c:855 src/dird/ua_restore.c:878 -msgid "Enter full filename: " -msgstr "" - -#: src/dird/ua_restore.c:913 -#, c-format -msgid "You have already selected the following JobIds: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:931 -msgid "" -"Enter full directory names or start the name\n" -"with a < to indicate it is a filename containing a list\n" -"of directories and terminate them with a blank line.\n" -msgstr "" - -#: src/dird/ua_restore.c:935 -msgid "Enter directory name: " -msgstr "" - -#: src/dird/ua_restore.c:951 -msgid "Enter JobId to get the state to restore: " -msgstr "" - -#: src/dird/ua_restore.c:964 src/dird/vbackup.c:146 -#, c-format -msgid "Selecting jobs to build the Full state at %s\n" -msgstr "" - -#: src/dird/ua_restore.c:990 -msgid "Invalid JobId in list.\n" -msgstr "" - -#: src/dird/ua_restore.c:1009 -#, c-format -msgid "Access to JobId=%s (Job \"%s\") not authorized. Not selected.\n" -msgstr "" - -#: src/dird/ua_restore.c:1022 -msgid "No Jobs selected.\n" -msgstr "" - -#: src/dird/ua_restore.c:1027 -#, c-format -msgid "You have selected the following JobIds: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:1029 -#, c-format -msgid "You have selected the following JobId: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:1039 -msgid "" -"The restored files will the most current backup\n" -"BEFORE the date you specify below.\n" -"\n" -msgstr "" - -#: src/dird/ua_restore.c:1042 -msgid "Enter date as YYYY-MM-DD HH:MM:SS :" -msgstr "" - -#: src/dird/ua_restore.c:1048 -msgid "Improper date format.\n" -msgstr "" - -#: src/dird/ua_restore.c:1069 -#, c-format -msgid "Cannot open file %s: ERR=%s\n" -msgstr "" - -#: src/dird/ua_restore.c:1077 src/dird/ua_restore.c:1081 -#, c-format -msgid "Error occurred on line %d of file \"%s\"\n" -msgstr "" - -#: src/dird/ua_restore.c:1125 src/dird/ua_restore.c:1153 -#, c-format -msgid "No database record found for: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:1141 -msgid "No JobId specified cannot continue.\n" -msgstr "" - -#: src/dird/ua_restore.c:1174 -#, c-format -msgid "No table found: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:1232 -msgid "" -"\n" -"\n" -"For one or more of the JobIds selected, no files were found,\n" -"so file selection is not possible.\n" -"Most likely your retention policy pruned the files.\n" -msgstr "" - -#: src/dird/ua_restore.c:1235 -msgid "" -"\n" -"Do you want to restore all the files? (yes|no): " -msgstr "" - -#: src/dird/ua_restore.c:1238 -msgid "" -"\n" -"Regexp matching files to restore? (empty to abort): " -msgstr "" - -#: src/dird/ua_restore.c:1254 -#, c-format -msgid "Regex compile error: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:1297 -#, fuzzy, c-format -msgid "Unable to create component file %s. ERR=%s\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/dird/ua_restore.c:1304 -#, fuzzy, c-format -msgid "Unable to fdopen component file %s. ERR=%s\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/dird/ua_restore.c:1311 -#, fuzzy -msgid "Error writing component file.\n" -msgstr "Помилка надсилання Hello до Збирача. ERR=%s\n" - -#: src/dird/ua_restore.c:1356 -#, c-format -msgid "" -"\n" -"Building directory tree for JobId(s) %s ... " -msgstr "" - -#: src/dird/ua_restore.c:1426 -#, c-format -msgid "" -"\n" -"%s files inserted into the tree and marked for extraction.\n" -msgstr "" - -#: src/dird/ua_restore.c:1429 -#, c-format -msgid "" -"\n" -"%s files inserted into the tree.\n" -msgstr "" - -#: src/dird/ua_restore.c:1517 -#, c-format -msgid "Error getting FileSet \"%s\": ERR=%s\n" -msgstr "" - -#: src/dird/ua_restore.c:1522 -#, c-format -msgid "FileSet argument: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:1528 src/dird/ua_select.c:204 -msgid "The defined FileSet resources are:\n" -msgstr "" - -#: src/dird/ua_restore.c:1532 src/dird/ua_run.c:1014 src/dird/ua_select.c:212 -msgid "FileSet" -msgstr "" - -#: src/dird/ua_restore.c:1532 src/dird/ua_select.c:212 -msgid "Select FileSet resource" -msgstr "" - -#: src/dird/ua_restore.c:1534 -#, c-format -msgid "No FileSet found for client \"%s\".\n" -msgstr "" - -#: src/dird/ua_restore.c:1540 -#, c-format -msgid "Error getting FileSet record: %s\n" -msgstr "" - -#: src/dird/ua_restore.c:1541 -msgid "" -"This probably means you modified the FileSet.\n" -"Continuing anyway.\n" -msgstr "" - -#: src/dird/ua_restore.c:1556 -#, c-format -msgid "Pool \"%s\" not found, using any pool.\n" -msgstr "" - -#: src/dird/ua_restore.c:1583 src/dird/ua_restore.c:1599 -#, c-format -msgid "No Full backup before %s found.\n" -msgstr "" - -#: src/dird/ua_restore.c:1628 -msgid "No jobs found.\n" -msgstr "" - -#: src/dird/ua_restore.c:1763 -#, c-format -msgid "" -"\n" -"Warning Storage is overridden by \"%s\" on the command line.\n" -msgstr "" - -#: src/dird/ua_restore.c:1768 -#, c-format -msgid "" -"This may not work because of two different MediaTypes:\n" -" Storage MediaType=\"%s\"\n" -" Volume MediaType=\"%s\".\n" -"\n" -msgstr "" - -#: src/dird/ua_restore.c:1787 -#, c-format -msgid "Using Storage \"%s\" from MediaType \"%s\".\n" -msgstr "" - -#: src/dird/ua_restore.c:1790 -#, c-format -msgid "Storage \"%s\" not found, using Storage \"%s\" from MediaType \"%s\".\n" -msgstr "" - -#: src/dird/ua_restore.c:1799 -#, c-format -msgid "" -"\n" -"Unable to find Storage resource for\n" -"MediaType \"%s\", needed by the Jobs you selected.\n" -msgstr "" - -#: src/dird/ua_run.c:165 -msgid "OK to run? (yes/mod/no): " -msgstr "" - -#: src/dird/ua_run.c:194 -#, c-format -msgid "" -"\n" -"Bad response: %s. You must answer yes, mod, or no.\n" -"\n" -msgstr "" - -#: src/dird/ua_run.c:198 -msgid "Job not run.\n" -msgstr "" - -#: src/dird/ua_run.c:237 -msgid "Job failed.\n" -msgstr "" - -#: src/dird/ua_run.c:240 -#, c-format -msgid "Job queued. JobId=%s\n" -msgstr "" - -#: src/dird/ua_run.c:258 -#, c-format -msgid "Job \"%s\" not found\n" -msgstr "" - -#: src/dird/ua_run.c:265 -msgid "A job name must be specified.\n" -msgstr "" - -#: src/dird/ua_run.c:271 -#, c-format -msgid "No authorization. Job \"%s\".\n" -msgstr "" - -#: src/dird/ua_run.c:289 -#, c-format -msgid "Pool \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_run.c:299 -#, c-format -msgid "No authorization. Pool \"%s\".\n" -msgstr "" - -#: src/dird/ua_run.c:313 -#, c-format -msgid "NextPool \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_run.c:322 -#, fuzzy, c-format -msgid "No authorization. NextPool \"%s\".\n" -msgstr "Від'єднуюсь від Зберігача %s:%d\n" - -#: src/dird/ua_run.c:353 src/dird/ua_run.c:373 -#, c-format -msgid "No authorization. Client \"%s\".\n" -msgstr "" - -#: src/dird/ua_run.c:363 -#, c-format -msgid "Restore Client \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_run.c:392 -#, c-format -msgid "FileSet \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_run.c:401 -#, c-format -msgid "No authorization. FileSet \"%s\".\n" -msgstr "" - -#: src/dird/ua_run.c:420 -#, c-format -msgid "Storage \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_run.c:423 src/dird/ua_run.c:1054 -msgid "user selection" -msgstr "" - -#: src/dird/ua_run.c:432 -#, c-format -msgid "No authorization. Storage \"%s\".\n" -msgstr "" - -#: src/dird/ua_run.c:456 -msgid "No JobId specified.\n" -msgstr "" - -#: src/dird/ua_run.c:470 -msgid "Invalid or no Job name specified.\n" -msgstr "" - -#: src/dird/ua_run.c:485 -msgid "Enter the JobId list to select: " -msgstr "" - -#: src/dird/ua_run.c:501 -#, c-format -msgid "JobId=%d entered is not in the list.\n" -msgstr "" - -#: src/dird/ua_run.c:525 -#, fuzzy, c-format -msgid "Could not get job record for selected JobId=%d. ERR=%s" -msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" - -#: src/dird/ua_run.c:593 src/dird/ua_run.c:846 src/dird/ua_select.c:154 -msgid "You have the following choices:\n" -msgstr "" - -#: src/dird/ua_run.c:597 -msgid "Select termination code: " -msgstr "" - -#: src/dird/ua_run.c:781 -msgid "Unable to use current plugin configuration, discarding it." -msgstr "" - -#: src/dird/ua_run.c:796 -msgid "Plugin Restore Options\n" -msgstr "" - -#: src/dird/ua_run.c:807 -msgid "*None, but required*" -msgstr "" - -#: src/dird/ua_run.c:827 -msgid "Use above plugin configuration? (yes/mod/no): " -msgstr "" - -#: src/dird/ua_run.c:845 src/dird/ua_run.c:1007 src/dird/ua_select.c:73 -msgid "mod" -msgstr "" - -#: src/dird/ua_run.c:869 -#, c-format -msgid "Please enter a value for %s: " -msgstr "" - -#: src/dird/ua_run.c:943 -msgid "No plugin to configure\n" -msgstr "" - -#: src/dird/ua_run.c:951 -msgid "Plugins to configure:\n" -msgstr "" - -#: src/dird/ua_run.c:960 -msgid "Select plugin to configure" -msgstr "" - -#: src/dird/ua_run.c:976 -#, fuzzy, c-format -msgid "Can't configure %32s\n" -msgstr "Не можливо створити чергу(fifo) %s: ERR=%s\n" - -#: src/dird/ua_run.c:1011 -msgid "Level" -msgstr "" - -#: src/dird/ua_run.c:1016 -msgid "Restore Client" -msgstr "" - -#: src/dird/ua_run.c:1020 -msgid "When" -msgstr "" - -#: src/dird/ua_run.c:1021 -msgid "Priority" -msgstr "" - -#: src/dird/ua_run.c:1026 src/dird/ua_select.c:633 src/dird/ua_select.c:746 -#: src/dird/ua_update.c:615 -msgid "Pool" -msgstr "" - -#: src/dird/ua_run.c:1031 -msgid "NextPool" -msgstr "" - -#: src/dird/ua_run.c:1033 -msgid "Verify Job" -msgstr "" - -#: src/dird/ua_run.c:1036 -msgid "Bootstrap" -msgstr "" - -#: src/dird/ua_run.c:1037 -msgid "Where" -msgstr "" - -#: src/dird/ua_run.c:1038 -msgid "File Relocation" -msgstr "" - -#: src/dird/ua_run.c:1039 -msgid "Replace" -msgstr "" - -#: src/dird/ua_run.c:1040 -msgid "JobId" -msgstr "" - -#: src/dird/ua_run.c:1043 -msgid "Plugin Options" -msgstr "" - -#: src/dird/ua_run.c:1086 -msgid "" -"Please enter desired start time as YYYY-MM-DD HH:MM:SS (return for now): " -msgstr "" - -#: src/dird/ua_run.c:1094 src/dird/ua_run.c:1311 -msgid "Invalid time, using current time.\n" -msgstr "" - -#: src/dird/ua_run.c:1101 -msgid "Enter new Priority: " -msgstr "" - -#: src/dird/ua_run.c:1105 -msgid "Priority must be a positive integer.\n" -msgstr "" - -#: src/dird/ua_run.c:1126 -msgid "Please enter the Bootstrap file name: " -msgstr "" - -#: src/dird/ua_run.c:1138 -#, c-format -msgid "Warning cannot open %s: ERR=%s\n" -msgstr "" - -#: src/dird/ua_run.c:1168 -msgid "Please enter the full path prefix for restore (/ for none): " -msgstr "" - -#: src/dird/ua_run.c:1190 -msgid "Replace:\n" -msgstr "" - -#: src/dird/ua_run.c:1194 -msgid "Select replace option" -msgstr "" - -#: src/dird/ua_run.c:1205 -msgid "" -"You must set the bootstrap file to NULL to be able to specify a JobId.\n" -msgstr "" - -#: src/dird/ua_run.c:1217 -msgid "Please Plugin Options string: " -msgstr "" - -#: src/dird/ua_run.c:1260 src/dird/ua_run.c:1265 -#, fuzzy -msgid "Command input" -msgstr "Не зрозумілий параметр командного рядка" - -#: src/dird/ua_run.c:1262 src/dird/ua_run.c:1267 src/dird/ua_run.c:1287 -msgid "User input" -msgstr "" - -#: src/dird/ua_run.c:1350 -#, c-format -msgid "Invalid replace option: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1449 -#, c-format -msgid "strip_prefix=%s add_prefix=%s add_suffix=%s\n" -msgstr "" - -#: src/dird/ua_run.c:1452 -msgid "This will replace your current Where value\n" -msgstr "" - -#: src/dird/ua_run.c:1453 -msgid "Strip prefix" -msgstr "" - -#: src/dird/ua_run.c:1454 -msgid "Add prefix" -msgstr "" - -#: src/dird/ua_run.c:1455 -msgid "Add file suffix" -msgstr "" - -#: src/dird/ua_run.c:1456 -msgid "Enter a regexp" -msgstr "" - -#: src/dird/ua_run.c:1457 -msgid "Test filename manipulation" -msgstr "" - -#: src/dird/ua_run.c:1458 -msgid "Use this ?" -msgstr "" - -#: src/dird/ua_run.c:1463 -msgid "Please enter the path prefix to strip: " -msgstr "" - -#: src/dird/ua_run.c:1471 -msgid "Please enter the path prefix to add (/ for none): " -msgstr "" - -#: src/dird/ua_run.c:1482 -msgid "Please enter the file suffix to add: " -msgstr "" - -#: src/dird/ua_run.c:1489 -msgid "Please enter a valid regexp (!from!to!): " -msgstr "" - -#: src/dird/ua_run.c:1502 -#, c-format -msgid "regexwhere=%s\n" -msgstr "" - -#: src/dird/ua_run.c:1508 -#, c-format -msgid "strip_prefix=%s add_prefix=%s add_suffix=%s result=%s\n" -msgstr "" - -#: src/dird/ua_run.c:1515 -msgid "Cannot use your regexp\n" -msgstr "" - -#: src/dird/ua_run.c:1518 -msgid "Enter a period (.) to stop this test\n" -msgstr "" - -#: src/dird/ua_run.c:1519 -msgid "Please enter filename to test: " -msgstr "" - -#: src/dird/ua_run.c:1521 -#, c-format -msgid "%s -> %s\n" -msgstr "" - -#: src/dird/ua_run.c:1565 -msgid "Cannot use your regexp.\n" -msgstr "" - -#: src/dird/ua_run.c:1578 src/dird/ua_run.c:1608 -msgid "Levels:\n" -msgstr "" - -#: src/dird/ua_run.c:1580 src/lib/util.c:505 src/lib/util.c:551 -msgid "Full" -msgstr "" - -#: src/dird/ua_run.c:1581 src/lib/util.c:508 -msgid "Incremental" -msgstr "" - -#: src/dird/ua_run.c:1582 src/lib/util.c:511 -msgid "Differential" -msgstr "" - -#: src/dird/ua_run.c:1583 src/lib/util.c:514 -msgid "Since" -msgstr "" - -#: src/dird/ua_run.c:1584 -msgid "VirtualFull" -msgstr "" - -#: src/dird/ua_run.c:1585 src/dird/ua_run.c:1614 -msgid "Select level" -msgstr "" - -#: src/dird/ua_run.c:1609 -msgid "Initialize Catalog" -msgstr "" - -#: src/dird/ua_run.c:1610 src/lib/util.c:517 -msgid "Verify Catalog" -msgstr "" - -#: src/dird/ua_run.c:1611 src/lib/util.c:523 -msgid "Verify Volume to Catalog" -msgstr "" - -#: src/dird/ua_run.c:1612 src/lib/util.c:526 -msgid "Verify Disk to Catalog" -msgstr "" - -#: src/dird/ua_run.c:1613 -msgid "Verify Volume Data (not yet implemented)" -msgstr "" - -#: src/dird/ua_run.c:1634 -msgid "Level not appropriate for this Job. Cannot be changed.\n" -msgstr "" - -#: src/dird/ua_run.c:1665 -#, c-format -msgid "" -"Run Admin Job\n" -"JobName: %s\n" -"FileSet: %s\n" -"Client: %s\n" -"Storage: %s\n" -"When: %s\n" -"Priority: %d\n" -msgstr "" - -#: src/dird/ua_run.c:1723 -#, c-format -msgid "" -"Run Backup job\n" -"JobName: %s\n" -"Level: %s\n" -"Client: %s\n" -"FileSet: %s\n" -"Pool: %s (From %s)\n" -"%sStorage: %s (From %s)\n" -"When: %s\n" -"Priority: %d\n" -"%s%s%s" -msgstr "" - -#: src/dird/ua_run.c:1756 -#, fuzzy, c-format -msgid "Could not get job record for selected JobId. ERR=%s" -msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" - -#: src/dird/ua_run.c:1795 -#, c-format -msgid "" -"Run Verify Job\n" -"JobName: %s\n" -"Level: %s\n" -"Client: %s\n" -"FileSet: %s\n" -"Pool: %s (From %s)\n" -"Storage: %s (From %s)\n" -"Verify Job: %s\n" -"Verify List: %s\n" -"When: %s\n" -"Priority: %d\n" -msgstr "" - -#: src/dird/ua_run.c:1824 -msgid "Please enter a JobId for restore: " -msgstr "" - -#: src/dird/ua_run.c:1863 src/dird/ua_run.c:1890 src/dird/ua_run.c:1921 -#: src/dird/ua_run.c:1948 src/dird/ua_run.c:1986 -#, fuzzy -msgid "User specified" -msgstr "зазначений час сну" - -#: src/dird/ua_run.c:1865 -#, c-format -msgid "" -"Run Restore job\n" -"JobName: %s\n" -"Bootstrap: %s\n" -"RegexWhere: %s\n" -"Replace: %s\n" -"FileSet: %s\n" -"Backup Client: %s\n" -"Restore Client: %s\n" -"Storage: %s\n" -"When: %s\n" -"Catalog: %s\n" -"Priority: %d\n" -"Plugin Options: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1923 -#, c-format -msgid "" -"Run Restore job\n" -"JobName: %s\n" -"Bootstrap: %s\n" -"Where: %s\n" -"Replace: %s\n" -"FileSet: %s\n" -"Backup Client: %s\n" -"Restore Client: %s\n" -"Storage: %s\n" -"When: %s\n" -"Catalog: %s\n" -"Priority: %d\n" -"Plugin Options: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1955 -#, c-format -msgid "" -"Run Restore job\n" -"JobName: %s\n" -"Bootstrap: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1963 -#, c-format -msgid "RegexWhere: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1966 -#, c-format -msgid "Where: %s\n" -msgstr "" - -#: src/dird/ua_run.c:1970 -#, c-format -msgid "" -"Replace: %s\n" -"Client: %s\n" -"Storage: %s\n" -"JobId: %s\n" -"When: %s\n" -"Catalog: %s\n" -"Priority: %d\n" -"Plugin Options: %s\n" -msgstr "" - -#: src/dird/ua_run.c:2028 -msgid "Run Copy job\n" -msgstr "" - -#: src/dird/ua_run.c:2030 -msgid "Run Migration job\n" -msgstr "" - -#: src/dird/ua_run.c:2062 -#, c-format -msgid "Unknown Job Type=%d\n" -msgstr "" - -#: src/dird/ua_run.c:2136 -#, c-format -msgid "Value missing for keyword %s\n" -msgstr "" - -#: src/dird/ua_run.c:2146 -msgid "JobId specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2155 src/dird/ua_run.c:2295 -msgid "Client specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2163 -msgid "FileSet specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2171 -msgid "Level specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2180 -msgid "Storage specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2188 -msgid "RegexWhere or Where specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2193 -msgid "No authorization for \"regexwhere\" specification.\n" -msgstr "" - -#: src/dird/ua_run.c:2200 -msgid "Where or RegexWhere specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2205 -msgid "No authoriztion for \"where\" specification.\n" -msgstr "" - -#: src/dird/ua_run.c:2212 -msgid "Bootstrap specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2220 -msgid "Replace specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2228 -msgid "When specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2236 -msgid "Priority specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2241 -msgid "Priority must be positive nonzero setting it to 10.\n" -msgstr "" - -#: src/dird/ua_run.c:2251 -msgid "Verify Job specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2279 -msgid "Migration Job specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2287 -msgid "Pool specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2303 -msgid "Restore Client specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2310 -msgid "Plugin Options not yet implemented.\n" -msgstr "" - -#: src/dird/ua_run.c:2313 -msgid "Plugin Options specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2318 -msgid "No authoriztion for \"PluginOptions\" specification.\n" -msgstr "" - -#: src/dird/ua_run.c:2325 -msgid "Spool flag specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2332 -msgid "Invalid spooldata flag.\n" -msgstr "" - -#: src/dird/ua_run.c:2341 -msgid "IgnoreDuplicateCheck flag specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2348 -msgid "Invalid ignoreduplicatecheck flag.\n" -msgstr "" - -#: src/dird/ua_run.c:2353 -msgid "Accurate flag specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2360 -msgid "Invalid accurate flag.\n" -msgstr "" - -#: src/dird/ua_run.c:2365 -msgid "Job name specified twice.\n" -msgstr "" - -#: src/dird/ua_run.c:2373 -#, fuzzy -msgid "Media Type specified twice.\n" -msgstr "зазначений час сну" - -#: src/dird/ua_run.c:2381 -#, fuzzy -msgid "NextPool specified twice.\n" -msgstr "зазначений час сну" - -#: src/dird/ua_run.c:2406 -#, c-format -msgid "Invalid keyword: %s\n" -msgstr "" - -#: src/dird/ua_run.c:2421 -#, c-format -msgid "Catalog \"%s\" not found\n" -msgstr "" - -#: src/dird/ua_run.c:2425 -#, c-format -msgid "No authorization. Catalog \"%s\".\n" -msgstr "" - -#: src/dird/ua_run.c:2459 -#, c-format -msgid "Verify Job \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_run.c:2469 -#, c-format -msgid "Migration Job \"%s\" not found.\n" -msgstr "" - -#: src/dird/ua_select.c:39 src/dird/ua_select.c:65 -#, c-format -msgid "The current %s retention period is: %s\n" -msgstr "" - -#: src/dird/ua_select.c:44 -msgid "Continue? (yes/no): " -msgstr "" - -#: src/dird/ua_select.c:70 -msgid "Continue? (yes/mod/no): " -msgstr "" - -#: src/dird/ua_select.c:74 -msgid "Enter new retention period: " -msgstr "" - -#: src/dird/ua_select.c:78 -msgid "Invalid period.\n" -msgstr "" - -#: src/dird/ua_select.c:177 -msgid "The defined Storage resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:189 -msgid "Select Storage resource" -msgstr "" - -#: src/dird/ua_select.c:245 -msgid "You must specify a \"use \" command before continuing.\n" -msgstr "" - -#: src/dird/ua_select.c:251 -msgid "The defined Catalog resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:259 -msgid "Catalog" -msgstr "" - -#: src/dird/ua_select.c:259 -msgid "Select Catalog resource" -msgstr "" - -#: src/dird/ua_select.c:278 -msgid "The disabled Job resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:280 -msgid "The enabled Job resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:292 src/dird/ua_select.c:315 -msgid "Select Job resource" -msgstr "" - -#: src/dird/ua_select.c:307 -msgid "The defined Job resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:334 -#, c-format -msgid "Error: Restore Job resource \"%s\" does not exist.\n" -msgstr "" - -#: src/dird/ua_select.c:348 -msgid "The defined Restore Job resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:356 -msgid "Select Restore Job" -msgstr "" - -#: src/dird/ua_select.c:372 src/dird/ua_select.c:399 -msgid "The defined Client resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:383 -#, fuzzy -msgid "Select Client resource" -msgstr "Не знайдено відбиток MD5 Набору Файлів.\n" - -#: src/dird/ua_select.c:407 -msgid "Select Client (File daemon) resource" -msgstr "" - -#: src/dird/ua_select.c:434 -#, c-format -msgid "Error: Client resource %s does not exist.\n" -msgstr "" - -#: src/dird/ua_select.c:450 -msgid "The defined Schedule resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:461 -msgid "Schedule" -msgstr "" - -#: src/dird/ua_select.c:461 -msgid "Select Schedule resource" -msgstr "" - -#: src/dird/ua_select.c:487 -#, c-format -msgid "Could not find Client %s: ERR=%s" -msgstr "" - -#: src/dird/ua_select.c:497 src/dird/ua_select.c:551 -#, c-format -msgid "Could not find Client \"%s\": ERR=%s" -msgstr "" - -#: src/dird/ua_select.c:526 -#, c-format -msgid "Error obtaining client ids. ERR=%s\n" -msgstr "" - -#: src/dird/ua_select.c:530 -msgid "No clients defined. You must run a job before using this command.\n" -msgstr "" - -#: src/dird/ua_select.c:534 -msgid "Defined Clients:\n" -msgstr "" - -#: src/dird/ua_select.c:544 -msgid "Select the Client" -msgstr "" - -#: src/dird/ua_select.c:577 src/dird/ua_select.c:601 src/dird/ua_select.c:646 -#, c-format -msgid "Could not find Pool \"%s\": ERR=%s" -msgstr "" - -#: src/dird/ua_select.c:616 -msgid "No pools defined. Use the \"create\" command to create one.\n" -msgstr "" - -#: src/dird/ua_select.c:620 -msgid "Defined Pools:\n" -msgstr "" - -#: src/dird/ua_select.c:633 -msgid "Select the Pool" -msgstr "" - -#: src/dird/ua_select.c:671 -#, c-format -msgid "No access to Pool \"%s\"\n" -msgstr "" - -#: src/dird/ua_select.c:703 -msgid "Enter a Volume name or *MediaId: " -msgstr "" - -#: src/dird/ua_select.c:738 -msgid "The defined Pool resources are:\n" -msgstr "" - -#: src/dird/ua_select.c:746 -msgid "Select Pool resource" -msgstr "" - -#: src/dird/ua_select.c:781 -msgid "Enter the JobId to select: " -msgstr "" - -#: src/dird/ua_select.c:819 -#, c-format -msgid "Could not find Job \"%s\": ERR=%s" -msgstr "" - -#: src/dird/ua_select.c:910 src/dird/ua_select.c:1006 -#, c-format -msgid "Automatically selected %s: %s\n" -msgstr "" - -#: src/dird/ua_select.c:921 src/dird/ua_select.c:1017 -#, c-format -msgid "" -"Your request has multiple choices for \"%s\". Selection is not possible in " -"batch mode.\n" -msgstr "" -"Ваш запит до \"%s\" має декілька можливостей вибору. У пакетному режимі " -"вибір не можливий.\n" - -#: src/dird/ua_select.c:939 src/dird/ua_select.c:999 -#, c-format -msgid "Selection list for \"%s\" is empty!\n" -msgstr "" - -#: src/dird/ua_select.c:945 -#, c-format -msgid "Automatically selected: %s\n" -msgstr "" - -#: src/dird/ua_select.c:957 -msgid "Selection aborted, nothing done.\n" -msgstr "" - -#: src/dird/ua_select.c:962 src/dird/ua_select.c:1051 -#, c-format -msgid "Please enter a number between 1 and %d\n" -msgstr "" - -#: src/dird/ua_select.c:1105 -msgid "Storage name given twice.\n" -msgstr "" - -#: src/dird/ua_select.c:1122 -#, c-format -msgid "Expecting jobid=nn command, got: %s\n" -msgstr "" - -#: src/dird/ua_select.c:1126 -#, c-format -msgid "JobId %s is not running.\n" -msgstr "" - -#: src/dird/ua_select.c:1136 -#, c-format -msgid "Expecting job=xxx, got: %s.\n" -msgstr "" - -#: src/dird/ua_select.c:1140 -#, c-format -msgid "Job \"%s\" is not running.\n" -msgstr "" - -#: src/dird/ua_select.c:1148 -#, c-format -msgid "Expecting ujobid=xxx, got: %s.\n" -msgstr "" - -#: src/dird/ua_select.c:1169 -#, c-format -msgid "Storage resource \"%s\": not found\n" -msgstr "" - -#: src/dird/ua_select.c:1201 -msgid "Enter autochanger drive[0]: " -msgstr "" - -#: src/dird/ua_select.c:1222 -msgid "Enter autochanger slot: " -msgstr "" - -#: src/dird/ua_select.c:1252 -msgid "Media Types defined in conf file:\n" -msgstr "" - -#: src/dird/ua_select.c:1258 -msgid "Media Type" -msgstr "" - -#: src/dird/ua_select.c:1258 -msgid "Select the Media Type" -msgstr "" - -#: src/dird/ua_select.c:1296 src/filed/status.c:322 src/stored/status.c:915 -msgid "No Jobs running.\n" -msgstr "" - -#: src/dird/ua_select.c:1298 -msgid "None of your jobs are running.\n" -msgstr "" - -#: src/dird/ua_select.c:1326 -msgid "No value given for \"jobid\".\n" -msgstr "" - -#: src/dird/ua_select.c:1338 -#, c-format -msgid "Unauthorized command from this console for JobId=%d.\n" -msgstr "" - -#: src/dird/ua_select.c:1342 -#, c-format -msgid "Warning Job JobId=%d is not running.\n" -msgstr "" - -#: src/dird/ua_select.c:1367 src/dird/ua_select.c:1462 -#, c-format -msgid "Confirm %s of %d Job%s (yes/no): " -msgstr "" - -#: src/dird/ua_select.c:1380 -msgid "No value given for \"job\".\n" -msgstr "" - -#: src/dird/ua_select.c:1390 -#, c-format -msgid "Unauthorized command from this console for job=%s.\n" -msgstr "" - -#: src/dird/ua_select.c:1396 src/dird/ua_select.c:1421 -#, c-format -msgid "Warning Job %s is not running.\n" -msgstr "" - -#: src/dird/ua_select.c:1405 -msgid "No value given for \"ujobid\".\n" -msgstr "" - -#: src/dird/ua_select.c:1415 -#, c-format -msgid "Unauthorized command from this console for ujobid=%s.\n" -msgstr "" - -#: src/dird/ua_select.c:1441 -msgid "Select Job(s):\n" -msgstr "" - -#: src/dird/ua_select.c:1447 -#, c-format -msgid "JobId=%s Job=%s" -msgstr "" - -#: src/dird/ua_select.c:1451 -#, fuzzy, c-format -msgid "Choose Job list to %s" -msgstr "Оберіть те, що Ви хочете вичистити" - -#: src/dird/ua_server.c:57 -#, c-format -msgid "Cannot create UA thread: %s\n" -msgstr "" - -#: src/dird/ua_server.c:147 -msgid "You have messages.\n" -msgstr "" - -#: src/dird/ua_status.c:171 -msgid "Status available for:\n" -msgstr "" - -#: src/dird/ua_status.c:178 -msgid "Select daemon type for status" -msgstr "" - -#: src/dird/ua_status.c:324 src/stored/status.c:499 -#, c-format -msgid "%s %sVersion: %s (%s) %s %s %s\n" -msgstr "" - -#: src/dird/ua_status.c:328 -#, c-format -msgid "Daemon started %s, conf reloaded %s\n" -msgstr "" - -#: src/dird/ua_status.c:329 -#, c-format -msgid " Jobs: run=%d, running=%d mode=%d,%d\n" -msgstr "" - -#: src/dird/ua_status.c:331 src/filed/status.c:175 src/stored/status.c:509 -#, c-format -msgid " Heap: heap=%s smbytes=%s max_bytes=%s bufs=%s max_bufs=%s\n" -msgstr "" - -#: src/dird/ua_status.c:337 -#, c-format -msgid "" -" Res: njobs=%d nclients=%d nstores=%d npools=%d ncats=%d nfsets=%d nscheds=" -"%d\n" -msgstr "" - -#: src/dird/ua_status.c:394 -#, fuzzy, c-format -msgid "No authorization for Storage \"%s\"\n" -msgstr "Від'єднуюсь від Зберігача %s:%d\n" - -#: src/dird/ua_status.c:404 -msgid "Restricted Client or Job does not permit access to Storage daemons\n" -msgstr "" - -#: src/dird/ua_status.c:414 -#, c-format -msgid "" -"\n" -"Failed to connect to Storage daemon %s.\n" -"====\n" -msgstr "" - -#: src/dird/ua_status.c:429 -msgid "Must have three aguments\n" -msgstr "" - -#: src/dird/ua_status.c:478 -#, c-format -msgid "" -"Failed to connect to Client %s.\n" -"====\n" -msgstr "" - -#: src/dird/ua_status.c:483 -msgid "Connected to file daemon\n" -msgstr "" - -#: src/dird/ua_status.c:502 src/dird/ua_status.c:511 -msgid "" -"\n" -"Scheduled Jobs:\n" -msgstr "" - -#: src/dird/ua_status.c:503 -msgid "" -"Level Type Pri Scheduled Job Name Volume\n" -msgstr "" - -#: src/dird/ua_status.c:504 -msgid "===================================================================================\n" -msgstr "" - -#: src/dird/ua_status.c:512 -msgid "" -"Level Type Pri Scheduled Job Name Schedule\n" -msgstr "" - -#: src/dird/ua_status.c:513 -msgid "=====================================================================================\n" -msgstr "" - -#: src/dird/ua_status.c:570 src/dird/ua_status.c:753 -#, c-format -msgid "%-14s\t%-8s\t%3d\t%-18s\t%-18s\t%s\n" -msgstr "" - -#: src/dird/ua_status.c:591 src/dird/ua_status.c:757 -#, c-format -msgid "%-14s %-8s %3d %-18s %-18s %s\n" -msgstr "" - -#: src/dird/ua_status.c:627 -msgid "Ignoring invalid value for days. Max is 3000.\n" -msgstr "" - -#: src/dird/ua_status.c:638 -msgid "Ignoring invalid value for limit. Max is 2000.\n" -msgstr "" - -#: src/dird/ua_status.c:649 -msgid "Ignoring invalid time.\n" -msgstr "" - -#: src/dird/ua_status.c:772 src/dird/ua_status.c:877 -msgid "No Scheduled Jobs.\n" -msgstr "" - -#: src/dird/ua_status.c:824 -msgid "Ignoring invalid value for days. Max is 500.\n" -msgstr "" - -#: src/dird/ua_status.c:903 src/filed/status.c:228 src/stored/status.c:816 -msgid "" -"\n" -"Running Jobs:\n" -msgstr "" - -#: src/dird/ua_status.c:911 -#, fuzzy, c-format -msgid "Console connected %sat %s\n" -msgstr "Вже приєднано\"%s\".\n" - -#: src/dird/ua_status.c:912 src/filed/status.c:240 -msgid "using TLS " -msgstr "" - -#: src/dird/ua_status.c:922 -msgid "" -"No Jobs running.\n" -"====\n" -msgstr "" - -#: src/dird/ua_status.c:929 -msgid " JobId Type Level Files Bytes Name Status\n" -msgstr "" - -#: src/dird/ua_status.c:930 -msgid "======================================================================\n" -msgstr "" - -#: src/dird/ua_status.c:945 -msgid "is waiting execution" -msgstr "" - -#: src/dird/ua_status.c:948 -msgid "is running" -msgstr "" - -#: src/dird/ua_status.c:951 -msgid "is blocked" -msgstr "" - -#: src/dird/ua_status.c:954 -msgid "has terminated" -msgstr "" - -#: src/dird/ua_status.c:957 -msgid "has terminated with warnings" -msgstr "" - -#: src/dird/ua_status.c:960 -msgid "has terminated in incomplete state" -msgstr "" - -#: src/dird/ua_status.c:963 -msgid "has erred" -msgstr "" - -#: src/dird/ua_status.c:966 -msgid "has errors" -msgstr "" - -#: src/dird/ua_status.c:969 -msgid "has a fatal error" -msgstr "" - -#: src/dird/ua_status.c:972 -msgid "has verify differences" -msgstr "" - -#: src/dird/ua_status.c:975 -msgid "has been canceled" -msgstr "" - -#: src/dird/ua_status.c:980 -msgid "is waiting on Client" -msgstr "" - -#: src/dird/ua_status.c:982 -#, c-format -msgid "is waiting on Client %s" -msgstr "" - -#: src/dird/ua_status.c:990 src/dird/ua_status.c:992 -#, fuzzy, c-format -msgid "is waiting on Storage \"%s\"" -msgstr "Від'єднуюсь від Зберігача %s:%d\n" - -#: src/dird/ua_status.c:994 -msgid "is waiting on Storage" -msgstr "" - -#: src/dird/ua_status.c:1000 -msgid "is waiting on max Storage jobs" -msgstr "" - -#: src/dird/ua_status.c:1003 -msgid "is waiting on max Client jobs" -msgstr "" - -#: src/dird/ua_status.c:1006 -msgid "is waiting on max Job jobs" -msgstr "" - -#: src/dird/ua_status.c:1009 -msgid "is waiting on max total jobs" -msgstr "" - -#: src/dird/ua_status.c:1013 -#, fuzzy, c-format -msgid "is waiting for its start time (%s)" -msgstr "Статус задачі: Очікування часу початку" - -#: src/dird/ua_status.c:1019 -msgid "is waiting for higher priority jobs to finish" -msgstr "" - -#: src/dird/ua_status.c:1022 -#, fuzzy -msgid "is waiting for a Shared Storage device" -msgstr "Статус задачі: Очікування Зберігача" - -#: src/dird/ua_status.c:1025 src/dird/ua_status.c:1076 src/lib/util.c:317 -msgid "SD committing Data" -msgstr "" - -#: src/dird/ua_status.c:1028 src/dird/ua_status.c:1079 src/lib/util.c:320 -msgid "SD despooling Data" -msgstr "" - -#: src/dird/ua_status.c:1031 src/dird/ua_status.c:1082 src/lib/util.c:323 -msgid "SD despooling Attributes" -msgstr "" - -#: src/dird/ua_status.c:1034 src/dird/ua_status.c:1085 src/lib/util.c:326 -msgid "Dir inserting Attributes" -msgstr "" - -#: src/dird/ua_status.c:1039 -#, c-format -msgid "is in unknown state %c" -msgstr "" - -#: src/dird/ua_status.c:1053 -msgid "is waiting for a mount request" -msgstr "" - -#: src/dird/ua_status.c:1060 -msgid "is waiting for an appendable Volume" -msgstr "" - -#: src/dird/ua_status.c:1068 -msgid "is waiting for Client to connect to Storage daemon" -msgstr "" - -#: src/dird/ua_status.c:1070 -#, c-format -msgid "is waiting for Client %s to connect to Storage %s" -msgstr "" - -#: src/dird/ua_status.c:1101 -#, c-format -msgid "%6d\t%-6s\t%-20s\t%s\t%s\n" -msgstr "" - -#: src/dird/ua_status.c:1133 -#, c-format -msgid "%6d %-4s %-3s %10s %10s %-17s %s\n" -msgstr "" - -#: src/dird/ua_status.c:1161 -msgid "No Terminated Jobs.\n" -msgstr "" - -#: src/dird/ua_status.c:1167 src/lib/status.h:77 -msgid "" -"\n" -"Terminated Jobs:\n" -msgstr "" - -#: src/dird/ua_status.c:1168 src/lib/status.h:84 -msgid " JobId Level Files Bytes Status Finished Name \n" -msgstr "" - -#: src/dird/ua_status.c:1169 -msgid "====================================================================\n" -msgstr "" - -#: src/dird/ua_status.c:1203 src/lib/status.h:110 src/lib/util.c:256 -msgid "Created" -msgstr "" - -#: src/dird/ua_status.c:1210 src/lib/status.h:117 -msgid "Diffs" -msgstr "" - -#: src/dird/ua_status.c:1219 src/lib/status.h:126 src/lib/util.c:278 -#: src/lib/util.c:400 src/lib/util.c:406 -msgid "OK -- with warnings" -msgstr "" - -#: src/dird/ua_status.c:1222 src/lib/status.h:129 -msgid "Incomplete" -msgstr "" - -#: src/dird/ua_status.c:1225 src/lib/status.h:132 -msgid "Other" -msgstr "" - -#: src/dird/ua_status.c:1229 src/lib/status.h:144 -#, c-format -msgid "%6d\t%-6s\t%8s\t%10s\t%-7s\t%-8s\t%s\n" -msgstr "" - -#: src/dird/ua_status.c:1255 src/lib/status.h:173 -#, c-format -msgid "%6d %-6s %8s %10s %-7s %-8s %s\n" -msgstr "" - -#: src/dird/ua_status.c:1265 -msgid "\n" -msgstr "" - -#: src/dird/ua_tree.c:63 -msgid "add dir/file to be restored recursively, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:64 -msgid "change current directory" -msgstr "" - -#: src/dird/ua_tree.c:65 -msgid "count marked files in and below the cd" -msgstr "" - -#: src/dird/ua_tree.c:66 -msgid "delete dir/file to be restored recursively in dir" -msgstr "" - -#: src/dird/ua_tree.c:67 src/dird/ua_tree.c:68 -msgid "long list current directory, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:69 -msgid "leave file selection mode" -msgstr "" - -#: src/dird/ua_tree.c:70 -msgid "estimate restore size" -msgstr "" - -#: src/dird/ua_tree.c:71 -msgid "same as done command" -msgstr "" - -#: src/dird/ua_tree.c:72 -msgid "find files, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:73 src/dird/ua_tree.c:86 src/dird/ua_tree.c:87 -msgid "print help" -msgstr "" - -#: src/dird/ua_tree.c:74 src/dird/ua_tree.c:75 -msgid "list current directory, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:76 -msgid "list subdir in current directory, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:77 -msgid "list the marked files in and below the cd" -msgstr "" - -#: src/dird/ua_tree.c:78 -msgid "list the marked files in" -msgstr "" - -#: src/dird/ua_tree.c:79 -msgid "mark dir/file to be restored recursively, wildcards allowed" -msgstr "" - -#: src/dird/ua_tree.c:80 -msgid "mark directory name to be restored (no files)" -msgstr "" - -#: src/dird/ua_tree.c:81 src/dird/ua_tree.c:82 -msgid "print current working directory" -msgstr "" - -#: src/dird/ua_tree.c:83 -msgid "unmark dir/file to be restored recursively in dir" -msgstr "" - -#: src/dird/ua_tree.c:84 -msgid "unmark directory name only no recursion" -msgstr "" - -#: src/dird/ua_tree.c:85 -msgid "quit and do not do restore" -msgstr "" - -#: src/dird/ua_tree.c:107 -msgid "" -"\n" -"You are now entering file selection mode where you add (mark) and\n" -"remove (unmark) files to be restored. No files are initially added, unless\n" -"you used the \"all\" keyword on the command line.\n" -"Enter \"done\" to leave this mode.\n" -"\n" -msgstr "" - -#: src/dird/ua_tree.c:118 src/dird/ua_tree.c:848 -#, c-format -msgid "cwd is: %s\n" -msgstr "" - -#: src/dird/ua_tree.c:127 src/dird/ua_tree.c:146 -#, c-format -msgid "Invalid command \"%s\". Enter \"done\" to exit.\n" -msgstr "" - -#: src/dird/ua_tree.c:218 -#, c-format -msgid "" -"Something is wrong with the Delta sequence of %s, skiping new parts. Current " -"sequence is %d\n" -msgstr "" - -#: src/dird/ua_tree.c:390 src/dird/ua_tree.c:402 src/dird/ua_tree.c:419 -msgid "No files marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:404 -msgid "1 file marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:406 -#, c-format -msgid "%s files marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:434 -msgid "No directories marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:436 -msgid "1 directory marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:438 -#, c-format -msgid "%s directories marked.\n" -msgstr "" - -#: src/dird/ua_tree.c:459 -#, c-format -msgid "%s total files/dirs. %s marked to be restored.\n" -msgstr "" - -#: src/dird/ua_tree.c:470 -msgid "No file specification given.\n" -msgstr "" - -#: src/dird/ua_tree.c:691 -#, c-format -msgid "Node %s has no children.\n" -msgstr "" - -#: src/dird/ua_tree.c:784 -#, c-format -msgid "%d total files; %d marked to be restored; %s bytes.\n" -msgstr "" - -#: src/dird/ua_tree.c:795 src/stored/btape.c:2948 -#, c-format -msgid "" -" Command Description\n" -" ======= ===========\n" -msgstr "" - -#: src/dird/ua_tree.c:818 -msgid "Too few or too many arguments. Try using double quotes.\n" -msgstr "" - -#: src/dird/ua_tree.c:831 -msgid "Invalid path given.\n" -msgstr "" - -#: src/dird/ua_tree.c:867 src/dird/ua_tree.c:879 -msgid "No files unmarked.\n" -msgstr "" - -#: src/dird/ua_tree.c:881 -msgid "1 file unmarked.\n" -msgstr "" - -#: src/dird/ua_tree.c:884 -#, c-format -msgid "%s files unmarked.\n" -msgstr "" - -#: src/dird/ua_tree.c:895 src/dird/ua_tree.c:912 -msgid "No directories unmarked.\n" -msgstr "" - -#: src/dird/ua_tree.c:914 -msgid "1 directory unmarked.\n" -msgstr "" - -#: src/dird/ua_tree.c:916 -#, c-format -msgid "%d directories unmarked.\n" -msgstr "" - -#: src/dird/ua_update.c:92 -msgid "Update choice:\n" -msgstr "" - -#: src/dird/ua_update.c:93 -msgid "Volume parameters" -msgstr "" - -#: src/dird/ua_update.c:94 -msgid "Pool from resource" -msgstr "" - -#: src/dird/ua_update.c:95 -msgid "Slots from autochanger" -msgstr "" - -#: src/dird/ua_update.c:96 -msgid "Long term statistics" -msgstr "" - -#: src/dird/ua_update.c:97 -#, fuzzy -msgid "Snapshot parameters" -msgstr "Невідомий статус" - -#: src/dird/ua_update.c:98 -msgid "item" -msgstr "" - -#: src/dird/ua_update.c:98 -msgid "Choose catalog item to update" -msgstr "" - -#: src/dird/ua_update.c:144 -#, c-format -msgid "Invalid VolStatus specified: %s\n" -msgstr "" - -#: src/dird/ua_update.c:153 -#, c-format -msgid "New Volume status is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:182 -#, c-format -msgid "Invalid use duration specified: %s\n" -msgstr "" - -#: src/dird/ua_update.c:190 -#, c-format -msgid "New use duration is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:204 -#, c-format -msgid "New max jobs is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:217 -#, c-format -msgid "New max files is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:228 -#, c-format -msgid "Invalid max. bytes specification: %s\n" -msgstr "" - -#: src/dird/ua_update.c:236 -#, c-format -msgid "New Max bytes is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:247 src/dird/ua_update.c:267 -msgid "Invalid value. It must be yes or no.\n" -msgstr "" - -#: src/dird/ua_update.c:255 -#, c-format -msgid "New Recycle flag is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:275 -#, c-format -msgid "New InChanger flag is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:293 -#, c-format -msgid "Invalid slot, it must be between 0 and MaxVols=%d\n" -msgstr "" - -#: src/dird/ua_update.c:303 src/dird/ua_update.c:727 -#, c-format -msgid "Error updating media record Slot: ERR=%s" -msgstr "" - -#: src/dird/ua_update.c:305 -#, c-format -msgid "New Slot is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:330 -#, c-format -msgid "New Pool is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:373 -#, c-format -msgid "New RecyclePool is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:393 -#, c-format -msgid "Error updating Volume record: ERR=%s" -msgstr "" - -#: src/dird/ua_update.c:395 -#, c-format -msgid "Volume defaults updated from \"%s\" Pool record.\n" -msgstr "" - -#: src/dird/ua_update.c:418 src/dird/ua_update.c:450 -#, c-format -msgid "Error updating Volume records: ERR=%s" -msgstr "" - -#: src/dird/ua_update.c:420 src/dird/ua_update.c:452 -#, c-format -msgid "All Volume defaults updated from \"%s\" Pool record.\n" -msgstr "" - -#: src/dird/ua_update.c:442 -#, c-format -msgid "Updating all pools, but skipped PoolId=%d. ERR=%s\n" -msgstr "" - -#: src/dird/ua_update.c:468 -#, c-format -msgid "Error updating media record Enabled: ERR=%s" -msgstr "" - -#: src/dird/ua_update.c:471 -#, c-format -msgid "New Enabled is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:486 -#, c-format -msgid "Error updating media record ActionOnPurge: ERR=%s" -msgstr "" - -#: src/dird/ua_update.c:489 -#, c-format -msgid "New ActionOnPurge is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:605 -msgid "Volume Status" -msgstr "" - -#: src/dird/ua_update.c:606 -msgid "Volume Retention Period" -msgstr "" - -#: src/dird/ua_update.c:607 -msgid "Volume Use Duration" -msgstr "" - -#: src/dird/ua_update.c:608 -msgid "Maximum Volume Jobs" -msgstr "" - -#: src/dird/ua_update.c:609 -msgid "Maximum Volume Files" -msgstr "" - -#: src/dird/ua_update.c:610 -msgid "Maximum Volume Bytes" -msgstr "" - -#: src/dird/ua_update.c:611 -msgid "Recycle Flag" -msgstr "" - -#: src/dird/ua_update.c:612 -msgid "Slot" -msgstr "" - -#: src/dird/ua_update.c:613 -msgid "InChanger Flag" -msgstr "" - -#: src/dird/ua_update.c:614 -msgid "Volume Files" -msgstr "" - -#: src/dird/ua_update.c:616 -msgid "Volume from Pool" -msgstr "" - -#: src/dird/ua_update.c:617 -msgid "All Volumes from Pool" -msgstr "" - -#: src/dird/ua_update.c:618 -msgid "All Volumes from all Pools" -msgstr "" - -#: src/dird/ua_update.c:619 -msgid "Enabled" -msgstr "" - -#: src/dird/ua_update.c:620 -msgid "RecyclePool" -msgstr "" - -#: src/dird/ua_update.c:621 -msgid "Action On Purge" -msgstr "" - -#: src/dird/ua_update.c:631 -#, c-format -msgid "Updating Volume \"%s\"\n" -msgstr "" - -#: src/dird/ua_update.c:636 -#, c-format -msgid "Current Volume status is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:637 -msgid "Possible Values are:\n" -msgstr "" - -#: src/dird/ua_update.c:648 -msgid "Choose new Volume Status" -msgstr "" - -#: src/dird/ua_update.c:656 -msgid "Enter Volume Retention period: " -msgstr "" - -#: src/dird/ua_update.c:663 -#, c-format -msgid "Current use duration is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:665 -msgid "Enter Volume Use Duration: " -msgstr "" - -#: src/dird/ua_update.c:672 -#, c-format -msgid "Current max jobs is: %u\n" -msgstr "" - -#: src/dird/ua_update.c:673 -msgid "Enter new Maximum Jobs: " -msgstr "" - -#: src/dird/ua_update.c:680 -#, c-format -msgid "Current max files is: %u\n" -msgstr "" - -#: src/dird/ua_update.c:681 -msgid "Enter new Maximum Files: " -msgstr "" - -#: src/dird/ua_update.c:688 -#, c-format -msgid "Current value is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:689 -msgid "Enter new Maximum Bytes: " -msgstr "" - -#: src/dird/ua_update.c:697 -#, c-format -msgid "Current recycle flag is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:699 -msgid "Enter new Recycle status: " -msgstr "" - -#: src/dird/ua_update.c:706 -#, c-format -msgid "Current Slot is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:707 -msgid "Enter new Slot: " -msgstr "" - -#: src/dird/ua_update.c:714 -#, c-format -msgid "Current InChanger flag is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:715 -#, c-format -msgid "Set InChanger flag for Volume \"%s\": yes/no: " -msgstr "" - -#: src/dird/ua_update.c:729 -#, c-format -msgid "New InChanger flag is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:736 -msgid "" -"Warning changing Volume Files can result\n" -"in loss of data on your Volume\n" -"\n" -msgstr "" - -#: src/dird/ua_update.c:738 -#, c-format -msgid "Current Volume Files is: %u\n" -msgstr "" - -#: src/dird/ua_update.c:739 -msgid "Enter new number of Files for Volume: " -msgstr "" - -#: src/dird/ua_update.c:744 -msgid "Normally, you should only increase Volume Files by one!\n" -msgstr "" - -#: src/dird/ua_update.c:745 -msgid "Increase Volume Files? (yes/no): " -msgstr "" - -#: src/dird/ua_update.c:755 -#, c-format -msgid "New Volume Files is: %u\n" -msgstr "" - -#: src/dird/ua_update.c:767 -#, c-format -msgid "Current Pool is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:768 -msgid "Enter new Pool name: " -msgstr "" - -#: src/dird/ua_update.c:789 -#, c-format -msgid "Current Enabled is: %d\n" -msgstr "" - -#: src/dird/ua_update.c:790 -msgid "Enter new Enabled: " -msgstr "" - -#: src/dird/ua_update.c:800 -#, c-format -msgid "Current RecyclePool is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:802 -msgid "No current RecyclePool\n" -msgstr "" - -#: src/dird/ua_update.c:812 -#, c-format -msgid "Current ActionOnPurge is: %s\n" -msgstr "" - -#: src/dird/ua_update.c:814 -msgid "Enter new ActionOnPurge (one of: Truncate, None): " -msgstr "" - -#: src/dird/ua_update.c:842 -#, c-format -msgid "Updating %i job(s).\n" -msgstr "" - -#: src/dird/ua_update.c:874 -#, c-format -msgid "db_update_pool_record returned %d. ERR=%s\n" -msgstr "" - -#: src/dird/ua_update.c:881 -msgid "Pool DB record updated from resource.\n" -msgstr "" - -#: src/dird/ua_update.c:908 -msgid "Expect JobId keyword, not found.\n" -msgstr "" - -#: src/dird/ua_update.c:933 -msgid "Neither Client nor StartTime specified.\n" -msgstr "" - -#: src/dird/vbackup.c:122 -#, c-format -msgid "Start Virtual Backup JobId %s, Job=%s\n" -msgstr "" - -#: src/dird/vbackup.c:126 -msgid "" -"This Job is not an Accurate backup so is not equivalent to a Full backup.\n" -msgstr "" - -#: src/dird/vbackup.c:172 -msgid "No valid Jobs found from user selection.\n" -msgstr "" - -#: src/dird/vbackup.c:176 -#, c-format -msgid "Using user supplied JobIds=%s\n" -msgstr "" - -#: src/dird/vbackup.c:195 -msgid "No previous Full found in list, using Differential level\n" -msgstr "" - -#: src/dird/vbackup.c:200 -msgid "No previous Full found in list, using Incremental level\n" -msgstr "" - -#: src/dird/vbackup.c:213 -msgid "No previous Jobs found.\n" -msgstr "" - -#: src/dird/vbackup.c:236 -#, c-format -msgid "Error getting Job record for previous Job: ERR=%s" -msgstr "" - -#: src/dird/vbackup.c:449 -#, c-format -msgid "" -"%s %s %s (%s):\n" -" Build OS: %s %s %s\n" -" JobId: %d\n" -" Job: %s\n" -" Backup Level: Virtual Full\n" -" Client: \"%s\" %s\n" -" FileSet: \"%s\" %s\n" -" Pool: \"%s\" (From %s)\n" -" Catalog: \"%s\" (From %s)\n" -" Storage: \"%s\" (From %s)\n" -" Scheduled time: %s\n" -" Start time: %s\n" -" End time: %s\n" -" Elapsed time: %s\n" -" Priority: %d\n" -" SD Files Written: %s\n" -" SD Bytes Written: %s (%sB)\n" -" Rate: %.1f KB/s\n" -" Volume name(s): %s\n" -" Volume Session Id: %d\n" -" Volume Session Time: %d\n" -" Last Volume Bytes: %s (%sB)\n" -" SD Errors: %d\n" -" SD termination status: %s\n" -" Termination: %s\n" -"\n" -msgstr "" - -#: src/dird/verify.c:72 src/dird/verify.c:319 -#, c-format -msgid "Unimplemented Verify level %d(%c)\n" -msgstr "" - -#: src/dird/verify.c:136 -msgid "" -"Unable to find JobId of previous InitCatalog Job.\n" -"Please run a Verify with Level=InitCatalog before\n" -"running the current Job.\n" -msgstr "" - -#: src/dird/verify.c:141 -msgid "Unable to find JobId of previous Job for this client.\n" -msgstr "" - -#: src/dird/verify.c:158 -#, c-format -msgid "Could not get job record for previous Job. ERR=%s" -msgstr "" - -#: src/dird/verify.c:164 -#, c-format -msgid "Last Job %d did not terminate normally. JobStatus=%c\n" -msgstr "" - -#: src/dird/verify.c:168 -#, c-format -msgid "Verifying against JobId=%d Job=%s\n" -msgstr "" - -#: src/dird/verify.c:207 -#, c-format -msgid "Start Verify JobId=%s Level=%s Job=%s\n" -msgstr "" - -#: src/dird/verify.c:306 -msgid "Deprecated feature ... use bootstrap.\n" -msgstr "" - -#: src/dird/verify.c:373 -#, c-format -msgid "Unimplemented verify level %d\n" -msgstr "" - -#: src/dird/verify.c:422 -msgid "Verify OK" -msgstr "" - -#: src/dird/verify.c:426 -msgid "*** Verify Error ***" -msgstr "" - -#: src/dird/verify.c:430 -msgid "Verify warnings" -msgstr "" - -#: src/dird/verify.c:433 -msgid "Verify Canceled" -msgstr "" - -#: src/dird/verify.c:436 -msgid "Verify Differences" -msgstr "" - -#: src/dird/verify.c:441 -#, c-format -msgid "Inappropriate term code: %d %c\n" -msgstr "" - -#: src/dird/verify.c:455 -#, c-format -msgid "" -"%s %s %s (%s):\n" -" Build OS: %s %s %s\n" -" JobId: %d\n" -" Job: %s\n" -" FileSet: %s\n" -" Verify Level: %s\n" -" Client: %s\n" -" Verify JobId: %d\n" -" Verify Job: %s\n" -" Start time: %s\n" -" End time: %s\n" -" Files Expected: %s\n" -" Files Examined: %s\n" -" Non-fatal FD errors: %d\n" -" FD termination status: %s\n" -" SD termination status: %s\n" -" Termination: %s\n" -"\n" -msgstr "" - -#: src/dird/verify.c:490 -#, c-format -msgid "" -"%s %s %s (%s):\n" -" Build: %s %s %s\n" -" JobId: %d\n" -" Job: %s\n" -" FileSet: %s\n" -" Verify Level: %s\n" -" Client: %s\n" -" Verify JobId: %d\n" -" Verify Job: %s\n" -" Start time: %s\n" -" End time: %s\n" -" Files Examined: %s\n" -" Non-fatal FD errors: %d\n" -" FD termination status: %s\n" -" Termination: %s\n" -"\n" -msgstr "" - -#: src/dird/verify.c:569 -#, c-format -msgid "" -"birdSD.\n" -msgstr "" - -#: src/filed/backup.c:176 -msgid "The heartbeat didn't start in time.\n" -msgstr "" - -#: src/filed/backup.c:190 -#, c-format -msgid "Had %ld acl errors while doing backup\n" -msgstr "" - -#: src/filed/backup.c:196 -#, c-format -msgid "Had %ld xattr errors while doing backup\n" -msgstr "" - -#: src/filed/backup.c:323 -#, c-format -msgid " Recursion turned off. Will not descend from %s into %s\n" -msgstr "" - -#: src/filed/backup.c:330 -#, c-format -msgid " %s is a different filesystem. Will not descend from %s into it.\n" -msgstr "" - -#: src/filed/backup.c:336 -#, c-format -msgid " Disallowed filesystem. Will not descend from %s into %s\n" -msgstr "" - -#: src/filed/backup.c:341 -#, c-format -msgid " Disallowed drive type. Will not descend into %s\n" -msgstr "" - -#: src/filed/backup.c:352 -#, c-format -msgid " Socket file skipped: %s\n" -msgstr "" - -#: src/filed/backup.c:365 -#, c-format -msgid " Could not access \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/backup.c:372 -#, c-format -msgid " Could not follow link \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/backup.c:379 -#, c-format -msgid " Could not stat \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/backup.c:386 src/filed/verify.c:130 -#, c-format -msgid " Unchanged file skipped: %s\n" -msgstr "" - -#: src/filed/backup.c:389 -#, c-format -msgid " Archive file not saved: %s\n" -msgstr "" - -#: src/filed/backup.c:393 -#, c-format -msgid " Could not open directory \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/backup.c:402 -#, c-format -msgid " Unknown file type %d; not saved: %s\n" -msgstr "" - -#: src/filed/backup.c:511 -#, c-format -msgid " Cannot open \"%s\": ERR=%s.\n" -msgstr "" - -#: src/filed/backup.c:690 src/filed/restore.c:1449 -msgid "Windows Encrypted data not supported on this OS.\n" -msgstr "" - -#: src/filed/backup.c:717 -#, c-format -msgid "Read error on file %s. ERR=%s\n" -msgstr "" - -#: src/filed/backup.c:720 -#, c-format -msgid "Too many errors. JobErrors=%d.\n" -msgstr "" - -#: src/filed/backup.c:730 -msgid "Encryption padding error\n" -msgstr "" - -#: src/filed/backup.c:873 src/filed/backup.c:889 -msgid "Encryption error\n" -msgstr "" - -#: src/filed/backup.c:910 -msgid "main thread is stopping because heartbeat thread stopped\n" -msgstr "" - -#: src/filed/backup.c:967 -msgid "Invalid file flags, no supported data stream type.\n" -msgstr "" - -#: src/filed/backup.c:1007 -#, fuzzy, c-format -msgid "Network send error to SD. Data=%s ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/filed/backup.c:1148 -#, c-format -msgid "Compression deflateParams error: %d\n" -msgstr "" - -#: src/filed/backup.c:1201 -#, c-format -msgid " Cannot open resource fork for \"%s\": ERR=%s.\n" -msgstr "" - -#: src/filed/backup.c:1259 -#, c-format -msgid "Compression deflate error: %d\n" -msgstr "" - -#: src/filed/backup.c:1266 -#, c-format -msgid "Compression deflateReset error: %d\n" -msgstr "" - -#: src/filed/backup.c:1308 -#, c-format -msgid "Compression LZO error: %d\n" -msgstr "" - -#: src/filed/backup.c:1518 -#, c-format -msgid "VSS Writer (BackupComplete): %s\n" -msgstr "" - -#: src/filed/bfdjson.c:68 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bfdjson [-c config_file] [-d debug_level]\n" -" -r get resource type \n" -" -n get resource \n" -" -l get only directives matching dirs (use with -r)\n" -" -D get only data\n" -" -c use as configuration file\n" -" -d set debug level to \n" -" -dt print a timestamp in debug output\n" -" -t test configuration file and exit\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"Автор Nicolas Boichat (2004)\n" -"\n" -"Версія: %s (%s) %s %s %s\n" -"\n" -"Використання: tray-monitor [-c config_file] [-d debug_level]\n" -" -c задати конфігураційний файл \n" -" -d встановити рівень відлагоджування у \n" -" -dt виводити часову мітку у даних відлагоджування\n" -" -t перевірка - прогитати конфігурацію і завершити\n" -" -? показати це повідомлення.\n" -"\n" - -#: src/filed/bfdjson.c:463 src/filed/filed.c:328 -#, c-format -msgid "" -"No File daemon resource defined in %s\n" -"Without that I don't know who I am :-(\n" -msgstr "" - -#: src/filed/bfdjson.c:468 src/filed/filed.c:333 -#, c-format -msgid "Only one Client resource permitted in %s\n" -msgstr "" - -#: src/filed/bfdjson.c:492 src/filed/filed.c:388 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"File daemon in %s.\n" -msgstr "" - -#: src/filed/bfdjson.c:504 src/filed/filed.c:423 -#, c-format -msgid "" -"\"PKI Key Pair\" must be defined for File daemon \"%s\" in %s if either " -"\"PKI Sign\" or \"PKI Encrypt\" are enabled.\n" -msgstr "" - -#: src/filed/bfdjson.c:517 src/filed/filed.c:538 -#, c-format -msgid "No Director resource defined in %s\n" -msgstr "" - -#: src/filed/crypto.c:37 -msgid "Encrypting sparse or offset data not supported.\n" -msgstr "" - -#: src/filed/crypto.c:44 -msgid "Failed to initialize encryption context.\n" -msgstr "" - -#: src/filed/crypto.c:117 -#, c-format -msgid "%s signature digest initialization failed\n" -msgstr "" - -#: src/filed/crypto.c:147 -#, fuzzy -msgid "Unsupported cipher on this system.\n" -msgstr "Цей тип відбитку не підтримується: %d\n" - -#: src/filed/crypto.c:153 src/filed/crypto.c:162 -msgid "An error occurred while encrypting the stream.\n" -msgstr "" - -#: src/filed/crypto.c:225 -msgid "Failed to allocate memory for crypto signature.\n" -msgstr "" - -#: src/filed/crypto.c:230 -#, fuzzy -msgid "An error occurred while adding signer the stream.\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/filed/crypto.c:236 src/filed/crypto.c:251 -msgid "An error occurred while signing the stream.\n" -msgstr "" - -#: src/filed/crypto.c:275 -msgid "An error occurred finalizing signing the stream.\n" -msgstr "" - -#: src/filed/dedupfiled.c:88 -#, c-format -msgid "Quarantine, got ACK for unknown block #%08x\n" -msgstr "" - -#: src/filed/dedupfiled.c:100 -#, c-format -msgid "Quarantine, got request for unknown block #%08x\n" -msgstr "" - -#: src/filed/dedupfiled.c:130 -#, c-format -msgid "Quarantine, got unexpected command %d len=%d \"%s\" \n" -msgstr "" - -#: src/filed/dedupfiled.c:332 -#, c-format -msgid "DEDUP SD didn't found #%08x, use zeroes instead\n" -msgstr "" - -#: src/filed/dedupfiled.c:338 -#, c-format -msgid "DEDUP got a BNET_CMD_UNK_HASH but don't know the hash #%08x.\n" -msgstr "" - -#: src/filed/dedupfiled.c:368 -#, c-format -msgid "DEDUP got a BNET_CMD_STO_BLOCK but don't know the hash #%08x.\n" -msgstr "" - -#: src/filed/fd_plugins.c:546 src/filed/fd_plugins.c:690 -#, c-format -msgid "Command plugin \"%s\": no type in startBackupFile packet.\n" -msgstr "" - -#: src/filed/fd_plugins.c:559 -#, c-format -msgid "Command plugin \"%s\": no object_name in startBackupFile packet.\n" -msgstr "" - -#: src/filed/fd_plugins.c:572 src/filed/fd_plugins.c:697 -#, c-format -msgid "Command plugin \"%s\": no fname in startBackupFile packet.\n" -msgstr "" - -#: src/filed/fd_plugins.c:771 -msgid "Plugin save packet not found.\n" -msgstr "" - -#: src/filed/fd_plugins.c:906 -#, c-format -msgid "Plugin=%s not found.\n" -msgstr "" - -#: src/filed/fd_plugins.c:973 -#, c-format -msgid "Plugin createFile call failed. Stat=%d file=%s\n" -msgstr "" - -#: src/filed/fd_plugins.c:978 -#, c-format -msgid "Plugin createFile call failed. Returned CF_ERROR file=%s\n" -msgstr "" - -#: src/filed/fd_plugins.c:1008 src/findlib/create_file.c:220 -#, c-format -msgid "Could not create %s: ERR=%s\n" -msgstr "Не вдалось створити %s: ERR=%s\n" - -#: src/filed/fd_plugins.c:1875 -msgid "Command plugin: no fname in baculaCheckChanges packet.\n" -msgstr "" - -#: src/filed/fd_snapshot.c:939 -#, fuzzy, c-format -msgid "Error while creating command string %s.\n" -msgstr "Помилка надсилання Hello до Збирача. ERR=%s\n" - -#: src/filed/fd_snapshot.c:959 -#, c-format -msgid "Error while executing \"%s\" %s. %s %s\n" -msgstr "" - -#: src/filed/fd_snapshot.c:970 -msgid "Unable to parse snapshot command output\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1104 -#, fuzzy, c-format -msgid "Unable to create snapshot record. ERR=%s\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/filed/fd_snapshot.c:1108 -#, fuzzy, c-format -msgid "Unable to create snapshot record, got %s\n" -msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" - -#: src/filed/fd_snapshot.c:1125 -#, fuzzy, c-format -msgid "Unable to delete snapshot record. ERR=%s\n" -msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" - -#: src/filed/fd_snapshot.c:1129 -#, fuzzy, c-format -msgid "Unable to delete snapshot record, got %s\n" -msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" - -#: src/filed/fd_snapshot.c:1153 -#, fuzzy, c-format -msgid "Unable to get snapshot record. ERR=%s\n" -msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" - -#: src/filed/fd_snapshot.c:1157 -#, fuzzy, c-format -msgid "Unable to get snapshot record, got %s\n" -msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" - -#: src/filed/fd_snapshot.c:1162 -#, fuzzy -msgid "Unable to parse command output\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/filed/fd_snapshot.c:1342 -msgid "Un-Quiescing applications\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1354 -msgid "Quiescing applications\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1391 -#, c-format -msgid " Delete Snapshot for %s\n" -msgstr "" - -#: src/filed/fd_snapshot.c:1394 -#, fuzzy, c-format -msgid " Unable to delete snapshot of %s ERR=%s\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/filed/fd_snapshot.c:1430 -#, fuzzy, c-format -msgid " Create Snapshot for %s\n" -msgstr "Не можливо створити теку %s: ERR=%s\n" - -#: src/filed/fd_snapshot.c:1438 -#, fuzzy, c-format -msgid " Unable to create snapshot of %s ERR=%s\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/filed/filed.c:52 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bacula-fd [-f -s] [-c config_file] [-d debug_level]\n" -" -c use as configuration file\n" -" -d [,] set debug level to , debug tags to \n" -" -dt print a timestamp in debug output\n" -" -f run in foreground (for debugging)\n" -" -g groupid\n" -" -k keep readall capabilities\n" -" -m print kaboom output (for debugging)\n" -" -s no signals (for debugging)\n" -" -t test configuration file and exit\n" -" -T set trace on\n" -" -u userid\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Версія: %s (%s) %s %s %s\n" -"\n" -"Використання: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" -" -c set configuration file to file\n" -" -dnn set debug level to nn\n" -" -s без сигналів\n" -" -t перевірка - прочитати конфігурацію і вийти\n" -" -? print this message.\n" -"\n" - -#: src/filed/filed.c:185 -msgid "-k option has no meaning without -u option.\n" -msgstr "" - -#: src/filed/filed.c:361 src/filed/filed.c:560 -#, c-format -msgid "Disable Command \"%s\" not found.\n" -msgstr "" - -#: src/filed/filed.c:412 -msgid "PKI encryption/signing enabled but not compiled into Bacula.\n" -msgstr "" - -#: src/filed/filed.c:435 src/filed/filed.c:466 src/filed/filed.c:516 -msgid "Failed to allocate a new keypair object.\n" -msgstr "" - -#: src/filed/filed.c:439 -#, c-format -msgid "Failed to load public certificate for File daemon \"%s\" in %s.\n" -msgstr "" - -#: src/filed/filed.c:445 -#, c-format -msgid "Failed to load private key for File daemon \"%s\" in %s.\n" -msgstr "" - -#: src/filed/filed.c:475 -#, c-format -msgid "Failed to load private key from file %s for File daemon \"%s\" in %s.\n" -msgstr "" - -#: src/filed/filed.c:482 -#, c-format -msgid "" -"Failed to load trusted signer certificate from file %s for File daemon \"%s" -"\" in %s.\n" -msgstr "" - -#: src/filed/filed.c:522 -#, c-format -msgid "" -"Failed to load master key certificate from file %s for File daemon \"%s\" in " -"%s.\n" -msgstr "" - -#: src/filed/filed_conf.c:200 src/filed/filed_conf.c:224 -#, c-format -msgid "Expected a Cipher Type keyword, got: %s" -msgstr "" - -#: src/filed/hello.c:79 src/stored/hello.c:102 -#, c-format -msgid "Bad Hello command from Director at %s. Len=%d.\n" -msgstr "" - -#: src/filed/hello.c:93 src/stored/hello.c:116 -#, fuzzy, c-format -msgid "Bad Hello command from Director at %s: %s\n" -msgstr "Від'єднуюсь від Керівника %s:%d\n" - -#: src/filed/hello.c:111 -#, fuzzy, c-format -msgid "Connection from unknown Director %s at %s rejected.\n" -msgstr "Від'єднуюсь від Керівника %s:%d\n" - -#: src/filed/hello.c:145 -#, fuzzy -msgid "SD connect failed: Bad Hello command\n" -msgstr "Керівник не прийняв команду Hello\n" - -#: src/filed/hello.c:153 -#, fuzzy, c-format -msgid "SD connect failed: Job name not found: %s\n" -msgstr "Керівник не прийняв команду Hello\n" - -#: src/filed/hello.c:164 -#, fuzzy, c-format -msgid "SD \"%s\" tried to connect two times.\n" -msgstr "Ініціалізація контексту TLS для Консолі невдала \"%s\".\n" - -#: src/filed/hello.c:269 src/filed/hello.c:271 src/stored/hello.c:500 -#: src/stored/hello.c:502 -#, fuzzy, c-format -msgid "Recv caps from SD failed. ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/filed/hello.c:277 src/stored/hello.c:508 -#, c-format -msgid "Bad caps from SD: %s.\n" -msgstr "" - -#: src/filed/hello.c:278 src/stored/hello.c:509 -#, c-format -msgid "Bad caps from SD: %s\n" -msgstr "" - -#: src/filed/job.c:322 -#, fuzzy, c-format -msgid "Command: \"%s\" is disabled.\n" -msgstr "Помилка команди" - -#: src/filed/job.c:491 -#, c-format -msgid "Bad command from %s. Len=%d.\n" -msgstr "" - -#: src/filed/job.c:552 -msgid "2902 Error scanning cancel command.\n" -msgstr "" - -#: src/filed/job.c:556 src/filed/job.c:595 -#, c-format -msgid "2901 Job %s not found.\n" -msgstr "" - -#: src/filed/job.c:566 -#, c-format -msgid "2001 Job \"%s\" marked to be %s.\n" -msgstr "" - -#: src/filed/job.c:589 -#, c-format -msgid "2991 Bad setbandwidth command: %s\n" -msgstr "" - -#: src/filed/job.c:645 -#, c-format -msgid "2991 Bad setdebug command: %s\n" -msgstr "" - -#: src/filed/job.c:695 -#, c-format -msgid "Bad estimate command: %s" -msgstr "" - -#: src/filed/job.c:696 -msgid "2992 Bad estimate command.\n" -msgstr "" - -#: src/filed/job.c:719 -#, c-format -msgid "Bad Job Command: %s" -msgstr "" - -#: src/filed/job.c:759 -#, c-format -msgid "Bad RunBeforeJob command: %s\n" -msgstr "" - -#: src/filed/job.c:760 src/filed/job.c:779 -msgid "2905 Bad RunBeforeJob command.\n" -msgstr "" - -#: src/filed/job.c:790 -msgid "2905 Bad RunBeforeNow command.\n" -msgstr "" - -#: src/filed/job.c:809 -#, c-format -msgid "Bad RunAfter command: %s\n" -msgstr "" - -#: src/filed/job.c:810 -msgid "2905 Bad RunAfterJob command.\n" -msgstr "" - -#: src/filed/job.c:846 -#, c-format -msgid "Bad RunScript command: %s\n" -msgstr "" - -#: src/filed/job.c:847 -msgid "2905 Bad RunScript command.\n" -msgstr "" - -#: src/filed/job.c:902 -#, fuzzy, c-format -msgid "Bad RestoreObject command: %s\n" -msgstr "Погана відповідь на команду Hello: ERR=%s\n" - -#: src/filed/job.c:967 -msgid "2909 Bad RestoreObject command.\n" -msgstr "" - -#: src/filed/job.c:1064 -#, c-format -msgid "Plugin Directory not defined. Cannot use plugin: \"%s\"\n" -msgstr "" - -#: src/filed/job.c:1106 -#, c-format -msgid "Error running program: %s. stat=%d: ERR=%s\n" -msgstr "" - -#: src/filed/job.c:1117 -#, c-format -msgid "Cannot open FileSet input file: %s. ERR=%s\n" -msgstr "" - -#: src/filed/job.c:1271 -#, c-format -msgid "REGEX %s compile error. ERR=%s\n" -msgstr "" - -#: src/filed/job.c:1422 -#, c-format -msgid "Invalid FileSet command: %s\n" -msgstr "" - -#: src/filed/job.c:1708 src/findlib/match.c:205 src/tools/testfind.c:640 -#, c-format -msgid "Unknown include/exclude option: %c\n" -msgstr "Не зрозуміла опція параметру include/exclude: %c\n" - -#: src/filed/job.c:1862 -#, c-format -msgid "" -"DIR and FD clocks differ by %lld seconds, FD automatically compensating.\n" -msgstr "" - -#: src/filed/job.c:1871 -#, c-format -msgid "Unknown backup level: %s\n" -msgstr "" - -#: src/filed/job.c:1884 -#, c-format -msgid "Bad level command: %s\n" -msgstr "" - -#: src/filed/job.c:1906 -#, c-format -msgid "Bad session command: %s" -msgstr "" - -#: src/filed/job.c:1965 src/stored/dircmd.c:348 -#, c-format -msgid "Bad storage command: %s" -msgstr "" - -#: src/filed/job.c:1993 src/stored/dircmd.c:370 -#, c-format -msgid "Failed to connect to Storage daemon: %s:%d\n" -msgstr "" - -#: src/filed/job.c:2034 -#, fuzzy -msgid "Failed connect from Storage daemon. SD bsock=NULL.\n" -msgstr "Відкриті з'єднання із Зберігачем.\n" - -#: src/filed/job.c:2282 -msgid "ACL support not configured for your machine.\n" -msgstr "" - -#: src/filed/job.c:2286 -msgid "XATTR support not configured for your machine.\n" -msgstr "" - -#: src/filed/job.c:2295 -msgid "Cannot contact Storage daemon\n" -msgstr "" - -#: src/filed/job.c:2314 -#, c-format -msgid "Bad response to append open: %s\n" -msgstr "" - -#: src/filed/job.c:2319 -msgid "Bad response from stored to open command\n" -msgstr "" - -#: src/filed/job.c:2350 -#, fuzzy, c-format -msgid "Generate VSS snapshots. Driver=\"%s\"\n" -msgstr "Не можливо створити теку %s: ERR=%s\n" - -#: src/filed/job.c:2355 -#, fuzzy, c-format -msgid "VSS CreateSnapshots failed. ERR=%s\n" -msgstr "Не можливо створити теку %s: ERR=%s\n" - -#: src/filed/job.c:2361 -#, c-format -msgid "VSS Writer (PrepareForBackup): %s\n" -msgstr "" - -#: src/filed/job.c:2366 -msgid "No drive letters found for generating VSS snapshots.\n" -msgstr "" - -#: src/filed/job.c:2370 -#, c-format -msgid "VSS was not initialized properly. ERR=%s\n" -msgstr "" - -#: src/filed/job.c:2428 -msgid "Append Close with SD failed.\n" -msgstr "" - -#: src/filed/job.c:2433 -#, c-format -msgid "Bad status %d %c returned from Storage Daemon.\n" -msgstr "" - -#: src/filed/job.c:2463 -#, c-format -msgid "2994 Bad verify command: %s\n" -msgstr "" - -#: src/filed/job.c:2478 src/filed/job.c:2519 -#, c-format -msgid "2994 Bad verify level: %s\n" -msgstr "" - -#: src/filed/job.c:2624 -#, c-format -msgid "Bad replace command. CMD=%s\n" -msgstr "" - -#: src/filed/job.c:2650 -#, c-format -msgid "Bad where regexp. where=%s\n" -msgstr "" - -#: src/filed/job.c:2686 -#, c-format -msgid "VSS was not initialized properly. VSS support is disabled. ERR=%s\n" -msgstr "" - -#: src/filed/job.c:2731 -#, c-format -msgid "VSS Writer (RestoreComplete): %s\n" -msgstr "" - -#: src/filed/job.c:2786 -msgid "Improper calling sequence.\n" -msgstr "" - -#: src/filed/job.c:2806 -#, c-format -msgid "Bad response to SD read open: %s\n" -msgstr "" - -#: src/filed/job.c:2811 -msgid "Bad response from stored to read open command\n" -msgstr "" - -#: src/filed/job.c:2900 -#, fuzzy, c-format -msgid "Bad response from SD to %s command. Wanted %s, got len=%ld msg=\"%s\"\n" -msgstr "Невірна відповідь від Збирача на команду Hello: ERR=%s\n" - -#: src/filed/restore.c:99 -#, c-format -msgid "Size of data or stream of %s not correct. Original %s, restored %s.\n" -msgstr "" - -#: src/filed/restore.c:119 -#, c-format -msgid "Invalid length of Finder Info (got %d, not 32)\n" -msgstr "" - -#: src/filed/restore.c:124 -#, fuzzy, c-format -msgid "Could not set Finder Info on %s\n" -msgstr "Не вдалось перевстановити прапорці для файлу %s: ERR=%s\n" - -#: src/filed/restore.c:312 src/filed/restore.c:995 src/stored/bextract.c:696 -#, c-format -msgid "Unknown stream=%d ignored. This shouldn't happen!\n" -msgstr "" - -#: src/filed/restore.c:410 -#, fuzzy -msgid "LZO init failed\n" -msgstr "Невдале встановлення з'єднання TLS\n" - -#: src/filed/restore.c:472 src/filed/verify_vol.c:95 -#, c-format -msgid "Record header scan error: %s\n" -msgstr "" - -#: src/filed/restore.c:482 src/filed/verify_vol.c:105 -#, c-format -msgid "Data record error. ERR=%s\n" -msgstr "" - -#: src/filed/restore.c:486 src/filed/verify_vol.c:109 -#, c-format -msgid "Actual data size %d not same as header %d\n" -msgstr "" - -#: src/filed/restore.c:548 src/stored/bextract.c:436 -#, c-format -msgid "%s stream not supported on this Client.\n" -msgstr "" - -#: src/filed/restore.c:629 -msgid "Unexpected cryptographic session data stream.\n" -msgstr "" - -#: src/filed/restore.c:637 -msgid "" -"No private decryption keys have been defined to decrypt encrypted backup " -"data.\n" -msgstr "" - -#: src/filed/restore.c:648 -msgid "Could not create digest.\n" -msgstr "Не можливо створити відбиток.\n" - -#: src/filed/restore.c:662 -msgid "Missing private key required to decrypt encrypted backup data.\n" -msgstr "" - -#: src/filed/restore.c:665 -msgid "Decrypt of the session key failed.\n" -msgstr "" - -#: src/filed/restore.c:668 -msgid "Signer not found. Decryption failed.\n" -msgstr "" - -#: src/filed/restore.c:671 -#, fuzzy -msgid "Unsupported digest algorithm. Decrypt failed.\n" -msgstr "Відбиток" - -#: src/filed/restore.c:674 -#, fuzzy -msgid "Unsupported encryption algorithm. Decrypt failed.\n" -msgstr "Відбиток" - -#: src/filed/restore.c:678 -#, fuzzy, c-format -msgid "" -"An error=%d occurred while decoding encrypted session data stream: ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/filed/restore.c:747 src/filed/restore.c:795 -#, c-format -msgid "Missing encryption session data stream for %s\n" -msgstr "" - -#: src/filed/restore.c:755 src/filed/restore.c:802 -#, c-format -msgid "Failed to initialize decryption context for %s\n" -msgstr "" - -#: src/filed/restore.c:814 -#, fuzzy, c-format -msgid "Cannot open resource fork for %s.\n" -msgstr "Не вдається відкрити файл %s для виведення. ERR=%s\n" - -#: src/filed/restore.c:956 -msgid "Unexpected cryptographic signature data stream.\n" -msgstr "" - -#: src/filed/restore.c:962 -#, c-format -msgid "Failed to decode message signature for %s\n" -msgstr "" - -#: src/filed/restore.c:1033 -#, c-format -msgid "Encountered %ld acl errors while doing restore\n" -msgstr "" - -#: src/filed/restore.c:1037 -#, c-format -msgid "Encountered %ld xattr errors while doing restore\n" -msgstr "" - -#: src/filed/restore.c:1041 -#, c-format -msgid "" -"%d non-supported data streams and %d non-supported attrib streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1045 -#, c-format -msgid "%d non-supported resource fork streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1048 -#, c-format -msgid "%d non-supported Finder Info streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1051 -#, c-format -msgid "%d non-supported acl streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1054 -#, c-format -msgid "%d non-supported crypto streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1057 -#, c-format -msgid "%d non-supported xattr streams ignored.\n" -msgstr "" - -#: src/filed/restore.c:1136 src/lib/util.c:488 -msgid "None" -msgstr "" - -#: src/filed/restore.c:1140 -msgid "Zlib errno" -msgstr "" - -#: src/filed/restore.c:1142 -msgid "Zlib stream error" -msgstr "" - -#: src/filed/restore.c:1144 -msgid "Zlib data error" -msgstr "" - -#: src/filed/restore.c:1146 -msgid "Zlib memory error" -msgstr "" - -#: src/filed/restore.c:1148 -msgid "Zlib buffer error" -msgstr "" - -#: src/filed/restore.c:1150 -msgid "Zlib version error" -msgstr "" - -#: src/filed/restore.c:1152 src/lib/util.c:832 src/lib/util.c:842 -#: src/lib/util.c:853 src/lib/util.c:860 src/lib/util.c:867 src/lib/util.c:881 -#: src/lib/util.c:891 src/lib/util.c:904 src/lib/util.c:915 -msgid "*none*" -msgstr "" - -#: src/filed/restore.c:1189 -#, c-format -msgid "Missing cryptographic signature for %s\n" -msgstr "" - -#: src/filed/restore.c:1219 src/filed/restore.c:1243 -#, c-format -msgid "Signature validation failed for file %s: ERR=%s\n" -msgstr "" - -#: src/filed/restore.c:1233 -#, c-format -msgid "Digest one file failed for file: %s\n" -msgstr "" - -#: src/filed/restore.c:1264 -#, c-format -msgid "Signature validation failed for %s: %s\n" -msgstr "" - -#: src/filed/restore.c:1290 src/stored/bextract.c:531 -#: src/stored/bextract.c:596 -#, c-format -msgid "Seek to %s error on %s: ERR=%s\n" -msgstr "" - -#: src/filed/restore.c:1331 -#, c-format -msgid "Compressed header version error. Got=0x%x want=0x%x\n" -msgstr "" - -#: src/filed/restore.c:1336 src/stored/bextract.c:625 -#, c-format -msgid "Compressed header size error. comp_len=%d, msglen=%d\n" -msgstr "" - -#: src/filed/restore.c:1359 -#, fuzzy, c-format -msgid "LZO uncompression error on file %s. ERR=%d\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/filed/restore.c:1369 src/stored/bextract.c:660 -#, c-format -msgid "Compression algorithm 0x%x found, but not supported!\n" -msgstr "" - -#: src/filed/restore.c:1394 -#, c-format -msgid "Uncompression error on file %s. ERR=%s\n" -msgstr "" - -#: src/filed/restore.c:1403 src/stored/bextract.c:564 -msgid "GZIP data stream found, but GZIP not configured!\n" -msgstr "" - -#: src/filed/restore.c:1431 -#, c-format -msgid "Write error in Win32 Block Decomposition on %s: %s\n" -msgstr "" - -#: src/filed/restore.c:1439 src/filed/restore.c:1454 -#, fuzzy, c-format -msgid "Write write error on %s: ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/filed/restore.c:1482 -#, c-format -msgid "Wrong write size error at %lld block=%d wanted=%d wrote=%d\n" -msgstr "" - -#: src/filed/restore.c:1486 -#, c-format -msgid "" -"Write write error at %lld block=%d write_len=%d lerror=%d on %s: ERR=%s\n" -msgstr "" - -#: src/filed/restore.c:1543 -msgid "Decryption error\n" -msgstr "" - -#: src/filed/restore.c:1627 -msgid "Logic error: output file should be open\n" -msgstr "" - -#: src/filed/restore.c:1663 -msgid "Logic error: output file should not be open\n" -msgstr "" - -#: src/filed/restore.c:1694 -#, c-format -msgid "Decryption error. buf_len=%d decrypt_len=%d on file %s\n" -msgstr "" - -#: src/filed/status.c:115 -#, c-format -msgid "%s %sVersion: %s (%s) %s %s %s %s\n" -msgstr "" - -#: src/filed/status.c:120 -#, c-format -msgid "Daemon started %s. Jobs: run=%d running=%d.\n" -msgstr "" - -#: src/filed/status.c:182 -#, c-format -msgid "" -" Sizes: boffset_t=%d size_t=%d debug=%s trace=%d mode=%d,%d bwlimit=%skB/s\n" -msgstr "" - -#: src/filed/status.c:239 -#, fuzzy, c-format -msgid "Director connected %sat: %s\n" -msgstr "Керівник від'єднано" - -#: src/filed/status.c:243 -#, c-format -msgid "JobId %d Job %s is running.\n" -msgstr "" - -#: src/filed/status.c:246 -#, c-format -msgid " %s%s %s Job started: %s\n" -msgstr "" - -#: src/filed/status.c:274 -#, c-format -msgid "" -" Files=%s Bytes=%s AveBytes/sec=%s LastBytes/sec=%s Errors=%d\n" -" Bwlimit=%s ReadBytes=%s\n" -msgstr "" - -#: src/filed/status.c:285 -#, c-format -msgid " Files: Restored=%s Expected=%s Completed=%d%%\n" -msgstr "" - -#: src/filed/status.c:290 -#, c-format -msgid " Files: Examined=%s Backed up=%s\n" -msgstr "" - -#: src/filed/status.c:303 -#, c-format -msgid " Processing file: %s\n" -msgstr "" - -#: src/filed/status.c:315 -msgid " SDSocket closed.\n" -msgstr "" - -#: src/filed/status.c:325 -msgid "====\n" -msgstr "" - -#: src/filed/status.c:458 src/filed/status.c:492 -#, c-format -msgid "Bad .status command: %s\n" -msgstr "" - -#: src/filed/status.c:459 -msgid "2900 Bad .status command, missing argument.\n" -msgstr "" - -#: src/filed/status.c:493 -msgid "2900 Bad .status command, wrong argument.\n" -msgstr "" - -#: src/filed/verify.c:40 -#, c-format -msgid "Cannot malloc %d network read buffer\n" -msgstr "" - -#: src/filed/verify.c:110 -#, c-format -msgid " Could not access %s: ERR=%s\n" -msgstr "" - -#: src/filed/verify.c:117 -#, c-format -msgid " Could not follow link %s: ERR=%s\n" -msgstr "" - -#: src/filed/verify.c:124 -#, c-format -msgid " Could not stat %s: ERR=%s\n" -msgstr "" - -#: src/filed/verify.c:133 -#, c-format -msgid " Archive file skipped: %s\n" -msgstr "" - -#: src/filed/verify.c:136 -#, c-format -msgid " Recursion turned off. Directory skipped: %s\n" -msgstr "" - -#: src/filed/verify.c:140 -#, c-format -msgid " File system change prohibited. Directory skipped: %s\n" -msgstr "" - -#: src/filed/verify.c:148 -#, c-format -msgid " Could not open directory %s: ERR=%s\n" -msgstr "" - -#: src/filed/verify.c:153 -#, c-format -msgid " Unknown file type %d: %s\n" -msgstr "" - -#: src/filed/verify.c:197 src/filed/verify_vol.c:205 -#, c-format -msgid "Network error in send to Director: ERR=%s\n" -msgstr "" - -#: src/filed/verify.c:291 -#, c-format -msgid " Cannot open %s: ERR=%s.\n" -msgstr "" - -#: src/filed/verify.c:305 -#, c-format -msgid " Cannot open resource fork for %s: ERR=%s.\n" -msgstr "" - -#: src/filed/verify.c:367 -#, c-format -msgid "Error reading file %s: ERR=%s\n" -msgstr "" - -#: src/filed/verify_vol.c:52 -msgid "Storage command not issued before Verify.\n" -msgstr "" - -#: src/filed/verify_vol.c:142 -#, c-format -msgid "Error scanning record header: %s\n" -msgstr "" - -#: src/filed/win_efs.c:106 -#, c-format -msgid "Restore data %ld bytes too long for Microsoft buffer %ld bytes.\n" -msgstr "" - -#: src/filed/win_efs.c:192 -#, c-format -msgid "Restore data %ld bytes too long for Microsoft buffer %lld bytes.\n" -msgstr "" - -#: src/filed/win_efs.c:227 -#, fuzzy, c-format -msgid "WriteEncryptedFileRaw failure: ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/filed/xattr.c:235 -#, c-format -msgid "Illegal xattr stream, no XATTR_MAGIC on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:249 -#, c-format -msgid "Illegal xattr stream, xattr name length <= 0 on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:371 src/filed/xattr.c:407 -#, fuzzy, c-format -msgid "llistea error on file \"%s\": ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/filed/xattr.c:457 src/filed/xattr.c:511 -#, fuzzy, c-format -msgid "lgetea error on file \"%s\": ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/filed/xattr.c:547 src/filed/xattr.c:869 src/filed/xattr.c:1344 -#: src/filed/xattr.c:1812 src/filed/xattr.c:2169 src/filed/xattr.c:2961 -#, c-format -msgid "Xattr stream on file \"%s\" exceeds maximum size of %d bytes\n" -msgstr "" - -#: src/filed/xattr.c:567 src/filed/xattr.c:895 src/filed/xattr.c:1364 -#: src/filed/xattr.c:1842 src/filed/xattr.c:2186 -#, c-format -msgid "Failed to serialize extended attributes on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:634 -#, fuzzy, c-format -msgid "lsetea error on file \"%s\": ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/filed/xattr.c:722 src/filed/xattr.c:760 src/filed/xattr.c:824 -#: src/filed/xattr.c:836 -#, fuzzy, c-format -msgid "attr_list error on file \"%s\": ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/filed/xattr.c:960 -#, c-format -msgid "Received illegal xattr named %s on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:993 src/filed/xattr.c:1003 -#, fuzzy, c-format -msgid "attr_set error on file \"%s\": ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/filed/xattr.c:1153 src/filed/xattr.c:1188 -#, c-format -msgid "llistxattr error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:1256 src/filed/xattr.c:1308 -#, c-format -msgid "lgetxattr error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:1427 -#, c-format -msgid "lsetxattr error on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:1585 src/filed/xattr.c:1620 -#, fuzzy, c-format -msgid "extattr_list_link error on file \"%s\": ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/filed/xattr.c:1640 -#, c-format -msgid "Failed to convert %d into namespace on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:1720 src/filed/xattr.c:1775 -#, fuzzy, c-format -msgid "extattr_get_link error on file \"%s\": ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/filed/xattr.c:1899 -#, c-format -msgid "Failed to split %s into namespace and name part on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:1912 -#, c-format -msgid "Failed to convert %s into namespace on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:1933 -#, fuzzy, c-format -msgid "extattr_set_link error on file \"%s\": ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/filed/xattr.c:2036 src/filed/xattr.c:2061 -#, fuzzy, c-format -msgid "getproplist error on file \"%s\": ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/filed/xattr.c:2255 -#, c-format -msgid "Unable create proper proplist to restore xattrs on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:2284 -#, fuzzy, c-format -msgid "setproplist error on file \"%s\": ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/filed/xattr.c:2602 src/filed/xattr.c:2655 -#, c-format -msgid "Unable to get acl on xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:2672 -#, c-format -msgid "Unable to get acl text on xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:2746 -#, c-format -msgid "Unable to get status on xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:2879 -#, c-format -msgid "Unable to open xattr %s on \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:2902 -#, c-format -msgid "Unable to read symlin %s on \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:2977 -#, c-format -msgid "Unable to read content of xattr %s on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:3017 -#, c-format -msgid "Unable to chdir to xattr space of file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3074 src/filed/xattr.c:3323 -#, c-format -msgid "Unable to open file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3102 src/filed/xattr.c:3384 -#, c-format -msgid "Unable to open xattr space %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3118 src/filed/xattr.c:3348 -#, c-format -msgid "Unable to chdir to xattr space on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3139 -#, c-format -msgid "Unable to list the xattr space on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3231 -#, c-format -msgid "Unable to convert acl from text on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:3241 src/filed/xattr.c:3264 -#, c-format -msgid "Unable to restore acl of xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3337 -#, c-format -msgid "Unable to open xattr space on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3367 src/filed/xattr.c:3529 -#, c-format -msgid "Unable to open xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3401 -#, c-format -msgid "Unable to chdir to xattr space %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3441 -#, c-format -msgid "Unable to mkfifo xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3459 -#, c-format -msgid "Unable to mknod xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3477 -#, c-format -msgid "Unable to mkdir xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3497 -#, c-format -msgid "Unable to link xattr %s to %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3550 -#, c-format -msgid "" -"Unable to restore data of xattr %s on file \"%s\": Not all data available in " -"xattr stream\n" -msgstr "" - -#: src/filed/xattr.c:3563 -#, c-format -msgid "Unable to restore data of xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3586 -#, c-format -msgid "Unable to symlink xattr %s to %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3622 -#, c-format -msgid "Unable to restore owner of xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3650 -#, c-format -msgid "Unable to restore filetimes of xattr %s on file \"%s\": ERR=%s\n" -msgstr "" - -#: src/filed/xattr.c:3666 -#, c-format -msgid "Illegal xattr stream, failed to parse xattr stream on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:3727 -#, c-format -msgid "Failed to restore extensible attributes on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:3740 -#, c-format -msgid "Failed to restore extended attributes on file \"%s\"\n" -msgstr "" - -#: src/filed/xattr.c:3909 -#, c-format -msgid "" -"Can't restore Extended Attributes of %s - incompatible xattr stream " -"encountered - %d\n" -msgstr "" - -#: src/findlib/attribs.c:94 src/findlib/attribs.c:131 -#: src/findlib/attribs.c:613 -#, c-format -msgid "Unable to set file owner %s: ERR=%s\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/findlib/attribs.c:105 src/findlib/attribs.c:137 -#, c-format -msgid "Unable to set file modes %s: ERR=%s\n" -msgstr "Не можливо встановити параметри файлу %s: ERR=%s\n" - -#: src/findlib/attribs.c:124 src/findlib/attribs.c:149 -#, c-format -msgid "Unable to set file times %s: ERR=%s\n" -msgstr "Не можливо встановити час файлу %s: ERR=%s\n" - -#: src/findlib/attribs.c:590 -#, c-format -msgid "File size of restored file %s not correct. Original %s, restored %s.\n" -msgstr "" -"Не правильний розмір відновленого файлу %s. Оригінальний %s, відновлений " -"%s.\n" - -#: src/findlib/attribs.c:633 -#, c-format -msgid "Unable to set file flags %s: ERR=%s\n" -msgstr "Не можливо встановити прапорці файлу %s: ERR=%s\n" - -#: src/findlib/attribs.c:920 -#, c-format -msgid "Error in %s file %s: ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/findlib/attribs.c:942 -#, c-format -msgid "Error in %s: ERR=%s\n" -msgstr "Помилка у %s: ERR=%s\n" - -#: src/findlib/bfile.c:86 -msgid "Unix attributes" -msgstr "Атрибули Unix" - -#: src/findlib/bfile.c:88 -msgid "File data" -msgstr "Дата файлу" - -#: src/findlib/bfile.c:90 -msgid "MD5 digest" -msgstr "Відбиток MD5" - -#: src/findlib/bfile.c:92 -msgid "GZIP data" -msgstr "Дані, запаковані GZIP" - -#: src/findlib/bfile.c:94 -#, fuzzy -msgid "Compressed data" -msgstr "Замало даних" - -#: src/findlib/bfile.c:96 -msgid "Extended attributes" -msgstr "Додаткові атрибути" - -#: src/findlib/bfile.c:98 -msgid "Sparse data" -msgstr "Замало даних" - -#: src/findlib/bfile.c:100 -msgid "GZIP sparse data" -msgstr "Замало даних GZIP " - -#: src/findlib/bfile.c:102 -#, fuzzy -msgid "Compressed sparse data" -msgstr "Замало даних GZIP " - -#: src/findlib/bfile.c:104 -msgid "Program names" -msgstr "Назви програми" - -#: src/findlib/bfile.c:106 -msgid "Program data" -msgstr "Програмні дані" - -#: src/findlib/bfile.c:108 -msgid "SHA1 digest" -msgstr "Відбиток HA1" - -#: src/findlib/bfile.c:110 -msgid "Win32 data" -msgstr "Дані Win32" - -#: src/findlib/bfile.c:112 -msgid "Win32 GZIP data" -msgstr "Дані Win32 GZIP" - -#: src/findlib/bfile.c:114 -#, fuzzy -msgid "Win32 compressed data" -msgstr "Дані Win32" - -#: src/findlib/bfile.c:116 -msgid "MacOS Fork data" -msgstr "Дані MacOS Fork" - -#: src/findlib/bfile.c:118 -msgid "HFS+ attribs" -msgstr "Атрибути HFS+" - -#: src/findlib/bfile.c:120 -msgid "Standard Unix ACL attribs" -msgstr "Стандартні атрибути Unix ACL" - -#: src/findlib/bfile.c:122 -msgid "Default Unix ACL attribs" -msgstr "Звичійні атрибути Unix ACL" - -#: src/findlib/bfile.c:124 -msgid "SHA256 digest" -msgstr "Відбиток SHA256" - -#: src/findlib/bfile.c:126 -msgid "SHA512 digest" -msgstr "Відбиток SHA512" - -#: src/findlib/bfile.c:128 -msgid "Signed digest" -msgstr "Підписаний відбиток" - -#: src/findlib/bfile.c:130 -msgid "Encrypted File data" -msgstr "Зашифровані файли" - -#: src/findlib/bfile.c:132 -msgid "Encrypted Win32 data" -msgstr "Зашифровані дані Win32" - -#: src/findlib/bfile.c:134 -msgid "Encrypted session data" -msgstr "Зашифровані дані сесій" - -#: src/findlib/bfile.c:136 -msgid "Encrypted GZIP data" -msgstr "Зашифровані дані GZIP" - -#: src/findlib/bfile.c:138 -#, fuzzy -msgid "Encrypted compressed data" -msgstr "Зашифровані дані сесій" - -#: src/findlib/bfile.c:140 -msgid "Encrypted Win32 GZIP data" -msgstr "Зашифровані дані Win32 GZIP" - -#: src/findlib/bfile.c:142 -#, fuzzy -msgid "Encrypted Win32 Compressed data" -msgstr "Зашифровані дані Win32" - -#: src/findlib/bfile.c:144 -msgid "Encrypted MacOS fork data" -msgstr "Зашифровані дані MacOS Fork " - -#: src/findlib/bfile.c:146 -msgid "Plugin Name" -msgstr "" - -#: src/findlib/bfile.c:148 -msgid "Plugin Data" -msgstr "" - -#: src/findlib/bfile.c:150 -msgid "Restore Object" -msgstr "" - -#: src/findlib/bfile.c:152 -#, fuzzy -msgid "AIX ACL attribs" -msgstr "Специфічні атрибути AIX ACL" - -#: src/findlib/bfile.c:154 -#, fuzzy -msgid "Darwin ACL attribs" -msgstr "Специфічні атрибути Darwin ACL" - -#: src/findlib/bfile.c:156 -#, fuzzy -msgid "FreeBSD Default ACL attribs" -msgstr "Специфічні атрибути FreeBSD Default ACL" - -#: src/findlib/bfile.c:158 -#, fuzzy -msgid "FreeBSD Access ACL attribs" -msgstr "Специфічні атрибути FreeBSD Access ACL" - -#: src/findlib/bfile.c:160 -#, fuzzy -msgid "HPUX ACL attribs" -msgstr "Специфічні атрибути HPUX ACL" - -#: src/findlib/bfile.c:162 -#, fuzzy -msgid "Irix Default ACL attribs" -msgstr "Специфічні атрибути Irix Default ACL" - -#: src/findlib/bfile.c:164 -#, fuzzy -msgid "Irix Access ACL attribs" -msgstr "Специфічні атрибути Irix Access ACL" - -#: src/findlib/bfile.c:166 -#, fuzzy -msgid "Linux Default ACL attribs" -msgstr "Специфічні атрибути Linux Default ACL" - -#: src/findlib/bfile.c:168 -#, fuzzy -msgid "Linux Access ACL attribs" -msgstr "Специфічні атрибути Linux Access ACL" - -#: src/findlib/bfile.c:170 -#, fuzzy -msgid "TRU64 Default ACL attribs" -msgstr "Специфічні атрибути Irix Default ACL" - -#: src/findlib/bfile.c:172 -#, fuzzy -msgid "TRU64 Access ACL attribs" -msgstr "Специфічні атрибути Irix Access ACL" - -#: src/findlib/bfile.c:174 -#, fuzzy -msgid "Solaris POSIX ACL attribs" -msgstr "Специфічні атрибути Solaris ACL" - -#: src/findlib/bfile.c:176 -#, fuzzy -msgid "Solaris NFSv4/ZFS ACL attribs" -msgstr "Специфічні атрибути Solaris ACL" - -#: src/findlib/bfile.c:178 -#, fuzzy -msgid "AFS ACL attribs" -msgstr "Специфічні атрибути AIX ACL" - -#: src/findlib/bfile.c:180 -#, fuzzy -msgid "AIX POSIX ACL attribs" -msgstr "Специфічні атрибути AIX ACL" - -#: src/findlib/bfile.c:182 -#, fuzzy -msgid "AIX NFSv4 ACL attribs" -msgstr "Специфічні атрибути AIX ACL" - -#: src/findlib/bfile.c:184 -#, fuzzy -msgid "FreeBSD NFSv4/ZFS ACL attribs" -msgstr "Специфічні атрибути FreeBSD Access ACL" - -#: src/findlib/bfile.c:186 -#, fuzzy -msgid "GNU Hurd Default ACL attribs" -msgstr "Специфічні атрибути Irix Default ACL" - -#: src/findlib/bfile.c:188 -#, fuzzy -msgid "GNU Hurd Access ACL attribs" -msgstr "Специфічні атрибути Irix Access ACL" - -#: src/findlib/bfile.c:190 -#, fuzzy -msgid "GNU Hurd Extended attribs" -msgstr "Специфічні додаткові атрибути Linux" - -#: src/findlib/bfile.c:192 -#, fuzzy -msgid "IRIX Extended attribs" -msgstr "Специфічні додаткові атрибути Linux" - -#: src/findlib/bfile.c:194 -#, fuzzy -msgid "TRU64 Extended attribs" -msgstr "Специфічні додаткові атрибути Linux" - -#: src/findlib/bfile.c:196 -#, fuzzy -msgid "AIX Extended attribs" -msgstr "Додаткові атрибути" - -#: src/findlib/bfile.c:198 -#, fuzzy -msgid "OpenBSD Extended attribs" -msgstr "Специфічні додаткові атрибути NetBSD" - -#: src/findlib/bfile.c:200 -#, fuzzy -msgid "Solaris Extensible attribs or System Extended attribs" -msgstr "Специфічні додаткові атрибути Solaris" - -#: src/findlib/bfile.c:202 -#, fuzzy -msgid "Solaris Extended attribs" -msgstr "Специфічні додаткові атрибути Solaris" - -#: src/findlib/bfile.c:204 -#, fuzzy -msgid "Darwin Extended attribs" -msgstr "Специфічні додаткові атрибути Darwin" - -#: src/findlib/bfile.c:206 -#, fuzzy -msgid "FreeBSD Extended attribs" -msgstr "Специфічні додаткові атрибути FreeBS" - -#: src/findlib/bfile.c:208 -#, fuzzy -msgid "Linux Extended attribs" -msgstr "Специфічні додаткові атрибути Linux" - -#: src/findlib/bfile.c:210 -#, fuzzy -msgid "NetBSD Extended attribs" -msgstr "Специфічні додаткові атрибути NetBSD" - -#: src/findlib/create_file.c:118 -#, c-format -msgid "File skipped. Not newer: %s\n" -msgstr "Файл пропущено. Не новий: %s\n" - -#: src/findlib/create_file.c:125 -#, c-format -msgid "File skipped. Not older: %s\n" -msgstr "Файл пропущено. Не застарілий: %s\n" - -#: src/findlib/create_file.c:135 -#, c-format -msgid "File skipped. Already exists: %s\n" -msgstr "Файл пропущено. Вже існує: %s\n" - -#: src/findlib/create_file.c:161 -#, c-format -msgid "File %s already exists and could not be replaced. ERR=%s.\n" -msgstr "Файл %s існує та його не вдалось замінити. ERR=%s.\n" - -#: src/findlib/create_file.c:212 src/findlib/create_file.c:276 -#: src/findlib/create_file.c:371 -#, c-format -msgid "bpkt already open fid=%d\n" -msgstr "" - -#: src/findlib/create_file.c:235 -#, c-format -msgid "Cannot make fifo %s: ERR=%s\n" -msgstr "Не можливо створити чергу(fifo) %s: ERR=%s\n" - -#: src/findlib/create_file.c:253 -#, c-format -msgid "Cannot make node %s: ERR=%s\n" -msgstr "Не вдалось створити ноду(node) %s: ERR=%s\n" - -#: src/findlib/create_file.c:299 -#, c-format -msgid "Could not symlink %s -> %s: ERR=%s\n" -msgstr "Не вдалось створити лінку(symlink) %s -> %s: ERR=%s\n" - -#: src/findlib/create_file.c:322 src/findlib/create_file.c:335 -#, c-format -msgid "Could not restore file flags for file %s: ERR=%s\n" -msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" - -#: src/findlib/create_file.c:326 src/findlib/create_file.c:343 -#, c-format -msgid "Could not hard link %s -> %s: ERR=%s\n" -msgstr "Не вдалось створити жорстку лінку(hardlink) %s -> %s: ERR=%s\n" - -#: src/findlib/create_file.c:339 -#, c-format -msgid "Could not reset file flags for file %s: ERR=%s\n" -msgstr "Не вдалось перевстановити прапорці для файлу %s: ERR=%s\n" - -#: src/findlib/create_file.c:395 -#, c-format -msgid "Original file %s have been deleted: type=%d\n" -msgstr "Оригінальний файл %s було видалено: тип=%d\n" - -#: src/findlib/create_file.c:407 -#, c-format -msgid "Original file %s not saved: type=%d\n" -msgstr "Оригінальний файл %s не збережено: тип=%d\n" - -#: src/findlib/create_file.c:410 -#, c-format -msgid "Unknown file type %d; not restored: %s\n" -msgstr "Невідомий тип файлу %d: не відновлено: %s\n" - -#: src/findlib/create_file.c:455 -#, c-format -msgid "Zero length filename: %s\n" -msgstr "Пуста назва файлу: %s\n" - -#: src/findlib/enable_priv.c:81 -msgid "AdjustTokenPrivileges set " -msgstr "" - -#: src/findlib/find.c:185 -#, c-format -msgid "Plugin: \"%s\" not found.\n" -msgstr "" - -#: src/findlib/find_one.c:223 -#, c-format -msgid " NODUMP flag set - will not process %s\n" -msgstr "" - -#: src/findlib/find_one.c:244 -#, c-format -msgid "Cannot stat file %s: ERR=%s\n" -msgstr "" - -#: src/findlib/find_one.c:249 -#, c-format -msgid "%s mtime changed during backup.\n" -msgstr "%s mtime змінився під час резервування.\n" - -#: src/findlib/find_one.c:256 -#, c-format -msgid "%s ctime changed during backup.\n" -msgstr "%s ctime змінився під час резервування.\n" - -#: src/findlib/find_one.c:263 -#, fuzzy, c-format -msgid "%s size of %lld changed during backup to %lld.n" -msgstr "%s розмір змінився під час резервування.\n" - -#: src/findlib/find_one.c:391 -#, c-format -msgid "Top level directory \"%s\" has unlisted fstype \"%s\"\n" -msgstr "Вища тека \"%s\" має незрозумілий тип файлової системи \"%s\"\n" - -#: src/findlib/find_one.c:406 -#, c-format -msgid "Top level directory \"%s\" has an unlisted drive type \"%s\"\n" -msgstr "Вища тека \"%s\" має незрозумілий тип пристрою \"%s\"\n" - -#: src/findlib/mkpath.c:137 src/stored/dedupengine.c:250 -#, c-format -msgid "Cannot create directory %s: ERR=%s\n" -msgstr "Не можливо створити теку %s: ERR=%s\n" - -#: src/findlib/mkpath.c:141 src/findlib/mkpath.c:217 -#: src/stored/dedupengine.c:254 -#, c-format -msgid "%s exists but is not a directory.\n" -msgstr "%s існує, але не є текою.\n" - -#: src/findlib/mkpath.c:153 -#, c-format -msgid "Security problem!! We created directory %s, but it is a link.\n" -msgstr "" - -#: src/findlib/mkpath.c:179 -#, c-format -msgid "Cannot change owner and/or group of %s: ERR=%s\n" -msgstr "Не можливо змінити власника та/або групу для %s: ERR=%s\n" - -#: src/findlib/mkpath.c:184 -#, c-format -msgid "Cannot change permissions of %s: ERR=%s\n" -msgstr "Не можливо змінити дозволи для %s: ERR=%s\n" - -#: src/findlib/mkpath.c:254 -#, c-format -msgid "%c: is not a valid drive.\n" -msgstr "%c: не вірний пристрій.\n" - -#: src/findlib/mkpath.c:298 -msgid "Too many subdirectories. Some permissions not reset.\n" -msgstr "Забагато підтек. Деякі обмеження не перевстановлено.\n" - -#: src/findlib/savecwd.c:49 -#, c-format -msgid "Cannot open current directory: ERR=%s\n" -msgstr "Не можливо відкрити поточну теку: ERR=%s\n" - -#: src/findlib/savecwd.c:60 -#, c-format -msgid "Cannot get current directory: ERR=%s\n" -msgstr "Не можливо отримати поточну теку: ERR=%s\n" - -#: src/findlib/savecwd.c:84 src/findlib/savecwd.c:95 -#, c-format -msgid "Cannot reset current directory: ERR=%s\n" -msgstr "Не можливо перевстановити поточну теку: ERR=%s\n" - -#: src/lib/address_conf.c:51 -#, c-format -msgid "Only ipv4 and ipv6 are supported (%d)\n" -msgstr "" - -#: src/lib/address_conf.c:55 -#, c-format -msgid "Only ipv4 is supported (%d)\n" -msgstr "" - -#: src/lib/address_conf.c:178 -#, c-format -msgid "You tried to assign a ipv6 address to an ipv4(%d)\n" -msgstr "" - -#: src/lib/address_conf.c:187 -#, c-format -msgid "You tried to assign an ipv4 address to an ipv6(%d)\n" -msgstr "" - -#: src/lib/address_conf.c:270 -#, c-format -msgid "Can't add default IPv4 address (%s)\n" -msgstr "" - -#: src/lib/address_conf.c:301 -msgid "" -"Old style addresses cannot be mixed with new style. Try removing Port=nnn." -msgstr "" - -#: src/lib/address_conf.c:323 -#, c-format -msgid "Cannot resolve service(%s)" -msgstr "" - -#: src/lib/address_conf.c:333 -#, c-format -msgid "Cannot resolve hostname(%s) %s" -msgstr "" - -#: src/lib/address_conf.c:441 src/lib/address_conf.c:474 -#, c-format -msgid "Expected a block to begin with { but got: %s" -msgstr "" - -#: src/lib/address_conf.c:446 -msgid "Empty addr block is not allowed" -msgstr "" - -#: src/lib/address_conf.c:450 -#, c-format -msgid "Expected a string but got: %s" -msgstr "" - -#: src/lib/address_conf.c:461 -#, c-format -msgid "Expected a string [ip|ipv4|ipv6] but got: %s" -msgstr "" - -#: src/lib/address_conf.c:465 -#, c-format -msgid "Expected a string [ip|ipv4] but got: %s" -msgstr "" - -#: src/lib/address_conf.c:470 -#, c-format -msgid "Expected an equal = but got: %s" -msgstr "" - -#: src/lib/address_conf.c:481 -#, c-format -msgid "Expected an identifier [addr|port] but got: %s" -msgstr "" - -#: src/lib/address_conf.c:486 -msgid "Only one port per address block" -msgstr "" - -#: src/lib/address_conf.c:492 -msgid "Only one addr per address block" -msgstr "" - -#: src/lib/address_conf.c:496 -#, c-format -msgid "Expected a identifier [addr|port] but got: %s" -msgstr "" - -#: src/lib/address_conf.c:500 -#, c-format -msgid "Expected a equal =, got: %s" -msgstr "" - -#: src/lib/address_conf.c:508 -#, c-format -msgid "Expected a number or a string but got: %s" -msgstr "" - -#: src/lib/address_conf.c:514 -#, c-format -msgid "Expected an IP number or a hostname but got: %s" -msgstr "" - -#: src/lib/address_conf.c:520 -msgid "State machine missmatch" -msgstr "" - -#: src/lib/address_conf.c:526 -#, c-format -msgid "Expected a end of block with } but got: %s" -msgstr "" - -#: src/lib/address_conf.c:532 -#, c-format -msgid "Cannot add hostname(%s) and port(%s) to addrlist (%s)" -msgstr "" - -#: src/lib/address_conf.c:538 -#, c-format -msgid "Expected an end of block with } but got: %s" -msgstr "" - -#: src/lib/address_conf.c:547 -#, c-format -msgid "Expected an IP number or a hostname, got: %s" -msgstr "" - -#: src/lib/address_conf.c:552 src/lib/address_conf.c:566 -#, c-format -msgid "Cannot add port (%s) to (%s)" -msgstr "" - -#: src/lib/address_conf.c:561 -#, c-format -msgid "Expected a port number or string, got: %s" -msgstr "" - -#: src/lib/attr.c:70 -#, c-format -msgid "Error scanning attributes: %s\n" -msgstr "" - -#: src/lib/berrno.c:52 -msgid "Child exited normally." -msgstr "" - -#: src/lib/berrno.c:59 -msgid "Unknown error during program execvp" -msgstr "" - -#: src/lib/berrno.c:62 -#, c-format -msgid "Child exited with code %d" -msgstr "" - -#: src/lib/berrno.c:70 -#, c-format -msgid "Child died from signal %d: %s" -msgstr "" - -#: src/lib/berrno.c:76 -msgid "Invalid errno. No error message possible." -msgstr "" - -#: src/lib/bget_msg.c:90 -msgid "Status OK\n" -msgstr "" - -#: src/lib/bget_msg.c:94 -#, c-format -msgid "bget_msg: unknown signal %d\n" -msgstr "" - -#: src/lib/bnet.c:130 -#, c-format -msgid "Attr spool write error. wrote=%d wanted=%d bytes. ERR=%s\n" -msgstr "" - -#: src/lib/bnet.c:215 src/lib/bnet.c:256 -msgid "TLS connection initialization failed.\n" -msgstr "" - -#: src/lib/bnet.c:223 -msgid "TLS Negotiation failed.\n" -msgstr "" - -#: src/lib/bnet.c:229 src/lib/bnet.c:271 -msgid "" -"TLS certificate verification failed. Peer certificate did not match a " -"required commonName\n" -msgstr "" - -#: src/lib/bnet.c:280 -#, c-format -msgid "" -"TLS host certificate verification failed. Host name \"%s\" did not match " -"presented certificate\n" -msgstr "" - -#: src/lib/bnet.c:297 -msgid "TLS enabled but not configured.\n" -msgstr "" - -#: src/lib/bnet.c:303 -msgid "TLS enable but not configured.\n" -msgstr "" - -#: src/lib/bnet.c:400 -msgid "No problem." -msgstr "" - -#: src/lib/bnet.c:403 -msgid "Authoritative answer for host not found." -msgstr "" - -#: src/lib/bnet.c:406 -msgid "Non-authoritative for host not found, or ServerFail." -msgstr "" - -#: src/lib/bnet.c:409 -msgid "Non-recoverable errors, FORMERR, REFUSED, or NOTIMP." -msgstr "" - -#: src/lib/bnet.c:412 -msgid "Valid name, no data record of resquested type." -msgstr "" - -#: src/lib/bnet.c:415 -msgid "Unknown error." -msgstr "" - -#: src/lib/bnet.c:557 -#, c-format -msgid "Unknown sig %d" -msgstr "" - -#: src/lib/bnet_server.c:99 -#, c-format -msgid "Cannot open stream socket. ERR=%s. Current %s All %s\n" -msgstr "" - -#: src/lib/bnet_server.c:112 -#, c-format -msgid "Cannot set SO_REUSEADDR on socket: %s\n" -msgstr "" - -#: src/lib/bnet_server.c:121 -#, c-format -msgid "Cannot bind port %d: ERR=%s: Retrying ...\n" -msgstr "" - -#: src/lib/bnet_server.c:129 src/lib/bnet_server.c:137 -#, c-format -msgid "Cannot bind port %d: ERR=%s.\n" -msgstr "" - -#: src/lib/bnet_server.c:144 -msgid "No addr/port found to listen on.\n" -msgstr "" - -#: src/lib/bnet_server.c:150 -#, c-format -msgid "Could not init client queue: ERR=%s\n" -msgstr "" - -#: src/lib/bnet_server.c:169 -#, c-format -msgid "Error in select: %s\n" -msgstr "" - -#: src/lib/bnet_server.c:192 -#, c-format -msgid "Connection from %s:%d refused by hosts.access\n" -msgstr "" - -#: src/lib/bnet_server.c:208 src/lib/bsock.c:363 src/lib/bsock.c:402 -#, c-format -msgid "Cannot set SO_KEEPALIVE on socket: %s\n" -msgstr "" - -#: src/lib/bnet_server.c:220 -msgid "Could not create client BSOCK.\n" -msgstr "" - -#: src/lib/bnet_server.c:227 -#, c-format -msgid "Could not add job to client queue: ERR=%s\n" -msgstr "" - -#: src/lib/bnet_server.c:244 -#, c-format -msgid "Could not destroy client queue: ERR=%s\n" -msgstr "" - -#: src/lib/bpipe.c:373 src/lib/bpipe.c:456 -msgid "Program killed by Bacula (timeout)\n" -msgstr "" - -#: src/lib/bsock.c:221 -#, c-format -msgid "" -"Could not connect to %s on %s:%d. ERR=%s\n" -"Retrying ...\n" -msgstr "" - -#: src/lib/bsock.c:227 -#, c-format -msgid "Unable to connect to %s on %s:%d. ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:303 -#, c-format -msgid "gethostbyname() for host \"%s\" failed: ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:334 src/lib/bsock.c:336 -#, c-format -msgid "Socket open error. proto=%d port=%d. ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:349 src/lib/bsock.c:351 -#, c-format -msgid "Source address bind error. proto=%d. ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:371 -#, c-format -msgid "Cannot set TCP_KEEPIDLE on socket: %s\n" -msgstr "" - -#: src/lib/bsock.c:438 -#, fuzzy, c-format -msgid "Could not init bsock read mutex. ERR=%s\n" -msgstr "Не вдалось відкрити%s: ERR=%s\n" - -#: src/lib/bsock.c:444 -#, fuzzy, c-format -msgid "Could not init bsock write mutex. ERR=%s\n" -msgstr "Не вдалось відкрити%s: ERR=%s\n" - -#: src/lib/bsock.c:594 -msgid "Socket is closed\n" -msgstr "" - -#: src/lib/bsock.c:600 -#, c-format -msgid "Socket has errors=%d on call to %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:607 -#, c-format -msgid "Socket is terminated=%d on call to %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:616 -#, c-format -msgid "Socket has insane msglen=%d on call to %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:626 -#, c-format -msgid "Flowcontrol failure on %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:711 -#, c-format -msgid "Write error sending %d bytes to %s:%s:%d: ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:717 -#, c-format -msgid "Wrote %d bytes to %s:%s:%d, but only %d accepted.\n" -msgstr "" - -#: src/lib/bsock.c:818 src/lib/bsock.c:846 src/lib/bsock.c:920 -#: src/lib/bsock.c:963 -#, c-format -msgid "Read expected %d got %d from %s:%s:%d\n" -msgstr "" - -#: src/lib/bsock.c:879 -#, c-format -msgid "Packet size=%d too big from \"%s:%s:%d. Terminating connection.\n" -msgstr "" - -#: src/lib/bsock.c:909 -#, c-format -msgid "Read error from %s:%s:%d: ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:1041 -#, c-format -msgid "fread attr spool error. Wanted=%d got=%d bytes. ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:1059 -msgid "fread attr spool I/O error.\n" -msgstr "" - -#: src/lib/bsock.c:1120 -msgid "Could not malloc BSOCK data buffer\n" -msgstr "" - -#: src/lib/bsock.c:1138 src/lib/bsock.c:1157 -#, c-format -msgid "sockopt error: %s\n" -msgstr "" - -#: src/lib/bsock.c:1144 src/lib/bsock.c:1163 -#, c-format -msgid "Warning network buffer = %d bytes not max size.\n" -msgstr "" - -#: src/lib/bsock.c:1183 src/lib/bsock.c:1217 -#, c-format -msgid "fcntl F_GETFL error. ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:1189 src/lib/bsock.c:1223 src/lib/bsock.c:1255 -#, c-format -msgid "fcntl F_SETFL error. ERR=%s\n" -msgstr "" - -#: src/lib/bsock.c:1470 -#, fuzzy, c-format -msgid "Director authorization error at \"%s:%d\"\n" -msgstr "Проблеми авторизації Директора \"%s:%d\"\n" - -#: src/lib/bsock.c:1477 -#, fuzzy, c-format -msgid "" -"Authorization error: Remote server at \"%s:%d\" did not advertise required " -"TLS support.\n" -msgstr "" -"Проблеми авторизації: Віддалений сервер \"%s:%d\" не повідомляє про " -"необхідність використання TLS.\n" - -#: src/lib/bsock.c:1485 -#, fuzzy, c-format -msgid "" -"Authorization error with Director at \"%s:%d\": Remote server requires TLS.\n" -msgstr "" -"Проблеми авторизації Керівника \"%s:%d\": Віддалений сепвер вимагає TLS.\n" - -#: src/lib/bsock.c:1497 src/qt-console/bcomm/dircomm_auth.cpp:134 -#, c-format -msgid "TLS negotiation failed with Director at \"%s:%d\"\n" -msgstr "Встановлення TLS із Керівником невдале \"%s:%d\"\n" - -#: src/lib/bsock.c:1507 -#, fuzzy, c-format -msgid "" -"Bad errmsg to Hello command: ERR=%s\n" -"The Director at \"%s:%d\" may not be running.\n" -msgstr "" -"Погана відповідь на команду Hello: ERR=%s\n" -"Керівник \"%s:%d\" ймовірно не запущений.\n" - -#: src/lib/bsock.c:1516 src/qt-console/bcomm/dircomm_auth.cpp:155 -#, c-format -msgid "Director at \"%s:%d\" rejected Hello command\n" -msgstr "Керівник \"%s:%d\" відкинув команду Hello\n" - -#: src/lib/bsock.c:1526 -#, fuzzy, c-format -msgid "" -"Authorization error with Director at \"%s:%d\"\n" -"Most likely the passwords do not agree.\n" -"If you are using TLS, there may have been a certificate validation error " -"during the TLS handshake.\n" -"For help, please see: " -msgstr "" -"Проблеми авторизації із Керівником \"%s:%d\"\n" -"Швидше за все, проблема у паролях.\n" -"Якщо Ви використовуєте TLS, можливо, невдала перевірка сертифікату під час " -"TLS handshake.\n" -"Для отримання допомоги, будь ласка, перегляньте http://www.bacula.org/en/rel-" -"manual/Bacula_Freque_Asked_Questi.html#SECTION003760000000000000000.\n" - -#: src/lib/bsys.c:142 -#, fuzzy, c-format -msgid "safe_unlink could not compile regex pattern \"%s\" ERR=%s\n" -msgstr "Не вдалось створити %s: ERR=%s\n" - -#: src/lib/bsys.c:342 src/lib/bsys.c:359 src/lib/bsys.c:383 src/lib/bsys.c:396 -#, c-format -msgid "Out of memory: ERR=%s\n" -msgstr "" - -#: src/lib/bsys.c:438 -msgid "Buffer overflow.\n" -msgstr "" - -#: src/lib/bsys.c:504 -msgid "Bad errno" -msgstr "" - -#: src/lib/bsys.c:519 -#, c-format -msgid "Memset for %d bytes at %s:%d\n" -msgstr "" - -#: src/lib/bsys.c:568 -#, fuzzy, c-format -msgid "Cannot open %s file. %s ERR=%s\n" -msgstr "Не вдалось відкрити%s: ERR=%s\n" - -#: src/lib/bsys.c:585 src/lib/bsys.c:621 -#, c-format -msgid "" -"%s is already running. pid=%d\n" -"Check file %s\n" -msgstr "" - -#: src/lib/bsys.c:601 -#, fuzzy, c-format -msgid "Could not open %s file. %s ERR=%s\n" -msgstr "Не вдалось відкрити%s: ERR=%s\n" - -#: src/lib/bsys.c:624 -#, fuzzy, c-format -msgid "Cannot lock %s file. %s ERR=%s\n" -msgstr "Не вдалось відкрити%s: ERR=%s\n" - -#: src/lib/bsys.c:637 -#, fuzzy, c-format -msgid "Cannot not open %s file. %s ERR=%s\n" -msgstr "Не вдалось відкрити%s: ERR=%s\n" - -#: src/lib/bsys.c:769 -#, c-format -msgid "Could not create state file. %s ERR=%s\n" -msgstr "" - -#: src/lib/bsys.c:788 -#, c-format -msgid "Write final hdr error: ERR=%s\n" -msgstr "" - -#: src/lib/btimers.c:254 -msgid "stop_btimer called with NULL btimer_id\n" -msgstr "" - -#: src/lib/cram-md5.c:106 src/lib/cram-md5.c:138 -msgid "1999 Authorization failed.\n" -msgstr "" - -#: src/lib/crypto.c:428 -msgid "Unable to open certificate file" -msgstr "" - -#: src/lib/crypto.c:435 -msgid "Unable to read certificate from file" -msgstr "" - -#: src/lib/crypto.c:441 -msgid "Unable to extract public key from certificate" -msgstr "" - -#: src/lib/crypto.c:448 -msgid "" -"Provided certificate does not include the required subjectKeyIdentifier " -"extension." -msgstr "" - -#: src/lib/crypto.c:455 -#, c-format -msgid "Unsupported key type provided: %d\n" -msgstr "" - -#: src/lib/crypto.c:492 src/lib/crypto.c:540 -msgid "Unable to open private key file" -msgstr "" - -#: src/lib/crypto.c:522 src/lib/crypto.c:556 -msgid "Unable to read private key from file" -msgstr "" - -#: src/lib/crypto.c:615 -#, c-format -msgid "Unsupported digest type: %d\n" -msgstr "Цей тип відбитку не підтримується: %d\n" - -#: src/lib/crypto.c:629 -msgid "OpenSSL digest initialization failed" -msgstr "Відбиток" - -#: src/lib/crypto.c:643 -msgid "OpenSSL digest update failed" -msgstr "Відбиток" - -#: src/lib/crypto.c:661 -msgid "OpenSSL digest finalize failed" -msgstr "Відбиток" - -#: src/lib/crypto.c:759 -msgid "OpenSSL digest_new failed" -msgstr "" - -#: src/lib/crypto.c:765 -msgid "OpenSSL sign get digest failed" -msgstr "Відбиток" - -#: src/lib/crypto.c:804 src/lib/crypto.c:808 -msgid "OpenSSL digest Verify final failed" -msgstr "Відбиток" - -#: src/lib/crypto.c:813 -msgid "No signers found for crypto verify.\n" -msgstr "" - -#: src/lib/crypto.c:874 -msgid "Signature creation failed" -msgstr "" - -#: src/lib/crypto.c:952 -msgid "Signature decoding failed" -msgstr "" - -#: src/lib/crypto.c:1029 -msgid "Unsupported cipher type specified\n" -msgstr "" - -#: src/lib/crypto.c:1178 -msgid "CryptoData decoding failed" -msgstr "" - -#: src/lib/crypto.c:1222 -msgid "Failure decrypting the session key" -msgstr "" - -#: src/lib/crypto.c:1273 -#, c-format -msgid "Unsupported contentEncryptionAlgorithm: %d\n" -msgstr "" - -#: src/lib/crypto.c:1283 src/lib/crypto.c:1289 -msgid "OpenSSL cipher context initialization failed" -msgstr "" - -#: src/lib/crypto.c:1296 -msgid "Encryption session provided an invalid symmetric key" -msgstr "" - -#: src/lib/crypto.c:1302 -msgid "Encryption session provided an invalid IV" -msgstr "" - -#: src/lib/crypto.c:1308 -msgid "OpenSSL cipher context key/IV initialization failed" -msgstr "" - -#: src/lib/crypto.c:1407 -#, c-format -msgid "Unsupported digest type=%d specified\n" -msgstr "Заданий тип відбитку=%d не підтримується\n" - -#: src/lib/crypto.c:1427 -#, c-format -msgid "SHA1Update() returned an error: %d\n" -msgstr "" - -#: src/lib/crypto.c:1566 -msgid "No error" -msgstr "" - -#: src/lib/crypto.c:1568 -msgid "Signer not found" -msgstr "" - -#: src/lib/crypto.c:1570 -msgid "Recipient not found" -msgstr "" - -#: src/lib/crypto.c:1572 -msgid "Unsupported digest algorithm" -msgstr "Відбиток" - -#: src/lib/crypto.c:1574 -msgid "Unsupported encryption algorithm" -msgstr "" - -#: src/lib/crypto.c:1576 -msgid "Signature is invalid" -msgstr "" - -#: src/lib/crypto.c:1578 -msgid "Decryption error" -msgstr "" - -#: src/lib/crypto.c:1581 -msgid "Internal error" -msgstr "" - -#: src/lib/crypto.c:1583 -msgid "Unknown error" -msgstr "" - -#: src/lib/daemon.c:51 -#, c-format -msgid "Cannot fork to become daemon: ERR=%s\n" -msgstr "" - -#: src/lib/devlock.c:319 -msgid "writeunlock called too many times.\n" -msgstr "" - -#: src/lib/devlock.c:324 -msgid "writeunlock by non-owner.\n" -msgstr "" - -#: src/lib/devlock.c:490 src/lib/rwlock.c:427 -#, c-format -msgid "Thread %d found unchanged elements %d times\n" -msgstr "" - -#: src/lib/devlock.c:558 src/lib/rwlock.c:494 -#, c-format -msgid "%02d: interval %d, writes %d, reads %d\n" -msgstr "" - -#: src/lib/devlock.c:568 src/lib/rwlock.c:504 -#, c-format -msgid "data %02d: value %d, %d writes\n" -msgstr "" - -#: src/lib/devlock.c:573 src/lib/rwlock.c:509 -#, c-format -msgid "Total: %d thread writes, %d data writes\n" -msgstr "" - -#: src/lib/devlock.c:645 src/lib/rwlock.c:581 -msgid "Try write lock" -msgstr "" - -#: src/lib/devlock.c:651 src/lib/rwlock.c:587 -msgid "Try read lock" -msgstr "" - -#: src/lib/devlock.c:705 src/lib/rwlock.c:640 -msgid "Create thread" -msgstr "" - -#: src/lib/devlock.c:715 src/lib/rwlock.c:650 -msgid "Join thread" -msgstr "" - -#: src/lib/devlock.c:717 src/lib/rwlock.c:652 -#, c-format -msgid "%02d: interval %d, updates %d, r_collisions %d, w_collisions %d\n" -msgstr "" - -#: src/lib/devlock.c:729 src/lib/rwlock.c:664 -#, c-format -msgid "data %02d: value %d, %d updates\n" -msgstr "" - -#: src/lib/edit.c:491 -msgid "Empty name not allowed.\n" -msgstr "" - -#: src/lib/edit.c:501 -#, c-format -msgid "Illegal character \"%c\" in name.\n" -msgstr "" - -#: src/lib/edit.c:508 -msgid "Name too long.\n" -msgstr "" - -#: src/lib/ini.c:97 src/lib/ini.c:109 -#, c-format -msgid "" -"Config file error: %s\n" -" : Line %d, col %d of file %s\n" -"%s\n" -msgstr "" - -#: src/lib/ini.c:367 src/lib/ini.c:414 -#, fuzzy, c-format -msgid "Cannot open config file %s: %s\n" -msgstr "Не можливо створити чергу(fifo) %s: ERR=%s\n" - -#: src/lib/ini.c:382 -#, fuzzy -msgid "Cannot open lex\n" -msgstr "Не можливо створити чергу(fifo) %s: ERR=%s\n" - -#: src/lib/jcr.c:221 src/lib/util.c:438 -msgid "Backup" -msgstr "" - -#: src/lib/jcr.c:223 -msgid "Verifying" -msgstr "" - -#: src/lib/jcr.c:225 -msgid "Restoring" -msgstr "" - -#: src/lib/jcr.c:227 -msgid "Archiving" -msgstr "" - -#: src/lib/jcr.c:229 -msgid "Copying" -msgstr "" - -#: src/lib/jcr.c:231 -msgid "Migration" -msgstr "" - -#: src/lib/jcr.c:233 -msgid "Scanning" -msgstr "" - -#: src/lib/jcr.c:235 -msgid "Unknown operation" -msgstr "" - -#: src/lib/jcr.c:244 -msgid "backup" -msgstr "" - -#: src/lib/jcr.c:246 -msgid "verified" -msgstr "" - -#: src/lib/jcr.c:246 -msgid "verify" -msgstr "" - -#: src/lib/jcr.c:248 -msgid "restored" -msgstr "" - -#: src/lib/jcr.c:248 -msgid "restore" -msgstr "" - -#: src/lib/jcr.c:250 -msgid "archived" -msgstr "" - -#: src/lib/jcr.c:250 -msgid "archive" -msgstr "" - -#: src/lib/jcr.c:252 -msgid "copied" -msgstr "" - -#: src/lib/jcr.c:252 -msgid "copy" -msgstr "" - -#: src/lib/jcr.c:254 -msgid "migrated" -msgstr "" - -#: src/lib/jcr.c:254 -msgid "migrate" -msgstr "" - -#: src/lib/jcr.c:256 -msgid "scanned" -msgstr "" - -#: src/lib/jcr.c:256 -msgid "scan" -msgstr "" - -#: src/lib/jcr.c:258 -msgid "unknown action" -msgstr "" - -#: src/lib/jcr.c:310 src/lib/lockmgr.c:305 src/lib/lockmgr.c:780 -#: src/lib/lockmgr.c:808 -#, c-format -msgid "pthread key create failed: ERR=%s\n" -msgstr "" - -#: src/lib/jcr.c:331 -#, c-format -msgid "pthread_once failed. ERR=%s\n" -msgstr "" - -#: src/lib/jcr.c:340 -#, fuzzy, c-format -msgid "Could not init msg_queue mutex. ERR=%s\n" -msgstr "Не вдалось відкрити%s: ERR=%s\n" - -#: src/lib/jcr.c:397 -msgid "NULL jcr.\n" -msgstr "" - -#: src/lib/jcr.c:606 -#, c-format -msgid "pthread_setspecific failed: ERR=%s\n" -msgstr "" - -#: src/lib/jcr.c:1097 -#, c-format -msgid "" -"Watchdog sending kill after %d secs to thread stalled reading Storage " -"daemon.\n" -msgstr "" - -#: src/lib/jcr.c:1109 -#, c-format -msgid "" -"Watchdog sending kill after %d secs to thread stalled reading File daemon.\n" -msgstr "" - -#: src/lib/jcr.c:1121 -#, c-format -msgid "" -"Watchdog sending kill after %d secs to thread stalled reading Director.\n" -msgstr "" - -#: src/lib/lex.c:81 -#, c-format -msgid "Problem probably begins at line %d.\n" -msgstr "" - -#: src/lib/lex.c:86 -#, c-format -msgid "" -"Config error: %s\n" -" : line %d, col %d of file %s\n" -"%s\n" -"%s" -msgstr "" - -#: src/lib/lex.c:90 -#, c-format -msgid "Config error: %s\n" -msgstr "" - -#: src/lib/lex.c:119 -msgid "Close of NULL file\n" -msgstr "" - -#: src/lib/lex.c:273 src/lib/xml.c:149 -msgid "" -"get_char: called after EOF. You may have a open double quote without the " -"closing double quote.\n" -msgstr "" - -#: src/lib/lex.c:333 src/lib/xml.c:192 src/lib/xml.c:205 -#, c-format -msgid "Config token too long, file: %s, line %d, begins at line %d\n" -msgstr "" - -#: src/lib/lex.c:357 -msgid "none" -msgstr "" - -#: src/lib/lex.c:358 -msgid "comment" -msgstr "" - -#: src/lib/lex.c:359 -msgid "number" -msgstr "" - -#: src/lib/lex.c:360 -msgid "ip_addr" -msgstr "" - -#: src/lib/lex.c:361 -msgid "identifier" -msgstr "" - -#: src/lib/lex.c:362 -msgid "string" -msgstr "" - -#: src/lib/lex.c:363 -msgid "quoted_string" -msgstr "" - -#: src/lib/lex.c:364 -msgid "include" -msgstr "" - -#: src/lib/lex.c:365 -msgid "include_quoted_string" -msgstr "" - -#: src/lib/lex.c:366 -msgid "UTF-8 Byte Order Mark" -msgstr "" - -#: src/lib/lex.c:367 -msgid "UTF-16le Byte Order Mark" -msgstr "" - -#: src/lib/lex.c:405 src/lib/lex.c:411 src/lib/lex.c:422 src/lib/lex.c:428 -#, c-format -msgid "expected a positive integer number, got: %s" -msgstr "" - -#: src/lib/lex.c:544 src/lib/xml.c:344 -msgid "" -"This config file appears to be in an unsupported Unicode format (UTF-16be). " -"Please resave as UTF-8\n" -msgstr "" - -#: src/lib/lex.c:690 src/lib/lex.c:718 -#, c-format -msgid "Cannot open included config file %s: %s\n" -msgstr "" - -#: src/lib/lex.c:777 src/lib/lex.c:834 -#, c-format -msgid "expected an integer or a range, got %s: %s" -msgstr "" - -#: src/lib/lex.c:791 src/lib/lex.c:799 src/lib/lex.c:810 src/lib/lex.c:818 -#, c-format -msgid "expected an integer number, got %s: %s" -msgstr "" - -#: src/lib/lex.c:848 -#, c-format -msgid "expected a name, got %s: %s" -msgstr "" - -#: src/lib/lex.c:852 -#, c-format -msgid "name %s length %d too long, max is %d\n" -msgstr "" - -#: src/lib/lex.c:860 -#, c-format -msgid "expected a string, got %s: %s" -msgstr "" - -#: src/lib/lockmgr.c:54 -#, c-format -msgid "ASSERT failed at %s:%i: %s\n" -msgstr "" - -#: src/lib/lockmgr.c:59 -#, c-format -msgid "ASSERT failed at %s:%i: %s \n" -msgstr "" - -#: src/lib/lockmgr.c:65 -#, c-format -msgid "ASSERT failed at %s:%i: %s (%s)\n" -msgstr "" - -#: src/lib/lockmgr.c:96 -#, c-format -msgid "Mutex lock failure. ERR=%s\n" -msgstr "" - -#: src/lib/lockmgr.c:106 -#, c-format -msgid "Mutex unlock failure. ERR=%s\n" -msgstr "" - -#: src/lib/lockmgr.c:792 -#, c-format -msgid "pthread_create failed: ERR=%s\n" -msgstr "" - -#: src/lib/mem_pool.c:103 -#, c-format -msgid "MemPool index %d larger than max %d\n" -msgstr "" - -#: src/lib/mem_pool.c:121 src/lib/mem_pool.c:141 src/lib/mem_pool.c:177 -#: src/lib/mem_pool.c:250 src/lib/mem_pool.c:270 src/lib/mem_pool.c:305 -#: src/lib/mem_pool.c:616 -#, c-format -msgid "Out of memory requesting %d bytes\n" -msgstr "" - -#: src/lib/mem_pool.c:158 -msgid "obuf is NULL\n" -msgstr "" - -#: src/lib/message.c:418 src/lib/message.c:428 -#, c-format -msgid "Could not open console message file %s: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:433 -#, c-format -msgid "Could not get con mutex: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:538 -msgid "Bacula Message" -msgstr "" - -#: src/lib/message.c:542 -#, c-format -msgid "open mail pipe %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:633 -msgid "open mail pipe failed.\n" -msgstr "" - -#: src/lib/message.c:646 -#, c-format -msgid "close error: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:657 -#, c-format -msgid "Mail prog: %s" -msgstr "" - -#: src/lib/message.c:666 -#, c-format -msgid "" -"Mail program terminated in error.\n" -"CMD=%s\n" -"ERR=%s\n" -msgstr "" - -#: src/lib/message.c:773 -#, c-format -msgid "fopen %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/message.c:895 src/lib/message.c:898 -msgid "Msg delivery error: Unable to store data in database.\n" -msgstr "" - -#: src/lib/message.c:950 -#, c-format -msgid "" -"Msg delivery error: Operator mail program terminated in error.\n" -"CMD=%s\n" -"ERR=%s\n" -msgstr "" - -#: src/lib/message.c:971 -#, fuzzy, c-format -msgid "Msg delivery error: fopen %s failed: ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/lib/message.c:1318 -#, c-format -msgid "%s: ABORTING due to ERROR in %s:%d\n" -msgstr "" - -#: src/lib/message.c:1322 -#, c-format -msgid "%s: ERROR TERMINATION at %s:%d\n" -msgstr "" - -#: src/lib/message.c:1327 -#, c-format -msgid "%s: Fatal Error because: " -msgstr "" - -#: src/lib/message.c:1329 -#, c-format -msgid "%s: Fatal Error at %s:%d because:\n" -msgstr "" - -#: src/lib/message.c:1333 -#, c-format -msgid "%s: ERROR: " -msgstr "" - -#: src/lib/message.c:1335 -#, c-format -msgid "%s: ERROR in %s:%d " -msgstr "" - -#: src/lib/message.c:1338 -#, c-format -msgid "%s: Warning: " -msgstr "" - -#: src/lib/message.c:1341 -#, c-format -msgid "%s: Security violation: " -msgstr "" - -#: src/lib/message.c:1430 -#, c-format -msgid "%s ABORTING due to ERROR\n" -msgstr "" - -#: src/lib/message.c:1433 -#, c-format -msgid "%s ERROR TERMINATION\n" -msgstr "" - -#: src/lib/message.c:1436 -#, c-format -msgid "%s JobId %u: Fatal error: " -msgstr "" - -#: src/lib/message.c:1445 -#, c-format -msgid "%s JobId %u: Error: " -msgstr "" - -#: src/lib/message.c:1451 -#, c-format -msgid "%s JobId %u: Warning: " -msgstr "" - -#: src/lib/message.c:1457 -#, c-format -msgid "%s JobId %u: Security violation: " -msgstr "" - -#: src/lib/message.c:1732 -msgid "Debug lock information" -msgstr "" - -#: src/lib/message.c:1733 -msgid "Debug network information" -msgstr "" - -#: src/lib/message.c:1734 -msgid "Debug plugin information" -msgstr "" - -#: src/lib/message.c:1735 -msgid "Debug volume information" -msgstr "" - -#: src/lib/message.c:1736 -msgid "Debug SQL queries" -msgstr "" - -#: src/lib/message.c:1737 -msgid "Debug BVFS queries" -msgstr "" - -#: src/lib/message.c:1738 -msgid "Debug memory allocation" -msgstr "" - -#: src/lib/message.c:1739 -msgid "Debug scheduler information" -msgstr "" - -#: src/lib/message.c:1740 -msgid "Debug protocol information" -msgstr "" - -#: src/lib/message.c:1741 -msgid "Debug dedup information" -msgstr "" - -#: src/lib/message.c:1742 -msgid "Debug snapshots" -msgstr "" - -#: src/lib/message.c:1743 -msgid "Debug dedup engine" -msgstr "" - -#: src/lib/message.c:1744 -msgid "ASX personal's debugging" -msgstr "" - -#: src/lib/message.c:1745 -msgid "Debug all information" -msgstr "" - -#: src/lib/openssl.c:113 src/lib/openssl.c:172 src/stored/dev.c:385 -#: src/stored/dev.c:443 -#, c-format -msgid "Unable to init mutex: ERR=%s\n" -msgstr "" - -#: src/lib/openssl.c:134 src/lib/openssl.c:205 -#, c-format -msgid "Unable to destroy mutex: ERR=%s\n" -msgstr "" - -#: src/lib/openssl.c:273 -#, c-format -msgid "Unable to init OpenSSL threading: ERR=%s\n" -msgstr "" - -#: src/lib/openssl.c:286 -msgid "Failed to seed OpenSSL PRNG\n" -msgstr "" - -#: src/lib/openssl.c:312 -msgid "Failed to save OpenSSL PRNG\n" -msgstr "" - -#: src/lib/parse_conf.c:164 -msgid "***UNKNOWN***" -msgstr "" - -#: src/lib/parse_conf.c:208 -#, c-format -msgid "Attempt to define second %s resource named \"%s\" is not permitted.\n" -msgstr "Спроба визначити другий %s ресурс із назвою \"%s\" не дозволяється.\n" - -#: src/lib/parse_conf.c:214 -#, c-format -msgid "Inserted res: %s index=%d\n" -msgstr "" - -#: src/lib/parse_conf.c:328 src/lib/parse_conf.c:349 -#, c-format -msgid "expected an =, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:358 -#, c-format -msgid "Unknown item code: %d\n" -msgstr "" - -#: src/lib/parse_conf.c:398 -#, c-format -msgid "message type: %s not found" -msgstr "" - -#: src/lib/parse_conf.c:437 -#, c-format -msgid "Attempt to redefine name \"%s\" to \"%s\"." -msgstr "" - -#: src/lib/parse_conf.c:542 -#, c-format -msgid "Attempt to redefine resource \"%s\" referenced on line %d : %s\n" -msgstr "" - -#: src/lib/parse_conf.c:578 -#, c-format -msgid "Too many %s directives. Max. is %d. line %d: %s\n" -msgstr "" - -#: src/lib/parse_conf.c:589 -#, c-format -msgid "Could not find config Resource \"%s\" referenced on line %d : %s\n" -msgstr "" - -#: src/lib/parse_conf.c:657 -#, c-format -msgid "Missing config Resource \"%s\" referenced on line %d : %s\n" -msgstr "" - -#: src/lib/parse_conf.c:732 -#, c-format -msgid "expected a size number, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:737 -#, c-format -msgid "expected a speed number, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:748 -#, c-format -msgid "expected a %s, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:749 -msgid "size" -msgstr "" - -#: src/lib/parse_conf.c:749 -msgid "speed" -msgstr "" - -#: src/lib/parse_conf.c:870 -#, c-format -msgid "Expected a Tape Label keyword, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:939 -#, c-format -msgid "Unable to initialize resource lock. ERR=%s\n" -msgstr "" - -#: src/lib/parse_conf.c:947 -msgid "Config filename too long.\n" -msgstr "" - -#: src/lib/parse_conf.c:971 -#, c-format -msgid "Cannot open config file \"%s\": %s\n" -msgstr "" - -#: src/lib/parse_conf.c:989 -msgid "" -"Currently we cannot handle UTF-16 source files. Please convert the conf file " -"to UTF-8\n" -msgstr "" - -#: src/lib/parse_conf.c:993 -#, c-format -msgid "Expected a Resource name identifier, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:1009 -#, c-format -msgid "expected resource name, got: %s" -msgstr "" - -#: src/lib/parse_conf.c:1020 -#, c-format -msgid "not in resource definition: %s" -msgstr "" - -#: src/lib/parse_conf.c:1051 -#, c-format -msgid "" -"Keyword \"%s\" not permitted in this resource.\n" -"Perhaps you left the trailing brace off of the previous resource." -msgstr "" - -#: src/lib/parse_conf.c:1062 -msgid "Name not specified for resource" -msgstr "" - -#: src/lib/parse_conf.c:1072 -#, c-format -msgid "unexpected token %d %s in resource definition" -msgstr "" - -#: src/lib/parse_conf.c:1078 -#, c-format -msgid "Unknown parser state %d\n" -msgstr "" - -#: src/lib/parse_conf.c:1083 -msgid "End of conf file reached with unclosed resource." -msgstr "" - -#: src/lib/plugins.c:106 -#, c-format -msgid "Failed to open Plugin directory %s: ERR=%s\n" -msgstr "" - -#: src/lib/plugins.c:123 -#, c-format -msgid "Failed to find any plugins in %s\n" -msgstr "" - -#: src/lib/plugins.c:157 -#, fuzzy, c-format -msgid "dlopen plugin %s failed: ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/lib/plugins.c:168 -#, c-format -msgid "Lookup of loadPlugin in plugin %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/plugins.c:177 -#, c-format -msgid "Lookup of unloadPlugin in plugin %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:57 -#, c-format -msgid "Could not find userid=%s: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:63 -#, c-format -msgid "Could not find password entry. ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:76 -#, c-format -msgid "Could not find group=%s: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:84 -#, c-format -msgid "Could not initgroups for group=%s, userid=%s: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:87 -#, c-format -msgid "Could not initgroups for userid=%s: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:94 -#, c-format -msgid "Could not set group=%s: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:104 -#, fuzzy, c-format -msgid "prctl failed: ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/lib/priv.c:108 -#, fuzzy, c-format -msgid "setreuid failed: ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/lib/priv.c:112 -#, c-format -msgid "cap_from_text failed: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:116 -#, c-format -msgid "cap_set_proc failed: ERR=%s\n" -msgstr "" - -#: src/lib/priv.c:120 -msgid "Keep readall caps not implemented this OS or missing libraries.\n" -msgstr "" - -#: src/lib/priv.c:124 -#, c-format -msgid "Could not set specified userid: %s\n" -msgstr "" - -#: src/lib/pythonlib.c:105 -msgid "Could not initialize Python\n" -msgstr "" - -#: src/lib/pythonlib.c:110 -#, c-format -msgid "Could not Run Python string %s\n" -msgstr "" - -#: src/lib/pythonlib.c:122 -msgid "Could not initialize Python Job type.\n" -msgstr "" - -#: src/lib/pythonlib.c:127 -#, c-format -msgid "Could not import Python script %s/%s. Python disabled.\n" -msgstr "" - -#: src/lib/pythonlib.c:229 -msgid "Could not create Python Job Object.\n" -msgstr "" - -#: src/lib/pythonlib.c:242 src/lib/pythonlib.c:266 -#, c-format -msgid "Python function \"%s\" not found.\n" -msgstr "" - -#: src/lib/pythonlib.c:281 -#, c-format -msgid "Unknown Python daemon event %s\n" -msgstr "" - -#: src/lib/pythonlib.c:306 -#, c-format -msgid "Unable to initialize the Python lock. ERR=%s\n" -msgstr "" - -#: src/lib/res.c:54 -#, c-format -msgid "rwl_writelock failure at %s:%d: ERR=%s\n" -msgstr "" - -#: src/lib/res.c:64 -#, c-format -msgid "rwl_writeunlock failure at %s:%d:. ERR=%s\n" -msgstr "" - -#: src/lib/runscript.c:225 -#, c-format -msgid "%s: run %s \"%s\"\n" -msgstr "" - -#: src/lib/runscript.c:234 -#, c-format -msgid "Runscript: %s could not execute. ERR=%s\n" -msgstr "" - -#: src/lib/runscript.c:243 -#, c-format -msgid "%s: %s\n" -msgstr "" - -#: src/lib/runscript.c:248 -#, c-format -msgid "Runscript: %s returned non-zero status=%d. ERR=%s\n" -msgstr "" - -#: src/lib/rwlock.c:291 -msgid "rwl_writeunlock called too many times.\n" -msgstr "" - -#: src/lib/rwlock.c:296 -msgid "rwl_writeunlock by non-owner.\n" -msgstr "" - -#: src/lib/sellist.c:58 -msgid "Negative numbers not permitted.\n" -msgstr "" - -#: src/lib/sellist.c:84 -msgid "User cancel requested.\n" -msgstr "" - -#: src/lib/sellist.c:107 -msgid "Selection items must be be greater than zero.\n" -msgstr "" - -#: src/lib/signal.c:57 -msgid "Invalid signal number" -msgstr "" - -#: src/lib/signal.c:147 src/lib/signal.c:149 -#, c-format -msgid "Bacula interrupted by signal %d: %s\n" -msgstr "" - -#: src/lib/signal.c:165 -#, c-format -msgid "Kaboom! %s, %s got signal %d - %s at %s. Attempting traceback.\n" -msgstr "" - -#: src/lib/signal.c:167 -#, c-format -msgid "Kaboom! exepath=%s\n" -msgstr "" - -#: src/lib/signal.c:208 -#, c-format -msgid "Fork error: ERR=%s\n" -msgstr "" - -#: src/lib/signal.c:216 -#, c-format -msgid "Calling: %s %s %s %s\n" -msgstr "" - -#: src/lib/signal.c:220 -#, c-format -msgid "execv: %s failed: ERR=%s\n" -msgstr "" - -#: src/lib/signal.c:242 -#, c-format -msgid "It looks like the traceback worked...\n" -msgstr "" - -#: src/lib/signal.c:244 -#, c-format -msgid "The btraceback call returned %d\n" -msgstr "" - -#: src/lib/signal.c:304 -#, c-format -msgid "BA_NSIG too small (%d) should be (%d)\n" -msgstr "" - -#: src/lib/signal.c:310 -msgid "UNKNOWN SIGNAL" -msgstr "" - -#: src/lib/signal.c:311 -msgid "Hangup" -msgstr "" - -#: src/lib/signal.c:312 -msgid "Interrupt" -msgstr "" - -#: src/lib/signal.c:313 -msgid "Quit" -msgstr "" - -#: src/lib/signal.c:314 -msgid "Illegal instruction" -msgstr "" - -#: src/lib/signal.c:315 -msgid "Trace/Breakpoint trap" -msgstr "" - -#: src/lib/signal.c:316 -msgid "Abort" -msgstr "" - -#: src/lib/signal.c:318 -msgid "EMT instruction (Emulation Trap)" -msgstr "" - -#: src/lib/signal.c:321 -msgid "IOT trap" -msgstr "" - -#: src/lib/signal.c:323 -msgid "BUS error" -msgstr "" - -#: src/lib/signal.c:324 -msgid "Floating-point exception" -msgstr "" - -#: src/lib/signal.c:325 -msgid "Kill, unblockable" -msgstr "" - -#: src/lib/signal.c:326 -msgid "User-defined signal 1" -msgstr "" - -#: src/lib/signal.c:327 -msgid "Segmentation violation" -msgstr "" - -#: src/lib/signal.c:328 -msgid "User-defined signal 2" -msgstr "" - -#: src/lib/signal.c:329 -msgid "Broken pipe" -msgstr "" - -#: src/lib/signal.c:330 -msgid "Alarm clock" -msgstr "" - -#: src/lib/signal.c:331 -msgid "Termination" -msgstr "" - -#: src/lib/signal.c:333 -msgid "Stack fault" -msgstr "" - -#: src/lib/signal.c:335 -msgid "Child status has changed" -msgstr "" - -#: src/lib/signal.c:336 -msgid "Continue" -msgstr "" - -#: src/lib/signal.c:337 -msgid "Stop, unblockable" -msgstr "" - -#: src/lib/signal.c:338 -msgid "Keyboard stop" -msgstr "" - -#: src/lib/signal.c:339 -msgid "Background read from tty" -msgstr "" - -#: src/lib/signal.c:340 -msgid "Background write to tty" -msgstr "" - -#: src/lib/signal.c:341 -msgid "Urgent condition on socket" -msgstr "" - -#: src/lib/signal.c:342 -msgid "CPU limit exceeded" -msgstr "" - -#: src/lib/signal.c:343 -msgid "File size limit exceeded" -msgstr "" - -#: src/lib/signal.c:344 -msgid "Virtual alarm clock" -msgstr "" - -#: src/lib/signal.c:345 -msgid "Profiling alarm clock" -msgstr "" - -#: src/lib/signal.c:346 -msgid "Window size change" -msgstr "" - -#: src/lib/signal.c:347 -msgid "I/O now possible" -msgstr "" - -#: src/lib/signal.c:349 -msgid "Power failure restart" -msgstr "" - -#: src/lib/signal.c:352 -msgid "No runnable lwp" -msgstr "" - -#: src/lib/signal.c:355 -msgid "SIGLWP special signal used by thread library" -msgstr "" - -#: src/lib/signal.c:358 -msgid "Checkpoint Freeze" -msgstr "" - -#: src/lib/signal.c:361 -msgid "Checkpoint Thaw" -msgstr "" - -#: src/lib/signal.c:364 -msgid "Thread Cancellation" -msgstr "" - -#: src/lib/signal.c:367 -msgid "Resource Lost (e.g. record-lock lost)" -msgstr "" - -#: src/lib/smartall.c:134 src/lib/smartall.c:247 src/lib/smartall.c:262 -msgid "Out of memory\n" -msgstr "" - -#: src/lib/smartall.c:139 -msgid "Too much memory used." -msgstr "" - -#: src/lib/smartall.c:171 -#, c-format -msgid "Attempt to free NULL called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:185 -#, c-format -msgid "in-use bit not set: double free from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:193 -#, c-format -msgid "qp->qnext->qprev != qp called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:197 -#, c-format -msgid "qp->qprev->qnext != qp called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:206 -#, c-format -msgid "Overrun buffer: len=%d addr=%p allocated: %s:%d called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:284 -#, c-format -msgid "sm_realloc size: %d\n" -msgstr "" - -#: src/lib/smartall.c:322 -#, c-format -msgid "sm_realloc %d at %p from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:382 -#, c-format -msgid "" -"\n" -"Orphaned buffers exist. Dump terminated following\n" -" discovery of bad links in chain of orphaned buffers.\n" -" Buffer address with bad links: %p\n" -msgstr "" - -#: src/lib/smartall.c:427 -#, c-format -msgid "Damaged buffer found. Called from %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:460 -#, c-format -msgid "" -"\n" -"Damaged buffers found at %s:%d\n" -msgstr "" - -#: src/lib/smartall.c:463 -msgid " discovery of bad prev link.\n" -msgstr "" - -#: src/lib/smartall.c:466 -msgid " discovery of bad next link.\n" -msgstr "" - -#: src/lib/smartall.c:469 -msgid " discovery of data overrun.\n" -msgstr "" - -#: src/lib/smartall.c:472 -msgid " NULL pointer.\n" -msgstr "" - -#: src/lib/smartall.c:478 -#, c-format -msgid " Buffer address: %p\n" -msgstr "" - -#: src/lib/smartall.c:485 -#, c-format -msgid "Damaged buffer: %6u bytes allocated at line %d of %s %s\n" -msgstr "" - -#: src/lib/status.h:86 -msgid "===================================================================\n" -msgstr "" - -#: src/lib/tls.c:81 -#, c-format -msgid "" -"Error with certificate at depth: %d, issuer = %s, subject = %s, ERR=%d:%s\n" -msgstr "" - -#: src/lib/tls.c:118 -msgid "Error initializing SSL context" -msgstr "" - -#: src/lib/tls.c:139 -msgid "Error loading certificate verification stores" -msgstr "" - -#: src/lib/tls.c:144 -msgid "" -"Either a certificate file or a directory must be specified as a verification " -"store\n" -msgstr "" - -#: src/lib/tls.c:155 -msgid "Error loading certificate file" -msgstr "" - -#: src/lib/tls.c:163 -msgid "Error loading private key" -msgstr "" - -#: src/lib/tls.c:171 -msgid "Unable to open DH parameters file" -msgstr "" - -#: src/lib/tls.c:177 -msgid "Unable to load DH parameters from specified file" -msgstr "" - -#: src/lib/tls.c:181 -msgid "Failed to set TLS Diffie-Hellman parameters" -msgstr "" - -#: src/lib/tls.c:191 -msgid "Error setting cipher list, no valid ciphers available\n" -msgstr "" - -#: src/lib/tls.c:250 -msgid "Peer failed to present a TLS certificate\n" -msgstr "" - -#: src/lib/tls.c:296 src/lib/tls.c:297 -#, c-format -msgid "Peer %s failed to present a TLS certificate\n" -msgstr "" - -#: src/lib/tls.c:429 -msgid "Error creating file descriptor-based BIO" -msgstr "" - -#: src/lib/tls.c:440 -msgid "Error creating new SSL object" -msgstr "" - -#: src/lib/tls.c:509 src/lib/tls.c:532 -msgid "Connect failure" -msgstr "" - -#: src/lib/tls.c:612 src/lib/tls.c:616 -msgid "TLS shutdown failure." -msgstr "" - -#: src/lib/tls.c:677 src/lib/tls.c:703 -msgid "TLS read/write failure." -msgstr "" - -#: src/lib/util.c:259 -msgid "Running" -msgstr "" - -#: src/lib/util.c:262 -msgid "Blocked" -msgstr "" - -#: src/lib/util.c:268 -msgid "Incomplete job" -msgstr "" - -#: src/lib/util.c:275 -msgid "Non-fatal error" -msgstr "" - -#: src/lib/util.c:281 src/lib/util.c:416 -msgid "Canceled" -msgstr "" - -#: src/lib/util.c:284 -msgid "Verify differences" -msgstr "" - -#: src/lib/util.c:287 -msgid "Waiting on FD" -msgstr "" - -#: src/lib/util.c:290 -msgid "Wait on SD" -msgstr "" - -#: src/lib/util.c:293 -msgid "Wait for new Volume" -msgstr "" - -#: src/lib/util.c:296 -msgid "Waiting for mount" -msgstr "" - -#: src/lib/util.c:299 -msgid "Waiting for Storage resource" -msgstr "" - -#: src/lib/util.c:302 -msgid "Waiting for Job resource" -msgstr "" - -#: src/lib/util.c:305 -msgid "Waiting for Client resource" -msgstr "" - -#: src/lib/util.c:308 -msgid "Waiting on Max Jobs" -msgstr "" - -#: src/lib/util.c:311 -msgid "Waiting for Start Time" -msgstr "" - -#: src/lib/util.c:314 -msgid "Waiting on Priority" -msgstr "" - -#: src/lib/util.c:333 -#, c-format -msgid "Unknown Job termination status=%d" -msgstr "" - -#: src/lib/util.c:349 -msgid "Completed successfully" -msgstr "" - -#: src/lib/util.c:352 -msgid "Completed with warnings" -msgstr "" - -#: src/lib/util.c:355 -msgid "Terminated with errors" -msgstr "" - -#: src/lib/util.c:358 -msgid "Fatal error" -msgstr "" - -#: src/lib/util.c:361 -msgid "Created, not yet running" -msgstr "" - -#: src/lib/util.c:364 -msgid "Canceled by user" -msgstr "" - -#: src/lib/util.c:367 -msgid "Verify found differences" -msgstr "" - -#: src/lib/util.c:370 -msgid "Waiting for File daemon" -msgstr "" - -#: src/lib/util.c:373 -msgid "Waiting for Storage daemon" -msgstr "" - -#: src/lib/util.c:376 -msgid "Waiting for higher priority jobs" -msgstr "" - -#: src/lib/util.c:379 -msgid "Batch inserting file records" -msgstr "" - -#: src/lib/util.c:413 -msgid "Fatal Error" -msgstr "" - -#: src/lib/util.c:419 -msgid "Differences" -msgstr "" - -#: src/lib/util.c:422 -msgid "Unknown term code" -msgstr "" - -#: src/lib/util.c:441 -msgid "Migrated Job" -msgstr "" - -#: src/lib/util.c:444 -msgid "Verify" -msgstr "" - -#: src/lib/util.c:447 -msgid "Restore" -msgstr "" - -#: src/lib/util.c:450 -msgid "Console" -msgstr "" - -#: src/lib/util.c:453 -msgid "System or Console" -msgstr "" - -#: src/lib/util.c:456 -msgid "Admin" -msgstr "" - -#: src/lib/util.c:459 src/lib/util.c:549 -msgid "Archive" -msgstr "" - -#: src/lib/util.c:462 -msgid "Job Copy" -msgstr "" - -#: src/lib/util.c:465 -msgid "Copy" -msgstr "" - -#: src/lib/util.c:468 -msgid "Migrate" -msgstr "" - -#: src/lib/util.c:471 -msgid "Scan" -msgstr "" - -#: src/lib/util.c:475 -msgid "Unknown Type" -msgstr "" - -#: src/lib/util.c:485 -msgid "Truncate" -msgstr "" - -#: src/lib/util.c:502 -msgid "Base" -msgstr "" - -#: src/lib/util.c:520 -msgid "Verify Init Catalog" -msgstr "" - -#: src/lib/util.c:529 -msgid "Verify Data" -msgstr "" - -#: src/lib/util.c:532 -msgid "Virtual Full" -msgstr "" - -#: src/lib/util.c:538 -msgid "Unknown Job Level" -msgstr "" - -#: src/lib/util.c:548 -msgid "Append" -msgstr "" - -#: src/lib/util.c:550 -msgid "Disabled" -msgstr "" - -#: src/lib/util.c:552 -msgid "Used" -msgstr "" - -#: src/lib/util.c:553 -msgid "Cleaning" -msgstr "" - -#: src/lib/util.c:554 -msgid "Purged" -msgstr "" - -#: src/lib/util.c:555 -msgid "Recycle" -msgstr "" - -#: src/lib/util.c:556 -msgid "Read-Only" -msgstr "" - -#: src/lib/util.c:568 -msgid "Invalid volume status" -msgstr "" - -#: src/lib/util.c:956 -msgid "Working directory not defined. Cannot continue.\n" -msgstr "" - -#: src/lib/util.c:959 -#, c-format -msgid "Working Directory: \"%s\" not found. Cannot continue.\n" -msgstr "" - -#: src/lib/util.c:963 -#, c-format -msgid "Working Directory: \"%s\" is not a directory. Cannot continue.\n" -msgstr "" - -#: src/lib/var.c:2659 -msgid "everything ok" -msgstr "" - -#: src/lib/var.c:2660 -msgid "incomplete named character" -msgstr "" - -#: src/lib/var.c:2661 -msgid "incomplete hexadecimal value" -msgstr "" - -#: src/lib/var.c:2662 -msgid "invalid hexadecimal value" -msgstr "" - -#: src/lib/var.c:2663 -msgid "octal value too large" -msgstr "" - -#: src/lib/var.c:2664 -msgid "invalid octal value" -msgstr "" - -#: src/lib/var.c:2665 -msgid "incomplete octal value" -msgstr "" - -#: src/lib/var.c:2666 -msgid "incomplete grouped hexadecimal value" -msgstr "" - -#: src/lib/var.c:2667 -msgid "incorrect character class specification" -msgstr "" - -#: src/lib/var.c:2668 -msgid "invalid expansion configuration" -msgstr "" - -#: src/lib/var.c:2669 -msgid "out of memory" -msgstr "" - -#: src/lib/var.c:2670 -msgid "incomplete variable specification" -msgstr "" - -#: src/lib/var.c:2671 -msgid "undefined variable" -msgstr "" - -#: src/lib/var.c:2672 -msgid "input is neither text nor variable" -msgstr "" - -#: src/lib/var.c:2673 -msgid "unknown command character in variable" -msgstr "" - -#: src/lib/var.c:2674 -msgid "malformatted search and replace operation" -msgstr "" - -#: src/lib/var.c:2675 -msgid "unknown flag in search and replace operation" -msgstr "" - -#: src/lib/var.c:2676 -msgid "invalid regex in search and replace operation" -msgstr "" - -#: src/lib/var.c:2677 -msgid "missing parameter in command" -msgstr "" - -#: src/lib/var.c:2678 -msgid "empty search string in search and replace operation" -msgstr "" - -#: src/lib/var.c:2679 -msgid "start offset missing in cut operation" -msgstr "" - -#: src/lib/var.c:2680 -msgid "offsets in cut operation delimited by unknown character" -msgstr "" - -#: src/lib/var.c:2681 -msgid "range out of bounds in cut operation" -msgstr "" - -#: src/lib/var.c:2682 -msgid "offset out of bounds in cut operation" -msgstr "" - -#: src/lib/var.c:2683 -msgid "logic error in cut operation" -msgstr "" - -#: src/lib/var.c:2684 -msgid "malformatted transpose operation" -msgstr "" - -#: src/lib/var.c:2685 -msgid "source and target class mismatch in transpose operation" -msgstr "" - -#: src/lib/var.c:2686 -msgid "empty character class in transpose operation" -msgstr "" - -#: src/lib/var.c:2687 -msgid "incorrect character class in transpose operation" -msgstr "" - -#: src/lib/var.c:2688 -msgid "malformatted padding operation" -msgstr "" - -#: src/lib/var.c:2689 -msgid "width parameter missing in padding operation" -msgstr "" - -#: src/lib/var.c:2690 -msgid "fill string missing in padding operation" -msgstr "" - -#: src/lib/var.c:2691 -msgid "unknown quoted pair in search and replace operation" -msgstr "" - -#: src/lib/var.c:2692 -msgid "sub-matching reference out of range" -msgstr "" - -#: src/lib/var.c:2693 -msgid "invalid argument" -msgstr "" - -#: src/lib/var.c:2694 -msgid "incomplete quoted pair" -msgstr "" - -#: src/lib/var.c:2695 -msgid "lookup function does not support variable arrays" -msgstr "" - -#: src/lib/var.c:2696 -msgid "index of array variable contains an invalid character" -msgstr "" - -#: src/lib/var.c:2697 -msgid "index of array variable is incomplete" -msgstr "" - -#: src/lib/var.c:2698 -msgid "bracket expression in array variable's index not closed" -msgstr "" - -#: src/lib/var.c:2699 -msgid "division by zero error in index specification" -msgstr "" - -#: src/lib/var.c:2700 -msgid "unterminated loop construct" -msgstr "" - -#: src/lib/var.c:2701 -msgid "invalid character in loop limits" -msgstr "" - -#: src/lib/var.c:2702 -msgid "malformed operation argument list" -msgstr "" - -#: src/lib/var.c:2703 -msgid "undefined operation" -msgstr "" - -#: src/lib/var.c:2704 -msgid "formatting failure" -msgstr "" - -#: src/lib/var.c:2713 -msgid "unknown error" -msgstr "" - -#: src/lib/watchdog.c:85 -#, c-format -msgid "Unable to initialize watchdog lock. ERR=%s\n" -msgstr "" - -#: src/lib/watchdog.c:182 -msgid "BUG! register_watchdog called before start_watchdog\n" -msgstr "" - -#: src/lib/watchdog.c:185 -#, c-format -msgid "BUG! Watchdog %p has NULL callback\n" -msgstr "" - -#: src/lib/watchdog.c:188 -#, c-format -msgid "BUG! Watchdog %p has zero interval\n" -msgstr "" - -#: src/lib/watchdog.c:208 -msgid "BUG! unregister_watchdog_unlocked called before start_watchdog\n" -msgstr "" - -#: src/lib/watchdog.c:328 -#, c-format -msgid "rwl_writelock failure. ERR=%s\n" -msgstr "" - -#: src/lib/watchdog.c:343 -#, c-format -msgid "rwl_writeunlock failure. ERR=%s\n" -msgstr "" - -#: src/lib/xml.c:407 -msgid "Malformed XML expecting start of tag.\n" -msgstr "" - -#: src/lib/xml.c:460 -msgid "Bad file start bytes (utf8 bom).\n" -msgstr "" - -#: src/lib/xml.c:472 -msgid "Bad file start bytes (utf16 bom).\n" -msgstr "" - -#: src/plugins/fd/delta-fd.c:1359 -#, c-format -msgid "Can't use replace=ifnewer with Delta plugin on %s\n" -msgstr "" - -#: src/plugins/fd/delta-fd.c:1366 -#, c-format -msgid "Can't use replace=ifolder with Delta plugin on %s\n" -msgstr "" - -#: src/plugins/fd/delta-fd.c:1376 -#, c-format -msgid "" -"Can't restore %s, file already exists. Delta plugin doesn't support " -"replace=never option\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:698 src/plugins/fd/mysql-fd.c:1178 -#: src/plugins/fd/postgresql-fd.c:731 -#, fuzzy, c-format -msgid "Can't run command %s. ERR=%s\n" -msgstr "Не вдалось створити ноду(node) %s: ERR=%s\n" - -#: src/plugins/fd/hvplugin.c:844 -#, fuzzy, c-format -msgid "Can't create working directory %s. ERR=%s\n" -msgstr "Не можливо створити теку %s: ERR=%s\n" - -#: src/plugins/fd/hvplugin.c:864 -#, fuzzy, c-format -msgid "Can't delete working directory %s. ERR=%s\n" -msgstr "Не можливо створити теку %s: ERR=%s\n" - -#: src/plugins/fd/hvplugin.c:1007 src/plugins/fd/mysql-fd.c:1496 -#, fuzzy, c-format -msgid "Unknown parameter or missing argument for %s.\n" -msgstr "Невідомий статус" - -#: src/plugins/fd/hvplugin.c:1046 -#, fuzzy, c-format -msgid "Unknown parameter for %s. Expecting block or file\n" -msgstr "Невідомий статус" - -#: src/plugins/fd/hvplugin.c:1051 src/plugins/fd/mysql-fd.c:1573 -#: src/plugins/fd/postgresql-fd.c:1035 -#, fuzzy, c-format -msgid "Unknown parameter %s.\n" -msgstr "Невідомий статус" - -#: src/plugins/fd/hvplugin.c:1217 src/plugins/fd/hvplugin.c:1231 -#: src/plugins/fd/hvplugin.c:1261 src/plugins/fd/mysql-fd.c:2813 -#: src/plugins/fd/mysql-fd.c:2841 src/plugins/fd/mysql-fd.c:3171 -#: src/plugins/fd/postgresql-fd.c:2198 src/plugins/fd/postgresql-fd.c:2220 -#: src/plugins/fd/postgresql-fd.c:2478 -msgid "Can't analyse plugin command line\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:1221 -#, fuzzy -msgid "Unable to access guest volume\n" -msgstr "Не можливо встановити параметри файлу %s: ERR=%s\n" - -#: src/plugins/fd/hvplugin.c:1238 -msgid "The hvplugin plugin doesn't support regexwhere parameter.\n" -msgstr "" - -#: src/plugins/fd/hvplugin.c:1271 -msgid "" -"The hvplugin plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=hvplugin command in the\n" -"Include {} block.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:824 -#, c-format -msgid "Found MASTER_LOG position %s:%lld for \"%s\"\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:868 -#, c-format -msgid "Unable to get MySQL version %s, might cause errors\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:961 -#, c-format -msgid "Can't reach MySQL server to get database list. ERR=%d\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1069 -#, c-format -msgid "Can't reach MySQL server to get database config. ERR=%d\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1267 src/plugins/fd/mysql-fd.c:1290 -#: src/plugins/fd/mysql-fd.c:1302 src/plugins/fd/mysql-fd.c:1356 -#: src/plugins/fd/mysql-fd.c:1669 src/plugins/fd/postgresql-fd.c:1167 -#, fuzzy, c-format -msgid "Unable to create temporary file %s. ERR=%s\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:1527 -#, c-format -msgid "Invalid argument for %s. Expecting tar or xbstream\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1531 -msgid "" -"bin_format=tar is incompatible with Incremental backup. Using xbstream " -"instead\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1547 -#, c-format -msgid "Can't use mode=%s in MySQL plugin\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1584 -msgid "Unable to detect where my.cnf is located. Use config_file=" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1679 src/plugins/fd/postgresql-fd.c:1177 -#, fuzzy, c-format -msgid "Unable to fdopen file %s. ERR=%s\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:1774 -msgid "log_bin mysqld parameter is not suitable for Incremental backup.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:1776 -msgid "Generating Full dump instead...\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2039 -#, fuzzy, c-format -msgid " Dumping database \"%s\"\n" -msgstr "Не вдалось відкрити%s: ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:2181 -#, fuzzy -msgid "Unable to detect the MySQL data_directory on this system.\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:2188 -#, c-format -msgid "Configuration of log_bin=%s is not suitable for PITR backup.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2217 -#, fuzzy, c-format -msgid "Unable to determine the last binlog %s\n" -msgstr "Не можливо встановити час файлу %s: ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:2269 -msgid "Can't get server configuration.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2290 -#, fuzzy -msgid "Unable to get the BINLOG list.\n" -msgstr "Не можливо встановити час файлу %s: ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:2375 -#, c-format -msgid "" -"Unable to read %s. ERR=%s\n" -"Check permissions and/or use config_file parameter.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2418 -#, fuzzy, c-format -msgid "Unable to determine the last LSN for %s (Previous job is %s)\n" -msgstr "Не можливо встановити час файлу %s: ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:2426 -#, c-format -msgid "Will use LSN=%s for the current backup\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2461 -#, fuzzy -msgid "Unable to detect datadir from MySQL\n" -msgstr "Не можливо встановити час файлу %s: ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:2507 -#, fuzzy -msgid "Unable to get last LSN from the backup\n" -msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:2512 -#, c-format -msgid "The current LSN is %s\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:2866 -msgid "" -"The MySQL plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=mysql command in the\n" -"Include {} block.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3250 src/plugins/fd/postgresql-fd.c:2698 -msgid "replace=ifnewer/ifolder are not supported, switching to replace=never\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3294 src/plugins/fd/postgresql-fd.c:2739 -#: src/plugins/fd/postgresql-fd.c:2802 -#, c-format -msgid "" -"Database \"%s\" already exists, can't replace it when using replace=never\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3310 -#, fuzzy, c-format -msgid "Restoring target database \"%s\"\n" -msgstr "Не вдалось відкрити%s: ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:3327 src/plugins/fd/postgresql-fd.c:2771 -msgid "Re-creating roles, may produce errors if roles already exist\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3335 -#, fuzzy, c-format -msgid "Creating target database \"%s\"\n" -msgstr "Не вдалось відкрити%s: ERR=%s\n" - -#: src/plugins/fd/mysql-fd.c:3346 -#, fuzzy, c-format -msgid "Database \"%s\" already exists. Skipping creation.\n" -msgstr "Спроба створити вже існуючий Том \"%s\". Спробуйте ще раз.\n" - -#: src/plugins/fd/mysql-fd.c:3351 -msgid "" -"To restore all databases from a single dump file, use replace=always restore " -"option." -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3355 -msgid "" -"To restore all databases from a single dump file, use where=/ restore option." -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3358 -msgid "Restoring all databases from all-databases.sql file\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3379 -msgid "" -"bin-log should be restored separately as files using where=/a/directory and " -"applied using mysqlbinlog program and MASTER_LOG position found in the " -"restore log.\n" -msgstr "" - -#: src/plugins/fd/mysql-fd.c:3381 -#, c-format -msgid "Skipping \"%s\".\n" -msgstr "" - -#: src/plugins/fd/ndmp-fd.c:1081 -msgid "" -"Unable to get where= argument for the restore.\n" -"Using regexwhere is unsupported with the ndmp plugin.\n" -msgstr "" - -#: src/plugins/fd/ndmp-fd.c:1105 -#, fuzzy, c-format -msgid "Unable to parse or to use plugin options, %s\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/plugins/fd/ndmp-fd.c:1116 -msgid "" -"The ndmp plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=ndmp command in the\n" -"Include {} block.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:608 -#, c-format -msgid "Can't reach PostgreSQL server to get database list. ERR=%d\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:662 -#, c-format -msgid "Can't reach PostgreSQL server to get database config. ERR=%d\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:982 -#, fuzzy, c-format -msgid "Unknown parameter or bad argument for %s.\n" -msgstr "Невідомий статус" - -#: src/plugins/fd/postgresql-fd.c:1002 -#, c-format -msgid "Can't use mode=%s in postgresql plugin\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1011 -#, c-format -msgid "Can't use service=%s in postgresql plugin ERR=%s\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1030 -#, c-format -msgid "Bad compress=%s parameter expect 0-9.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1272 -msgid "Can't get cluster configuration.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1283 -msgid "Can't stop the current backup\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1289 src/plugins/fd/postgresql-fd.c:1297 -#, fuzzy -msgid "Can't determine the last WAL file\n" -msgstr "Не можливо встановити час файлу %s: ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:1312 src/plugins/fd/postgresql-fd.c:1919 -#, fuzzy -msgid "Can't determine WAL directory\n" -msgstr "Не можливо створити теку %s: ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:1319 -#, fuzzy, c-format -msgid "Can't open WAL directory %s. ERR=%s\n" -msgstr "Не можливо створити теку %s: ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:1861 -msgid "Your PostgreSQL version is too old for PITR mode\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1866 -#, fuzzy -msgid "Unable to detect the PostgreSQL data_directory on this system.\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:1873 -#, fuzzy, c-format -msgid "Unable to find data_directory=%s on this system. ERR=%s\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:1882 -msgid "Configuration wal_level=minimal is not suitable for PITR backup.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1892 -msgid "Configuration archive_command is not suitable for PITR backup.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:1994 -#, fuzzy -msgid "Unable to start the PITR backup on this system.\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:2000 -#, fuzzy -msgid "Unable to determine the first WAL file on this system.\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:2015 -#, fuzzy, c-format -msgid "Unable to analyse tablespaces %s on this system. ERR=%s\n" -msgstr "Не можливо встановити час файлу %s: ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:2065 -#, fuzzy, c-format -msgid "Unable to analyse data_directory %s on this system. ERR=%s\n" -msgstr "Не можливо встановити час файлу %s: ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:2245 -msgid "" -"The postgresql plugin doesn't support the Option Plugin configuration.\n" -"Please review your FileSet and move the Plugin=postgresql command in the\n" -"Include {} block.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:2490 -msgid "" -"You need to set PrefixLinks=Yes in your Restore job definition, or you will " -"need to fix all symlinks yourself." -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:2544 -#, c-format -msgid "Creating %s to help you starting the recovery.\n" -msgstr "" - -#: src/plugins/fd/postgresql-fd.c:2549 -#, fuzzy, c-format -msgid "Can't create the %s file for recovery. ERR=%s\n" -msgstr "Не можливо створити теку %s: ERR=%s\n" - -#: src/plugins/fd/postgresql-fd.c:2758 -msgid "" -"The destination database already exists,it might generate some harmless " -"error messages." -msgstr "" - -#: src/plugins/sd/shstore-sd.c:179 -#, c-format -msgid "3612 JobId=%u waiting because device %s is reserved by: %s.\n" -msgstr "" - -#: src/plugins/sd/shstore-sd.c:435 -#, c-format -msgid "" -"3998 Bad return from storage \"%s\" command: ERR=%s.\n" -"Results=%s\n" -msgstr "" - -#: src/qt-console/bat_conf.cpp:144 -#, c-format -msgid "Console: name=%s\n" -msgstr "Консоль: назва=%s\n" - -#: src/qt-console/bat_conf.cpp:147 -#: src/qt-console/tray-monitor/tray_conf.cpp:185 -#, fuzzy, c-format -msgid "ConsoleFont: name=%s font face=%s\n" -msgstr "Консоль: назва=%s rcfile=%s histfile=%s\n" - -#: src/qt-console/bcomm/dircomm.cpp:86 -#, c-format -msgid "Already connected\"%s\".\n" -msgstr "Вже приєднано\"%s\".\n" - -#: src/qt-console/bcomm/dircomm.cpp:97 -#: src/qt-console/tray-monitor/tray-monitor.cpp:351 -#, c-format -msgid "Connecting to Director %s:%d" -msgstr "Приєднуюсь до Керівника %s:%d" - -#: src/qt-console/bcomm/dircomm.cpp:99 -#, c-format -msgid "" -"Connecting to Director %s:%d\n" -"\n" -msgstr "" -"З'єднуюсь із Керівником %s:%d\n" -"\n" - -#: src/qt-console/bcomm/dircomm.cpp:196 -#: src/qt-console/tray-monitor/tray-monitor.cpp:356 -msgid "Director daemon" -msgstr "Керівник" - -#: src/qt-console/bcomm/dircomm.cpp:234 -msgid "Initializing ..." -msgstr "Ініціалізація ..." - -#: src/qt-console/bcomm/dircomm.cpp:250 src/qt-console/console/console.cpp:131 -msgid "Connected" -msgstr "З'єднано" - -#: src/qt-console/bcomm/dircomm.cpp:374 -msgid "Command completed ..." -msgstr "Команду виконано ..." - -#: src/qt-console/bcomm/dircomm.cpp:381 src/qt-console/console/console.cpp:368 -msgid "Processing command ..." -msgstr "Виконання команди ..." - -#: src/qt-console/bcomm/dircomm.cpp:388 -msgid "At main prompt waiting for input ..." -msgstr "Очікуться введення у основній рядку ..." - -#: src/qt-console/bcomm/dircomm.cpp:395 src/qt-console/bcomm/dircomm.cpp:405 -msgid "At prompt waiting for input ..." -msgstr "Очікуться введення у рядку ..." - -#: src/qt-console/bcomm/dircomm.cpp:413 -msgid "Command failed." -msgstr "Помилка команди" - -#: src/qt-console/bcomm/dircomm.cpp:485 -msgid "Director disconnected." -msgstr "Керівник від'єднано" - -#: src/qt-console/bcomm/dircomm_auth.cpp:108 -#, c-format -msgid "Director authorization problem at \"%s:%d\"\n" -msgstr "Проблеми авторизації Директора \"%s:%d\"\n" - -#: src/qt-console/bcomm/dircomm_auth.cpp:115 -#, c-format -msgid "" -"Authorization problem: Remote server at \"%s:%d\" did not advertise required " -"TLS support.\n" -msgstr "" -"Проблеми авторизації: Віддалений сервер \"%s:%d\" не повідомляє про " -"необхідність використання TLS.\n" - -#: src/qt-console/bcomm/dircomm_auth.cpp:123 -#, c-format -msgid "" -"Authorization problem with Director at \"%s:%d\": Remote server requires " -"TLS.\n" -msgstr "" -"Проблеми авторизації Керівника \"%s:%d\": Віддалений сепвер вимагає TLS.\n" - -#: src/qt-console/bcomm/dircomm_auth.cpp:146 -#, c-format -msgid "" -"Bad response to Hello command: ERR=%s\n" -"The Director at \"%s:%d\" is probably not running.\n" -msgstr "" -"Погана відповідь на команду Hello: ERR=%s\n" -"Керівник \"%s:%d\" ймовірно не запущений.\n" - -#: src/qt-console/bcomm/dircomm_auth.cpp:174 -#, fuzzy, c-format -msgid "" -"Authorization problem with Director at \"%s:%d\"\n" -"Most likely the passwords do not agree.\n" -"If you are using TLS, there may have been a certificate validation error " -"during the TLS handshake.\n" -"For help, please see " -msgstr "" -"Проблеми авторизації із Керівником \"%s:%d\"\n" -"Швидше за все, проблема у паролях.\n" -"Якщо Ви використовуєте TLS, можливо, невдала перевірка сертифікату під час " -"TLS handshake.\n" -"Для отримання допомоги, будь ласка, перегляньте http://www.bacula.org/en/rel-" -"manual/Bacula_Freque_Asked_Questi.html#SECTION003760000000000000000.\n" - -#: src/qt-console/main.cpp:185 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s) %s %s %s\n" -"\n" -"Usage: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" -" -c set configuration file to file\n" -" -dnn set debug level to nn\n" -" -s no signals\n" -" -t test - read configuration and exit\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Версія: %s (%s) %s %s %s\n" -"\n" -"Використання: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" -" -c set configuration file to file\n" -" -dnn set debug level to nn\n" -" -s без сигналів\n" -" -t перевірка - прочитати конфігурацію і вийти\n" -" -? print this message.\n" -"\n" - -#: src/qt-console/tray-monitor/authenticate.cpp:76 -#, fuzzy -msgid "" -"Director authorization problem.\n" -"Most likely the passwords do not agree.\n" -"For help, please see " -msgstr "" -"Проблеми під час авторизації Керівником.\n" -"Швидше за все, невірні паролі.\n" -"Для отримання допомоги, будь ласка, перегляньте http://www.bacula.org/en/rel-" -"manual/Bacula_Freque_Asked_Questi.html#SECTION003760000000000000000.\n" - -#: src/qt-console/tray-monitor/authenticate.cpp:126 -msgid "" -"Director and Storage daemon passwords or names not the same.\n" -"For help, please see " -msgstr "" - -#: src/qt-console/tray-monitor/authenticate.cpp:133 -#, c-format -msgid "bdird set configuration file to file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -t test - read configuration and exit\n" -" -? print this message.\n" -"\n" -msgstr "" -"Автор Nicolas Boichat (2004)\n" -"\n" -"Версія: %s (%s) %s %s %s\n" -"\n" -"Використання: tray-monitor [-c config_file] [-d debug_level]\n" -" -c задати конфігураційний файл \n" -" -d встановити рівень відлагоджування у \n" -" -dt виводити часову мітку у даних відлагоджування\n" -" -t перевірка - прогитати конфігурацію і завершити\n" -" -? показати це повідомлення.\n" -"\n" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:208 -#, c-format -msgid "" -"Error: %d Monitor resources defined in %s. You must define one and only one " -"Monitor resource.\n" -msgstr "" -"Помилка: %d ресурсів Спостерігача визначено у %s. Ви повинні визначити одині " -"тільки один ресурс Спостерігача.\n" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:240 -#, c-format -msgid "" -"No Client, Storage or Director resource defined in %s\n" -"Without that I don't how to get status from the File, Storage or Director " -"Daemon :-(\n" -msgstr "" -"У %s не визначено жодного ресурсу Клієнту, Зберігача або Керівника\n" -"Без цього я не знаю як отримати статус Зберігача, Збирача або Керівника\n" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:255 -#, c-format -msgid "" -"Invalid refresh interval defined in %s\n" -"This value must be greater or equal to 1 second and less or equal to 10 " -"minutes (read value: %d).\n" -msgstr "" -"Задано поганий інтервал оновлення у %s\n" -"Це значення повинно бути не меньше 1 секунди та не більше 10 хвилин " -"(теперішнє значення: %d).\n" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:323 -#, c-format -msgid "Error, currentitem is not a Client or a Storage..\n" -msgstr "Помилка. Поточний пункт не є Клієнтом або Зберігачем.\n" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:361 -#, c-format -msgid "Connecting to Client %s:%d" -msgstr "Приєднуюсь до Клієнта %s:%d" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:366 -msgid "File daemon" -msgstr "Збирач" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:371 -#, c-format -msgid "Connecting to Storage %s:%d" -msgstr "Приєднуюсь до Зберігача %s:%d" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:380 -#: src/qt-console/tray-monitor/tray-monitor.cpp:410 -#, c-format -msgid "Error, currentitem is not a Client, a Storage or a Director..\n" -msgstr "Помилка. Поточний пункт не є Клієнтом або Зберігачем.\n" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:385 -msgid "Cannot connect to daemon." -msgstr "Не можу приєднатись до демону." - -#: src/qt-console/tray-monitor/tray-monitor.cpp:394 -#, c-format -msgid "Authentication error : %s" -msgstr "Помилка автентифікації : %s" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:401 -msgid "Opened connection with Director daemon." -msgstr "Відкриті з'єднання із Керівником." - -#: src/qt-console/tray-monitor/tray-monitor.cpp:404 -msgid "Opened connection with File daemon." -msgstr "Відкриті з'єднання із Збирачем." - -#: src/qt-console/tray-monitor/tray-monitor.cpp:407 -msgid "Opened connection with Storage daemon." -msgstr "Відкриті з'єднання із Зберігачем." - -#: src/qt-console/tray-monitor/tray-monitor.cpp:458 -msgid "Error : BNET_HARDEOF or BNET_ERROR" -msgstr "" - -#: src/qt-console/tray-monitor/tray-monitor.cpp:467 -msgid "Error : Connection closed." -msgstr "Помилка : З'єднання завершено" - -#: src/qt-console/tray-monitor/tray_conf.cpp:167 -#, c-format -msgid "Monitor: name=%s FDtimeout=%s SDtimeout=%s\n" -msgstr "Споглядач: назва=%s FDtimeout=%s SDtimeout=%s\n" - -#: src/qt-console/tray-monitor/tray_conf.cpp:173 -#, c-format -msgid "Director: name=%s address=%s FDport=%d\n" -msgstr "Керівник: назва=%s address=%s FDport=%d\n" - -#: src/qt-console/tray-monitor/tray_conf.cpp:177 -#, c-format -msgid "Client: name=%s address=%s FDport=%d\n" -msgstr "Клієнт: назва=%s address=%s FDport=%d\n" - -#: src/qt-console/tray-monitor/tray_conf.cpp:181 -#, c-format -msgid "Storage: name=%s address=%s SDport=%d\n" -msgstr "Сховище: назва=%s address=%s SDport=%d\n" - -#: src/stored/acquire.c:62 -#, c-format -msgid "Acquire read: num_writers=%d not zero. Job %d canceled.\n" -msgstr "" - -#: src/stored/acquire.c:71 -#, c-format -msgid "No volumes specified for reading. Job %s canceled.\n" -msgstr "" - -#: src/stored/acquire.c:80 -#, c-format -msgid "Logic error: no next volume to read. Numvol=%d Curvol=%d\n" -msgstr "" - -#: src/stored/acquire.c:87 src/stored/acquire.c:164 src/stored/acquire.c:439 -#: src/stored/stored.c:614 -msgid "generate_plugin_event(bsdEventDeviceOpen) Failed\n" -msgstr "" - -#: src/stored/acquire.c:111 -#, c-format -msgid "" -"Changing read device. Want Media Type=\"%s\" have=\"%s\"\n" -" %s device=%s\n" -msgstr "" - -#: src/stored/acquire.c:159 -#, c-format -msgid "Media Type change. New read %s device %s chosen.\n" -msgstr "" - -#: src/stored/acquire.c:176 -#, c-format -msgid "No suitable device found to read Volume \"%s\"\n" -msgstr "" - -#: src/stored/acquire.c:215 -#, c-format -msgid "Job %s canceled.\n" -msgstr "" - -#: src/stored/acquire.c:233 -#, fuzzy, c-format -msgid "Read open %s device %s Volume \"%s\" failed: ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/stored/acquire.c:326 -#, c-format -msgid "Too many errors trying to mount %s device %s for reading.\n" -msgstr "" - -#: src/stored/acquire.c:334 -#, c-format -msgid "Ready to read from volume \"%s\" on %s device %s.\n" -msgstr "" - -#: src/stored/acquire.c:424 -#, fuzzy, c-format -msgid "Could not ready %s device %s for append.\n" -msgstr "Не можливо створити відбиток.\n" - -#: src/stored/acquire.c:520 src/stored/block_util.c:669 -#: src/stored/block_util.c:742 src/stored/block_util.c:772 -#: src/stored/spool.c:277 -#, c-format -msgid "Could not create JobMedia record for Volume=\"%s\" Job=%s\n" -msgstr "" - -#: src/stored/acquire.c:575 -#, c-format -msgid "Alert: %s" -msgstr "" - -#: src/stored/acquire.c:583 -#, c-format -msgid "3997 Bad alert command: %s: ERR=%s.\n" -msgstr "" - -#: src/stored/aligned_dev.c:44 src/stored/dev.c:122 src/stored/stored.c:583 -#, c-format -msgid "Could not initialize %s\n" -msgstr "" - -#: src/stored/aligned_dev.c:132 src/stored/dev.c:667 -#, fuzzy, c-format -msgid "Error closing device %s. ERR=%s.\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/stored/aligned_dev.c:432 src/stored/dvd.c:102 -msgid "No FreeSpace command defined.\n" -msgstr "" - -#: src/stored/aligned_dev.c:465 src/stored/dvd.c:136 -#, c-format -msgid "Cannot run free space command. Results=%s ERR=%s\n" -msgstr "" - -#: src/stored/aligned_read.c:199 -#, c-format -msgid "Record not properly reconstructed. Remainder wanted=%d got=%d\n" -msgstr "" - -#: src/stored/aligned_read.c:249 src/stored/record_read.c:177 -#, c-format -msgid "Sanity check failed. maxlen=%d datalen=%d. Block discarded.\n" -msgstr "" - -#: src/stored/ansi_label.c:82 -#, c-format -msgid "Read error on device %s in ANSI label. ERR=%s\n" -msgstr "" - -#: src/stored/ansi_label.c:92 -msgid "Insane! End of tape while reading ANSI label.\n" -msgstr "" - -#: src/stored/ansi_label.c:118 -msgid "No VOL1 label while reading ANSI/IBM label.\n" -msgstr "" - -#: src/stored/ansi_label.c:141 -#, c-format -msgid "Wanted ANSI Volume \"%s\" got \"%s\"\n" -msgstr "" - -#: src/stored/ansi_label.c:152 -msgid "No HDR1 label while reading ANSI label.\n" -msgstr "" - -#: src/stored/ansi_label.c:158 -#, c-format -msgid "ANSI/IBM Volume \"%s\" does not belong to Bacula.\n" -msgstr "" - -#: src/stored/ansi_label.c:170 -msgid "No HDR2 label while reading ANSI/IBM label.\n" -msgstr "" - -#: src/stored/ansi_label.c:185 -msgid "Unknown or bad ANSI/IBM label record.\n" -msgstr "" - -#: src/stored/ansi_label.c:193 -msgid "Too many records in while reading ANSI/IBM label.\n" -msgstr "" - -#: src/stored/ansi_label.c:293 -#, c-format -msgid "ANSI Volume label name \"%s\" longer than 6 chars.\n" -msgstr "" - -#: src/stored/ansi_label.c:319 -#, c-format -msgid "Could not write ANSI VOL1 label. Wanted size=%d got=%d ERR=%s\n" -msgstr "" - -#: src/stored/ansi_label.c:357 src/stored/ansi_label.c:386 -#, c-format -msgid "Could not write ANSI HDR1 label. ERR=%s\n" -msgstr "" - -#: src/stored/ansi_label.c:362 src/stored/ansi_label.c:393 -msgid "Could not write ANSI HDR1 label.\n" -msgstr "" - -#: src/stored/ansi_label.c:398 -#, c-format -msgid "Error writing EOF to tape. ERR=%s" -msgstr "" - -#: src/stored/ansi_label.c:403 -msgid "write_ansi_ibm_label called for non-ANSI/IBM type\n" -msgstr "" - -#: src/stored/append.c:77 -msgid "DCR is NULL!!!\n" -msgstr "" - -#: src/stored/append.c:83 -msgid "DEVICE is NULL!!!\n" -msgstr "" - -#: src/stored/append.c:94 -msgid "Unable to set network buffer size.\n" -msgstr "" - -#: src/stored/append.c:108 src/stored/append.c:118 src/stored/append.c:132 -#: src/stored/askdir.c:378 src/stored/askdir.c:379 -msgid "NULL Volume name. This shouldn't happen!!!\n" -msgstr "" - -#: src/stored/append.c:124 src/stored/btape.c:2231 -#, c-format -msgid "Write session label failed. ERR=%s\n" -msgstr "" - -#: src/stored/append.c:138 -#, c-format -msgid "Network send error to FD. ERR=%s\n" -msgstr "" - -#: src/stored/append.c:195 -#, c-format -msgid "Error reading data header from FD. n=%d msglen=%d ERR=%s\n" -msgstr "" - -#: src/stored/append.c:206 -#, c-format -msgid "Malformed data header from FD: %s\n" -msgstr "" - -#: src/stored/append.c:228 -#, c-format -msgid "FI=%d from FD not positive or last_FI=%d\n" -msgstr "" - -#: src/stored/append.c:353 -#, c-format -msgid "Network error reading from FD. ERR=%s\n" -msgstr "" - -#: src/stored/append.c:373 -#, fuzzy, c-format -msgid "DDE commit failed. ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/stored/append.c:404 src/stored/append.c:431 src/stored/spool.c:266 -#: src/stored/vbackup.c:120 src/stored/vbackup.c:130 src/stored/vbackup.c:300 -#, c-format -msgid "Fatal append error on device %s: ERR=%s\n" -msgstr "" - -#: src/stored/append.c:406 src/stored/vbackup.c:122 -msgid "Set ok=FALSE after write_block_to_device.\n" -msgstr "" - -#: src/stored/append.c:418 src/stored/btape.c:2350 -#, fuzzy, c-format -msgid "Error writing end session label. ERR=%s\n" -msgstr "Помилка надсилання Hello до Збирача. ERR=%s\n" - -#: src/stored/append.c:433 src/stored/vbackup.c:132 -msgid "Set ok=FALSE after write_final_block_to_device.\n" -msgstr "" - -#: src/stored/append.c:458 src/stored/read.c:110 src/stored/vbackup.c:155 -#, c-format -msgid "Elapsed time=%02d:%02d:%02d, Transfer rate=%s Bytes/second\n" -msgstr "" - -#: src/stored/append.c:495 -#, c-format -msgid "Error updating file attributes. ERR=%s\n" -msgstr "" - -#: src/stored/askdir.c:174 -msgid "Network error on bnet_recv in req_vol_info.\n" -msgstr "" - -#: src/stored/askdir.c:198 -#, c-format -msgid "Error getting Volume info: %s" -msgstr "" - -#: src/stored/askdir.c:433 -#, c-format -msgid "Didn't get vol info vol=%s: ERR=%s" -msgstr "" - -#: src/stored/askdir.c:531 -#, c-format -msgid "Error creating JobMedia record: ERR=%s\n" -msgstr "" - -#: src/stored/askdir.c:538 -#, c-format -msgid "Error creating JobMedia record: %s\n" -msgstr "" - -#: src/stored/askdir.c:630 -#, c-format -msgid "Job %s canceled while waiting for mount on Storage Device \"%s\".\n" -msgstr "" - -#: src/stored/askdir.c:643 -#, c-format -msgid "" -"Job %s is waiting. Cannot find any appendable volumes.\n" -"Please use the \"label\" command to create a new Volume for:\n" -" Storage: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" - -#: src/stored/askdir.c:668 src/stored/askdir.c:780 -#, c-format -msgid "Max time exceeded waiting to mount Storage Device %s for Job %s\n" -msgstr "" - -#: src/stored/askdir.c:679 -msgid "pthread error in mount_next_volume.\n" -msgstr "" - -#: src/stored/askdir.c:714 -msgid "Cannot request another volume: no volume name given.\n" -msgstr "" - -#: src/stored/askdir.c:720 -msgid "The current operation doesn't support mount request\n" -msgstr "" - -#: src/stored/askdir.c:727 -#, c-format -msgid "Job %s canceled while waiting for mount on Storage Device %s.\n" -msgstr "" - -#: src/stored/askdir.c:745 -#, c-format -msgid "" -"%sPlease mount append Volume \"%s\" or label a new one for:\n" -" Job: %s\n" -" Storage: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" - -#: src/stored/askdir.c:751 -#, c-format -msgid "" -"%sPlease mount read Volume \"%s\" for:\n" -" Job: %s\n" -" Storage: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" - -#: src/stored/askdir.c:758 -msgid "" -"\n" -"\n" -"WARNING: device is full! Please add more disk space then ...\n" -"\n" -msgstr "" - -#: src/stored/askdir.c:791 -msgid "pthread error in mount_volume\n" -msgstr "" - -#: src/stored/authenticate.c:77 -msgid "" -"Incorrect password given by Director.\n" -"For help, please see: " -msgstr "" - -#: src/stored/authenticate.c:103 -#, c-format -msgid "TLS negotiation failed with DIR at \"%s:%d\"\n" -msgstr "" - -#: src/stored/authenticate.c:121 -#, c-format -msgid "Unable to authenticate Director at %s.\n" -msgstr "" - -#: src/stored/authenticate.c:169 src/stored/authenticate.c:209 -#, c-format -msgid "" -"Incorrect authorization key from File daemon at %s rejected.\n" -"For help, please see: " -msgstr "" - -#: src/stored/authenticate.c:196 -#, c-format -msgid "TLS negotiation failed with FD at \"%s:%d\"\n" -msgstr "" - -#: src/stored/authenticate.c:277 -msgid "" -"Authorization key rejected by Storage daemon.\n" -"Please see " -msgstr "" - -#: src/stored/autochanger.c:67 -#, c-format -msgid "No Changer Name given for device %s. Cannot continue.\n" -msgstr "" - -#: src/stored/autochanger.c:73 -#, c-format -msgid "No Changer Command given for device %s. Cannot continue.\n" -msgstr "" - -#: src/stored/autochanger.c:142 -#, c-format -msgid "No slot defined in catalog (slot=%d) for Volume \"%s\" on %s.\n" -msgstr "" - -#: src/stored/autochanger.c:144 -msgid "Cartridge change or \"update slots\" may be required.\n" -msgstr "" - -#: src/stored/autochanger.c:150 -#, c-format -msgid "No \"Changer Device\" for %s. Manual load of Volume may be required.\n" -msgstr "" - -#: src/stored/autochanger.c:157 -#, c-format -msgid "No \"Changer Command\" for %s. Manual load of Volume may be requird.\n" -msgstr "" - -#: src/stored/autochanger.c:191 -#, c-format -msgid "3304 Issuing autochanger \"load slot %d, drive %d\" command.\n" -msgstr "" - -#: src/stored/autochanger.c:199 -#, c-format -msgid "3305 Autochanger \"load slot %d, drive %d\", status is OK.\n" -msgstr "" - -#: src/stored/autochanger.c:212 -#, c-format -msgid "" -"3992 Bad autochanger \"load slot %d, drive %d\": ERR=%s.\n" -"Results=%s\n" -msgstr "" - -#: src/stored/autochanger.c:275 -#, c-format -msgid "3301 Issuing autochanger \"loaded? drive %d\" command.\n" -msgstr "" - -#: src/stored/autochanger.c:287 -#, c-format -msgid "3302 Autochanger \"loaded? drive %d\", result is Slot %d.\n" -msgstr "" - -#: src/stored/autochanger.c:294 -#, c-format -msgid "3302 Autochanger \"loaded? drive %d\", result: nothing loaded.\n" -msgstr "" - -#: src/stored/autochanger.c:306 -#, c-format -msgid "" -"3991 Bad autochanger \"loaded? drive %d\" command: ERR=%s.\n" -"Results=%s\n" -msgstr "" - -#: src/stored/autochanger.c:326 -#, fuzzy, c-format -msgid "Lock failure on autochanger. ERR=%s\n" -msgstr "Проігноровано помилку SQL. ERR=%s\n" - -#: src/stored/autochanger.c:340 -#, c-format -msgid "Unlock failure on autochanger. ERR=%s\n" -msgstr "" - -#: src/stored/autochanger.c:387 src/stored/autochanger.c:553 -#, c-format -msgid "3307 Issuing autochanger \"unload slot %d, drive %d\" command.\n" -msgstr "" - -#: src/stored/autochanger.c:400 -#, c-format -msgid "" -"3995 Bad autochanger \"unload slot %d, drive %d\": ERR=%s\n" -"Results=%s\n" -msgstr "" - -#: src/stored/autochanger.c:503 -#, c-format -msgid "Volume \"%s\" wanted on %s is in use by device %s\n" -msgstr "" - -#: src/stored/autochanger.c:570 -#, c-format -msgid "3997 Bad autochanger \"unload slot %d, drive %d\": ERR=%s.\n" -msgstr "" - -#: src/stored/autochanger.c:613 -#, c-format -msgid "3993 Device %s not an autochanger device.\n" -msgstr "" - -#: src/stored/autochanger.c:640 -#, c-format -msgid "3306 Issuing autochanger \"%s\" command.\n" -msgstr "" - -#: src/stored/autochanger.c:643 -msgid "3996 Open bpipe failed.\n" -msgstr "" - -#: src/stored/autochanger.c:670 -#, c-format -msgid "Autochanger error: ERR=%s\n" -msgstr "" - -#: src/stored/bcopy.c:62 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bcopy [-d debug_level] \n" -" -b bootstrap specify a bootstrap file\n" -" -c specify a Storage configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -i specify input Volume names (separated by |)\n" -" -o specify output Volume names (separated by |)\n" -" -p proceed inspite of errors\n" -" -v verbose\n" -" -w specify working directory (default /tmp)\n" -" -? print this message\n" -"\n" -msgstr "" -"\n" -"Версія: %s (%s) %s %s %s\n" -"\n" -"Використання: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" -" -c set configuration file to file\n" -" -dnn set debug level to nn\n" -" -s без сигналів\n" -" -t перевірка - прочитати конфігурацію і вийти\n" -" -? print this message.\n" -"\n" - -#: src/stored/bcopy.c:149 src/stored/bextract.c:206 src/stored/bscan.c:236 -#: src/tools/bbatch.c:176 src/tools/bvfs_test.c:189 src/tools/cats_test.c:308 -msgid "Wrong number of arguments: \n" -msgstr "" - -#: src/stored/bcopy.c:193 src/stored/btape.c:468 src/stored/device.c:338 -#, c-format -msgid "dev open failed: %s\n" -msgstr "" - -#: src/stored/bcopy.c:208 -msgid "Write of last block failed.\n" -msgstr "" - -#: src/stored/bcopy.c:212 -#, c-format -msgid "%u Jobs copied. %u records copied.\n" -msgstr "" - -#: src/stored/bcopy.c:229 src/stored/bscan.c:419 -#, c-format -msgid "Record: SessId=%u SessTim=%u FileIndex=%d Stream=%d len=%u\n" -msgstr "" - -#: src/stored/bcopy.c:245 -msgid "Volume is prelabeled. This volume cannot be copied.\n" -msgstr "" - -#: src/stored/bcopy.c:248 -msgid "Volume label not copied.\n" -msgstr "" - -#: src/stored/bcopy.c:254 -msgid "Copy skipped. Record does not match BSR filter.\n" -msgstr "" - -#: src/stored/bcopy.c:271 src/stored/bcopy.c:279 src/stored/bcopy.c:307 -#: src/stored/btape.c:2755 -#, c-format -msgid "Cannot fixup device error. %s\n" -msgstr "" - -#: src/stored/bcopy.c:285 -msgid "EOM label not copied.\n" -msgstr "" - -#: src/stored/bcopy.c:288 -msgid "EOT label not copied.\n" -msgstr "" - -#: src/stored/bcopy.c:321 src/stored/bls.c:439 src/stored/read_records.c:392 -msgid "Fresh Volume Label" -msgstr "" - -#: src/stored/bcopy.c:324 src/stored/bls.c:442 src/stored/read_records.c:395 -msgid "Volume Label" -msgstr "" - -#: src/stored/bcopy.c:328 src/stored/bls.c:446 src/stored/label.c:1332 -msgid "Begin Job Session" -msgstr "" - -#: src/stored/bcopy.c:332 src/stored/bls.c:451 src/stored/label.c:1335 -msgid "End Job Session" -msgstr "" - -#: src/stored/bcopy.c:337 src/stored/bls.c:455 -msgid "End of Medium" -msgstr "" - -#: src/stored/bcopy.c:340 src/stored/bls.c:467 src/stored/label.c:1344 -msgid "Unknown" -msgstr "" - -#: src/stored/bcopy.c:346 src/stored/bls.c:474 src/stored/read_records.c:413 -#, c-format -msgid "%s Record: VolSessionId=%d VolSessionTime=%d JobId=%d DataLen=%d\n" -msgstr "" - -#: src/stored/bcopy.c:364 src/stored/bextract.c:721 src/stored/bls.c:493 -#: src/stored/bscan.c:1359 src/stored/btape.c:3049 -#, c-format -msgid "Mount Volume \"%s\" on device %s and press return when ready: " -msgstr "" - -#: src/stored/bextract.c:80 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bextract \n" -" -b specify a bootstrap file\n" -" -c specify a Storage configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -T send debug traces to trace file\n" -" -e exclude list\n" -" -i include list\n" -" -p proceed inspite of I/O errors\n" -" -t read data from volume, do not write anything\n" -" -v verbose\n" -" -V specify Volume names (separated by |)\n" -" -? print this message\n" -"\n" -msgstr "" -"\n" -"Версія: %s (%s) %s %s %s\n" -"\n" -"Використання: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" -" -c set configuration file to file\n" -" -dnn set debug level to nn\n" -" -s без сигналів\n" -" -t перевірка - прочитати конфігурацію і вийти\n" -" -? print this message.\n" -"\n" - -#: src/stored/bextract.c:156 src/stored/bls.c:143 -#, c-format -msgid "Could not open exclude file: %s, ERR=%s\n" -msgstr "" - -#: src/stored/bextract.c:171 src/stored/bls.c:158 -#, c-format -msgid "Could not open include file: %s, ERR=%s\n" -msgstr "" - -#: src/stored/bextract.c:231 -#, c-format -msgid "%d Program Name and/or Program Data Stream records ignored.\n" -msgstr "" - -#: src/stored/bextract.c:235 -#, c-format -msgid "%d Win32 data or Win32 gzip data stream records. Ignored.\n" -msgstr "" - -#: src/stored/bextract.c:263 -#, c-format -msgid "Cannot stat %s. It must exist. ERR=%s\n" -msgstr "" - -#: src/stored/bextract.c:267 -#, c-format -msgid "%s must be a directory.\n" -msgstr "" - -#: src/stored/bextract.c:296 -#, c-format -msgid "%u files restored.\n" -msgstr "" - -#: src/stored/bextract.c:298 -#, fuzzy, c-format -msgid "Found %s error%s\n" -msgstr " (%d помилок)" - -#: src/stored/bextract.c:309 src/stored/bextract.c:315 -#, c-format -msgid "Write error on %s: %s\n" -msgstr "" - -#: src/stored/bextract.c:346 src/stored/read.c:163 src/stored/read.c:290 -#: src/stored/vbackup.c:265 -msgid "Cannot do rehydration, device is not dedup aware\n" -msgstr "" - -#: src/stored/bextract.c:354 -#, c-format -msgid "" -"Got rehydration error at file=%d record=%s fname=%s volsessionid=%d " -"volsessiontime=%d Msg=%s" -msgstr "" - -#: src/stored/bextract.c:388 src/stored/bextract.c:426 src/stored/bls.c:400 -#: src/stored/bscan.c:679 -msgid "Cannot continue.\n" -msgstr "" - -#: src/stored/bextract.c:419 src/stored/bextract.c:691 -msgid "Logic error output file should be open but is not.\n" -msgstr "" - -#: src/stored/bextract.c:446 -#, c-format -msgid "%s was deleted.\n" -msgstr "" - -#: src/stored/bextract.c:495 -#, c-format -msgid "Seek error on %s: %s\n" -msgstr "" - -#: src/stored/bextract.c:550 -#, c-format -msgid "Uncompression error. ERR=%d\n" -msgstr "" - -#: src/stored/bextract.c:619 -#, c-format -msgid "Compressed header version error. version=0x%x\n" -msgstr "" - -#: src/stored/bextract.c:648 -#, c-format -msgid "LZO uncompression error. ERR=%d\n" -msgstr "" - -#: src/stored/bextract.c:682 -msgid "Got Program Name or Data Stream. Ignored.\n" -msgstr "" - -#: src/stored/block.c:100 -msgid "Error writing final JobMedia record to catalog.\n" -msgstr "" - -#: src/stored/block.c:148 -#, c-format -msgid "Cannot write block. Device at EOM. dev=%s\n" -msgstr "" - -#: src/stored/block.c:153 -#, c-format -msgid "Attempt to write on read-only Volume. dev=%s\n" -msgstr "" - -#: src/stored/block.c:159 -#, c-format -msgid "Attempt to write on closed device=%s\n" -msgstr "" - -#: src/stored/block.c:198 -#, c-format -msgid "Unable to write EOF. ERR=%s\n" -msgstr "" - -#: src/stored/block.c:234 src/stored/block.c:292 -msgid "Write block header zeroed.\n" -msgstr "" - -#: src/stored/block.c:284 -#, c-format -msgid "Block checksum changed during write: before=%ud after=%ud\n" -msgstr "" - -#: src/stored/block.c:311 -#, c-format -msgid "Write error at %u:%u on device %s. ERR=%s.\n" -msgstr "" - -#: src/stored/block.c:321 -#, c-format -msgid "" -"Out of freespace caused End of Volume \"%s\" at %u:%u on device %s. Write of " -"%u bytes got %d.\n" -msgstr "" - -#: src/stored/block.c:326 -#, c-format -msgid "End of Volume \"%s\" at %u:%u on device %s. Write of %u bytes got %d.\n" -msgstr "" - -#: src/stored/block.c:456 -#, fuzzy -msgid "Job failed or canceled.\n" -msgstr "Статус задачі: Відмінена" - -#: src/stored/block.c:462 -msgid "Attempt to read past end of tape or file.\n" -msgstr "" - -#: src/stored/block.c:470 -#, c-format -msgid "Attempt to read closed device: fd=%d at file:blk %u:%u on device %s\n" -msgstr "" - -#: src/stored/block.c:483 -#, c-format -msgid "Block buffer size looping problem on device %s\n" -msgstr "" - -#: src/stored/block.c:498 -#, c-format -msgid "Unable to open device part=%d %s: ERR=%s\n" -msgstr "" - -#: src/stored/block.c:534 -#, fuzzy, c-format -msgid "The Volume=%s on device=%s appears to be unlabeled.\n" -msgstr "У картотеці створено новий Том \"%s\".\n" - -#: src/stored/block.c:537 -#, c-format -msgid "Read error on fd=%d at file:blk %u:%u on device %s. ERR=%s.\n" -msgstr "" - -#: src/stored/block.c:548 -#, c-format -msgid "The %sVolume=%s on device=%s appears to be unlabeled.\n" -msgstr "" - -#: src/stored/block.c:551 -#, c-format -msgid "Read zero %sbytes Vol=%s at %lld on device %s.\n" -msgstr "" - -#: src/stored/block.c:585 -#, c-format -msgid "" -"Volume data error at %u:%u! Very short block of %d bytes on device %s " -"discarded.\n" -msgstr "" - -#: src/stored/block.c:613 -#, c-format -msgid "Block length %u is greater than buffer %u. Attempting recovery.\n" -msgstr "" - -#: src/stored/block.c:633 -#, c-format -msgid "Setting block buffer size to %u bytes.\n" -msgstr "" - -#: src/stored/block.c:648 -#, c-format -msgid "" -"Volume data error at %u:%u! Short block of %d bytes on device %s discarded.\n" -msgstr "" - -#: src/stored/block_util.c:93 -#, c-format -msgid "" -"Dump block %s %p: adata=%d size=%d BlkNum=%d\n" -" Hdrcksum=%x cksum=%x\n" -msgstr "" - -#: src/stored/block_util.c:118 -#, c-format -msgid " Rec: VId=%u VT=%u FI=%s Strm=%s len=%d reclen=%d\n" -msgstr "" - -#: src/stored/block_util.c:203 -#, c-format -msgid "%d block read errors not printed.\n" -msgstr "" - -#: src/stored/block_util.c:341 -#, c-format -msgid "" -"Volume data error at %lld!\n" -"Adata block checksum mismatch in block=%u len=%d: calc=%x blk=%x\n" -msgstr "" - -#: src/stored/block_util.c:376 src/stored/block_util.c:394 -#: src/stored/block_util.c:404 -#, c-format -msgid "" -"Volume data error at %u:%u! Wanted ID: \"%s\", got \"%s\". Buffer " -"discarded.\n" -msgstr "" - -#: src/stored/block_util.c:419 -#, c-format -msgid "" -"Volume data error at %u:%u! Block length %u is insane (too large), probably " -"due to a bad archive.\n" -msgstr "" - -#: src/stored/block_util.c:446 -#, c-format -msgid "" -"Volume data error at %u:%u!\n" -"Block checksum mismatch in block=%u len=%d: calc=%x blk=%x\n" -msgstr "" - -#: src/stored/block_util.c:542 -#, c-format -msgid "" -"User defined maximum volume size %s will be exceeded on device %s.\n" -" Marking Volume \"%s\" as Full.\n" -msgstr "" - -#: src/stored/block_util.c:579 src/stored/block_util.c:585 -#, c-format -msgid "Backspace file at EOT failed. ERR=%s\n" -msgstr "" - -#: src/stored/block_util.c:592 -#, c-format -msgid "Backspace record at EOT failed. ERR=%s\n" -msgstr "" - -#: src/stored/block_util.c:609 -#, c-format -msgid "Re-read last block at EOT failed. ERR=%s" -msgstr "" - -#: src/stored/block_util.c:619 -#, c-format -msgid "" -"Re-read of last block: block numbers differ by more than one.\n" -"Probable tape misconfiguration and data loss. Read block=%u Want block=%u.\n" -msgstr "" - -#: src/stored/block_util.c:624 -#, c-format -msgid "" -"Re-read of last block OK, but block numbers differ. Read block=%u Want block=" -"%u.\n" -msgstr "" - -#: src/stored/block_util.c:628 -msgid "Re-read of last block succeeded.\n" -msgstr "" - -#: src/stored/block_util.c:677 -#, c-format -msgid "" -"Error writing final EOF to tape. This Volume may not be readable.\n" -"%s" -msgstr "" - -#: src/stored/block_util.c:695 -#, fuzzy -msgid "Error sending Volume info to Director.\n" -msgstr "Помилка надсилання Hello до Збирача. ERR=%s\n" - -#: src/stored/block_util.c:815 -#, c-format -msgid "" -"Error while writing, current part number is less than the total number of " -"parts (%d/%d, device=%s)\n" -msgstr "" - -#: src/stored/block_util.c:823 -#, c-format -msgid "Unable to open device next part %s: ERR=%s\n" -msgstr "" - -#: src/stored/block_util.c:843 -#, c-format -msgid "" -"End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, " -"free_space_errno=%d, errmsg=%s).\n" -msgstr "" - -#: src/stored/block_util.c:856 -#, c-format -msgid "" -"End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, " -"free_space_errno=%d).\n" -msgstr "" - -#: src/stored/bls.c:68 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bls [options] \n" -" -b specify a bootstrap file\n" -" -c specify a Storage configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -e exclude list\n" -" -i include list\n" -" -j list jobs\n" -" -k list blocks\n" -" (no j or k option) list saved files\n" -" -L dump label\n" -" -p proceed inspite of errors\n" -" -v be verbose\n" -" -V specify Volume names (separated by |)\n" -" -E Check records to detect errors\n" -" -? print this message\n" -"\n" -msgstr "" -"\n" -"Версія: %s (%s) %s %s %s\n" -"\n" -"Використання: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" -" -c set configuration file to file\n" -" -dnn set debug level to nn\n" -" -s без сигналів\n" -" -t перевірка - прочитати конфігурацію і вийти\n" -" -? print this message.\n" -"\n" - -#: src/stored/bls.c:205 -msgid "No archive name specified\n" -msgstr "" - -#: src/stored/bls.c:244 -#, c-format -msgid "" -"\n" -"Warning, this Volume is a continuation of Volume %s\n" -msgstr "" - -#: src/stored/bls.c:291 -#, c-format -msgid "Got EOM at file %u on device %s, Volume \"%s\"\n" -msgstr "" - -#: src/stored/bls.c:302 -#, c-format -msgid "Mounted Volume \"%s\".\n" -msgstr "" - -#: src/stored/bls.c:304 -#, c-format -msgid "End of file %u on device %s, Volume \"%s\"\n" -msgstr "" - -#: src/stored/bls.c:329 -#, c-format -msgid "" -"File:blk=%u:%u blk_num=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=" -"%s rlen=%d\n" -msgstr "" - -#: src/stored/bls.c:338 -#, c-format -msgid "Block: %d size=%d\n" -msgstr "" - -#: src/stored/bls.c:402 -msgid "Attrib unpack error!\n" -msgstr "" - -#: src/stored/bls.c:413 -#, c-format -msgid "FileIndex=%d VolSessionId=%d VolSessionTime=%d Stream=%d DataLen=%d\n" -msgstr "" - -#: src/stored/bls.c:458 -msgid "End of Physical Medium" -msgstr "" - -#: src/stored/bls.c:461 -msgid "Start of object" -msgstr "" - -#: src/stored/bls.c:464 -msgid "End of object" -msgstr "" - -#: src/stored/bscan.c:105 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bscan [ options ] \n" -" -b bootstrap specify a bootstrap file\n" -" -c specify configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -m update media info in database\n" -" -D specify the driver database name (default NULL)\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database password (default none)\n" -" -h specify database host (default NULL)\n" -" -t specify database port (default 0)\n" -" -p proceed inspite of I/O errors\n" -" -r list records\n" -" -s synchronize or store in database\n" -" -S show scan progress periodically\n" -" -v verbose\n" -" -V specify Volume names (separated by |)\n" -" -w specify working directory (default from conf file)\n" -" -? print this message\n" -"\n" -msgstr "" - -#: src/stored/bscan.c:254 src/stored/bsdjson.c:481 src/stored/stored.c:349 -#, c-format -msgid "No Working Directory defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bscan.c:262 -#, c-format -msgid "Working Directory: %s not found. Cannot continue.\n" -msgstr "" - -#: src/stored/bscan.c:266 -#, c-format -msgid "Working Directory: %s is not a directory. Cannot continue.\n" -msgstr "" - -#: src/stored/bscan.c:280 src/stored/bscan.c:363 -#, c-format -msgid "First Volume Size = %s\n" -msgstr "" - -#: src/stored/bscan.c:299 src/tools/bbatch.c:243 src/tools/bvfs_test.c:212 -#, c-format -msgid "Using Database: %s, User: %s\n" -msgstr "" - -#: src/stored/bscan.c:334 -#, c-format -msgid "Create JobMedia for Job %s\n" -msgstr "" - -#: src/stored/bscan.c:344 -#, c-format -msgid "Could not create JobMedia record for Volume=%s Job=%s\n" -msgstr "" - -#: src/stored/bscan.c:411 -#, c-format -msgid "done: %d%%\n" -msgstr "" - -#: src/stored/bscan.c:435 -msgid "Volume is prelabeled. This tape cannot be scanned.\n" -msgstr "" - -#: src/stored/bscan.c:447 -#, c-format -msgid "Pool record for %s found in DB.\n" -msgstr "" - -#: src/stored/bscan.c:451 -#, c-format -msgid "VOL_LABEL: Pool record not found for Pool: %s\n" -msgstr "" - -#: src/stored/bscan.c:457 -#, c-format -msgid "VOL_LABEL: PoolType mismatch. DB=%s Vol=%s\n" -msgstr "" - -#: src/stored/bscan.c:461 -#, c-format -msgid "Pool type \"%s\" is OK.\n" -msgstr "" - -#: src/stored/bscan.c:471 -#, c-format -msgid "Media record for %s found in DB.\n" -msgstr "" - -#: src/stored/bscan.c:478 -#, c-format -msgid "VOL_LABEL: Media record not found for Volume: %s\n" -msgstr "" - -#: src/stored/bscan.c:485 -#, c-format -msgid "VOL_LABEL: MediaType mismatch. DB=%s Vol=%s\n" -msgstr "" - -#: src/stored/bscan.c:489 -#, c-format -msgid "Media type \"%s\" is OK.\n" -msgstr "" - -#: src/stored/bscan.c:499 -#, c-format -msgid "VOL_LABEL: OK for Volume: %s\n" -msgstr "" - -#: src/stored/bscan.c:506 -#, c-format -msgid "%d \"errors\" ignored before first Start of Session record.\n" -msgstr "" - -#: src/stored/bscan.c:517 -#, c-format -msgid "SOS_LABEL: Found Job record for JobId: %d\n" -msgstr "" - -#: src/stored/bscan.c:522 -#, c-format -msgid "SOS_LABEL: Job record not found for JobId: %d\n" -msgstr "" - -#: src/stored/bscan.c:562 -#, c-format -msgid "SOS_LABEL: VolSessId mismatch for JobId=%u. DB=%d Vol=%d\n" -msgstr "" - -#: src/stored/bscan.c:568 -#, c-format -msgid "SOS_LABEL: VolSessTime mismatch for JobId=%u. DB=%d Vol=%d\n" -msgstr "" - -#: src/stored/bscan.c:574 -#, c-format -msgid "SOS_LABEL: PoolId mismatch for JobId=%u. DB=%d Vol=%d\n" -msgstr "" - -#: src/stored/bscan.c:592 src/stored/bscan.c:1146 -#, c-format -msgid "Could not find SessId=%d SessTime=%d for EOS record.\n" -msgstr "" - -#: src/stored/bscan.c:638 -#, c-format -msgid "Could not update job record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:649 -#, c-format -msgid "End of all Volumes. VolFiles=%u VolBlocks=%u VolBytes=%s\n" -msgstr "" - -#: src/stored/bscan.c:661 -#, c-format -msgid "Could not find Job for SessId=%d SessTime=%d record.\n" -msgstr "" - -#: src/stored/bscan.c:692 -#, c-format -msgid "%s file records. At file:blk=%s:%s bytes=%s\n" -msgstr "" - -#: src/stored/bscan.c:757 -#, c-format -msgid "Got MD5 record: %s\n" -msgstr "" - -#: src/stored/bscan.c:765 -#, c-format -msgid "Got SHA1 record: %s\n" -msgstr "" - -#: src/stored/bscan.c:773 -#, c-format -msgid "Got SHA256 record: %s\n" -msgstr "" - -#: src/stored/bscan.c:781 -#, c-format -msgid "Got SHA512 record: %s\n" -msgstr "" - -#: src/stored/bscan.c:789 src/stored/bscan.c:796 -msgid "Got signed digest record\n" -msgstr "Отримано підписаний відбиток запису\n" - -#: src/stored/bscan.c:802 -#, c-format -msgid "Got Prog Names Stream: %s\n" -msgstr "" - -#: src/stored/bscan.c:808 -msgid "Got Prog Data Stream record.\n" -msgstr "" - -#: src/stored/bscan.c:853 -#, c-format -msgid "Unknown stream type!!! stream=%d len=%i\n" -msgstr "" - -#: src/stored/bscan.c:915 -#, c-format -msgid "Could not create File Attributes record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:921 -#, c-format -msgid "Created File record: %s\n" -msgstr "" - -#: src/stored/bscan.c:966 -#, c-format -msgid "Could not create media record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:970 src/stored/bscan.c:991 -#, c-format -msgid "Could not update media record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:974 -#, c-format -msgid "Created Media record for Volume: %s\n" -msgstr "" - -#: src/stored/bscan.c:995 -#, c-format -msgid "Updated Media record at end of Volume: %s\n" -msgstr "" - -#: src/stored/bscan.c:1012 -#, c-format -msgid "Could not create pool record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1016 -#, c-format -msgid "Created Pool record for Pool: %s\n" -msgstr "" - -#: src/stored/bscan.c:1035 -#, c-format -msgid "Could not get Client record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1045 -#, c-format -msgid "Created Client record for Client: %s\n" -msgstr "" - -#: src/stored/bscan.c:1062 -#, c-format -msgid "Fileset \"%s\" already exists.\n" -msgstr "" - -#: src/stored/bscan.c:1066 -#, c-format -msgid "Could not create FileSet record \"%s\". ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1071 -#, c-format -msgid "Created FileSet record \"%s\"\n" -msgstr "" - -#: src/stored/bscan.c:1118 -#, c-format -msgid "Could not create JobId record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1124 -#, c-format -msgid "Could not update job start record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1127 -#, c-format -msgid "Created new JobId=%u record for original JobId=%u\n" -msgstr "" - -#: src/stored/bscan.c:1180 -#, c-format -msgid "Could not update JobId=%u record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1185 -#, c-format -msgid "Updated Job termination record for JobId=%u Level=%s TermStat=%c\n" -msgstr "" - -#: src/stored/bscan.c:1210 -#, c-format -msgid "Job Termination code: %d" -msgstr "" - -#: src/stored/bscan.c:1215 -#, c-format -msgid "" -"%s\n" -"JobId: %d\n" -"Job: %s\n" -"FileSet: %s\n" -"Backup Level: %s\n" -"Client: %s\n" -"Start time: %s\n" -"End time: %s\n" -"Files Written: %s\n" -"Bytes Written: %s\n" -"Volume Session Id: %d\n" -"Volume Session Time: %d\n" -"Last Volume Bytes: %s\n" -"Termination: %s\n" -"\n" -msgstr "" - -#: src/stored/bscan.c:1273 -#, c-format -msgid "Could not create JobMedia record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1277 -#, c-format -msgid "Created JobMedia record JobId %d, MediaId %d\n" -msgstr "" - -#: src/stored/bscan.c:1293 -#, c-format -msgid "Could not find SessId=%d SessTime=%d for MD5/SHA1 record.\n" -msgstr "" - -#: src/stored/bscan.c:1307 -#, c-format -msgid "Could not add MD5/SHA1 to File record. ERR=%s\n" -msgstr "" - -#: src/stored/bscan.c:1312 -msgid "Updated MD5/SHA1 record\n" -msgstr "" - -#: src/stored/bsdjson.c:74 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bsdjson [options] [-c config_file] [config_file]\n" -" -r get resource type \n" -" -n get resource \n" -" -l get only directives matching dirs (use with -r)\n" -" -D get only data\n" -" -c use as configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -t test - read config and exit\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"Автор Nicolas Boichat (2004)\n" -"\n" -"Версія: %s (%s) %s %s %s\n" -"\n" -"Використання: tray-monitor [-c config_file] [-d debug_level]\n" -" -c задати конфігураційний файл \n" -" -d встановити рівень відлагоджування у \n" -" -dt виводити часову мітку у даних відлагоджування\n" -" -t перевірка - прогитати конфігурацію і завершити\n" -" -? показати це повідомлення.\n" -"\n" - -#: src/stored/bsdjson.c:450 src/stored/butil.c:78 src/stored/stored.c:318 -#, c-format -msgid "No Storage resource defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bsdjson.c:456 src/stored/stored.c:324 -#, c-format -msgid "Only one Storage resource permitted in %s\n" -msgstr "" - -#: src/stored/bsdjson.c:461 src/stored/stored.c:329 -#, c-format -msgid "No Director resource defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bsdjson.c:466 src/stored/stored.c:334 -#, c-format -msgid "No Device resource defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bsdjson.c:474 src/stored/stored.c:342 -#, c-format -msgid "No Messages resource defined in %s. Cannot continue.\n" -msgstr "" - -#: src/stored/bsdjson.c:503 src/stored/stored.c:371 -#, c-format -msgid "\"TLS Certificate\" file not defined for Storage \"%s\" in %s.\n" -msgstr "" - -#: src/stored/bsdjson.c:509 src/stored/stored.c:377 -#, c-format -msgid "\"TLS Key\" file not defined for Storage \"%s\" in %s.\n" -msgstr "" - -#: src/stored/bsdjson.c:515 src/stored/stored.c:383 -#, c-format -msgid "" -"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for " -"Storage \"%s\" in %s. At least one CA certificate store is required when " -"using \"TLS Verify Peer\".\n" -msgstr "" - -#: src/stored/btape.c:165 src/stored/stored.c:132 -#, c-format -msgid "Tape block size (%d) not multiple of system size (%d)\n" -msgstr "" - -#: src/stored/btape.c:169 src/stored/stored.c:136 -#, c-format -msgid "Tape block size (%d) is not a power of 2\n" -msgstr "" - -#: src/stored/btape.c:172 -#, c-format -msgid "" -"\n" -"\n" -"!!!! Warning large disk addressing disabled. boffset_t=%d should be 8 or " -"more !!!!!\n" -"\n" -"\n" -msgstr "" - -#: src/stored/btape.c:179 -#, c-format -msgid "32 bit printf/scanf problem. i=%d x32=%u y32=%u\n" -msgstr "" - -#: src/stored/btape.c:188 -msgid "64 bit printf/scanf problem. i=%d x64=%" -msgstr "" - -#: src/stored/btape.c:193 -#, c-format -msgid "Tape block granularity is %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:269 -msgid "No archive name specified.\n" -msgstr "" - -#: src/stored/btape.c:273 -msgid "Improper number of arguments specified.\n" -msgstr "" - -#: src/stored/btape.c:287 -msgid "btape does not work with DVD storage.\n" -msgstr "" - -#: src/stored/btape.c:292 -msgid "btape only works with tape storage.\n" -msgstr "" - -#: src/stored/btape.c:378 -#, c-format -msgid "Total Volume bytes=%sB. Total Write rate = %sB/s\n" -msgstr "" - -#: src/stored/btape.c:404 -#, c-format -msgid "Volume bytes=%sB. Write rate = %sB/s\n" -msgstr "" - -#: src/stored/btape.c:472 -#, c-format -msgid "open device %s: OK\n" -msgstr "" - -#: src/stored/btape.c:495 -msgid "Enter Volume Name: " -msgstr "" - -#: src/stored/btape.c:502 -#, c-format -msgid "Device open failed. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:507 -#, c-format -msgid "Wrote Volume label for volume \"%s\".\n" -msgstr "" - -#: src/stored/btape.c:521 -msgid "Volume has no label.\n" -msgstr "" - -#: src/stored/btape.c:524 -msgid "Volume label read correctly.\n" -msgstr "" - -#: src/stored/btape.c:527 -#, c-format -msgid "I/O error on device: ERR=%s" -msgstr "" - -#: src/stored/btape.c:530 -#, fuzzy, c-format -msgid "Volume type error: ERR=%s\n" -msgstr "Не вдалось створити %s: ERR=%s\n" - -#: src/stored/btape.c:533 -msgid "Volume name error\n" -msgstr "" - -#: src/stored/btape.c:536 -#, c-format -msgid "Error creating label. ERR=%s" -msgstr "" - -#: src/stored/btape.c:539 -msgid "Volume version error.\n" -msgstr "" - -#: src/stored/btape.c:542 -msgid "Bad Volume label type.\n" -msgstr "" - -#: src/stored/btape.c:545 -msgid "Unknown error.\n" -msgstr "" - -#: src/stored/btape.c:563 -#, c-format -msgid "Bad status from load. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:565 -#, c-format -msgid "Loaded %s\n" -msgstr "" - -#: src/stored/btape.c:574 src/stored/btape.c:1137 src/stored/btape.c:1210 -#: src/stored/btape.c:1289 src/stored/btape.c:1559 -#, c-format -msgid "Bad status from rewind. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:577 src/stored/btape.c:1567 -#, c-format -msgid "Rewound %s\n" -msgstr "" - -#: src/stored/btape.c:603 src/stored/btape.c:1571 -#, c-format -msgid "Bad status from weof. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:607 -#, c-format -msgid "Wrote 1 EOF to %s\n" -msgstr "" - -#: src/stored/btape.c:610 -#, c-format -msgid "Wrote %d EOFs to %s\n" -msgstr "" - -#: src/stored/btape.c:628 -msgid "Moved to end of medium.\n" -msgstr "" - -#: src/stored/btape.c:655 -#, c-format -msgid "Bad status from bsf. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:657 -#, c-format -msgid "Backspaced %d file%s.\n" -msgstr "" - -#: src/stored/btape.c:674 -#, c-format -msgid "Bad status from bsr. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:676 -#, c-format -msgid "Backspaced %d record%s.\n" -msgstr "" - -#: src/stored/btape.c:686 src/stored/status.c:626 -#, c-format -msgid "Configured device capabilities:\n" -msgstr "" - -#: src/stored/btape.c:704 -#, c-format -msgid "Device status:\n" -msgstr "" - -#: src/stored/btape.c:718 src/stored/status.c:682 -#, c-format -msgid "Device parameters:\n" -msgstr "" - -#: src/stored/btape.c:723 -#, c-format -msgid "Status:\n" -msgstr "" - -#: src/stored/btape.c:738 -msgid "" -"Test writing larger and larger records.\n" -"This is a torture test for records.\n" -"I am going to write\n" -"larger and larger records. It will stop when the record size\n" -"plus the header exceeds the block size (by default about 64K)\n" -msgstr "" - -#: src/stored/btape.c:744 -msgid "Do you want to continue? (y/n): " -msgstr "" - -#: src/stored/btape.c:746 src/stored/btape.c:2196 -msgid "Command aborted.\n" -msgstr "" - -#: src/stored/btape.c:763 -#, c-format -msgid "Block %d i=%d\n" -msgstr "" - -#: src/stored/btape.c:790 -msgid "Skipping read backwards test because BSR turned off.\n" -msgstr "" - -#: src/stored/btape.c:794 -msgid "" -"\n" -"=== Write, backup, and re-read test ===\n" -"\n" -"I'm going to write three records and an EOF\n" -"then backup over the EOF and re-read the last record.\n" -"Bacula does this after writing the last block on the\n" -"tape to verify that the block was written correctly.\n" -"\n" -"This is not an *essential* feature ...\n" -"\n" -msgstr "" - -#: src/stored/btape.c:807 src/stored/btape.c:818 src/stored/btape.c:829 -#: src/stored/btape.c:1147 src/stored/btape.c:1163 src/stored/btape.c:1903 -#: src/stored/btape.c:2822 -msgid "Error writing record to block.\n" -msgstr "" - -#: src/stored/btape.c:811 src/stored/btape.c:822 src/stored/btape.c:833 -#: src/stored/btape.c:1151 src/stored/btape.c:1167 src/stored/btape.c:1907 -#: src/stored/btape.c:2826 -msgid "Error writing block to device.\n" -msgstr "" - -#: src/stored/btape.c:814 -#, c-format -msgid "Wrote first record of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:825 -#, c-format -msgid "Wrote second record of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:836 -#, c-format -msgid "Wrote third record of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:843 src/stored/btape.c:848 -#, c-format -msgid "Backspace file failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:852 -msgid "Backspaced over EOF OK.\n" -msgstr "" - -#: src/stored/btape.c:854 -#, c-format -msgid "Backspace record failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:857 -msgid "Backspace record OK.\n" -msgstr "" - -#: src/stored/btape.c:859 src/stored/btape.c:865 -#, c-format -msgid "Read block failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:870 -msgid "Bad data in record. Test failed!\n" -msgstr "" - -#: src/stored/btape.c:874 -msgid "" -"\n" -"Block re-read correct. Test succeeded!\n" -msgstr "" - -#: src/stored/btape.c:875 -msgid "" -"=== End Write, backup, and re-read test ===\n" -"\n" -msgstr "" - -#: src/stored/btape.c:882 -msgid "" -"This is not terribly serious since Bacula only uses\n" -"this function to verify the last block written to the\n" -"tape. Bacula will skip the last block verification\n" -"if you add:\n" -"\n" -"Backward Space Record = No\n" -"\n" -"to your Storage daemon's Device resource definition.\n" -msgstr "" - -#: src/stored/btape.c:904 -#, c-format -msgid "Begin writing %i files of %sB with raw blocks of %u bytes.\n" -msgstr "" - -#: src/stored/btape.c:925 src/stored/btape.c:2878 -#, c-format -msgid "Write failed at block %u. stat=%d ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:959 -#, c-format -msgid "Begin writing %i files of %sB with blocks of %u bytes.\n" -msgstr "" - -#: src/stored/btape.c:968 -msgid "" -"\n" -"Error writing record to block.\n" -msgstr "" - -#: src/stored/btape.c:972 -msgid "" -"\n" -"Error writing block to device.\n" -msgstr "" - -#: src/stored/btape.c:1027 -msgid "The file_size is too big, stop this test with Ctrl-c.\n" -msgstr "" - -#: src/stored/btape.c:1055 -msgid "Test with zero data, should give the maximum throughput.\n" -msgstr "" - -#: src/stored/btape.c:1067 src/stored/btape.c:1093 -msgid "Test with random data, should give the minimum throughput.\n" -msgstr "" - -#: src/stored/btape.c:1082 -msgid "Test with zero data and bacula block structure.\n" -msgstr "" - -#: src/stored/btape.c:1123 -#, c-format -msgid "" -"\n" -"=== Write, rewind, and re-read test ===\n" -"\n" -"I'm going to write %d records and an EOF\n" -"then write %d records and an EOF, then rewind,\n" -"and re-read the data to verify that it is correct.\n" -"\n" -"This is an *essential* feature ...\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1155 src/stored/btape.c:1171 -#, c-format -msgid "Wrote %d blocks of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:1213 src/stored/btape.c:1292 -msgid "Rewind OK.\n" -msgstr "" - -#: src/stored/btape.c:1225 src/stored/btape.c:1343 -msgid "Got EOF on tape.\n" -msgstr "" - -#: src/stored/btape.c:1230 -#, c-format -msgid "Read block %d failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1236 -#, c-format -msgid "Read record failed. Block %d! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1242 src/stored/btape.c:1373 -#, c-format -msgid "Bad data in record. Expected %d, got %d at byte %d. Test failed!\n" -msgstr "" - -#: src/stored/btape.c:1249 -#, c-format -msgid "%d blocks re-read correctly.\n" -msgstr "" - -#: src/stored/btape.c:1252 src/stored/btape.c:1380 -msgid "" -"=== Test Succeeded. End Write, rewind, and re-read test ===\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1280 -msgid "Block position test\n" -msgstr "" - -#: src/stored/btape.c:1335 -#, c-format -msgid "Reposition to file:block %d:%d\n" -msgstr "" - -#: src/stored/btape.c:1337 -msgid "Reposition error.\n" -msgstr "" - -#: src/stored/btape.c:1349 -#, c-format -msgid "" -"Read block %d failed! file=%d blk=%d. ERR=%s\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1351 -msgid "" -"This may be because the tape drive block size is not\n" -" set to variable blocking as normally used by Bacula.\n" -" Please see the Tape Testing chapter in the manual and \n" -" look for using mt with defblksize and setoptions\n" -"If your tape drive block size is correct, then perhaps\n" -" your SCSI driver is *really* stupid and does not\n" -" correctly report the file:block after a FSF. In this\n" -" case try setting:\n" -" Fast Forward Space File = no\n" -" in your Device resource.\n" -msgstr "" - -#: src/stored/btape.c:1367 -#, c-format -msgid "Read record failed! ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1378 -#, c-format -msgid "Block %d re-read correctly.\n" -msgstr "" - -#: src/stored/btape.c:1399 -msgid "" -"\n" -"\n" -"=== Append files test ===\n" -"\n" -"This test is essential to Bacula.\n" -"\n" -"I'm going to write one record in file 0,\n" -" two records in file 1,\n" -" and three records in file 2\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1423 -msgid "Now moving to end of medium.\n" -msgstr "" - -#: src/stored/btape.c:1425 src/stored/btape.c:1654 -#, c-format -msgid "We should be in file 3. I am at file %d. %s\n" -msgstr "" - -#: src/stored/btape.c:1426 src/stored/btape.c:1444 src/stored/btape.c:1643 -#: src/stored/btape.c:1655 src/stored/btape.c:1668 src/stored/btape.c:1685 -msgid "This is correct!" -msgstr "" - -#: src/stored/btape.c:1426 src/stored/btape.c:1444 src/stored/btape.c:1643 -#: src/stored/btape.c:1655 src/stored/btape.c:1668 src/stored/btape.c:1685 -msgid "This is NOT correct!!!!" -msgstr "" - -#: src/stored/btape.c:1432 -msgid "" -"\n" -"Now the important part, I am going to attempt to append to the tape.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1439 -msgid "" -"Done appending, there should be no I/O errors\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1440 -msgid "Doing Bacula scan of blocks:\n" -msgstr "" - -#: src/stored/btape.c:1442 -msgid "End scanning the tape.\n" -msgstr "" - -#: src/stored/btape.c:1443 src/stored/btape.c:1667 -#, c-format -msgid "We should be in file 4. I am at file %d. %s\n" -msgstr "" - -#: src/stored/btape.c:1468 -msgid "" -"\n" -"Autochanger enabled, but no name or no command device specified.\n" -msgstr "" - -#: src/stored/btape.c:1472 -msgid "" -"\n" -"Ah, I see you have an autochanger configured.\n" -"To test the autochanger you must have a blank tape\n" -" that I can write on in Slot 1.\n" -msgstr "" - -#: src/stored/btape.c:1475 -msgid "" -"\n" -"Do you wish to continue with the Autochanger test? (y/n): " -msgstr "" - -#: src/stored/btape.c:1482 -msgid "" -"\n" -"\n" -"=== Autochanger test ===\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1491 -msgid "3301 Issuing autochanger \"loaded\" command.\n" -msgstr "" - -#: src/stored/btape.c:1500 -#, c-format -msgid "3991 Bad autochanger command: %s\n" -msgstr "" - -#: src/stored/btape.c:1501 -#, c-format -msgid "3991 result=\"%s\": ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1505 -#, c-format -msgid "Slot %d loaded. I am going to unload it.\n" -msgstr "" - -#: src/stored/btape.c:1507 -msgid "Nothing loaded in the drive. OK.\n" -msgstr "" - -#: src/stored/btape.c:1514 -#, c-format -msgid "3302 Issuing autochanger \"unload %d %d\" command.\n" -msgstr "" - -#: src/stored/btape.c:1519 -#, c-format -msgid "unload status=%s %d\n" -msgstr "" - -#: src/stored/btape.c:1519 -msgid "Bad" -msgstr "" - -#: src/stored/btape.c:1522 -#, c-format -msgid "3992 Bad autochanger command: %s\n" -msgstr "" - -#: src/stored/btape.c:1523 -#, c-format -msgid "3992 result=\"%s\": ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1533 -#, c-format -msgid "3303 Issuing autochanger \"load %d %d\" command.\n" -msgstr "" - -#: src/stored/btape.c:1541 -#, c-format -msgid "3303 Autochanger \"load %d %d\" status is OK.\n" -msgstr "" - -#: src/stored/btape.c:1545 -#, c-format -msgid "3993 Bad autochanger command: %s\n" -msgstr "" - -#: src/stored/btape.c:1546 -#, c-format -msgid "3993 result=\"%s\": ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1561 -msgid "" -"\n" -"The test failed, probably because you need to put\n" -"a longer sleep time in the mtx-script in the load) case.\n" -"Adding a 30 second sleep and trying again ...\n" -msgstr "" - -#: src/stored/btape.c:1574 -#, c-format -msgid "Wrote EOF to %s\n" -msgstr "" - -#: src/stored/btape.c:1578 -#, c-format -msgid "" -"\n" -"The test worked this time. Please add:\n" -"\n" -" sleep %d\n" -"\n" -"to your mtx-changer script in the load) case.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1583 -msgid "" -"\n" -"The test autochanger worked!!\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1594 -msgid "You must correct this error or the Autochanger will not work.\n" -msgstr "" - -#: src/stored/btape.c:1612 -msgid "" -"\n" -"\n" -"=== Forward space files test ===\n" -"\n" -"This test is essential to Bacula.\n" -"\n" -"I'm going to write five files then test forward spacing\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1637 -msgid "Now forward spacing 1 file.\n" -msgstr "" - -#: src/stored/btape.c:1639 src/stored/btape.c:1651 src/stored/btape.c:1664 -#: src/stored/btape.c:1682 src/stored/btape.c:1858 -#, c-format -msgid "Bad status from fsr. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1642 -#, c-format -msgid "We should be in file 1. I am at file %d. %s\n" -msgstr "" - -#: src/stored/btape.c:1649 -msgid "Now forward spacing 2 files.\n" -msgstr "" - -#: src/stored/btape.c:1662 -msgid "Now forward spacing 4 files.\n" -msgstr "" - -#: src/stored/btape.c:1674 -msgid "" -"The test worked this time. Please add:\n" -"\n" -" Fast Forward Space File = no\n" -"\n" -"to your Device resource for this drive.\n" -msgstr "" - -#: src/stored/btape.c:1680 -msgid "Now forward spacing 1 more file.\n" -msgstr "" - -#: src/stored/btape.c:1684 -#, c-format -msgid "We should be in file 5. I am at file %d. %s\n" -msgstr "" - -#: src/stored/btape.c:1689 -msgid "" -"\n" -"=== End Forward space files test ===\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1693 -msgid "" -"\n" -"The forward space file test failed.\n" -msgstr "" - -#: src/stored/btape.c:1695 -msgid "" -"You have Fast Forward Space File enabled.\n" -"I am turning it off then retrying the test.\n" -msgstr "" - -#: src/stored/btape.c:1701 -msgid "" -"You must correct this error or Bacula will not work.\n" -"Some systems, e.g. OpenBSD, require you to set\n" -" Use MTIOCGET= no\n" -"in your device resource. Use with caution.\n" -msgstr "" - -#: src/stored/btape.c:1735 -msgid "" -"\n" -"Append test failed. Attempting again.\n" -"Setting \"Hardware End of Medium = no\n" -" and \"Fast Forward Space File = no\n" -"and retrying append test.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1743 -msgid "" -"\n" -"\n" -"It looks like the test worked this time, please add:\n" -"\n" -" Hardware End of Medium = No\n" -"\n" -" Fast Forward Space File = No\n" -"to your Device resource in the Storage conf file.\n" -msgstr "" - -#: src/stored/btape.c:1750 -msgid "" -"\n" -"\n" -"That appears *NOT* to have corrected the problem.\n" -msgstr "" - -#: src/stored/btape.c:1755 -msgid "" -"\n" -"\n" -"It looks like the append failed. Attempting again.\n" -"Setting \"BSF at EOM = yes\" and retrying append test.\n" -msgstr "" - -#: src/stored/btape.c:1760 -msgid "" -"\n" -"\n" -"It looks like the test worked this time, please add:\n" -"\n" -" Hardware End of Medium = No\n" -" Fast Forward Space File = No\n" -" BSF at EOM = yes\n" -"\n" -"to your Device resource in the Storage conf file.\n" -msgstr "" - -#: src/stored/btape.c:1771 -msgid "" -"\n" -"Append test failed.\n" -"\n" -"\n" -"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" -"Unable to correct the problem. You MUST fix this\n" -"problem before Bacula can use your tape drive correctly\n" -"\n" -"Perhaps running Bacula in fixed block mode will work.\n" -"Do so by setting:\n" -"\n" -"Minimum Block Size = nnn\n" -"Maximum Block Size = nnn\n" -"\n" -"in your Storage daemon's Device definition.\n" -"nnn must match your tape driver's block size, which\n" -"can be determined by reading your tape manufacturers\n" -"information, and the information on your kernel dirver.\n" -"Fixed block sizes, however, are not normally an ideal solution.\n" -"\n" -"Some systems, e.g. OpenBSD, require you to set\n" -" Use MTIOCGET= no\n" -"in your device resource. Use with caution.\n" -msgstr "" - -#: src/stored/btape.c:1793 -msgid "" -"\n" -"The above Bacula scan should have output identical to what follows.\n" -"Please double check it ...\n" -"=== Sample correct output ===\n" -"1 block of 64448 bytes in file 1\n" -"End of File mark.\n" -"2 blocks of 64448 bytes in file 2\n" -"End of File mark.\n" -"3 blocks of 64448 bytes in file 3\n" -"End of File mark.\n" -"1 block of 64448 bytes in file 4\n" -"End of File mark.\n" -"Total files=4, blocks=7, bytes = 451,136\n" -"=== End sample correct output ===\n" -"\n" -"If the above scan output is not identical to the\n" -"sample output, you MUST correct the problem\n" -"or Bacula will not be able to write multiple Jobs to \n" -"the tape.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:1836 -#, c-format -msgid "Bad status from fsf. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1840 -msgid "Forward spaced 1 file.\n" -msgstr "" - -#: src/stored/btape.c:1843 -#, c-format -msgid "Forward spaced %d files.\n" -msgstr "" - -#: src/stored/btape.c:1862 -msgid "Forward spaced 1 record.\n" -msgstr "" - -#: src/stored/btape.c:1865 -#, c-format -msgid "Forward spaced %d records.\n" -msgstr "" - -#: src/stored/btape.c:1910 -#, c-format -msgid "Wrote one record of %d bytes.\n" -msgstr "" - -#: src/stored/btape.c:1912 -msgid "Wrote block to device.\n" -msgstr "" - -#: src/stored/btape.c:1926 -msgid "Enter length to read: " -msgstr "" - -#: src/stored/btape.c:1931 -msgid "Bad length entered, using default of 1024 bytes.\n" -msgstr "" - -#: src/stored/btape.c:1940 -#, c-format -msgid "Read of %d bytes gives stat=%d. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1963 src/stored/btape.c:2012 -#, c-format -msgid "End of tape\n" -msgstr "" - -#: src/stored/btape.c:1968 -#, c-format -msgid "Starting scan at file %u\n" -msgstr "" - -#: src/stored/btape.c:1973 src/stored/tape_dev.c:614 -#, c-format -msgid "read error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/btape.c:1975 -#, c-format -msgid "Bad status from read %d. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:1978 src/stored/btape.c:1992 src/stored/btape.c:2056 -#: src/stored/btape.c:2068 src/stored/btape.c:2081 src/stored/btape.c:2097 -#, c-format -msgid "1 block of %d bytes in file %d\n" -msgstr "" - -#: src/stored/btape.c:1981 src/stored/btape.c:1995 src/stored/btape.c:2059 -#: src/stored/btape.c:2071 src/stored/btape.c:2084 src/stored/btape.c:2100 -#, c-format -msgid "%d blocks of %d bytes in file %d\n" -msgstr "" - -#: src/stored/btape.c:2003 src/stored/btape.c:2075 -#, c-format -msgid "End of File mark.\n" -msgstr "" - -#: src/stored/btape.c:2024 src/stored/btape.c:2128 -#, c-format -msgid "Total files=%d, blocks=%d, bytes = %s\n" -msgstr "" - -#: src/stored/btape.c:2088 -#, c-format -msgid "Short block read.\n" -msgstr "" - -#: src/stored/btape.c:2091 -#, c-format -msgid "Error reading block. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2115 -#, c-format -msgid "" -"Block=%u file,blk=%u,%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%s " -"rlen=%d\n" -msgstr "" - -#: src/stored/btape.c:2137 -#, c-format -msgid "Device status: %u. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2169 -#, c-format -msgid "" -"\n" -"This command simulates Bacula writing to a tape.\n" -"It requires either one or two blank tapes, which it\n" -"will label and write.\n" -"\n" -"If you have an autochanger configured, it will use\n" -"the tapes that are in slots 1 and 2, otherwise, you will\n" -"be prompted to insert the tapes when necessary.\n" -"\n" -"It will print a status approximately\n" -"every 322 MB, and write an EOF every %s. If you have\n" -"selected the simple test option, after writing the first tape\n" -"it will rewind it and re-read the last block written.\n" -"\n" -"If you have selected the multiple tape test, when the first tape\n" -"fills, it will ask for a second, and after writing a few more \n" -"blocks, it will stop. Then it will begin re-reading the\n" -"two tapes.\n" -"\n" -"This may take a long time -- hours! ...\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2187 -msgid "" -"Do you want to run the simplified test (s) with one tape\n" -"or the complete multiple tape (m) test: (s/m) " -msgstr "" - -#: src/stored/btape.c:2190 -msgid "Simple test (single tape) selected.\n" -msgstr "" - -#: src/stored/btape.c:2193 -msgid "Multiple tape test selected.\n" -msgstr "" - -#: src/stored/btape.c:2235 -msgid "Wrote Start of Session label.\n" -msgstr "" - -#: src/stored/btape.c:2254 -#, c-format -msgid "%s Begin writing Bacula records to tape ...\n" -msgstr "" - -#: src/stored/btape.c:2256 -#, c-format -msgid "%s Begin writing Bacula records to first tape ...\n" -msgstr "" - -#: src/stored/btape.c:2282 -msgid "Flush block failed.\n" -msgstr "" - -#: src/stored/btape.c:2296 -#, c-format -msgid "Wrote block=%u, file,blk=%u,%u VolBytes=%s rate=%sB/s\n" -msgstr "" - -#: src/stored/btape.c:2307 -#, c-format -msgid "%s Flush block, write EOF\n" -msgstr "" - -#: src/stored/btape.c:2316 -msgid "Wrote 1000 blocks on second tape. Done.\n" -msgstr "" - -#: src/stored/btape.c:2321 -msgid "Not OK\n" -msgstr "" - -#: src/stored/btape.c:2345 -#, fuzzy -msgid "Job canceled.\n" -msgstr "Статус задачі: Відмінена" - -#: src/stored/btape.c:2356 -msgid "Set ok=false after write_block_to_device.\n" -msgstr "" - -#: src/stored/btape.c:2360 -msgid "Wrote End of Session label.\n" -msgstr "" - -#: src/stored/btape.c:2384 -#, c-format -msgid "Wrote state file last_block_num1=%d last_block_num2=%d\n" -msgstr "" - -#: src/stored/btape.c:2388 -#, c-format -msgid "Could not create state file: %s ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2399 -#, c-format -msgid "" -"\n" -"\n" -"%s Done filling tape at %d:%d. Now beginning re-read of tape ...\n" -msgstr "" - -#: src/stored/btape.c:2402 -#, c-format -msgid "" -"\n" -"\n" -"%s Done filling tapes at %d:%d. Now beginning re-read of first tape ...\n" -msgstr "" - -#: src/stored/btape.c:2408 -#, fuzzy -msgid "do_unfill failed.\n" -msgstr "Помилка команди" - -#: src/stored/btape.c:2413 -#, c-format -msgid "%s: Error during test.\n" -msgstr "" - -#: src/stored/btape.c:2448 -msgid "" -"\n" -"The state file level has changed. You must redo\n" -"the fill command.\n" -msgstr "" - -#: src/stored/btape.c:2455 -#, c-format -msgid "" -"\n" -"Could not find the state file: %s ERR=%s\n" -"You must redo the fill command.\n" -msgstr "" - -#: src/stored/btape.c:2521 -msgid "Mount first tape. Press enter when ready: " -msgstr "" - -#: src/stored/btape.c:2538 -msgid "Rewinding.\n" -msgstr "" - -#: src/stored/btape.c:2543 -#, c-format -msgid "Reading the first 10000 records from %u:%u.\n" -msgstr "" - -#: src/stored/btape.c:2547 src/stored/btape.c:2616 -#, c-format -msgid "Reposition from %u:%u to %u:%u\n" -msgstr "" - -#: src/stored/btape.c:2550 src/stored/btape.c:2603 src/stored/btape.c:2619 -#, c-format -msgid "Reposition error. ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2553 -#, c-format -msgid "Reading block %u.\n" -msgstr "" - -#: src/stored/btape.c:2555 src/stored/btape.c:2608 src/stored/btape.c:2624 -#, c-format -msgid "Error reading block: ERR=%s\n" -msgstr "" - -#: src/stored/btape.c:2560 -msgid "" -"\n" -"The last block on the tape matches. Test succeeded.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2563 -msgid "" -"\n" -"The last block of the first tape matches.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2587 -msgid "Mount second tape. Press enter when ready: " -msgstr "" - -#: src/stored/btape.c:2601 -#, c-format -msgid "Reposition from %u:%u to 0:1\n" -msgstr "" - -#: src/stored/btape.c:2606 src/stored/btape.c:2622 -#, c-format -msgid "Reading block %d.\n" -msgstr "" - -#: src/stored/btape.c:2612 -msgid "" -"\n" -"The first block on the second tape matches.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2628 -msgid "" -"\n" -"The last block on the second tape matches. Test succeeded.\n" -"\n" -msgstr "" - -#: src/stored/btape.c:2646 -#, c-format -msgid "10000 records read now at %d:%d\n" -msgstr "" - -#: src/stored/btape.c:2672 src/stored/btape.c:2683 src/stored/btape.c:2728 -msgid "Last block written" -msgstr "" - -#: src/stored/btape.c:2674 src/stored/btape.c:2684 -msgid "Block read back" -msgstr "" - -#: src/stored/btape.c:2675 -#, c-format -msgid "" -"\n" -"\n" -"The blocks differ at byte %u\n" -msgstr "" - -#: src/stored/btape.c:2676 -msgid "" -"\n" -"\n" -"!!!! The last block written and the block\n" -"that was read back differ. The test FAILED !!!!\n" -"This must be corrected before you use Bacula\n" -"to write multi-tape Volumes.!!!!\n" -msgstr "" - -#: src/stored/btape.c:2712 -#, c-format -msgid "Last block at: %u:%u this_dev_block_num=%d\n" -msgstr "" - -#: src/stored/btape.c:2726 -#, c-format -msgid "Block not written: FileIndex=%u blk_block=%u Size=%u\n" -msgstr "" - -#: src/stored/btape.c:2730 -msgid "Block not written" -msgstr "" - -#: src/stored/btape.c:2745 -#, c-format -msgid "End of tape %d:%d. Volume Bytes=%s. Write rate = %sB/s\n" -msgstr "" - -#: src/stored/btape.c:2796 -msgid "Test writing blocks of 64512 bytes to tape.\n" -msgstr "" - -#: src/stored/btape.c:2798 -msgid "How many blocks do you want to write? (1000): " -msgstr "" - -#: src/stored/btape.c:2815 -#, c-format -msgid "Begin writing %d Bacula blocks to tape ...\n" -msgstr "" - -#: src/stored/btape.c:2858 -#, c-format -msgid "Begin writing raw blocks of %u bytes.\n" -msgstr "" - -#: src/stored/btape.c:2889 -msgid "test autochanger" -msgstr "" - -#: src/stored/btape.c:2890 -msgid "backspace file" -msgstr "" - -#: src/stored/btape.c:2891 -msgid "backspace record" -msgstr "" - -#: src/stored/btape.c:2892 -msgid "list device capabilities" -msgstr "" - -#: src/stored/btape.c:2893 -msgid "clear tape errors" -msgstr "" - -#: src/stored/btape.c:2894 -msgid "go to end of Bacula data for append" -msgstr "" - -#: src/stored/btape.c:2895 -msgid "go to the physical end of medium" -msgstr "" - -#: src/stored/btape.c:2896 -msgid "fill tape, write onto second volume" -msgstr "" - -#: src/stored/btape.c:2897 -msgid "read filled tape" -msgstr "" - -#: src/stored/btape.c:2898 -msgid "forward space a file" -msgstr "" - -#: src/stored/btape.c:2899 -msgid "forward space a record" -msgstr "" - -#: src/stored/btape.c:2900 -msgid "print this command" -msgstr "" - -#: src/stored/btape.c:2901 -msgid "write a Bacula label to the tape" -msgstr "" - -#: src/stored/btape.c:2902 -msgid "load a tape" -msgstr "" - -#: src/stored/btape.c:2903 -msgid "quit btape" -msgstr "" - -#: src/stored/btape.c:2904 -msgid "use write() to fill tape" -msgstr "" - -#: src/stored/btape.c:2905 -msgid "read and print the Bacula tape label" -msgstr "" - -#: src/stored/btape.c:2906 -msgid "test record handling functions" -msgstr "" - -#: src/stored/btape.c:2907 -msgid "rewind the tape" -msgstr "" - -#: src/stored/btape.c:2908 -msgid "read() tape block by block to EOT and report" -msgstr "" - -#: src/stored/btape.c:2909 -msgid "Bacula read block by block to EOT and report" -msgstr "" - -#: src/stored/btape.c:2910 -msgid "" -"[file_size=n(GB)|nb_file=3|skip_zero|skip_random|skip_raw|skip_block] report " -"drive speed" -msgstr "" - -#: src/stored/btape.c:2911 -msgid "print tape status" -msgstr "" - -#: src/stored/btape.c:2912 -msgid "General test Bacula tape functions" -msgstr "" - -#: src/stored/btape.c:2913 -msgid "write an EOF on the tape" -msgstr "" - -#: src/stored/btape.c:2914 -msgid "write a single Bacula block" -msgstr "" - -#: src/stored/btape.c:2915 -msgid "read a single record" -msgstr "" - -#: src/stored/btape.c:2916 -msgid "read a single Bacula block" -msgstr "" - -#: src/stored/btape.c:2917 -msgid "quick fill command" -msgstr "" - -#: src/stored/btape.c:2938 -#, c-format -msgid "\"%s\" is an invalid command\n" -msgstr "" - -#: src/stored/btape.c:2947 -#, c-format -msgid "Interactive commands:\n" -msgstr "" - -#: src/stored/btape.c:2958 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: btape \n" -" -b specify bootstrap file\n" -" -c set configuration file to file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -p proceed inspite of I/O errors\n" -" -s turn off signals\n" -" -v be verbose\n" -" -? print this message.\n" -"\n" -msgstr "" -"Автор Nicolas Boichat (2004)\n" -"\n" -"Версія: %s (%s) %s %s %s\n" -"\n" -"Використання: tray-monitor [-c config_file] [-d debug_level]\n" -" -c задати конфігураційний файл \n" -" -d встановити рівень відлагоджування у \n" -" -dt виводити часову мітку у даних відлагоджування\n" -" -t перевірка - прогитати конфігурацію і завершити\n" -" -? показати це повідомлення.\n" -"\n" - -#: src/stored/btape.c:3046 -#, c-format -msgid "Mount second Volume on device %s and press return when ready: " -msgstr "" - -#: src/stored/btape.c:3074 -#, c-format -msgid "Mount blank Volume on device %s and press return when ready: " -msgstr "" - -#: src/stored/btape.c:3094 -#, c-format -msgid "End of Volume \"%s\" %d records.\n" -msgstr "" - -#: src/stored/btape.c:3108 -#, c-format -msgid "Read block=%u, VolBytes=%s rate=%sB/s\n" -msgstr "" - -#: src/stored/btape.c:3121 -#, c-format -msgid "Cannot open Dev=%s, Vol=%s\n" -msgstr "" - -#: src/stored/butil.c:48 -msgid "Nohdr," -msgstr "" - -#: src/stored/butil.c:51 -msgid "partial," -msgstr "" - -#: src/stored/butil.c:54 -msgid "empty," -msgstr "" - -#: src/stored/butil.c:57 -msgid "Nomatch," -msgstr "" - -#: src/stored/butil.c:60 -msgid "cont," -msgstr "" - -#: src/stored/butil.c:150 -msgid "Volume name or names is too long. Please use a .bsr file.\n" -msgstr "" - -#: src/stored/butil.c:170 -#, c-format -msgid "Cannot find device \"%s\" in config file %s.\n" -msgstr "" - -#: src/stored/butil.c:177 -#, c-format -msgid "Cannot init device %s\n" -msgstr "" - -#: src/stored/butil.c:203 -#, c-format -msgid "Cannot open %s\n" -msgstr "" - -#: src/stored/butil.c:290 -#, c-format -msgid "Could not find device \"%s\" in config file %s.\n" -msgstr "" - -#: src/stored/butil.c:295 -#, c-format -msgid "Using device: \"%s\" for writing.\n" -msgstr "" - -#: src/stored/butil.c:297 -#, c-format -msgid "Using device: \"%s\" for reading.\n" -msgstr "" - -#: src/stored/butil.c:313 -msgid "Unexpected End of Data\n" -msgstr "" - -#: src/stored/butil.c:315 -msgid "Unexpected End of Tape\n" -msgstr "" - -#: src/stored/butil.c:317 -msgid "Unexpected End of File\n" -msgstr "" - -#: src/stored/butil.c:319 -msgid "Tape Door is Open\n" -msgstr "" - -#: src/stored/butil.c:321 -msgid "Unexpected Tape is Off-line\n" -msgstr "" - -#: src/stored/dde_status.c:149 -msgid "Dedupengine status:\n" -msgstr "" - -#: src/stored/dde_status.c:159 -#, c-format -msgid "" -" DDE: hash_count=%llu ref_count=%llu ref_size=%sB\n" -" ref_ratio=%.2f size_ratio=%.2f dde_errors=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:167 -#, c-format -msgid "" -" Config: bnum=%lld bmin=%lld bmax=%lld mlock_strategy=%ld mlocked=%lldMB " -"mlock_max=%lldMB\n" -msgstr "" - -#: src/stored/dde_status.c:173 -#, c-format -msgid " Addr: bad_addr=%llu bad_bucket=%llu wrong=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:178 -#, c-format -msgid "" -" Containers: chunk_allocated=%llu chunk_used=%llu\n" -" disk_space_allocated=%sB disk_space_used=%sB containers_errors=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:199 -#, c-format -msgid "" -" Vacuum: last_run=\"%s\" duration=%llus ref_count=%llu ref_size=%sB\n" -" vacuum_errors=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:205 -#, c-format -msgid " Stats: read_chunk=%llu query_hash=%llu new_hash=%llu calc_hash=%llu\n" -msgstr "" - -#: src/stored/dde_status.c:213 -#, c-format -msgid " acc_container_cnt[%d]:%s %14llu\n" -msgstr "" - -#: src/stored/dde_status.c:226 -#, c-format -msgid " [%d]%s filesize=%sB/%sB usage=%llu/%llu/%llu %3llu%% %s\n" -msgstr "" - -#: src/stored/dde_status.c:239 -#, c-format -msgid " [%d]%s filesize=%sB/%sB usage=%llu/%llu/%llu %3llu%%\n" -msgstr "" - -#: src/stored/dde_vacuum.c:84 -#, c-format -msgid "" -"Skipping volume \"%s\" from vacuum process, the volume is only created in " -"the catalog.\n" -msgstr "" - -#: src/stored/dde_vacuum.c:91 -#, c-format -msgid "" -"Error: Volume \"%s\" (status %s) not found in %s. All volumes should be " -"available for a Vacuum. ERR=%s\n" -msgstr "" - -#: src/stored/dedupengine.c:384 -#, fuzzy -msgid "Initializing DDE." -msgstr "Ініціалізація ..." - -#: src/stored/dedupengine.c:392 -msgid "DedupDirectory directive in Storage resource missing." -msgstr "" - -#: src/stored/dedupengine.c:399 -#, fuzzy, c-format -msgid "Cannot create DedupDirectory: %s" -msgstr "Не можливо створити теку %s: ERR=%s\n" - -#: src/stored/dedupengine.c:405 -#, fuzzy, c-format -msgid "Cannot create DedupIndexDirectory: %s" -msgstr "Не можливо створити теку %s: ERR=%s\n" - -#: src/stored/dedupengine.c:414 src/stored/dedupengine.c:421 -#, fuzzy, c-format -msgid "Cannot create recovery directory: %s" -msgstr "Не можливо створити теку %s: ERR=%s\n" - -#: src/stored/dedupengine.c:428 -#, fuzzy, c-format -msgid "Cannot delete temporary recovery directory: %s" -msgstr "Не можливо перевстановити поточну теку: ERR=%s\n" - -#: src/stored/dedupengine.c:1246 -#, c-format -msgid "bucket version (%ld) is posterior to the software (%ld)\n" -msgstr "" - -#: src/stored/dedupengine.c:1772 -#, c-format -msgid "" -"The Deduplication Engine filesystem \"%s\" is full (only %sB free). Running " -"jobs will be stopped and marked as Incomplete. Extend the storage space and " -"run the vacuum procedure\n" -msgstr "" - -#: src/stored/dedupengine.c:1782 -#, c-format -msgid "" -"The Deduplication Engine filesystem \"%s\" is nearly full (%sB free). Please " -"run the vacuum procedure\n" -msgstr "" - -#: src/stored/dedupengine.c:1965 -msgid "Header not found in DDE index\n" -msgstr "" - -#: src/stored/dedupengine.c:1971 -msgid "DDE index bad magic in header\n" -msgstr "" - -#: src/stored/dedupengine.c:1976 -#, c-format -msgid "" -"Cannot open DDE because the version (%ld) is posterior to the software " -"(%ld)\n" -msgstr "" - -#: src/stored/dedupengine.c:1996 -#, c-format -msgid "Cannot open DDE, unknown hash ID: %ld\n" -msgstr "" - -#: src/stored/dedupstored.c:99 -#, c-format -msgid "Transport thread error: joining thread (%d)\n" -msgstr "" - -#: src/stored/dedupstored.c:208 -#, c-format -msgid "Socket error or stop during rehydration. ERR=%d\n" -msgstr "" - -#: src/stored/dedupstored.c:226 -#, c-format -msgid "Unexpected message from FD, n=%d msglen=%d msg=%s\n" -msgstr "" - -#: src/stored/dedupstored.c:415 -#, c-format -msgid "BAD HASH: computed=#%08x expected=#%08x size=%d\n" -msgstr "" - -#: src/stored/dedupstored.c:521 -#, c-format -msgid "GOT chunk #%08x, now do a CANCEL\n" -msgstr "" - -#: src/stored/dedupstored.c:528 -#, c-format -msgid "Received unexpected chunk #%08x\n" -msgstr "" - -#: src/stored/dedupstored.c:535 -#, c-format -msgid "Cannot lz4decode received chunk #%08x\n" -msgstr "" - -#: src/stored/dedupstored.c:541 -#, c-format -msgid "Received chunk #%08x with the wrong size %d (expected %ld) \n" -msgstr "" - -#: src/stored/dedupstored.c:550 -#, c-format -msgid "Received a chunk with a bad hash #%08x (expected #%08x) size=%d\n" -msgstr "" - -#: src/stored/dedupstored.c:585 -msgid "Ignore dedup flow control protocol error\n" -msgstr "" - -#: src/stored/dedupstored.c:599 -#, c-format -msgid "Ignore unknown inter-daemon command: %ld\n" -msgstr "" - -#: src/stored/dedupstored.c:678 -msgid "Got Dedup data but dedupengine is not started\n" -msgstr "" - -#: src/stored/dedupstored.c:718 -#, fuzzy -msgid "Error sending chunk request to client\n" -msgstr "Помилка надсилання Hello до Збирача. ERR=%s\n" - -#: src/stored/dev.c:146 -#, c-format -msgid "Unable to stat device %s: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:164 -#, c-format -msgid "" -"%s is an unknown device type. Must be tape or directory\n" -" or have RequiresMount=yes for DVD. st_mode=%x\n" -msgstr "" - -#: src/stored/dev.c:177 -msgid "DVD support is now deprecated.\n" -msgstr "" - -#: src/stored/dev.c:180 -msgid "Aligned device not supported. Please use \"DeviceType = File\"\n" -msgstr "" - -#: src/stored/dev.c:183 -msgid "Deduplication device not supported. Please use \"DeviceType = File\"\n" -msgstr "" - -#: src/stored/dev.c:212 -msgid "Deduplication device not properly configured.\n" -msgstr "" - -#: src/stored/dev.c:303 -#, c-format -msgid "Using default block size %u on dedup device %s\n" -msgstr "" - -#: src/stored/dev.c:341 -#, c-format -msgid "Unable to stat mount point %s: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:346 -msgid "" -"Mount and unmount commands must defined for a device which requires mount.\n" -msgstr "" - -#: src/stored/dev.c:362 -#, c-format -msgid "Min block size > max on device %s\n" -msgstr "" - -#: src/stored/dev.c:366 -#, c-format -msgid "Block size %u on device %s is too large, using default %u\n" -msgstr "" - -#: src/stored/dev.c:371 -#, c-format -msgid "Max block size %u not multiple of device %s block size=%d.\n" -msgstr "" - -#: src/stored/dev.c:375 -#, c-format -msgid "Max Vol Size < 8 * Max Block Size for device %s\n" -msgstr "" - -#: src/stored/dev.c:391 src/stored/dev.c:397 -#, c-format -msgid "Unable to init cond variable: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:403 -#, fuzzy, c-format -msgid "Unable to init spool mutex: ERR=%s\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/stored/dev.c:409 -#, fuzzy, c-format -msgid "Unable to init acquire mutex: ERR=%s\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/stored/dev.c:415 -#, fuzzy, c-format -msgid "Unable to init read acquire mutex: ERR=%s\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/stored/dev.c:421 -#, fuzzy, c-format -msgid "Unable to init adata mutex: ERR=%s\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/stored/dev.c:427 -#, fuzzy, c-format -msgid "Unable to init volcat mutex: ERR=%s\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/stored/dev.c:433 -#, fuzzy, c-format -msgid "Unable to init dcrs mutex: ERR=%s\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/stored/dev.c:523 -msgid "Illegal mode given to open dev.\n" -msgstr "" - -#: src/stored/dev.c:575 -msgid "Bad device call. Device not open\n" -msgstr "" - -#: src/stored/dev.c:587 -#, c-format -msgid "Seek error: ERR=%s\n" -msgstr "" - -#: src/stored/dev.c:588 src/stored/file_dev.c:78 src/stored/file_dev.c:105 -#: src/stored/tape_dev.c:294 -#, c-format -msgid "lseek error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/device.c:126 -#, c-format -msgid "End of medium on Volume \"%s\" Bytes=%s Blocks=%s at %s.\n" -msgstr "" - -#: src/stored/device.c:157 -#, c-format -msgid "New volume \"%s\" mounted on device %s at %s.\n" -msgstr "" - -#: src/stored/device.c:169 -#, c-format -msgid "write_block_to_device Volume label failed. ERR=%s" -msgstr "" - -#: src/stored/device.c:201 -#, c-format -msgid "write_block_to_device overflow block failed. ERR=%s" -msgstr "" - -#: src/stored/device.c:206 -#, c-format -msgid "Catastrophic error. Cannot write overflow block to device %s. ERR=%s" -msgstr "" - -#: src/stored/device.c:367 src/stored/tape_dev.c:161 -#, c-format -msgid "Unable to open device %s: ERR=%s\n" -msgstr "" - -#: src/stored/device.c:369 -#, c-format -msgid "Unable to open archive %s: ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:164 -#, c-format -msgid "Connection request from %s failed.\n" -msgstr "" - -#: src/stored/dircmd.c:202 -msgid "Unable to authenticate Director\n" -msgstr "" - -#: src/stored/dircmd.c:296 -#, fuzzy, c-format -msgid "Bad client command: %s" -msgstr "Погана відповідь на команду Hello: ERR=%s\n" - -#: src/stored/dircmd.c:306 -#, fuzzy -msgid "Client daemon" -msgstr "Збирач" - -#: src/stored/dircmd.c:309 -#, fuzzy, c-format -msgid "Failed to connect to Client daemon: %s:%d\n" -msgstr "Ініціалізація контексту TLS для Консолі невдала \"%s\".\n" - -#: src/stored/dircmd.c:387 -msgid "In storage_cmd port==0, no prior Storage connection.\n" -msgstr "" - -#: src/stored/dircmd.c:439 -#, c-format -msgid "3991 Bad setdebug command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:484 -msgid "3000 Deduplication vacuum marked to be canceled.\n" -msgstr "" - -#: src/stored/dircmd.c:486 -msgid "3900 No deduplication vacuum process found.\n" -msgstr "" - -#: src/stored/dircmd.c:490 -msgid "3903 Error scanning cancel command.\n" -msgstr "" - -#: src/stored/dircmd.c:494 -#, c-format -msgid "3904 Job %s not found.\n" -msgstr "" - -#: src/stored/dircmd.c:523 -#, c-format -msgid "3000 JobId=%ld Job=\"%s\" marked to be %s.\n" -msgstr "" - -#: src/stored/dircmd.c:602 src/stored/dircmd.c:1003 src/stored/dircmd.c:1163 -#: src/stored/dircmd.c:1274 src/stored/dircmd.c:1396 src/stored/dircmd.c:1438 -#, c-format -msgid "3999 Device \"%s\" not found or could not be opened.\n" -msgstr "" - -#: src/stored/dircmd.c:607 -#, c-format -msgid "3903 Error scanning label command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:659 -#, fuzzy, c-format -msgid "3910 Unable to open device \"%s\": ERR=%s\n" -msgstr "Не можливо встановити час файлу %s: ERR=%s\n" - -#: src/stored/dircmd.c:676 -#, c-format -msgid "3920 Cannot label Volume because it is already labeled: \"%s\"\n" -msgstr "" - -#: src/stored/dircmd.c:683 -msgid "3921 Wrong volume mounted.\n" -msgstr "" - -#: src/stored/dircmd.c:687 -msgid "3922 Cannot relabel an ANSI/IBM labeled Volume.\n" -msgstr "" - -#: src/stored/dircmd.c:695 -#, c-format -msgid "3912 Failed to label Volume: ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:711 -#, fuzzy, c-format -msgid "3915 Failed to label Volume: ERR=%s\n" -msgstr "Не можливо встановити час файлу %s: ERR=%s\n" - -#: src/stored/dircmd.c:714 -#, c-format -msgid "3914 Failed to label Volume (no media): ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:717 -#, c-format -msgid "3913 Cannot label Volume. Unknown status %d from read_volume_label()\n" -msgstr "" - -#: src/stored/dircmd.c:755 -#, c-format -msgid "3001 Mounted Volume: %s\n" -msgstr "" - -#: src/stored/dircmd.c:759 src/stored/dircmd.c:1474 -#, c-format -msgid "" -"3902 Cannot mount Volume on Storage Device \"%s\" because:\n" -"%s" -msgstr "" - -#: src/stored/dircmd.c:790 src/stored/reserve.c:648 -#, c-format -msgid "" -"\n" -" Device \"%s\" requested by DIR could not be opened or does not exist.\n" -msgstr "" - -#: src/stored/dircmd.c:812 src/stored/reserve.c:644 -#, c-format -msgid "" -"\n" -" Device \"%s\" in changer \"%s\" requested by DIR could not be opened or " -"does not exist.\n" -msgstr "" - -#: src/stored/dircmd.c:876 -msgid "Specified slot ignored. " -msgstr "" - -#: src/stored/dircmd.c:896 src/stored/dircmd.c:959 -#, fuzzy, c-format -msgid "3901 Unable to open device \"%s\": ERR=%s\n" -msgstr "Не можливо встановити час файлу %s: ERR=%s\n" - -#: src/stored/dircmd.c:917 src/stored/dircmd.c:947 -#, c-format -msgid "3001 Device \"%s\" is mounted with Volume \"%s\"\n" -msgstr "" - -#: src/stored/dircmd.c:920 src/stored/dircmd.c:950 src/stored/dircmd.c:969 -#, c-format -msgid "" -"3905 Device \"%s\" open but no Bacula volume is mounted.\n" -"If this is not a blank tape, try unmounting and remounting the Volume.\n" -msgstr "" - -#: src/stored/dircmd.c:931 -#, c-format -msgid "3001 Device \"%s\" is doing acquire.\n" -msgstr "" - -#: src/stored/dircmd.c:936 src/stored/dircmd.c:1134 -#, c-format -msgid "3903 Device \"%s\" is being labeled.\n" -msgstr "" - -#: src/stored/dircmd.c:966 -#, c-format -msgid "3001 Device \"%s\" is already mounted with Volume \"%s\"\n" -msgstr "" - -#: src/stored/dircmd.c:979 -#, c-format -msgid "3002 Device \"%s\" is mounted.\n" -msgstr "" - -#: src/stored/dircmd.c:981 src/stored/dircmd.c:1103 src/stored/dircmd.c:1122 -#: src/stored/dircmd.c:1154 -#, c-format -msgid "3907 %s" -msgstr "" - -#: src/stored/dircmd.c:984 -#, c-format -msgid "3906 File device \"%s\" is always mounted.\n" -msgstr "" - -#: src/stored/dircmd.c:993 -#, c-format -msgid "3930 Device \"%s\" is being released.\n" -msgstr "" - -#: src/stored/dircmd.c:997 -#, fuzzy, c-format -msgid "3905 Unknown wait state %d\n" -msgstr "Невідомий статус задачі %c. " - -#: src/stored/dircmd.c:1007 -#, c-format -msgid "3909 Error scanning mount command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1032 -#, c-format -msgid "3002 Device \"%s\" enabled.\n" -msgstr "" - -#: src/stored/dircmd.c:1039 -#, c-format -msgid "3907 Error scanning \"enable\" command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1064 -#, c-format -msgid "3002 Device \"%s\" disabled.\n" -msgstr "" - -#: src/stored/dircmd.c:1071 -#, c-format -msgid "3907 Error scanning \"disable\" command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1100 src/stored/dircmd.c:1156 -#, c-format -msgid "3002 Device \"%s\" unmounted.\n" -msgstr "" - -#: src/stored/dircmd.c:1107 -#, c-format -msgid "3901 Device \"%s\" is already unmounted.\n" -msgstr "" - -#: src/stored/dircmd.c:1125 -#, c-format -msgid "3001 Device \"%s\" unmounted.\n" -msgstr "" - -#: src/stored/dircmd.c:1130 -#, c-format -msgid "3902 Device \"%s\" is busy in acquire.\n" -msgstr "" - -#: src/stored/dircmd.c:1168 -#, c-format -msgid "3907 Error scanning unmount command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1196 -msgid "3916 Error scanning action_on_purge command\n" -msgstr "" - -#: src/stored/dircmd.c:1239 -#, c-format -msgid "3921 Device \"%s\" already released.\n" -msgstr "" - -#: src/stored/dircmd.c:1246 -#, c-format -msgid "3922 Device \"%s\" waiting for sysop.\n" -msgstr "" - -#: src/stored/dircmd.c:1252 -#, c-format -msgid "3922 Device \"%s\" waiting for mount.\n" -msgstr "" - -#: src/stored/dircmd.c:1256 -#, c-format -msgid "3923 Device \"%s\" is busy in acquire.\n" -msgstr "" - -#: src/stored/dircmd.c:1260 -#, c-format -msgid "3914 Device \"%s\" is being labeled.\n" -msgstr "" - -#: src/stored/dircmd.c:1268 -#, c-format -msgid "3022 Device \"%s\" released.\n" -msgstr "" - -#: src/stored/dircmd.c:1279 -#, c-format -msgid "3927 Error scanning release command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1308 -#, c-format -msgid "Could not create bootstrap file %s: ERR=%s\n" -msgstr "" - -#: src/stored/dircmd.c:1321 -msgid "Error parsing bootstrap file.\n" -msgstr "" - -#: src/stored/dircmd.c:1383 -#, c-format -msgid "3998 Device \"%s\" is not an autochanger.\n" -msgstr "" - -#: src/stored/dircmd.c:1400 -#, c-format -msgid "3909 Error scanning autochanger drives/list/slots command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1442 -#, c-format -msgid "3909 Error scanning readlabel command: %s\n" -msgstr "" - -#: src/stored/dircmd.c:1470 -#, c-format -msgid "3001 Volume=%s Slot=%d\n" -msgstr "" - -#: src/stored/dircmd.c:1502 -#, c-format -msgid "3931 Device \"%s\" is BLOCKED. user unmounted.\n" -msgstr "" - -#: src/stored/dircmd.c:1506 -#, c-format -msgid "" -"3932 Device \"%s\" is BLOCKED. user unmounted during wait for media/mount.\n" -msgstr "" - -#: src/stored/dircmd.c:1510 -#, c-format -msgid "3933 Device \"%s\" is BLOCKED waiting for media.\n" -msgstr "" - -#: src/stored/dircmd.c:1514 -#, c-format -msgid "3934 Device \"%s\" is being initialized.\n" -msgstr "" - -#: src/stored/dircmd.c:1518 -#, c-format -msgid "3935 Device \"%s\" is blocked labeling a Volume.\n" -msgstr "" - -#: src/stored/dircmd.c:1522 -#, c-format -msgid "3935 Device \"%s\" is blocked for unknown reason.\n" -msgstr "" - -#: src/stored/dircmd.c:1527 -#, c-format -msgid "3936 Device \"%s\" is busy reading.\n" -msgstr "" - -#: src/stored/dircmd.c:1530 -#, c-format -msgid "3937 Device \"%s\" is busy with writers=%d reserved=%d.\n" -msgstr "" - -#: src/stored/dircmd.c:1550 -#, c-format -msgid "" -"3999 Device \"%s\" requested by DIR could not be locked for shared storage.\n" -msgstr "" - -#: src/stored/dvd.c:252 -#, c-format -msgid "Error writing part %d to the DVD: ERR=%s\n" -msgstr "" - -#: src/stored/dvd.c:254 -#, c-format -msgid "Error while writing current part to the DVD: %s" -msgstr "" - -#: src/stored/dvd.c:264 -#, c-format -msgid "Part %d (%lld bytes) written to DVD.\n" -msgstr "" - -#: src/stored/dvd.c:281 -#, c-format -msgid "Remaining free space %s on %s\n" -msgstr "" - -#: src/stored/dvd.c:347 -#, c-format -msgid "Next Volume part already exists on DVD. Cannot continue: %s\n" -msgstr "" - -#: src/stored/dvd.c:552 -#, c-format -msgid "" -"Error writing. Current part less than total number of parts (%d/%d, device=" -"%s)\n" -msgstr "" - -#: src/stored/dvd.c:559 -#, c-format -msgid "Unable to write last on %s: ERR=%s\n" -msgstr "" - -#: src/stored/fd_cmds.c:209 -#, c-format -msgid "Command error with FD, hanging up. ERR=%s\n" -msgstr "" - -#: src/stored/fd_cmds.c:212 -msgid "Command error with FD, hanging up.\n" -msgstr "" - -#: src/stored/fd_cmds.c:223 -#, c-format -msgid "FD command not found: %s\n" -msgstr "" - -#: src/stored/fd_cmds.c:254 -msgid "Attempt to append on non-open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:266 src/stored/fd_cmds.c:309 -msgid "Attempt to close non-open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:284 -msgid "Attempt to open already open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:338 -msgid "Attempt to read on non-open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:356 -msgid "Attempt to open an already open session.\n" -msgstr "" - -#: src/stored/fd_cmds.c:372 -#, fuzzy -msgid "Cannot open session, received bad parameters.\n" -msgstr "Не вдається відкрити файл %s для виведення. ERR=%s\n" - -#: src/stored/file_dev.c:95 src/stored/tape_dev.c:859 -msgid "Bad call to reposition. Device not open\n" -msgstr "" - -#: src/stored/file_dev.c:157 -#, c-format -msgid "Could not open file device %s. No Volume name given.\n" -msgstr "" - -#: src/stored/file_dev.c:183 -#, fuzzy, c-format -msgid "Could not open(%s,%s,0640): ERR=%s\n" -msgstr "Не вдалось відкрити%s: ERR=%s\n" - -#: src/stored/file_dev.c:202 -#, fuzzy, c-format -msgid "Could not open aligned volume: %s, ERR=%s\n" -msgstr "Не вдалось відкрити%s: ERR=%s\n" - -#: src/stored/file_dev.c:255 -#, c-format -msgid "Unable to truncate device %s. ERR=%s\n" -msgstr "" - -#: src/stored/file_dev.c:272 -#, c-format -msgid "Unable to stat device %s. ERR=%s\n" -msgstr "" - -#: src/stored/file_dev.c:289 -#, c-format -msgid "Device %s doesn't support ftruncate(). Recreating file %s.\n" -msgstr "" - -#: src/stored/file_dev.c:301 -#, c-format -msgid "Could not reopen: %s, ERR=%s\n" -msgstr "" - -#: src/stored/file_dev.c:379 src/stored/tape_dev.c:1024 -#, c-format -msgid "Device %s cannot be %smounted. ERR=%s\n" -msgstr "" - -#: src/stored/hello.c:138 -#, c-format -msgid "" -"Connection from unknown Director %s at %s rejected.\n" -"Please see " -msgstr "" - -#: src/stored/hello.c:165 -#, fuzzy, c-format -msgid "Invalid connection from %s. Len=%d\n" -msgstr "Від'єднуюсь від Клієнта %s:%d\n" - -#: src/stored/hello.c:179 -#, c-format -msgid "Invalid Hello from %s. Len=%d\n" -msgstr "" - -#: src/stored/hello.c:184 -#, fuzzy, c-format -msgid "Client connect failed: Job name not found: %s\n" -msgstr "Керівник не прийняв команду Hello\n" - -#: src/stored/hello.c:193 -#, c-format -msgid "" -"A Client \"%s\" tried to authenticate for Job %s, but the Job is already " -"authenticated with \"%s\".\n" -msgstr "" - -#: src/stored/hello.c:227 -#, c-format -msgid "" -"A Client \"%s\" tried to authenticate for Job %s, but the job is already " -"authenticated.\n" -msgstr "" - -#: src/stored/hello.c:234 src/stored/job.c:197 -msgid "Unable to authenticate File daemon\n" -msgstr "" - -#: src/stored/hello.c:292 -msgid "Client socket not open. Could not connect to Client.\n" -msgstr "" - -#: src/stored/hello.c:308 src/stored/hello.c:310 -#, fuzzy, c-format -msgid "Recv request to Client failed. ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/stored/hello.c:315 src/stored/hello.c:316 -#, c-format -msgid "Bad Hello from Client: %s.\n" -msgstr "" - -#: src/stored/hello.c:442 src/stored/hello.c:444 -#, fuzzy, c-format -msgid "Send caps to Client failed. ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/stored/hello.c:457 src/stored/hello.c:459 -#, fuzzy, c-format -msgid "Recv caps from Client failed. ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/stored/hello.c:463 -#, c-format -msgid "Recv bad caps from Client: %s.\n" -msgstr "" - -#: src/stored/hello.c:464 -#, c-format -msgid "Recv bad caps from Client %s\n" -msgstr "" - -#: src/stored/job.c:353 -msgid "In free_jcr(), but still attached to device!!!!\n" -msgstr "" - -#: src/stored/label.c:90 -#, fuzzy, c-format -msgid "Couldn't rewind %s device %s: ERR=%s\n" -msgstr "Не вдалось створити жорстку лінку(hardlink) %s -> %s: ERR=%s\n" - -#: src/stored/label.c:108 src/stored/label.c:204 -#, c-format -msgid "Wrong Volume mounted on %s device %s: Wanted %s have %s\n" -msgstr "" - -#: src/stored/label.c:111 src/stored/label.c:192 -#, c-format -msgid "Too many tries: %s" -msgstr "" - -#: src/stored/label.c:128 -#, c-format -msgid "" -"Requested Volume \"%s\" on %s device %s is not a Bacula labeled Volume, " -"because: ERR=%s" -msgstr "" - -#: src/stored/label.c:133 -msgid "Could not read Volume label from block.\n" -msgstr "" - -#: src/stored/label.c:136 -#, c-format -msgid "Could not unserialize Volume label: ERR=%s\n" -msgstr "" - -#: src/stored/label.c:144 -#, c-format -msgid "Volume Header Id bad: %s\n" -msgstr "" - -#: src/stored/label.c:177 -#, c-format -msgid "Volume on %s device %s has wrong Bacula version. Wanted %d got %d\n" -msgstr "" - -#: src/stored/label.c:188 -#, c-format -msgid "Volume on %s device %s has bad Bacula label type: %x\n" -msgstr "" - -#: src/stored/label.c:225 -#, fuzzy, c-format -msgid "Got Aligned or File type Volume %s on Dedup device %s. Wanted File.\n" -msgstr "У картотеці створено новий Том \"%s\".\n" - -#: src/stored/label.c:235 -#, fuzzy, c-format -msgid "Got Aligned or Dedup type Volume %s on File device %s. Wanted File.\n" -msgstr "У картотеці створено новий Том \"%s\".\n" - -#: src/stored/label.c:245 -#, fuzzy, c-format -msgid "" -"Got File or Dedup type Volume %s on Aligned device %s. Wanted Aligned.\n" -msgstr "У картотеці створено новий Том \"%s\".\n" - -#: src/stored/label.c:274 src/stored/label.c:467 src/stored/mount.c:502 -#, fuzzy, c-format -msgid "Could not reserve volume %s on %s device %s\n" -msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" - -#: src/stored/label.c:364 -#, c-format -msgid "Cannot write Volume label to block for %s device %s\n" -msgstr "" - -#: src/stored/label.c:431 src/stored/label.c:587 -#, fuzzy, c-format -msgid "Open %s device %s Volume \"%s\" failed: ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/stored/label.c:601 -#, fuzzy, c-format -msgid "Rewind error on %s device %s: ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/stored/label.c:609 -#, fuzzy, c-format -msgid "Truncate error on %s device %s: ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/stored/label.c:616 -#, c-format -msgid "Failed to re-open DVD after truncate on %s device %s: ERR=%s\n" -msgstr "" - -#: src/stored/label.c:661 -#, fuzzy, c-format -msgid "Unable to write %s device %s: ERR=%s\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/stored/label.c:695 -#, c-format -msgid "Recycled volume \"%s\" on %s device %s, all previous data lost.\n" -msgstr "" - -#: src/stored/label.c:698 -#, c-format -msgid "Wrote label to prelabeled Volume \"%s\" on %s device %s\n" -msgstr "" - -#: src/stored/label.c:940 -#, c-format -msgid "Bad Volume session label request=%d\n" -msgstr "" - -#: src/stored/label.c:1004 -#, c-format -msgid "Expecting Volume Label, got FI=%s Stream=%s len=%d\n" -msgstr "" - -#: src/stored/label.c:1144 -#, c-format -msgid "Unknown %d" -msgstr "" - -#: src/stored/label.c:1148 -#, c-format -msgid "" -"\n" -"Volume Label:\n" -"Adata : %d\n" -"Id : %sVerNo : %d\n" -"VolName : %s\n" -"PrevVolName : %s\n" -"VolFile : %d\n" -"LabelType : %s\n" -"LabelSize : %d\n" -"PoolName : %s\n" -"MediaType : %s\n" -"PoolType : %s\n" -"HostName : %s\n" -msgstr "" - -#: src/stored/label.c:1172 -#, c-format -msgid "Date label written: %s\n" -msgstr "" - -#: src/stored/label.c:1178 -#, c-format -msgid "Date label written: %04d-%02d-%02d at %02d:%02d\n" -msgstr "" - -#: src/stored/label.c:1198 -#, c-format -msgid "" -"\n" -"%s Record:\n" -"JobId : %d\n" -"VerNum : %d\n" -"PoolName : %s\n" -"PoolType : %s\n" -"JobName : %s\n" -"ClientName : %s\n" -msgstr "" - -#: src/stored/label.c:1211 -#, c-format -msgid "" -"Job (unique name) : %s\n" -"FileSet : %s\n" -"JobType : %c\n" -"JobLevel : %c\n" -msgstr "" - -#: src/stored/label.c:1220 -#, c-format -msgid "" -"JobFiles : %s\n" -"JobBytes : %s\n" -"StartBlock : %s\n" -"EndBlock : %s\n" -"StartFile : %s\n" -"EndFile : %s\n" -"JobErrors : %s\n" -"JobStatus : %c\n" -msgstr "" - -#: src/stored/label.c:1241 -#, c-format -msgid "Date written : %s\n" -msgstr "" - -#: src/stored/label.c:1246 -#, c-format -msgid "Date written : %04d-%02d-%02d at %02d:%02d\n" -msgstr "" - -#: src/stored/label.c:1258 -msgid "***** ERROR ****** : Found error with the JobId\n" -msgstr "" - -#: src/stored/label.c:1278 -msgid "***** ERROR ****** : Found error with the JobLevel\n" -msgstr "" - -#: src/stored/label.c:1298 -msgid "***** ERROR ****** : Found error with the JobType\n" -msgstr "" - -#: src/stored/label.c:1305 -#, c-format -msgid "***** ERROR ****** : Found error with the Job name %s\n" -msgstr "" - -#: src/stored/label.c:1326 -msgid "Fresh Volume" -msgstr "" - -#: src/stored/label.c:1329 -msgid "Volume" -msgstr "" - -#: src/stored/label.c:1338 src/stored/read_records.c:406 -msgid "End of Media" -msgstr "" - -#: src/stored/label.c:1341 -msgid "End of Tape" -msgstr "" - -#: src/stored/label.c:1360 src/stored/label.c:1368 src/stored/label.c:1407 -#, c-format -msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d DataLen=%d\n" -msgstr "" - -#: src/stored/label.c:1365 -msgid "Bacula \"End of Tape\" label found.\n" -msgstr "" - -#: src/stored/label.c:1380 src/stored/label.c:1392 -#, c-format -msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d\n" -msgstr "" - -#: src/stored/label.c:1382 -#, c-format -msgid " Job=%s Date=%s Level=%c Type=%c\n" -msgstr "" - -#: src/stored/label.c:1394 -#, c-format -msgid " Date=%s Level=%c Type=%c Files=%s Bytes=%s Errors=%d Status=%c\n" -msgstr "" - -#: src/stored/lock.c:266 src/stored/lock.c:299 -#, c-format -msgid "pthread_cond_wait failure. ERR=%s\n" -msgstr "" - -#: src/stored/lock.c:608 -msgid "unknown blocked code" -msgstr "" - -#: src/stored/mount.c:89 -#, c-format -msgid "Too many errors trying to mount %s device %s.\n" -msgstr "" - -#: src/stored/mount.c:97 -#, c-format -msgid "Job %d canceled.\n" -msgstr "" - -#: src/stored/mount.c:218 -#, fuzzy, c-format -msgid "Open of %s device %s Volume \"%s\" failed: ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/stored/mount.c:296 -#, c-format -msgid "Volume \"%s\" previously written, moving to end of data.\n" -msgstr "" - -#: src/stored/mount.c:302 -#, fuzzy, c-format -msgid "Unable to position to end of data on %s device %s: ERR=%s\n" -msgstr "Не можливо встановити час файлу %s: ERR=%s\n" - -#: src/stored/mount.c:446 src/stored/mount.c:835 -#, fuzzy, c-format -msgid "Volume \"%s\" not loaded on %s device %s.\n" -msgstr "У картотеці створено новий Том \"%s\".\n" - -#: src/stored/mount.c:482 -#, c-format -msgid "" -"Director wanted Volume \"%s\".\n" -" Current Volume \"%s\" not acceptable because:\n" -" %s" -msgstr "" - -#: src/stored/mount.c:660 -#, c-format -msgid "Ready to append to end of Volume \"%s\" part=%d size=%s\n" -msgstr "" - -#: src/stored/mount.c:664 -#, c-format -msgid "" -"Bacula cannot write on DVD Volume \"%s\" because: The sizes do not match! " -"Volume=%s Catalog=%s\n" -msgstr "" - -#: src/stored/mount.c:678 -#, c-format -msgid "Ready to append to end of Volume \"%s\" at file=%d.\n" -msgstr "" - -#: src/stored/mount.c:681 -#, c-format -msgid "" -"For Volume \"%s\":\n" -"The number of files mismatch! Volume=%u Catalog=%u\n" -"Correcting Catalog\n" -msgstr "" - -#: src/stored/mount.c:688 src/stored/mount.c:747 -msgid "Error updating Catalog\n" -msgstr "" - -#: src/stored/mount.c:693 -#, c-format -msgid "" -"Bacula cannot write on tape Volume \"%s\" because:\n" -"The number of files mismatch! Volume=%u Catalog=%u\n" -msgstr "" - -#: src/stored/mount.c:717 -#, c-format -msgid "Ready to append to end of Volumes \"%s\" ameta size=%s adata size=%s\n" -msgstr "" - -#: src/stored/mount.c:722 -#, c-format -msgid "Ready to append to end of Volume \"%s\" size=%s\n" -msgstr "" - -#: src/stored/mount.c:729 -#, c-format -msgid "" -"For Volume \"%s\":\n" -" The sizes do not match! Metadata Volume=%s Catalog=%s\n" -" Correcting Catalog\n" -msgstr "" - -#: src/stored/mount.c:736 -#, c-format -msgid "" -"For aligned Volume \"%s\":\n" -" Aligned sizes do not match! Aligned Volume=%s Catalog=%s\n" -" Correcting Catalog\n" -msgstr "" - -#: src/stored/mount.c:752 -#, c-format -msgid "" -"Bacula cannot write on disk Volume \"%s\" because: The sizes do not match! " -"Volume=%s Catalog=%s\n" -msgstr "" - -#: src/stored/mount.c:818 -#, fuzzy, c-format -msgid "Labeled new Volume \"%s\" on %s device %s.\n" -msgstr "У картотеці створено новий Том \"%s\".\n" - -#: src/stored/mount.c:829 -#, fuzzy, c-format -msgid "%s device %s not configured to autolabel Volumes.\n" -msgstr "TLS необхідний, але не налаштовано у Bacula.\n" - -#: src/stored/mount.c:853 -#, c-format -msgid "Marking Volume \"%s\" in Error in Catalog.\n" -msgstr "" - -#: src/stored/mount.c:870 -#, c-format -msgid "" -"Autochanger Volume \"%s\" not found in slot %d.\n" -" Setting InChanger to zero in catalog.\n" -msgstr "" - -#: src/stored/mount.c:889 -msgid "Hey!!!!! WroteVol non-zero !!!!!\n" -msgstr "" - -#: src/stored/mount.c:939 -#, c-format -msgid "" -"Invalid tape position on volume \"%s\" on device %s. Expected %d, got %d\n" -msgstr "" - -#: src/stored/mount.c:980 -#, fuzzy, c-format -msgid "Cannot open %s Dev=%s, Vol=%s for reading.\n" -msgstr "Не вдається відкрити файл %s для введення. ERR=%s\n" - -#: src/stored/os.c:126 -#, c-format -msgid "Unable to set eotmodel on device %s: ERR=%s\n" -msgstr "" - -#: src/stored/os.c:180 -msgid " Bacula status:" -msgstr "" - -#: src/stored/os.c:181 src/stored/os.c:264 src/stored/os.c:266 -#, c-format -msgid " file=%d block=%d\n" -msgstr "" - -#: src/stored/os.c:185 src/stored/tape_dev.c:345 -#, c-format -msgid "ioctl MTIOCGET error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/os.c:189 -msgid " Device status:" -msgstr "" - -#: src/stored/os.c:365 -#, c-format -msgid "unknown func code %d" -msgstr "" - -#: src/stored/os.c:371 -#, c-format -msgid "I/O function \"%s\" not supported on this device.\n" -msgstr "" - -#: src/stored/parse_bsr.c:116 -#, c-format -msgid "Cannot open bootstrap file %s: %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:220 -#, c-format -msgid "Device \"%s\" in bsr at inappropriate place.\n" -msgstr "" - -#: src/stored/parse_bsr.c:283 -#, c-format -msgid "REGEX '%s' compile error. ERR=%s\n" -msgstr "" - -#: src/stored/parse_bsr.c:326 -msgid "JobType not yet implemented\n" -msgstr "" - -#: src/stored/parse_bsr.c:334 -msgid "JobLevel not yet implemented\n" -msgstr "" - -#: src/stored/parse_bsr.c:379 -#, c-format -msgid "MediaType %s in bsr at inappropriate place.\n" -msgstr "" - -#: src/stored/parse_bsr.c:684 -#, c-format -msgid "Slot %d in bsr at inappropriate place.\n" -msgstr "" - -#: src/stored/parse_bsr.c:708 -#, c-format -msgid "VolFile : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:716 -#, c-format -msgid "VolBlock : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:724 -#, c-format -msgid "VolAddr : %llu-%llu\n" -msgstr "" - -#: src/stored/parse_bsr.c:733 -#, c-format -msgid "FileIndex : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:735 -#, c-format -msgid "FileIndex : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:745 -#, c-format -msgid "JobId : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:747 -#, c-format -msgid "JobId : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:757 -#, c-format -msgid "SessId : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:759 -#, c-format -msgid "SessId : %u-%u\n" -msgstr "" - -#: src/stored/parse_bsr.c:768 -#, c-format -msgid "VolumeName : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:769 -#, c-format -msgid " MediaType : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:770 -#, c-format -msgid " Device : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:771 -#, c-format -msgid " Slot : %d\n" -msgstr "" - -#: src/stored/parse_bsr.c:780 -#, c-format -msgid "Client : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:788 -#, c-format -msgid "Job : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:796 -#, c-format -msgid "SessTime : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:807 -msgid "BSR is NULL\n" -msgstr "" - -#: src/stored/parse_bsr.c:811 -#, c-format -msgid "Next : 0x%x\n" -msgstr "" - -#: src/stored/parse_bsr.c:812 -#, c-format -msgid "Root bsr : 0x%x\n" -msgstr "" - -#: src/stored/parse_bsr.c:824 -#, c-format -msgid "count : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:825 -#, c-format -msgid "found : %u\n" -msgstr "" - -#: src/stored/parse_bsr.c:828 -#, c-format -msgid "done : %s\n" -msgstr "" - -#: src/stored/parse_bsr.c:829 -#, c-format -msgid "positioning : %d\n" -msgstr "" - -#: src/stored/parse_bsr.c:830 -#, c-format -msgid "fast_reject : %d\n" -msgstr "" - -#: src/stored/parse_bsr.c:1054 src/stored/parse_bsr.c:1058 -#, c-format -msgid "" -"Bootstrap file error: %s\n" -" : Line %d, col %d of file %s\n" -"%s\n" -msgstr "" - -#: src/stored/read.c:56 -msgid "No Volume names found for restore.\n" -msgstr "" - -#: src/stored/read.c:201 src/stored/read.c:360 -#, c-format -msgid ">filed: Error Hdr=%s\n" -msgstr "" - -#: src/stored/read.c:202 -#, fuzzy, c-format -msgid "Error sending header to Client. ERR=%s\n" -msgstr "Помилка надсилання Hello до Збирача. ERR=%s\n" - -#: src/stored/read.c:248 src/stored/read.c:376 -#, c-format -msgid "Error sending to FD. ERR=%s\n" -msgstr "" - -#: src/stored/read.c:249 -#, fuzzy, c-format -msgid "Error sending data to Client. ERR=%s\n" -msgstr "Помилка надсилання Hello до Збирача. ERR=%s\n" - -#: src/stored/read.c:332 src/stored/read.c:361 src/stored/read.c:377 -#, c-format -msgid "Error sending to File daemon. ERR=%s\n" -msgstr "" - -#: src/stored/read_records.c:79 -#, c-format -msgid "End of Volume at file %u on device %s, Volume \"%s\"\n" -msgstr "" - -#: src/stored/read_records.c:83 -msgid "End of all volumes.\n" -msgstr "" - -#: src/stored/read_records.c:133 -msgid "Did fsr in attemp to skip bad record.\n" -msgstr "" - -#: src/stored/read_records.c:375 -#, c-format -msgid "Forward spacing Volume \"%s\" to file:block %u:%u.\n" -msgstr "" - -#: src/stored/read_records.c:399 -msgid "Begin Session" -msgstr "" - -#: src/stored/read_records.c:403 -msgid "End Session" -msgstr "" - -#: src/stored/read_records.c:409 -#, c-format -msgid "Unknown code %d\n" -msgstr "" - -#: src/stored/record_util.c:62 -#, c-format -msgid "unknown: %d" -msgstr "" - -#: src/stored/reserve.c:65 -#, c-format -msgid "Unable to initialize reservation lock. ERR=%s\n" -msgstr "" - -#: src/stored/reserve.c:145 -#, c-format -msgid "Hey! num_writers=%d!!!!\n" -msgstr "" - -#: src/stored/reserve.c:260 -msgid "3939 Could not get dcr\n" -msgstr "" - -#: src/stored/reserve.c:369 -#, c-format -msgid "Device reservation failed for JobId=%d: %s\n" -msgstr "" - -#: src/stored/reserve.c:378 -#, c-format -msgid "Failed command: %s\n" -msgstr "" - -#: src/stored/reserve.c:654 -#, c-format -msgid "" -"\n" -" Device \"%s\" requested by DIR is disabled.\n" -msgstr "" - -#: src/stored/reserve.c:669 -#, c-format -msgid "3926 Could not get dcr for device: %s\n" -msgstr "" - -#: src/stored/reserve.c:809 -#, c-format -msgid "3603 JobId=%u %s device %s is busy reading.\n" -msgstr "" - -#: src/stored/reserve.c:818 -#, c-format -msgid "3604 JobId=%u %s device %s is BLOCKED due to user unmount.\n" -msgstr "" - -#: src/stored/reserve.c:866 -#, c-format -msgid "3601 JobId=%u %s device %s is BLOCKED due to user unmount.\n" -msgstr "" - -#: src/stored/reserve.c:874 -#, c-format -msgid "" -"3602 JobId=%u %s device %s is busy (already reading/writing). read=%d, " -"writers=%d reserved=%d\n" -msgstr "" - -#: src/stored/reserve.c:913 -#, c-format -msgid "3609 JobId=%u Max concurrent jobs=%d exceeded on %s device %s.\n" -msgstr "" - -#: src/stored/reserve.c:931 -#, c-format -msgid "" -"3610 JobId=%u Aligned volume max bytes does not allow concurrency on drive " -"%s.\n" -msgstr "" - -#: src/stored/reserve.c:941 -#, c-format -msgid "3611 JobId=%u Volume max jobs=%d exceeded on %s device %s.\n" -msgstr "" - -#: src/stored/reserve.c:966 -#, c-format -msgid "" -"3608 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" nreserve=%d on %s " -"device %s.\n" -msgstr "" - -#: src/stored/reserve.c:1018 -#, c-format -msgid "3605 JobId=%u wants free drive but %s device %s is busy.\n" -msgstr "" - -#: src/stored/reserve.c:1027 -#, c-format -msgid "3606 JobId=%u prefers mounted drives, but %s device %s has no Volume.\n" -msgstr "" - -#: src/stored/reserve.c:1049 -#, c-format -msgid "3607 JobId=%u wants Vol=\"%s\" drive has Vol=\"%s\" on %s device %s.\n" -msgstr "" - -#: src/stored/reserve.c:1104 -#, c-format -msgid "Logic error!!!! JobId=%u Should not get here.\n" -msgstr "" - -#: src/stored/reserve.c:1105 -#, c-format -msgid "3910 JobId=%u Logic error!!!! %s device %s Should not get here.\n" -msgstr "" - -#: src/stored/reserve.c:1108 -msgid "Logic error!!!! Should not get here.\n" -msgstr "" - -#: src/stored/reserve.c:1111 -#, c-format -msgid "3911 JobId=%u failed reserve %s device %s.\n" -msgstr "" - -#: src/stored/spool.c:72 -msgid "Spooling statistics:\n" -msgstr "" - -#: src/stored/spool.c:75 -#, c-format -msgid "" -"Data spooling: %u active jobs, %s bytes; %u total jobs, %s max bytes/job.\n" -msgstr "" - -#: src/stored/spool.c:83 -#, c-format -msgid "Attr spooling: %u active jobs, %s bytes; %u total jobs, %s max bytes.\n" -msgstr "" - -#: src/stored/spool.c:104 -msgid "Spooling data ...\n" -msgstr "" - -#: src/stored/spool.c:130 -#, c-format -msgid "Bad return from despool WroteVol=%d\n" -msgstr "" - -#: src/stored/spool.c:163 -#, c-format -msgid "Open data spool file %s failed: ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:191 -msgid "Despooling zero bytes. Your disk is probably FULL!\n" -msgstr "" - -#: src/stored/spool.c:200 -#, c-format -msgid "Committing spooled data to Volume \"%s\". Despooling %s bytes ...\n" -msgstr "" - -#: src/stored/spool.c:205 -#, c-format -msgid "Writing spooled data to Volume. Despooling %s bytes ...\n" -msgstr "" - -#: src/stored/spool.c:295 -#, c-format -msgid "" -"Despooling elapsed time = %02d:%02d:%02d, Transfer rate = %s Bytes/second\n" -msgstr "" - -#: src/stored/spool.c:304 src/stored/spool.c:505 src/stored/spool.c:551 -#, c-format -msgid "Ftruncate spool file failed: ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:363 -#, c-format -msgid "Spool header read error. ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:366 -#, c-format -msgid "Spool read error. Wanted %u bytes, got %d\n" -msgstr "" - -#: src/stored/spool.c:367 -#, c-format -msgid "Spool header read error. Wanted %u bytes, got %d\n" -msgstr "" - -#: src/stored/spool.c:374 src/stored/spool.c:375 -#, c-format -msgid "Spool block too big. Max %u bytes, got %u\n" -msgstr "" - -#: src/stored/spool.c:381 src/stored/spool.c:382 -#, c-format -msgid "Spool data read error. Wanted %u bytes, got %d\n" -msgstr "" - -#: src/stored/spool.c:436 -#, c-format -msgid "" -"User specified Job spool size reached: JobSpoolSize=%s MaxJobSpoolSize=%s\n" -msgstr "" - -#: src/stored/spool.c:441 -#, c-format -msgid "" -"User specified Device spool size reached: DevSpoolSize=%s MaxDevSpoolSize=" -"%s\n" -msgstr "" - -#: src/stored/spool.c:448 -msgid "Bad return from despool in write_block.\n" -msgstr "" - -#: src/stored/spool.c:456 -msgid "Spooling data again ...\n" -msgstr "" - -#: src/stored/spool.c:488 -#, c-format -msgid "Error writing header to spool file. ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:493 -#, c-format -msgid "" -"Error writing header to spool file. Disk probably full. Attempting recovery. " -"Wanted to write=%d got=%d\n" -msgstr "" - -#: src/stored/spool.c:511 src/stored/spool.c:557 -msgid "Fatal despooling error." -msgstr "" - -#: src/stored/spool.c:519 -msgid "Retrying after header spooling error failed.\n" -msgstr "" - -#: src/stored/spool.c:535 -#, c-format -msgid "Error writing data to spool file. ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:568 -msgid "Retrying after data spooling error failed.\n" -msgstr "" - -#: src/stored/spool.c:655 -msgid "Network error on BlastAttributes.\n" -msgstr "" - -#: src/stored/spool.c:679 src/stored/spool.c:703 -#, c-format -msgid "Fseek on attributes file failed: ERR=%s\n" -msgstr "" - -#: src/stored/spool.c:691 -#, fuzzy, c-format -msgid "Truncate on attributes file failed: ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/stored/spool.c:715 -#, c-format -msgid "Sending spooled attrs to the Director. Despooling %s bytes ...\n" -msgstr "" - -#: src/stored/spool.c:741 -#, c-format -msgid "fopen attr spool file %s failed: ERR=%s\n" -msgstr "" - -#: src/stored/status.c:86 -msgid "Used Volume status:\n" -msgstr "" - -#: src/stored/status.c:108 -msgid "" -"\n" -"SD Resources:\n" -msgstr "" - -#: src/stored/status.c:144 -#, c-format -msgid "3900 missing args in .status command: %s\n" -msgstr "" - -#: src/stored/status.c:149 -msgid "" -"\n" -"SD Shared Storage:\n" -msgstr "" - -#: src/stored/status.c:294 -#, c-format -msgid "" -"\n" -"Device \"%s\" is not open or does not exist.\n" -msgstr "" - -#: src/stored/status.c:303 -#, c-format -msgid "" -"\n" -"Device %s is %s %s:\n" -" Volume: %s\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" - -#: src/stored/status.c:308 -msgid "waiting for" -msgstr "" - -#: src/stored/status.c:308 -msgid "mounted with" -msgstr "" - -#: src/stored/status.c:310 -msgid "*unknown*" -msgstr "" - -#: src/stored/status.c:314 -#, c-format -msgid "" -"\n" -"Device %s: %s open but no Bacula volume is currently mounted.\n" -msgstr "" - -#: src/stored/status.c:325 -#, c-format -msgid " Total Bytes=%s Blocks=%s Bytes/block=%s\n" -msgstr "" - -#: src/stored/status.c:340 -#, c-format -msgid " Total Bytes Read=%s Blocks Read=%s Bytes/block=%s\n" -msgstr "" - -#: src/stored/status.c:346 -#, c-format -msgid " Positioned at File=%s Block=%s\n" -msgstr "" - -#: src/stored/status.c:352 -#, c-format -msgid "" -"\n" -"Device %s: %s is not open.\n" -msgstr "" - -#: src/stored/status.c:366 -#, c-format -msgid " Available Space=%sB\n" -msgstr "" - -#: src/stored/status.c:374 -#, c-format -msgid "" -" shstore=%d registered=%d locked=%d blockedbySD=%s\n" -"\n" -msgstr "" - -#: src/stored/status.c:425 -#, c-format -msgid "Autochanger \"%s\" with devices:\n" -msgstr "" - -#: src/stored/status.c:449 -msgid "" -"\n" -"Device status:\n" -msgstr "" - -#: src/stored/status.c:506 -#, c-format -msgid "Daemon started %s. Jobs: run=%d, running=%d.\n" -msgstr "" - -#: src/stored/status.c:521 -#, c-format -msgid " Res: ndevices=%d nautochgr=%d\n" -msgstr "" - -#: src/stored/status.c:534 -msgid "" -"No DEVICE structure.\n" -"\n" -msgstr "" - -#: src/stored/status.c:540 -#, c-format -msgid " Device is BLOCKED by another SD=%s\n" -msgstr "" - -#: src/stored/status.c:545 -msgid " Device is disabled. User command.\n" -msgstr "" - -#: src/stored/status.c:550 -msgid " Device is BLOCKED. User unmounted.\n" -msgstr "" - -#: src/stored/status.c:554 -msgid " Device is BLOCKED. User unmounted during wait for media/mount.\n" -msgstr "" - -#: src/stored/status.c:565 -#, c-format -msgid "" -" Device is BLOCKED waiting for mount of volume \"%s\",\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" - -#: src/stored/status.c:574 -#, c-format -msgid "" -" Device is BLOCKED waiting to create a volume for:\n" -" Pool: %s\n" -" Media type: %s\n" -msgstr "" - -#: src/stored/status.c:586 -msgid " Device is BLOCKED waiting for media.\n" -msgstr "" - -#: src/stored/status.c:592 -msgid " Device is being initialized.\n" -msgstr "" - -#: src/stored/status.c:596 -msgid " Device is blocked labeling a Volume.\n" -msgstr "" - -#: src/stored/status.c:605 -#, c-format -msgid " Slot %d %s loaded in drive %d.\n" -msgstr "" - -#: src/stored/status.c:609 -#, c-format -msgid " Drive %d is not loaded.\n" -msgstr "" - -#: src/stored/status.c:644 -msgid "Device state:\n" -msgstr "" - -#: src/stored/status.c:660 -#, c-format -msgid " num_writers=%d reserves=%d block=%d enabled=%d\n" -msgstr "" - -#: src/stored/status.c:664 -msgid "Attached JobIds: " -msgstr "" - -#: src/stored/status.c:684 -#, c-format -msgid " Archive name: %s Device name: %s\n" -msgstr "" - -#: src/stored/status.c:687 -#, c-format -msgid " File=%u block=%u\n" -msgstr "" - -#: src/stored/status.c:689 -#, c-format -msgid " Min block=%u Max block=%u\n" -msgstr "" - -#: src/stored/status.c:821 -#, c-format -msgid "%s Job %s waiting for Client connection.\n" -msgstr "" - -#: src/stored/status.c:837 -#, c-format -msgid "" -"Reading: %s %s job %s JobId=%d Volume=\"%s\"\n" -" pool=\"%s\" device=%s\n" -msgstr "" - -#: src/stored/status.c:850 -#, c-format -msgid "" -"Writing: %s %s job %s JobId=%d Volume=\"%s\"\n" -" pool=\"%s\" device=%s\n" -msgstr "" - -#: src/stored/status.c:861 -#, c-format -msgid " spooling=%d despooling=%d despool_wait=%d\n" -msgstr "" - -#: src/stored/status.c:885 -#, c-format -msgid " Files=%s Bytes=%s AveBytes/sec=%s LastBytes/sec=%s\n" -msgstr "" - -#: src/stored/status.c:900 -#, c-format -msgid " FDReadSeqNo=%s in_msg=%u out_msg=%d fd=%d\n" -msgstr "" - -#: src/stored/status.c:906 -msgid " FDSocket closed\n" -msgstr "" - -#: src/stored/status.c:927 -msgid "" -"\n" -"Jobs waiting to reserve a drive:\n" -msgstr "" - -#: src/stored/status.c:1007 -#, c-format -msgid "3900 No arg in .status command: %s\n" -msgstr "" - -#: src/stored/status.c:1076 -msgid "3900 dedupengine is disabled: not compiled in this version.\n" -msgstr "" - -#: src/stored/status.c:1089 -#, c-format -msgid "3900 Unknown arg in .status command: %s\n" -msgstr "" - -#: src/stored/stored.c:79 -#, fuzzy, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"\n" -"Usage: bacula-sd [options] [-c config_file] [config_file]\n" -" -c use as configuration file\n" -" -d [,] set debug level to , debug tags to \n" -" -dt print timestamp in debug output\n" -" -f run in foreground (for debugging)\n" -" -g set groupid to group\n" -" -m print kaboom output (for debugging)\n" -" -p proceed despite I/O errors\n" -" -s no signals (for debugging)\n" -" -t test - read config and exit\n" -" -u userid to \n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n" -msgstr "" -"\n" -"Версія: %s (%s) %s %s %s\n" -"\n" -"Використання: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" -" -c set configuration file to file\n" -" -dnn set debug level to nn\n" -" -s без сигналів\n" -" -t перевірка - прочитати конфігурацію і вийти\n" -" -? print this message.\n" -"\n" - -#: src/stored/stored.c:273 -msgid "Volume Session Time is ZERO!\n" -msgstr "" - -#: src/stored/stored.c:282 -#, c-format -msgid "Unable to create thread. ERR=%s\n" -msgstr "" - -#: src/stored/stored.c:592 -#, fuzzy, c-format -msgid "Unable to stat ControlDevice %s: ERR=%s\n" -msgstr "Не можливо встановити час файлу %s: ERR=%s\n" - -#: src/stored/stored.c:598 -msgid "No plugin directory configured for SAN shared storage\n" -msgstr "" - -#: src/stored/stored.c:619 -#, c-format -msgid "Could not open device %s\n" -msgstr "" - -#: src/stored/stored.c:637 -#, c-format -msgid "Could not mount device %s\n" -msgstr "" - -#: src/stored/stored_conf.c:237 -#, c-format -msgid "Expected a Device Type keyword, got: %s" -msgstr "" - -#: src/stored/stored_conf.c:251 -#, c-format -msgid "" -"Maximum Block Size configured value %u is greater than allowed maximum: %u" -msgstr "" - -#: src/stored/stored_conf.c:264 -#, c-format -msgid "Warning: no \"%s\" resource (%d) defined.\n" -msgstr "" - -#: src/stored/stored_conf.c:267 -#, c-format -msgid "dump_resource type=%d\n" -msgstr "" - -#: src/stored/stored_conf.c:391 -#, c-format -msgid "Warning: unknown resource type %d\n" -msgstr "" - -#: src/stored/stored_conf.c:601 -#, c-format -msgid "\"%s\" item is required in \"%s\" resource, but not found.\n" -msgstr "" - -#: src/stored/stored_conf.c:607 -#, c-format -msgid "Too many items in \"%s\" resource\n" -msgstr "" - -#: src/stored/stored_conf.c:641 -#, c-format -msgid "Cannot find AutoChanger resource %s\n" -msgstr "" - -#: src/stored/stored_conf.c:657 -#, fuzzy, c-format -msgid "Unable to init lock: ERR=%s\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" - -#: src/stored/tape_dev.c:227 -#, c-format -msgid "No tape loaded or drive offline on %s.\n" -msgstr "" - -#: src/stored/tape_dev.c:237 -#, c-format -msgid "Rewind error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:262 -#, c-format -msgid "Bad call to eod. Device %s not open\n" -msgstr "" - -#: src/stored/tape_dev.c:334 -#, c-format -msgid "ioctl MTEOM error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:429 -msgid "Bad call to load_dev. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:440 src/stored/tape_dev.c:453 -#, c-format -msgid "ioctl MTLOAD error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:484 -#, c-format -msgid "ioctl MTOFFL error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:525 -msgid "Bad call to fsf. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:536 src/stored/tape_dev.c:663 -#, c-format -msgid "Device %s at End of Tape.\n" -msgstr "" - -#: src/stored/tape_dev.c:567 src/stored/tape_dev.c:643 -#, c-format -msgid "ioctl MTFSF error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:692 -msgid "Bad call to bsf. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:698 -#, c-format -msgid "Device %s cannot BSF because it is not a tape.\n" -msgstr "" - -#: src/stored/tape_dev.c:715 -#, c-format -msgid "ioctl MTBSF error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:734 -msgid "Bad call to fsr. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:744 -#, c-format -msgid "ioctl MTFSR not permitted on %s.\n" -msgstr "" - -#: src/stored/tape_dev.c:772 -#, c-format -msgid "ioctl MTFSR %d error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:790 -msgid "Bad call to bsr_dev. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:800 -#, c-format -msgid "ioctl MTBSR not permitted on %s.\n" -msgstr "" - -#: src/stored/tape_dev.c:814 -#, c-format -msgid "ioctl MTBSR error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/tape_dev.c:920 -msgid "Bad call to weof_dev. Device not open\n" -msgstr "" - -#: src/stored/tape_dev.c:930 -msgid "Attempt to WEOF on non-appendable Volume\n" -msgstr "" - -#: src/stored/tape_dev.c:948 -#, c-format -msgid "ioctl MTWEOF error on %s. ERR=%s.\n" -msgstr "" - -#: src/stored/vbackup.c:68 -msgid "Read and write devices not properly initialized.\n" -msgstr "" - -#: src/stored/vbackup.c:74 -#, c-format -msgid "No Volume names found for %s.\n" -msgstr "" - -#: src/stored/vol_mgr.c:81 -#, c-format -msgid "Unable to initialize volume list lock. ERR=%s\n" -msgstr "" - -#: src/stored/vol_mgr.c:371 -#, c-format -msgid "Could not reserve volume \"%s\", because job canceled.\n" -msgstr "" - -#: src/stored/vol_mgr.c:382 -#, c-format -msgid "Could not reserve volume \"%s\" for append, because it will be read.\n" -msgstr "" - -#: src/stored/vol_mgr.c:415 -#, c-format -msgid "Cannot free Volume \"%s\", because it is reserved by someone else.\n" -msgstr "" - -#: src/stored/vol_mgr.c:516 -#, c-format -msgid "Volume %s is busy swapping from %s to %s\n" -msgstr "" - -#: src/stored/vol_mgr.c:519 src/stored/vol_mgr.c:526 -#, c-format -msgid "Volume %s is busy swapping.\n" -msgstr "" - -#: src/stored/vol_mgr.c:523 -#, c-format -msgid "%s device %s is busy.\n" -msgstr "" - -#: src/stored/wait.c:122 -#, c-format -msgid "pthread timedwait error. ERR=%s\n" -msgstr "" - -#: src/stored/wait.c:228 -#, c-format -msgid "JobId=%s, Job %s waiting to reserve a device.\n" -msgstr "" - -#: src/stored/wait.c:274 -#, c-format -msgid "JobId=%s, Job %s waiting device %s.\n" -msgstr "" - -#: src/tools/bbatch.c:65 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -"Example : bbatch -w /path/to/workdir -h localhost -f dat1 -f dat -f datx\n" -" will start 3 thread and load dat1, dat and datx in your catalog\n" -"See bbatch.c to generate datafile\n" -"\n" -"Usage: bbatch [ options ] -w working/dir -f datafile\n" -" -b with batch mode\n" -" -B without batch mode\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database host (default NULL)\n" -" -w specify working directory\n" -" -r call restore code with given jobids\n" -" -v verbose\n" -" -f specify data file\n" -" -? print this message\n" -"\n" -msgstr "" - -#: src/tools/bbatch.c:187 src/tools/bbatch.c:236 src/tools/bvfs_test.c:203 -msgid "Could not init Bacula database\n" -msgstr "" - -#: src/tools/bbatch.c:197 -#, c-format -msgid "Computing file list for jobid=%s files=%lld secs=%d\n" -msgstr "" - -#: src/tools/bbatch.c:301 -#, c-format -msgid "Error opening datafile %s\n" -msgstr "" - -#: src/tools/bbatch.c:311 -msgid "Error while inserting file\n" -msgstr "" - -#: src/tools/bregex.c:142 src/tools/bregtest.c:126 src/tools/bwild.c:111 -#, c-format -msgid "Could not open data file: %s\n" -msgstr "" - -#: src/tools/bsmtp.c:119 -#, c-format -msgid "Fatal malformed reply from %s: %s\n" -msgstr "" - -#: src/tools/bsmtp.c:127 -#, c-format -msgid "Fatal fgets error: ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:163 -#, c-format -msgid "" -"\n" -"Usage: %s [-f from] [-h mailhost] [-s subject] [-c copy] [recipient ...]\n" -" -4 forces bsmtp to use IPv4 addresses only.\n" -" -6 forces bsmtp to use IPv6 addresses only.\n" -" -8 set charset to UTF-8\n" -" -a use any ip protocol for address resolution\n" -" -c set the Cc: field\n" -" -d set debug level to \n" -" -dt print a timestamp in debug output\n" -" -f set the From: field\n" -" -h use mailhost:port as the SMTP server\n" -" -s set the Subject: field\n" -" -r set the Reply-To: field\n" -" -l set the maximum number of lines to send (default: " -"unlimited)\n" -" -? print this message.\n" -"\n" -msgstr "" - -#: src/tools/bsmtp.c:350 -msgid "Fatal error: no recipient given.\n" -msgstr "" - -#: src/tools/bsmtp.c:378 -#, c-format -msgid "Fatal gethostname error: ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:389 -#, fuzzy, c-format -msgid "Fatal getaddrinfo for myself failed \"%s\": ERR=%s\n" -msgstr "Помилка у %s файл %s: ERR=%s\n" - -#: src/tools/bsmtp.c:397 -#, c-format -msgid "Fatal gethostbyname for myself failed \"%s\": ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:457 src/tools/bsmtp.c:492 -#, c-format -msgid "Error unknown mail host \"%s\": ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:460 src/tools/bsmtp.c:495 -msgid "Retrying connection using \"localhost\".\n" -msgstr "" - -#: src/tools/bsmtp.c:485 -#, fuzzy, c-format -msgid "Failed to connect to mailhost %s\n" -msgstr "Ініціалізація контексту TLS для Консолі невдала \"%s\".\n" - -#: src/tools/bsmtp.c:503 -#, c-format -msgid "Fatal error: Unknown address family for smtp host: %d\n" -msgstr "" - -#: src/tools/bsmtp.c:512 src/tools/bsmtp.c:517 -#, c-format -msgid "Fatal socket error: ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:522 -#, c-format -msgid "Fatal connect error to %s: ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:531 -#, c-format -msgid "Fatal _open_osfhandle error: ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:538 src/tools/bsmtp.c:542 src/tools/bsmtp.c:551 -#: src/tools/bsmtp.c:555 -#, c-format -msgid "Fatal fdopen error: ERR=%s\n" -msgstr "" - -#: src/tools/bsmtp.c:547 -#, c-format -msgid "Fatal dup error: ERR=%s\n" -msgstr "" - -#: src/tools/bsnapshot.c:47 -#, c-format -msgid "" -"ERROR %s\n" -"\n" -msgstr "" - -#: src/tools/bsnapshot.c:51 -#, c-format -msgid "" -"Bacula Systems SA(R) %s (%s)\n" -"\n" -"Usage: bsnapshot\n" -" -d level Set debug level\n" -" -v Verbose\n" -" -s Use sudo\n" -" -o logfile send debug to logfile\n" -" -V volume volume\n" -" -T type volume type\n" -" -t check compatibility\n" -" -c specify configuration file\n" -"\n" -msgstr "" - -#: src/tools/bsnapshot.c:1876 -msgid "Unable to open -p argument for reading" -msgstr "" - -#: src/tools/bvfs_test.c:44 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database host (default NULL)\n" -" -w specify working directory\n" -" -j specify jobids\n" -" -p specify path\n" -" -f specify file\n" -" -l maximum tuple to fetch\n" -" -T truncate cache table before starting\n" -" -v verbose\n" -" -? print this message\n" -"\n" -msgstr "" - -#: src/tools/cats_test.c:47 -#, c-format -msgid "" -"\n" -"%sVersion: %s (%s)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -n specify the database name (default bacula)\n" -" -u specify database user name (default bacula)\n" -" -P specify database host (default NULL)\n" -" -w specify working directory\n" -" -p specify path\n" -" -f specify file\n" -" -l maximum tuple to fetch\n" -" -q print only errors\n" -" -v verbose\n" -" -? print this message\n" -"\n" -msgstr "" - -#: src/tools/cats_test.c:363 -#, fuzzy, c-format -msgid "Could not open, database \"%s\".\n" -msgstr "Не вдалось відкрити%s: ERR=%s\n" - -#: src/tools/dbcheck.c:178 -msgid "" -"Warning skipping the additional parameters for working directory/dbname/user/" -"password/host.\n" -msgstr "" - -#: src/tools/dbcheck.c:196 -#, c-format -msgid "Error can not find the Catalog name[%s] in the given config file [%s]\n" -msgstr "" - -#: src/tools/dbcheck.c:198 -#, c-format -msgid "Error there is no Catalog section in the given config file [%s]\n" -msgstr "" - -#: src/tools/dbcheck.c:207 -msgid "Error no Director resource defined.\n" -msgstr "" - -#: src/tools/dbcheck.c:231 -msgid "Wrong number of arguments.\n" -msgstr "" - -#: src/tools/dbcheck.c:236 -msgid "Working directory not supplied.\n" -msgstr "" - -#: src/tools/dbcheck.c:272 -msgid "Database port must be a numeric value.\n" -msgstr "" - -#: src/tools/dbcheck.c:275 -msgid "Database port must be a int value.\n" -msgstr "" - -#: src/tools/dbcheck.c:346 -#, c-format -msgid "Hello, this is the database check/correct program.\n" -msgstr "" - -#: src/tools/dbcheck.c:348 -#, c-format -msgid "Modify database is on." -msgstr "" - -#: src/tools/dbcheck.c:350 -#, c-format -msgid "Modify database is off." -msgstr "" - -#: src/tools/dbcheck.c:352 src/tools/dbcheck.c:407 -#, c-format -msgid " Verbose is on.\n" -msgstr "" - -#: src/tools/dbcheck.c:354 src/tools/dbcheck.c:409 -#, c-format -msgid " Verbose is off.\n" -msgstr "" - -#: src/tools/dbcheck.c:356 -#, c-format -msgid "Please select the function you want to perform.\n" -msgstr "" - -#: src/tools/dbcheck.c:360 -#, c-format -msgid "" -"\n" -" 1) Toggle modify database flag\n" -" 2) Toggle verbose flag\n" -" 3) Repair bad Path records\n" -" 4) Eliminate duplicate Path records\n" -" 5) Eliminate orphaned Jobmedia records\n" -" 6) Eliminate orphaned File records\n" -" 7) Eliminate orphaned Path records\n" -" 8) Eliminate orphaned FileSet records\n" -" 9) Eliminate orphaned Client records\n" -" 10) Eliminate orphaned Job records\n" -" 11) Eliminate all Admin records\n" -" 12) Eliminate all Restore records\n" -" 13) All (3-12)\n" -" 14) Quit\n" -msgstr "" - -#: src/tools/dbcheck.c:376 -#, c-format -msgid "" -"\n" -" 1) Toggle modify database flag\n" -" 2) Toggle verbose flag\n" -" 3) Check for bad Path records\n" -" 4) Check for duplicate Path records\n" -" 5) Check for orphaned Jobmedia records\n" -" 6) Check for orphaned File records\n" -" 7) Check for orphaned Path records\n" -" 8) Check for orphaned FileSet records\n" -" 9) Check for orphaned Client records\n" -" 10) Check for orphaned Job records\n" -" 11) Check for all Admin records\n" -" 12) Check for all Restore records\n" -" 13) All (3-12)\n" -" 14) Quit\n" -msgstr "" - -#: src/tools/dbcheck.c:393 -msgid "Select function number: " -msgstr "" - -#: src/tools/dbcheck.c:400 -#, c-format -msgid "Database will be modified.\n" -msgstr "" - -#: src/tools/dbcheck.c:402 -#, c-format -msgid "Database will NOT be modified.\n" -msgstr "" - -#: src/tools/dbcheck.c:481 -#, c-format -msgid "JobId=%s Name=\"%s\" StartTime=%s\n" -msgstr "" - -#: src/tools/dbcheck.c:488 -#, c-format -msgid "Orphaned JobMediaId=%s JobId=%s Volume=\"%s\"\n" -msgstr "" - -#: src/tools/dbcheck.c:495 -#, c-format -msgid "Orphaned FileId=%s JobId=%s Volume=\"%s\"\n" -msgstr "" - -#: src/tools/dbcheck.c:502 -#, c-format -msgid "Orphaned FileSetId=%s FileSet=\"%s\" MD5=%s\n" -msgstr "" - -#: src/tools/dbcheck.c:509 -#, c-format -msgid "Orphaned ClientId=%s Name=\"%s\"\n" -msgstr "" - -#: src/tools/dbcheck.c:562 -#, c-format -msgid "Deleting: %s\n" -msgstr "" - -#: src/tools/dbcheck.c:634 -#, c-format -msgid "Checking for duplicate Path entries.\n" -msgstr "" - -#: src/tools/dbcheck.c:645 -#, c-format -msgid "Found %d duplicate Path records.\n" -msgstr "" - -#: src/tools/dbcheck.c:646 src/tools/dbcheck.c:708 src/tools/dbcheck.c:754 -#: src/tools/dbcheck.c:822 src/tools/dbcheck.c:864 src/tools/dbcheck.c:906 -#: src/tools/dbcheck.c:948 src/tools/dbcheck.c:985 src/tools/dbcheck.c:1018 -#: src/tools/dbcheck.c:1052 -msgid "Print them? (yes/no): " -msgstr "" - -#: src/tools/dbcheck.c:669 -#, c-format -msgid "Found %d for: %s\n" -msgstr "" - -#: src/tools/dbcheck.c:699 -#, c-format -msgid "Checking for orphaned JobMedia entries.\n" -msgstr "" - -#: src/tools/dbcheck.c:707 -#, c-format -msgid "Found %d orphaned JobMedia records.\n" -msgstr "" - -#: src/tools/dbcheck.c:725 -#, c-format -msgid "Deleting %d orphaned JobMedia records.\n" -msgstr "" - -#: src/tools/dbcheck.c:742 -#, c-format -msgid "Checking for orphaned File entries. This may take some time!\n" -msgstr "" - -#: src/tools/dbcheck.c:753 -#, c-format -msgid "Found %d orphaned File records.\n" -msgstr "" - -#: src/tools/dbcheck.c:770 -#, c-format -msgid "Deleting %d orphaned File records.\n" -msgstr "" - -#: src/tools/dbcheck.c:789 -#, c-format -msgid "Pruning orphaned Path entries isn't possible when using BVFS.\n" -msgstr "" - -#: src/tools/dbcheck.c:798 -msgid "Create temporary index? (yes/no): " -msgstr "" - -#: src/tools/dbcheck.c:810 -#, c-format -msgid "Checking for orphaned Path entries. This may take some time!\n" -msgstr "" - -#: src/tools/dbcheck.c:821 -#, c-format -msgid "Found %d orphaned Path records.\n" -msgstr "" - -#: src/tools/dbcheck.c:834 -#, c-format -msgid "Deleting %d orphaned Path records.\n" -msgstr "" - -#: src/tools/dbcheck.c:853 -#, c-format -msgid "Checking for orphaned FileSet entries. This takes some time!\n" -msgstr "" - -#: src/tools/dbcheck.c:863 -#, c-format -msgid "Found %d orphaned FileSet records.\n" -msgstr "" - -#: src/tools/dbcheck.c:878 -#, c-format -msgid "Deleting %d orphaned FileSet records.\n" -msgstr "" - -#: src/tools/dbcheck.c:887 -#, c-format -msgid "Checking for orphaned Client entries.\n" -msgstr "" - -#: src/tools/dbcheck.c:905 -#, c-format -msgid "Found %d orphaned Client records.\n" -msgstr "" - -#: src/tools/dbcheck.c:920 -#, c-format -msgid "Deleting %d orphaned Client records.\n" -msgstr "" - -#: src/tools/dbcheck.c:929 -#, c-format -msgid "Checking for orphaned Job entries.\n" -msgstr "" - -#: src/tools/dbcheck.c:947 -#, c-format -msgid "Found %d orphaned Job records.\n" -msgstr "" - -#: src/tools/dbcheck.c:962 -#, c-format -msgid "Deleting %d orphaned Job records.\n" -msgstr "" - -#: src/tools/dbcheck.c:964 -#, c-format -msgid "Deleting JobMedia records of orphaned Job records.\n" -msgstr "" - -#: src/tools/dbcheck.c:966 -#, c-format -msgid "Deleting Log records of orphaned Job records.\n" -msgstr "" - -#: src/tools/dbcheck.c:975 -#, c-format -msgid "Checking for Admin Job entries.\n" -msgstr "" - -#: src/tools/dbcheck.c:984 -#, c-format -msgid "Found %d Admin Job records.\n" -msgstr "" - -#: src/tools/dbcheck.c:999 -#, c-format -msgid "Deleting %d Admin Job records.\n" -msgstr "" - -#: src/tools/dbcheck.c:1008 -#, c-format -msgid "Checking for Restore Job entries.\n" -msgstr "" - -#: src/tools/dbcheck.c:1017 -#, c-format -msgid "Found %d Restore Job records.\n" -msgstr "" - -#: src/tools/dbcheck.c:1032 -#, c-format -msgid "Deleting %d Restore Job records.\n" -msgstr "" - -#: src/tools/dbcheck.c:1042 -#, c-format -msgid "Checking for Paths without a trailing slash\n" -msgstr "" - -#: src/tools/dbcheck.c:1051 -#, c-format -msgid "Found %d bad Path records.\n" -msgstr "" - -#: src/tools/dbcheck.c:1068 -#, c-format -msgid "Reparing %d bad Filename records.\n" -msgstr "" - -#: src/tools/dbcheck.c:1214 -#, c-format -msgid "" -"Ok. Index over the %s column already exists and dbcheck will work faster.\n" -msgstr "" - -#: src/tools/dbcheck.c:1217 -#, c-format -msgid "" -"Note. Index over the %s column not found, that can greatly slow down " -"dbcheck.\n" -msgstr "" - -#: src/tools/dbcheck.c:1232 -#, c-format -msgid "Create temporary index... This may take some time!\n" -msgstr "" - -#: src/tools/dbcheck.c:1240 -#, c-format -msgid "Temporary index created.\n" -msgstr "" - -#: src/tools/dbcheck.c:1255 -#, c-format -msgid "Drop temporary index.\n" -msgstr "" - -#: src/tools/dbcheck.c:1265 -#, c-format -msgid "Temporary index %s deleted.\n" -msgstr "" - -#: src/tools/drivetype.c:29 -#, c-format -msgid "" -"\n" -"Usage: drivetype [-v] path ...\n" -"\n" -" Print the drive type a given file/directory is on.\n" -" The following options are supported:\n" -"\n" -" -l print local fixed hard drive\n" -" -a display information on all drives\n" -" -v print both path and file system type.\n" -" -? print this message.\n" -"\n" -msgstr "" - -#: src/tools/drivetype.c:60 -#, c-format -msgid "%s: unknown\n" -msgstr "" - -#: src/tools/fstype.c:29 -#, c-format -msgid "" -"\n" -"Usage: fstype [-v] path ...\n" -"\n" -" Print the file system type for each file/directory argument given.\n" -" The following options are supported:\n" -"\n" -" -l print all file system types in mtab.\n" -" -m print full entries in mtab.\n" -" -v print both path and file system type of each argument.\n" -" -? print this message.\n" -"\n" -msgstr "" - -#: src/tools/fstype.c:163 -#, c-format -msgid "%s: unknown file system type\n" -msgstr "" - -#: src/tools/testfind.c:57 -#, c-format -msgid "" -"\n" -"Usage: testfind [-d debug_level] [-] [pattern1 ...]\n" -" -a print extended attributes (Win32 debug)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -c specify config file containing FileSet resources\n" -" -f specify which FileSet to use\n" -" -? print this message.\n" -"\n" -"Patterns are used for file inclusion -- normally directories.\n" -"Debug level >= 1 prints each file found.\n" -"Debug level >= 10 prints path/file for catalog.\n" -"Errors are always printed.\n" -"Files/paths truncated is the number of files/paths with len > 255.\n" -"Truncation is only in the catalog.\n" -"\n" -msgstr "" - -#: src/tools/testfind.c:223 -#, c-format -msgid "" -"\n" -"Total files : %d\n" -"Max file length: %d\n" -"Max path length: %d\n" -"Files truncated: %d\n" -"Paths truncated: %d\n" -"Hard links : %d\n" -msgstr "" - -#: src/tools/testfind.c:264 -#, c-format -msgid "Reg: %s\n" -msgstr "" - -#: src/tools/testfind.c:286 -msgid "\t[will not descend: recursion turned off]" -msgstr "" - -#: src/tools/testfind.c:288 -msgid "\t[will not descend: file system change not allowed]" -msgstr "" - -#: src/tools/testfind.c:290 -msgid "\t[will not descend: disallowed file system]" -msgstr "" - -#: src/tools/testfind.c:292 -msgid "\t[will not descend: disallowed drive type]" -msgstr "" - -#: src/tools/testfind.c:308 src/tools/testls.c:203 -#, c-format -msgid "Err: Could not access %s: %s\n" -msgstr "" - -#: src/tools/testfind.c:311 src/tools/testls.c:206 -#, c-format -msgid "Err: Could not follow ff->link %s: %s\n" -msgstr "" - -#: src/tools/testfind.c:314 src/tools/testls.c:209 -#, c-format -msgid "Err: Could not stat %s: %s\n" -msgstr "" - -#: src/tools/testfind.c:317 src/tools/testls.c:212 -#, c-format -msgid "Skip: File not saved. No change. %s\n" -msgstr "" - -#: src/tools/testfind.c:320 src/tools/testls.c:215 -#, c-format -msgid "Err: Attempt to backup archive. Not saved. %s\n" -msgstr "" - -#: src/tools/testfind.c:323 src/tools/testls.c:224 -#, c-format -msgid "Err: Could not open directory %s: %s\n" -msgstr "" - -#: src/tools/testfind.c:326 src/tools/testls.c:227 -#, c-format -msgid "Err: Unknown file ff->type %d: %s\n" -msgstr "" - -#: src/tools/testfind.c:376 -#, c-format -msgid "===== Filename truncated to 255 chars: %s\n" -msgstr "" - -#: src/tools/testfind.c:393 -#, c-format -msgid "========== Path name truncated to 255 chars: %s\n" -msgstr "" - -#: src/tools/testfind.c:402 -#, c-format -msgid "========== Path length is zero. File=%s\n" -msgstr "" - -#: src/tools/testfind.c:405 -#, c-format -msgid "Path: %s\n" -msgstr "" +#, fuzzy +#~ msgid "3901 Unable to open device \"%s\": ERR=%s\n" +#~ msgstr "Не можливо встановити час файлу %s: ERR=%s\n" -#: src/tools/testls.c:47 -#, c-format -msgid "" -"\n" -"Usage: testls [-d debug_level] [-] [pattern1 ...]\n" -" -a print extended attributes (Win32 debug)\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -e specify file of exclude patterns\n" -" -i specify file of include patterns\n" -" -q quiet, don't print filenames (debug)\n" -" - read pattern(s) from stdin\n" -" -? print this message.\n" -"\n" -"Patterns are file inclusion -- normally directories.\n" -"Debug level >= 1 prints each file found.\n" -"Debug level >= 10 prints path/file for catalog.\n" -"Errors always printed.\n" -"Files/paths truncated is number with len > 255.\n" -"Truncation is only in catalog.\n" -"\n" -msgstr "" +#, fuzzy +#~ msgid "3905 Unknown wait state %d\n" +#~ msgstr "Невідомий статус задачі %c. " -#: src/tools/testls.c:143 -#, c-format -msgid "Could not open include file: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Cannot open session, received bad parameters.\n" +#~ msgstr "Не вдається відкрити файл %s для виведення. ERR=%s\n" -#: src/tools/testls.c:156 -#, c-format -msgid "Could not open exclude file: %s\n" -msgstr "" +#, fuzzy +#~ msgid "Could not open(%s,%s,0640): ERR=%s\n" +#~ msgstr "Не вдалось відкрити%s: ERR=%s\n" -#: src/tools/testls.c:170 -#, c-format -msgid "Files seen = %d\n" -msgstr "" +#, fuzzy +#~ msgid "Could not open aligned volume: %s, ERR=%s\n" +#~ msgstr "Не вдалось відкрити%s: ERR=%s\n" -#: src/tools/testls.c:218 -#, c-format -msgid "Recursion turned off. Directory not entered. %s\n" -msgstr "" +#, fuzzy +#~ msgid "Invalid connection from %s. Len=%d\n" +#~ msgstr "Від'єднуюсь від Клієнта %s:%d\n" -#: src/tools/testls.c:221 -#, c-format -msgid "Skip: File system change prohibited. Directory not entered. %s\n" -msgstr "" +#, fuzzy +#~ msgid "Client connect failed: Job name not found: %s\n" +#~ msgstr "Керівник не прийняв команду Hello\n" -#: src/win32/compat/compat.cpp:2855 -msgid "" -"\n" -"\n" -"Bacula ERROR: " -msgstr "" +#, fuzzy +#~ msgid "Recv request to Client failed. ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/win32/filed/plugins/vssapi.c:1428 -#, fuzzy, c-format -msgid "Unable to resolve parent path for %ls\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" +#, fuzzy +#~ msgid "Send caps to Client failed. ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/win32/filed/plugins/vssfs.c:226 src/win32/filed/plugins/vssfs.c:238 #, fuzzy -msgid "Unable to parse user supplied restore configuration\n" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" +#~ msgid "Recv caps from Client failed. ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/win32/libwin32/main.cpp:226 -msgid "Bad Command Line Option" -msgstr "Не зрозумілий параметр командного рядка" +#, fuzzy +#~ msgid "Couldn't rewind %s device %s: ERR=%s\n" +#~ msgstr "Не вдалось створити жорстку лінку(hardlink) %s -> %s: ERR=%s\n" -#: src/win32/libwin32/service.cpp:96 -msgid "RegisterServiceCtlHandler failed" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Got Aligned or File type Volume %s on Dedup device %s. Wanted File.\n" +#~ msgstr "У картотеці створено новий Том \"%s\".\n" -#: src/win32/libwin32/service.cpp:97 -msgid "Failure contacting the Service Handler" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Got Aligned or Dedup type Volume %s on File device %s. Wanted File.\n" +#~ msgstr "У картотеці створено новий Том \"%s\".\n" -#: src/win32/libwin32/service.cpp:108 -msgid "Service start report failed" -msgstr "" +#, fuzzy +#~ msgid "" +#~ "Got File or Dedup type Volume %s on Aligned device %s. Wanted Aligned.\n" +#~ msgstr "У картотеці створено новий Том \"%s\".\n" -#: src/win32/libwin32/service.cpp:161 -msgid "StartServiceCtrlDispatcher failed." -msgstr "" +#, fuzzy +#~ msgid "Could not reserve volume %s on %s device %s\n" +#~ msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" -#: src/win32/libwin32/service.cpp:168 -msgid "KERNEL32.DLL not found: Bacula service not started" -msgstr "" +#, fuzzy +#~ msgid "Open %s device %s Volume \"%s\" failed: ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/win32/libwin32/service.cpp:178 -msgid "Registry service not found: Bacula service not started" -msgstr "" +#, fuzzy +#~ msgid "Rewind error on %s device %s: ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/win32/libwin32/service.cpp:180 -msgid "Registry service entry point not found" -msgstr "" +#, fuzzy +#~ msgid "Truncate error on %s device %s: ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/win32/libwin32/service.cpp:201 -msgid "Report Service failure" -msgstr "" +#, fuzzy +#~ msgid "Unable to write %s device %s: ERR=%s\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/win32/libwin32/service.cpp:232 #, fuzzy -msgid "Unable to install the service" -msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" +#~ msgid "Open of %s device %s Volume \"%s\" failed: ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/win32/libwin32/service.cpp:240 -msgid "Service command length too long" -msgstr "" +#, fuzzy +#~ msgid "Unable to position to end of data on %s device %s: ERR=%s\n" +#~ msgstr "Не можливо встановити час файлу %s: ERR=%s\n" -#: src/win32/libwin32/service.cpp:241 -msgid "Service command length too long. Service not registered." -msgstr "" +#, fuzzy +#~ msgid "Volume \"%s\" not loaded on %s device %s.\n" +#~ msgstr "У картотеці створено новий Том \"%s\".\n" -#: src/win32/libwin32/service.cpp:254 -msgid "" -"The Service Control Manager could not be contacted - the service was not " -"installed" -msgstr "" +#, fuzzy +#~ msgid "Labeled new Volume \"%s\" on %s device %s.\n" +#~ msgstr "У картотеці створено новий Том \"%s\".\n" -#: src/win32/libwin32/service.cpp:277 src/win32/libwin32/service.cpp:306 -#: src/win32/libwin32/service.cpp:352 src/win32/libwin32/service.cpp:359 -#: src/win32/libwin32/service.cpp:363 -msgid "The Bacula service: " -msgstr "" +#, fuzzy +#~ msgid "%s device %s not configured to autolabel Volumes.\n" +#~ msgstr "TLS необхідний, але не налаштовано у Bacula.\n" -#: src/win32/libwin32/service.cpp:284 -msgid "" -"Provides file backup and restore services. Bacula -- the network backup " -"solution." -msgstr "" +#, fuzzy +#~ msgid "Cannot open %s Dev=%s, Vol=%s for reading.\n" +#~ msgstr "Не вдається відкрити файл %s для введення. ERR=%s\n" -#: src/win32/libwin32/service.cpp:295 -msgid "Cannot write System Registry for " -msgstr "" +#, fuzzy +#~ msgid "Error sending header to Client. ERR=%s\n" +#~ msgstr "Помилка надсилання Hello до Збирача. ERR=%s\n" -#: src/win32/libwin32/service.cpp:296 -msgid "" -"The System Registry could not be updated - the Bacula service was not " -"installed" -msgstr "" +#, fuzzy +#~ msgid "Error sending data to Client. ERR=%s\n" +#~ msgstr "Помилка надсилання Hello до Збирача. ERR=%s\n" -#: src/win32/libwin32/service.cpp:305 -msgid "Cannot add Bacula key to System Registry" -msgstr "" +#, fuzzy +#~ msgid "Truncate on attributes file failed: ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/win32/libwin32/service.cpp:316 -msgid "The " -msgstr "" +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%sVersion: %s (%s)\n" +#~ "\n" +#~ "Usage: bacula-sd [options] [-c config_file] [config_file]\n" +#~ " -c use as configuration file\n" +#~ " -d [,] set debug level to , debug tags to \n" +#~ " -dt print timestamp in debug output\n" +#~ " -f run in foreground (for debugging)\n" +#~ " -g set groupid to group\n" +#~ " -m print kaboom output (for debugging)\n" +#~ " -p proceed despite I/O errors\n" +#~ " -s no signals (for debugging)\n" +#~ " -t test - read config and exit\n" +#~ " -u userid to \n" +#~ " -v verbose user messages\n" +#~ " -? print this message.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Версія: %s (%s) %s %s %s\n" +#~ "\n" +#~ "Використання: bat [-s] [-c config_file] [-d debug_level] [config_file]\n" +#~ " -c set configuration file to file\n" +#~ " -dnn set debug level to nn\n" +#~ " -s без сигналів\n" +#~ " -t перевірка - прочитати конфігурацію і вийти\n" +#~ " -? print this message.\n" +#~ "\n" -#: src/win32/libwin32/service.cpp:370 -msgid "An existing Bacula service: " -msgstr "" +#, fuzzy +#~ msgid "Unable to stat ControlDevice %s: ERR=%s\n" +#~ msgstr "Не можливо встановити час файлу %s: ERR=%s\n" -#: src/win32/libwin32/service.cpp:378 -msgid "" -"The service Manager could not be contacted - the Bacula service was not " -"removed" -msgstr "" +#, fuzzy +#~ msgid "Unable to init lock: ERR=%s\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/win32/libwin32/service.cpp:391 -msgid "" -"Could not find registry entry.\n" -"Service probably not registerd - the Bacula service was not removed" -msgstr "" +#, fuzzy +#~ msgid "Fatal getaddrinfo for myself failed \"%s\": ERR=%s\n" +#~ msgstr "Помилка у %s файл %s: ERR=%s\n" -#: src/win32/libwin32/service.cpp:398 #, fuzzy -msgid "Could not delete Registry key for " -msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" +#~ msgid "Failed to connect to mailhost %s\n" +#~ msgstr "Ініціалізація контексту TLS для Консолі невдала \"%s\".\n" -#: src/win32/libwin32/service.cpp:408 -msgid "Bacula could not be contacted, probably not running" -msgstr "" +#, fuzzy +#~ msgid "Could not open, database \"%s\".\n" +#~ msgstr "Не вдалось відкрити%s: ERR=%s\n" -#: src/win32/libwin32/service.cpp:415 -msgid "The Bacula service has been removed" -msgstr "" +#, fuzzy +#~ msgid "Unable to resolve parent path for %ls\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/win32/libwin32/service.cpp:456 -msgid "SetServiceStatus failed" -msgstr "" +#, fuzzy +#~ msgid "Unable to parse user supplied restore configuration\n" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/win32/libwin32/service.cpp:482 -#, c-format -msgid "" -"\n" -"\n" -"%s error: %ld at %s:%d" -msgstr "" +#~ msgid "Bad Command Line Option" +#~ msgstr "Не зрозумілий параметр командного рядка" -#: src/win32/libwin32/service.cpp:558 -#, c-format -msgid "Locked by: %s, duration: %ld seconds\n" -msgstr "" +#, fuzzy +#~ msgid "Unable to install the service" +#~ msgstr "Не можливо встановити власника файлу %s: ERR=%s\n" -#: src/win32/libwin32/service.cpp:562 -#, c-format -msgid "No longer locked\n" -msgstr "" +#, fuzzy +#~ msgid "Could not delete Registry key for " +#~ msgstr "Не вдалось відновити прапорці для файлу %s: ERR=%s\n" -#: src/win32/libwin32/service.cpp:566 #, fuzzy -msgid "Could not lock database" -msgstr "Не вдалось відкрити%s: ERR=%s\n" +#~ msgid "Could not lock database" +#~ msgstr "Не вдалось відкрити%s: ERR=%s\n" #, fuzzy #~ msgid "AIX Specific Extended attribs" diff --git a/bacula/release/README b/bacula/release/README index f8b804f341..969ae98568 100644 --- a/bacula/release/README +++ b/bacula/release/README @@ -1,3 +1,7 @@ +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# This directory contains the scripts that we use to create a new set of release files. diff --git a/bacula/release/ReleaseProcedure.txt b/bacula/release/ReleaseProcedure.txt index b304fb2093..0aa407eee2 100644 --- a/bacula/release/ReleaseProcedure.txt +++ b/bacula/release/ReleaseProcedure.txt @@ -1,3 +1,7 @@ +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# These are the steps to complete for making a new release. diff --git a/bacula/release/check_packages b/bacula/release/check_packages new file mode 100755 index 0000000000..63c10b7129 --- /dev/null +++ b/bacula/release/check_packages @@ -0,0 +1,25 @@ +#!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# +. ./config + +cp package-list /tmp/$$ +echo "s%@ver@%${ver}%g" >/tmp/$$ +echo "s%@lsmdate@%${lsmdate}%g" >>/tmp/$$ +sed -f /tmp/$$ package-list >/tmp/a$$ + +echo "Checking that all packages in package-list are built" +err=0 +for i in `cat /tmp/a$$`; do + if test ! -e $i ; then + echo "Error: package $i not found" + err=1 + fi +done +if [ $err = 0 ] ; then + echo "All packages exist ..." +fi + +rm -f /tmp/$$ /tmp/a$$ diff --git a/bacula/release/clean b/bacula/release/clean index 4a547d5c77..deccc1447d 100755 --- a/bacula/release/clean +++ b/bacula/release/clean @@ -1,4 +1,7 @@ #!/bin/sh - +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # Remove old baculas rm -f bacula-* win*.log diff --git a/bacula/release/config b/bacula/release/config index 3646fe55ea..578e103cdb 100644 --- a/bacula/release/config +++ b/bacula/release/config @@ -1,6 +1,8 @@ # # Configuration for release scripts - +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # Set to the Branch you are working on # diff --git a/bacula/release/git2changelog.pl b/bacula/release/git2changelog.pl index 1ae1b41286..f371deb0c7 100755 --- a/bacula/release/git2changelog.pl +++ b/bacula/release/git2changelog.pl @@ -1,5 +1,8 @@ #!/usr/bin/perl -w # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# =head USAGE ./git2changelog.pl Release-3.0.1..Release-3.0.2 diff --git a/bacula/release/makeall b/bacula/release/makeall index aadd33cd40..4a86327aa3 100755 --- a/bacula/release/makeall +++ b/bacula/release/makeall @@ -1,5 +1,8 @@ #!/bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # Make full release # @@ -12,4 +15,3 @@ cd $cwd ./makebacularel $bacula $remote $branch $ver ./makedocsrel $bacula $docs $remote $branch $ver - diff --git a/bacula/release/makebacularel b/bacula/release/makebacularel index 869667af8d..7e20acfdae 100755 --- a/bacula/release/makebacularel +++ b/bacula/release/makebacularel @@ -1,5 +1,7 @@ #!/bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # This script is used to make a Bacula release # bacula diff --git a/bacula/release/makedocsonly b/bacula/release/makedocsonly index f795a82c28..c18389c988 100755 --- a/bacula/release/makedocsonly +++ b/bacula/release/makedocsonly @@ -1,5 +1,8 @@ #!/bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # Make only the docs packages # diff --git a/bacula/release/makedocsrel b/bacula/release/makedocsrel index 8a4f97c38c..0b34cd7d45 100755 --- a/bacula/release/makedocsrel +++ b/bacula/release/makedocsrel @@ -1,5 +1,7 @@ #!/bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # This script is used to make a Bacula docs release # docs diff --git a/bacula/release/makemanualsrel b/bacula/release/makemanualsrel new file mode 100755 index 0000000000..2775cdc316 --- /dev/null +++ b/bacula/release/makemanualsrel @@ -0,0 +1,64 @@ +#!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# +# This script is used to make a Bacula manuals release +# There are the html manuals and the pdf manuals. Both +# are made from the docs source release. +# +# It writes in the current directory, so we recommend that you +# do not run it in the Bacula source or Git directory, but +# in a special release directory. +# +# Commit all changes, export the release, make a release tar. +# +# source ./config +. ./config + +cwd=`pwd` +ver=$1 +tagbase=Release- +base_name=bacula +# from where we get out package files +base_pkg=${base_name}-docs +html_name=${base_name}-html-manuals-${ver} +pdf_name=${base_name}-pdf-manuals-${ver} + +if [ $# != 1 ] ; then + echo "Need $0 " + echo "e.g. $0 6.4.0" + exit 1 +fi + +rm -rf $base_pkg-$ver +echo "Detarring $base_pkg-$ver.tar.bz2" +tar xfj $base_pkg-$ver.tar.bz2 +cd $base_pkg-$ver/manuals/en +mkdir -p html pdf +for i in console developers main misc problems utility; do + cp -a $i/$i/ html/ + cp $i/$i.pdf pdf/ +done + +# create index for bweb +../../tools/create_index.pl main/main +cp ../../tools/index.html . + +echo "Creating ${html_name}.tar.gz" +tar cfz ${html_name}.tar.gz html css js images index.html +echo "Creating ${pdf_name}.tar.gz" +tar cfz ${pdf_name}.tar.gz pdf + +mv ${html_name}.tar.gz $cwd/ +mv ${pdf_name}.tar.gz $cwd/ + +cd $cwd +# Remove detared docs directory +rm -rf $base_pkg-$ver ${html_name}.tar.gz.sig ${pdf_name}.tar.gz.sig +./sign ${html_name}.tar.gz +./sign ${pdf_name}.tar.gz +echo " " +echo "Done making html and pdf manuals" + +exit 0 diff --git a/bacula/release/makerescuerel b/bacula/release/makerescuerel index 2f8add903b..9eda4041d8 100755 --- a/bacula/release/makerescuerel +++ b/bacula/release/makerescuerel @@ -1,5 +1,7 @@ #!/bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # This script is used to make a Bacula rescue release # rescue diff --git a/bacula/release/pushtags b/bacula/release/pushtags index 7799995b04..07fd592122 100755 --- a/bacula/release/pushtags +++ b/bacula/release/pushtags @@ -1,5 +1,8 @@ #!/bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # Push tags # diff --git a/bacula/release/sign b/bacula/release/sign index f2bfdd962d..2bdfc4527a 100755 --- a/bacula/release/sign +++ b/bacula/release/sign @@ -1,4 +1,8 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# gpgkey=${gpgkey:-bacula} gpg --detach-sign --armor --default-key $gpgkey -o $1.sig $1 gpg --verify $1.sig diff --git a/bacula/release/upload b/bacula/release/upload new file mode 100755 index 0000000000..f1d18bb7c2 --- /dev/null +++ b/bacula/release/upload @@ -0,0 +1,37 @@ +#!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# +# Upload to File Release System on server +# +. ./config + +ver="7.0.5" +RSYNC="rsync -av --no-g --progress $upload_opt" + +do_upload() +{ +where=$1 +echo "Creating ${where}:/home/src/$ver" +ssh ${where} </dev/null 2>&1; then - # TERM first, then KILL if not dead - kill -TERM $pid 2>/dev/null - sleep 1 - if ${PS} -p "$pid" >/dev/null 2>&1 ; then - sleep 1 - if ${PS} -p "$pid" >/dev/null 2>&1 ; then - sleep 3 - if ${PS} -p "$pid" >/dev/null 2>&1 ; then - kill -KILL $pid 2>/dev/null - fi - fi - fi - fi - ${PS} -p "$pid" >/dev/null 2>&1 - RC=$? - [ $RC -eq 0 ] && failure "$base shutdown" || success "$base shutdown" + if ${PS} -p "$pid">/dev/null 2>&1; then + # TERM first, then KILL if not dead + kill -TERM $pid 2>/dev/null + sleep 1 + if ${PS} -p "$pid" >/dev/null 2>&1 ; then + sleep 1 + if ${PS} -p "$pid" >/dev/null 2>&1 ; then + sleep 3 + if ${PS} -p "$pid" >/dev/null 2>&1 ; then + kill -KILL $pid 2>/dev/null + fi + fi + fi + fi + ${PS} -p "$pid" >/dev/null 2>&1 + RC=$? + [ $RC -eq 0 ] && failure "$base shutdown" || success "$base shutdown" # RC=$((! $RC)) # use specified level only else - if ${PS} -p "$pid" >/dev/null 2>&1; then - kill $killlevel $pid 2>/dev/null - RC=$? - [ $RC -eq 0 ] && success "$base $killlevel" || failure "$base $killlevel" - fi + if ${PS} -p "$pid" >/dev/null 2>&1; then + kill $killlevel $pid 2>/dev/null + RC=$? + [ $RC -eq 0 ] && success "$base $killlevel" || failure "$base $killlevel" + fi fi else failure "$base shutdown" @@ -113,8 +134,8 @@ pidofproc() { if [ -f ${PIDDIR}/$base.$2.pid ] ; then pid=`head -n 1 ${PIDDIR}/$base.$2.pid` if [ "$pid" != "" ] ; then - echo $pid - return 0 + echo $pid + return 0 fi fi @@ -153,12 +174,12 @@ status() { return 0 else pid=`${PSCMD} | ${AWK} 'BEGIN { prog=ARGV[1]; ARGC=1 } - { if ((prog == $2) || (("(" prog ")") == $2) || - (("[" prog "]") == $2) || - ((prog ":") == $2)) { print $1 ; exit 0 } }' $1` + { if ((prog == $2) || (("(" prog ")") == $2) || + (("[" prog "]") == $2) || + ((prog ":") == $2)) { print $1 ; exit 0 } }' $1` if [ "$pid" != "" ] ; then - echo "$base (pid $pid) is running..." - return 0 + echo "$base (pid $pid) is running..." + return 0 fi fi @@ -166,8 +187,8 @@ status() { if [ -f ${PIDDIR}/$base.$2.pid ] ; then pid=`head -n 1 ${PIDDIR}/$base.$2.pid` if [ "$pid" != "" ] ; then - echo "$base dead but pid file exists" - return 1 + echo "$base dead but pid file exists" + return 1 fi fi # See if the subsys lock exists @@ -198,29 +219,29 @@ fi case "$1" in start) [ -x ${BACDIRBIN}/bacula-dir ] && { - echo "Starting the $Bacula Director daemon" - OPTIONS='' - if [ "${DIR_USER}" != '' ]; then - OPTIONS="${OPTIONS} -u ${DIR_USER}" - fi - - if [ "${DIR_GROUP}" != '' ]; then - OPTIONS="${OPTIONS} -g ${DIR_GROUP}" - fi - - if [ "x${VALGRIND_DIR}" = "x1" ]; then - valgrind --leak-check=full ${BACDIRBIN}/bacula-dir $2 $3 ${OPTIONS} -v -c ${BACDIRCFG}/bacula-dir.conf - else - ${BACDIRBIN}/bacula-dir $2 $3 ${OPTIONS} -v -c ${BACDIRCFG}/bacula-dir.conf - fi - sleep 1 + echo "Starting the $Bacula Director daemon" + OPTIONS='' + if [ "${DIR_USER}" != '' ]; then + OPTIONS="${OPTIONS} -u ${DIR_USER}" + fi + + if [ "${DIR_GROUP}" != '' ]; then + OPTIONS="${OPTIONS} -g ${DIR_GROUP}" + fi + + if [ "x${VALGRIND_DIR}" = "x1" ]; then + valgrind --leak-check=full ${BACDIRBIN}/bacula-dir $2 $3 ${OPTIONS} -v -c ${BACDIRCFG}/bacula-dir.conf + else + ${BACDIRBIN}/bacula-dir $2 $3 ${OPTIONS} -v -c ${BACDIRCFG}/bacula-dir.conf + fi + sleep 1 } ;; stop) [ -x ${BACDIRBIN}/bacula-dir ] && { - echo "Stopping the $Bacula Director daemon" - killproc ${BACDIRBIN}/bacula-dir ${DIR_PORT} + echo "Stopping the $Bacula Director daemon" + killproc ${BACDIRBIN}/bacula-dir ${DIR_PORT} $2 } ;; diff --git a/bacula/scripts/bacula-ctl-fd.in b/bacula/scripts/bacula-ctl-fd.in index 3393ce633b..c359eaea61 100644 --- a/bacula/scripts/bacula-ctl-fd.in +++ b/bacula/scripts/bacula-ctl-fd.in @@ -1,7 +1,25 @@ #! /bin/sh # +# Bacula(R) - The Network Backup Solution +# +# Copyright (C) 2000-2015 Kern Sibbald +# Copyright (C) 2000-2014 Free Software Foundation Europe e.V. +# +# The original author of Bacula is Kern Sibbald, with contributions +# from many others, a complete list can be found in the file AUTHORS. +# +# You may use this file and others of this release according to the +# license defined in the LICENSE file, which includes the Affero General +# Public License, v3.0 ("AGPLv3") and some additional permissions and +# terms pursuant to its AGPLv3 Section 7. +# +# This notice must be preserved when any source code is +# conveyed and/or propagated. +# +# Bacula(R) is a registered trademark of Kern Sibbald. +# # bacula-ctl-fd This shell script takes care of starting and stopping -# the bacula File daemon. +# the bacula File daemon. # # This is pretty much watered down version of the RedHat script # that works on Solaris as well as Linux, but it won't work everywhere. @@ -32,7 +50,7 @@ FD_PORT=@fd_port@ FD_USER=@fd_user@ FD_GROUP=@fd_group@ Bacula="@BACULA@" -PIDOF=@PIDOF@ +PIDOF=@PIDOF@ # A function to stop a program. killproc() { @@ -61,31 +79,31 @@ killproc() { # Kill it. if [ "$pid" != "" ] ; then if [ "$notset" = "1" ] ; then - if ${PS} -p "$pid">/dev/null 2>&1; then - # TERM first, then KILL if not dead - kill -TERM $pid 2>/dev/null - sleep 1 - if ${PS} -p "$pid" >/dev/null 2>&1 ; then - sleep 1 - if ${PS} -p "$pid" >/dev/null 2>&1 ; then - sleep 3 - if ${PS} -p "$pid" >/dev/null 2>&1 ; then - kill -KILL $pid 2>/dev/null - fi - fi - fi - fi - ${PS} -p "$pid" >/dev/null 2>&1 - RC=$? - [ $RC -eq 0 ] && failure "$base shutdown" || success "$base shutdown" + if ${PS} -p "$pid">/dev/null 2>&1; then + # TERM first, then KILL if not dead + kill -TERM $pid 2>/dev/null + sleep 1 + if ${PS} -p "$pid" >/dev/null 2>&1 ; then + sleep 1 + if ${PS} -p "$pid" >/dev/null 2>&1 ; then + sleep 3 + if ${PS} -p "$pid" >/dev/null 2>&1 ; then + kill -KILL $pid 2>/dev/null + fi + fi + fi + fi + ${PS} -p "$pid" >/dev/null 2>&1 + RC=$? + [ $RC -eq 0 ] && failure "$base shutdown" || success "$base shutdown" # RC=$((! $RC)) # use specified level only else - if ${PS} -p "$pid" >/dev/null 2>&1; then - kill $killlevel $pid 2>/dev/null - RC=$? - [ $RC -eq 0 ] && success "$base $killlevel" || failure "$base $killlevel" - fi + if ${PS} -p "$pid" >/dev/null 2>&1; then + kill $killlevel $pid 2>/dev/null + RC=$? + [ $RC -eq 0 ] && success "$base $killlevel" || failure "$base $killlevel" + fi fi else failure "$base shutdown" @@ -113,8 +131,8 @@ pidofproc() { if [ -f ${PIDDIR}/$base.$2.pid ] ; then pid=`head -n 1 ${PIDDIR}/$base.$2.pid` if [ "$pid" != "" ] ; then - echo $pid - return 0 + echo $pid + return 0 fi fi @@ -153,12 +171,12 @@ status() { return 0 else pid=`${PSCMD} | ${AWK} 'BEGIN { prog=ARGV[1]; ARGC=1 } - { if ((prog == $2) || (("(" prog ")") == $2) || - (("[" prog "]") == $2) || - ((prog ":") == $2)) { print $1 ; exit 0 } }' $1` + { if ((prog == $2) || (("(" prog ")") == $2) || + (("[" prog "]") == $2) || + ((prog ":") == $2)) { print $1 ; exit 0 } }' $1` if [ "$pid" != "" ] ; then - echo "$base (pid $pid) is running..." - return 0 + echo "$base (pid $pid) is running..." + return 0 fi fi @@ -166,8 +184,8 @@ status() { if [ -f ${PIDDIR}/$base.$2.pid ] ; then pid=`head -n 1 ${PIDDIR}/$base.$2.pid` if [ "$pid" != "" ] ; then - echo "$base dead but pid file exists" - return 1 + echo "$base dead but pid file exists" + return 1 fi fi # See if the subsys lock exists @@ -198,29 +216,29 @@ fi case "$1" in start) [ -x ${BACFDBIN}/bacula-fd ] && { - echo "Starting the $Bacula File daemon" - OPTIONS='' - if [ "${FD_USER}" != '' ]; then - OPTIONS="${OPTIONS} -u ${FD_USER}" - fi - - if [ "${FD_GROUP}" != '' ]; then - OPTIONS="${OPTIONS} -g ${FD_GROUP}" - fi - - if [ "x${VALGRIND_FD}" = "x1" ]; then - valgrind --leak-check=full ${BACFDBIN}/bacula-fd $2 $3 ${OPTIONS} -v -c ${BACFDCFG}/bacula-fd.conf - else - ${BACFDBIN}/bacula-fd $2 $3 ${OPTIONS} -v -c ${BACFDCFG}/bacula-fd.conf - fi + echo "Starting the $Bacula File daemon" + OPTIONS='' + if [ "${FD_USER}" != '' ]; then + OPTIONS="${OPTIONS} -u ${FD_USER}" + fi + + if [ "${FD_GROUP}" != '' ]; then + OPTIONS="${OPTIONS} -g ${FD_GROUP}" + fi + + if [ "x${VALGRIND_FD}" = "x1" ]; then + valgrind --leak-check=full ${BACFDBIN}/bacula-fd $2 $3 ${OPTIONS} -v -c ${BACFDCFG}/bacula-fd.conf + else + ${BACFDBIN}/bacula-fd $2 $3 ${OPTIONS} -v -c ${BACFDCFG}/bacula-fd.conf + fi } ;; stop) # Stop the FD first so that SD will fail jobs and update catalog [ -x ${BACFDBIN}/bacula-fd ] && { - echo "Stopping the $Bacula File daemon" - killproc ${BACFDBIN}/bacula-fd ${FD_PORT} + echo "Stopping the $Bacula File daemon" + killproc ${BACFDBIN}/bacula-fd ${FD_PORT} $2 } ;; diff --git a/bacula/scripts/bacula-ctl-sd.in b/bacula/scripts/bacula-ctl-sd.in index 1f8592106a..3f5543b400 100644 --- a/bacula/scripts/bacula-ctl-sd.in +++ b/bacula/scripts/bacula-ctl-sd.in @@ -1,7 +1,25 @@ #! /bin/sh # +# Bacula(R) - The Network Backup Solution +# +# Copyright (C) 2000-2015 Kern Sibbald +# Copyright (C) 2000-2014 Free Software Foundation Europe e.V. +# +# The original author of Bacula is Kern Sibbald, with contributions +# from many others, a complete list can be found in the file AUTHORS. +# +# You may use this file and others of this release according to the +# license defined in the LICENSE file, which includes the Affero General +# Public License, v3.0 ("AGPLv3") and some additional permissions and +# terms pursuant to its AGPLv3 Section 7. +# +# This notice must be preserved when any source code is +# conveyed and/or propagated. +# +# Bacula(R) is a registered trademark of Kern Sibbald. +# # bacula-ctl-sd This shell script takes care of starting and stopping -# the bacula Storage daemon +# the bacula Storage daemon # # This is pretty much watered down version of the RedHat script # that works on Solaris as well as Linux, but it won't work everywhere. @@ -32,7 +50,7 @@ SD_PORT=@sd_port@ SD_USER=@sd_user@ SD_GROUP=@sd_group@ Bacula="@BACULA@" -PIDOF=@PIDOF@ +PIDOF=@PIDOF@ # A function to stop a program. killproc() { @@ -61,31 +79,31 @@ killproc() { # Kill it. if [ "$pid" != "" ] ; then if [ "$notset" = "1" ] ; then - if ${PS} -p "$pid">/dev/null 2>&1; then - # TERM first, then KILL if not dead - kill -TERM $pid 2>/dev/null - sleep 1 - if ${PS} -p "$pid" >/dev/null 2>&1 ; then - sleep 1 - if ${PS} -p "$pid" >/dev/null 2>&1 ; then - sleep 3 - if ${PS} -p "$pid" >/dev/null 2>&1 ; then - kill -KILL $pid 2>/dev/null - fi - fi - fi - fi - ${PS} -p "$pid" >/dev/null 2>&1 - RC=$? - [ $RC -eq 0 ] && failure "$base shutdown" || success "$base shutdown" + if ${PS} -p "$pid">/dev/null 2>&1; then + # TERM first, then KILL if not dead + kill -TERM $pid 2>/dev/null + sleep 1 + if ${PS} -p "$pid" >/dev/null 2>&1 ; then + sleep 1 + if ${PS} -p "$pid" >/dev/null 2>&1 ; then + sleep 3 + if ${PS} -p "$pid" >/dev/null 2>&1 ; then + kill -KILL $pid 2>/dev/null + fi + fi + fi + fi + ${PS} -p "$pid" >/dev/null 2>&1 + RC=$? + [ $RC -eq 0 ] && failure "$base shutdown" || success "$base shutdown" # RC=$((! $RC)) # use specified level only else - if ${PS} -p "$pid" >/dev/null 2>&1; then - kill $killlevel $pid 2>/dev/null - RC=$? - [ $RC -eq 0 ] && success "$base $killlevel" || failure "$base $killlevel" - fi + if ${PS} -p "$pid" >/dev/null 2>&1; then + kill $killlevel $pid 2>/dev/null + RC=$? + [ $RC -eq 0 ] && success "$base $killlevel" || failure "$base $killlevel" + fi fi else failure "$base shutdown" @@ -113,8 +131,8 @@ pidofproc() { if [ -f ${PIDDIR}/$base.$2.pid ] ; then pid=`head -n 1 ${PIDDIR}/$base.$2.pid` if [ "$pid" != "" ] ; then - echo $pid - return 0 + echo $pid + return 0 fi fi @@ -153,12 +171,12 @@ status() { return 0 else pid=`${PSCMD} | ${AWK} 'BEGIN { prog=ARGV[1]; ARGC=1 } - { if ((prog == $2) || (("(" prog ")") == $2) || - (("[" prog "]") == $2) || - ((prog ":") == $2)) { print $1 ; exit 0 } }' $1` + { if ((prog == $2) || (("(" prog ")") == $2) || + (("[" prog "]") == $2) || + ((prog ":") == $2)) { print $1 ; exit 0 } }' $1` if [ "$pid" != "" ] ; then - echo "$base (pid $pid) is running..." - return 0 + echo "$base (pid $pid) is running..." + return 0 fi fi @@ -166,8 +184,8 @@ status() { if [ -f ${PIDDIR}/$base.$2.pid ] ; then pid=`head -n 1 ${PIDDIR}/$base.$2.pid` if [ "$pid" != "" ] ; then - echo "$base dead but pid file exists" - return 1 + echo "$base dead but pid file exists" + return 1 fi fi # See if the subsys lock exists @@ -198,29 +216,29 @@ fi case "$1" in start) [ -x ${BACSDBIN}/bacula-sd ] && { - echo "Starting the $Bacula Storage daemon" - OPTIONS='' - if [ "${SD_USER}" != '' ]; then - OPTIONS="${OPTIONS} -u ${SD_USER}" - fi - - if [ "${SD_GROUP}" != '' ]; then - OPTIONS="${OPTIONS} -g ${SD_GROUP}" - fi - - if [ "x${VALGRIND_SD}" = "x1" ]; then - valgrind --leak-check=full ${BACSDBIN}/bacula-sd $2 $3 ${OPTIONS} -v -c ${BACSDCFG}/bacula-sd.conf - else - ${BACSDBIN}/bacula-sd $2 $3 ${OPTIONS} -v -c ${BACSDCFG}/bacula-sd.conf - fi + echo "Starting the $Bacula Storage daemon" + OPTIONS='' + if [ "${SD_USER}" != '' ]; then + OPTIONS="${OPTIONS} -u ${SD_USER}" + fi + + if [ "${SD_GROUP}" != '' ]; then + OPTIONS="${OPTIONS} -g ${SD_GROUP}" + fi + + if [ "x${VALGRIND_SD}" = "x1" ]; then + valgrind --leak-check=full ${BACSDBIN}/bacula-sd $2 $3 ${OPTIONS} -v -c ${BACSDCFG}/bacula-sd.conf + else + ${BACSDBIN}/bacula-sd $2 $3 ${OPTIONS} -v -c ${BACSDCFG}/bacula-sd.conf + fi } ;; stop) [ -x ${BACSDBIN}/bacula-sd ] && { - echo "Stopping the $Bacula Storage daemon" - killproc ${BACSDBIN}/bacula-sd ${SD_PORT} + echo "Stopping the $Bacula Storage daemon" + killproc ${BACSDBIN}/bacula-sd ${SD_PORT} $2 } ;; diff --git a/bacula/scripts/bacula-tray-monitor.desktop.in b/bacula/scripts/bacula-tray-monitor.desktop.in new file mode 100644 index 0000000000..395f302990 --- /dev/null +++ b/bacula/scripts/bacula-tray-monitor.desktop.in @@ -0,0 +1,10 @@ +[Desktop Entry] +Name=Bacula Monitor +Comment=Notification Tray Monitor +Icon=/usr/share/pixmaps/bacula-tray-monitor.xpm +Exec=@sbindir@/bacula-tray-monitor -c @sysconfdir@/tray-monitor.conf +Terminal=false +Type=Application +Encoding=UTF-8 +X-Desktop-File-Install-Version=0.3 +Categories=System;Application;Utility;X-Red-Hat-Base; diff --git a/bacula/scripts/bacula.in b/bacula/scripts/bacula.in index 02114b6318..34adcfc8ec 100755 --- a/bacula/scripts/bacula.in +++ b/bacula/scripts/bacula.in @@ -1,7 +1,25 @@ #! /bin/sh # +# Bacula(R) - The Network Backup Solution +# +# Copyright (C) 2000-2015 Kern Sibbald +# Copyright (C) 2000-2014 Free Software Foundation Europe e.V. +# +# The original author of Bacula is Kern Sibbald, with contributions +# from many others, a complete list can be found in the file AUTHORS. +# +# You may use this file and others of this release according to the +# license defined in the LICENSE file, which includes the Affero General +# Public License, v3.0 ("AGPLv3") and some additional permissions and +# terms pursuant to its AGPLv3 Section 7. +# +# This notice must be preserved when any source code is +# conveyed and/or propagated. +# +# Bacula(R) is a registered trademark of Kern Sibbald. +# # bacula This shell script takes care of starting and stopping -# the bacula daemons. +# the bacula daemons. # # This is pretty much watered down version of the RedHat script # that works on Solaris as well as Linux, but it won't work everywhere. diff --git a/bacula/scripts/bconsole.in b/bacula/scripts/bconsole.in index 25ed4e9053..f711fcf577 100755 --- a/bacula/scripts/bconsole.in +++ b/bacula/scripts/bconsole.in @@ -1,4 +1,23 @@ #!/bin/sh +# +# Bacula(R) - The Network Backup Solution +# +# Copyright (C) 2000-2015 Kern Sibbald +# Copyright (C) 2000-2014 Free Software Foundation Europe e.V. +# +# The original author of Bacula is Kern Sibbald, with contributions +# from many others, a complete list can be found in the file AUTHORS. +# +# You may use this file and others of this release according to the +# license defined in the LICENSE file, which includes the Affero General +# Public License, v3.0 ("AGPLv3") and some additional permissions and +# terms pursuant to its AGPLv3 Section 7. +# +# This notice must be preserved when any source code is +# conveyed and/or propagated. +# +# Bacula(R) is a registered trademark of Kern Sibbald. +# which dirname >/dev/null # does dirname exit? if [ $? = 0 ] ; then diff --git a/bacula/scripts/breload b/bacula/scripts/breload deleted file mode 100755 index 2b1e652649..0000000000 --- a/bacula/scripts/breload +++ /dev/null @@ -1,43 +0,0 @@ -#! /bin/sh -# -# breload This shell script takes care of reloading the director after -# a backup of the configuration and a bacula-dir -t test -# -# - -BACDIRBIN=/sbin -BACDIRCFG=/etc/bacula -BACWORKDIR=/var/bacula/working -BACBKPDIR=$BACWORKDIR/bkp -Bacula="Bacula" -DIR_USER= -RET=0 - -if [ -x ${BACDIRBIN}/bacula-dir -a -r ${BACDIRCFG}/bacula-dir.conf ]; then - echo "Testing the $Bacula Director daemon configuration" - - if [ $(whoami) != "$DIR_USER" ]; then - USER_OPT="-u $DIR_USER" - fi - - ${BACDIRBIN}/bacula-dir -t $USER_OPT -c ${BACDIRCFG}/bacula-dir.conf - - RET=$? - if [ $RET = 0 ]; then - if [ ! -d $BACBKPDIR ]; then - echo "Creating Backup configuration directory" - mkdir -p $BACBKPDIR - chmod 700 $BACBKPDIR - chown $DIR_USER $BACBKPDIR - fi - if [ -d $BACBKPDIR ]; then - echo "Backup configuration" - tar cfz $BACBKPDIR/bacula-dir-conf.$(date +%s).tgz $BACDIRCFG/*conf - fi - echo reload | ${BACDIRBIN}/bconsole >/dev/null - echo "Reloading configuration" - else - echo "Can't reload configuration, please correct errors first" - fi -fi -exit $RET diff --git a/bacula/scripts/breload.in b/bacula/scripts/breload.in new file mode 100644 index 0000000000..958acad082 --- /dev/null +++ b/bacula/scripts/breload.in @@ -0,0 +1,63 @@ +#! /bin/sh +# +# Bacula(R) - The Network Backup Solution +# +# Copyright (C) 2000-2015 Kern Sibbald +# +# The original author of Bacula is Kern Sibbald, with contributions +# from many others, a complete list can be found in the file AUTHORS. +# +# You may use this file and others of this release according to the +# license defined in the LICENSE file, which includes the Affero General +# Public License, v3.0 ("AGPLv3") and some additional permissions and +# terms pursuant to its AGPLv3 Section 7. +# +# This notice must be preserved when any source code is +# conveyed and/or propagated. +# +# Bacula(R) is a registered trademark of Kern Sibbald. +# +# breload This shell script takes care of reloading the director after +# a backup of the configuration and a bacula-dir -t test +# +# + +BACDIRBIN=@sbindir@ +BACDIRCFG=@sysconfdir@ +BACWORKDIR=@working_dir@ +BACBKPDIR=$BACWORKDIR/bkp +Bacula="@BACULA@" +DIR_USER=@dir_user@ +RET=0 + +if [ -x ${BACDIRBIN}/bacula-dir -a -r ${BACDIRCFG}/bacula-dir.conf ]; then + echo "Testing the $Bacula Director daemon configuration" + + if [ $(whoami) != "$DIR_USER" ]; then + USER_OPT="-u $DIR_USER" + fi + + ${BACDIRBIN}/bacula-dir -t $USER_OPT -c ${BACDIRCFG}/bacula-dir.conf + + RET=$? + if [ $RET = 0 ]; then + if [ ! -d $BACBKPDIR ]; then + echo "Creating Backup configuration directory" + mkdir -p $BACBKPDIR + chmod 700 $BACBKPDIR + chown $DIR_USER $BACBKPDIR + fi + if [ -d $BACDIRCFG/conf.d ]; then + CONFD=$BACDIRCFG/conf.d + fi + if [ -d $BACBKPDIR ]; then + echo "Backup configuration" + tar cfz $BACBKPDIR/bacula-dir-conf.$(date +%s).tgz $BACDIRCFG/*conf $CONFD + fi + echo reload | ${BACDIRBIN}/bconsole >/dev/null + echo "Reloading configuration" + else + echo "Can't reload configuration, please correct errors first" + fi +fi +exit $RET diff --git a/bacula/scripts/btraceback.dbx b/bacula/scripts/btraceback.dbx index e3ff981be0..30c0d551d2 100644 --- a/bacula/scripts/btraceback.dbx +++ b/bacula/scripts/btraceback.dbx @@ -1,4 +1,8 @@ # btraceback.dbx +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# dbxenv language_mode c++ @@ -6,13 +10,12 @@ echo "fail_time ==> \c"; print -l (char *)fail_time echo "exename ==> \c"; print -l (char *)exename echo "exepath ==> \c"; print -l (char *)exepath echo "assert_msg ==> \c"; print -l (char *)assert_msg -echo "catalog_db ==> \c"; print -l (char *)catalog_db +echo "db_engine_name ==> \c"; print -l (char *)db_engine_name echo "version ==> \c"; print -l (char *)version echo "host_os ==> \c"; print -l (char *)host_os echo "distname ==> \c"; print -l (char *)distname echo "distver ==> \c"; print -l (char *)distver echo "dist_name ==> \c"; print -l (char *)dist_name -echo "beef ==> \c"; print -l (int)beef echo "******** RUNNING THREADS/LWPS:" echo diff --git a/bacula/scripts/btraceback.gdb b/bacula/scripts/btraceback.gdb index 10f1571d7b..aaed915f30 100644 --- a/bacula/scripts/btraceback.gdb +++ b/bacula/scripts/btraceback.gdb @@ -3,14 +3,13 @@ print my_name print exename print exepath print assert_msg -print catalog_db +print db_engine_name print version print host_os print distname print distver print host_name print dist_name -print beef show env TestName bt thread apply all bt diff --git a/bacula/scripts/btraceback.in b/bacula/scripts/btraceback.in index 97e189ae65..1b21954755 100755 --- a/bacula/scripts/btraceback.in +++ b/bacula/scripts/btraceback.in @@ -1,10 +1,24 @@ #!/bin/sh # -# Script to do a stackdump of a Bacula daemon/program. +# Bacula(R) - The Network Backup Solution +# +# Copyright (C) 2000-2015 Kern Sibbald +# Copyright (C) 2000-2014 Free Software Foundation Europe e.V. +# +# The original author of Bacula is Kern Sibbald, with contributions +# from many others, a complete list can be found in the file AUTHORS. # +# You may use this file and others of this release according to the +# license defined in the LICENSE file, which includes the Affero General +# Public License, v3.0 ("AGPLv3") and some additional permissions and +# terms pursuant to its AGPLv3 Section 7. # -# Copyright (C) 2000-2015, Kern Sibbald -# License: BSD 2-Clause +# This notice must be preserved when any source code is +# conveyed and/or propagated. +# +# Bacula(R) is a registered trademark of Kern Sibbald. +# +# Script to do a stackdump of a Bacula daemon/program. # # We attempt to attach to running program # diff --git a/bacula/scripts/btraceback.mdb b/bacula/scripts/btraceback.mdb index 1e3f9aa4ca..c598f7ee62 100644 --- a/bacula/scripts/btraceback.mdb +++ b/bacula/scripts/btraceback.mdb @@ -1,4 +1,8 @@ # btraceback.mdb +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# $G ::echo "******** RUNNING LWPS/THREADS:" diff --git a/bacula/scripts/defaultconfig b/bacula/scripts/defaultconfig index c2339102db..92d0e186ce 100755 --- a/bacula/scripts/defaultconfig +++ b/bacula/scripts/defaultconfig @@ -1,5 +1,8 @@ #!/bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # This is a default configuration file for Bacula that # sets reasonable defaults, and assumes that you do not # have MySQL running. It will "install" Bacula into diff --git a/bacula/scripts/devel_bacula.in b/bacula/scripts/devel_bacula.in index 4357394a46..da0f675a83 100755 --- a/bacula/scripts/devel_bacula.in +++ b/bacula/scripts/devel_bacula.in @@ -1,5 +1,8 @@ #! /bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # bacula This shell script takes care of starting and stopping # the bacula daemons. # diff --git a/bacula/scripts/disk-changer.in b/bacula/scripts/disk-changer.in index 2b3f0fdca7..9627badfad 100644 --- a/bacula/scripts/disk-changer.in +++ b/bacula/scripts/disk-changer.in @@ -2,14 +2,25 @@ # # Bacula interface to virtual autoloader using disk storage # -# Written by Kern Sibbald +# Written by Kern Sibbald # -# Copyright (C) 2000-2015, Kern Sibbald -# License: BSD 2-Clause +# Bacula(R) - The Network Backup Solution # -# Bacula® is a registered trademark of Kern Sibbald. +# Copyright (C) 2000-2015 Kern Sibbald +# Copyright (C) 2000-2014 Free Software Foundation Europe e.V. # +# The original author of Bacula is Kern Sibbald, with contributions +# from many others, a complete list can be found in the file AUTHORS. # +# You may use this file and others of this release according to the +# license defined in the LICENSE file, which includes the Affero General +# Public License, v3.0 ("AGPLv3") and some additional permissions and +# terms pursuant to its AGPLv3 Section 7. +# +# This notice must be preserved when any source code is +# conveyed and/or propagated. +# +# Bacula(R) is a registered trademark of Kern Sibbald. # If you set in your Device resource # # Changer Command = "path-to-this-script/disk-changer %c %o %S %a %d" @@ -20,28 +31,28 @@ # included. # # disk-changer "changer-device" "command" "slot" "archive-device" "drive-index" "volume" -# $1 $2 $3 $4 $5 $6 +# $1 $2 $3 $4 $5 $6 # # By default the autochanger has 10 Volumes and 1 Drive. # # Note: For this script to work, you *must" specify -# Device Type = File +# Device Type = File # in each of the Devices associated with your AutoChanger resource. # # changer-device is the name of a file that overrides the default # volumes and drives. It may have: -# maxslot=n where n is one based (default 10) -# maxdrive=m where m is zero based (default 1 -- i.e. 2 drives) -# +# maxslot=n where n is one based (default 10) +# maxdrive=m where m is zero based (default 1 -- i.e. 2 drives) +# # This code can also simulate barcodes. You simply put # a list of the slots and barcodes in the "base" directory/barcodes. -# See below for the base directory definition. Example of a +# See below for the base directory definition. Example of a # barcodes file: # /var/bacula/barcodes # 1:Vol001 # 2:Vol002 # ... -# +# # archive-device is the name of the base directory where you want the # Volumes stored appended with /drive0 for the first drive; /drive1 # for the second drive, ... For example, you might use @@ -55,7 +66,7 @@ # The Volumes will be created with names slot1, slot2, slot3, ... maxslot in the # base directory. In the above example the base directory is /var/bacula. # However, as with tapes, their Bacula Volume names will be stored inside the -# Volume label. In addition to the Volumes (e.g. /var/bacula/slot1, +# Volume label. In addition to the Volumes (e.g. /var/bacula/slot1, # /var/bacula/slot3, ...) this script will create a /var/bacula/loadedn # file to keep track of what Slot is loaded. You should not change this file. # @@ -75,7 +86,7 @@ wd=@working_dir@ dbgfile="$wd/disk-changer.log" debug() { if test -f $dbgfile; then - echo "`date +\"%Y%m%d-%H:%M:%S\"` $*" >> $dbgfile + echo "`date +\"%Y%m%d-%H:%M:%S\"` $*" >> $dbgfile fi } @@ -88,8 +99,8 @@ make_temp_file() { if test x${TMPFILE} = x; then TMPFILE="$wd/disk-changer.$$" if test -f ${TMPFILE}; then - echo "Temp file security problem on: ${TMPFILE}" - exit 1 + echo "Temp file security problem on: ${TMPFILE}" + exit 1 fi fi } @@ -100,14 +111,14 @@ check_parm_count() { pCount=$1 pCountNeed=$2 if test $pCount -lt $pCountNeed; then - echo "usage: disk-changer ctl-device command [slot archive-device drive-index]" - echo " Insufficient number of arguments arguments given." - if test $pCount -lt 2; then - echo " Mimimum usage is first two arguments ..." - else - echo " Command expected $pCountNeed arguments" - fi - exit 1 + echo "usage: disk-changer ctl-device command [slot archive-device drive-index]" + echo " Insufficient number of arguments arguments given." + if test $pCount -lt 2; then + echo " Mimimum usage is first two arguments ..." + else + echo " Command expected $pCountNeed arguments" + fi + exit 1 fi } @@ -120,7 +131,7 @@ get_dir() { dir=`echo "$device" | sed -e s%/$bn%%g` if [ ! -d $dir ]; then echo "ERROR: Autochanger directory \"$dir\" does not exist." - echo " You must create it." + echo " You must create it." exit 1 fi } @@ -157,65 +168,67 @@ maxdrive=1 maxslot=10 # Pull in conf file -if [ -f $ctl ]; then +if [ -f $ctl ]; then . $ctl fi -# Check for special cases where only 2 arguments are needed, +# Check for special cases where only 2 arguments are needed, # all others are a minimum of 5 # case $2 in list|listall) - check_parm_count $# 2 - ;; + check_parm_count $# 2 + ;; slots) - check_parm_count $# 2 - ;; + check_parm_count $# 2 + ;; transfer) - check_parm_count $# 4 - if [ $slot -gt $maxslot ]; then - echo "Slot ($slot) out of range (1-$maxslot)" - debug "Error: Slot ($slot) out of range (1-$maxslot)" - exit 1 - fi - ;; + check_parm_count $# 4 + if [ $slot -gt $maxslot ]; then + echo "Slot ($slot) out of range (1-$maxslot)" + debug "Error: Slot ($slot) out of range (1-$maxslot)" + exit 1 + fi + ;; *) - check_parm_count $# 5 - if [ $drive -gt $maxdrive ]; then - echo "Drive ($drive) out of range (0-$maxdrive)" - debug "Error: Drive ($drive) out of range (0-$maxdrive)" - exit 1 - fi - if [ $slot -gt $maxslot ]; then - echo "Slot ($slot) out of range (1-$maxslot)" - debug "Error: Slot ($slot) out of range (1-$maxslot)" - exit 1 - fi - ;; + check_parm_count $# 5 + if [ $drive -gt $maxdrive ]; then + echo "Drive ($drive) out of range (0-$maxdrive)" + debug "Error: Drive ($drive) out of range (0-$maxdrive)" + exit 1 + fi + if [ $slot -gt $maxslot ]; then + echo "Slot ($slot) out of range (1-$maxslot)" + debug "Error: Slot ($slot) out of range (1-$maxslot)" + exit 1 + fi + ;; esac debug "Parms: $ctl $cmd $slot $device $drive $volume $havevol" -case $cmd in +case $cmd in unload) debug "Doing disk -f $ctl unload $slot $device $drive $volume" get_dir if [ -f $dir/loaded${drive} ]; then - ld=`cat $dir/loaded${drive}` - else - echo "Storage Element $slot is Already Full" - debug "Unload error: $dir/loaded${drive} is already unloaded" - exit 1 + ld=`cat $dir/loaded${drive}` + else + echo "Storage Element $slot is Already Full" + debug "Unload error: $dir/loaded${drive} is already unloaded" + exit 1 fi if [ $slot -eq $ld ]; then - echo "0" >$dir/loaded${drive} - unlink $device 2>/dev/null >/dev/null + echo "0" >$dir/loaded${drive} + unlink $device 2>/dev/null >/dev/null + unlink ${device}.add 2>/dev/null >/dev/null + rm -f ${device} ${device}.add else - echo "Storage Element $slot is Already Full" - debug "Unload error: $dir/loaded${drive} slot=$ld is already unloaded" - exit 1 + echo "Storage Element $slot is Already Full" + debug "Unload error: $dir/loaded${drive} slot=$ld is already unloaded" + exit 1 fi ;; @@ -225,113 +238,117 @@ case $cmd in i=0 # Check if slot already in a drive while [ $i -le $maxdrive ]; do - if [ -f $dir/loaded${i} ]; then - ld=`cat $dir/loaded${i}` - else - ld=0 - fi - if [ $ld -eq $slot ]; then - echo "Drive ${i} Full (Storage element ${ld} loaded)" - debug "Load error: Cannot load Slot=${ld} in drive=$drive. Already in drive=${i}" - exit 1 - fi - i=`expr $i + 1` + if [ -f $dir/loaded${i} ]; then + ld=`cat $dir/loaded${i}` + else + ld=0 + fi + if [ $ld -eq $slot ]; then + echo "Drive ${i} Full (Storage element ${ld} loaded)" + debug "Load error: Cannot load Slot=${ld} in drive=$drive. Already in drive=${i}" + exit 1 + fi + i=`expr $i + 1` done # Check if we have a Volume name get_vol if [ $havevol -eq 0 ]; then - # check if slot exists - if [ ! -f $dir/slot${slot} ] ; then - echo "source Element Address $slot is Empty" - debug "Load error: source Element Address $slot is Empty" - exit 1 - fi + # check if slot exists + if [ ! -f $dir/slot${slot} ] ; then + echo "source Element Address $slot is Empty" + debug "Load error: source Element Address $slot is Empty" + exit 1 + fi fi if [ -f $dir/loaded${drive} ]; then - ld=`cat $dir/loaded${drive}` + ld=`cat $dir/loaded${drive}` else - ld=0 + ld=0 fi if [ $ld -ne 0 ]; then - echo "Drive ${drive} Full (Storage element ${ld} loaded)" - echo "Load error: Drive ${drive} Full (Storage element ${ld} loaded)" - exit 1 + echo "Drive ${drive} Full (Storage element ${ld} loaded)" + echo "Load error: Drive ${drive} Full (Storage element ${ld} loaded)" + exit 1 fi echo "0" >$dir/loaded${drive} unlink $device 2>/dev/null >/dev/null + unlink ${device}.add 2>/dev/null >/dev/null + rm -f ${device} ${device}.add if [ $havevol -ne 0 ]; then - ln -s $dir/$volume $device - rtn=$? + ln -s $dir/$volume $device + ln -s $dir/${volume}.add ${device}.add + rtn=$? else - ln -s $dir/slot${slot} $device - rtn=$? + ln -s $dir/slot${slot} $device + ln -s $dir/slot${slot}.add ${device}.add + rtn=$? fi if [ $rtn -eq 0 ]; then - echo $slot >$dir/loaded${drive} + echo $slot >$dir/loaded${drive} fi exit $rtn ;; - list) + list) debug "Doing disk -f $ctl -- to list volumes" - get_dir + get_dir if [ -f $dir/barcodes ]; then - cat $dir/barcodes + cat $dir/barcodes else - i=1 - while [ $i -le $maxslot ]; do - slot=$i - volume= - get_vol - if [ $havevol -eq 0 ]; then - echo "$i:" - else - echo "$i:$volume" - fi - i=`expr $i + 1` - done + i=1 + while [ $i -le $maxslot ]; do + slot=$i + volume= + get_vol + if [ $havevol -eq 0 ]; then + echo "$i:" + else + echo "$i:$volume" + fi + i=`expr $i + 1` + done fi exit 0 ;; - listall) + listall) # ***FIXME*** must add new Volume stuff make_temp_file debug "Doing disk -f $ctl -- to list volumes" - get_dir + get_dir if [ ! -f $dir/barcodes ]; then - exit 0 + exit 0 fi # we print drive content seen by autochanger # and we also remove loaded media from the barcode list i=0 while [ $i -le $maxdrive ]; do - if [ -f $dir/loaded${i} ]; then - ld=`cat $dir/loaded${i}` - v=`awk -F: "/^$ld:/"' { print $2 }' $dir/barcodes` - echo "D:$i:F:$ld:$v" - echo "^$ld:" >> $TMPFILE - fi - i=`expr $i + 1` + if [ -f $dir/loaded${i} ]; then + ld=`cat $dir/loaded${i}` + v=`awk -F: "/^$ld:/"' { print $2 }' $dir/barcodes` + echo "D:$i:F:$ld:$v" + echo "^$ld:" >> $TMPFILE + fi + i=`expr $i + 1` done # Empty slots are not in barcodes file # When we detect a gap, we print missing rows as empty # At the end, we fill the gap between the last entry and maxslot grep -v -f $TMPFILE $dir/barcodes | sort -n | \ - perl -ne 'BEGIN { $cur=1 } + perl -ne 'BEGIN { $cur=1 } if (/(\d+):(.+)?/) { - if ($cur == $1) { - print "S:$1:F:$2\n" - } else { - while ($cur < $1) { - print "S:$cur:E\n"; - $cur++; - } - } - $cur++; - } + if ($cur == $1) { + print "S:$1:F:$2\n" + } else { + while ($cur < $1) { + print "S:$cur:E\n"; + $cur++; + } + } + $cur++; + } END { while ($cur < '"$maxslot"') { print "S:$cur:E\n"; $cur++; } } ' rm -f $TMPFILE @@ -343,20 +360,21 @@ case $cmd in make_temp_file slotdest=$device if [ -f $dir/slot{$slotdest} ]; then - echo "destination Element Address $slot is Full" - exit 1 + echo "destination Element Address $slot is Full" + exit 1 fi if [ ! -f $dir/slot${slot} ] ; then - echo "source Element Address $slot is Empty" - exit 1 + echo "source Element Address $slot is Empty" + exit 1 fi echo "Transfering $slot to $slotdest" mv $dir/slot${slot} $dir/slot{$slotdest} + mv $dir/slot${slot}.add $dir/slot{$slotdest}.add if [ -f $dir/barcodes ]; then - sed "s/^$slot:/$slotdest:/" > $TMPFILE - sort -n $TMPFILE > $dir/barcodes + sed "s/^$slot:/$slotdest:/" > $TMPFILE + sort -n $TMPFILE > $dir/barcodes fi exit 0 ;; @@ -364,9 +382,9 @@ case $cmd in debug "Doing disk -f $ctl $drive -- to find what is loaded" get_dir if [ -f $dir/loaded${drive} ]; then - a=`cat $dir/loaded${drive}` + a=`cat $dir/loaded${drive}` else - a="0" + a="0" fi debug "Loaded: drive=$drive is $a" echo $a diff --git a/bacula/scripts/dvd-handler.in b/bacula/scripts/dvd-handler.in index efe0a33221..e8492ae2bf 100644 --- a/bacula/scripts/dvd-handler.in +++ b/bacula/scripts/dvd-handler.in @@ -1,7 +1,22 @@ #!@PYTHON@ # -# Copyright (C) 2000-2015, Kern Sibbald -# License: BSD 2-Clause +# Bacula(R) - The Network Backup Solution +# +# Copyright (C) 2000-2015 Kern Sibbald +# Copyright (C) 2000-2014 Free Software Foundation Europe e.V. +# +# The original author of Bacula is Kern Sibbald, with contributions +# from many others, a complete list can be found in the file AUTHORS. +# +# You may use this file and others of this release according to the +# license defined in the LICENSE file, which includes the Affero General +# Public License, v3.0 ("AGPLv3") and some additional permissions and +# terms pursuant to its AGPLv3 Section 7. +# +# This notice must be preserved when any source code is +# conveyed and/or propagated. +# +# Bacula(R) is a registered trademark of Kern Sibbald. # # Check the free space available on a writable DVD # Should always exit with 0 status, otherwise it indicates a serious error. @@ -12,30 +27,33 @@ # operations used by Bacula: # # free (no arguments) -# Scan the device and report the available space. It returns: -# Prints on the first output line the free space available in bytes. -# If an error occurs, prints a negative number (-errno), followed, -# on the second line, by an error message. +# Scan the device and report the available space. It returns: +# Prints on the first output line the free space available in bytes. +# If an error occurs, prints a negative number (-errno), followed, +# on the second line, by an error message. # # write op filename -# Write a part file to disk. -# This operation needs two additional arguments. -# The first (op) indicates to -# 0 -- append -# 1 -- first write to a blank disk -# 2 -- blank or truncate a disk +# Write a part file to disk. +# This operation needs two additional arguments. +# The first (op) indicates to +# 0 -- append +# 1 -- first write to a blank disk +# 2 -- blank or truncate a disk # -# The second is the filename to write +# The second is the filename to write # # operations available but not used by Bacula: # # test Scan the device and report the information found. -# This operation needs no further arguments. +# This operation needs no further arguments. # prepare Prepare a DVD+/-RW for being used by Bacula. -# Note: This is only useful if you already have some -# non-Bacula data on a medium, and you want to use -# it with Bacula. Don't run this on blank media, it -# is useless. +# Note: This is only useful if you already have some +# non-Bacula data on a medium, and you want to use +# it with Bacula. Don't run this on blank media, it +# is useless. +# +# +# $Id$ # import popen2 @@ -72,23 +90,23 @@ class disk: # dvd-writepart doesn't not always need to know the free space). # # The following methods are implemented: -# __init__ we need that... -# __repr__ this seems to be a good idea to have. -# Quite minimalistic implementation, though. -# __str__ For casts to string. Return the current disk information -# is_empty Returns TRUE if the disk is empty, blank... this needs more -# work, especially concerning non-RW media and blank vs. no -# filesystem considerations. Here, we should also look for -# other filesystems - probably we don't want to silently -# overwrite UDF or ext2 or anything not mentioned in fstab... -# (NB: I don't think it is a problem) -# free Returns the available free space. -# write Writes one part file to disk, either starting a new file -# system on disk, or appending to it. -# This method should also prepare a blank disk so that a -# certain part of the disk is used to allow detection of a -# used disk by all / more disk drives. -# prepare Blank the device +# __init__ we need that... +# __repr__ this seems to be a good idea to have. +# Quite minimalistic implementation, though. +# __str__ For casts to string. Return the current disk information +# is_empty Returns TRUE if the disk is empty, blank... this needs more +# work, especially concerning non-RW media and blank vs. no +# filesystem considerations. Here, we should also look for +# other filesystems - probably we don't want to silently +# overwrite UDF or ext2 or anything not mentioned in fstab... +# (NB: I don't think it is a problem) +# free Returns the available free space. +# write Writes one part file to disk, either starting a new file +# system on disk, or appending to it. +# This method should also prepare a blank disk so that a +# certain part of the disk is used to allow detection of a +# used disk by all / more disk drives. +# prepare Blank the device # ############################################################################### def __init__(self, devicename): @@ -107,10 +125,10 @@ class disk: self.growcmd += " -quiet" if self.is4gbsupported(): - self.growcmd += " -use-the-force-luke=4gms" + self.growcmd += " -use-the-force-luke=4gms" self.growparams = " -A 'Bacula Data' -input-charset=default -iso-level 3 -pad " + \ - "-p 'dvd-handler / growisofs' -sysid 'BACULADATA' -R" + "-p 'dvd-handler / growisofs' -sysid 'BACULADATA' -R" return @@ -119,9 +137,9 @@ class disk: def __str__(self): if not self.freespace_collected: - self.collect_freespace(); + self.collect_freespace(); if not self.mediumtype_collected: - self.collect_mediumtype(); + self.collect_mediumtype(); self.me = "Class disk, initialized with device '" + self.device + "'\n" self.me += "type = '" + self.disktype + "' mode='" + self.diskmode + "' status = '" + self.diskstatus + "'\n" @@ -135,47 +153,47 @@ class disk: processi = popen2.Popen4("uname -s -r") status = processi.wait() if not os.WIFEXITED(status): - return 1 + return 1 if os.WEXITSTATUS(status) != 0: - return 1 + return 1 strres = processi.fromchild.readline()[0:-1] version = re.search(r"Linux (\d+)\.(\d+)\.(\d+)", strres) if not version: # Non-Linux: allow - return 1 + return 1 if (int(version.group(1)) > 2) or (int(version.group(2)) > 6) or ((int(version.group(1)) == 2) and (int(version.group(2)) == 6) and (int(version.group(3)) >= 8)): - return 1 + return 1 else: - return 0 + return 0 def collect_freespace(self): # Collects current free space self.cmd = self.growcmd + " -F " + self.device processi = popen2.Popen4(self.cmd) status = processi.wait() if not os.WIFEXITED(status): - raise DVDError(0, "growisofs process did not exit correctly.") + raise DVDError(0, "growisofs process did not exit correctly.") result = processi.fromchild.read() if os.WEXITSTATUS(status) != 0: - if (os.WEXITSTATUS(status) & 0x7F) == errno.ENOSPC: - # Kludge to force dvd-handler to return a free space of 0 - self.next_session = 1 - self.capacity = 1 - self.freespace_collected = 1 - return - else: - raise DVDError(os.WEXITSTATUS(status), "growisofs returned with an error " + result + ". Please check your are using a patched version of dvd+rw-tools.") + if (os.WEXITSTATUS(status) & 0x7F) == errno.ENOSPC: + # Kludge to force dvd-handler to return a free space of 0 + self.next_session = 1 + self.capacity = 1 + self.freespace_collected = 1 + return + else: + raise DVDError(os.WEXITSTATUS(status), "growisofs returned with an error " + result + ". Please check your are using a patched version of dvd+rw-tools.") next_sess = re.search(r"\snext_session=(\d+)\s", result, re.MULTILINE) capa = re.search(r"\scapacity=(\d+)\s", result, re.MULTILINE) if next_sess and capa: - self.next_session = long(next_sess.group(1)) - self.capacity = long(capa.group(1)) - - # testing cheat (emulate 4GB boundary at 100MB) - #if self.next_session > 100000000: - # self.capacity = self.next_session + self.next_session = long(next_sess.group(1)) + self.capacity = long(capa.group(1)) + + # testing cheat (emulate 4GB boundary at 100MB) + #if self.next_session > 100000000: + # self.capacity = self.next_session else: - raise DVDError(0, "Cannot get next_session and capacity from growisofs.\nReturned: " + result) + raise DVDError(0, "Cannot get next_session and capacity from growisofs.\nReturned: " + result) self.freespace_collected = 1 return @@ -186,10 +204,10 @@ class disk: processi = popen2.Popen4(cmd) status = processi.wait() if not os.WIFEXITED(status): - raise DVDError(0, self.dvdrwmediainfo + " process did not exit correctly.") + raise DVDError(0, self.dvdrwmediainfo + " process did not exit correctly.") if os.WEXITSTATUS(status) != 0: - raise DVDError(0, "Cannot get media info from " + self.dvdrwmediainfo) - return + raise DVDError(0, "Cannot get media info from " + self.dvdrwmediainfo) + return result = processi.fromchild.read() hardware = re.search(r"INQUIRY:\s+(.*)\n", result, re.MULTILINE) @@ -198,23 +216,23 @@ class disk: status = re.search(r"\sDisc status:\s+(.*)\n", result, re.MULTILINE) if hardware: - self.hardwaredevice = hardware.group(1) + self.hardwaredevice = hardware.group(1) if mediatype: - self.disktype = mediatype.group(2) + self.disktype = mediatype.group(2) else: - raise DVDError(0, "Media type not found in " + self.dvdrwmediainfo + " output") + raise DVDError(0, "Media type not found in " + self.dvdrwmediainfo + " output") if self.disktype == "DVD-RW": - if mediamode: - self.diskmode = mediamode.group(1) - else: - raise DVDError(0, "Media mode not found for DVD-RW in " + self.dvdrwmediainfo + " output") + if mediamode: + self.diskmode = mediamode.group(1) + else: + raise DVDError(0, "Media mode not found for DVD-RW in " + self.dvdrwmediainfo + " output") if status: - self.diskstatus = status.group(1) + self.diskstatus = status.group(1) else: - raise DVDError(0, "Disc status not found in " + self.dvdrwmediainfo + " output") + raise DVDError(0, "Disc status not found in " + self.dvdrwmediainfo + " output") self.mediumtype_collected = 1 @@ -222,76 +240,76 @@ class disk: def is_empty(self): if not self.freespace_collected: - self.collect_freespace(); + self.collect_freespace(); return 0 == self.next_session def is_RW(self): if not self.mediumtype_collected: - self.collect_mediumtype(); + self.collect_mediumtype(); return "DVD-RW" == self.disktype or "DVD+RW" == self.disktype or "DVD-RAM" == self.disktype def is_plus_RW(self): if not self.mediumtype_collected: - self.collect_mediumtype(); + self.collect_mediumtype(); return "DVD+RW" == self.disktype def is_minus_RW(self): if not self.mediumtype_collected: - self.collect_mediumtype(); + self.collect_mediumtype(); return "DVD-RW" == self.disktype def is_restricted_overwrite(self): if not self.mediumtype_collected: - self.collect_mediumtype(); + self.collect_mediumtype(); return self.diskmode == "Restricted Overwrite" def is_blank(self): if not self.mediumtype_collected: - self.collect_mediumtype(); + self.collect_mediumtype(); return self.diskstatus == "blank" def free(self): if not self.freespace_collected: - self.collect_freespace(); + self.collect_freespace(); fr = self.capacity-self.next_session-self.margin if fr < 0: - return 0 + return 0 else: - return fr + return fr def term_handler(self, signum, frame): print 'dvd-handler: Signal term_handler called with signal', signum if self.pid != 0: - print "dvd-handler: Sending SIGTERM to pid", self.pid - os.kill(self.pid, signal.SIGTERM) - time.sleep(10) - print "dvd-handler: Sending SIGKILL to pid", self.pid - os.kill(self.pid, signal.SIGKILL) - sys.exit(1) + print "dvd-handler: Sending SIGTERM to pid", self.pid + os.kill(self.pid, signal.SIGTERM) + time.sleep(10) + print "dvd-handler: Sending SIGKILL to pid", self.pid + os.kill(self.pid, signal.SIGKILL) + sys.exit(1) def write(self, newvol, partfile): # Blank DVD+RW when there is no data on it if newvol and self.is_plus_RW() and self.is_blank(): - print "DVD+RW looks brand-new, blank it to fix some DVD-writers bugs." - self.blank() - print "Done, now writing the part file." + print "DVD+RW looks brand-new, blank it to fix some DVD-writers bugs." + self.blank() + print "Done, now writing the part file." if newvol and self.is_minus_RW() and (not self.is_restricted_overwrite()): - print "DVD-RW is in " + self.diskmode + " mode, reformating it to Restricted Overwrite" - self.reformat_minus_RW() - print "Done, now writing the part file." + print "DVD-RW is in " + self.diskmode + " mode, reformating it to Restricted Overwrite" + self.reformat_minus_RW() + print "Done, now writing the part file." cmd = self.growcmd + self.growparams if newvol: - # Ignore any existing iso9660 filesystem - used for truncate - if newvol == 2: - cmd += " -use-the-force-luke=tty" - cmd += " -Z " + # Ignore any existing iso9660 filesystem - used for truncate + if newvol == 2: + cmd += " -use-the-force-luke=tty" + cmd += " -Z " else: - cmd += " -M " + cmd += " -M " cmd += self.device + " " + str(partfile) print "Running " + cmd oldsig = signal.signal(signal.SIGTERM, self.term_handler) @@ -299,40 +317,40 @@ class disk: self.pid = proc.pid status = proc.poll() while status == -1: - line = proc.fromchild.readline() - while len(line) > 0: - print line, - line = proc.fromchild.readline() - time.sleep(1) - status = proc.poll() + line = proc.fromchild.readline() + while len(line) > 0: + print line, + line = proc.fromchild.readline() + time.sleep(1) + status = proc.poll() self.pid = 0 print signal.signal(signal.SIGTERM, oldsig) if not os.WIFEXITED(status): - raise DVDError(0, cmd + " process did not exit correctly, signal/status " + str(status)) + raise DVDError(0, cmd + " process did not exit correctly, signal/status " + str(status)) if os.WEXITSTATUS(status) != 0: - raise DVDError(os.WEXITSTATUS(status), cmd + " exited with status " + str(os.WEXITSTATUS(status)) + ", signal/status " + str(status)) + raise DVDError(os.WEXITSTATUS(status), cmd + " exited with status " + str(os.WEXITSTATUS(status)) + ", signal/status " + str(status)) def prepare(self): if not self.is_RW(): - raise DVDError(0, "I won't prepare a non-rewritable medium") + raise DVDError(0, "I won't prepare a non-rewritable medium") # Blank DVD+RW when there is no data on it if self.is_plus_RW() and self.is_blank(): - print "DVD+RW looks brand-new, blank it to fix some DVD-writers bugs." - self.blank() - return # It has been completely blanked: Medium is ready to be used by Bacula + print "DVD+RW looks brand-new, blank it to fix some DVD-writers bugs." + self.blank() + return # It has been completely blanked: Medium is ready to be used by Bacula if self.is_minus_RW() and (not self.is_restricted_overwrite()): - print "DVD-RW is in " + self.diskmode + " mode, reformating it to Restricted Overwrite" - self.reformat_minus_RW() - return # Reformated: Medium is ready to be used by Bacula + print "DVD-RW is in " + self.diskmode + " mode, reformating it to Restricted Overwrite" + self.reformat_minus_RW() + return # Reformated: Medium is ready to be used by Bacula # TODO: Check if /dev/fd/0 and /dev/zero exists, otherwise, run self.blank() if not os.path.exists("/dev/fd/0") or not os.path.exists("/dev/zero"): - print "/dev/fd/0 or /dev/zero doesn't exist, blank the medium completely." - self.blank() - return + print "/dev/fd/0 or /dev/zero doesn't exist, blank the medium completely." + self.blank() + return cmd = self.dd + " if=/dev/zero bs=1024 count=512 | " + self.growcmd + " -Z " + self.device + "=/dev/fd/0" print "Running " + cmd @@ -341,17 +359,17 @@ class disk: self.pid = proc.pid status = proc.poll() while status == -1: - line = proc.fromchild.readline() - while len(line) > 0: - print line, - line = proc.fromchild.readline() - time.sleep(1) - status = proc.poll() + line = proc.fromchild.readline() + while len(line) > 0: + print line, + line = proc.fromchild.readline() + time.sleep(1) + status = proc.poll() self.pid = 0 print signal.signal(signal.SIGTERM, oldsig) if os.WEXITSTATUS(status) != 0: - raise DVDError(os.WEXITSTATUS(status), cmd + " exited with status " + str(os.WEXITSTATUS(status)) + ", signal/status " + str(status)) + raise DVDError(os.WEXITSTATUS(status), cmd + " exited with status " + str(os.WEXITSTATUS(status)) + ", signal/status " + str(status)) def blank(self): cmd = self.growcmd + " -Z " + self.device + "=/dev/zero" @@ -361,17 +379,17 @@ class disk: self.pid = proc.pid status = proc.poll() while status == -1: - line = proc.fromchild.readline() - while len(line) > 0: - print line, - line = proc.fromchild.readline() - time.sleep(1) - status = proc.poll() + line = proc.fromchild.readline() + while len(line) > 0: + print line, + line = proc.fromchild.readline() + time.sleep(1) + status = proc.poll() self.pid = 0 print signal.signal(signal.SIGTERM, oldsig) if os.WEXITSTATUS(status) != 0: - raise DVDError(os.WEXITSTATUS(status), cmd + " exited with status " + str(os.WEXITSTATUS(status)) + ", signal/status " + str(status)) + raise DVDError(os.WEXITSTATUS(status), cmd + " exited with status " + str(os.WEXITSTATUS(status)) + ", signal/status " + str(status)) def reformat_minus_RW(self): cmd = self.dvdrwformat + " -force " + self.device @@ -381,17 +399,17 @@ class disk: self.pid = proc.pid status = proc.poll() while status == -1: - line = proc.fromchild.readline() - while len(line) > 0: - print line, - line = proc.fromchild.readline() - time.sleep(1) - status = proc.poll() + line = proc.fromchild.readline() + while len(line) > 0: + print line, + line = proc.fromchild.readline() + time.sleep(1) + status = proc.poll() self.pid = 0 print signal.signal(signal.SIGTERM, oldsig) if os.WEXITSTATUS(status) != 0: - raise DVDError(os.WEXITSTATUS(status), cmd + " exited with status " + str(os.WEXITSTATUS(status)) + ", signal/status " + str(status)) + raise DVDError(os.WEXITSTATUS(status), cmd + " exited with status " + str(os.WEXITSTATUS(status)) + ", signal/status " + str(status)) # class disk ends here. @@ -400,7 +418,7 @@ class DVDError(Exception): self.errno = errno self.value = value if self.value[-1] == '\n': - self.value = self.value[0:-1] + self.value = self.value[0:-1] def __str__(self): return str(self.value) + " || errno = " + str(self.errno) + " (" + os.strerror(self.errno & 0x7F) + ")" @@ -417,19 +435,19 @@ dvd-handler DEVICE prepare where DEVICE is a device name like /dev/sr0 or /dev/dvd. Operations: -test Scan the device and report the information found. - This operation needs no further arguments. -free Scan the device and report the available space. -write Write a part file to disk. - This operation needs two additional arguments. - The first indicates to append (0), restart the - disk (1) or restart existing disk (2). The second - is the file to write. +test Scan the device and report the information found. + This operation needs no further arguments. +free Scan the device and report the available space. +write Write a part file to disk. + This operation needs two additional arguments. + The first indicates to append (0), restart the + disk (1) or restart existing disk (2). The second + is the file to write. prepare Prepare a DVD+/-RW for being used by Bacula. - Note: This is only useful if you already have some - non-Bacula data on a medium, and you want to use - it with Bacula. Don't run this on blank media, it - is useless. + Note: This is only useful if you already have some + non-Bacula data on a medium, and you want to use + it with Bacula. Don't run this on blank media, it + is useless. """ sys.exit(1) @@ -441,31 +459,31 @@ dvd = disk(sys.argv[1]) if "free" == sys.argv[2]: if len(sys.argv) == 3: try: - free = dvd.free() + free = dvd.free() except DVDError, e: - if e.errno != 0: - print -e.errno - else: - print errno.EPIPE - print str(e) + if e.errno != 0: + print -e.errno + else: + print errno.EPIPE + print str(e) else: - print free - print "No Error reported." + print free + print "No Error reported." else: print "Wrong number of arguments for free operation. Wanted 3 got", len(sys.argv) usage() elif "prepare" == sys.argv[2]: if len(sys.argv) == 3: try: - dvd.prepare() + dvd.prepare() except DVDError, e: - print "Error while preparing medium: ", str(e) - if e.errno != 0: - sys.exit(e.errno & 0x7F) - else: - sys.exit(errno.EPIPE) + print "Error while preparing medium: ", str(e) + if e.errno != 0: + sys.exit(e.errno & 0x7F) + else: + sys.exit(errno.EPIPE) else: - print "Medium prepared successfully." + print "Medium prepared successfully." else: print "Wrong number of arguments for prepare operation. Wanted 3 got", len(sys.argv) usage() @@ -479,15 +497,15 @@ elif "test" == sys.argv[2]: elif "write" == sys.argv[2]: if len(sys.argv) == 5: try: - dvd.write(long(sys.argv[3]), sys.argv[4]) + dvd.write(long(sys.argv[3]), sys.argv[4]) except DVDError, e: - print "Error while writing part file: ", str(e) - if e.errno != 0: - sys.exit(e.errno & 0x7F) - else: - sys.exit(errno.EPIPE) + print "Error while writing part file: ", str(e) + if e.errno != 0: + sys.exit(e.errno & 0x7F) + else: + sys.exit(errno.EPIPE) else: - print "Part file " + sys.argv[4] + " successfully written to disk." + print "Part file " + sys.argv[4] + " successfully written to disk." else: print "Wrong number of arguments for write operation. Wanted 5 got", len(sys.argv) usage() diff --git a/bacula/scripts/dvd-simulator.in b/bacula/scripts/dvd-simulator.in index a023ee5d58..a3033f0255 100644 --- a/bacula/scripts/dvd-simulator.in +++ b/bacula/scripts/dvd-simulator.in @@ -1,7 +1,22 @@ #!@PYTHON@ # -# Copyright (C) 2000-2015, Kern Sibbald -# License: BSD 2-Clause +# Bacula(R) - The Network Backup Solution +# +# Copyright (C) 2000-2015 Kern Sibbald +# Copyright (C) 2000-2014 Free Software Foundation Europe e.V. +# +# The original author of Bacula is Kern Sibbald, with contributions +# from many others, a complete list can be found in the file AUTHORS. +# +# You may use this file and others of this release according to the +# license defined in the LICENSE file, which includes the Affero General +# Public License, v3.0 ("AGPLv3") and some additional permissions and +# terms pursuant to its AGPLv3 Section 7. +# +# This notice must be preserved when any source code is +# conveyed and/or propagated. +# +# Bacula(R) is a registered trademark of Kern Sibbald. # # Modified version of dvd-handler used to simulate reading/writing # to a DVD but using disk storage. This is a pretty crude implementation @@ -13,27 +28,27 @@ # operations used by Bacula: # # free (no arguments) -# Scan the device and report the available space. +# Scan the device and report the available space. # # write op filename -# Write a part file to disk. -# This operation needs two additional arguments. -# The first (op) indicates to -# 0 -- append -# 1 -- first write to a blank disk -# 2 -- blank or truncate a disk +# Write a part file to disk. +# This operation needs two additional arguments. +# The first (op) indicates to +# 0 -- append +# 1 -- first write to a blank disk +# 2 -- blank or truncate a disk # -# The second is the filename to write +# The second is the filename to write # # operations available but not used by Bacula: # # test Scan the device and report the information found. -# This operation needs no further arguments. +# This operation needs no further arguments. # prepare Prepare a DVD+/-RW for being used by Bacula. -# Note: This is only useful if you already have some -# non-Bacula data on a medium, and you want to use -# it with Bacula. Don't run this on blank media, it -# is useless. +# Note: This is only useful if you already have some +# non-Bacula data on a medium, and you want to use +# it with Bacula. Don't run this on blank media, it +# is useless. # # # in case of operation ``free'' returns: @@ -77,23 +92,23 @@ class disk: # dvd-writepart doesn't not always need to know the free space). # # The following methods are implemented: -# __init__ we need that... -# __repr__ this seems to be a good idea to have. -# Quite minimalistic implementation, though. -# __str__ For casts to string. Return the current disk information -# is_empty Returns TRUE if the disk is empty, blank... this needs more -# work, especially concerning non-RW media and blank vs. no -# filesystem considerations. Here, we should also look for -# other filesystems - probably we don't want to silently -# overwrite UDF or ext2 or anything not mentioned in fstab... -# (NB: I don't think it is a problem) -# free Returns the available free space. -# write Writes one part file to disk, either starting a new file -# system on disk, or appending to it. -# This method should also prepare a blank disk so that a -# certain part of the disk is used to allow detection of a -# used disk by all / more disk drives. -# blank Blank the device +# __init__ we need that... +# __repr__ this seems to be a good idea to have. +# Quite minimalistic implementation, though. +# __str__ For casts to string. Return the current disk information +# is_empty Returns TRUE if the disk is empty, blank... this needs more +# work, especially concerning non-RW media and blank vs. no +# filesystem considerations. Here, we should also look for +# other filesystems - probably we don't want to silently +# overwrite UDF or ext2 or anything not mentioned in fstab... +# (NB: I don't think it is a problem) +# free Returns the available free space. +# write Writes one part file to disk, either starting a new file +# system on disk, or appending to it. +# This method should also prepare a blank disk so that a +# certain part of the disk is used to allow detection of a +# used disk by all / more disk drives. +# blank Blank the device # ############################################################################### def __init__(self, devicename): @@ -113,10 +128,10 @@ class disk: self.growcmd += " -quiet" if self.is4gbsupported(): - self.growcmd += " -use-the-force-luke=4gms" + self.growcmd += " -use-the-force-luke=4gms" self.growparams = " -A 'Bacula Data' -input-charset=default -iso-level 3 -pad " + \ - "-p 'dvd-handler / growisofs' -sysid 'BACULADATA' -R" + "-p 'dvd-handler / growisofs' -sysid 'BACULADATA' -R" return @@ -125,9 +140,9 @@ class disk: def __str__(self): if not self.freespace_collected: - self.collect_freespace(); + self.collect_freespace(); if not self.mediumtype_collected: - self.collect_mediumtype(); + self.collect_mediumtype(); self.me = "Class disk, initialized with device '" + self.device + "'\n" self.me += "type = '" + self.disktype + "' mode='" + self.diskmode + "' status = '" + self.diskstatus + "'\n" @@ -141,18 +156,18 @@ class disk: processi = popen2.Popen4("uname -s -r") status = processi.wait() if not os.WIFEXITED(status): - return 1 + return 1 if os.WEXITSTATUS(status) != 0: - return 1 + return 1 strres = processi.fromchild.readline()[0:-1] version = re.search(r"Linux (\d+)\.(\d+)\.(\d+)", strres) if not version: # Non-Linux: allow - return 1 + return 1 if (int(version.group(1)) > 2) or (int(version.group(2)) > 6) or ((int(version.group(1)) == 2) and (int(version.group(2)) == 6) and (int(version.group(3)) >= 8)): - return 1 + return 1 else: - return 0 + return 0 def collect_freespace(self): # Collects current free space self.next_session = 0 @@ -160,19 +175,19 @@ class disk: self.freespace_collected = 1 cmd = "du -sb " + self.device - processi = popen2.Popen4(cmd) + processi = popen2.Popen4(cmd) status = processi.wait() if not os.WIFEXITED(status): - return 1; + return 1; if os.WEXITSTATUS(status) != 0: - return 1; + return 1; result = processi.fromchild.read() used = re.search(r"(\d+)\s", result, re.MULTILINE) self.capacity = self.maxcapacity - long(used.group(1)) if self.capacity < 0: - self.capacity = 0 + self.capacity = 0 return 0 @@ -182,10 +197,10 @@ class disk: processi = popen2.Popen4(cmd) status = processi.wait() if not os.WIFEXITED(status): - raise DVDError(0, self.dvdrwmediainfo + " process did not exit correctly.") + raise DVDError(0, self.dvdrwmediainfo + " process did not exit correctly.") if os.WEXITSTATUS(status) != 0: - raise DVDError(0, "Cannot get media info from " + self.dvdrwmediainfo) - return + raise DVDError(0, "Cannot get media info from " + self.dvdrwmediainfo) + return result = processi.fromchild.read() hardware = re.search(r"INQUIRY:\s+(.*)\n", result, re.MULTILINE) @@ -194,23 +209,23 @@ class disk: status = re.search(r"\sDisc status:\s+(.*)\n", result, re.MULTILINE) if hardware: - self.hardwaredevice = hardware.group(1) + self.hardwaredevice = hardware.group(1) if mediatype: - self.disktype = mediatype.group(2) + self.disktype = mediatype.group(2) else: - raise DVDError(0, "Media type not found in " + self.dvdrwmediainfo + " output") + raise DVDError(0, "Media type not found in " + self.dvdrwmediainfo + " output") if self.disktype == "DVD-RW": - if mediamode: - self.diskmode = mediamode.group(1) - else: - raise DVDError(0, "Media mode not found for DVD-RW in " + self.dvdrwmediainfo + " output") + if mediamode: + self.diskmode = mediamode.group(1) + else: + raise DVDError(0, "Media mode not found for DVD-RW in " + self.dvdrwmediainfo + " output") if status: - self.diskstatus = status.group(1) + self.diskstatus = status.group(1) else: - raise DVDError(0, "Disc status not found in " + self.dvdrwmediainfo + " output") + raise DVDError(0, "Disc status not found in " + self.dvdrwmediainfo + " output") self.mediumtype_collected = 1 @@ -218,84 +233,84 @@ class disk: def is_empty(self): if not self.freespace_collected: - self.collect_freespace(); + self.collect_freespace(); return 0 == self.next_session def is_RW(self): if not self.mediumtype_collected: - self.collect_mediumtype(); + self.collect_mediumtype(); return "DVD-RW" == self.disktype or "DVD+RW" == self.disktype or "DVD-RAM" == self.disktype def is_plus_RW(self): if not self.mediumtype_collected: - self.collect_mediumtype(); + self.collect_mediumtype(); return "DVD+RW" == self.disktype def is_minus_RW(self): if not self.mediumtype_collected: - self.collect_mediumtype(); + self.collect_mediumtype(); return "DVD-RW" == self.disktype def is_restricted_overwrite(self): if not self.mediumtype_collected: - self.collect_mediumtype(); + self.collect_mediumtype(); return self.diskmode == "Restricted Overwrite" def is_blank(self): if not self.mediumtype_collected: - self.collect_mediumtype(); + self.collect_mediumtype(); return self.diskstatus == "blank" def free(self): if not self.freespace_collected: - self.collect_freespace(); + self.collect_freespace(); fr = self.capacity-self.next_session-self.margin if fr < 0: - return 0 + return 0 else: - return fr + return fr def term_handler(self, signum, frame): print 'dvd-handler: Signal term_handler called with signal', signum if self.pid != 0: - print "dvd-handler: Sending SIGTERM to pid", self.pid - os.kill(self.pid, signal.SIGTERM) - time.sleep(10) - print "dvd-handler: Sending SIGKILL to pid", self.pid - os.kill(self.pid, signal.SIGKILL) - sys.exit(1) + print "dvd-handler: Sending SIGTERM to pid", self.pid + os.kill(self.pid, signal.SIGTERM) + time.sleep(10) + print "dvd-handler: Sending SIGKILL to pid", self.pid + os.kill(self.pid, signal.SIGKILL) + sys.exit(1) def write(self, newvol, partfile): if newvol: - print "Newvol", newvol - print "Zap everything ..." - os.system("rm -f "+self.device+"/*") + print "Newvol", newvol + print "Zap everything ..." + os.system("rm -f "+self.device+"/*") print "cp", partfile, self.device shutil.copy(partfile,self.device) def prepare(self): if not self.is_RW(): - raise DVDError(0, "I won't prepare a non-rewritable medium") + raise DVDError(0, "I won't prepare a non-rewritable medium") # Blank DVD+RW when there is no data on it if self.is_plus_RW() and self.is_blank(): - print "DVD+RW looks brand-new, blank it to fix some DVD-writers bugs." - self.blank() - return # It has been completely blanked: Medium is ready to be used by Bacula + print "DVD+RW looks brand-new, blank it to fix some DVD-writers bugs." + self.blank() + return # It has been completely blanked: Medium is ready to be used by Bacula if self.is_minus_RW() and (not self.is_restricted_overwrite()): - print "DVD-RW is in " + self.diskmode + " mode, reformating it to Restricted Overwrite" - self.reformat_minus_RW() - return # Reformated: Medium is ready to be used by Bacula + print "DVD-RW is in " + self.diskmode + " mode, reformating it to Restricted Overwrite" + self.reformat_minus_RW() + return # Reformated: Medium is ready to be used by Bacula # TODO: Check if /dev/fd/0 and /dev/zero exists, otherwise, run self.blank() if not os.path.exists("/dev/fd/0") or not os.path.exists("/dev/zero"): - print "/dev/fd/0 or /dev/zero doesn't exist, blank the medium completely." - self.blank() - return + print "/dev/fd/0 or /dev/zero doesn't exist, blank the medium completely." + self.blank() + return cmd = self.dd + " if=/dev/zero bs=1024 count=512 | " + self.growcmd + " -Z " + self.device + "=/dev/fd/0" print "Running " + cmd @@ -304,17 +319,17 @@ class disk: self.pid = proc.pid status = proc.poll() while status == -1: - line = proc.fromchild.readline() - while len(line) > 0: - print line, - line = proc.fromchild.readline() - time.sleep(1) - status = proc.poll() + line = proc.fromchild.readline() + while len(line) > 0: + print line, + line = proc.fromchild.readline() + time.sleep(1) + status = proc.poll() self.pid = 0 print signal.signal(signal.SIGTERM, oldsig) if os.WEXITSTATUS(status) != 0: - raise DVDError(os.WEXITSTATUS(status), cmd + " exited with status " + str(os.WEXITSTATUS(status)) + ", signal/status " + str(status)) + raise DVDError(os.WEXITSTATUS(status), cmd + " exited with status " + str(os.WEXITSTATUS(status)) + ", signal/status " + str(status)) def blank(self): cmd = self.growcmd + " -Z " + self.device + "=/dev/zero" @@ -324,17 +339,17 @@ class disk: self.pid = proc.pid status = proc.poll() while status == -1: - line = proc.fromchild.readline() - while len(line) > 0: - print line, - line = proc.fromchild.readline() - time.sleep(1) - status = proc.poll() + line = proc.fromchild.readline() + while len(line) > 0: + print line, + line = proc.fromchild.readline() + time.sleep(1) + status = proc.poll() self.pid = 0 print signal.signal(signal.SIGTERM, oldsig) if os.WEXITSTATUS(status) != 0: - raise DVDError(os.WEXITSTATUS(status), cmd + " exited with status " + str(os.WEXITSTATUS(status)) + ", signal/status " + str(status)) + raise DVDError(os.WEXITSTATUS(status), cmd + " exited with status " + str(os.WEXITSTATUS(status)) + ", signal/status " + str(status)) def reformat_minus_RW(self): cmd = self.dvdrwformat + " -force " + self.device @@ -344,17 +359,17 @@ class disk: self.pid = proc.pid status = proc.poll() while status == -1: - line = proc.fromchild.readline() - while len(line) > 0: - print line, - line = proc.fromchild.readline() - time.sleep(1) - status = proc.poll() + line = proc.fromchild.readline() + while len(line) > 0: + print line, + line = proc.fromchild.readline() + time.sleep(1) + status = proc.poll() self.pid = 0 print signal.signal(signal.SIGTERM, oldsig) if os.WEXITSTATUS(status) != 0: - raise DVDError(os.WEXITSTATUS(status), cmd + " exited with status " + str(os.WEXITSTATUS(status)) + ", signal/status " + str(status)) + raise DVDError(os.WEXITSTATUS(status), cmd + " exited with status " + str(os.WEXITSTATUS(status)) + ", signal/status " + str(status)) # class disk ends here. @@ -363,7 +378,7 @@ class DVDError(Exception): self.errno = errno self.value = value if self.value[-1] == '\n': - self.value = self.value[0:-1] + self.value = self.value[0:-1] def __str__(self): return str(self.value) + " || errno = " + str(self.errno) + " (" + os.strerror(self.errno & 0x7F) + ")" @@ -380,19 +395,19 @@ dvd-handler DEVICE blank where DEVICE is a device name like /dev/sr0 or /dev/dvd. Operations: -test Scan the device and report the information found. - This operation needs no further arguments. -free Scan the device and report the available space. -write Write a part file to disk. - This operation needs two additional arguments. - The first indicates to append (0), restart the - disk (1) or restart existing disk (2). The second - is the file to write. +test Scan the device and report the information found. + This operation needs no further arguments. +free Scan the device and report the available space. +write Write a part file to disk. + This operation needs two additional arguments. + The first indicates to append (0), restart the + disk (1) or restart existing disk (2). The second + is the file to write. prepare Prepare a DVD+/-RW for being used by Bacula. - Note: This is only useful if you already have some - non-Bacula data on a medium, and you want to use - it with Bacula. Don't run this on blank media, it - is useless. + Note: This is only useful if you already have some + non-Bacula data on a medium, and you want to use + it with Bacula. Don't run this on blank media, it + is useless. """ sys.exit(1) @@ -404,16 +419,16 @@ dvd = disk(sys.argv[1]) if "free" == sys.argv[2]: if len(sys.argv) == 3: try: - free = dvd.free() + free = dvd.free() except DVDError, e: - if e.errno != 0: - print -e.errno - else: - print errno.EPIPE - print str(e) + if e.errno != 0: + print -e.errno + else: + print errno.EPIPE + print str(e) else: - print free - print "No Error reported." + print free + print "No Error reported." else: print "Wrong number of arguments for free operation. Wanted 3 got", len(sys.argv) print sys.argv[1], sys.argv[2], sys.argv[3] @@ -421,15 +436,15 @@ if "free" == sys.argv[2]: elif "prepare" == sys.argv[2]: if len(sys.argv) == 3: try: - dvd.prepare() + dvd.prepare() except DVDError, e: - print "Error while preparing medium: ", str(e) - if e.errno != 0: - sys.exit(e.errno & 0x7F) - else: - sys.exit(errno.EPIPE) + print "Error while preparing medium: ", str(e) + if e.errno != 0: + sys.exit(e.errno & 0x7F) + else: + sys.exit(errno.EPIPE) else: - print "Medium prepared successfully." + print "Medium prepared successfully." else: print "Wrong number of arguments for prepare operation." usage() @@ -443,15 +458,15 @@ elif "test" == sys.argv[2]: elif "write" == sys.argv[2]: if len(sys.argv) == 5: try: - dvd.write(long(sys.argv[3]), sys.argv[4]) + dvd.write(long(sys.argv[3]), sys.argv[4]) except DVDError, e: - print "Error while writing part file: ", str(e) - if e.errno != 0: - sys.exit(e.errno & 0x7F) - else: - sys.exit(errno.EPIPE) + print "Error while writing part file: ", str(e) + if e.errno != 0: + sys.exit(e.errno & 0x7F) + else: + sys.exit(errno.EPIPE) else: - print "Part file " + sys.argv[4] + " successfully written to disk." + print "Part file " + sys.argv[4] + " successfully written to disk." else: print "Wrong number of arguments for write operation." usage() diff --git a/bacula/scripts/freespace b/bacula/scripts/freespace new file mode 100755 index 0000000000..5a283912a7 --- /dev/null +++ b/bacula/scripts/freespace @@ -0,0 +1,34 @@ +#!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# +# Bacula interface to get device freespace +# +# If you set in your Device resource +# +# Free Space Command = "path-to-this-script/freespace %a" +# you will have the following input to this script: +# +# +# freespace "archive-device" +# $1 +# + +OS=`uname` +case ${OS} in + SunOS) + cmd="/bin/df -P" + ;; + FreeBSD) + cmd="/bin/df -P" + ;; + Linux) + cmd="/bin/df -P" + ;; + *) + cmd="/bin/df -P" + ;; +esac + +$cmd $1 | tail -1 | awk '{ print $4 }' diff --git a/bacula/scripts/logrotate.in b/bacula/scripts/logrotate.in index 1539e7b048..a06db840e4 100644 --- a/bacula/scripts/logrotate.in +++ b/bacula/scripts/logrotate.in @@ -1,6 +1,6 @@ # -# Copyright (C) 2000-2015, Kern Sibbald -# License: BSD 2-Clause +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # # If you are appending to a log file (default), to diff --git a/bacula/scripts/logwatch/Makefile.in b/bacula/scripts/logwatch/Makefile.in index f1f5be2862..1ecb7dd4b3 100644 --- a/bacula/scripts/logwatch/Makefile.in +++ b/bacula/scripts/logwatch/Makefile.in @@ -1,5 +1,10 @@ # Makefile to install logwatch script +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # 08 Jan 2005 D. Scott Barninger +# SYSCONFDIR=/etc/log.d INSTALL=@INSTALL@ diff --git a/bacula/scripts/logwatch/bacula b/bacula/scripts/logwatch/bacula index bc7046438e..67eb321a4e 100755 --- a/bacula/scripts/logwatch/bacula +++ b/bacula/scripts/logwatch/bacula @@ -5,8 +5,8 @@ # Mon Jan 03 2005 # D. Scott Barninger and Karl Cunningham # -# Copyright Kern Sibbald 2005-2015 -# License: BSD 2-Clause +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS use strict; use POSIX qw(strftime); diff --git a/bacula/scripts/manual_prune.pl b/bacula/scripts/manual_prune.pl new file mode 100755 index 0000000000..69d7f1dbee --- /dev/null +++ b/bacula/scripts/manual_prune.pl @@ -0,0 +1,251 @@ +#!/usr/bin/perl -w +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# +use strict; + +=head1 DESCRIPTION + + manual_prune.pl -- prune volumes + +=head2 USAGE + + manual_prune.pl [--bconsole=/path/to/bconsole] [--help] [--doprune] [--expired] [--fixerror] [--fileprune] + + This program when run will manually prune all Volumes that it finds + in your Bacula catalog. It will respect all the Retention periods. + + manual_prune must have access to bconsole. It will execute bconsole + from /opt/bacula/bin. If bconsole is in a different location, + you must specify the path to it with the --bconsole=... option. + + If you do not add --doprune, you will see what the script proposes + to do, but it will not prune. + + If you add --fixerror, it will change the status of any Volume + that is marked Error to Used so that it will be pruned. + + If you add --expired, it will attempt to prune only those + Volumes where the Volume Retention period has expired. + + If you use --fileprune, the script will prune files and pathvisibility + useful to avoid blocking Bacula during pruning. + + Adding --debug will print additional debug information. + + +=head1 LICENSE + + Copyright (C) 2008-2014 Bacula Systems SA + + Bacula(R) is a registered trademark of Kern Sibbald. + The licensor of Bacula Enterprise is Bacula Systems SA, + Rue Galilee 5, 1400 Yverdon-les-Bains, Switzerland. + + This file has been made available for your personal use in the + hopes that it will allow community users to make better use of + Bacula. + +=head1 VERSION + + 1.4 + +=cut + +use Getopt::Long qw/:config no_ignore_case/; +use Pod::Usage; +use File::Temp; + +my $help; +my $do_prune; +my $expired; +my $debug; +# set to your bconsole prog +my $bconsole = "/opt/bacula/bin/bconsole"; +my $do_fix; +my $do_file_prune; + +GetOptions('help' => \$help, + 'bconsole=s' => \$bconsole, + 'expired' => \$expired, + 'debug' => \$debug, + 'fixerror' => \$do_fix, + 'fileprune' => \$do_file_prune, + 'doprune' => \$do_prune) + || Pod::Usage::pod2usage(-exitval => 2, -verbose => 2) ; + +if ($help) { + Pod::Usage::pod2usage(-exitval => 2, -verbose => 2) ; +} + +if (! -x $bconsole) { + die "Can't exec $bconsole, please specify --bconsole option $!"; +} + +my @vol; +my @vol_purged; + +# This fix can work with File based device. Don't use it for Tape media +if ($do_fix) { + my ($fh, $file) = File::Temp::tempfile(); + print $fh "sql +SELECT VolumeName AS \"?vol?\" FROM Media WHERE VolStatus = 'Error'; + +"; + close($fh); + open(FP, "cat $file | $bconsole|") or die "Can't open $bconsole (ERR=$!), adjust your \$PATH"; + while (my $l = ) + { + if ($l =~ /^\s*\|\s*([\w\d:\. \-]+?)\s*\|/) { + if ($debug) { + print $l; + } + push @vol, $1; + } + } + close(FP); + unlink($file); + + if (scalar(@vol) > 0) { + print "Will try to fix volume in Error: ", join(",", @vol), "\n"; + open(FP, "|$bconsole") or die "Can't send commands to $bconsole"; + print FP map { "update volume=$_ volstatus=Used\n" } @vol; + close(FP); + @vol = (); + } +} + +if ($do_file_prune) { + my ($fh, $file) = File::Temp::tempfile(); + if ($do_prune) { + print $fh "sql +BEGIN; +CREATE TEMPORARY TABLE temp AS +SELECT DISTINCT JobId FROM Job JOIN JobMedia USING (JobId) JOIN +(SELECT Media.MediaId AS MediaId +FROM Media +WHERE VolStatus IN ('Full', 'Used') + AND ( (Media.LastWritten) + + interval '1 second' * (Media.VolRetention) + ) < NOW()) AS M USING (MediaId) + WHERE Job.JobFiles > 50000 AND Job.PurgedFiles=0; +SELECT JobId FROM temp; +DELETE FROM File WHERE JobId IN (SELECT JobId FROM temp); +DELETE FROM PathVisibility WHERE JobId IN (SELECT JobId FROM temp); +UPDATE Job SET PurgedFiles=1 WHERE JobId IN (SELECT JobId FROM temp); +DROP TABLE temp; +COMMIT; + +quit +"; + } else { + print $fh "sql +SELECT DISTINCT JobId FROM Job JOIN JobMedia USING (JobId) JOIN +(SELECT Media.MediaId AS MediaId +FROM Media +WHERE VolStatus IN ('Full', 'Used') + AND ( (Media.LastWritten) + + interval '1 second' * (Media.VolRetention) + ) < NOW()) AS M USING (MediaId) + WHERE Job.JobFiles > 50000 AND Job.PurgedFiles=0; + +quit +"; + } + close($fh); + open(FP, "cat $file | $bconsole|") or die "Can't open $bconsole (ERR=$!), adjust your \$PATH"; + while (my $l = ) + { + if ($debug || !$do_prune) { + print $l; + } + } + close(FP); + unlink($file); + exit 0; +} + +# TODO: Fix it for SQLite +# works only for postgresql and MySQL at the moment +# One of the two query will fail, but it's not a problem +if ($expired) { + my ($fh, $file) = File::Temp::tempfile(); + print $fh "sql +SELECT Media.VolumeName AS volumename, + Media.LastWritten AS lastwritten, + ( + (Media.LastWritten) + + interval '1 second' * (Media.VolRetention) + ) AS expire +FROM Media +WHERE VolStatus IN ('Full', 'Used') + AND ( (Media.LastWritten) + + interval '1 second' * (Media.VolRetention) + ) < NOW(); +SELECT Media.VolumeName AS volumename, + Media.LastWritten AS lastwritten, + ( + Media.LastWritten + Media.VolRetention + ) AS expire +FROM Media +WHERE VolStatus IN ('Full', 'Used') + AND ( Media.LastWritten + Media.VolRetention + ) < NOW(); + +quit +"; + close($fh); + open(FP, "cat $file | $bconsole|") or die "Can't open $bconsole (ERR=$!), adjust your \$PATH"; + while (my $l = ) + { + # | TestVolume001 | 2011-06-17 14:36:59 | 2011-06-17 14:37:00 + if ($l =~ /^\s*\|\s*([\w\d:\. \-]+?)\s*\|\s*\d/) { + if ($debug) { + print $l; + } + push @vol, $1; + } + } + close(FP); + unlink($file); + +} else { + + open(FP, "echo list volumes | $bconsole|") or die "Can't open $bconsole (ERR=$!), adjust your \$PATH"; + while (my $l = ) + { + # | 1 | TestVolume001 | Used + if ($l =~ /^\s*\|\s*\d+\s*\|\s*([\w\d-]+)\s*\|\s*Used/) { + push @vol, $1; + } + if ($l =~ /^\s*\|\s*\d+\s*\|\s*([\w\d-]+)\s*\|\s*Full/) { + push @vol, $1; + } + if ($l =~ /^\s*\|\s*\d+\s*\|\s*([\w\d-]+)\s*\|\s*Purged/) { + push @vol_purged, $1; + } + } + close(FP); + + if ($? != 0) { + system("echo list volumes | $bconsole"); + die "bconsole returns a non zero status, please check that you can execute it"; + + } +} + +if (!scalar(@vol)) { + print "No Volume(s) found to prune.\n"; + +} else { + if ($do_prune) { + print "Attempting to to prune ", join(",", @vol), "\n"; + open(FP, "|$bconsole") or die "Can't send commands to $bconsole"; + print FP map { "prune volume=$_ yes\n" } @vol; + close(FP); + } else { + print "Would have attempted to prune ", join(",", @vol), "\n"; + print "You can actually prune by specifying the --doprune option.\n" + } +} diff --git a/bacula/scripts/mtx-changer.conf b/bacula/scripts/mtx-changer.conf index cf54324113..981efb9e3e 100644 --- a/bacula/scripts/mtx-changer.conf +++ b/bacula/scripts/mtx-changer.conf @@ -1,6 +1,6 @@ # -# Copyright (C) 2000-2015, Kern Sibbald -# License: BSD 2-Clause +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # # This file is sourced by the mtx-changer script every time it runs. @@ -9,6 +9,11 @@ # preserve your mtx-changer configuration. # +# We update the version when an incompatible change +# to mtx-changer or this conf file is made, such as +# adding a new required variable. +version=2 + # Set to 1 if you want to do offline before unload offline=0 @@ -25,10 +30,34 @@ inventory=0 # Storage Element line, so try setting the following to 1 vxa_packetloader=0 +# +# Debug logging +# + +# If you have multiple SD's, set this differently for each one +# so you know which message comes from which one. This can +# be any string, and will appear in each debug message just +# after the time stamp. +chgr_id=0 + # Set to 1 if you want debug info written to a log debug_log=0 +# Set to debug level you want to see +# 0 is off +# 10 is important events (load, unload, loaded) +# 100 is everything +# Note debug_log must be set to 1 for anything to be generated +# +debug_level=10 + +# Debug levels by importance +# Normally you do not need to change this +dbglvl=100 +# More important messages +idbglvl=10 +# # mt status output # SunOS No Additional Sense # FreeBSD Current Driver State: at rest. diff --git a/bacula/scripts/mtx-changer.in b/bacula/scripts/mtx-changer.in index 6a40f72d39..9c7111d5cf 100644 --- a/bacula/scripts/mtx-changer.in +++ b/bacula/scripts/mtx-changer.in @@ -1,22 +1,22 @@ #!/bin/sh # -# Bacula interface to mtx autoloader +# Bacula(R) - The Network Backup Solution # -# Written by Kern Sibbald +# Copyright (C) 2000-2015 Kern Sibbald +# Copyright (C) 2000-2014 Free Software Foundation Europe e.V. # -# Bacula® - The Network Backup Solution +# The original author of Bacula is Kern Sibbald, with contributions +# from many others, a complete list can be found in the file AUTHORS. # -# Copyright (C) 2000-2014 Free Software Foundation Europe e.V. +# You may use this file and others of this release according to the +# license defined in the LICENSE file, which includes the Affero General +# Public License, v3.0 ("AGPLv3") and some additional permissions and +# terms pursuant to its AGPLv3 Section 7. # -# The main author of Bacula is Kern Sibbald, with contributions from many -# others, a complete list can be found in the file AUTHORS. +# This notice must be preserved when any source code is +# conveyed and/or propagated. # -# You may use this file and others of this release according to the -# license defined in the LICENSE file, which includes the GNU Lesser -# General Public License, v3.0 ("LGPLv3") and some additional permissions and -# terms pursuant to its LGPLv3 Section 7. -# -# Bacula® is a registered trademark of Kern Sibbald. +# Bacula(R) is a registered trademark of Kern Sibbald. # # If you set in your Device resource # @@ -27,24 +27,24 @@ # in come cases, not all are used. # # mtx-changer "changer-device" "command" "slot" "archive-device" "drive-index" -# $1 $2 $3 $4 $5 +# $1 $2 $3 $4 $5 # # for example: # # mtx-changer /dev/sg0 load 1 /dev/nst0 0 (on a Linux system) -# +# # will request to load the first cartidge into drive 0, where # the SCSI control channel is /dev/sg0, and the read/write device # is /dev/nst0. # # The commands are: -# Command Function -# unload unload a given slot -# load load a given slot -# loaded which slot is loaded? -# list list Volume names (requires barcode reader) -# slots how many slots total? -# listall list all info +# Command Function +# unload unload a given slot +# load load a given slot +# loaded which slot is loaded? +# list list Volume names (requires barcode reader) +# slots how many slots total? +# listall list all info # transfer # # Slots are numbered from 1 ... @@ -57,11 +57,14 @@ # Many changers need an offline after the unload. Also many # changers need a sleep 60 after the mtx load. # -# N.B. If you change the script, take care to return either +# N.B. If you change the script, take care to return either # the mtx exit code or a 0. If the script exits with a non-zero # exit code, Bacula will assume the request failed. # +# myversion must be the same as version in mtx-changer.conf +myversion=2 + # source our conf file if test ! -f @scriptdir@/mtx-changer.conf ; then echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" @@ -71,6 +74,13 @@ if test ! -f @scriptdir@/mtx-changer.conf ; then fi . @scriptdir@/mtx-changer.conf +if test "${version}" != "${myversion}" ; then + echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + echo "ERROR: @scriptdir@/mtx-changer.conf has wrong version. Wanted ${myversion}, got ${version} !!!" + echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + exit 1 +fi + MTX=@MTX@ if test ${debug_log} -ne 0 ; then @@ -78,8 +88,8 @@ if test ${debug_log} -ne 0 ; then fi dbgfile="@working_dir@/mtx.log" debug() { - if test -f $dbgfile; then - echo "`date +\"%Y%m%d-%H:%M:%S\"` $*" >> $dbgfile + if test -f $dbgfile -a ${debug_level} -ge $1; then + echo "`date +%m%d-%H:%M:%S.%N|cut -c1-16` ${chgr_id} $2" >> $dbgfile fi } @@ -92,8 +102,8 @@ make_temp_file() { if test x${TMPFILE} = x; then TMPFILE="@working_dir@/mtx.$$" if test -f ${TMPFILE}; then - echo "ERROR: Temp file security problem on: ${TMPFILE}" - exit 1 + echo "ERROR: Temp file security problem on: ${TMPFILE}" + exit 1 fi fi } @@ -107,22 +117,22 @@ make_temp_file() { # So we separate STDOUT and STDERR in # certain of the mtx commands. The contents of STDERR # is then printed after the STDOUT produced by mtx -# thus we sometimes get better changer results. +# thus we sometimes get better changer results. # make_err_file() { ERRFILE=`mktemp @working_dir@/mtx.err.XXXXXXXXXX` if test x${ERRFILE} = x; then ERRFILE="@working_dir@/mtx.err.$$" if test -f ${ERRFILE}; then - echo "ERROR: Temp file security problem on: ${ERRFILE}" - exit 1 + echo "ERROR: Temp file security problem on: ${ERRFILE}" + exit 1 fi fi } # -# The purpose of this function to wait a maximum +# The purpose of this function to wait a maximum # time for the drive. It will # return as soon as the drive is ready, or after # waiting a maximum of 300 seconds. @@ -133,12 +143,12 @@ make_err_file() { # in the code at the top of this script. # wait_for_drive() { - i=0 + i=0 while [ $i -le 300 ]; do # Wait max 300 seconds if mt -f $1 status 2>&1 | grep "${ready}" >/dev/null 2>&1; then break fi - debug "Device $1 - not ready, retrying..." + debug $dbglvl "Device $1 - not ready, retrying..." sleep 1 i=`expr $i + 1` done @@ -150,33 +160,33 @@ check_parm_count() { pCount=$1 pCountNeed=$2 if test $pCount -lt $pCountNeed; then - echo "ERROR: usage: mtx-changer ctl-device command [slot archive-device drive-index]" - echo " Insufficient number of arguments given." - if test $pCount -lt 2; then - echo " Mimimum usage is first two arguments ..." - else - echo " Command expected $pCountNeed arguments" - fi - exit 1 + echo "ERROR: usage: mtx-changer ctl-device command [slot archive-device drive-index]" + echo " Insufficient number of arguments given." + if test $pCount -lt 2; then + echo " Mimimum usage is first two arguments ..." + else + echo " Command expected $pCountNeed arguments" + fi + exit 1 fi } -# Check for special cases where only 2 arguments are needed, +# Check for special cases where only 2 arguments are needed, # all others are a minimum of 5 # case $2 in list|listall) - check_parm_count $# 2 - ;; + check_parm_count $# 2 + ;; slots) - check_parm_count $# 2 - ;; + check_parm_count $# 2 + ;; transfer) - check_parm_count $# 4 - ;; + check_parm_count $# 4 + ;; *) - check_parm_count $# 5 - ;; + check_parm_count $# 5 + ;; esac @@ -187,79 +197,108 @@ slot=$3 device=$4 drive=$5 -debug "Parms: $ctl $cmd $slot $device $drive" +debug $dbglvl "Parms: $ctl $cmd $slot $device $drive" -case $cmd in +case $cmd in unload) - debug "Doing mtx -f $ctl unload $slot $drive" if test ${offline} -eq 1 ; then - mt -f $device offline + mt -f $device offline fi if test ${offline_sleep} -ne 0 ; then - sleep ${offline_sleep} + sleep ${offline_sleep} fi make_err_file - ${MTX} -f $ctl unload $slot $drive 2>${ERRFILE} - rtn=$? + for i in 1 2 3 4 5 ; do + debug $idbglvl "Doing mtx -f $ctl unload slot=$slot drv=$drive" + ${MTX} -f $ctl unload $slot $drive 2>${ERRFILE} + rtn=$? + if test $rtn -eq 0 ; then + break + fi + grep "Error Code=" ${ERRFILE} 2>/dev/null 1>/dev/null + if test $? -ne 0 ; then + break + fi + sleep $i + done cat ${ERRFILE} rm -f ${ERRFILE} >/dev/null 2>&1 + if test $rtn -ne 0 ; then + debug $idbglvl "FAIL: mtx -f $ctl unload slot=$slot drv=$drive" + fi exit $rtn ;; load) - debug "Doing mtx -f $ctl load $slot $drive" make_err_file - ${MTX} -f $ctl load $slot $drive 2>${ERRFILE} - rtn=$? + for i in 1 2 3 4 5 ; do + debug $idbglvl "Doing mtx -f $ctl load slot=$slot drv=$drive" + ${MTX} -f $ctl load $slot $drive 2>${ERRFILE} + rtn=$? + if test $rtn -eq 0 ; then + break + fi + grep "Error Code=" ${ERRFILE} 2>/dev/null 1>/dev/null + if test $? -ne 0 ; then + break + fi + sleep $i + done if test ${load_sleep} -ne 0 ; then - sleep ${load_sleep} + sleep ${load_sleep} fi wait_for_drive $device cat ${ERRFILE} rm -f ${ERRFILE} >/dev/null 2>&1 + if test $rtn -ne 0 ; then + debug $idbglvl "FAIL: mtx -f $ctl load slot=$slot drv=$drive" + fi exit $rtn ;; - list) - debug "Doing mtx -f $ctl -- to list volumes" + list) make_temp_file if test ${inventory} -ne 0 ; then - ${MTX} -f $ctl inventory + ${MTX} -f $ctl inventory fi + debug $dbglvl "Doing mtx -f $ctl list" ${MTX} -f $ctl status >${TMPFILE} rtn=$? if test ${vxa_packetloader} -ne 0 ; then - cat ${TMPFILE} | grep " *Storage Element [0-9]*:.*Full" | sed "s/ Storage Element //" | sed "s/Full :VolumeTag=//" + cat ${TMPFILE} | grep " *Storage Element [0-9]*:.*Full" | sed "s/ Storage Element //" | sed "s/Full :VolumeTag=//" else - cat ${TMPFILE} | grep " Storage Element [0-9]*:.*Full" | awk "{print \$3 \$4}" | sed "s/Full *\(:VolumeTag=\)*//" + cat ${TMPFILE} | grep " Storage Element [0-9]*:.*Full" | awk "{print \$3 \$4}" | sed "s/Full *\(:VolumeTag=\)*//" fi cat ${TMPFILE} | grep "^Data Transfer Element [0-9]*:Full (Storage Element [0-9]" | awk '{printf "%s:%s\n",$7,$10}' rm -f ${TMPFILE} >/dev/null 2>&1 + if test $rtn -ne 0 ; then + debug $idbglvl "FAIL: mtx -f $ctl list" + fi exit $rtn ;; listall) -# Drive content: D:Drive num:F:Slot loaded:Volume Name +# Drive content: D:Drive num:F:Slot loaded:Volume Name # D:0:F:2:vol2 or D:Drive num:E -# D:1:F:42:vol42 +# D:1:F:42:vol42 # D:3:E -# +# # Slot content: -# S:1:F:vol1 S:Slot num:F:Volume Name -# S:2:E or S:Slot num:E +# S:1:F:vol1 S:Slot num:F:Volume Name +# S:2:E or S:Slot num:E # S:3:F:vol4 -# +# # Import/Export tray slots: -# I:10:F:vol10 I:Slot num:F:Volume Name -# I:11:E or I:Slot num:E +# I:10:F:vol10 I:Slot num:F:Volume Name +# I:11:E or I:Slot num:E # I:12:F:vol40 - - debug "Doing mtx -f $ctl -- to list all" + make_temp_file if test ${inventory} -ne 0 ; then - ${MTX} -f $ctl inventory + ${MTX} -f $ctl inventory fi + debug $dbglvl "Doing mtx -f $ctl -- to list all" ${MTX} -f $ctl status >${TMPFILE} rtn=$? # can be converted to awk+sed+cut, see below @@ -273,7 +312,7 @@ case $cmd in # If perl isn't installed, you can use by those commands #cat ${TMPFILE} | grep "Data Transfer Element" | awk "{print \"D:\"\$4 \$7 \$9 \$10}" | sed "s/=/:/" | sed "s/Full/F:/" | sed "s/Empty/E/" #cat ${TMPFILE} | grep -v "Data Transfer Element" | grep "Storage Element" | grep -v "IMPORT/EXPORT" | awk "{print \"S:\"\$3 \$4 \$5}" | sed "s/IMPORT\/EXPORT//" | sed "s/Full *:VolumeTag=/F:/" | sed "s/Empty/E/" -#cat ${TMPFILE} | grep -v "Data Transfer Element" | grep "Storage Element" | grep "IMPORT/EXPORT" | awk "{print \"I:\"\$3 \$4 \$5}" | sed "s/IMPORT\/EXPORT//" | sed "s/Full *:VolumeTag=/F:/" | sed "s/Empty/E/" +#cat ${TMPFILE} | grep -v "Data Transfer Element" | grep "Storage Element" | grep "IMPORT/EXPORT" | awk "{print \"I:\"\$3 \$4 \$5}" | sed "s/IMPORT\/EXPORT//" | sed "s/Full *:VolumeTag=/F:/" | sed "s/Empty/E/" rm -f ${TMPFILE} >/dev/null 2>&1 exit $rtn @@ -281,25 +320,35 @@ case $cmd in transfer) slotdest=$device - debug "Doing transfer from $slot to $slotdest" + debug $dbglvl "Doing transfer from $slot to $slotdest" ${MTX} -f $ctl transfer $slot $slotdest rtn=$? + if test $rtn -ne 0 ; then + debug $idbglvl "FAIL: mtx -f $ctl transfer from=$slot to=$slotdest" + fi exit $rtn ;; loaded) - debug "Doing mtx -f $ctl $drive -- to find what is loaded" make_temp_file + debug $idbglvl "Doing mtx -f $ctl $drive -- to find what is loaded" ${MTX} -f $ctl status >${TMPFILE} rtn=$? cat ${TMPFILE} | grep "^Data Transfer Element $drive:Full" | awk "{print \$7}" cat ${TMPFILE} | grep "^Data Transfer Element $drive:Empty" | awk "{print 0}" rm -f ${TMPFILE} >/dev/null 2>&1 + if test $rtn -ne 0 ; then + debug $idbglvl "FAIL: mtx -f $ctl loaded drv=$drive" + fi exit $rtn ;; slots) - debug "Doing mtx -f $ctl -- to get count of slots" + debug $dbglvl "Doing mtx -f $ctl -- to get count of slots" ${MTX} -f $ctl status | grep " *Storage Changer" | awk "{print \$5}" + rtn=$? + if test $rtn -ne 0 ; then + debug $idbglvl "FAIL: mtx -f $ctl slots" + fi ;; esac diff --git a/bacula/src/Makefile.in b/bacula/src/Makefile.in index 0d11c80b1e..88c3827586 100644 --- a/bacula/src/Makefile.in +++ b/bacula/src/Makefile.in @@ -1,6 +1,6 @@ # -# Author: Kern Sibbald -# License: LGPLv3 +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # @MCOMMON@ @@ -9,9 +9,9 @@ VPATH = . .PATH: . # one up -basedir = .. +basedir = @BUILD_DIR@ # top dir -topdir = .. +topdir = @BUILD_DIR@ # this dir relative to top dir thisdir = src diff --git a/bacula/src/baconfig.h b/bacula/src/baconfig.h index 28b0fd88dd..2b89e96b02 100644 --- a/bacula/src/baconfig.h +++ b/bacula/src/baconfig.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /** * General header file configurations that apply to @@ -46,8 +50,8 @@ #define ioctl_req_t int #endif -#define MANUAL_AUTH_URL "http://www.bacula.org/en/rel-manual/Bacula_Freque_Asked_Questi.html#SECTION00260000000000000000" - +#define MANUAL_AUTH_URL "http://www.bacula.org/rel-manual/en/problems/Bacula_Frequently_Asked_Que.html" + #ifdef PROTOTYPES # define __PROTO(p) p #else @@ -72,6 +76,17 @@ #define ASSERT2(x, y) #endif +#ifdef DEVELOPER +#define ASSERTD(x, y) if (!(x)) { \ + set_assert_msg(__FILE__, __LINE__, y); \ + Emsg1(M_ERROR, 0, _("Failed ASSERT: %s\n"), #x); \ + Pmsg1(000, _("Failed ASSERT: %s\n"), #x); \ + char *jcr = NULL; \ + jcr[0] = 0; } +#else +#define ASSERTD(x, y) +#endif + /* Allow printing of NULL pointers */ #define NPRT(x) (x)?(x):_("*None*") #define NPRTB(x) (x)?(x):"" @@ -154,7 +169,7 @@ void InitWinAPIWrapper(); /* Use the following for strings not to be translated */ -#define NT_(s) (s) +#define NT_(s) (s) /* This should go away! ****FIXME***** */ #define MAXSTRING 500 @@ -174,7 +189,7 @@ void InitWinAPIWrapper(); /* All tape operations MUST be a multiple of this */ #define TAPE_BSIZE 1024 -#ifdef DEV_BSIZE +#ifdef DEV_BSIZE #define B_DEV_BSIZE DEV_BSIZE #endif @@ -229,6 +244,7 @@ void InitWinAPIWrapper(); #define B_ISALPHA(c) (isascii((int)(c)) && isalpha((int)(c))) #define B_ISUPPER(c) (isascii((int)(c)) && isupper((int)(c))) #define B_ISDIGIT(c) (isascii((int)(c)) && isdigit((int)(c))) +#define B_ISXDIGIT(c) (isascii((int)(c)) && isxdigit((int)(c))) /** For multiplying by 10 with shift and addition */ #define B_TIMES10(d) ((d<<3)+(d<<1)) @@ -307,14 +323,31 @@ typedef off_t boffset_t; void b_memset(const char *file, int line, void *mem, int val, size_t num); #endif -/* First we look if we have a debug_level set, - * then we look for simple debug level without tags +/* we look for simple debug level * then finally we check if tags are set on debug_level and lvl */ -#define chk_dbglvl(lvl) (debug_level > 0 && ( \ - ((((lvl) & DT_ALL) == 0) && ((lvl) <= (debug_level & ~DT_ALL))) || \ - (((lvl) & DT_ALL & debug_level) && (((lvl) & ~DT_ALL) <= (debug_level & ~DT_ALL))))) +/* + lvl | debug_level | tags | result + -------+----------------+-------+------- + 0 | 0 | | OK + T1|0 | 0 | | NOK + T1|0 | 0 | T1 | OK + 10 | 0 | | NOK + 10 | 10 | | OK + T1|10 | 10 | | NOK + T1|10 | 10 | T1 | OK + T1|10 | 10 | T2 | NOK + */ + +/* The basic test is working because tags are on high bits */ +#if 1 +#define chk_dbglvl(lvl) ((lvl) <= debug_level || \ + (((lvl) & debug_level_tags) && (((lvl) & ~DT_ALL) <= debug_level))) +#else +/* Alain's macro for debug */ +#define chk_dbglvl(lvl) (((lvl) & debug_level_tags) || (((lvl) & ~DT_ALL) <= debug_level)) +#endif /** * The digit following Dmsg and Emsg indicates the number of substitutions in * the message string. We need to do this kludge because non-GNU compilers @@ -422,13 +455,13 @@ void b_memset(const char *file, int line, void *mem, int val, size_t num); #define Jmsg8(jcr, typ, lvl, msg, a1, a2, a3, a4, a5, a6, a7, a8) j_msg(__FILE__, __LINE__, jcr, typ, lvl, msg, a1, a2, a3, a4, a5, a6, a7, a8) /** Queued Job Error Messages that are delivered according to the message resource */ -#define Qmsg0(jcr, typ, lvl, msg) q_msg(__FILE__, __LINE__, jcr, typ, lvl, msg) -#define Qmsg1(jcr, typ, lvl, msg, a1) q_msg(__FILE__, __LINE__, jcr, typ, lvl, msg, a1) -#define Qmsg2(jcr, typ, lvl, msg, a1, a2) q_msg(__FILE__, __LINE__, jcr, typ, lvl, msg, a1, a2) -#define Qmsg3(jcr, typ, lvl, msg, a1, a2, a3) q_msg(__FILE__, __LINE__, jcr, typ, lvl, msg, a1, a2, a3) -#define Qmsg4(jcr, typ, lvl, msg, a1, a2, a3, a4) q_msg(__FILE__, __LINE__, jcr, typ, lvl, msg, a1, a2, a3, a4) -#define Qmsg5(jcr, typ, lvl, msg, a1, a2, a3, a4, a5) q_msg(__FILE__, __LINE__, jcr, typ, lvl, msg, a1, a2, a3, a4, a5) -#define Qmsg6(jcr, typ, lvl, msg, a1, a2, a3, a4, a5, a6) q_msg(__FILE__, __LINE__, jcr, typ, lvl, msg, a1, a2, a3, a4, a5, a6) +#define Qmsg0(jcr, typ, mtime, msg) q_msg(__FILE__, __LINE__, jcr, typ, mtime, msg) +#define Qmsg1(jcr, typ, mtime, msg, a1) q_msg(__FILE__, __LINE__, jcr, typ, mtime, msg, a1) +#define Qmsg2(jcr, typ, mtime, msg, a1, a2) q_msg(__FILE__, __LINE__, jcr, typ, mtime, msg, a1, a2) +#define Qmsg3(jcr, typ, mtime, msg, a1, a2, a3) q_msg(__FILE__, __LINE__, jcr, typ, mtime, msg, a1, a2, a3) +#define Qmsg4(jcr, typ, mtime, msg, a1, a2, a3, a4) q_msg(__FILE__, __LINE__, jcr, typ, mtime, msg, a1, a2, a3, a4) +#define Qmsg5(jcr, typ, mtime, msg, a1, a2, a3, a4, a5) q_msg(__FILE__, __LINE__, jcr, typ, mtime, msg, a1, a2, a3, a4, a5) +#define Qmsg6(jcr, typ, mtime, msg, a1, a2, a3, a4, a5, a6) q_msg(__FILE__, __LINE__, jcr, typ, mtime, msg, a1, a2, a3, a4, a5, a6) /** Memory Messages that are edited into a Pool Memory buffer */ @@ -450,6 +483,20 @@ int Mmsg(POOLMEM **msgbuf, const char *fmt,...); int Mmsg(POOLMEM *&msgbuf, const char *fmt,...); int Mmsg(POOL_MEM &msgbuf, const char *fmt,...); +#define MmsgD0(level, msgbuf, fmt) \ + { Mmsg(msgbuf, fmt); Dmsg1(level, "%s", msgbuf); } +#define MmsgD1(level, msgbuf, fmt, a1) \ + { Mmsg(msgbuf, fmt, a1); Dmsg1(level, "%s", msgbuf); } +#define MmsgD2(level, msgbuf, fmt, a1, a2) \ + { Mmsg(msgbuf, fmt, a1, a2); Dmsg1(level, "%s", msgbuf); } +#define MmsgD3(level, msgbuf, fmt, a1, a2, a3) \ + { Mmsg(msgbuf, fmt, a1, a2, a3); Dmsg1(level, "%s", msgbuf); } +#define MmsgD4(level, msgbuf, fmt, a1, a2, a3, a4) \ + { Mmsg(msgbuf, fmt, a1, a2, a3, a4); Dmsg1(level, "%s", msgbuf); } +#define MmsgD5(level, msgbuf, fmt, a1, a2, a3, a4, a5) \ + { Mmsg(msgbuf, fmt, a1, a2, a3, a4, a5); Dmsg1(level, "%s", msgbuf); } +#define MmsgD6(level, msgbuf, fmt, a1, a2, a3, a4, a5, a6) \ + { Mmsg(msgbuf, fmt, a1, a2, a3, a4, a5, a6); Dmsg1(level, "%s", msgbuf); } class JCR; void d_msg(const char *file, int line, int64_t level, const char *fmt,...); @@ -465,14 +512,14 @@ int m_msg(const char *file, int line, POOLMEM *&pool_buf, const char *fmt, ...) #ifndef HAVE_WXCONSOLE #undef strdup #define strdup(buf) bad_call_on_strdup_use_bstrdup(buf) -#else +#else /* Groan, WxWidgets has its own way of doing NLS so cleanup */ #ifndef ENABLE_NLS #undef _ #undef setlocale #undef textdomain #undef bindtextdomain -#endif +#endif #endif /** Use our fgets which handles interrupts */ @@ -512,55 +559,22 @@ int m_msg(const char *file, int line, POOLMEM *&pool_buf, const char *fmt, ...) /* ============================================================= * OS Dependent defines - * ============================================================= + * ============================================================= */ #if defined (__digital__) && defined (__unix__) -/* Tru64 - it does have fseeko and ftello , but since ftell/fseek are also 64 bit */ -/* take this 'shortcut' */ -#define fseeko fseek -#define ftello ftell -#else -#ifndef HAVE_FSEEKO -/* Bad news. This OS cannot handle 64 bit fseeks and ftells */ -#define fseeko fseek -#define ftello ftell -#endif -#endif - -#ifdef HAVE_SUN_OS -/* - * On Solaris 2.5/2.6/7 and 8, threads are not timesliced by default, - * so we need to explictly increase the conncurrency level. - */ -#ifdef USE_THR_SETCONCURRENCY -#include -#define set_thread_concurrency(x) thr_setconcurrency(x) -extern int thr_setconcurrency(int); -#define SunOS 1 -#else -#define set_thread_concurrency(x) -#endif - -#else -/* - * Not needed on most systems - */ -#define set_thread_concurrency(x) +/* Tru64 - has 64 bit fseeko and ftello */ +#define fseeko fseek +#define ftello ftell +#endif /* digital stuff */ +#ifndef HAVE_FSEEKO +/* This OS does not handle 64 bit fseeks and ftells */ +#define fseeko fseek +#define ftello ftell #endif -#ifdef HAVE_DARWIN_OS -/* Apparently someone forgot to wrap getdomainname as a C function */ -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ -int getdomainname(char *name, int len); -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* HAVE_DARWIN_OS */ -#if defined(HAVE_WIN32) +#ifdef HAVE_WIN32 /* * Windows */ @@ -573,10 +587,7 @@ inline const char *first_path_separator(const char *path) { return strpbrk(path, extern void pause_msg(const char *file, const char *func, int line, const char *msg); #define pause(msg) if (debug_level) pause_msg(__FILE__, __func__, __LINE__, (msg)) -#else -/* - * Unix/Linix - */ +#else /* Unix/Linux */ #define PathSeparator '/' /* Define Winsock functions if we aren't on Windows */ @@ -587,10 +598,53 @@ inline bool IsPathSeparator(int ch) { return ch == '/'; } inline char *first_path_separator(char *path) { return strchr(path, '/'); } inline const char *first_path_separator(const char *path) { return strchr(path, '/'); } #define pause(msg) +#endif /* HAVE_WIN32 */ + +#ifdef HAVE_DARWIN_OS +/* Apparently someone forgot to wrap getdomainname as a C function */ +#ifdef __cplusplus +extern "C" { #endif +int getdomainname(char *name, int namelen); +#ifdef __cplusplus +} +#endif +#endif /* HAVE_DARWIN_OS */ + + +/* **** Unix Systems **** */ +#ifdef HAVE_SUN_OS +/* + * On Solaris 2.5/2.6/7 and 8, threads are not timesliced by default, + * so we need to explictly increase the conncurrency level. + */ +#ifdef USE_THR_SETCONCURRENCY +#include +#define set_thread_concurrency(x) thr_setconcurrency(x) +extern int thr_setconcurrency(int); +#define SunOS 1 +#else +#define set_thread_concurrency(x) +#define thr_setconcurrency(x) +#endif + +#else +#define set_thread_concurrency(x) +#endif /* HAVE_SUN_OS */ -/** HP-UX 11 specific workarounds */ +#ifdef HAVE_OSF1_OS +#ifdef __cplusplus +extern "C" { +#endif +int fchdir(int filedes); +long gethostid(void); +int getdomainname(char *name, int namelen); +#ifdef __cplusplus +} +#endif +#endif /* HAVE_OSF1_OS */ + #ifdef HAVE_HPUX_OS # undef h_errno @@ -600,30 +654,17 @@ extern int h_errno; * the problem is no system headers declares the prototypes for these functions * this is done below */ -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ -int getdomainname(char *name, int namelen); -int setdomainname(char *name, int namelen); -#ifdef __cplusplus -} -#endif /* __cplusplus */ +#ifdef __cplusplus +extern "C" { +#endif +int getdomainname(char *name, int namlen); +int setdomainname(char *name, int namlen); +#ifdef __cplusplus +} +#endif #endif /* HAVE_HPUX_OS */ -#ifdef HAVE_OSF1_OS -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ -int fchdir(int filedes); -long gethostid(void); -int getdomainname(char *name, int len); -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* HAVE_OSF1_OS */ - - /** Disabled because it breaks internationalisation... #undef HAVE_SETLOCALE #ifdef HAVE_SETLOCALE diff --git a/bacula/src/bacula.h b/bacula/src/bacula.h index 5ba3b89a29..ac10af37d5 100644 --- a/bacula/src/bacula.h +++ b/bacula/src/bacula.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * bacula.h -- main header file to include in all Bacula source @@ -35,8 +39,9 @@ #if defined(HAVE_WIN32) #if defined(HAVE_MINGW) -#include "mingwconfig.h" +#include "winhdrs.h" #else +#error "Only MINGW is supported" #include "winconfig.h" #endif #else @@ -51,16 +56,18 @@ /* System includes */ -#if HAVE_STDINT_H +#if defined(HAVE_STDINT_H) #ifndef __sgi #include #endif +#elif defined(HAVE_INTTYPES_H) +#include #endif -#if HAVE_STDARG_H +#if defined(HAVE_STDARG_H) #include #endif #include -#if HAVE_STDLIB_H +#if defined(HAVE_STDLIB_H) #include #endif #if HAVE_UNISTD_H @@ -123,10 +130,10 @@ extern "C" { #endif #if defined(HAVE_WIN32) & !defined(HAVE_MINGW) #include -#endif +#endif #if !defined(HAVE_WIN32) & !defined(HAVE_MINGW) #include -#endif +#endif #include #if HAVE_SYS_WAIT_H #include @@ -151,8 +158,8 @@ extern "C" { * includes before these. */ #if defined(HAVE_WIN32) -#include -#include "win32/compat/compat.h" +//#include +#include "compat.h" #endif #include "version.h" @@ -163,7 +170,7 @@ extern "C" { #include "lib/lib.h" #if defined(HAVE_WIN32) -#include "win32/winapi.h" +#include "winapi.h" #include "winhost.h" #else #include "host.h" diff --git a/bacula/src/bc_types.h b/bacula/src/bc_types.h index 1e48bca693..9e9ea174d9 100644 --- a/bacula/src/bc_types.h +++ b/bacula/src/bc_types.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* Define integer types for Bacula -- Kern Sibbald @@ -28,8 +32,6 @@ Also, we define types such as file address lengths. - Version $Id$ - */ diff --git a/bacula/src/c b/bacula/src/c index 526055e6da..aeb84895b8 100644 --- a/bacula/src/c +++ b/bacula/src/c @@ -1,15 +1,17 @@ -/* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. diff --git a/bacula/src/c.scr b/bacula/src/c.scr new file mode 100644 index 0000000000..206188e78e --- /dev/null +++ b/bacula/src/c.scr @@ -0,0 +1,8 @@ +l Copyright (C) +-1 +mark +l */ +mark +db +inc /home/kern/bacula/k/src/c +e diff --git a/bacula/src/cats/Makefile.in b/bacula/src/cats/Makefile.in index 7a4f20ae48..22d10b850e 100644 --- a/bacula/src/cats/Makefile.in +++ b/bacula/src/cats/Makefile.in @@ -1,6 +1,6 @@ # -# Author: Kern Sibbald -# License: LGPLv3 +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # @MCOMMON@ @@ -14,8 +14,8 @@ topdir = ../.. # this dir relative to top dir thisdir = src/cats -DEFS += -D_BDB_PRIV_INTERFACE_ -#CPPFLAGS += @DBI_DBD_DRIVERDIR@ +#CPPFLAGS += -DCATS_PRIVATE_DBI @DBI_DBD_DRIVERDIR@ +CPPFLAGS += -DCATS_PRIVATE_DBI DEBUG=@DEBUG@ MKDIR=$(topdir)/autoconf/mkinstalldirs @@ -46,12 +46,6 @@ SQLITE_SRCS = sqlite.c SQLITE_OBJS = $(SQLITE_SRCS:.c=.o) SQLITE_LOBJS = $(SQLITE_SRCS:.c=.lo) -#INGRES_INCLUDE = @INGRES_INCLUDE@ -#INGRES_LIBS = @INGRES_LIBS@ -#INGRES_SRCS = ingres.c myingres.c -#INGRES_OBJS = $(INGRES_SRCS:.c=.o) -#INGRES_LOBJS = $(INGRES_SRCS:.c=.lo) - #DBI_INCLUDE = @DBI_INCLUDE@ #DBI_LIBS = @DBI_LIBS@ #DBI_SRCS = dbi.c @@ -62,7 +56,7 @@ DB_LIBS=@DB_LIBS@ CATS_SRCS = mysql.c postgresql.c sqlite.c LIBBACSQL_SRCS = bvfs.c cats.c sql.c sql_cmds.c sql_create.c sql_delete.c \ - sql_find.c sql_get.c sql_glue.c sql_list.c sql_update.c + sql_find.c sql_get.c sql_list.c sql_update.c LIBBACSQL_OBJS = $(LIBBACSQL_SRCS:.c=.o) LIBBACCATS_OBJS = $(CATS_SRCS:.c=.o) LIBBACSQL_LOBJS = $(LIBBACSQL_SRCS:.c=.lo) @@ -99,10 +93,6 @@ $(SQLITE_LOBJS): # @echo "Compiling $(@:.lo=.c)" # $(NO_ECHO)$(LIBTOOL_COMPILE) $(CXX) $(DEFS) $(DEBUG) -c $(WCFLAGS) $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DBI_INCLUDE) $(DINCLUDE) $(CFLAGS) $(@:.lo=.c) -#$(INGRES_LOBJS): -# @echo "Compiling $(@:.lo=.c)" -# $(NO_ECHO)$(LIBTOOL_COMPILE) $(CXX) $(DEFS) $(DEBUG) -c $(WCFLAGS) $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(INGRES_INCLUDE) $(DINCLUDE) $(CFLAGS) $(@:.lo=.c) - $(MYSQL_OBJS): @echo "Compiling $(@:.o=.c)" $(NO_ECHO)$(CXX) $(DEFS) $(DEBUG) -c $(WCFLAGS) $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(MYSQL_INCLUDE) $(DINCLUDE) $(CFLAGS) $(@:.o=.c) @@ -115,10 +105,6 @@ $(SQLITE_OBJS): @echo "Compiling $(@:.o=.c)" $(NO_ECHO)$(CXX) $(DEFS) $(DEBUG) -c $(WCFLAGS) $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(SQLITE_INCLUDE) $(DINCLUDE) $(CFLAGS) $(@:.o=.c) -#$(INGRES_OBJS): -# @echo "Compiling $(@:.o=.c)" -# $(NO_ECHO)$(CXX) $(DEFS) $(DEBUG) -c $(WCFLAGS) $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(INGRES_INCLUDE) $(DINCLUDE) $(CFLAGS) $(@:.o=.c) - #$(DBI_OBJS): # @echo "Compiling $(@:.o=.c)" # $(NO_ECHO)$(CXX) $(DEFS) $(DEBUG) -c $(WCFLAGS) $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DBI_INCLUDE) $(DINCLUDE) $(CFLAGS) $(@:.o=.c) @@ -127,12 +113,6 @@ all: Makefile libbacsql$(DEFAULT_ARCHIVE_TYPE) libbaccats$(DEFAULT_ARCHIVE_TYPE) @echo "==== Make of sqllibs is good ====" @echo " " -#esql: -# @echo "Generating myingres.c from myingres.sc" -# $(NO_ECHO)$(II_SYSTEM)/ingres/bin/esqlcc -multi -extension=c myingres.sc -# @echo "Generating myingres.h from myingres.sh" -# $(NO_ECHO)$(II_SYSTEM)/ingres/bin/esqlcc -extension=h myingres.sh - libbacsql.a: $(LIBBACSQL_OBJS) @echo "Making $@ ..." $(AR) rc $@ $(LIBBACSQL_OBJS) @@ -147,9 +127,9 @@ libbacsql.la: Makefile $(LIBBACSQL_LOBJS) @echo "Making $@ ..." $(LIBTOOL_LINK) $(CXX) $(DEFS) $(DEBUG) $(LDFLAGS) -o $@ $(LIBBACSQL_LOBJS) -export-dynamic -rpath $(libdir) -release $(LIBBACSQL_LT_RELEASE) $(DB_LIBS) -libbaccats.la: Makefile cats_dummy.lo +libbaccats.la: Makefile cats_null.lo @echo "Making $@ ..." - $(LIBTOOL_LINK) $(CXX) $(DEFS) $(DEBUG) $(LDFLAGS) -o $@ cats_dummy.lo -export-dynamic -rpath $(libdir) -release $(LIBBACCATS_LT_RELEASE) + $(LIBTOOL_LINK) $(CXX) $(DEFS) $(DEBUG) $(LDFLAGS) -o $@ cats_null.lo -export-dynamic -rpath $(libdir) -release $(LIBBACCATS_LT_RELEASE) libbaccats-mysql.la: Makefile $(MYSQL_LOBJS) @echo "Making $@ ..." @@ -165,12 +145,6 @@ libbaccats-sqlite3.la: Makefile $(SQLITE_LOBJS) @echo "Making $@ ..." $(LIBTOOL_LINK) $(CXX) $(DEFS) $(DEBUG) $(LDFLAGS) -o $@ $(SQLITE_LOBJS) -export-dynamic -rpath $(libdir) -release $(LIBBACCATS_LT_RELEASE) \ -soname libbaccats-$(LIBBACCATS_LT_RELEASE).so $(SQLITE_LIBS) - -#libbaccats-ingres.la: Makefile $(INGRES_LOBJS) -# @echo "Making $@ ..." -# $(LIBTOOL_LINK) $(CXX) $(DEFS) $(DEBUG) $(LDFLAGS) -o $@ $(INGRES_LOBJS) -export-dynamic -rpath $(libdir) -release $(LIBBACCATS_LT_RELEASE) \ -# -soname libbaccats-$(LIBBACCATS_LT_RELEASE).so $(INGRES_LIBS) - #libbaccats-dbi.la: Makefile $(DBI_LOBJS) # @echo "Making $@ ..." # $(LIBTOOL_LINK) $(CXX) $(DEFS) $(DEBUG) $(LDFLAGS) -o $@ $(DBI_LOBJS) -export-dynamic -rpath $(libdir) -release $(LIBBACCATS_LT_RELEASE) \ @@ -200,16 +174,13 @@ realclean: clean $(RMF) create_postgresql_database update_postgresql_tables make_postgresql_tables $(RMF) grant_postgresql_privileges drop_postgresql_tables drop_postgresql_database - $(RMF) create_ingres_database update_ingres_tables make_ingres_tables - $(RMF) grant_ingres_privileges drop_ingres_tables drop_ingres_database - $(RMF) create_sqlite_database update_sqlite_tables make_sqlite_tables $(RMF) grant_sqlite_privileges drop_sqlite_tables drop_sqlite_database $(RMF) create_sqlite3_database update_sqlite3_tables make_sqlite3_tables $(RMF) grant_sqlite3_privileges drop_sqlite3_tables drop_sqlite3_database - $(RMF) mysql sqlite postgresql ingres + $(RMF) mysql sqlite postgresql $(RMF) make_catalog_backup make_catalog_backup.pl delete_catalog_backup distclean: realclean @@ -322,7 +293,6 @@ uninstall: @LIBTOOL_UNINSTALL_TARGET@ @INCLUDE_UNINSTALL_TARGET@ # and it also includes system headers. # `semi'-automatic since dependencies are generated at distribution time. -#depend: esql <- SRE: if generating from 'real' ingres source depend: @$(MV) Makefile Makefile.bak @$(SED) "/^# DO NOT DELETE:/,$$ d" Makefile.bak > Makefile diff --git a/bacula/src/cats/bdb.h b/bacula/src/cats/bdb.h new file mode 100644 index 0000000000..cc53b4a780 --- /dev/null +++ b/bacula/src/cats/bdb.h @@ -0,0 +1,250 @@ +/* + Bacula(R) - The Network Backup Solution + + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2015 Free Software Foundation Europe e.V. + + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. + + You may use this file and others of this release according to the + license defined in the LICENSE file, which includes the Affero General + Public License, v3.0 ("AGPLv3") and some additional permissions and + terms pursuant to its AGPLv3 Section 7. + + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. +*/ +/* + * Catalog DB Interface class + * + * Written by Kern E. Sibbald + * + */ + +#ifndef __BDB_H_ +#define __BDB_H_ 1 + +class BDB: public SMARTALLOC { +public: + dlink m_link; /* queue control */ + brwlock_t m_lock; /* transaction lock */ + SQL_DRIVER m_db_driver_type; /* driver type */ + SQL_DBTYPE m_db_type; /* database type */ + char *m_db_name; /* database name */ + char *m_db_user; /* database user */ + char *m_db_address; /* host name address */ + char *m_db_socket; /* socket for local access */ + char *m_db_password; /* database password */ + char *m_db_driver; /* database driver */ + char *m_db_driverdir; /* database driver dir */ + int m_ref_count; /* reference count */ + int m_db_port; /* port for host name address */ + bool m_disabled_batch_insert; /* explicitly disabled batch insert mode ? */ + bool m_dedicated; /* is this connection dedicated? */ + bool m_use_fatal_jmsg; /* use Jmsg(M_FATAL) after bad queries? */ + bool m_connected; /* connection made to db */ + bool m_have_batch_insert; /* have batch insert support ? */ + + /* Cats Internal */ + int m_status; /* status */ + int m_num_rows; /* number of rows returned by last query */ + int m_num_fields; /* number of fields returned by last query */ + int m_rows_size; /* size of malloced rows */ + int m_fields_size; /* size of malloced fields */ + int m_row_number; /* row number from xx_data_seek */ + int m_field_number; /* field number from sql_field_seek */ + SQL_ROW m_rows; /* defined rows */ + SQL_FIELD *m_fields; /* defined fields */ + bool m_allow_transactions; /* transactions allowed */ + bool m_transaction; /* transaction started */ + + POOLMEM *cached_path; /* cached path name */ + POOLMEM *cmd; /* SQL command string */ + POOLMEM *errmsg; /* nicely edited error message */ + POOLMEM *esc_name; /* Escaped file name */ + POOLMEM *esc_obj; /* Escaped restore object */ + POOLMEM *esc_path; /* Escaped path name */ + POOLMEM *fname; /* Filename only */ + POOLMEM *path; /* Path only */ + uint32_t cached_path_id; /* cached path id */ + int cached_path_len; /* length of cached path */ + int changes; /* changes during transaction */ + int fnl; /* file name length */ + int pnl; /* path name length */ + + /* methods */ + BDB() {}; + virtual ~BDB() {}; + const char *get_db_name(void) { return m_db_name; }; + const char *get_db_user(void) { return m_db_user; }; + const bool is_connected(void) { return m_connected; }; + const bool is_dedicated(void) { return m_dedicated; }; + bool use_fatal_jmsg(void) { return m_use_fatal_jmsg; }; + const bool batch_insert_available(void) { return m_have_batch_insert; }; + void set_use_fatal_jmsg(bool val) { m_use_fatal_jmsg = val; }; + void increment_refcount(void) { m_ref_count++; }; + const int bdb_get_type_index(void) { return m_db_type; }; + const char *bdb_get_engine_name(void); + + BDB *bdb_clone_database_connection(JCR *jcr, bool mult_db_connections); + bool bdb_match_database(const char *db_driver, const char *db_name, + const char *bdb_address, int db_port); + bool bdb_sql_query(const char *query, int flags=0); + void bdb_lock(const char *file=__FILE__, int line=__LINE__); + void bdb_unlock(const char *file=__FILE__, int line=__LINE__); + void print_lock_info(FILE *fp); + + /* sql.c */ + bool UpdateDB(JCR *jcr, char *cmd, const char *file=__FILE__, int line=__LINE__); + bool InsertDB(JCR *jcr, char *cmd, const char *file=__FILE__, int line=__LINE__); + bool QueryDB(JCR *jcr, char *cmd, const char *file=__FILE__, int line=__LINE__); + int DeleteDB(JCR *jcr, char *cmd, const char *file=__FILE__, int line=__LINE__); + char *bdb_strerror() { return errmsg; }; + bool bdb_check_version(JCR *jcr); + bool bdb_open_batch_connexion(JCR *jcr); + bool bdb_check_max_connections(JCR *jcr, uint32_t max_concurrent_jobs); + + /* sql_delete.c */ + int bdb_delete_pool_record(JCR *jcr, POOL_DBR *pool_dbr); + int bdb_delete_media_record(JCR *jcr, MEDIA_DBR *mr); + int bdb_purge_media_record(JCR *jcr, MEDIA_DBR *mr); + int bdb_delete_snapshot_record(JCR *jcr, SNAPSHOT_DBR *sr); + + /* sql_find.c */ + bool bdb_find_last_job_start_time(JCR *jcr, JOB_DBR *jr, POOLMEM **stime, char *job, int JobLevel); + bool bdb_find_job_start_time(JCR *jcr, JOB_DBR *jr, POOLMEM **stime, char *job); + bool bdb_find_last_jobid(JCR *jcr, const char *Name, JOB_DBR *jr); + int bdb_find_next_volume(JCR *jcr, int index, bool InChanger, MEDIA_DBR *mr); + bool bdb_find_failed_job_since(JCR *jcr, JOB_DBR *jr, POOLMEM *stime, int &JobLevel); + + /* sql_create.c */ + int bdb_create_path_record(JCR *jcr, ATTR_DBR *ar); + bool bdb_create_file_attributes_record(JCR *jcr, ATTR_DBR *ar); + bool bdb_create_job_record(JCR *jcr, JOB_DBR *jr); + int bdb_create_media_record(JCR *jcr, MEDIA_DBR *media_dbr); + int bdb_create_client_record(JCR *jcr, CLIENT_DBR *cr); + bool bdb_create_fileset_record(JCR *jcr, FILESET_DBR *fsr); + bool bdb_create_pool_record(JCR *jcr, POOL_DBR *pool_dbr); + bool bdb_create_jobmedia_record(JCR *jcr, JOBMEDIA_DBR *jr); + int bdb_create_counter_record(JCR *jcr, COUNTER_DBR *cr); + bool bdb_create_device_record(JCR *jcr, DEVICE_DBR *dr); + bool bdb_create_storage_record(JCR *jcr, STORAGE_DBR *sr); + bool bdb_create_mediatype_record(JCR *jcr, MEDIATYPE_DBR *mr); + bool bdb_create_attributes_record(JCR *jcr, ATTR_DBR *ar); + bool bdb_create_restore_object_record(JCR *jcr, ROBJECT_DBR *ar); + bool bdb_create_base_file_attributes_record(JCR *jcr, ATTR_DBR *ar); + bool bdb_commit_base_file_attributes_record(JCR *jcr); + bool bdb_create_base_file_list(JCR *jcr, char *jobids); + bool bdb_create_snapshot_record(JCR *jcr, SNAPSHOT_DBR *snap); + int bdb_create_file_record(JCR *jcr, ATTR_DBR *ar); + int bdb_create_filename_record(JCR *jcr, ATTR_DBR *ar); + bool bdb_create_batch_file_attributes_record(JCR *jcr, ATTR_DBR *ar); + + /* sql_get.c */ + bool bdb_get_file_record(JCR *jcr, JOB_DBR *jr, FILE_DBR *fdbr); + bool bdb_get_snapshot_record(JCR *jcr, SNAPSHOT_DBR *snap); + bool bdb_get_volume_jobids(JCR *jcr, + MEDIA_DBR *mr, db_list_ctx *lst); + bool bdb_get_base_file_list(JCR *jcr, bool use_md5, + DB_RESULT_HANDLER *result_handler,void *ctx); + int bdb_get_filename_record(JCR *jcr); + int bdb_get_path_record(JCR *jcr); + bool bdb_get_pool_record(JCR *jcr, POOL_DBR *pdbr); + bool bdb_get_pool_numvols(JCR *jcr, POOL_DBR *pdbr); + int bdb_get_client_record(JCR *jcr, CLIENT_DBR *cr); + bool bdb_get_job_record(JCR *jcr, JOB_DBR *jr); + int bdb_get_job_volume_names(JCR *jcr, JobId_t JobId, POOLMEM **VolumeNames); + bool bdb_get_file_attributes_record(JCR *jcr, char *fname, JOB_DBR *jr, FILE_DBR *fdbr); + int bdb_get_fileset_record(JCR *jcr, FILESET_DBR *fsr); + bool bdb_get_media_record(JCR *jcr, MEDIA_DBR *mr); + int bdb_get_num_media_records(JCR *jcr); + int bdb_get_num_pool_records(JCR *jcr); + int bdb_get_pool_ids(JCR *jcr, int *num_ids, DBId_t **ids); + int bdb_get_client_ids(JCR *jcr, int *num_ids, DBId_t **ids); + bool bdb_get_media_ids(JCR *jcr, MEDIA_DBR *mr, int *num_ids, uint32_t **ids); + int bdb_get_job_volume_parameters(JCR *jcr, JobId_t JobId, VOL_PARAMS **VolParams); + bool bdb_get_counter_record(JCR *jcr, COUNTER_DBR *cr); + bool bdb_get_query_dbids(JCR *jcr, POOL_MEM &query, dbid_list &ids); + bool bdb_get_file_list(JCR *jcr, char *jobids, + bool use_md5, bool use_delta, + DB_RESULT_HANDLER *result_handler, void *ctx); + bool bdb_get_base_jobid(JCR *jcr, JOB_DBR *jr, JobId_t *jobid); + bool bdb_get_accurate_jobids(JCR *jcr, JOB_DBR *jr, db_list_ctx *jobids); + bool bdb_get_used_base_jobids(JCR *jcr, POOLMEM *jobids, db_list_ctx *result); + bool bdb_get_restoreobject_record(JCR *jcr, ROBJECT_DBR *rr); + +/* sql_list.c */ + void bdb_list_pool_records(JCR *jcr, POOL_DBR *pr, DB_LIST_HANDLER sendit, void *ctx, e_list_type type); + alist *bdb_list_job_records(JCR *jcr, JOB_DBR *jr, DB_LIST_HANDLER sendit, void *ctx, e_list_type type); + void bdb_list_job_totals(JCR *jcr, JOB_DBR *jr, DB_LIST_HANDLER sendit, void *ctx); + void bdb_list_files_for_job(JCR *jcr, uint32_t jobid, DB_LIST_HANDLER sendit, void *ctx); + void bdb_list_media_records(JCR *jcr, MEDIA_DBR *mdbr, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); + void bdb_list_jobmedia_records(JCR *jcr, JobId_t JobId, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); + void bdb_list_joblog_records(JCR *jcr, JobId_t JobId, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); + int bdb_list_sql_query(JCR *jcr, const char *query, DB_LIST_HANDLER *sendit, void *ctx, int verbose, e_list_type type); + void bdb_list_client_records(JCR *jcr, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); + void bdb_list_copies_records(JCR *jcr, uint32_t limit, char *jobids, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); + void bdb_list_base_files_for_job(JCR *jcr, JobId_t jobid, DB_LIST_HANDLER *sendit, void *ctx); + void bdb_list_restore_objects(JCR *jcr, ROBJECT_DBR *rr, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); + void bdb_list_snapshot_records(JCR *jcr, SNAPSHOT_DBR *sdbr, + DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); + + + /* sql_update.c */ + bool bdb_update_job_start_record(JCR *jcr, JOB_DBR *jr); + int bdb_update_job_end_record(JCR *jcr, JOB_DBR *jr); + int bdb_update_client_record(JCR *jcr, CLIENT_DBR *cr); + int bdb_update_pool_record(JCR *jcr, POOL_DBR *pr); + bool bdb_update_storage_record(JCR *jcr, STORAGE_DBR *sr); + int bdb_update_media_record(JCR *jcr, MEDIA_DBR *mr); + int bdb_update_media_defaults(JCR *jcr, MEDIA_DBR *mr); + int bdb_update_counter_record(JCR *jcr, COUNTER_DBR *cr); + int bdb_add_digest_to_file_record(JCR *jcr, FileId_t FileId, char *digest, int type); + int bdb_mark_file_record(JCR *jcr, FileId_t FileId, JobId_t JobId); + void bdb_make_inchanger_unique(JCR *jcr, MEDIA_DBR *mr); + int bdb_update_stats(JCR *jcr, utime_t age); + bool bdb_update_snapshot_record(JCR *jcr, SNAPSHOT_DBR *sr); + + /* Pure virtual low level methods */ + virtual void bdb_escape_string(JCR *jcr, char *snew, char *old, int len) = 0; + virtual char *bdb_escape_object(JCR *jcr, char *old, int len) = 0; + virtual void bdb_unescape_object(JCR *jcr, char *from, int32_t expected_len, + POOLMEM **dest, int32_t *len) = 0; + virtual bool bdb_open_database(JCR *jcr) = 0; + virtual void bdb_close_database(JCR *jcr) = 0; + virtual void bdb_start_transaction(JCR *jcr) = 0; + virtual void bdb_end_transaction(JCR *jcr) = 0; + virtual bool bdb_sql_query(const char *query, DB_RESULT_HANDLER *result_handler, void *ctx) = 0; + virtual void bdb_thread_cleanup(void) = 0; + + /* By default, we use bdb_sql_query */ + virtual bool bdb_big_sql_query(const char *query, + DB_RESULT_HANDLER *result_handler, void *ctx) { + return bdb_sql_query(query, result_handler, ctx); + }; + + /* Cats Internal */ +#ifdef CATS_PRIVATE_DBI + int sql_num_rows(void) { return m_num_rows; }; + void sql_field_seek(int field) { m_field_number = field; }; + int sql_num_fields(void) { return m_num_fields; }; + virtual void sql_free_result(void) = 0; + virtual SQL_ROW sql_fetch_row(void) = 0; + virtual bool sql_query(const char *query, int flags=0) = 0; + virtual const char *sql_strerror(void) = 0; + virtual void sql_data_seek(int row) = 0; + virtual int sql_affected_rows(void) = 0; + virtual uint64_t sql_insert_autokey_record(const char *query, const char *table_name) = 0; + virtual SQL_FIELD *sql_fetch_field(void) = 0; + virtual bool sql_field_is_not_null(int field_type) = 0; + virtual bool sql_field_is_numeric(int field_type) = 0; + virtual bool sql_batch_start(JCR *jcr) = 0; + virtual bool sql_batch_end(JCR *jcr, const char *error) = 0; + virtual bool sql_batch_insert(JCR *jcr, ATTR_DBR *ar) = 0; +#endif +}; + +#endif /* __Bbdb_H_ */ diff --git a/bacula/src/cats/bdb_mysql.h b/bacula/src/cats/bdb_mysql.h index b32d05f8b3..d260a76a3e 100644 --- a/bacula/src/cats/bdb_mysql.h +++ b/bacula/src/cats/bdb_mysql.h @@ -1,20 +1,26 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2009-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ -#ifndef __BDB_MYSQL_H_ -#define __BDB_MYSQL_H_ 1 + +/* MySQL driver specific definitions */ + +#ifdef __BDB_MYSQL_H_ /* * Number of insert statements to batch-up in batch insert @@ -23,30 +29,27 @@ */ #define MYSQL_CHANGES_PER_BATCH_INSERT 32 -class B_DB_MYSQL: public B_DB_PRIV { +class BDB_MYSQL: public BDB { private: MYSQL *m_db_handle; MYSQL m_instance; MYSQL_RES *m_result; public: - B_DB_MYSQL(JCR *jcr, const char *db_driver, const char *db_name, - const char *db_user, const char *db_password, - const char *db_address, int db_port, const char *db_socket, - bool mult_db_connections, bool disable_batch_insert); - ~B_DB_MYSQL(); + BDB_MYSQL(); + ~BDB_MYSQL(); - /* low level operations */ - bool db_open_database(JCR *jcr); - void db_close_database(JCR *jcr); - void db_thread_cleanup(void); - void db_escape_string(JCR *jcr, char *snew, char *old, int len); - char *db_escape_object(JCR *jcr, char *old, int len); - void db_unescape_object(JCR *jcr, char *from, int32_t expected_len, + /* Functions that we override */ + bool bdb_open_database(JCR *jcr); + void bdb_close_database(JCR *jcr); + void bdb_thread_cleanup(void); + void bdb_escape_string(JCR *jcr, char *snew, char *old, int len); + char *bdb_escape_object(JCR *jcr, char *old, int len); + void bdb_unescape_object(JCR *jcr, char *from, int32_t expected_len, POOLMEM **dest, int32_t *len); - void db_start_transaction(JCR *jcr); - void db_end_transaction(JCR *jcr); - bool db_sql_query(const char *query, DB_RESULT_HANDLER *result_handler, void *ctx); + void bdb_start_transaction(JCR *jcr); + void bdb_end_transaction(JCR *jcr); + bool bdb_sql_query(const char *query, DB_RESULT_HANDLER *result_handler, void *ctx); void sql_free_result(void); SQL_ROW sql_fetch_row(void); bool sql_query(const char *query, int flags=0); diff --git a/bacula/src/cats/bdb_postgresql.h b/bacula/src/cats/bdb_postgresql.h index 2192c28a0e..8881206147 100644 --- a/bacula/src/cats/bdb_postgresql.h +++ b/bacula/src/cats/bdb_postgresql.h @@ -1,46 +1,49 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2009-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ -#ifndef __BDB_POSTGRESQL_H_ -#define __BDB_POSTGRESQL_H_ 1 -class B_DB_POSTGRESQL: public B_DB_PRIV { +/* Postgresql driver specific definitions */ + +#ifdef __BDB_POSTGRESQL_H_ + +class BDB_POSTGRESQL: public BDB { private: PGconn *m_db_handle; PGresult *m_result; - POOLMEM *m_buf; /* Buffer to manipulate queries */ + POOLMEM *m_buf; /* Buffer to manipulate queries */ public: - B_DB_POSTGRESQL(JCR *jcr, const char *db_driver, const char *db_name, - const char *db_user, const char *db_password, - const char *db_address, int db_port, const char *db_socket, - bool mult_db_connections, bool disable_batch_insert); - ~B_DB_POSTGRESQL(); - - /* low level operations */ - bool db_open_database(JCR *jcr); - void db_close_database(JCR *jcr); - void db_thread_cleanup(void); - void db_escape_string(JCR *jcr, char *snew, char *old, int len); - char *db_escape_object(JCR *jcr, char *old, int len); - void db_unescape_object(JCR *jcr, char *from, int32_t expected_len, + BDB_POSTGRESQL(); + ~BDB_POSTGRESQL(); + + /* Functions that we override */ + bool bdb_open_database(JCR *jcr); + void bdb_close_database(JCR *jcr); + void bdb_thread_cleanup(void); + void bdb_escape_string(JCR *jcr, char *snew, char *old, int len); + char *bdb_escape_object(JCR *jcr, char *old, int len); + void bdb_unescape_object(JCR *jcr, char *from, int32_t expected_len, POOLMEM **dest, int32_t *len); - void db_start_transaction(JCR *jcr); - void db_end_transaction(JCR *jcr); - bool db_sql_query(const char *query, DB_RESULT_HANDLER *result_handler, void *ctx); - bool db_big_sql_query(const char *query, DB_RESULT_HANDLER *result_handler, void *ctx); + void bdb_start_transaction(JCR *jcr); + void bdb_end_transaction(JCR *jcr); + bool bdb_sql_query(const char *query, DB_RESULT_HANDLER *result_handler, void *ctx); + bool bdb_big_sql_query(const char *query, DB_RESULT_HANDLER *result_handler, void *ctx); void sql_free_result(void); SQL_ROW sql_fetch_row(void); bool sql_query(const char *query, int flags=0); diff --git a/bacula/src/cats/bdb_priv.h b/bacula/src/cats/bdb_priv.h deleted file mode 100644 index e58e04f984..0000000000 --- a/bacula/src/cats/bdb_priv.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - Bacula® - The Network Backup Solution - - Copyright (C) 2011-2014 Free Software Foundation Europe e.V. - - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. - - You may use this file and others of this release according to the - license defined in the LICENSE file, which includes the Affero General - Public License, v3.0 ("AGPLv3") and some additional permissions and - terms pursuant to its AGPLv3 Section 7. - - Bacula® is a registered trademark of Kern Sibbald. -*/ -#ifndef __BDB_PRIV_H_ -#define __BDB_PRIV_H_ 1 - -#ifndef _BDB_PRIV_INTERFACE_ -#error "Illegal inclusion of catalog private interface" -#endif - -/* - * Generic definition of a sql_row. - */ -typedef char **SQL_ROW; - -/* - * Generic definition of a a sql_field. - */ -typedef struct sql_field { - char *name; /* name of column */ - int max_length; /* max length */ - uint32_t type; /* type */ - uint32_t flags; /* flags */ -} SQL_FIELD; - -class B_DB_PRIV: public B_DB { -protected: - int m_status; /* status */ - int m_num_rows; /* number of rows returned by last query */ - int m_num_fields; /* number of fields returned by last query */ - int m_rows_size; /* size of malloced rows */ - int m_fields_size; /* size of malloced fields */ - int m_row_number; /* row number from xx_data_seek */ - int m_field_number; /* field number from sql_field_seek */ - SQL_ROW m_rows; /* defined rows */ - SQL_FIELD *m_fields; /* defined fields */ - bool m_allow_transactions; /* transactions allowed */ - bool m_transaction; /* transaction started */ - -public: - /* methods */ - B_DB_PRIV() {}; - virtual ~B_DB_PRIV() {}; - - int sql_num_rows(void) { return m_num_rows; }; - void sql_field_seek(int field) { m_field_number = field; }; - int sql_num_fields(void) { return m_num_fields; }; - virtual void sql_free_result(void) = 0; - virtual SQL_ROW sql_fetch_row(void) = 0; - virtual bool sql_query(const char *query, int flags=0) = 0; - virtual const char *sql_strerror(void) = 0; - virtual void sql_data_seek(int row) = 0; - virtual int sql_affected_rows(void) = 0; - virtual uint64_t sql_insert_autokey_record(const char *query, const char *table_name) = 0; - virtual SQL_FIELD *sql_fetch_field(void) = 0; - virtual bool sql_field_is_not_null(int field_type) = 0; - virtual bool sql_field_is_numeric(int field_type) = 0; - virtual bool sql_batch_start(JCR *jcr) = 0; - virtual bool sql_batch_end(JCR *jcr, const char *error) = 0; - virtual bool sql_batch_insert(JCR *jcr, ATTR_DBR *ar) = 0; -}; - -#endif /* __BDB_PRIV_H_ */ diff --git a/bacula/src/cats/bdb_sqlite.h b/bacula/src/cats/bdb_sqlite.h index 39a0b33bcc..87f469dc21 100644 --- a/bacula/src/cats/bdb_sqlite.h +++ b/bacula/src/cats/bdb_sqlite.h @@ -1,22 +1,28 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2009-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ -#ifndef __BDB_SQLITE_H_ -#define __BDB_SQLITE_H_ 1 -class B_DB_SQLITE: public B_DB_PRIV { +/* SQLite driver specific definitions */ + +#ifdef __BDB_SQLITE_H_ + +class BDB_SQLITE: public BDB { private: struct sqlite3 *m_db_handle; char **m_result; /* sql_store_results() and sql_query() */ @@ -25,11 +31,8 @@ private: SQL_FIELD m_sql_field; /* used when using db_sql_query() and sql_fetch_field() */ public: - B_DB_SQLITE(JCR *jcr, const char *db_driver, const char *db_name, - const char *db_user, const char *db_password, - const char *db_address, int db_port, const char *db_socket, - bool mult_db_connections, bool disable_batch_insert); - ~B_DB_SQLITE(); + BDB_SQLITE(); + ~BDB_SQLITE(); /* Used internaly by sqlite.c to access fields in db_sql_query() */ void set_column_names(char **res, int nb) { @@ -38,17 +41,17 @@ public: m_field_number = 0; } - /* low level operations */ - bool db_open_database(JCR *jcr); - void db_close_database(JCR *jcr); - void db_thread_cleanup(void); - void db_escape_string(JCR *jcr, char *snew, char *old, int len); - char *db_escape_object(JCR *jcr, char *old, int len); - void db_unescape_object(JCR *jcr, char *from, int32_t expected_len, + /* Functions that we override */ + bool bdb_open_database(JCR *jcr); + void bdb_close_database(JCR *jcr); + void bdb_thread_cleanup(void); + void bdb_escape_string(JCR *jcr, char *snew, char *old, int len); + char *bdb_escape_object(JCR *jcr, char *old, int len); + void bdb_unescape_object(JCR *jcr, char *from, int32_t expected_len, POOLMEM **dest, int32_t *len); - void db_start_transaction(JCR *jcr); - void db_end_transaction(JCR *jcr); - bool db_sql_query(const char *query, DB_RESULT_HANDLER *result_handler, void *ctx); + void bdb_start_transaction(JCR *jcr); + void bdb_end_transaction(JCR *jcr); + bool bdb_sql_query(const char *query, DB_RESULT_HANDLER *result_handler, void *ctx); void sql_free_result(void); SQL_ROW sql_fetch_row(void); bool sql_query(const char *query, int flags=0); diff --git a/bacula/src/cats/bvfs.c b/bacula/src/cats/bvfs.c index 460f683a2e..d73a49bbcd 100644 --- a/bacula/src/cats/bvfs.c +++ b/bacula/src/cats/bvfs.c @@ -1,31 +1,31 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2009-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ #include "bacula.h" - +#include "cats.h" #if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL - -#include "cats.h" -#include "bdb_priv.h" -#include "sql_glue.h" #include "lib/htable.h" #include "bvfs.h" -#define dbglevel 10 -#define dbglevel_sql 15 +#define dbglevel DT_BVFS|10 +#define dbglevel_sql DT_SQL|15 static int result_handler(void *ctx, int fields, char **row) { @@ -45,7 +45,7 @@ static int result_handler(void *ctx, int fields, char **row) return 0; } -Bvfs::Bvfs(JCR *j, B_DB *mdb) { +Bvfs::Bvfs(JCR *j, BDB *mdb) { jcr = j; jcr->inc_use_count(); db = mdb; /* need to inc ref count */ @@ -101,7 +101,7 @@ char *Bvfs::escape_list(alist *lst) tmp = check_pool_memory_size(tmp, 2 * len + 2 + 2); tmp[0] = '\''; - db_escape_string(jcr, db, tmp + 1 , elt, len); + db->bdb_escape_string(jcr, tmp + 1 , elt, len); pm_strcat(tmp, "'"); if (*escaped_list) { @@ -171,7 +171,7 @@ void Bvfs::filter_jobid() db_list_ctx ctx; Dmsg1(dbglevel_sql, "q=%s\n", query.c_str()); - db_sql_query(db, query.c_str(), db_list_handler, &ctx); + db->bdb_sql_query(query.c_str(), db_list_handler, &ctx); pm_strcpy(jobids, ctx.list); } @@ -310,7 +310,7 @@ char *bvfs_basename_dir(char *path) return p; } -static void build_path_hierarchy(JCR *jcr, B_DB *mdb, +static void build_path_hierarchy(JCR *jcr, BDB *mdb, pathid_cache &ppathid_cache, char *org_pathid, char *path) { @@ -333,12 +333,12 @@ static void build_path_hierarchy(JCR *jcr, B_DB *mdb, "SELECT PPathId FROM PathHierarchy WHERE PathId = %s", pathid); - if (!QUERY_DB(jcr, mdb, mdb->cmd)) { + if (!mdb->QueryDB(jcr, mdb->cmd)) { goto bail_out; /* Query failed, just leave */ } /* Do we have a result ? */ - if (sql_num_rows(mdb) > 0) { + if (mdb->sql_num_rows() > 0) { ppathid_cache.insert(pathid); /* This dir was in the db ... * It means we can leave, the tree has allready been built for @@ -349,7 +349,7 @@ static void build_path_hierarchy(JCR *jcr, B_DB *mdb, /* search or create parent PathId in Path table */ mdb->path = bvfs_parent_dir(path); mdb->pnl = strlen(mdb->path); - if (!db_create_path_record(jcr, mdb, &parent)) { + if (!mdb->bdb_create_path_record(jcr, &parent)) { goto bail_out; } ppathid_cache.insert(pathid); @@ -359,7 +359,7 @@ static void build_path_hierarchy(JCR *jcr, B_DB *mdb, "VALUES (%s,%lld)", pathid, (uint64_t) parent.PathId); - if (!INSERT_DB(jcr, mdb, mdb->cmd)) { + if (!mdb->InsertDB(jcr, mdb->cmd)) { goto bail_out; /* Can't insert the record, just leave */ } @@ -385,22 +385,28 @@ bail_out: * OK 1 */ static int update_path_hierarchy_cache(JCR *jcr, - B_DB *mdb, + BDB *mdb, pathid_cache &ppathid_cache, JobId_t JobId) { Dmsg0(dbglevel, "update_path_hierarchy_cache()\n"); - int ret=0; + uint32_t ret=0; uint32_t num; char jobid[50]; edit_uint64(JobId, jobid); - db_lock(mdb); - db_start_transaction(jcr, mdb); + mdb->bdb_lock(); + + /* We don't really want to harm users with spurious messages, + * everything is handled by transaction + */ + mdb->set_use_fatal_jmsg(false); + + mdb->bdb_start_transaction(jcr); Mmsg(mdb->cmd, "SELECT 1 FROM Job WHERE JobId = %s AND HasCache=1", jobid); - if (!QUERY_DB(jcr, mdb, mdb->cmd) || sql_num_rows(mdb) > 0) { + if (!mdb->QueryDB(jcr, mdb->cmd) || mdb->sql_num_rows() > 0) { Dmsg1(dbglevel, "already computed %d\n", (uint32_t)JobId ); ret = 1; goto bail_out; @@ -416,7 +422,7 @@ static int update_path_hierarchy_cache(JCR *jcr, "WHERE BaseFiles.JobId = %s) AS B", jobid, jobid); - if (!QUERY_DB(jcr, mdb, mdb->cmd)) { + if (!mdb->QueryDB(jcr, mdb->cmd)) { Dmsg1(dbglevel, "Can't fill PathVisibility %d\n", (uint32_t)JobId ); goto bail_out; } @@ -436,7 +442,7 @@ static int update_path_hierarchy_cache(JCR *jcr, "ORDER BY Path", jobid); Dmsg1(dbglevel_sql, "q=%s\n", mdb->cmd); - if (!QUERY_DB(jcr, mdb, mdb->cmd)) { + if (!mdb->QueryDB(jcr, mdb->cmd)) { Dmsg1(dbglevel, "Can't get new Path %d\n", (uint32_t)JobId ); goto bail_out; } @@ -445,13 +451,13 @@ static int update_path_hierarchy_cache(JCR *jcr, * So, now i'm copying the result in memory to be able to query the * catalog descriptor again. */ - num = sql_num_rows(mdb); + num = mdb->sql_num_rows(); if (num > 0) { char **result = (char **)malloc (num * 2 * sizeof(char *)); SQL_ROW row; int i=0; - while((row = sql_fetch_row(mdb))) { + while((row = mdb->sql_fetch_row())) { result[i++] = bstrdup(row[0]); result[i++] = bstrdup(row[1]); } @@ -466,7 +472,7 @@ static int update_path_hierarchy_cache(JCR *jcr, free(result); } - if (mdb->db_get_type_index() == SQL_TYPE_SQLITE3) { + if (mdb->bdb_get_type_index() == SQL_TYPE_SQLITE3) { Mmsg(mdb->cmd, "INSERT INTO PathVisibility (PathId, JobId) " "SELECT DISTINCT h.PPathId AS PathId, %s " @@ -491,19 +497,28 @@ static int update_path_hierarchy_cache(JCR *jcr, } do { - ret = QUERY_DB(jcr, mdb, mdb->cmd); - } while (ret && sql_affected_rows(mdb) > 0); + ret = mdb->QueryDB(jcr, mdb->cmd); + } while (ret && mdb->sql_affected_rows() > 0); Mmsg(mdb->cmd, "UPDATE Job SET HasCache=1 WHERE JobId=%s", jobid); - UPDATE_DB(jcr, mdb, mdb->cmd); + ret = mdb->UpdateDB(jcr, mdb->cmd); bail_out: - db_end_transaction(jcr, mdb); - db_unlock(mdb); + mdb->bdb_end_transaction(jcr); + + if (!ret) { + Mmsg(mdb->cmd, "SELECT HasCache FROM Job WHERE JobId=%s", jobid); + mdb->bdb_sql_query(mdb->cmd, db_int_handler, &ret); + } + + /* Enable back the FATAL message if something is wrong */ + mdb->set_use_fatal_jmsg(true); + + mdb->bdb_unlock(); return ret; } -/* +/* * Find an store the filename descriptor for empty directories Filename.Name='' */ DBId_t Bvfs::get_dir_filenameid() @@ -530,21 +545,30 @@ void Bvfs::fv_update_cache() return; /* Nothing to build */ } - db_lock(db); - db_start_transaction(jcr, db); + db->bdb_lock(); + /* We don't really want to harm users with spurious messages, + * everything is handled by transaction + */ + db->set_use_fatal_jmsg(false); + + db->bdb_start_transaction(jcr); pathid = get_root(); fv_compute_size_and_count(pathid, &size, &count); - db_end_transaction(jcr, db); - db_unlock(db); + db->bdb_end_transaction(jcr); + + /* Enable back the FATAL message if something is wrong */ + db->set_use_fatal_jmsg(true); + + db->bdb_unlock(); } /* Not yet working */ void Bvfs::fv_get_big_files(int64_t pathid, int64_t min_size, int32_t limit) { - Mmsg(db->cmd, + Mmsg(db->cmd, "SELECT FilenameId AS filenameid, Name AS name, size " "FROM ( " "SELECT FilenameId, base64_decode_lstat(8,LStat) AS size " @@ -570,11 +594,11 @@ void Bvfs::fv_get_current_size_and_count(int64_t pathid, int64_t *size, int64_t " WHERE PathId = %lld " " AND JobId = %s ", pathid, jobids); - if (!QUERY_DB(jcr, db, db->cmd)) { + if (!db->QueryDB(jcr, db->cmd)) { return; } - if ((row = sql_fetch_row(db))) { + if ((row = db->sql_fetch_row())) { *size = str_to_int64(row[0]); *count = str_to_int64(row[1]); } @@ -593,11 +617,11 @@ void Bvfs::fv_get_size_and_count(int64_t pathid, int64_t *size, int64_t *count) " WHERE PathId = %lld " " AND JobId = %s ", pathid, jobids); - if (!QUERY_DB(jcr, db, db->cmd)) { + if (!db->QueryDB(jcr, db->cmd)) { return; } - if ((row = sql_fetch_row(db))) { + if ((row = db->sql_fetch_row())) { *size = str_to_int64(row[0]); *count = str_to_int64(row[1]); } @@ -623,15 +647,15 @@ void Bvfs::fv_compute_size_and_count(int64_t pathid, int64_t *size, int64_t *cou " WHERE PPathId = %lld " " AND JobId = %s ", pathid, jobids); - QUERY_DB(jcr, db, db->cmd); - int num = sql_num_rows(db); + db->QueryDB(jcr, db->cmd); + int num = db->sql_num_rows(); if (num > 0) { int64_t *result = (int64_t *)malloc (num * sizeof(int64_t)); SQL_ROW row; int i=0; - while((row = sql_fetch_row(db))) { + while((row = db->sql_fetch_row())) { result[i++] = str_to_int64(row[0]); /* PathId */ } @@ -658,23 +682,23 @@ void Bvfs::fv_update_size_and_count(int64_t pathid, int64_t size, int64_t count) " WHERE JobId = %s " " AND PathId = %lld ", count, size, jobids, pathid); - UPDATE_DB(jcr, db, db->cmd); + db->UpdateDB(jcr, db->cmd); } -void bvfs_update_cache(JCR *jcr, B_DB *mdb) +void bvfs_update_cache(JCR *jcr, BDB *mdb) { uint32_t nb=0; db_list_ctx jobids_list; - db_lock(mdb); + mdb->bdb_lock(); #ifdef xxx /* TODO: Remove this code when updating make_bacula_table script */ Mmsg(mdb->cmd, "SELECT 1 FROM Job WHERE HasCache<>2 LIMIT 1"); - if (!QUERY_DB(jcr, mdb, mdb->cmd)) { + if (!mdb->QueryDB(jcr, mdb->cmd)) { Dmsg0(dbglevel, "Creating cache table\n"); Mmsg(mdb->cmd, "ALTER TABLE Job ADD HasCache int DEFAULT 0"); - QUERY_DB(jcr, mdb, mdb->cmd); + mdb->QueryDB(jcr, mdb->cmd); Mmsg(mdb->cmd, "CREATE TABLE PathHierarchy ( " @@ -682,12 +706,12 @@ void bvfs_update_cache(JCR *jcr, B_DB *mdb) "PPathId integer NOT NULL, " "CONSTRAINT pathhierarchy_pkey " "PRIMARY KEY (PathId))"); - QUERY_DB(jcr, mdb, mdb->cmd); + mdb->QueryDB(jcr, mdb->cmd); Mmsg(mdb->cmd, "CREATE INDEX pathhierarchy_ppathid " "ON PathHierarchy (PPathId)"); - QUERY_DB(jcr, mdb, mdb->cmd); + mdb->QueryDB(jcr, mdb->cmd); Mmsg(mdb->cmd, "CREATE TABLE PathVisibility (" @@ -697,12 +721,12 @@ void bvfs_update_cache(JCR *jcr, B_DB *mdb) "Files int4 DEFAULT 0, " "CONSTRAINT pathvisibility_pkey " "PRIMARY KEY (JobId, PathId))"); - QUERY_DB(jcr, mdb, mdb->cmd); + mdb->QueryDB(jcr, mdb->cmd); Mmsg(mdb->cmd, "CREATE INDEX pathvisibility_jobid " "ON PathVisibility (JobId)"); - QUERY_DB(jcr, mdb, mdb->cmd); + mdb->QueryDB(jcr, mdb->cmd); } #endif @@ -713,28 +737,28 @@ void bvfs_update_cache(JCR *jcr, B_DB *mdb) "AND Type IN ('B') AND JobStatus IN ('T', 'f', 'A') " "ORDER BY JobId"); - db_sql_query(mdb, mdb->cmd, db_list_handler, &jobids_list); + mdb->bdb_sql_query(mdb->cmd, db_list_handler, &jobids_list); bvfs_update_path_hierarchy_cache(jcr, mdb, jobids_list.list); - db_start_transaction(jcr, mdb); + mdb->bdb_start_transaction(jcr); Dmsg0(dbglevel, "Cleaning pathvisibility\n"); Mmsg(mdb->cmd, "DELETE FROM PathVisibility " "WHERE NOT EXISTS " "(SELECT 1 FROM Job WHERE JobId=PathVisibility.JobId)"); - nb = DELETE_DB(jcr, mdb, mdb->cmd); + nb = mdb->DeleteDB(jcr, mdb->cmd); Dmsg1(dbglevel, "Affected row(s) = %d\n", nb); - db_end_transaction(jcr, mdb); - db_unlock(mdb); + mdb->bdb_end_transaction(jcr); + mdb->bdb_unlock(); } /* * Update the bvfs cache for given jobids (1,2,3,4) */ int -bvfs_update_path_hierarchy_cache(JCR *jcr, B_DB *mdb, char *jobids) +bvfs_update_path_hierarchy_cache(JCR *jcr, BDB *mdb, char *jobids) { pathid_cache ppathid_cache; JobId_t JobId; @@ -744,7 +768,8 @@ bvfs_update_path_hierarchy_cache(JCR *jcr, B_DB *mdb, char *jobids) for (p=jobids; ; ) { int stat = get_next_jobid_from_list(&p, &JobId); if (stat < 0) { - return 0; + ret = 0; + break; } if (stat == 0) { break; @@ -761,7 +786,7 @@ bvfs_update_path_hierarchy_cache(JCR *jcr, B_DB *mdb, char *jobids) * Update the bvfs fileview for given jobids */ void -bvfs_update_fv_cache(JCR *jcr, B_DB *mdb, char *jobids) +bvfs_update_fv_cache(JCR *jcr, BDB *mdb, char *jobids) { char *p; JobId_t JobId; @@ -796,9 +821,9 @@ bool Bvfs::ch_dir(const char *path) { pm_strcpy(db->path, path); db->pnl = strlen(db->path); - db_lock(db); - ch_dir(db_get_path_record(jcr, db)); - db_unlock(db); + db->bdb_lock(); + ch_dir(db->bdb_get_path_record(jcr)); + db->bdb_unlock(); return pwd_id != 0; } @@ -806,7 +831,7 @@ bool Bvfs::ch_dir(const char *path) * Get all file versions for a specified client * TODO: Handle basejobs using different client */ -void Bvfs::get_all_file_versions(DBId_t pathid, DBId_t fnid, const char *client) +void Bvfs::get_all_file_versions(DBId_t pathid, FileId_t fnid, const char *client) { Dmsg3(dbglevel, "get_all_file_versions(%lld, %lld, %s)\n", (uint64_t)pathid, (uint64_t)fnid, client); @@ -820,7 +845,7 @@ void Bvfs::get_all_file_versions(DBId_t pathid, DBId_t fnid, const char *client) POOL_MEM query; - Mmsg(query,// 1 2 3 + Mmsg(query,// 1 2 3 "SELECT 'V', File.PathId, File.FilenameId, File.Md5, " // 4 5 6 "File.JobId, File.LStat, File.FileId, " @@ -840,13 +865,13 @@ void Bvfs::get_all_file_versions(DBId_t pathid, DBId_t fnid, const char *client) ,edit_uint64(fnid, ed1), edit_uint64(pathid, ed2), client, q.c_str(), limit, offset); Dmsg1(dbglevel_sql, "q=%s\n", query.c_str()); - db_sql_query(db, query.c_str(), list_entries, user_data); + db->bdb_sql_query(query.c_str(), list_entries, user_data); } /* * Get all volumes for a specific file */ -void Bvfs::get_volumes(DBId_t fileid) +void Bvfs::get_volumes(FileId_t fileid) { Dmsg1(dbglevel, "get_volumes(%lld)\n", (uint64_t)fileid); @@ -854,25 +879,25 @@ void Bvfs::get_volumes(DBId_t fileid) POOL_MEM query; Mmsg(query, -// 7 8 -"SELECT 'L',0,0,0,0,0,0, Media.VolumeName, Media.InChanger " +// 7 8 +"SELECT DISTINCT 'L',0,0,0,0,0,0, Media.VolumeName, Media.InChanger " "FROM File JOIN JobMedia USING (JobId) JOIN Media USING (MediaId) " "WHERE File.FileId = %s " "AND File.FileIndex >= JobMedia.FirstIndex " "AND File.FileIndex <= JobMedia.LastIndex " - " ORDER BY JobMediaId LIMIT %d OFFSET %d" + " LIMIT %d OFFSET %d" ,edit_uint64(fileid, ed1), limit, offset); Dmsg1(dbglevel_sql, "q=%s\n", query.c_str()); - db_sql_query(db, query.c_str(), list_entries, user_data); + db->bdb_sql_query(query.c_str(), list_entries, user_data); } DBId_t Bvfs::get_root() { int p; *db->path = 0; - db_lock(db); - p = db_get_path_record(jcr, db); - db_unlock(db); + db->bdb_lock(); + p = db->bdb_get_path_record(jcr); + db->bdb_unlock(); return p; } @@ -933,7 +958,7 @@ void Bvfs::ls_special_dirs() query.c_str(), edit_uint64(dir_filenameid, ed2), jobids); Dmsg1(dbglevel_sql, "q=%s\n", query2.c_str()); - db_sql_query(db, query2.c_str(), path_handler, this); + db->bdb_sql_query(query2.c_str(), path_handler, this); } /* Returns true if we have dirs to read */ @@ -949,7 +974,7 @@ bool Bvfs::ls_dirs() POOL_MEM filter; if (*pattern) { Mmsg(filter, " AND Path2.Path %s '%s' ", - match_query[db_get_type_index(db)], pattern); + match_query[db->bdb_get_type_index()], pattern); } @@ -1002,24 +1027,24 @@ bool Bvfs::ls_dirs() Dmsg1(dbglevel_sql, "q=%s\n", query.c_str()); - db_lock(db); - db_sql_query(db, query.c_str(), path_handler, this); - nb_record = sql_num_rows(db); - db_unlock(db); + db->bdb_lock(); + db->bdb_sql_query(query.c_str(), path_handler, this); + nb_record = db->sql_num_rows(); + db->bdb_unlock(); return nb_record == limit; } -void build_ls_files_query(B_DB *db, POOL_MEM &query, +void build_ls_files_query(BDB *db, POOL_MEM &query, const char *JobId, const char *PathId, const char *filter, int64_t limit, int64_t offset) { - if (db_get_type_index(db) == SQL_TYPE_POSTGRESQL) { - Mmsg(query, sql_bvfs_list_files[db_get_type_index(db)], + if (db->bdb_get_type_index() == SQL_TYPE_POSTGRESQL) { + Mmsg(query, sql_bvfs_list_files[db->bdb_get_type_index()], JobId, PathId, JobId, PathId, filter, limit, offset); } else { - Mmsg(query, sql_bvfs_list_files[db_get_type_index(db)], + Mmsg(query, sql_bvfs_list_files[db->bdb_get_type_index()], JobId, PathId, JobId, PathId, limit, offset, filter, JobId, JobId); } @@ -1043,7 +1068,7 @@ bool Bvfs::ls_files() edit_uint64(pwd_id, pathid); if (*pattern) { - Mmsg(filter, " AND Filename.Name %s '%s' ", + Mmsg(filter, " AND Filename.Name %s '%s' ", match_query[db_get_type_index(db)], pattern); } else if (*filename) { @@ -1056,10 +1081,10 @@ bool Bvfs::ls_files() Dmsg1(dbglevel_sql, "q=%s\n", query.c_str()); - db_lock(db); - db_sql_query(db, query.c_str(), list_entries, user_data); - nb_record = sql_num_rows(db); - db_unlock(db); + db->bdb_lock(); + db->bdb_sql_query(query.c_str(), list_entries, user_data); + nb_record = db->sql_num_rows(); + db->bdb_unlock(); return nb_record == limit; } @@ -1121,11 +1146,11 @@ static bool check_temp(char *output_table) void Bvfs::clear_cache() { - db_sql_query(db, "BEGIN", NULL, NULL); - db_sql_query(db, "UPDATE Job SET HasCache=0", NULL, NULL); - db_sql_query(db, "TRUNCATE PathHierarchy", NULL, NULL); - db_sql_query(db, "TRUNCATE PathVisibility", NULL, NULL); - db_sql_query(db, "COMMIT", NULL, NULL); + db->bdb_sql_query("BEGIN", NULL, NULL); + db->bdb_sql_query("UPDATE Job SET HasCache=0", NULL, NULL); + db->bdb_sql_query("TRUNCATE PathHierarchy", NULL, NULL); + db->bdb_sql_query("TRUNCATE PathVisibility", NULL, NULL); + db->bdb_sql_query("COMMIT", NULL, NULL); } bool Bvfs::drop_restore_list(char *output_table) @@ -1133,7 +1158,7 @@ bool Bvfs::drop_restore_list(char *output_table) POOL_MEM query; if (check_temp(output_table)) { Mmsg(query, "DROP TABLE %s", output_table); - db_sql_query(db, query.c_str(), NULL, NULL); + db->bdb_sql_query(query.c_str(), NULL, NULL); return true; } return false; @@ -1145,6 +1170,7 @@ bool Bvfs::compute_restore_list(char *fileid, char *dirid, char *hardlink, POOL_MEM query; POOL_MEM tmp, tmp2; int64_t id, jobid, prev_jobid; + int num; bool init=false; bool ret=false; /* check args */ @@ -1159,14 +1185,14 @@ bool Bvfs::compute_restore_list(char *fileid, char *dirid, char *hardlink, return false; } - db_lock(db); + db->bdb_lock(); /* Cleanup old tables first */ Mmsg(query, "DROP TABLE btemp%s", output_table); - db_sql_query(db, query.c_str()); + db->bdb_sql_query(query.c_str()); Mmsg(query, "DROP TABLE %s", output_table); - db_sql_query(db, query.c_str()); + db->bdb_sql_query(query.c_str()); Mmsg(query, "CREATE TABLE btemp%s AS ", output_table); @@ -1183,7 +1209,7 @@ bool Bvfs::compute_restore_list(char *fileid, char *dirid, char *hardlink, while (get_next_id_from_list(&dirid, &id) == 1) { Mmsg(tmp, "SELECT Path FROM Path WHERE PathId=%lld", id); - if (!db_sql_query(db, tmp.c_str(), get_path_handler, (void *)&tmp2)) { + if (!db->bdb_sql_query(tmp.c_str(), get_path_handler, (void *)&tmp2)) { Dmsg0(dbglevel, "Can't search for path\n"); /* print error */ goto bail_out; @@ -1209,7 +1235,7 @@ bool Bvfs::compute_restore_list(char *fileid, char *dirid, char *hardlink, size_t len = strlen(tmp.c_str()); tmp2.check_size((len+1) * 2); - db_escape_string(jcr, db, tmp2.c_str(), tmp.c_str(), len); + db->bdb_escape_string(jcr, tmp2.c_str(), tmp.c_str(), len); if (init) { query.strcat(" UNION "); @@ -1271,41 +1297,135 @@ bool Bvfs::compute_restore_list(char *fileid, char *dirid, char *hardlink, init = true; } - Dmsg1(dbglevel_sql, "q=%s\n", query.c_str()); + Dmsg1(dbglevel_sql, "query=%s\n", query.c_str()); - if (!db_sql_query(db, query.c_str(), NULL, NULL)) { - Dmsg0(dbglevel, "Can't execute q\n"); + if (!db->bdb_sql_query(query.c_str(), NULL, NULL)) { + Dmsg1(dbglevel, "Can't execute query=%s\n", query.c_str()); goto bail_out; } - Mmsg(query, sql_bvfs_select[db_get_type_index(db)], + Mmsg(query, sql_bvfs_select[db->bdb_get_type_index()], output_table, output_table, output_table); /* TODO: handle jobid filter */ - Dmsg1(dbglevel_sql, "q=%s\n", query.c_str()); - if (!db_sql_query(db, query.c_str(), NULL, NULL)) { - Dmsg0(dbglevel, "Can't execute q\n"); + Dmsg1(dbglevel_sql, "query=%s\n", query.c_str()); + if (!db->bdb_sql_query(query.c_str(), NULL, NULL)) { + Dmsg1(dbglevel, "Can't execute query=%s\n", query.c_str()); goto bail_out; } - /* MySQL need it */ - if (db_get_type_index(db) == SQL_TYPE_MYSQL) { + /* MySQL needs the index */ + if (db->bdb_get_type_index() == SQL_TYPE_MYSQL) { Mmsg(query, "CREATE INDEX idx_%s ON %s (JobId)", output_table, output_table); - Dmsg1(dbglevel_sql, "q=%s\n", query.c_str()); - if (!db_sql_query(db, query.c_str(), NULL, NULL)) { - Dmsg0(dbglevel, "Can't execute q\n"); - goto bail_out; + Dmsg1(dbglevel_sql, "query=%s\n", query.c_str()); + if (!db->bdb_sql_query(query.c_str(), NULL, NULL)) { + Dmsg1(dbglevel, "Can't execute query=%s\n", query.c_str()); + goto bail_out; + } + } + + /* Check if some FileId have DeltaSeq > 0 + * Foreach of them we need to get the accurate_job list, and compute + * what are dependencies + */ + Mmsg(query, + "SELECT F.FileId, F.JobId, F.FilenameId, F.PathId, F.DeltaSeq " + "FROM File AS F JOIN Job USING (JobId) JOIN %s USING (FileId) " + "WHERE DeltaSeq > 0", output_table); + + if (!db->QueryDB(jcr, query.c_str())) { + Dmsg1(dbglevel_sql, "Can't execute query=%s\n", query.c_str()); + } + + /* TODO: Use an other DB connection can avoid to copy the result of the + * previous query into a temporary buffer + */ + num = db->sql_num_rows(); + Dmsg2(dbglevel, "Found %d Delta parts in restore selection q=%s\n", num, query.c_str()); + + if (num > 0) { + int64_t *result = (int64_t *)malloc (num * 4 * sizeof(int64_t)); + SQL_ROW row; + int i=0; + + while((row = db->sql_fetch_row())) { + result[i++] = str_to_int64(row[0]); /* FileId */ + result[i++] = str_to_int64(row[1]); /* JobId */ + result[i++] = str_to_int64(row[2]); /* FilenameId */ + result[i++] = str_to_int64(row[3]); /* PathId */ } + + i=0; + while (num > 0) { + insert_missing_delta(output_table, result + i); + i += 4; + num--; + } + free(result); } ret = true; bail_out: Mmsg(query, "DROP TABLE btemp%s", output_table); - db_sql_query(db, query.c_str(), NULL, NULL); - db_unlock(db); + db->bdb_sql_query(query.c_str(), NULL, NULL); + db->bdb_unlock(); return ret; } + +void Bvfs::insert_missing_delta(char *output_table, int64_t *res) +{ + char ed1[50], ed2[50]; + db_list_ctx lst; + POOL_MEM query; + JOB_DBR jr, jr2; + memset(&jr, 0, sizeof(jr)); + memset(&jr2, 0, sizeof(jr2)); + + /* Need to limit the query to StartTime, Client/Fileset */ + jr2.JobId = res[1]; + db->bdb_get_job_record(jcr, &jr2); + + jr.JobId = res[1]; + jr.ClientId = jr2.ClientId; + jr.FileSetId = jr2.FileSetId; + jr.JobLevel = L_INCREMENTAL; + jr.StartTime = jr2.StartTime; + + /* Get accurate jobid list */ + db->bdb_get_accurate_jobids(jcr, &jr, &lst); + + Dmsg2(dbglevel_sql, "JobId list for %lld is %s\n", res[0], lst.list); + + /* The list contains already the last DeltaSeq element, so + * we don't need to select it in the next query + */ + for (int l = strlen(lst.list); l > 0; l--) { + if (lst.list[l] == ',') { + lst.list[l] = '\0'; + break; + } + } + + Dmsg1(dbglevel_sql, "JobId list after strip is %s\n", lst.list); + + edit_int64(res[2], ed1); /* fnid */ + edit_int64(res[3], ed2); /* pathid */ + + int id=db->bdb_get_type_index(); + Mmsg(query, bvfs_select_delta_version_with_basejob_and_delta[id], + lst.list, ed1, ed2, + lst.list, ed1, ed2, + lst.list, lst.list); + + Mmsg(db->cmd, "INSERT INTO %s " + "SELECT JobId, FileIndex, FileId FROM (%s) AS F1", + output_table, query.c_str()); + + if (!db->bdb_sql_query(db->cmd, NULL, NULL)) { + Dmsg1(dbglevel_sql, "Can't exec q=%s\n", db->cmd); + } +} #endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL */ diff --git a/bacula/src/cats/bvfs.h b/bacula/src/cats/bvfs.h index d5532f4295..7f792ace00 100644 --- a/bacula/src/cats/bvfs.h +++ b/bacula/src/cats/bvfs.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ @@ -40,7 +44,7 @@ typedef enum { typedef enum { BVFS_Type = 0, /* Could be D, F, V, L */ - BVFS_PathId = 1, + BVFS_PathId = 1, BVFS_FilenameId = 2, BVFS_Name = 3, @@ -58,7 +62,7 @@ typedef enum { class Bvfs { public: - Bvfs(JCR *j, B_DB *mdb); + Bvfs(JCR *j, BDB *mdb); virtual ~Bvfs(); void set_jobid(JobId_t id); @@ -79,13 +83,13 @@ public: void set_pattern(char *p) { uint32_t len = strlen(p); pattern = check_pool_memory_size(pattern, len*2+1); - db_escape_string(jcr, db, pattern, p, len); + db->bdb_escape_string(jcr, pattern, p, len); } void set_filename(char *p) { uint32_t len = strlen(p); filename = check_pool_memory_size(filename, len*2+1); - db_escape_string(jcr, db, filename, p, len); + db->bdb_escape_string(jcr, filename, p, len); } /* Get the root point */ @@ -107,7 +111,7 @@ public: bool ls_files(); /* Returns true if we have more files to read */ bool ls_dirs(); /* Returns true if we have more dir to read */ void ls_special_dirs(); /* get . and .. */ - void get_all_file_versions(DBId_t pathid, DBId_t fnid, const char *client); + void get_all_file_versions(DBId_t pathid, FileId_t fnid, const char *client); void update_cache(); @@ -195,16 +199,17 @@ public: int _handle_path(void *, int, char **); /* Handle Delta parts if any */ + void insert_missing_delta(char *output_table, int64_t *res); /* Get a list of volumes */ - void get_volumes(DBId_t fileid); + void get_volumes(FileId_t fileid); private: Bvfs(const Bvfs &); /* prohibit pass by value */ Bvfs & operator = (const Bvfs &); /* prohibit class assignment */ JCR *jcr; - B_DB *db; + BDB *db; POOLMEM *jobids; char *username; /* Used with Bweb */ @@ -250,11 +255,10 @@ private: #define bvfs_is_version(row) ((row)[BVFS_Type][0] == BVFS_FILE_VERSION) #define bvfs_is_volume_list(row) ((row)[BVFS_Type][0] == BVFS_VOLUME_LIST) -void bvfs_update_fv_cache(JCR *jcr, B_DB *mdb, char *jobids); -int bvfs_update_path_hierarchy_cache(JCR *jcr, B_DB *mdb, char *jobids); -void bvfs_update_cache(JCR *jcr, B_DB *mdb); +void bvfs_update_fv_cache(JCR *jcr, BDB *mdb, char *jobids); +int bvfs_update_path_hierarchy_cache(JCR *jcr, BDB *mdb, char *jobids); +void bvfs_update_cache(JCR *jcr, BDB *mdb); char *bvfs_parent_dir(char *path); -extern const char *bvfs_select_delta_version_with_basejob_and_delta[]; /* Return the basename of the with the trailing / (update the given string) * TODO: see in the rest of bacula if we don't have diff --git a/bacula/src/cats/cats.c b/bacula/src/cats/cats.c index c3c26df9ef..4d189d01ce 100644 --- a/bacula/src/cats/cats.c +++ b/bacula/src/cats/cats.c @@ -1,134 +1,150 @@ -/* - Bacula® - The Network Backup Solution +/* + Bacula(R) - The Network Backup Solution - Copyright (C) 2011-2014 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ -/* - * Generic catalog class methods. - * - * Written by Marco van Wieringen, January 2011 - */ - -#include "bacula.h" - -#if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL - -#include "cats.h" -#include "bdb_priv.h" -#include "sql_glue.h" - -bool B_DB::db_match_database(const char *db_driver, const char *db_name, - const char *db_address, int db_port) -{ - bool match; - - if (db_driver) { - match = strcasecmp(m_db_driver, db_driver) == 0 && - bstrcmp(m_db_name, db_name) && - bstrcmp(m_db_address, db_address) && - m_db_port == db_port && - m_dedicated == false; - } else { - match = bstrcmp(m_db_name, db_name) && - bstrcmp(m_db_address, db_address) && - m_db_port == db_port && - m_dedicated == false; - } - return match; -} - -B_DB *B_DB::db_clone_database_connection(JCR *jcr, bool mult_db_connections) -{ - /* - * See if its a simple clone e.g. with mult_db_connections set to false - * then we just return the calling class pointer. - */ - if (!mult_db_connections) { - m_ref_count++; - return this; - } - - /* - * A bit more to do here just open a new session to the database. - */ - return db_init_database(jcr, m_db_driver, m_db_name, m_db_user, m_db_password, - m_db_address, m_db_port, m_db_socket, true, m_disabled_batch_insert); -} - -const char *B_DB::db_get_type(void) -{ - switch (m_db_interface_type) { - case SQL_INTERFACE_TYPE_MYSQL: - return "MySQL"; - case SQL_INTERFACE_TYPE_POSTGRESQL: - return "PostgreSQL"; - case SQL_INTERFACE_TYPE_SQLITE3: - return "SQLite3"; - default: - return "Unknown"; - } -} - -/* - * Lock database, this can be called multiple times by the same - * thread without blocking, but must be unlocked the number of - * times it was locked using db_unlock(). - */ -void B_DB::_db_lock(const char *file, int line) -{ - int errstat; - - if ((errstat = rwl_writelock_p(&m_lock, file, line)) != 0) { - berrno be; - e_msg(file, line, M_FATAL, 0, "rwl_writelock failure. stat=%d: ERR=%s\n", - errstat, be.bstrerror(errstat)); - } -} - -/* - * Unlock the database. This can be called multiple times by the - * same thread up to the number of times that thread called - * db_lock()/ - */ -void B_DB::_db_unlock(const char *file, int line) -{ - int errstat; - - if ((errstat = rwl_writeunlock(&m_lock)) != 0) { - berrno be; - e_msg(file, line, M_FATAL, 0, "rwl_writeunlock failure. stat=%d: ERR=%s\n", - errstat, be.bstrerror(errstat)); - } -} - -bool B_DB::db_sql_query(const char *query, int flags) -{ - bool retval; - - db_lock(this); - retval = ((B_DB_PRIV *)this)->sql_query(query, flags); - if (!retval) { - Mmsg(errmsg, _("Query failed: %s: ERR=%s\n"), query, ((B_DB_PRIV *)this)->sql_strerror()); - } - db_unlock(this); - return retval; -} - -void B_DB::print_lock_info(FILE *fp) -{ - if (m_lock.valid == RWLOCK_VALID) { - fprintf(fp, "\tRWLOCK=%p w_active=%i w_wait=%i\n", &m_lock, m_lock.w_active, m_lock.w_wait); - } -} - -#endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL */ + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. +*/ +/* + * Generic catalog class methods. + * + * Note: at one point, this file was assembled from parts of other files + * by a programmer, and other than "wrapping" in a class, which is a trivial + * change for a C++ programmer, nothing substantial was done, yet all the + * code was recommitted under this programmer's name. Consequently, we + * undo those changes here. + */ + +#include "bacula.h" + +#if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL + +#include "cats.h" + +bool BDB::bdb_match_database(const char *db_driver, const char *db_name, + const char *db_address, int db_port) +{ + BDB *mdb = this; + bool match; + + if (db_driver) { + match = strcasecmp(mdb->m_db_driver, db_driver) == 0 && + bstrcmp(mdb->m_db_name, db_name) && + bstrcmp(mdb->m_db_address, db_address) && + mdb->m_db_port == db_port && + mdb->m_dedicated == false; + } else { + match = bstrcmp(mdb->m_db_name, db_name) && + bstrcmp(mdb->m_db_address, db_address) && + mdb->m_db_port == db_port && + mdb->m_dedicated == false; + } + return match; +} + +BDB *BDB::bdb_clone_database_connection(JCR *jcr, bool mult_db_connections) +{ + BDB *mdb = this; + /* + * See if its a simple clone e.g. with mult_db_connections set to false + * then we just return the calling class pointer. + */ + if (!mult_db_connections) { + mdb->m_ref_count++; + return mdb; + } + + /* + * A bit more to do here just open a new session to the database. + */ + return db_init_database(jcr, mdb->m_db_driver, mdb->m_db_name, + mdb->m_db_user, mdb->m_db_password, mdb->m_db_address, + mdb->m_db_port, mdb->m_db_socket, true, + mdb->m_disabled_batch_insert); +} + +const char *BDB::bdb_get_engine_name(void) +{ + BDB *mdb = this; + switch (mdb->m_db_driver_type) { + case SQL_DRIVER_TYPE_MYSQL: + return "MySQL"; + case SQL_DRIVER_TYPE_POSTGRESQL: + return "PostgreSQL"; + case SQL_DRIVER_TYPE_SQLITE3: + return "SQLite3"; + default: + return "Unknown"; + } +} + +/* + * Lock database, this can be called multiple times by the same + * thread without blocking, but must be unlocked the number of + * times it was locked using db_unlock(). + */ +void BDB::bdb_lock(const char *file, int line) +{ + int errstat; + BDB *mdb = this; + + if ((errstat = rwl_writelock_p(&mdb->m_lock, file, line)) != 0) { + berrno be; + e_msg(file, line, M_FATAL, 0, "rwl_writelock failure. stat=%d: ERR=%s\n", + errstat, be.bstrerror(errstat)); + } +} + +/* + * Unlock the database. This can be called multiple times by the + * same thread up to the number of times that thread called + * db_lock()/ + */ +void BDB::bdb_unlock(const char *file, int line) +{ + int errstat; + BDB *mdb = this; + + if ((errstat = rwl_writeunlock(&mdb->m_lock)) != 0) { + berrno be; + e_msg(file, line, M_FATAL, 0, "rwl_writeunlock failure. stat=%d: ERR=%s\n", + errstat, be.bstrerror(errstat)); + } +} + +bool BDB::bdb_sql_query(const char *query, int flags) +{ + bool retval; + BDB *mdb = this; + + bdb_lock(); + retval = sql_query(query, flags); + if (!retval) { + Mmsg(mdb->errmsg, _("Query failed: %s: ERR=%s\n"), query, sql_strerror()); + } + bdb_unlock(); + return retval; +} + +void BDB::print_lock_info(FILE *fp) +{ + BDB *mdb = this; + if (mdb->m_lock.valid == RWLOCK_VALID) { + fprintf(fp, "\tRWLOCK=%p w_active=%i w_wait=%i\n", + &mdb->m_lock, mdb->m_lock.w_active, mdb->m_lock.w_wait); + } +} + +#endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL */ diff --git a/bacula/src/cats/cats.h b/bacula/src/cats/cats.h index cc2d8d8b2b..f1ee5dc6b5 100644 --- a/bacula/src/cats/cats.h +++ b/bacula/src/cats/cats.h @@ -1,27 +1,34 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * Catalog header file + * Catalog DB header file * - * Written by Kern E. Sibbald + * Written by Kern E. Sibbald * - * Anyone who accesses the database will need to include - * this file. + * Anyone who accesses the database will need to include + * this file. */ +#ifndef __CATS_H_ +#define __CATS_H_ 1 + /* Here is how database versions work. @@ -40,8 +47,28 @@ will be copied to the updatedb directory with the correct name (in the present case 8 to 9). */ -#ifndef __CATS_H_ -#define __CATS_H_ 1 + +/* Current database version number for all drivers */ +#define BDB_VERSION 15 + +typedef void (DB_LIST_HANDLER)(void *, const char *); +typedef int (DB_RESULT_HANDLER)(void *, int, char **); + +/* What kind of database we have */ +typedef enum { + SQL_TYPE_MYSQL = 0, + SQL_TYPE_POSTGRESQL = 1, + SQL_TYPE_SQLITE3 = 2, + SQL_TYPE_UNKNOWN = 99 +} SQL_DBTYPE; + +/* What kind of driver we have */ +typedef enum { + SQL_DRIVER_TYPE_MYSQL = 0, + SQL_DRIVER_TYPE_POSTGRESQL = 1, + SQL_DRIVER_TYPE_SQLITE3 = 2, +} SQL_DRIVER; + /* ============================================================== * @@ -52,6 +79,22 @@ #define faddr_t long +/* + * Generic definition of a sql_row. + */ +typedef char **SQL_ROW; + +/* + * Generic definition of a a sql_field. + */ +typedef struct sql_field { + char *name; /* name of column */ + int max_length; /* max length */ + uint32_t type; /* type */ + uint32_t flags; /* flags */ +} SQL_FIELD; + + /* * Structure used when calling db_get_query_ids() * allows the subroutine to return a list of ids. @@ -135,7 +178,6 @@ struct JOBMEDIA_DBR { uint32_t EndFile; /* End file on Volume */ uint32_t StartBlock; /* start block on tape */ uint32_t EndBlock; /* last block */ -// uint32_t Copy; /* identical copy */ }; @@ -151,8 +193,6 @@ struct VOL_PARAMS { uint64_t StartAddr; /* Start address */ uint64_t EndAddr; /* End address */ int32_t InChanger; /* InChanger flag */ -// uint32_t Copy; /* identical copy */ -// uint32_t Stripe; /* RAIT strip number */ }; @@ -181,6 +221,7 @@ struct ROBJECT_DBR { char *object_name; char *object; char *plugin_name; + char *JobIds; uint32_t object_len; uint32_t object_full_len; uint32_t object_index; @@ -268,7 +309,6 @@ public: int ReadOnly; /* Set if read-only */ }; - /* Media record -- same as the database */ class MEDIA_DBR { public: @@ -291,10 +331,13 @@ public: uint32_t VolBlocks; /* Number of blocks */ uint32_t VolMounts; /* Number of times mounted */ uint32_t VolErrors; /* Number of read/write errors */ - uint32_t VolWrites; /* Number of writes */ - uint32_t VolReads; /* Number of reads */ + uint64_t VolWrites; /* Number of writes */ + uint64_t VolReads; /* Number of reads */ uint64_t VolBytes; /* Number of bytes written */ - uint32_t VolParts; /* Number of parts written */ + uint64_t VolABytes; /* Size of aligned volume */ + uint64_t VolHoleBytes; /* The size of Holes */ + uint32_t VolHoles; /* Number of holes */ + uint32_t VolType; /* Device type of where Volume labeled */ uint64_t MaxVolBytes; /* Max bytes to write to Volume */ uint64_t VolCapacityBytes; /* capacity estimate */ uint64_t VolReadTime; /* time spent reading volume */ @@ -364,6 +407,92 @@ struct FILESET_DBR { bool created; /* set when record newly created */ }; +class SNAPSHOT_DBR { +public: + SNAPSHOT_DBR() { + memset(this, 0, sizeof(SNAPSHOT_DBR)); + }; + ~SNAPSHOT_DBR() { + reset(); + }; + void debug(int level) { + Dmsg8(DT_SNAPSHOT|level, + "Snapshot %s:\n" + " Volume: %s\n" + " Device: %s\n" + " Id: %d\n" + " FileSet: %s\n" + " CreateDate: %s\n" + " Client: %s\n" + " Type: %s\n", + Name, NPRT(Volume), NPRT(Device), SnapshotId, + FileSet, CreateDate, Client, Type); + }; + char *as_arg(POOLMEM **out) { + bash_spaces(Name); + bash_spaces(Type); + + if (Volume) { + bash_spaces(Volume); + } + if (Device) { + bash_spaces(Device); + } + + Mmsg(out, "name=%s volume=%s device=%s tdate=%d type=%s", + Name, NPRTB(Volume), NPRTB(Device), CreateTDate, Type); + + unbash_spaces(Name); + unbash_spaces(Type); + if (Volume) { + unbash_spaces(Volume); + } + if (Device) { + unbash_spaces(Device); + } + return *out; + }; + void reset() { + if (need_to_free) { + if (Volume) { + free(Volume); + } + if (Device) { + free(Device); + } + if (errmsg) { + free(errmsg); + } + errmsg = Volume = Device = NULL; + } + need_to_free = false; + }; + bool need_to_free; /* Need to free the internal memory */ + /* Used when searching snapshots */ + char created_after[MAX_TIME_LENGTH]; + char created_before[MAX_TIME_LENGTH]; + bool expired; /* Look for CreateTDate > (NOW - Retention) */ + bool sorted_client; /* Results sorted by Client, SnapshotId */ + int status; /* Status of the snapshot */ + + DBId_t SnapshotId; /* Unique Snapshot ID */ + DBId_t JobId; /* Related JobId */ + DBId_t FileSetId; /* FileSetId if any */ + DBId_t ClientId; /* From which client this snapshot comes */ + char Name[MAX_NAME_LENGTH]; /* Snapshot Name */ + char FileSet[MAX_NAME_LENGTH];/* FileSet name if any */ + char Client[MAX_NAME_LENGTH]; /* Client name */ + char Type[MAX_NAME_LENGTH]; /* zfs, btrfs, lvm, netapp, */ + char Comment[MAX_NAME_LENGTH];/* Comment */ + char CreateDate[MAX_TIME_LENGTH]; /* Create date as string */ + time_t CreateTDate; /* Create TDate (in sec, since epoch) */ + char *Volume; /* Volume taken in snapshot */ + char *Device; /* Device, Pool, Directory, ... */ + char *errmsg; /* Error associated with a snapshot */ + utime_t Retention; /* Number of second before pruning the snapshot */ + uint64_t Size; /* Snapshot Size */ +}; + /* Call back context for getting a 32/64 bit value from the database */ class db_int64_ctx { public: @@ -409,115 +538,24 @@ private: db_list_ctx &operator=(const db_list_ctx&); /* prohibit class assignment */ }; -typedef enum { - SQL_INTERFACE_TYPE_MYSQL = 0, - SQL_INTERFACE_TYPE_POSTGRESQL = 1, - SQL_INTERFACE_TYPE_SQLITE3 = 2, -} SQL_INTERFACETYPE; - -typedef enum { - SQL_TYPE_MYSQL = 0, - SQL_TYPE_POSTGRESQL = 1, - SQL_TYPE_SQLITE3 = 2, - SQL_TYPE_UNKNOWN = 99 -} SQL_DBTYPE; - -typedef void (DB_LIST_HANDLER)(void *, const char *); -typedef int (DB_RESULT_HANDLER)(void *, int, char **); - -#define db_lock(mdb) mdb->_db_lock(__FILE__, __LINE__) -#define db_unlock(mdb) mdb->_db_unlock(__FILE__, __LINE__) - -/* Current database version number for all drivers */ -#define BDB_VERSION 14 - -class B_DB: public SMARTALLOC { -protected: - brwlock_t m_lock; /* transaction lock */ - dlink m_link; /* queue control */ - SQL_INTERFACETYPE m_db_interface_type; /* type of backend used */ - SQL_DBTYPE m_db_type; /* database type */ - int m_ref_count; /* reference count */ - bool m_connected; /* connection made to db */ - bool m_have_batch_insert; /* have batch insert support ? */ - char *m_db_driver; /* database driver */ - char *m_db_driverdir; /* database driver dir */ - char *m_db_name; /* database name */ - char *m_db_user; /* database user */ - char *m_db_address; /* host name address */ - char *m_db_socket; /* socket for local access */ - char *m_db_password; /* database password */ - int m_db_port; /* port for host name address */ - bool m_disabled_batch_insert; /* explicitly disabled batch insert mode ? */ - bool m_dedicated; /* is this connection dedicated? */ - -public: - POOLMEM *errmsg; /* nicely edited error message */ - POOLMEM *cmd; /* SQL command string */ - POOLMEM *cached_path; /* cached path name */ - int cached_path_len; /* length of cached path */ - uint32_t cached_path_id; /* cached path id */ - int changes; /* changes during transaction */ - POOLMEM *fname; /* Filename only */ - POOLMEM *path; /* Path only */ - POOLMEM *esc_name; /* Escaped file name */ - POOLMEM *esc_path; /* Escaped path name */ - POOLMEM *esc_obj; /* Escaped restore object */ - int fnl; /* file name length */ - int pnl; /* path name length */ - - /* methods */ - B_DB() {}; - virtual ~B_DB() {}; - const char *get_db_name(void) { return m_db_name; }; - const char *get_db_user(void) { return m_db_user; }; - bool is_connected(void) { return m_connected; }; - bool batch_insert_available(void) { return m_have_batch_insert; }; - void increment_refcount(void) { m_ref_count++; }; - - /* low level methods */ - bool db_match_database(const char *db_driver, const char *db_name, - const char *db_address, int db_port); - B_DB *db_clone_database_connection(JCR *jcr, bool mult_db_connections); - int db_get_type_index(void) { return m_db_type; }; - const char *db_get_type(void); - void _db_lock(const char *file, int line); - void _db_unlock(const char *file, int line); - bool db_sql_query(const char *query, int flags=0); - void print_lock_info(FILE *fp); - - /* Pure virtual low level methods */ - virtual bool db_open_database(JCR *jcr) = 0; - virtual void db_close_database(JCR *jcr) = 0; - virtual void db_thread_cleanup(void) = 0; - virtual void db_escape_string(JCR *jcr, char *snew, char *old, int len) = 0; - virtual char *db_escape_object(JCR *jcr, char *old, int len) = 0; - virtual void db_unescape_object(JCR *jcr, char *from, int32_t expected_len, - POOLMEM **dest, int32_t *len) = 0; - virtual void db_start_transaction(JCR *jcr) = 0; - virtual void db_end_transaction(JCR *jcr) = 0; - virtual bool db_sql_query(const char *query, DB_RESULT_HANDLER *result_handler, void *ctx) = 0; - - /* By default, we use db_sql_query */ - virtual bool db_big_sql_query(const char *query, - DB_RESULT_HANDLER *result_handler, void *ctx) { - return db_sql_query(query, result_handler, ctx); - }; -}; - -/* sql_query Query Flags */ +/* sql_query flags */ #define QF_STORE_RESULT 0x01 - -/* Use for better error location printing */ -#define UPDATE_DB(jcr, db, cmd) UpdateDB(__FILE__, __LINE__, jcr, db, cmd) -#define INSERT_DB(jcr, db, cmd) InsertDB(__FILE__, __LINE__, jcr, db, cmd) -#define QUERY_DB(jcr, db, cmd) QueryDB(__FILE__, __LINE__, jcr, db, cmd) -#define DELETE_DB(jcr, db, cmd) DeleteDB(__FILE__, __LINE__, jcr, db, cmd) - + +/* sql_list.c */ +enum e_list_type { + HORZ_LIST, /* list */ + VERT_LIST, /* llist */ + ARG_LIST, /* key1=v1 key2=v2 key3=v3 */ + FAILED_JOBS, + INCOMPLETE_JOBS +}; + +#include "bdb.h" #include "protos.h" #include "jcr.h" #include "sql_cmds.h" + /* Object used in db_list_xxx function */ class LIST_CTX { public: @@ -528,7 +566,7 @@ public: DB_LIST_HANDLER *send; /* send data back */ bool once; /* Used to print header one time */ void *ctx; /* send() user argument */ - B_DB *mdb; + BDB *mdb; JCR *jcr; void empty() { @@ -542,7 +580,7 @@ public: } } - LIST_CTX(JCR *j, B_DB *m, DB_LIST_HANDLER *h, void *c, e_list_type t) { + LIST_CTX(JCR *j, BDB *m, DB_LIST_HANDLER *h, void *c, e_list_type t) { line[0] = '\0'; once = false; num_rows = 0; @@ -554,21 +592,17 @@ public: } }; -/* - * Some functions exported by sql.c for use within the cats directory. - */ +/* Functions exported by sql.c for use within the cats directory. */ int list_result(void *vctx, int cols, char **row); -int list_result(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *send, void *ctx, e_list_type type); -void list_dashes(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx); -int get_sql_record_max(JCR *jcr, B_DB *mdb); -bool check_tables_version(JCR *jcr, B_DB *mdb); -bool db_check_max_connections(JCR *jcr, B_DB *mdb, uint32_t nb); - -void print_dashes(B_DB *mdb); -void print_result(B_DB *mdb); -int QueryDB(const char *file, int line, JCR *jcr, B_DB *db, char *select_cmd); -int InsertDB(const char *file, int line, JCR *jcr, B_DB *db, char *select_cmd); -int DeleteDB(const char *file, int line, JCR *jcr, B_DB *db, char *delete_cmd); -int UpdateDB(const char *file, int line, JCR *jcr, B_DB *db, char *update_cmd); -void split_path_and_file(JCR *jcr, B_DB *mdb, const char *fname); -#endif /* __CATS_H_ */ +int list_result(JCR *jcr, BDB *mdb, DB_LIST_HANDLER *send, void *ctx, e_list_type type); +int get_sql_record_max(JCR *jcr, BDB *mdb); +void list_dashes(BDB *mdb, DB_LIST_HANDLER *send, void *ctx); + +void print_dashes(BDB *mdb); +void print_result(BDB *mdb); +int QueryDB(const char *file, int line, JCR *jcr, BDB *db, char *select_cmd); +int InsertDB(const char *file, int line, JCR *jcr, BDB *db, char *select_cmd); +int DeleteDB(const char *file, int line, JCR *jcr, BDB *db, char *delete_cmd); +void split_path_and_file(JCR *jcr, BDB *mdb, const char *fname); + +#endif /* __CATS_H_ */ diff --git a/bacula/src/cats/cats_dummy.c b/bacula/src/cats/cats_dummy.c deleted file mode 100644 index 99959be042..0000000000 --- a/bacula/src/cats/cats_dummy.c +++ /dev/null @@ -1,29 +0,0 @@ -/* - Bacula® - The Network Backup Solution - - Copyright (C) 2010-2014 Free Software Foundation Europe e.V. - - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. - - You may use this file and others of this release according to the - license defined in the LICENSE file, which includes the Affero General - Public License, v3.0 ("AGPLv3") and some additional permissions and - terms pursuant to its AGPLv3 Section 7. - - Bacula® is a registered trademark of Kern Sibbald. -*/ -/* - * Dummy bacula backend function replaced with the correct one at install time. - */ - -#include "bacula.h" -#include "cats.h" - -B_DB *db_init_database(JCR *jcr, const char *db_driver, const char *db_name, const char *db_user, - const char *db_password, const char *db_address, int db_port, const char *db_socket, - bool mult_db_connections, bool disable_batch_insert) -{ - Jmsg(jcr, M_FATAL, 0, _("Please replace this null libbaccats library with a proper one.\n")); - return NULL; -} diff --git a/bacula/src/cats/cats_null.c b/bacula/src/cats/cats_null.c new file mode 100644 index 0000000000..df00f8eaf1 --- /dev/null +++ b/bacula/src/cats/cats_null.c @@ -0,0 +1,35 @@ +/* + Bacula(R) - The Network Backup Solution + + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2014 Free Software Foundation Europe e.V. + + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. + + You may use this file and others of this release according to the + license defined in the LICENSE file, which includes the Affero General + Public License, v3.0 ("AGPLv3") and some additional permissions and + terms pursuant to its AGPLv3 Section 7. + + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. +*/ +/* + * Null Bacula backend function replaced with the correct one + * at install time. + */ + +#include "bacula.h" +#include "cats.h" + +BDB *db_init_database(JCR *jcr, const char *db_driver, const char *db_name, + const char *db_user, const char *db_password, const char *db_address, + int db_port, const char *db_socket, bool mult_db_connections, + bool disable_batch_insert) +{ + Jmsg(jcr, M_FATAL, 0, _("Please replace this null libbaccats library with a proper one.\n")); + return NULL; +} diff --git a/bacula/src/cats/create_bacula_database.in b/bacula/src/cats/create_bacula_database.in index 7997935af5..08139779a8 100644 --- a/bacula/src/cats/create_bacula_database.in +++ b/bacula/src/cats/create_bacula_database.in @@ -1,11 +1,14 @@ #!/bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # This routine creates the Bacula database # using PostgreSQL, Ingres, MySQL, or SQLite. # -# Author: Kern Sibbald -# License: LGPLv3 -# + +# can be used to change the current user with su +pre_command="sh -c" default_db_type=@DEFAULT_DB_TYPE@ @@ -27,10 +30,6 @@ if [ $# -gt 0 ]; then db_type=$1 shift ;; - ingres) - db_type=$1 - shift - ;; *) ;; esac @@ -43,5 +42,9 @@ if [ -z "${db_type}" ]; then db_type="${default_db_type}" fi +if [ $db_type = postgresql -a "$UID" = 0 ]; then + pre_command="su - postgres -c" +fi + echo "Creating ${db_type} database" -@scriptdir@/create_${db_type}_database $* +$pre_command "@scriptdir@/create_${db_type}_database $*" diff --git a/bacula/src/cats/create_mysql_database.in b/bacula/src/cats/create_mysql_database.in index 9ab1fc070b..123aa0bb40 100644 --- a/bacula/src/cats/create_mysql_database.in +++ b/bacula/src/cats/create_mysql_database.in @@ -1,9 +1,9 @@ #!/bin/sh # -# shell script to create Bacula database(s) +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # -# Author: Kern Sibbald -# License: LGPLv3 +# shell script to create Bacula database(s) # bindir=@MYSQL_BINDIR@ diff --git a/bacula/src/cats/create_postgresql_database.in b/bacula/src/cats/create_postgresql_database.in index 1d19a0527b..a823607b17 100644 --- a/bacula/src/cats/create_postgresql_database.in +++ b/bacula/src/cats/create_postgresql_database.in @@ -1,9 +1,9 @@ #!/bin/sh # -# shell script to create Bacula database(s) +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # -# Author: Kern Sibbald -# License: LGPLv3 +# shell script to create Bacula database(s) # PATH="@POSTGRESQL_BINDIR@:$PATH" @@ -55,7 +55,7 @@ else echo "!!!! Creation of ${db_name} database failed. !!!!" echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" fi -if psql -l ${dbname} $* | grep " ${db_name}.*SQL_ASCII" >/dev/null; then +if psql -l | grep " ${db_name}.*SQL_ASCII" >/dev/null; then echo "Database encoding OK" else echo " " diff --git a/bacula/src/cats/create_sqlite3_database.in b/bacula/src/cats/create_sqlite3_database.in index 7010ff24c7..28a9b55d9b 100644 --- a/bacula/src/cats/create_sqlite3_database.in +++ b/bacula/src/cats/create_sqlite3_database.in @@ -1,9 +1,9 @@ #!/bin/sh # -# shell script to create Bacula SQLite tables +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # -# Author: Kern Sibbald -# License: LGPLv3 +# shell script to create Bacula SQLite tables bindir=@SQLITE_BINDIR@ PATH=$bindir:$PATH @@ -11,9 +11,5 @@ cd @working_dir@ db_name=@db_name@ sqlite3 $* ${db_name}.db <$1.sql ++ echo ".dump" | /opt/bacula/sqlite/sqlite3 $1.db >$1.sql + ;; + mysql) + BINDIR=@MYSQL_BINDIR@ + diff --git a/bacula/src/cats/make_catalog_backup.pl.in b/bacula/src/cats/make_catalog_backup.pl.in index 475285409b..675f176217 100644 --- a/bacula/src/cats/make_catalog_backup.pl.in +++ b/bacula/src/cats/make_catalog_backup.pl.in @@ -1,4 +1,8 @@ #!/usr/bin/env perl +# +# Author: Eric Bollengier, Copyright, 2006 +# License: BSD 2-Clause; see file LICENSE-FOSS + use strict; =head1 SCRIPT @@ -8,27 +12,21 @@ use strict; =head1 USAGE - make_catalog_backup.pl MyCatalog + make_catalog_backup.pl [-m] MyCatalog =head1 LICENSE + Author: Eric Bollengier, 2010 + License: BSD 2-Clause; see file LICENSE-FOSS +=cut - Bacula® - The Network Backup Solution - - Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. - - You may use this file and others of this release according to the - license defined in the LICENSE file, which includes the Affero General - Public License, v3.0 ("AGPLv3") and some additional permissions and - terms pursuant to its AGPLv3 Section 7. - - Bacula® is a registered trademark of Kern Sibbald. +my $cat = shift or die "Usage: $0 [-m] catalogname"; +my $mode = "dump"; -=cut +if ($cat eq '-m') { + $mode = "analyse"; + $cat = shift or die "Usage: $0 [-m] catalogname"; +} -my $cat = shift or die "Usage: $0 catalogname"; my $dir_conf='@sbindir@/dbcheck -B -c @sysconfdir@/bacula-dir.conf'; my $wd = "@working_dir@"; @@ -42,7 +40,7 @@ sub dump_sqlite3 } # TODO: use just ENV and drop the pg_service.conf file -sub dump_pgsql +sub setup_env_pgsql { my %args = @_; umask(0077); @@ -63,53 +61,99 @@ sub dump_pgsql $ENV{PGPASSWORD}=$args{db_password}; } $ENV{PGDATABASE}=$args{db_name}; +} + +sub dump_pgsql +{ + my %args = @_; + setup_env_pgsql(%args); exec("HOME='$wd' pg_dump -c > '$wd/$args{db_name}.sql'"); print "Error while executing postgres dump $!\n"; return 1; # in case of error } -sub dump_mysql +sub analyse_pgsql +{ + my %args = @_; + setup_env_pgsql(%args); + my @output =`LANG=C HOME='$wd' vacuumdb -z 2>&1`; + my $exitcode = $? >> 8; + print grep { !/^WARNING:\s+skipping\s\"(pg_|sql_)/ } @output; + if ($exitcode != 0) { + print "Error while executing postgres analyse. Exitcode=$exitcode\n"; + } + return $exitcode; +} + +sub setup_env_mysql { my %args = @_; umask(0077); unlink("$wd/.my.cnf"); - open(MY, ">$wd/.my.cnf") + open(MY, ">$wd/.my.cnf") or die "Can't open $wd/.my.cnf for writing $@"; $args{db_address} = $args{db_address} || "localhost"; my $addr = "host=$args{db_address}"; if ($args{db_socket}) { # unix socket is fastest than net socket - $addr = "socket=$args{db_socket}"; + $addr = "socket=\"$args{db_socket}\""; } - - print MY "[client] + my $mode = $args{mode} || 'client'; + print MY "[$mode] $addr -user=$args{db_user} -password=$args{db_password} +user=\"$args{db_user}\" +password=\"$args{db_password}\" "; if ($args{db_port}) { - print MY "port=$args{db_port}\n"; + print MY "port=$args{db_port}\n"; } - close(MY); +} + +sub dump_mysql +{ + my %args = @_; + setup_env_mysql(%args); exec("HOME='$wd' mysqldump -f --opt $args{db_name} > '$wd/$args{db_name}.sql'"); print "Error while executing mysql dump $!\n"; return 1; } -sub dump_catalog +sub analyse_mysql { my %args = @_; + + $args{mode} = 'mysqlcheck'; + setup_env_mysql(%args); + + exec("HOME='$wd' mysqlcheck -a $args{db_name}"); + print "Error while executing mysql analyse $!\n"; + return 1; +} + +sub handle_catalog +{ + my ($mode, %args) = @_; if ($args{db_type} eq 'SQLite3') { $ENV{PATH}="@SQLITE_BINDIR@:$ENV{PATH}"; - dump_sqlite3(%args); + if ($mode eq 'dump') { + dump_sqlite3(%args); + } } elsif ($args{db_type} eq 'PostgreSQL') { $ENV{PATH}="@POSTGRESQL_BINDIR@:$ENV{PATH}"; - dump_pgsql(%args); + if ($mode eq 'dump') { + dump_pgsql(%args); + } else { + analyse_pgsql(%args); + } } elsif ($args{db_type} eq 'MySQL') { $ENV{PATH}="@MYSQL_BINDIR@:$ENV{PATH}"; - dump_mysql(%args); + if ($mode eq 'dump') { + dump_mysql(%args); + } else { + analyse_mysql(%args); + } } else { die "This database type isn't supported"; } @@ -131,7 +175,7 @@ while(my $l = ) { if ($l =~ /catalog=(.+)/) { if (exists $cfg{catalog} and $cfg{catalog} eq $cat) { - exit dump_catalog(%cfg); + exit handle_catalog($mode, %cfg); } %cfg = (); # reset } @@ -142,7 +186,7 @@ while(my $l = ) } if (exists $cfg{catalog} and $cfg{catalog} eq $cat) { - exit dump_catalog(%cfg); + exit handle_catalog($mode, %cfg); } print "Can't find your catalog ($cat) in director configuration\n"; diff --git a/bacula/src/cats/make_mysql_tables.in b/bacula/src/cats/make_mysql_tables.in index 16d59a1e0c..788617de31 100644 --- a/bacula/src/cats/make_mysql_tables.in +++ b/bacula/src/cats/make_mysql_tables.in @@ -2,18 +2,19 @@ # # shell script to create Bacula MySQL tables # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # Important note: # You won't get any support for performance issue if you changed the default # schema. # -# Author: Kern Sibbald -# License: LGPLv3 -# bindir=@MYSQL_BINDIR@ PATH="$bindir:$PATH" db_name=${db_name:-@db_name@} -if mysql -D ${db_name} $* -f < -#include - -/* ----------------------------------------------------------------------- - * - * MySQL dependent defines and subroutines - * - * ----------------------------------------------------------------------- - */ - -/* - * List of open databases - */ -static dlist *db_list = NULL; - -static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; - -B_DB_MYSQL::B_DB_MYSQL(JCR *jcr, - const char *db_driver, - const char *db_name, - const char *db_user, - const char *db_password, - const char *db_address, - int db_port, - const char *db_socket, - bool mult_db_connections, - bool disable_batch_insert) -{ - /* - * Initialize the parent class members. - */ - m_db_interface_type = SQL_INTERFACE_TYPE_MYSQL; - m_db_type = SQL_TYPE_MYSQL; - m_db_driver = bstrdup("MySQL"); - m_db_name = bstrdup(db_name); - m_db_user = bstrdup(db_user); - if (db_password) { - m_db_password = bstrdup(db_password); - } - if (db_address) { - m_db_address = bstrdup(db_address); - } - if (db_socket) { - m_db_socket = bstrdup(db_socket); - } - m_db_port = db_port; - - if (disable_batch_insert) { - m_disabled_batch_insert = true; - m_have_batch_insert = false; - } else { - m_disabled_batch_insert = false; -#if defined(USE_BATCH_FILE_INSERT) -# if defined(HAVE_MYSQL_THREAD_SAFE) - m_have_batch_insert = mysql_thread_safe(); -# else - m_have_batch_insert = false; -# endif /* HAVE_MYSQL_THREAD_SAFE */ -#else - m_have_batch_insert = false; -#endif /* USE_BATCH_FILE_INSERT */ - } - errmsg = get_pool_memory(PM_EMSG); /* get error message buffer */ - *errmsg = 0; - cmd = get_pool_memory(PM_EMSG); /* get command buffer */ - cached_path = get_pool_memory(PM_FNAME); - cached_path_id = 0; - m_ref_count = 1; - fname = get_pool_memory(PM_FNAME); - path = get_pool_memory(PM_FNAME); - esc_name = get_pool_memory(PM_FNAME); - esc_path = get_pool_memory(PM_FNAME); - esc_obj = get_pool_memory(PM_FNAME); - m_allow_transactions = mult_db_connections; - - /* At this time, when mult_db_connections == true, this is for - * specific console command such as bvfs or batch mode, and we don't - * want to share a batch mode or bvfs. In the future, we can change - * the creation function to add this parameter. - */ - m_dedicated = mult_db_connections; - - /* - * Initialize the private members. - */ - m_db_handle = NULL; - m_result = NULL; - - /* - * Put the db in the list. - */ - if (db_list == NULL) { - db_list = New(dlist(this, &this->m_link)); - } - db_list->append(this); -} - -B_DB_MYSQL::~B_DB_MYSQL() -{ -} - -/* - * Now actually open the database. This can generate errors, - * which are returned in the errmsg - * - * DO NOT close the database or delete mdb here !!!! - */ -bool B_DB_MYSQL::db_open_database(JCR *jcr) -{ - bool retval = false; - int errstat; - - P(mutex); - if (m_connected) { - retval = true; - goto bail_out; - } - - if ((errstat=rwl_init(&m_lock)) != 0) { - berrno be; - Mmsg1(&errmsg, _("Unable to initialize DB lock. ERR=%s\n"), - be.bstrerror(errstat)); - goto bail_out; - } - - /* - * Connect to the database - */ -#ifdef xHAVE_EMBEDDED_MYSQL -// mysql_server_init(0, NULL, NULL); -#endif - mysql_init(&m_instance); - - Dmsg0(50, "mysql_init done\n"); - /* - * If connection fails, try at 5 sec intervals for 30 seconds. - */ - for (int retry=0; retry < 6; retry++) { - m_db_handle = mysql_real_connect( - &(m_instance), /* db */ - m_db_address, /* default = localhost */ - m_db_user, /* login name */ - m_db_password, /* password */ - m_db_name, /* database name */ - m_db_port, /* default port */ - m_db_socket, /* default = socket */ - CLIENT_FOUND_ROWS); /* flags */ - - /* - * If no connect, try once more in case it is a timing problem - */ - if (m_db_handle != NULL) { - break; - } - bmicrosleep(5,0); - } - - m_instance.reconnect = 1; /* so connection does not timeout */ - Dmsg0(50, "mysql_real_connect done\n"); - Dmsg3(50, "db_user=%s db_name=%s db_password=%s\n", m_db_user, m_db_name, - (m_db_password == NULL) ? "(NULL)" : m_db_password); - - if (m_db_handle == NULL) { - Mmsg2(&errmsg, _("Unable to connect to MySQL server.\n" -"Database=%s User=%s\n" -"MySQL connect failed either server not running or your authorization is incorrect.\n"), - m_db_name, m_db_user); -#if MYSQL_VERSION_ID >= 40101 - Dmsg3(50, "Error %u (%s): %s\n", - mysql_errno(&(m_instance)), mysql_sqlstate(&(m_instance)), - mysql_error(&(m_instance))); -#else - Dmsg2(50, "Error %u: %s\n", - mysql_errno(&(m_instance)), mysql_error(&(m_instance))); -#endif - goto bail_out; - } - - m_connected = true; - if (!check_tables_version(jcr, this)) { - goto bail_out; - } - - Dmsg3(100, "opendb ref=%d connected=%d db=%p\n", m_ref_count, m_connected, m_db_handle); - - /* - * Set connection timeout to 8 days specialy for batch mode - */ - sql_query("SET wait_timeout=691200"); - sql_query("SET interactive_timeout=691200"); - - retval = true; - -bail_out: - V(mutex); - return retval; -} - -void B_DB_MYSQL::db_close_database(JCR *jcr) -{ - if (m_connected) { - db_end_transaction(jcr); - } - P(mutex); - m_ref_count--; - Dmsg3(100, "closedb ref=%d connected=%d db=%p\n", m_ref_count, m_connected, m_db_handle); - if (m_ref_count == 0) { - if (m_connected) { - sql_free_result(); - } - db_list->remove(this); - if (m_connected) { - Dmsg1(100, "close db=%p\n", m_db_handle); - mysql_close(&m_instance); - -#ifdef xHAVE_EMBEDDED_MYSQL -// mysql_server_end(); -#endif - } - if (rwl_is_init(&m_lock)) { - rwl_destroy(&m_lock); - } - free_pool_memory(errmsg); - free_pool_memory(cmd); - free_pool_memory(cached_path); - free_pool_memory(fname); - free_pool_memory(path); - free_pool_memory(esc_name); - free_pool_memory(esc_path); - free_pool_memory(esc_obj); - if (m_db_driver) { - free(m_db_driver); - } - if (m_db_name) { - free(m_db_name); - } - if (m_db_user) { - free(m_db_user); - } - if (m_db_password) { - free(m_db_password); - } - if (m_db_address) { - free(m_db_address); - } - if (m_db_socket) { - free(m_db_socket); - } - delete this; - if (db_list->size() == 0) { - delete db_list; - db_list = NULL; - } - } - V(mutex); -} - -/* - * This call is needed because the message channel thread - * opens a database on behalf of a jcr that was created in - * a different thread. MySQL then allocates thread specific - * data, which is NOT freed when the original jcr thread - * closes the database. Thus the msgchan must call here - * to cleanup any thread specific data that it created. - */ -void B_DB_MYSQL::db_thread_cleanup(void) -{ -#ifndef HAVE_WIN32 - mysql_thread_end(); -#endif -} - -/* - * Escape strings so that MySQL is happy - * - * NOTE! len is the length of the old string. Your new - * string must be long enough (max 2*old+1) to hold - * the escaped output. - */ -void B_DB_MYSQL::db_escape_string(JCR *jcr, char *snew, char *old, int len) -{ - mysql_real_escape_string(m_db_handle, snew, old, len); -} - -/* - * Escape binary object so that MySQL is happy - * Memory is stored in B_DB struct, no need to free it - */ -char *B_DB_MYSQL::db_escape_object(JCR *jcr, char *old, int len) -{ - esc_obj = check_pool_memory_size(esc_obj, len*2+1); - mysql_real_escape_string(m_db_handle, esc_obj, old, len); - return esc_obj; -} - -/* - * Unescape binary object so that MySQL is happy - */ -void B_DB_MYSQL::db_unescape_object(JCR *jcr, char *from, int32_t expected_len, - POOLMEM **dest, int32_t *dest_len) -{ - if (!from) { - *dest[0] = 0; - *dest_len = 0; - return; - } - *dest = check_pool_memory_size(*dest, expected_len+1); - *dest_len = expected_len; - memcpy(*dest, from, expected_len); - (*dest)[expected_len]=0; -} - -void B_DB_MYSQL::db_start_transaction(JCR *jcr) -{ - if (!jcr->attr) { - jcr->attr = get_pool_memory(PM_FNAME); - } - if (!jcr->ar) { - jcr->ar = (ATTR_DBR *)malloc(sizeof(ATTR_DBR)); - } -} - -void B_DB_MYSQL::db_end_transaction(JCR *jcr) -{ - if (jcr && jcr->cached_attribute) { - Dmsg0(400, "Flush last cached attribute.\n"); - if (!db_create_attributes_record(jcr, this, jcr->ar)) { - Jmsg1(jcr, M_FATAL, 0, _("Attribute create error. %s"), db_strerror(jcr->db)); - } - jcr->cached_attribute = false; - } -} - -/* - * Submit a general SQL command (cmd), and for each row returned, - * the result_handler is called with the ctx. - */ -bool B_DB_MYSQL::db_sql_query(const char *query, DB_RESULT_HANDLER *result_handler, void *ctx) -{ - int ret; - SQL_ROW row; - bool send = true; - bool retval = false; - - Dmsg1(500, "db_sql_query starts with %s\n", query); - - db_lock(this); - ret = mysql_query(m_db_handle, query); - if (ret != 0) { - Mmsg(errmsg, _("Query failed: %s: ERR=%s\n"), query, sql_strerror()); - Dmsg0(500, "db_sql_query failed\n"); - goto bail_out; - } - - Dmsg0(500, "db_sql_query succeeded. checking handler\n"); - - if (result_handler != NULL) { - if ((m_result = mysql_use_result(m_db_handle)) != NULL) { - m_num_fields = mysql_num_fields(m_result); - - /* - * We *must* fetch all rows - */ - while ((row = mysql_fetch_row(m_result)) != NULL) { - if (send) { - /* the result handler returns 1 when it has - * seen all the data it wants. However, we - * loop to the end of the data. - */ - if (result_handler(ctx, m_num_fields, row)) { - send = false; - } - } - } - sql_free_result(); - } - } - - Dmsg0(500, "db_sql_query finished\n"); - retval = true; - -bail_out: - db_unlock(this); - return retval; -} - -bool B_DB_MYSQL::sql_query(const char *query, int flags) -{ - int ret; - bool retval = true; - - Dmsg1(500, "sql_query starts with '%s'\n", query); - /* - * We are starting a new query. reset everything. - */ - m_num_rows = -1; - m_row_number = -1; - m_field_number = -1; - - if (m_result) { - mysql_free_result(m_result); - m_result = NULL; - } - - ret = mysql_query(m_db_handle, query); - if (ret == 0) { - Dmsg0(500, "we have a result\n"); - if (flags & QF_STORE_RESULT) { - m_result = mysql_store_result(m_db_handle); - if (m_result != NULL) { - m_num_fields = mysql_num_fields(m_result); - Dmsg1(500, "we have %d fields\n", m_num_fields); - m_num_rows = mysql_num_rows(m_result); - Dmsg1(500, "we have %d rows\n", m_num_rows); - } else { - m_num_fields = 0; - m_num_rows = mysql_affected_rows(m_db_handle); - Dmsg1(500, "we have %d rows\n", m_num_rows); - } - } else { - m_num_fields = 0; - m_num_rows = mysql_affected_rows(m_db_handle); - Dmsg1(500, "we have %d rows\n", m_num_rows); - } - } else { - Dmsg0(500, "we failed\n"); - m_status = 1; /* failed */ - retval = false; - } - return retval; -} - -void B_DB_MYSQL::sql_free_result(void) -{ - db_lock(this); - if (m_result) { - mysql_free_result(m_result); - m_result = NULL; - } - if (m_fields) { - free(m_fields); - m_fields = NULL; - } - m_num_rows = m_num_fields = 0; - db_unlock(this); -} - -SQL_ROW B_DB_MYSQL::sql_fetch_row(void) -{ - if (!m_result) { - return NULL; - } else { - return mysql_fetch_row(m_result); - } -} - -const char *B_DB_MYSQL::sql_strerror(void) -{ - return mysql_error(m_db_handle); -} - -void B_DB_MYSQL::sql_data_seek(int row) -{ - return mysql_data_seek(m_result, row); -} - -int B_DB_MYSQL::sql_affected_rows(void) -{ - return mysql_affected_rows(m_db_handle); -} - -uint64_t B_DB_MYSQL::sql_insert_autokey_record(const char *query, const char *table_name) -{ - /* - * First execute the insert query and then retrieve the currval. - */ - if (mysql_query(m_db_handle, query) != 0) { - return 0; - } - - m_num_rows = mysql_affected_rows(m_db_handle); - if (m_num_rows != 1) { - return 0; - } - - changes++; - - return mysql_insert_id(m_db_handle); -} - -SQL_FIELD *B_DB_MYSQL::sql_fetch_field(void) -{ - int i; - MYSQL_FIELD *field; - - if (!m_fields || m_fields_size < m_num_fields) { - if (m_fields) { - free(m_fields); - m_fields = NULL; - } - Dmsg1(500, "allocating space for %d fields\n", m_num_fields); - m_fields = (SQL_FIELD *)malloc(sizeof(SQL_FIELD) * m_num_fields); - m_fields_size = m_num_fields; - - for (i = 0; i < m_num_fields; i++) { - Dmsg1(500, "filling field %d\n", i); - if ((field = mysql_fetch_field(m_result)) != NULL) { - m_fields[i].name = field->name; - m_fields[i].max_length = field->max_length; - m_fields[i].type = field->type; - m_fields[i].flags = field->flags; - - Dmsg4(500, "sql_fetch_field finds field '%s' has length='%d' type='%d' and IsNull=%d\n", - m_fields[i].name, m_fields[i].max_length, m_fields[i].type, m_fields[i].flags); - } - } - } - - /* - * Increment field number for the next time around - */ - return &m_fields[m_field_number++]; -} - -bool B_DB_MYSQL::sql_field_is_not_null(int field_type) -{ - return IS_NOT_NULL(field_type); -} - -bool B_DB_MYSQL::sql_field_is_numeric(int field_type) -{ - return IS_NUM(field_type); -} - -/* - * Returns true if OK - * false if failed - */ -bool B_DB_MYSQL::sql_batch_start(JCR *jcr) -{ - bool retval; - - db_lock(this); - retval = sql_query("CREATE TEMPORARY TABLE batch (" - "FileIndex integer," - "JobId integer," - "Path blob," - "Name blob," - "LStat tinyblob," - "MD5 tinyblob," - "DeltaSeq integer)"); - db_unlock(this); - - /* - * Keep track of the number of changes in batch mode. - */ - changes = 0; - - return retval; -} - -/* set error to something to abort operation */ -/* - * Returns true if OK - * false if failed - */ -bool B_DB_MYSQL::sql_batch_end(JCR *jcr, const char *error) -{ - m_status = 0; - - /* - * Flush any pending inserts. - */ - if (changes) { - return sql_query(cmd); - } - - return true; -} - -/* - * Returns true if OK - * false if failed - */ -bool B_DB_MYSQL::sql_batch_insert(JCR *jcr, ATTR_DBR *ar) -{ - const char *digest; - char ed1[50]; - - esc_name = check_pool_memory_size(esc_name, fnl*2+1); - db_escape_string(jcr, esc_name, fname, fnl); - - esc_path = check_pool_memory_size(esc_path, pnl*2+1); - db_escape_string(jcr, esc_path, path, pnl); - - if (ar->Digest == NULL || ar->Digest[0] == 0) { - digest = "0"; - } else { - digest = ar->Digest; - } - - /* - * Try to batch up multiple inserts using multi-row inserts. - */ - if (changes == 0) { - Mmsg(cmd, "INSERT INTO batch VALUES " - "(%u,%s,'%s','%s','%s','%s',%u)", - ar->FileIndex, edit_int64(ar->JobId,ed1), esc_path, - esc_name, ar->attr, digest, ar->DeltaSeq); - changes++; - } else { - /* - * We use the esc_obj for temporary storage otherwise - * we keep on copying data. - */ - Mmsg(esc_obj, ",(%u,%s,'%s','%s','%s','%s',%u)", - ar->FileIndex, edit_int64(ar->JobId,ed1), esc_path, - esc_name, ar->attr, digest, ar->DeltaSeq); - pm_strcat(cmd, esc_obj); - changes++; - } - - /* - * See if we need to flush the query buffer filled - * with multi-row inserts. - */ - if ((changes % MYSQL_CHANGES_PER_BATCH_INSERT) == 0) { - if (!sql_query(cmd)) { - changes = 0; - return false; - } else { - changes = 0; - } - } - return true; -} - -/* - * Initialize database data structure. In principal this should - * never have errors, or it is really fatal. - */ -B_DB *db_init_database(JCR *jcr, const char *db_driver, const char *db_name, const char *db_user, - const char *db_password, const char *db_address, int db_port, const char *db_socket, - bool mult_db_connections, bool disable_batch_insert) -{ - B_DB_MYSQL *mdb = NULL; - - if (!db_user) { - Jmsg(jcr, M_FATAL, 0, _("A user name for MySQL must be supplied.\n")); - return NULL; - } - P(mutex); /* lock DB queue */ - - /* - * Look to see if DB already open - */ - if (db_list && !mult_db_connections) { - foreach_dlist(mdb, db_list) { - if (mdb->db_match_database(db_driver, db_name, db_address, db_port)) { - Dmsg1(100, "DB REopen %s\n", db_name); - mdb->increment_refcount(); - goto bail_out; - } - } - } - Dmsg0(100, "db_init_database first time\n"); - mdb = New(B_DB_MYSQL(jcr, db_driver, db_name, db_user, db_password, db_address, - db_port, db_socket, mult_db_connections, disable_batch_insert)); - -bail_out: - V(mutex); - return mdb; -} - -#endif /* HAVE_MYSQL */ + * Note: at one point, this file was changed to class based by a certain + * programmer, and other than "wrapping" in a class, which is a trivial + * change for a C++ programmer, nothing substantial was done, yet all the + * code was recommitted under this programmer's name. Consequently, we + * undo those changes here. + * + */ + +#include "bacula.h" + +#ifdef HAVE_MYSQL + +#include "cats.h" +#include +#define __BDB_MYSQL_H_ 1 +#include "bdb_mysql.h" + +/* ----------------------------------------------------------------------- + * + * MySQL dependent defines and subroutines + * + * ----------------------------------------------------------------------- + */ + +/* List of open databases */ +static dlist *db_list = NULL; + +static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; + +BDB_MYSQL::BDB_MYSQL() +{ + BDB_MYSQL *mdb = this; + + if (db_list == NULL) { + db_list = New(dlist(this, &this->m_link)); + } + mdb->m_db_driver_type = SQL_DRIVER_TYPE_MYSQL; + mdb->m_db_type = SQL_TYPE_MYSQL; + mdb->m_db_driver = bstrdup("MySQL"); + mdb->errmsg = get_pool_memory(PM_EMSG); /* get error message buffer */ + mdb->errmsg[0] = 0; + mdb->cmd = get_pool_memory(PM_EMSG); /* get command buffer */ + mdb->cached_path = get_pool_memory(PM_FNAME); + mdb->cached_path_id = 0; + mdb->m_ref_count = 1; + mdb->fname = get_pool_memory(PM_FNAME); + mdb->path = get_pool_memory(PM_FNAME); + mdb->esc_name = get_pool_memory(PM_FNAME); + mdb->esc_path = get_pool_memory(PM_FNAME); + mdb->esc_obj = get_pool_memory(PM_FNAME); + mdb->m_use_fatal_jmsg = true; + + /* Initialize the private members. */ + mdb->m_db_handle = NULL; + mdb->m_result = NULL; + + db_list->append(this); +} + +BDB_MYSQL::~BDB_MYSQL() +{ +} + +/* + * Initialize database data structure. In principal this should + * never have errors, or it is really fatal. + */ +BDB *db_init_database(JCR *jcr, const char *db_driver, const char *db_name, const char *db_user, + const char *db_password, const char *db_address, int db_port, const char *db_socket, + bool mult_db_connections, bool disable_batch_insert) +{ + BDB_MYSQL *mdb = NULL; + + if (!db_user) { + Jmsg(jcr, M_FATAL, 0, _("A user name for MySQL must be supplied.\n")); + return NULL; + } + P(mutex); /* lock DB queue */ + + /* + * Look to see if DB already open + */ + if (db_list && !mult_db_connections) { + foreach_dlist(mdb, db_list) { + if (mdb->bdb_match_database(db_driver, db_name, db_address, db_port)) { + Dmsg1(100, "DB REopen %s\n", db_name); + mdb->increment_refcount(); + goto get_out; + } + } + } + Dmsg0(100, "db_init_database first time\n"); + mdb = New(BDB_MYSQL()); + if (!mdb) goto get_out; + + /* + * Initialize the parent class members. + */ + mdb->m_db_name = bstrdup(db_name); + mdb->m_db_user = bstrdup(db_user); + if (db_password) { + mdb->m_db_password = bstrdup(db_password); + } + if (db_address) { + mdb->m_db_address = bstrdup(db_address); + } + if (db_socket) { + mdb->m_db_socket = bstrdup(db_socket); + } + mdb->m_db_port = db_port; + + if (disable_batch_insert) { + mdb->m_disabled_batch_insert = true; + mdb->m_have_batch_insert = false; + } else { + mdb->m_disabled_batch_insert = false; +#ifdef USE_BATCH_FILE_INSERT +#ifdef HAVE_MYSQL_THREAD_SAFE + mdb->m_have_batch_insert = mysql_thread_safe(); +#else + mdb->m_have_batch_insert = false; +#endif /* HAVE_MYSQL_THREAD_SAFE */ +#else + mdb->m_have_batch_insert = false; +#endif /* USE_BATCH_FILE_INSERT */ + } + + mdb->m_allow_transactions = mult_db_connections; + + /* At this time, when mult_db_connections == true, this is for + * specific console command such as bvfs or batch mode, and we don't + * want to share a batch mode or bvfs. In the future, we can change + * the creation function to add this parameter. + */ + mdb->m_dedicated = mult_db_connections; + +get_out: + V(mutex); + return mdb; +} + + +/* + * Now actually open the database. This can generate errors, + * which are returned in the errmsg + * + * DO NOT close the database or delete mdb here !!!! + */ +bool BDB_MYSQL::bdb_open_database(JCR *jcr) +{ + BDB_MYSQL *mdb = this; + bool retval = false; + int errstat; + + P(mutex); + if (mdb->m_connected) { + retval = true; + goto get_out; + } + + if ((errstat=rwl_init(&mdb->m_lock)) != 0) { + berrno be; + Mmsg1(&mdb->errmsg, _("Unable to initialize DB lock. ERR=%s\n"), + be.bstrerror(errstat)); + goto get_out; + } + + /* + * Connect to the database + */ +#ifdef xHAVE_EMBEDDED_MYSQL +// mysql_server_init(0, NULL, NULL); +#endif + mysql_init(&mdb->m_instance); + + Dmsg0(50, "mysql_init done\n"); + /* + * If connection fails, try at 5 sec intervals for 30 seconds. + */ + for (int retry=0; retry < 6; retry++) { + mdb->m_db_handle = mysql_real_connect( + &(mdb->m_instance), /* db */ + mdb->m_db_address, /* default = localhost */ + mdb->m_db_user, /* login name */ + mdb->m_db_password, /* password */ + mdb->m_db_name, /* database name */ + mdb->m_db_port, /* default port */ + mdb->m_db_socket, /* default = socket */ + CLIENT_FOUND_ROWS); /* flags */ + + /* + * If no connect, try once more in case it is a timing problem + */ + if (mdb->m_db_handle != NULL) { + break; + } + bmicrosleep(5,0); + } + + mdb->m_instance.reconnect = 1; /* so connection does not timeout */ + Dmsg0(50, "mysql_real_connect done\n"); + Dmsg3(50, "db_user=%s db_name=%s db_password=%s\n", mdb->m_db_user, mdb->m_db_name, + (mdb->m_db_password == NULL) ? "(NULL)" : mdb->m_db_password); + + if (mdb->m_db_handle == NULL) { + Mmsg2(&mdb->errmsg, _("Unable to connect to MySQL server.\n" +"Database=%s User=%s\n" +"MySQL connect failed either server not running or your authorization is incorrect.\n"), + mdb->m_db_name, mdb->m_db_user); +#if MYSQL_VERSION_ID >= 40101 + Dmsg3(50, "Error %u (%s): %s\n", + mysql_errno(&(mdb->m_instance)), mysql_sqlstate(&(mdb->m_instance)), + mysql_error(&(mdb->m_instance))); +#else + Dmsg2(50, "Error %u: %s\n", + mysql_errno(&(mdb->m_instance)), mysql_error(&(mdb->m_instance))); +#endif + goto get_out; + } + + mdb->m_connected = true; + if (!bdb_check_version(jcr)) { + goto get_out; + } + + Dmsg3(100, "opendb ref=%d connected=%d db=%p\n", mdb->m_ref_count, mdb->m_connected, mdb->m_db_handle); + + /* + * Set connection timeout to 8 days specialy for batch mode + */ + sql_query("SET wait_timeout=691200"); + sql_query("SET interactive_timeout=691200"); + + retval = true; + +get_out: + V(mutex); + return retval; +} + +void BDB_MYSQL::bdb_close_database(JCR *jcr) +{ + BDB_MYSQL *mdb = this; + + if (mdb->m_connected) { + bdb_end_transaction(jcr); + } + P(mutex); + mdb->m_ref_count--; + Dmsg3(100, "closedb ref=%d connected=%d db=%p\n", mdb->m_ref_count, mdb->m_connected, mdb->m_db_handle); + if (mdb->m_ref_count == 0) { + if (mdb->m_connected) { + sql_free_result(); + } + db_list->remove(mdb); + if (mdb->m_connected) { + Dmsg1(100, "close db=%p\n", mdb->m_db_handle); + mysql_close(&mdb->m_instance); + } + if (is_rwl_valid(&mdb->m_lock)) { + rwl_destroy(&mdb->m_lock); + } + free_pool_memory(mdb->errmsg); + free_pool_memory(mdb->cmd); + free_pool_memory(mdb->cached_path); + free_pool_memory(mdb->fname); + free_pool_memory(mdb->path); + free_pool_memory(mdb->esc_name); + free_pool_memory(mdb->esc_path); + free_pool_memory(mdb->esc_obj); + if (mdb->m_db_driver) { + free(mdb->m_db_driver); + } + if (mdb->m_db_name) { + free(mdb->m_db_name); + } + if (mdb->m_db_user) { + free(mdb->m_db_user); + } + if (mdb->m_db_password) { + free(mdb->m_db_password); + } + if (mdb->m_db_address) { + free(mdb->m_db_address); + } + if (mdb->m_db_socket) { + free(mdb->m_db_socket); + } + delete mdb; + if (db_list->size() == 0) { + delete db_list; + db_list = NULL; + } + } + V(mutex); +} + +/* + * This call is needed because the message channel thread + * opens a database on behalf of a jcr that was created in + * a different thread. MySQL then allocates thread specific + * data, which is NOT freed when the original jcr thread + * closes the database. Thus the msgchan must call here + * to cleanup any thread specific data that it created. + */ +void BDB_MYSQL::bdb_thread_cleanup(void) +{ +#ifndef HAVE_WIN32 + mysql_thread_end(); /* Cleanup thread specific data */ +#endif +} + +/* + * Escape strings so MySQL is happy + * + * len is the length of the old string. Your new + * string must be long enough (max 2*old+1) to hold + * the escaped output. + */ +void BDB_MYSQL::bdb_escape_string(JCR *jcr, char *snew, char *old, int len) +{ + BDB_MYSQL *mdb = this; + mysql_real_escape_string(mdb->m_db_handle, snew, old, len); +} + +/* + * Escape binary object so that MySQL is happy + * Memory is stored in BDB struct, no need to free it + */ +char *BDB_MYSQL::bdb_escape_object(JCR *jcr, char *old, int len) +{ + BDB_MYSQL *mdb = this; + mdb->esc_obj = check_pool_memory_size(mdb->esc_obj, len*2+1); + mysql_real_escape_string(mdb->m_db_handle, mdb->esc_obj, old, len); + return mdb->esc_obj; +} + +/* + * Unescape binary object so that MySQL is happy + */ +void BDB_MYSQL::bdb_unescape_object(JCR *jcr, char *from, int32_t expected_len, + POOLMEM **dest, int32_t *dest_len) +{ + if (!from) { + *dest[0] = 0; + *dest_len = 0; + return; + } + *dest = check_pool_memory_size(*dest, expected_len+1); + *dest_len = expected_len; + memcpy(*dest, from, expected_len); + (*dest)[expected_len]=0; +} + +void BDB_MYSQL::bdb_start_transaction(JCR *jcr) +{ + if (!jcr->attr) { + jcr->attr = get_pool_memory(PM_FNAME); + } + if (!jcr->ar) { + jcr->ar = (ATTR_DBR *)malloc(sizeof(ATTR_DBR)); + } +} + +void BDB_MYSQL::bdb_end_transaction(JCR *jcr) +{ + if (jcr && jcr->cached_attribute) { + Dmsg0(400, "Flush last cached attribute.\n"); + if (!bdb_create_attributes_record(jcr, jcr->ar)) { + Jmsg1(jcr, M_FATAL, 0, _("Attribute create error. %s"), jcr->db->bdb_strerror()); + } + jcr->cached_attribute = false; + } +} + +/* + * Submit a general SQL command (cmd), and for each row returned, + * the result_handler is called with the ctx. + */ +bool BDB_MYSQL::bdb_sql_query(const char *query, DB_RESULT_HANDLER *result_handler, void *ctx) +{ + int ret; + SQL_ROW row; + bool send = true; + bool retval = false; + BDB_MYSQL *mdb = this; + + Dmsg1(500, "db_sql_query starts with %s\n", query); + + bdb_lock(); + errmsg[0] = 0; + ret = mysql_query(m_db_handle, query); + if (ret != 0) { + Mmsg(mdb->errmsg, _("Query failed: %s: ERR=%s\n"), query, sql_strerror()); + Dmsg0(500, "db_sql_query failed\n"); + goto get_out; + } + + Dmsg0(500, "db_sql_query succeeded. checking handler\n"); + + if (result_handler) { + if ((mdb->m_result = mysql_use_result(mdb->m_db_handle)) != NULL) { + mdb->m_num_fields = mysql_num_fields(mdb->m_result); + + /* + * We *must* fetch all rows + */ + while ((row = mysql_fetch_row(m_result))) { + if (send) { + /* the result handler returns 1 when it has + * seen all the data it wants. However, we + * loop to the end of the data. + */ + if (result_handler(ctx, mdb->m_num_fields, row)) { + send = false; + } + } + } + sql_free_result(); + } + } + + Dmsg0(500, "db_sql_query finished\n"); + retval = true; + +get_out: + bdb_unlock(); + return retval; +} + +bool BDB_MYSQL::sql_query(const char *query, int flags) +{ + int ret; + bool retval = true; + BDB_MYSQL *mdb = this; + + Dmsg1(500, "sql_query starts with '%s'\n", query); + /* + * We are starting a new query. reset everything. + */ + mdb->m_num_rows = -1; + mdb->m_row_number = -1; + mdb->m_field_number = -1; + + if (mdb->m_result) { + mysql_free_result(mdb->m_result); + mdb->m_result = NULL; + } + + ret = mysql_query(mdb->m_db_handle, query); + if (ret == 0) { + Dmsg0(500, "we have a result\n"); + if (flags & QF_STORE_RESULT) { + mdb->m_result = mysql_store_result(mdb->m_db_handle); + if (mdb->m_result != NULL) { + mdb->m_num_fields = mysql_num_fields(mdb->m_result); + Dmsg1(500, "we have %d fields\n", mdb->m_num_fields); + mdb->m_num_rows = mysql_num_rows(mdb->m_result); + Dmsg1(500, "we have %d rows\n", mdb->m_num_rows); + } else { + mdb->m_num_fields = 0; + mdb->m_num_rows = mysql_affected_rows(mdb->m_db_handle); + Dmsg1(500, "we have %d rows\n", mdb->m_num_rows); + } + } else { + mdb->m_num_fields = 0; + mdb->m_num_rows = mysql_affected_rows(mdb->m_db_handle); + Dmsg1(500, "we have %d rows\n", mdb->m_num_rows); + } + } else { + Dmsg0(500, "we failed\n"); + mdb->m_status = 1; /* failed */ + retval = false; + } + return retval; +} + +void BDB_MYSQL::sql_free_result(void) +{ + BDB_MYSQL *mdb = this; + bdb_lock(); + if (mdb->m_result) { + mysql_free_result(mdb->m_result); + mdb->m_result = NULL; + } + if (mdb->m_fields) { + free(mdb->m_fields); + mdb->m_fields = NULL; + } + mdb->m_num_rows = mdb->m_num_fields = 0; + bdb_unlock(); +} + +SQL_ROW BDB_MYSQL::sql_fetch_row(void) +{ + BDB_MYSQL *mdb = this; + if (!mdb->m_result) { + return NULL; + } else { + return mysql_fetch_row(mdb->m_result); + } +} + +const char *BDB_MYSQL::sql_strerror(void) +{ + BDB_MYSQL *mdb = this; + return mysql_error(mdb->m_db_handle); +} + +void BDB_MYSQL::sql_data_seek(int row) +{ + BDB_MYSQL *mdb = this; + return mysql_data_seek(mdb->m_result, row); +} + +int BDB_MYSQL::sql_affected_rows(void) +{ + BDB_MYSQL *mdb = this; + return mysql_affected_rows(mdb->m_db_handle); +} + +uint64_t BDB_MYSQL::sql_insert_autokey_record(const char *query, const char *table_name) +{ + BDB_MYSQL *mdb = this; + /* + * First execute the insert query and then retrieve the currval. + */ + if (mysql_query(mdb->m_db_handle, query) != 0) { + return 0; + } + + mdb->m_num_rows = mysql_affected_rows(mdb->m_db_handle); + if (mdb->m_num_rows != 1) { + return 0; + } + + mdb->changes++; + + return mysql_insert_id(mdb->m_db_handle); +} + +SQL_FIELD *BDB_MYSQL::sql_fetch_field(void) +{ + int i; + MYSQL_FIELD *field; + BDB_MYSQL *mdb = this; + + if (!mdb->m_fields || mdb->m_fields_size < mdb->m_num_fields) { + if (mdb->m_fields) { + free(mdb->m_fields); + mdb->m_fields = NULL; + } + Dmsg1(500, "allocating space for %d fields\n", mdb->m_num_fields); + mdb->m_fields = (SQL_FIELD *)malloc(sizeof(SQL_FIELD) * mdb->m_num_fields); + mdb->m_fields_size = mdb->m_num_fields; + + for (i = 0; i < mdb->m_num_fields; i++) { + Dmsg1(500, "filling field %d\n", i); + if ((field = mysql_fetch_field(mdb->m_result)) != NULL) { + mdb->m_fields[i].name = field->name; + mdb->m_fields[i].max_length = field->max_length; + mdb->m_fields[i].type = field->type; + mdb->m_fields[i].flags = field->flags; + + Dmsg4(500, "sql_fetch_field finds field '%s' has length='%d' type='%d' and IsNull=%d\n", + mdb->m_fields[i].name, mdb->m_fields[i].max_length, mdb->m_fields[i].type, mdb->m_fields[i].flags); + } + } + } + + /* + * Increment field number for the next time around + */ + return &mdb->m_fields[mdb->m_field_number++]; +} + +bool BDB_MYSQL::sql_field_is_not_null(int field_type) +{ + return IS_NOT_NULL(field_type); +} + +bool BDB_MYSQL::sql_field_is_numeric(int field_type) +{ + return IS_NUM(field_type); +} + +/* + * Returns true if OK + * false if failed + */ +bool BDB_MYSQL::sql_batch_start(JCR *jcr) +{ + BDB_MYSQL *mdb = this; + bool retval; + + bdb_lock(); + retval = sql_query("CREATE TEMPORARY TABLE batch (" + "FileIndex integer," + "JobId integer," + "Path blob," + "Name blob," + "LStat tinyblob," + "MD5 tinyblob," + "DeltaSeq integer)"); + bdb_unlock(); + + /* + * Keep track of the number of changes in batch mode. + */ + mdb->changes = 0; + + return retval; +} + +/* set error to something to abort operation */ +/* + * Returns true if OK + * false if failed + */ +bool BDB_MYSQL::sql_batch_end(JCR *jcr, const char *error) +{ + BDB_MYSQL *mdb = this; + + mdb->m_status = 0; + + /* + * Flush any pending inserts. + */ + if (mdb->changes) { + return sql_query(mdb->cmd); + } + + return true; +} + +/* + * Returns true if OK + * false if failed + */ +bool BDB_MYSQL::sql_batch_insert(JCR *jcr, ATTR_DBR *ar) +{ + BDB_MYSQL *mdb = this; + const char *digest; + char ed1[50]; + + mdb->esc_name = check_pool_memory_size(mdb->esc_name, mdb->fnl*2+1); + bdb_escape_string(jcr, mdb->esc_name, mdb->fname, mdb->fnl); + + mdb->esc_path = check_pool_memory_size(mdb->esc_path, mdb->pnl*2+1); + bdb_escape_string(jcr, mdb->esc_path, mdb->path, mdb->pnl); + + if (ar->Digest == NULL || ar->Digest[0] == 0) { + digest = "0"; + } else { + digest = ar->Digest; + } + + /* + * Try to batch up multiple inserts using multi-row inserts. + */ + if (mdb->changes == 0) { + Mmsg(cmd, "INSERT INTO batch VALUES " + "(%u,%s,'%s','%s','%s','%s',%u)", + ar->FileIndex, edit_int64(ar->JobId,ed1), mdb->esc_path, + mdb->esc_name, ar->attr, digest, ar->DeltaSeq); + mdb->changes++; + } else { + /* + * We use the esc_obj for temporary storage otherwise + * we keep on copying data. + */ + Mmsg(mdb->esc_obj, ",(%u,%s,'%s','%s','%s','%s',%u)", + ar->FileIndex, edit_int64(ar->JobId,ed1), mdb->esc_path, + mdb->esc_name, ar->attr, digest, ar->DeltaSeq); + pm_strcat(mdb->cmd, mdb->esc_obj); + mdb->changes++; + } + + /* + * See if we need to flush the query buffer filled + * with multi-row inserts. + */ + if ((mdb->changes % MYSQL_CHANGES_PER_BATCH_INSERT) == 0) { + if (!sql_query(mdb->cmd)) { + mdb->changes = 0; + return false; + } else { + mdb->changes = 0; + } + } + return true; +} + + +#endif /* HAVE_MYSQL */ diff --git a/bacula/src/cats/mysql.in b/bacula/src/cats/mysql.in index d587785d84..b4e0d70d79 100644 --- a/bacula/src/cats/mysql.in +++ b/bacula/src/cats/mysql.in @@ -1,21 +1,9 @@ #!/bin/sh # -# shell script to create Bacula MySQL tables -# -# -# Bacula® - The Network Backup Solution -# -# Copyright (C) 2000-2014 Free Software Foundation Europe e.V. +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # -# The main author of Bacula is Kern Sibbald, with contributions from many -# others, a complete list can be found in the file AUTHORS. -# -# You may use this file and others of this release according to the -# license defined in the LICENSE file, which includes the Affero General -# Public License, v3.0 ("AGPLv3") and some additional permissions and -# terms pursuant to its AGPLv3 Section 7. -# -# Bacula® is a registered trademark of Kern Sibbald. +# shell script to create Bacula MySQL tables # bindir=@MYSQL_BINDIR@ db_name=@db_name@ diff --git a/bacula/src/cats/postgresql.c b/bacula/src/cats/postgresql.c index cf85e88d93..76ac3ddaab 100644 --- a/bacula/src/cats/postgresql.c +++ b/bacula/src/cats/postgresql.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2003-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula Catalog Database routines specific to PostgreSQL @@ -20,20 +24,29 @@ * Dan Langille, December 2003 * based upon work done by Kern Sibbald, March 2000 * - * Class wrapper by Marco van Wieringen, January 2010 + * Note: at one point, this file was changed to class based by a certain + * programmer, and other than "wrapping" in a class, which is a trivial + * change for a C++ programmer, nothing substantial was done, yet all the + * code was recommitted under this programmer's name. Consequently, we + * undo those changes here. Unfortunately, it is too difficult to put + * back the original author's name (Dan Langille) on the parts he wrote. */ #include "bacula.h" #ifdef HAVE_POSTGRESQL -#include "cats.h" -#include "bdb_priv.h" -#include "libpq-fe.h" -#include "postgres_ext.h" /* needed for NAMEDATALEN */ -#include "pg_config_manual.h" /* get NAMEDATALEN on version 8.3 or later */ +#include "cats.h" +#include "libpq-fe.h" +#include "postgres_ext.h" /* needed for NAMEDATALEN */ +#include "pg_config_manual.h" /* get NAMEDATALEN on version 8.3 or later */ +#define __BDB_POSTGRESQL_H_ 1 #include "bdb_postgresql.h" +#define dbglvl_dbg DT_SQL|100 +#define dbglvl_info DT_SQL|50 +#define dbglvl_err DT_SQL|10 + /* ----------------------------------------------------------------------- * * PostgreSQL dependent defines and subroutines @@ -41,135 +54,159 @@ * ----------------------------------------------------------------------- */ +/* List of open databases */ +static dlist *db_list = NULL; + +static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; + +BDB_POSTGRESQL::BDB_POSTGRESQL() +{ + BDB_POSTGRESQL *mdb = this; + + if (db_list == NULL) { + db_list = New(dlist(mdb, &mdb->m_link)); + } + mdb->m_db_driver_type = SQL_DRIVER_TYPE_POSTGRESQL; + mdb->m_db_type = SQL_TYPE_POSTGRESQL; + mdb->m_db_driver = bstrdup("PostgreSQL"); + + mdb->errmsg = get_pool_memory(PM_EMSG); /* get error message buffer */ + mdb->errmsg[0] = 0; + mdb->cmd = get_pool_memory(PM_EMSG); /* get command buffer */ + mdb->cached_path = get_pool_memory(PM_FNAME); + mdb->cached_path_id = 0; + mdb->m_ref_count = 1; + mdb->fname = get_pool_memory(PM_FNAME); + mdb->path = get_pool_memory(PM_FNAME); + mdb->esc_name = get_pool_memory(PM_FNAME); + mdb->esc_path = get_pool_memory(PM_FNAME); + mdb->esc_obj = get_pool_memory(PM_FNAME); + mdb->m_use_fatal_jmsg = true; + + /* Initialize the private members. */ + mdb->m_db_handle = NULL; + mdb->m_result = NULL; + mdb->m_buf = get_pool_memory(PM_FNAME); + + db_list->append(this); +} + +BDB_POSTGRESQL::~BDB_POSTGRESQL() +{ +} + /* - * List of open databases + * Initialize database data structure. In principal this should + * never have errors, or it is really fatal. */ -static dlist *db_list = NULL; - -static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; - -B_DB_POSTGRESQL::B_DB_POSTGRESQL(JCR *jcr, - const char *db_driver, - const char *db_name, - const char *db_user, - const char *db_password, - const char *db_address, - int db_port, - const char *db_socket, - bool mult_db_connections, - bool disable_batch_insert) +BDB *db_init_database(JCR *jcr, const char *db_driver, const char *db_name, + const char *db_user, const char *db_password, + const char *db_address, int db_port, + const char *db_socket, bool mult_db_connections, + bool disable_batch_insert) { + BDB_POSTGRESQL *mdb = NULL; + + if (!db_user) { + Jmsg(jcr, M_FATAL, 0, _("A user name for PostgreSQL must be supplied.\n")); + return NULL; + } + P(mutex); /* lock DB queue */ + if (db_list && !mult_db_connections) { + /* + * Look to see if DB already open + */ + foreach_dlist(mdb, db_list) { + if (mdb->bdb_match_database(db_driver, db_name, db_address, db_port)) { + Dmsg1(dbglvl_info, "DB REopen %s\n", db_name); + mdb->increment_refcount(); + goto get_out; + } + } + } + Dmsg0(dbglvl_info, "db_init_database first time\n"); + /* Create the global Bacula db context */ + mdb = New(BDB_POSTGRESQL()); + if (!mdb) goto get_out; + /* * Initialize the parent class members. */ - m_db_interface_type = SQL_INTERFACE_TYPE_POSTGRESQL; - m_db_type = SQL_TYPE_POSTGRESQL; - m_db_driver = bstrdup("PostgreSQL"); - m_db_name = bstrdup(db_name); - m_db_user = bstrdup(db_user); + mdb->m_db_name = bstrdup(db_name); + mdb->m_db_user = bstrdup(db_user); if (db_password) { - m_db_password = bstrdup(db_password); + mdb->m_db_password = bstrdup(db_password); } if (db_address) { - m_db_address = bstrdup(db_address); + mdb->m_db_address = bstrdup(db_address); } if (db_socket) { - m_db_socket = bstrdup(db_socket); - } - m_db_port = db_port; - if (disable_batch_insert) { - m_disabled_batch_insert = true; - m_have_batch_insert = false; - } else { - m_disabled_batch_insert = false; -#if defined(USE_BATCH_FILE_INSERT) -#if defined(HAVE_POSTGRESQL_BATCH_FILE_INSERT) || defined(HAVE_PQISTHREADSAFE) -#ifdef HAVE_PQISTHREADSAFE - m_have_batch_insert = PQisthreadsafe(); -#else - m_have_batch_insert = true; -#endif /* HAVE_PQISTHREADSAFE */ -#else - m_have_batch_insert = true; -#endif /* HAVE_POSTGRESQL_BATCH_FILE_INSERT || HAVE_PQISTHREADSAFE */ -#else - m_have_batch_insert = false; -#endif /* USE_BATCH_FILE_INSERT */ - } - errmsg = get_pool_memory(PM_EMSG); /* get error message buffer */ - *errmsg = 0; - cmd = get_pool_memory(PM_EMSG); /* get command buffer */ - cached_path = get_pool_memory(PM_FNAME); - cached_path_id = 0; - m_ref_count = 1; - fname = get_pool_memory(PM_FNAME); - path = get_pool_memory(PM_FNAME); - esc_name = get_pool_memory(PM_FNAME); - esc_path = get_pool_memory(PM_FNAME); - esc_obj = get_pool_memory(PM_FNAME); - m_buf = get_pool_memory(PM_FNAME); - m_allow_transactions = mult_db_connections; + mdb->m_db_socket = bstrdup(db_socket); + } + mdb->m_db_port = db_port; + + if (disable_batch_insert) { + mdb->m_disabled_batch_insert = true; + mdb->m_have_batch_insert = false; + } else { + mdb->m_disabled_batch_insert = false; +#ifdef USE_BATCH_FILE_INSERT +#if defined(HAVE_POSTGRESQL_BATCH_FILE_INSERT) || defined(HAVE_PQISTHREADSAFE) +#ifdef HAVE_PQISTHREADSAFE + mdb->m_have_batch_insert = PQisthreadsafe(); +#else + mdb->m_have_batch_insert = true; +#endif /* HAVE_PQISTHREADSAFE */ +#else + mdb->m_have_batch_insert = true; +#endif /* HAVE_POSTGRESQL_BATCH_FILE_INSERT || HAVE_PQISTHREADSAFE */ +#else + mdb->m_have_batch_insert = false; +#endif /* USE_BATCH_FILE_INSERT */ + } + mdb->m_allow_transactions = mult_db_connections; /* At this time, when mult_db_connections == true, this is for * specific console command such as bvfs or batch mode, and we don't * want to share a batch mode or bvfs. In the future, we can change * the creation function to add this parameter. */ - m_dedicated = mult_db_connections; - - /* - * Initialize the private members. - */ - m_db_handle = NULL; - m_result = NULL; - - /* - * Put the db in the list. - */ - if (db_list == NULL) { - db_list = New(dlist(this, &this->m_link)); - } - db_list->append(this); -} - -B_DB_POSTGRESQL::~B_DB_POSTGRESQL() -{ -} + mdb->m_dedicated = mult_db_connections; -/* - * Check that the database correspond to the encoding we want - */ -static bool pgsql_check_database_encoding(JCR *jcr, B_DB_POSTGRESQL *mdb) +get_out: + V(mutex); + return mdb; +} + + +/* Check that the database corresponds to the encoding we want */ +static bool pgsql_check_database_encoding(JCR *jcr, BDB_POSTGRESQL *mdb) { SQL_ROW row; - int ret = false; + int ret = false; - if (!mdb->sql_query("SELECT getdatabaseencoding()", QF_STORE_RESULT)) { + if (!mdb->sql_query("SELECT getdatabaseencoding()", QF_STORE_RESULT)) { Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); - return false; + return false; } - if ((row = mdb->sql_fetch_row()) == NULL) { - Mmsg1(mdb->errmsg, _("error fetching row: %s\n"), mdb->sql_strerror()); + if ((row = mdb->sql_fetch_row()) == NULL) { + Mmsg1(mdb->errmsg, _("error fetching row: %s\n"), mdb->sql_strerror()); Jmsg(jcr, M_ERROR, 0, "Can't check database encoding %s", mdb->errmsg); - } else { + } else { ret = bstrcmp(row[0], "SQL_ASCII"); if (ret) { - /* - * If we are in SQL_ASCII, we can force the client_encoding to SQL_ASCII too - */ - mdb->sql_query("SET client_encoding TO 'SQL_ASCII'"); - - } else { - /* - * Something is wrong with database encoding - */ + /* If we are in SQL_ASCII, we can force the client_encoding to SQL_ASCII too */ + mdb->sql_query("SET client_encoding TO 'SQL_ASCII'"); + + } else { + /* Something is wrong with database encoding */ Mmsg(mdb->errmsg, _("Encoding error for database \"%s\". Wanted SQL_ASCII, got %s\n"), - mdb->get_db_name(), row[0]); + mdb->get_db_name(), row[0]); Jmsg(jcr, M_WARNING, 0, "%s", mdb->errmsg); - Dmsg1(50, "%s", mdb->errmsg); + Dmsg1(dbglvl_err, "%s", mdb->errmsg); } } return ret; @@ -179,29 +216,30 @@ static bool pgsql_check_database_encoding(JCR *jcr, B_DB_POSTGRESQL *mdb) * Now actually open the database. This can generate errors, * which are returned in the errmsg * - * DO NOT close the database or delete mdb here !!!! + * DO NOT close the database or delete mdb here !!!! */ -bool B_DB_POSTGRESQL::db_open_database(JCR *jcr) +bool BDB_POSTGRESQL::bdb_open_database(JCR *jcr) { - bool retval = false; + bool retval = false; int errstat; char buf[10], *port; + BDB_POSTGRESQL *mdb = this; P(mutex); - if (m_connected) { - retval = true; - goto bail_out; + if (mdb->m_connected) { + retval = true; + goto get_out; } - if ((errstat=rwl_init(&m_lock)) != 0) { + if ((errstat=rwl_init(&mdb->m_lock)) != 0) { berrno be; - Mmsg1(&errmsg, _("Unable to initialize DB lock. ERR=%s\n"), + Mmsg1(&mdb->errmsg, _("Unable to initialize DB lock. ERR=%s\n"), be.bstrerror(errstat)); - goto bail_out; + goto get_out; } - if (m_db_port) { - bsnprintf(buf, sizeof(buf), "%d", m_db_port); + if (mdb->m_db_port) { + bsnprintf(buf, sizeof(buf), "%d", mdb->m_db_port); port = buf; } else { port = NULL; @@ -210,106 +248,105 @@ bool B_DB_POSTGRESQL::db_open_database(JCR *jcr) /* If connection fails, try at 5 sec intervals for 30 seconds. */ for (int retry=0; retry < 6; retry++) { /* connect to the database */ - m_db_handle = PQsetdbLogin( - m_db_address, /* default = localhost */ - port, /* default port */ - NULL, /* pg options */ - NULL, /* tty, ignored */ - m_db_name, /* database name */ - m_db_user, /* login name */ - m_db_password); /* password */ + mdb->m_db_handle = PQsetdbLogin( + mdb->m_db_address, /* default = localhost */ + port, /* default port */ + NULL, /* pg options */ + NULL, /* tty, ignored */ + mdb->m_db_name, /* database name */ + mdb->m_db_user, /* login name */ + mdb->m_db_password); /* password */ /* If no connect, try once more in case it is a timing problem */ - if (PQstatus(m_db_handle) == CONNECTION_OK) { + if (PQstatus(mdb->m_db_handle) == CONNECTION_OK) { break; } bmicrosleep(5, 0); } - Dmsg0(50, "pg_real_connect done\n"); - Dmsg3(50, "db_user=%s db_name=%s db_password=%s\n", m_db_user, m_db_name, - (m_db_password == NULL) ? "(NULL)" : m_db_password); + Dmsg0(dbglvl_info, "pg_real_connect done\n"); + Dmsg3(dbglvl_info, "db_user=%s db_name=%s db_password=%s\n", mdb->m_db_user, mdb->m_db_name, + mdb->m_db_password==NULL?"(NULL)":mdb->m_db_password); - if (PQstatus(m_db_handle) != CONNECTION_OK) { - Mmsg2(&errmsg, _("Unable to connect to PostgreSQL server. Database=%s User=%s\n" + if (PQstatus(mdb->m_db_handle) != CONNECTION_OK) { + Mmsg2(&mdb->errmsg, _("Unable to connect to PostgreSQL server. Database=%s User=%s\n" "Possible causes: SQL server not running; password incorrect; max_connections exceeded.\n"), - m_db_name, m_db_user); - goto bail_out; + mdb->m_db_name, mdb->m_db_user); + goto get_out; } - m_connected = true; - if (!check_tables_version(jcr, this)) { - goto bail_out; + mdb->m_connected = true; + if (!bdb_check_version(jcr)) { + goto get_out; } - sql_query("SET datestyle TO 'ISO, YMD'"); + sql_query("SET datestyle TO 'ISO, YMD'"); sql_query("SET cursor_tuple_fraction=1"); - /* - * Tell PostgreSQL we are using standard conforming strings - * and avoid warnings such as: - * WARNING: nonstandard use of \\ in a string literal - */ - sql_query("SET standard_conforming_strings=on"); - - /* - * Check that encoding is SQL_ASCII - */ - pgsql_check_database_encoding(jcr, this); - - retval = true; - -bail_out: + /* + * Tell PostgreSQL we are using standard conforming strings and avoid warnings such as: + * WARNING: nonstandard use of \\ in a string literal + */ + sql_query("SET standard_conforming_strings=on"); + + /* Check that encoding is SQL_ASCII */ + pgsql_check_database_encoding(jcr, mdb); + + retval = true; + +get_out: V(mutex); - return retval; -} + return retval; +} -void B_DB_POSTGRESQL::db_close_database(JCR *jcr) +void BDB_POSTGRESQL::bdb_close_database(JCR *jcr) { - if (m_connected) { - db_end_transaction(jcr); - } + BDB_POSTGRESQL *mdb = this; + + if (mdb->m_connected) { + bdb_end_transaction(jcr); + } P(mutex); - m_ref_count--; - if (m_ref_count == 0) { - if (m_connected) { - sql_free_result(); - } - db_list->remove(this); - if (m_connected && m_db_handle) { - PQfinish(m_db_handle); - } - if (rwl_is_init(&m_lock)) { - rwl_destroy(&m_lock); + mdb->m_ref_count--; + if (mdb->m_ref_count == 0) { + if (mdb->m_connected) { + sql_free_result(); + } + db_list->remove(mdb); + if (mdb->m_connected && mdb->m_db_handle) { + PQfinish(mdb->m_db_handle); } - free_pool_memory(errmsg); - free_pool_memory(cmd); - free_pool_memory(cached_path); - free_pool_memory(fname); - free_pool_memory(path); - free_pool_memory(esc_name); - free_pool_memory(esc_path); - free_pool_memory(esc_obj); - free_pool_memory(m_buf); - if (m_db_driver) { - free(m_db_driver); - } - if (m_db_name) { - free(m_db_name); - } - if (m_db_user) { - free(m_db_user); - } - if (m_db_password) { - free(m_db_password); - } - if (m_db_address) { - free(m_db_address); - } - if (m_db_socket) { - free(m_db_socket); - } - delete this; + if (is_rwl_valid(&mdb->m_lock)) { + rwl_destroy(&mdb->m_lock); + } + free_pool_memory(mdb->errmsg); + free_pool_memory(mdb->cmd); + free_pool_memory(mdb->cached_path); + free_pool_memory(mdb->fname); + free_pool_memory(mdb->path); + free_pool_memory(mdb->esc_name); + free_pool_memory(mdb->esc_path); + free_pool_memory(mdb->esc_obj); + free_pool_memory(mdb->m_buf); + if (mdb->m_db_driver) { + free(mdb->m_db_driver); + } + if (mdb->m_db_name) { + free(mdb->m_db_name); + } + if (mdb->m_db_user) { + free(mdb->m_db_user); + } + if (mdb->m_db_password) { + free(mdb->m_db_password); + } + if (mdb->m_db_address) { + free(mdb->m_db_address); + } + if (mdb->m_db_socket) { + free(mdb->m_db_socket); + } + delete mdb; if (db_list->size() == 0) { delete db_list; db_list = NULL; @@ -318,59 +355,60 @@ void B_DB_POSTGRESQL::db_close_database(JCR *jcr) V(mutex); } -void B_DB_POSTGRESQL::db_thread_cleanup(void) +void BDB_POSTGRESQL::bdb_thread_cleanup(void) { } /* - * Escape strings so that PostgreSQL is happy + * Escape strings so PostgreSQL is happy * - * NOTE! len is the length of the old string. Your new - * string must be long enough (max 2*old+1) to hold - * the escaped output. + * len is the length of the old string. Your new + * string must be long enough (max 2*old+1) to hold + * the escaped output. */ -void B_DB_POSTGRESQL::db_escape_string(JCR *jcr, char *snew, char *old, int len) +void BDB_POSTGRESQL::bdb_escape_string(JCR *jcr, char *snew, char *old, int len) { - int error; - - PQescapeStringConn(m_db_handle, snew, old, len, &error); - if (error) { - Jmsg(jcr, M_FATAL, 0, _("PQescapeStringConn returned non-zero.\n")); - /* error on encoding, probably invalid multibyte encoding in the source string - see PQescapeStringConn documentation for details. */ - Dmsg0(500, "PQescapeStringConn failed\n"); - } + BDB_POSTGRESQL *mdb = this; + int failed; + + PQescapeStringConn(mdb->m_db_handle, snew, old, len, &failed); + if (failed) { + Jmsg(jcr, M_FATAL, 0, _("PQescapeStringConn returned non-zero.\n")); + /* failed on encoding, probably invalid multibyte encoding in the source string + see PQescapeStringConn documentation for details. */ + Dmsg0(dbglvl_err, "PQescapeStringConn failed\n"); + } } /* * Escape binary so that PostgreSQL is happy * */ -char *B_DB_POSTGRESQL::db_escape_object(JCR *jcr, char *old, int len) +char *BDB_POSTGRESQL::bdb_escape_object(JCR *jcr, char *old, int len) { size_t new_len; - unsigned char *obj; + unsigned char *obj; + BDB_POSTGRESQL *mdb = this; - obj = PQescapeByteaConn(m_db_handle, (unsigned const char *)old, len, &new_len); - if (!obj) { + mdb->esc_obj[0] = 0; + obj = PQescapeByteaConn(mdb->m_db_handle, (unsigned const char *)old, len, &new_len); + if (!obj) { Jmsg(jcr, M_FATAL, 0, _("PQescapeByteaConn returned NULL.\n")); + } else { + mdb->esc_obj = check_pool_memory_size(mdb->esc_obj, new_len+1); + memcpy(mdb->esc_obj, obj, new_len); + mdb->esc_obj[new_len] = 0; + PQfreemem(obj); } - - esc_obj = check_pool_memory_size(esc_obj, new_len+1); - memcpy(esc_obj, obj, new_len); - esc_obj[new_len]=0; - - PQfreemem(obj); - - return (char *)esc_obj; + return (char *)mdb->esc_obj; } /* * Unescape binary object so that PostgreSQL is happy * */ -void B_DB_POSTGRESQL::db_unescape_object(JCR *jcr, char *from, int32_t expected_len, - POOLMEM **dest, int32_t *dest_len) +void BDB_POSTGRESQL::bdb_unescape_object(JCR *jcr, char *from, int32_t expected_len, + POOLMEM **dest, int32_t *dest_len) { size_t new_len; unsigned char *obj; @@ -394,95 +432,98 @@ void B_DB_POSTGRESQL::db_unescape_object(JCR *jcr, char *from, int32_t expected_ PQfreemem(obj); - Dmsg1(010, "obj size: %d\n", *dest_len); + Dmsg1(dbglvl_info, "obj size: %d\n", *dest_len); } /* - * Start a transaction. This groups inserts and makes things - * much more efficient. Usually started when inserting - * file attributes. + * Start a transaction. This groups inserts and makes things more efficient. + * Usually started when inserting file attributes. */ -void B_DB_POSTGRESQL::db_start_transaction(JCR *jcr) +void BDB_POSTGRESQL::bdb_start_transaction(JCR *jcr) { - if (!jcr->attr) { - jcr->attr = get_pool_memory(PM_FNAME); - } - if (!jcr->ar) { - jcr->ar = (ATTR_DBR *)malloc(sizeof(ATTR_DBR)); - } - - /* - * This is turned off because transactions break - * if multiple simultaneous jobs are run. - */ - if (!m_allow_transactions) { - return; - } - - db_lock(this); - /* - * Allow only 25,000 changes per transaction - */ - if (m_transaction && changes > 25000) { - db_end_transaction(jcr); - } - if (!m_transaction) { - sql_query("BEGIN"); /* begin transaction */ - Dmsg0(400, "Start PosgreSQL transaction\n"); - m_transaction = true; - } - db_unlock(this); + BDB_POSTGRESQL *mdb = this; + + if (!jcr->attr) { + jcr->attr = get_pool_memory(PM_FNAME); + } + if (!jcr->ar) { + jcr->ar = (ATTR_DBR *)malloc(sizeof(ATTR_DBR)); + } + + /* + * This is turned off because transactions break if + * multiple simultaneous jobs are run. + */ + if (!mdb->m_allow_transactions) { + return; + } + + bdb_lock(); + /* Allow only 25,000 changes per transaction */ + if (mdb->m_transaction && changes > 25000) { + bdb_end_transaction(jcr); + } + if (!mdb->m_transaction) { + sql_query("BEGIN"); /* begin transaction */ + Dmsg0(dbglvl_info, "Start PosgreSQL transaction\n"); + mdb->m_transaction = true; + } + bdb_unlock(); } -void B_DB_POSTGRESQL::db_end_transaction(JCR *jcr) +void BDB_POSTGRESQL::bdb_end_transaction(JCR *jcr) { - if (jcr && jcr->cached_attribute) { - Dmsg0(400, "Flush last cached attribute.\n"); - if (!db_create_attributes_record(jcr, this, jcr->ar)) { - Jmsg1(jcr, M_FATAL, 0, _("Attribute create error. %s"), db_strerror(jcr->db)); + BDB_POSTGRESQL *mdb = this; + + if (jcr && jcr->cached_attribute) { + Dmsg0(dbglvl_info, "Flush last cached attribute.\n"); + if (!bdb_create_attributes_record(jcr, jcr->ar)) { + Jmsg1(jcr, M_FATAL, 0, _("Attribute create error. %s"), jcr->db->bdb_strerror()); } - jcr->cached_attribute = false; + jcr->cached_attribute = false; } - if (!m_allow_transactions) { - return; + if (!mdb->m_allow_transactions) { + return; } - db_lock(this); - if (m_transaction) { - sql_query("COMMIT"); /* end transaction */ - m_transaction = false; - Dmsg1(400, "End PostgreSQL transaction changes=%d\n", changes); + bdb_lock(); + if (mdb->m_transaction) { + sql_query("COMMIT"); /* end transaction */ + mdb->m_transaction = false; + Dmsg1(dbglvl_info, "End PostgreSQL transaction changes=%d\n", changes); } - changes = 0; - db_unlock(this); + changes = 0; + bdb_unlock(); } /* - * Submit a general SQL command (cmd), and for each row returned, - * the result_handler is called with the ctx. + * Submit a general SQL command, and for each row returned, + * the result_handler is called with the ctx. */ -bool B_DB_POSTGRESQL::db_big_sql_query(const char *query, +bool BDB_POSTGRESQL::bdb_big_sql_query(const char *query, DB_RESULT_HANDLER *result_handler, void *ctx) { - SQL_ROW row; - bool retval = false; - bool in_transaction = m_transaction; + BDB_POSTGRESQL *mdb = this; + SQL_ROW row; + bool retval = false; + bool in_transaction = mdb->m_transaction; - Dmsg1(500, "db_sql_query starts with '%s'\n", query); + Dmsg1(dbglvl_info, "db_sql_query starts with '%s'\n", query); + mdb->errmsg[0] = 0; /* This code handles only SELECT queries */ if (strncasecmp(query, "SELECT", 6) != 0) { - return db_sql_query(query, result_handler, ctx); + return bdb_sql_query(query, result_handler, ctx); } if (!result_handler) { /* no need of big_query without handler */ - return false; + return false; } - db_lock(this); + bdb_lock(); if (!in_transaction) { /* CURSOR needs transaction */ sql_query("BEGIN"); @@ -490,281 +531,274 @@ bool B_DB_POSTGRESQL::db_big_sql_query(const char *query, Mmsg(m_buf, "DECLARE _bac_cursor CURSOR FOR %s", query); - if (!sql_query(m_buf)) { - Mmsg(errmsg, _("Query failed: %s: ERR=%s\n"), m_buf, sql_strerror()); - Dmsg0(50, "db_sql_query failed\n"); - goto bail_out; + if (!sql_query(mdb->m_buf)) { + Mmsg(mdb->errmsg, _("Query failed: %s: ERR=%s\n"), mdb->m_buf, sql_strerror()); + Dmsg1(dbglvl_err, "%s\n", mdb->errmsg); + goto get_out; } do { if (!sql_query("FETCH 100 FROM _bac_cursor")) { - goto bail_out; + Mmsg(mdb->errmsg, _("Fetch failed: ERR=%s\n"), sql_strerror()); + Dmsg1(dbglvl_err, "%s\n", mdb->errmsg); + goto get_out; } while ((row = sql_fetch_row()) != NULL) { - Dmsg1(500, "Fetching %d rows\n", m_num_rows); - if (result_handler(ctx, m_num_fields, row)) + Dmsg1(dbglvl_info, "Fetching %d rows\n", mdb->m_num_rows); + if (result_handler(ctx, mdb->m_num_fields, row)) break; } - PQclear(m_result); + PQclear(mdb->m_result); m_result = NULL; } while (m_num_rows > 0); /* TODO: Can probably test against 100 */ sql_query("CLOSE _bac_cursor"); - Dmsg0(500, "db_big_sql_query finished\n"); + Dmsg0(dbglvl_info, "db_big_sql_query finished\n"); sql_free_result(); retval = true; -bail_out: +get_out: if (!in_transaction) { sql_query("COMMIT"); /* end transaction */ } - db_unlock(this); + bdb_unlock(); return retval; } -/* - * Submit a general SQL command (cmd), and for each row returned, - * the result_handler is called with the ctx. - */ -bool B_DB_POSTGRESQL::db_sql_query(const char *query, DB_RESULT_HANDLER *result_handler, void *ctx) +/* + * Submit a general SQL command, and for each row returned, + * the result_handler is called with the ctx. + */ +bool BDB_POSTGRESQL::bdb_sql_query(const char *query, DB_RESULT_HANDLER *result_handler, void *ctx) { - SQL_ROW row; - bool retval = true; - - Dmsg1(500, "db_sql_query starts with '%s'\n", query); - - db_lock(this); - if (!sql_query(query, QF_STORE_RESULT)) { - Mmsg(errmsg, _("Query failed: %s: ERR=%s\n"), query, sql_strerror()); - Dmsg0(500, "db_sql_query failed\n"); - retval = false; - goto bail_out; - } - - Dmsg0(500, "db_sql_query succeeded. checking handler\n"); - - if (result_handler != NULL) { - Dmsg0(500, "db_sql_query invoking handler\n"); - while ((row = sql_fetch_row()) != NULL) { - Dmsg0(500, "db_sql_query sql_fetch_row worked\n"); - if (result_handler(ctx, m_num_fields, row)) - break; - } - sql_free_result(); - } - - Dmsg0(500, "db_sql_query finished\n"); - -bail_out: - db_unlock(this); - return retval; + SQL_ROW row; + bool retval = true; + BDB_POSTGRESQL *mdb = this; + + Dmsg1(dbglvl_info, "db_sql_query starts with '%s'\n", query); + + bdb_lock(); + mdb->errmsg[0] = 0; + if (!sql_query(query, QF_STORE_RESULT)) { + Mmsg(mdb->errmsg, _("Query failed: %s: ERR=%s\n"), query, sql_strerror()); + Dmsg0(dbglvl_err, "db_sql_query failed\n"); + retval = false; + goto get_out; + } + + Dmsg0(dbglvl_info, "db_sql_query succeeded. checking handler\n"); + + if (result_handler) { + Dmsg0(dbglvl_dbg, "db_sql_query invoking handler\n"); + while ((row = sql_fetch_row())) { + Dmsg0(dbglvl_dbg, "db_sql_query sql_fetch_row worked\n"); + if (result_handler(ctx, mdb->m_num_fields, row)) + break; + } + sql_free_result(); + } + + Dmsg0(dbglvl_info, "db_sql_query finished\n"); + +get_out: + bdb_unlock(); + return retval; } /* - * Note, if this routine returns false (failure), Bacula expects - * that no result has been stored. - * This is where QUERY_DB comes with Postgresql. + * If this routine returns false (failure), Bacula expects + * that no result has been stored. + * This is where QueryDB calls to with Postgresql. * - * Returns: true on success - * false on failure + * Returns: true on success + * false on failure * */ -bool B_DB_POSTGRESQL::sql_query(const char *query, int flags) +bool BDB_POSTGRESQL::sql_query(const char *query, int flags) { - int i; - bool retval = false; + int i; + bool retval = false; + BDB_POSTGRESQL *mdb = this; - Dmsg1(500, "sql_query starts with '%s'\n", query); - /* - * We are starting a new query. reset everything. - */ - m_num_rows = -1; - m_row_number = -1; - m_field_number = -1; + Dmsg1(dbglvl_info, "sql_query starts with '%s'\n", query); - if (m_result) { - PQclear(m_result); /* hmm, someone forgot to free?? */ - m_result = NULL; - } + /* We are starting a new query. reset everything. */ + mdb->m_num_rows = -1; + mdb->m_row_number = -1; + mdb->m_field_number = -1; - for (i = 0; i < 10; i++) { - m_result = PQexec(m_db_handle, query); - if (m_result) { + if (mdb->m_result) { + PQclear(mdb->m_result); /* hmm, someone forgot to free?? */ + mdb->m_result = NULL; + } + + for (i = 0; i < 10; i++) { + mdb->m_result = PQexec(mdb->m_db_handle, query); + if (mdb->m_result) { break; } bmicrosleep(5, 0); } - if (!m_result) { - Dmsg1(50, "Query failed: %s\n", query); - goto bail_out; + if (!mdb->m_result) { + Dmsg1(dbglvl_err, "Query failed: %s\n", query); + goto get_out; } - m_status = PQresultStatus(m_result); - if (m_status == PGRES_TUPLES_OK || m_status == PGRES_COMMAND_OK) { - Dmsg0(500, "we have a result\n"); + mdb->m_status = PQresultStatus(mdb->m_result); + if (mdb->m_status == PGRES_TUPLES_OK || mdb->m_status == PGRES_COMMAND_OK) { + Dmsg0(dbglvl_dbg, "we have a result\n"); - /* - * How many fields in the set? - */ - m_num_fields = (int)PQnfields(m_result); - Dmsg1(500, "we have %d fields\n", m_num_fields); + /* How many fields in the set? */ + mdb->m_num_fields = (int)PQnfields(mdb->m_result); + Dmsg1(dbglvl_dbg, "we have %d fields\n", mdb->m_num_fields); - m_num_rows = PQntuples(m_result); - Dmsg1(500, "we have %d rows\n", m_num_rows); + mdb->m_num_rows = PQntuples(mdb->m_result); + Dmsg1(dbglvl_dbg, "we have %d rows\n", mdb->m_num_rows); - m_row_number = 0; /* we can start to fetch something */ - m_status = 0; /* succeed */ - retval = true; + mdb->m_row_number = 0; /* we can start to fetch something */ + mdb->m_status = 0; /* succeed */ + retval = true; } else { - Dmsg1(50, "Result status failed: %s\n", query); - goto bail_out; + Dmsg1(dbglvl_err, "Result status failed: %s\n", query); + goto get_out; } - Dmsg0(500, "sql_query finishing\n"); - goto ok_out; + Dmsg0(dbglvl_info, "sql_query finishing\n"); + goto ok_out; -bail_out: - Dmsg0(500, "we failed\n"); - PQclear(m_result); - m_result = NULL; - m_status = 1; /* failed */ +get_out: + Dmsg0(dbglvl_err, "we failed\n"); + PQclear(mdb->m_result); + mdb->m_result = NULL; + mdb->m_status = 1; /* failed */ + +ok_out: + return retval; +} -ok_out: - return retval; -} - -void B_DB_POSTGRESQL::sql_free_result(void) +void BDB_POSTGRESQL::sql_free_result(void) { - db_lock(this); - if (m_result) { - PQclear(m_result); - m_result = NULL; - } - if (m_rows) { - free(m_rows); - m_rows = NULL; - } - if (m_fields) { - free(m_fields); - m_fields = NULL; - } - m_num_rows = m_num_fields = 0; - db_unlock(this); -} - -SQL_ROW B_DB_POSTGRESQL::sql_fetch_row(void) -{ - int j; - SQL_ROW row = NULL; /* by default, return NULL */ - - Dmsg0(500, "sql_fetch_row start\n"); - - if (m_num_fields == 0) { /* No field, no row */ - Dmsg0(500, "sql_fetch_row finishes returning NULL, no fields\n"); + BDB_POSTGRESQL *mdb = this; + + bdb_lock(); + if (mdb->m_result) { + PQclear(mdb->m_result); + mdb->m_result = NULL; + } + if (mdb->m_rows) { + free(mdb->m_rows); + mdb->m_rows = NULL; + } + if (mdb->m_fields) { + free(mdb->m_fields); + mdb->m_fields = NULL; + } + mdb->m_num_rows = mdb->m_num_fields = 0; + bdb_unlock(); +} + +SQL_ROW BDB_POSTGRESQL::sql_fetch_row(void) +{ + SQL_ROW row = NULL; /* by default, return NULL */ + BDB_POSTGRESQL *mdb = this; + + Dmsg0(dbglvl_info, "sql_fetch_row start\n"); + + if (mdb->m_num_fields == 0) { /* No field, no row */ + Dmsg0(dbglvl_err, "sql_fetch_row finishes returning NULL, no fields\n"); return NULL; } - if (!m_rows || m_rows_size < m_num_fields) { - if (m_rows) { - Dmsg0(500, "sql_fetch_row freeing space\n"); - free(m_rows); - } - Dmsg1(500, "we need space for %d bytes\n", sizeof(char *) * m_num_fields); - m_rows = (SQL_ROW)malloc(sizeof(char *) * m_num_fields); - m_rows_size = m_num_fields; - - /* - * Now reset the row_number now that we have the space allocated - */ - m_row_number = 0; - } - - /* - * If still within the result set - */ - if (m_row_number >= 0 && m_row_number < m_num_rows) { - Dmsg2(500, "sql_fetch_row row number '%d' is acceptable (0..%d)\n", m_row_number, m_num_rows); - /* - * Get each value from this row - */ - for (j = 0; j < m_num_fields; j++) { - m_rows[j] = PQgetvalue(m_result, m_row_number, j); - Dmsg2(500, "sql_fetch_row field '%d' has value '%s'\n", j, m_rows[j]); - } - /* - * Increment the row number for the next call - */ - m_row_number++; - row = m_rows; - } else { - Dmsg2(500, "sql_fetch_row row number '%d' is NOT acceptable (0..%d)\n", m_row_number, m_num_rows); - } - - Dmsg1(500, "sql_fetch_row finishes returning %p\n", row); - - return row; -} - -const char *B_DB_POSTGRESQL::sql_strerror(void) -{ - return PQerrorMessage(m_db_handle); + if (!mdb->m_rows || mdb->m_rows_size < mdb->m_num_fields) { + if (mdb->m_rows) { + Dmsg0(dbglvl_dbg, "sql_fetch_row freeing space\n"); + free(mdb->m_rows); + } + Dmsg1(dbglvl_dbg, "we need space for %d bytes\n", sizeof(char *) * mdb->m_num_fields); + mdb->m_rows = (SQL_ROW)malloc(sizeof(char *) * mdb->m_num_fields); + mdb->m_rows_size = mdb->m_num_fields; + + /* Now reset the row_number now that we have the space allocated */ + mdb->m_row_number = 0; + } + + /* If still within the result set */ + if (mdb->m_row_number >= 0 && mdb->m_row_number < mdb->m_num_rows) { + Dmsg2(dbglvl_dbg, "sql_fetch_row row number '%d' is acceptable (0..%d)\n", mdb->m_row_number, m_num_rows); + + /* Get each value from this row */ + for (int j = 0; j < mdb->m_num_fields; j++) { + mdb->m_rows[j] = PQgetvalue(mdb->m_result, mdb->m_row_number, j); + Dmsg2(dbglvl_dbg, "sql_fetch_row field '%d' has value '%s'\n", j, mdb->m_rows[j]); + } + mdb->m_row_number++; /* Increment the row number for the next call */ + row = mdb->m_rows; + } else { + Dmsg2(dbglvl_dbg, "sql_fetch_row row number '%d' is NOT acceptable (0..%d)\n", mdb->m_row_number, m_num_rows); + } + + Dmsg1(dbglvl_info, "sql_fetch_row finishes returning %p\n", row); + + return row; } -void B_DB_POSTGRESQL::sql_data_seek(int row) +const char *BDB_POSTGRESQL::sql_strerror(void) { - /* - * Set the row number to be returned on the next call to sql_fetch_row - */ - m_row_number = row; -} - -int B_DB_POSTGRESQL::sql_affected_rows(void) -{ - return (unsigned) str_to_int32(PQcmdTuples(m_result)); -} - -uint64_t B_DB_POSTGRESQL::sql_insert_autokey_record(const char *query, const char *table_name) -{ - int i; - uint64_t id = 0; - char sequence[NAMEDATALEN-1]; - char getkeyval_query[NAMEDATALEN+50]; - PGresult *pg_result; - - /* - * First execute the insert query and then retrieve the currval. - */ - if (!sql_query(query)) { - return 0; - } - - m_num_rows = sql_affected_rows(); - if (m_num_rows != 1) { - return 0; - } - - changes++; - - /* - * Obtain the current value of the sequence that - * provides the serial value for primary key of the table. - * - * currval is local to our session. It is not affected by - * other transactions. - * - * Determine the name of the sequence. - * PostgreSQL automatically creates a sequence using - * __seq. - * At the time of writing, all tables used this format for - * for their primary key:
id - * Except for basefiles which has a primary key on baseid. - * Therefore, we need to special case that one table. - * - * everything else can use the PostgreSQL formula. - */ + BDB_POSTGRESQL *mdb = this; + return PQerrorMessage(mdb->m_db_handle); +} + +void BDB_POSTGRESQL::sql_data_seek(int row) +{ + BDB_POSTGRESQL *mdb = this; + /* Set the row number to be returned on the next call to sql_fetch_row */ + mdb->m_row_number = row; +} + +int BDB_POSTGRESQL::sql_affected_rows(void) +{ + BDB_POSTGRESQL *mdb = this; + return (unsigned)str_to_int32(PQcmdTuples(mdb->m_result)); +} + +uint64_t BDB_POSTGRESQL::sql_insert_autokey_record(const char *query, const char *table_name) +{ + uint64_t id = 0; + char sequence[NAMEDATALEN-1]; + char getkeyval_query[NAMEDATALEN+50]; + PGresult *p_result; + BDB_POSTGRESQL *mdb = this; + + /* First execute the insert query and then retrieve the currval. */ + if (!sql_query(query)) { + return 0; + } + + mdb->m_num_rows = sql_affected_rows(); + if (mdb->m_num_rows != 1) { + return 0; + } + mdb->changes++; + /* + * Obtain the current value of the sequence that + * provides the serial value for primary key of the table. + * + * currval is local to our session. It is not affected by + * other transactions. + * + * Determine the name of the sequence. + * PostgreSQL automatically creates a sequence using + *
__seq. + * At the time of writing, all tables used this format for + * for their primary key:
id + * Except for basefiles which has a primary key on baseid. + * Therefore, we need to special case that one table. + * + * everything else can use the PostgreSQL formula. + */ if (strcasecmp(table_name, "basefiles") == 0) { bstrncpy(sequence, "basefiles_baseid", sizeof(sequence)); } else { @@ -775,170 +809,164 @@ uint64_t B_DB_POSTGRESQL::sql_insert_autokey_record(const char *query, const cha } bstrncat(sequence, "_seq", sizeof(sequence)); - bsnprintf(getkeyval_query, sizeof(getkeyval_query), "SELECT currval('%s')", sequence); + bsnprintf(getkeyval_query, sizeof(getkeyval_query), "SELECT currval('%s')", sequence); - Dmsg1(500, "sql_insert_autokey_record executing query '%s'\n", getkeyval_query); - for (i = 0; i < 10; i++) { - pg_result = PQexec(m_db_handle, getkeyval_query); - if (pg_result) { + Dmsg1(dbglvl_info, "sql_insert_autokey_record executing query '%s'\n", getkeyval_query); + for (int i = 0; i < 10; i++) { + p_result = PQexec(mdb->m_db_handle, getkeyval_query); + if (p_result) { break; } bmicrosleep(5, 0); } - if (!pg_result) { - Dmsg1(50, "Query failed: %s\n", getkeyval_query); - goto bail_out; + if (!p_result) { + Dmsg1(dbglvl_err, "Query failed: %s\n", getkeyval_query); + goto get_out; } - Dmsg0(500, "exec done"); + Dmsg0(dbglvl_dbg, "exec done"); - if (PQresultStatus(pg_result) == PGRES_TUPLES_OK) { - Dmsg0(500, "getting value"); - id = str_to_uint64(PQgetvalue(pg_result, 0, 0)); - Dmsg2(500, "got value '%s' which became %d\n", PQgetvalue(pg_result, 0, 0), id); + if (PQresultStatus(p_result) == PGRES_TUPLES_OK) { + Dmsg0(dbglvl_dbg, "getting value"); + id = str_to_uint64(PQgetvalue(p_result, 0, 0)); + Dmsg2(dbglvl_dbg, "got value '%s' which became %d\n", PQgetvalue(p_result, 0, 0), id); } else { - Dmsg1(50, "Result status failed: %s\n", getkeyval_query); - Mmsg1(&errmsg, _("error fetching currval: %s\n"), PQerrorMessage(m_db_handle)); + Dmsg1(dbglvl_err, "Result status failed: %s\n", getkeyval_query); + Mmsg1(&mdb->errmsg, _("error fetching currval: %s\n"), PQerrorMessage(mdb->m_db_handle)); } -bail_out: - PQclear(pg_result); - +get_out: + PQclear(p_result); return id; -} - -SQL_FIELD *B_DB_POSTGRESQL::sql_fetch_field(void) -{ - int i, j; - int max_length; - int this_length; - - Dmsg0(500, "sql_fetch_field starts\n"); - - if (!m_fields || m_fields_size < m_num_fields) { - if (m_fields) { - free(m_fields); - m_fields = NULL; - } - Dmsg1(500, "allocating space for %d fields\n", m_num_fields); - m_fields = (SQL_FIELD *)malloc(sizeof(SQL_FIELD) * m_num_fields); - m_fields_size = m_num_fields; - - for (i = 0; i < m_num_fields; i++) { - Dmsg1(500, "filling field %d\n", i); - m_fields[i].name = PQfname(m_result, i); - m_fields[i].type = PQftype(m_result, i); - m_fields[i].flags = 0; - - /* - * For a given column, find the max length. - */ - max_length = 0; - for (j = 0; j < m_num_rows; j++) { - if (PQgetisnull(m_result, j, i)) { - this_length = 4; /* "NULL" */ - } else { - this_length = cstrlen(PQgetvalue(m_result, j, i)); - } - - if (max_length < this_length) { - max_length = this_length; - } - } - m_fields[i].max_length = max_length; - - Dmsg4(500, "sql_fetch_field finds field '%s' has length='%d' type='%d' and IsNull=%d\n", - m_fields[i].name, m_fields[i].max_length, m_fields[i].type, m_fields[i].flags); - } - } - - /* - * Increment field number for the next time around - */ - return &m_fields[m_field_number++]; -} - -bool B_DB_POSTGRESQL::sql_field_is_not_null(int field_type) -{ - switch (field_type) { - case 1: - return true; - default: - return false; - } -} - -bool B_DB_POSTGRESQL::sql_field_is_numeric(int field_type) -{ - /* - * TEMP: the following is taken from select OID, typname from pg_type; - */ - switch (field_type) { - case 20: - case 21: - case 23: - case 700: - case 701: - return true; - default: - return false; - } -} - -/* - * Escape strings so that PostgreSQL is happy on COPY - * - * NOTE! len is the length of the old string. Your new - * string must be long enough (max 2*old+1) to hold - * the escaped output. - */ -static char *pgsql_copy_escape(char *dest, char *src, size_t len) -{ - /* we have to escape \t, \n, \r, \ */ - char c = '\0' ; - - while (len > 0 && *src) { - switch (*src) { - case '\n': - c = 'n'; - break; - case '\\': - c = '\\'; - break; - case '\t': - c = 't'; - break; - case '\r': - c = 'r'; - break; - default: - c = '\0' ; - } - - if (c) { - *dest = '\\'; - dest++; - *dest = c; - } else { - *dest = *src; - } - - len--; - src++; - dest++; - } - - *dest = '\0'; - return dest; -} - -bool B_DB_POSTGRESQL::sql_batch_start(JCR *jcr) +} + +SQL_FIELD *BDB_POSTGRESQL::sql_fetch_field(void) +{ + int max_len; + int this_len; + BDB_POSTGRESQL *mdb = this; + + Dmsg0(dbglvl_dbg, "sql_fetch_field starts\n"); + + if (!mdb->m_fields || mdb->m_fields_size < mdb->m_num_fields) { + if (mdb->m_fields) { + free(mdb->m_fields); + mdb->m_fields = NULL; + } + Dmsg1(dbglvl_dbg, "allocating space for %d fields\n", mdb->m_num_fields); + mdb->m_fields = (SQL_FIELD *)malloc(sizeof(SQL_FIELD) * mdb->m_num_fields); + mdb->m_fields_size = mdb->m_num_fields; + + for (int i = 0; i < mdb->m_num_fields; i++) { + Dmsg1(dbglvl_dbg, "filling field %d\n", i); + mdb->m_fields[i].name = PQfname(mdb->m_result, i); + mdb->m_fields[i].type = PQftype(mdb->m_result, i); + mdb->m_fields[i].flags = 0; + + /* For a given column, find the max length. */ + max_len = 0; + for (int j = 0; j < mdb->m_num_rows; j++) { + if (PQgetisnull(mdb->m_result, j, i)) { + this_len = 4; /* "NULL" */ + } else { + this_len = cstrlen(PQgetvalue(mdb->m_result, j, i)); + } + + if (max_len < this_len) { + max_len = this_len; + } + } + mdb->m_fields[i].max_length = max_len; + + Dmsg4(dbglvl_dbg, "sql_fetch_field finds field '%s' has length='%d' type='%d' and IsNull=%d\n", + mdb->m_fields[i].name, mdb->m_fields[i].max_length, mdb->m_fields[i].type, mdb->m_fields[i].flags); + } + } + + /* Increment field number for the next time around */ + return &mdb->m_fields[mdb->m_field_number++]; +} + +bool BDB_POSTGRESQL::sql_field_is_not_null(int field_type) +{ + if (field_type == 1) { + return true; + } + return false; +} + +bool BDB_POSTGRESQL::sql_field_is_numeric(int field_type) +{ + /* + * TEMP: the following is taken from select OID, typname from pg_type; + */ + switch (field_type) { + case 20: + case 21: + case 23: + case 700: + case 701: + return true; + default: + return false; + } +} + +/* + * Escape strings so PostgreSQL is happy on COPY + * + * len is the length of the old string. Your new + * string must be long enough (max 2*old+1) to hold + * the escaped output. + */ +static char *pgsql_copy_escape(char *dest, char *src, size_t len) +{ + /* we have to escape \t, \n, \r, \ */ + char c = '\0' ; + + while (len > 0 && *src) { + switch (*src) { + case '\n': + c = 'n'; + break; + case '\\': + c = '\\'; + break; + case '\t': + c = 't'; + break; + case '\r': + c = 'r'; + break; + default: + c = '\0' ; + } + + if (c) { + *dest = '\\'; + dest++; + *dest = c; + } else { + *dest = *src; + } + + len--; + src++; + dest++; + } + + *dest = '\0'; + return dest; +} + +bool BDB_POSTGRESQL::sql_batch_start(JCR *jcr) { + BDB_POSTGRESQL *mdb = this; const char *query = "COPY batch FROM STDIN"; - - Dmsg0(500, "sql_batch_start started\n"); - - if (!sql_query("CREATE TEMPORARY TABLE batch (" + + Dmsg0(dbglvl_info, "sql_batch_start started\n"); + + if (!sql_query("CREATE TEMPORARY TABLE batch (" "FileIndex int," "JobId int," "Path varchar," @@ -946,112 +974,109 @@ bool B_DB_POSTGRESQL::sql_batch_start(JCR *jcr) "LStat varchar," "Md5 varchar," "DeltaSeq smallint)")) { - Dmsg0(500, "sql_batch_start failed\n"); - return false; + Dmsg0(dbglvl_err, "sql_batch_start failed\n"); + return false; } - /* - * We are starting a new query. reset everything. - */ - m_num_rows = -1; - m_row_number = -1; - m_field_number = -1; + /* We are starting a new query. reset everything. */ + mdb->m_num_rows = -1; + mdb->m_row_number = -1; + mdb->m_field_number = -1; - sql_free_result(); + sql_free_result(); for (int i=0; i < 10; i++) { - m_result = PQexec(m_db_handle, query); - if (m_result) { + mdb->m_result = PQexec(mdb->m_db_handle, query); + if (mdb->m_result) { break; } bmicrosleep(5, 0); } - if (!m_result) { - Dmsg1(50, "Query failed: %s\n", query); - goto bail_out; + if (!mdb->m_result) { + Dmsg1(dbglvl_err, "Query failed: %s\n", query); + goto get_out; } - m_status = PQresultStatus(m_result); - if (m_status == PGRES_COPY_IN) { - /* - * How many fields in the set? - */ - m_num_fields = (int) PQnfields(m_result); - m_num_rows = 0; - m_status = 1; + mdb->m_status = PQresultStatus(mdb->m_result); + if (mdb->m_status == PGRES_COPY_IN) { + /* How many fields in the set? */ + mdb->m_num_fields = (int) PQnfields(mdb->m_result); + mdb->m_num_rows = 0; + mdb->m_status = 1; } else { - Dmsg1(50, "Result status failed: %s\n", query); - goto bail_out; + Dmsg1(dbglvl_err, "Result status failed: %s\n", query); + goto get_out; } - Dmsg0(500, "sql_batch_start finishing\n"); + Dmsg0(dbglvl_info, "sql_batch_start finishing\n"); - return true; + return true; -bail_out: - Mmsg1(&errmsg, _("error starting batch mode: %s"), PQerrorMessage(m_db_handle)); - m_status = 0; - PQclear(m_result); - m_result = NULL; - return false; +get_out: + Mmsg1(&mdb->errmsg, _("error starting batch mode: %s"), PQerrorMessage(mdb->m_db_handle)); + mdb->m_status = 0; + PQclear(mdb->m_result); + mdb->m_result = NULL; + return false; } -/* - * Set error to something to abort operation - */ -bool B_DB_POSTGRESQL::sql_batch_end(JCR *jcr, const char *error) +/* + * Set error to something to abort the operation + */ +bool BDB_POSTGRESQL::sql_batch_end(JCR *jcr, const char *error) { int res; int count=30; - PGresult *pg_result; + PGresult *p_result; + BDB_POSTGRESQL *mdb = this; - Dmsg0(500, "sql_batch_end started\n"); + Dmsg0(dbglvl_info, "sql_batch_end started\n"); do { - res = PQputCopyEnd(m_db_handle, error); + res = PQputCopyEnd(mdb->m_db_handle, error); } while (res == 0 && --count > 0); if (res == 1) { - Dmsg0(500, "ok\n"); - m_status = 0; + Dmsg0(dbglvl_dbg, "ok\n"); + mdb->m_status = 0; } if (res <= 0) { - Dmsg0(500, "we failed\n"); - m_status = 1; - Mmsg1(&errmsg, _("error ending batch mode: %s"), PQerrorMessage(m_db_handle)); - Dmsg1(500, "failure %s\n", errmsg); + mdb->m_status = 1; + Mmsg1(&mdb->errmsg, _("error ending batch mode: %s"), PQerrorMessage(mdb->m_db_handle)); + Dmsg1(dbglvl_err, "failure %s\n", errmsg); } /* Check command status and return to normal libpq state */ - pg_result = PQgetResult(m_db_handle); - if (PQresultStatus(pg_result) != PGRES_COMMAND_OK) { - Mmsg1(&errmsg, _("error ending batch mode: %s"), PQerrorMessage(m_db_handle)); - m_status = 1; + p_result = PQgetResult(mdb->m_db_handle); + if (PQresultStatus(p_result) != PGRES_COMMAND_OK) { + Mmsg1(&mdb->errmsg, _("error ending batch mode: %s"), PQerrorMessage(mdb->m_db_handle)); + mdb->m_status = 1; } /* Get some statistics to compute the best plan */ sql_query("ANALYZE batch"); - PQclear(pg_result); + PQclear(p_result); - Dmsg0(500, "sql_batch_end finishing\n"); - return true; + Dmsg0(dbglvl_info, "sql_batch_end finishing\n"); + return true; } -bool B_DB_POSTGRESQL::sql_batch_insert(JCR *jcr, ATTR_DBR *ar) +bool BDB_POSTGRESQL::sql_batch_insert(JCR *jcr, ATTR_DBR *ar) { int res; int count=30; size_t len; const char *digest; char ed1[50]; + BDB_POSTGRESQL *mdb = this; - esc_name = check_pool_memory_size(esc_name, fnl*2+1); - pgsql_copy_escape(esc_name, fname, fnl); + mdb->esc_name = check_pool_memory_size(mdb->esc_name, fnl*2+1); + pgsql_copy_escape(mdb->esc_name, fname, fnl); - esc_path = check_pool_memory_size(esc_path, pnl*2+1); - pgsql_copy_escape(esc_path, path, pnl); + mdb->esc_path = check_pool_memory_size(mdb->esc_path, pnl*2+1); + pgsql_copy_escape(mdb->esc_path, path, pnl); if (ar->Digest == NULL || ar->Digest[0] == 0) { digest = "0"; @@ -1059,69 +1084,30 @@ bool B_DB_POSTGRESQL::sql_batch_insert(JCR *jcr, ATTR_DBR *ar) digest = ar->Digest; } - len = Mmsg(cmd, "%u\t%s\t%s\t%s\t%s\t%s\t%u\n", - ar->FileIndex, edit_int64(ar->JobId, ed1), esc_path, - esc_name, ar->attr, digest, ar->DeltaSeq); + len = Mmsg(mdb->cmd, "%u\t%s\t%s\t%s\t%s\t%s\t%u\n", + ar->FileIndex, edit_int64(ar->JobId, ed1), mdb->esc_path, + mdb->esc_name, ar->attr, digest, ar->DeltaSeq); do { - res = PQputCopyData(m_db_handle, cmd, len); + res = PQputCopyData(mdb->m_db_handle, mdb->cmd, len); } while (res == 0 && --count > 0); if (res == 1) { - Dmsg0(500, "ok\n"); - changes++; - m_status = 1; + Dmsg0(dbglvl_dbg, "ok\n"); + mdb->changes++; + mdb->m_status = 1; } if (res <= 0) { - Dmsg0(500, "we failed\n"); - m_status = 0; - Mmsg1(&errmsg, _("error copying in batch mode: %s"), PQerrorMessage(m_db_handle)); - Dmsg1(500, "failure %s\n", errmsg); + mdb->m_status = 0; + Mmsg1(&mdb->errmsg, _("error copying in batch mode: %s"), PQerrorMessage(mdb->m_db_handle)); + Dmsg1(dbglvl_err, "failure %s\n", mdb->errmsg); } - Dmsg0(500, "sql_batch_insert finishing\n"); + Dmsg0(dbglvl_info, "sql_batch_insert finishing\n"); - return true; + return true; } -/* - * Initialize database data structure. In principal this should - * never have errors, or it is really fatal. - */ -B_DB *db_init_database(JCR *jcr, const char *db_driver, const char *db_name, - const char *db_user, const char *db_password, - const char *db_address, int db_port, - const char *db_socket, bool mult_db_connections, - bool disable_batch_insert) -{ - B_DB_POSTGRESQL *mdb = NULL; - - if (!db_user) { - Jmsg(jcr, M_FATAL, 0, _("A user name for PostgreSQL must be supplied.\n")); - return NULL; - } - P(mutex); /* lock DB queue */ - if (db_list && !mult_db_connections) { - /* - * Look to see if DB already open - */ - foreach_dlist(mdb, db_list) { - if (mdb->db_match_database(db_driver, db_name, db_address, db_port)) { - Dmsg1(100, "DB REopen %s\n", db_name); - mdb->increment_refcount(); - goto bail_out; - } - } - } - Dmsg0(100, "db_init_database first time\n"); - mdb = New(B_DB_POSTGRESQL(jcr, db_driver, db_name, db_user, db_password, - db_address, db_port, db_socket, - mult_db_connections, disable_batch_insert)); - -bail_out: - V(mutex); - return mdb; -} #endif /* HAVE_POSTGRESQL */ diff --git a/bacula/src/cats/postgresql.in b/bacula/src/cats/postgresql.in index d890e470c7..ccd273d2b4 100644 --- a/bacula/src/cats/postgresql.in +++ b/bacula/src/cats/postgresql.in @@ -1,21 +1,9 @@ #!/bin/sh # -# shell script to create Bacula PostgreSQL tables -# -# -# Bacula® - The Network Backup Solution -# -# Copyright (C) 2000-2014 Free Software Foundation Europe e.V. +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # -# The main author of Bacula is Kern Sibbald, with contributions from many -# others, a complete list can be found in the file AUTHORS. -# -# You may use this file and others of this release according to the -# license defined in the LICENSE file, which includes the Affero General -# Public License, v3.0 ("AGPLv3") and some additional permissions and -# terms pursuant to its AGPLv3 Section 7. -# -# Bacula® is a registered trademark of Kern Sibbald. +# shell script to create Bacula PostgreSQL tables # bindir=@POSTGRESQL_BINDIR@ db_name=@db_name@ diff --git a/bacula/src/cats/protos.h b/bacula/src/cats/protos.h index f4a53c6860..cc6510c447 100644 --- a/bacula/src/cats/protos.h +++ b/bacula/src/cats/protos.h @@ -1,23 +1,40 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * * Database routines that are exported by the cats library for * use elsewhere in Bacula (mainly the Director). * + * Note: the interface that is used by the core Bacula code outside + * of the cats directory has names that are: + * db_xxx(x, db, y, ...) + * usually with a database pointer such as db as an argument. + * This simplifies the vast bulk of the code and makes it easier to read. + * These are translated into class calls on the db pointer by a #define + * in this file. + * + * The actual class code is named bdb_xxx(x, y, ...) and is called with + * the class pointer such as db->bdb_xxx(x, y, ...) The code in this + * cats directory can use the db_xxx() calls or the db->bdb_xxx() calls. + * In the Bacula core code we prefer using only the db_xxx() calls. + * * Written by Kern Sibbald, MM */ @@ -26,114 +43,247 @@ #include "cats.h" -/* Database prototypes */ +BDB *db_init_database(JCR *jcr, const char *db_driver, const char *db_name, + const char *db_user, const char *db_password, + const char *db_address, int db_port, + const char *db_socket, bool mult_db_connections, bool disable_batch_insert); + +/* Database prototypes and defines */ + +/* Misc */ +#define db_lock(mdb) \ + mdb->bdb_lock() +#define db_unlock(mdb) \ + mdb->bdb_unlock() + + +/* Virtual methods */ +#define db_escape_string(jcr, mdb, snew, old, len) \ + mdb->bdb_escape_string(jcr, snew, old, len) +#define db_escape_object(jcr, mdb, old, len) \ + mdb->bdb_escape_object(jcr, old, len) +#define db_unescape_object(jcr, mdb, from, expected_len, dest, len) \ + mdb->bdb_unescape_object(jcr, from, expected_len, dest, len) +#define db_open_database(jcr, mdb) \ + mdb->bdb_open_database(jcr) +#define db_close_database(jcr, mdb) \ + mdb->bdb_close_database(jcr) +#define db_close_database(jcr, mdb) \ + mdb->bdb_close_database(jcr) +#define db_start_transaction(jcr, mdb) \ + mdb->bdb_start_transaction(jcr) +#define db_end_transaction(jcr, mdb) \ + mdb->bdb_end_transaction(jcr) +#define db_sql_query(mdb, query, result_handler, ctx) \ + mdb->bdb_sql_query(query, result_handler, ctx) +#define db_thread_cleanup(mdb) \ + mdb->bdb_thread_cleanup() /* sql.c */ -bool db_open_batch_connexion(JCR *jcr, B_DB *mdb); -char *db_strerror(B_DB *mdb); int db_int64_handler(void *ctx, int num_fields, char **row); int db_strtime_handler(void *ctx, int num_fields, char **row); int db_list_handler(void *ctx, int num_fields, char **row); -void db_debug_print(JCR *jcr, FILE *fp); -int db_int_handler(void *ctx, int num_fields, char **row); -void db_check_backend_thread_safe(); int db_string_list_handler(void *ctx, int num_fields, char **row); +int db_int_handler(void *ctx, int num_fields, char **row); +void bdb_debug_print(JCR *jcr, FILE *fp); +void db_free_restoreobject_record(JCR *jcr, ROBJECT_DBR *rr); + +#define db_open_batch_connexion(jcr, mdb) \ + mdb->bdb_open_batch_connexion(jcr) +#define db_strerror(mdb) \ + mdb->bdb_strerror() +#define db_debug_print(jcr, fp) \ + bdb_debug_print(jcr, fp) +#define db_check_max_connections(jcr, mdb, maxc) \ + mdb->bdb_check_max_connections(jcr, maxc) /* sql_create.c */ -int db_create_path_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar); -bool db_create_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar); -bool db_create_job_record(JCR *jcr, B_DB *db, JOB_DBR *jr); -int db_create_media_record(JCR *jcr, B_DB *db, MEDIA_DBR *media_dbr); -int db_create_client_record(JCR *jcr, B_DB *db, CLIENT_DBR *cr); -bool db_create_fileset_record(JCR *jcr, B_DB *db, FILESET_DBR *fsr); -bool db_create_pool_record(JCR *jcr, B_DB *db, POOL_DBR *pool_dbr); -bool db_create_jobmedia_record(JCR *jcr, B_DB *mdb, JOBMEDIA_DBR *jr); -int db_create_counter_record(JCR *jcr, B_DB *mdb, COUNTER_DBR *cr); -bool db_create_device_record(JCR *jcr, B_DB *mdb, DEVICE_DBR *dr); -bool db_create_storage_record(JCR *jcr, B_DB *mdb, STORAGE_DBR *sr); -bool db_create_mediatype_record(JCR *jcr, B_DB *mdb, MEDIATYPE_DBR *mr); -bool db_write_batch_file_records(JCR *jcr); -bool db_create_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar); -bool db_create_restore_object_record(JCR *jcr, B_DB *mdb, ROBJECT_DBR *ar); -bool db_create_base_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar); -bool db_commit_base_file_attributes_record(JCR *jcr, B_DB *mdb); -bool db_create_base_file_list(JCR *jcr, B_DB *mdb, char *jobids); -void db_disable_batch_insert(bool disable); +bool bdb_write_batch_file_records(JCR *jcr); +void bdb_disable_batch_insert(bool disable); + +/* sql_get.c */ +void bdb_free_restoreobject_record(JCR *jcr, ROBJECT_DBR *rr); + + +/* sql_create.c */ +#define db_create_path_record(jcr, mdb, ar) \ + mdb->bdb_create_path_record(jcr, ar) +#define db_create_file_attributes_record(jcr, mdb, ar) \ + mdb->bdb_create_file_attributes_record(jcr, ar) +#define db_create_job_record(jcr, mdb, jr) \ + mdb->bdb_create_job_record(jcr, jr) +#define db_create_media_record(jcr, mdb, media_dbr) \ + mdb->bdb_create_media_record(jcr, media_dbr) +#define db_create_client_record(jcr, mdb, cr) \ + mdb->bdb_create_client_record(jcr, cr) +#define db_create_fileset_record(jcr, mdb, fsr) \ + mdb->bdb_create_fileset_record(jcr, fsr) +#define db_create_pool_record(jcr, mdb, pool_dbr) \ + mdb->bdb_create_pool_record(jcr, pool_dbr) +#define db_create_jobmedia_record(jcr, mdb, jr) \ + mdb->bdb_create_jobmedia_record(jcr, jr) +#define db_create_counter_record(jcr, mdb, cr) \ + mdb->bdb_create_counter_record(jcr, cr) +#define db_create_device_record(jcr, mdb, dr) \ + mdb->bdb_create_device_record(jcr, dr) +#define db_create_storage_record(jcr, mdb, sr) \ + mdb->bdb_create_storage_record(jcr, sr) +#define db_create_mediatype_record(jcr, mdb, mr) \ + mdb->bdb_create_mediatype_record(jcr, mr) +#define db_write_batch_file_records(jcr) \ + bdb_write_batch_file_records(jcr) +#define db_create_attributes_record(jcr, mdb, ar) \ + mdb->bdb_create_attributes_record(jcr, ar) +#define db_create_restore_object_record(jcr, mdb, ar) \ + mdb->bdb_create_restore_object_record(jcr, ar) +#define db_create_base_file_attributes_record(jcr, mdb, ar) \ + mdb->bdb_create_base_file_attributes_record(jcr, ar) +#define db_commit_base_file_attributes_record(jcr, mdb) \ + mdb->bdb_commit_base_file_attributes_record(jcr) +#define db_create_base_file_list(jcr, mdb, jobids) \ + mdb->bdb_create_base_file_list(jcr, jobids) +#define db_disable_batch_insert(disable) \ + bdb_disable_batch_insert(disable) +#define db_create_snapshot_record(jcr, mdb, sr) \ + mdb->bdb_create_snapshot_record(jcr, sr) + /* sql_delete.c */ -int db_delete_pool_record(JCR *jcr, B_DB *db, POOL_DBR *pool_dbr); -int db_delete_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr); +#define db_delete_pool_record(jcr, mdb, pool_dbr) \ + mdb->bdb_delete_pool_record(jcr, pool_dbr) +#define db_delete_media_record(jcr, mdb, mr) \ + mdb->bdb_delete_media_record(jcr, mr) +#define db_purge_media_record(jcr, mdb, mr) \ + mdb->bdb_purge_media_record(jcr, mr) +#define db_delete_snapshot_record(jcr, mdb, sr) \ + mdb->bdb_delete_snapshot_record(jcr, sr) + /* sql_find.c */ -bool db_find_last_job_start_time(JCR *jcr, B_DB *mdb, JOB_DBR *jr, POOLMEM **stime, char *job, int JobLevel); -bool db_find_job_start_time(JCR *jcr, B_DB *mdb, JOB_DBR *jr, POOLMEM **stime, char *job); -bool db_find_last_jobid(JCR *jcr, B_DB *mdb, const char *Name, JOB_DBR *jr); -int db_find_next_volume(JCR *jcr, B_DB *mdb, int index, bool InChanger, MEDIA_DBR *mr); -bool db_find_failed_job_since(JCR *jcr, B_DB *mdb, JOB_DBR *jr, POOLMEM *stime, int &JobLevel); +#define db_find_last_job_start_time(jcr, mdb, jr, stime, job, JobLevel) \ + mdb->bdb_find_last_job_start_time(jcr, jr, stime, job, JobLevel) +#define db_find_job_start_time(jcr, mdb, jr, stime, job) \ + mdb->bdb_find_job_start_time(jcr, jr, stime, job) +#define db_find_last_jobid(jcr, mdb, Name, jr) \ + mdb->bdb_find_last_jobid(jcr, Name, jr) +#define db_find_next_volume(jcr, mdb, index, InChanger, mr) \ + mdb->bdb_find_next_volume(jcr, index, InChanger, mr) +#define db_find_failed_job_since(jcr, mdb, jr, stime, JobLevel) \ + mdb->bdb_find_failed_job_since(jcr, jr, stime, JobLevel) /* sql_get.c */ -bool db_get_volume_jobids(JCR *jcr, B_DB *mdb, - MEDIA_DBR *mr, db_list_ctx *lst); -bool db_get_base_file_list(JCR *jcr, B_DB *mdb, bool use_md5, - DB_RESULT_HANDLER *result_handler,void *ctx); -int db_get_path_record(JCR *jcr, B_DB *mdb); -bool db_get_pool_record(JCR *jcr, B_DB *mdb, POOL_DBR *pdbr); -bool db_get_pool_numvols(JCR *jcr, B_DB *mdb, POOL_DBR *pdbr); -int db_get_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cr); -bool db_get_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr); -int db_get_job_volume_names(JCR *jcr, B_DB *mdb, JobId_t JobId, POOLMEM **VolumeNames); -int db_get_file_attributes_record(JCR *jcr, B_DB *mdb, char *fname, JOB_DBR *jr, FILE_DBR *fdbr); -int db_get_fileset_record(JCR *jcr, B_DB *mdb, FILESET_DBR *fsr); -bool db_get_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr); -int db_get_num_media_records(JCR *jcr, B_DB *mdb); -int db_get_num_pool_records(JCR *jcr, B_DB *mdb); -int db_get_pool_ids(JCR *jcr, B_DB *mdb, int *num_ids, DBId_t **ids); -int db_get_client_ids(JCR *jcr, B_DB *mdb, int *num_ids, DBId_t **ids); -bool db_get_media_ids(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr, int *num_ids, uint32_t **ids); -int db_get_job_volume_parameters(JCR *jcr, B_DB *mdb, JobId_t JobId, VOL_PARAMS **VolParams); -int db_get_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cdbr); -int db_get_counter_record(JCR *jcr, B_DB *mdb, COUNTER_DBR *cr); -bool db_get_query_dbids(JCR *jcr, B_DB *mdb, POOL_MEM &query, dbid_list &ids); -bool db_get_file_list(JCR *jcr, B_DB *mdb, char *jobids, - bool use_md5, bool use_delta, - DB_RESULT_HANDLER *result_handler, void *ctx); -bool db_get_base_jobid(JCR *jcr, B_DB *mdb, JOB_DBR *jr, JobId_t *jobid); -bool db_accurate_get_jobids(JCR *jcr, B_DB *mdb, JOB_DBR *jr, db_list_ctx *jobids); -bool db_get_used_base_jobids(JCR *jcr, B_DB *mdb, POOLMEM *jobids, db_list_ctx *result); +#define db_get_volume_jobids(jcr, mdb, mr, lst) \ + mdb->bdb_get_volume_jobids(jcr, mr, lst) +#define db_get_base_file_list(jcr, mdb, use_md5, result_handler, ctx) \ + mdb->bdb_get_base_file_list(jcr, use_md5, result_handler, ctx) +#define db_get_path_record(jcr, mdb) \ + mdb->bdb_get_path_record(jcr) +#define db_get_pool_record(jcr, mdb, pdbr) \ + mdb->bdb_get_pool_record(jcr, pdbr) +#define db_get_pool_numvols(jcr, mdb, pdbr) \ + mdb->bdb_get_pool_numvols(jcr, pdbr) +#define db_get_client_record(jcr, mdb, cr) \ + mdb->bdb_get_client_record(jcr, cr) +#define db_get_job_record(jcr, mdb, jr) \ + mdb->bdb_get_job_record(jcr, jr) +#define db_get_job_volume_names(jcr, mdb, JobId, VolumeNames) \ + mdb->bdb_get_job_volume_names(jcr, JobId, VolumeNames) +#define db_get_file_attributes_record(jcr, mdb, fname, jr, fdbr) \ + mdb->bdb_get_file_attributes_record(jcr, fname, jr, fdbr) +#define db_get_fileset_record(jcr, mdb, fsr) \ + mdb->bdb_get_fileset_record(jcr, fsr) +#define db_get_media_record(jcr, mdb, mr) \ + mdb->bdb_get_media_record(jcr, mr) +#define db_get_num_media_records(jcr, mdb) \ + mdb->bdb_get_num_media_records(jcr) +#define db_get_num_pool_records(jcr, mdb) \ + mdb->bdb_get_num_pool_records(jcr) +#define db_get_pool_ids(jcr, mdb, num_ids, ids) \ + mdb->bdb_get_pool_ids(jcr, num_ids, ids) +#define db_get_client_ids(jcr, mdb, num_ids, ids) \ + mdb->bdb_get_client_ids(jcr, num_ids, ids) +#define db_get_media_ids(jcr, mdb, mr, num_ids, ids) \ + mdb->bdb_get_media_ids(jcr, mr, num_ids, ids) +#define db_get_job_volume_parameters(jcr, mdb, JobId, VolParams) \ + mdb->bdb_get_job_volume_parameters(jcr, JobId, VolParams) +#define db_get_counter_record(jcr, mdb, cr) \ + mdb->bdb_get_counter_record(jcr, cr) +#define db_get_query_dbids(jcr, mdb, query, ids) \ + mdb->bdb_get_query_dbids(jcr, query, ids) +#define db_get_file_list(jcr, mdb, jobids, use_md5, use_delta, result_handler, ctx) \ + mdb->bdb_get_file_list(jcr, jobids, use_md5, use_delta, result_handler, ctx) +#define db_get_base_jobid(jcr, mdb, jr, jobid) \ + mdb->bdb_get_base_jobid(jcr, jr, jobid) +#define db_get_accurate_jobids(jcr, mdb, jr, jobids) \ + mdb->bdb_get_accurate_jobids(jcr, jr, jobids) +#define db_get_used_base_jobids(jcr, mdb, jobids, result) \ + mdb->bdb_get_used_base_jobids(jcr, jobids, result) +#define db_get_restoreobject_record(jcr, mdb, rr) \ + mdb->bdb_get_restoreobject_record(jcr, rr) +#define db_get_type_index(mdb) \ + mdb->bdb_get_type_index() +#define db_get_engine_name(mdb) \ + mdb->bdb_get_engine_name() +#define db_get_snapshot_record(jcr, mdb, sr) \ + mdb->bdb_get_snapshot_record(jcr, sr) + /* sql_list.c */ -enum e_list_type { - HORZ_LIST, - VERT_LIST, - FAILED_JOBS, - INCOMPLETE_JOBS -}; - -void db_list_pool_records(JCR *jcr, B_DB *db, POOL_DBR *pr, DB_LIST_HANDLER sendit, void *ctx, e_list_type type); -alist *db_list_job_records(JCR *jcr, B_DB *db, JOB_DBR *jr, DB_LIST_HANDLER sendit, void *ctx, e_list_type type); -void db_list_job_totals(JCR *jcr, B_DB *db, JOB_DBR *jr, DB_LIST_HANDLER sendit, void *ctx); -void db_list_files_for_job(JCR *jcr, B_DB *db, uint32_t jobid, DB_LIST_HANDLER sendit, void *ctx); -void db_list_media_records(JCR *jcr, B_DB *mdb, MEDIA_DBR *mdbr, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); -void db_list_jobmedia_records(JCR *jcr, B_DB *mdb, JobId_t JobId, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); -void db_list_joblog_records(JCR *jcr, B_DB *mdb, JobId_t JobId, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); -int db_list_sql_query(JCR *jcr, B_DB *mdb, const char *query, DB_LIST_HANDLER *sendit, void *ctx, int verbose, e_list_type type); -void db_list_client_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); -void db_list_copies_records(JCR *jcr, B_DB *mdb, uint32_t limit, char *jobids, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type); -void -db_list_base_files_for_job(JCR *jcr, B_DB *mdb, JobId_t jobid, DB_LIST_HANDLER *sendit, void *ctx); +#define db_list_pool_records(jcr, mdb, pr, sendit, ctx, type) \ + mdb->bdb_list_pool_records(jcr, pr, sendit, ctx, type) +#define db_list_job_records(jcr, mdb, jr, sendit, ctx, type) \ + mdb->bdb_list_job_records(jcr, jr, sendit, ctx, type) +#define db_list_job_totals(jcr, mdb, jr, sendit, ctx) \ + mdb->bdb_list_job_totals(jcr, jr, sendit, ctx) +#define db_list_files_for_job(jcr, mdb, jobid, sendit, ctx) \ + mdb->bdb_list_files_for_job(jcr, jobid, sendit, ctx) +#define db_list_media_records(jcr, mdb, mdbr, sendit, ctx, type) \ + mdb->bdb_list_media_records(jcr, mdbr, sendit, ctx, type) +#define db_list_jobmedia_records(jcr, mdb, JobId, sendit, ctx, type) \ + mdb->bdb_list_jobmedia_records(jcr, JobId, sendit, ctx, type) +#define db_list_joblog_records(jcr, mdb, JobId, sendit, ctx, type) \ + mdb->bdb_list_joblog_records(jcr, JobId, sendit, ctx, type) +#define db_list_sql_query(jcr, mdb, query, sendit, ctx, verbose, type) \ + mdb->bdb_list_sql_query(jcr, query, sendit, ctx, verbose, type) +#define db_list_client_records(jcr, mdb, sendit, ctx, type) \ + mdb->bdb_list_client_records(jcr, sendit, ctx, type) +#define db_list_copies_records(jcr, mdb, limit, jobids, sendit, ctx, type) \ + mdb->bdb_list_copies_records(jcr, limit, jobids, sendit, ctx, type) +#define db_list_base_files_for_job(jcr, mdb, jobid, sendit, ctx) \ + mdb->bdb_list_base_files_for_job(jcr, jobid, sendit, ctx) +#define db_list_restore_objects(jcr, mdb, rr, sendit, ctx, type) \ + mdb->bdb_list_restore_objects(jcr, rr, sendit, ctx, type) +#define db_list_snapshot_records(jcr, mdb, snapdbr, sendit, ua, llist) \ + mdb->bdb_list_snapshot_records(jcr, snapdbr, sendit, ua, llist) + /* sql_update.c */ -bool db_update_job_start_record(JCR *jcr, B_DB *db, JOB_DBR *jr); -int db_update_job_end_record(JCR *jcr, B_DB *db, JOB_DBR *jr); -int db_update_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cr); -int db_update_pool_record(JCR *jcr, B_DB *db, POOL_DBR *pr); -bool db_update_storage_record(JCR *jcr, B_DB *mdb, STORAGE_DBR *sr); -int db_update_media_record(JCR *jcr, B_DB *db, MEDIA_DBR *mr); -int db_update_media_defaults(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr); -int db_update_counter_record(JCR *jcr, B_DB *mdb, COUNTER_DBR *cr); -int db_add_digest_to_file_record(JCR *jcr, B_DB *mdb, FileId_t FileId, char *digest, int type); -int db_mark_file_record(JCR *jcr, B_DB *mdb, FileId_t FileId, JobId_t JobId); -void db_make_inchanger_unique(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr); -int db_update_stats(JCR *jcr, B_DB *mdb, utime_t age); +#define db_update_job_start_record(jcr, mdb, jr) \ + mdb->bdb_update_job_start_record(jcr, jr) +#define db_update_job_end_record(jcr, mdb, jr) \ + mdb->bdb_update_job_end_record(jcr, jr) +#define db_update_client_record(jcr, mdb, cr) \ + mdb->bdb_update_client_record(jcr, cr) +#define db_update_pool_record(jcr, mdb, pr) \ + mdb->bdb_update_pool_record(jcr, pr) +#define db_update_storage_record(jcr, mdb, sr) \ + mdb->bdb_update_storage_record(jcr, sr) +#define db_update_media_record(jcr, mdb, mr) \ + mdb->bdb_update_media_record(jcr, mr) +#define db_update_media_defaults(jcr, mdb, mr) \ + mdb->bdb_update_media_defaults(jcr, mr) +#define db_update_counter_record(jcr, mdb, cr) \ + mdb->bdb_update_counter_record(jcr, cr) +#define db_add_digest_to_file_record(jcr, mdb, FileId, digest, type) \ + mdb->bdb_add_digest_to_file_record(jcr, FileId, digest, type) +#define db_mark_file_record(jcr, mdb, FileId, JobId) \ + mdb->bdb_mark_file_record(jcr, FileId, JobId) +#define db_make_inchanger_unique(jcr, mdb, mr) \ + mdb->bdb_make_inchanger_unique(jcr, mr) +#define db_update_stats(jcr, mdb, age) \ + mdb->bdb_update_stats(jcr, age) +#define db_update_snapshot_record(jcr, mdb, sr) \ + mdb->bdb_update_snapshot_record(jcr, sr) + #endif /* __SQL_PROTOS_H */ diff --git a/bacula/src/cats/sql.c b/bacula/src/cats/sql.c index 2a5af222bd..4b1278d2aa 100644 --- a/bacula/src/cats/sql.c +++ b/bacula/src/cats/sql.c @@ -1,756 +1,793 @@ -/* - Bacula® - The Network Backup Solution +/* + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ -/* - * Bacula Catalog Database interface routines - * - * Almost generic set of SQL database interface routines - * (with a little more work) - * SQL engine specific routines are in mysql.c, postgresql.c, - * sqlite.c, ... - * - * Written by Kern Sibbald, March 2000 - * - */ - -#include "bacula.h" - -#if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL - -#include "cats.h" -#include "bdb_priv.h" -#include "sql_glue.h" - -/* Forward referenced subroutines */ -void print_dashes(B_DB *mdb); -void print_result(B_DB *mdb); - -dbid_list::dbid_list() -{ - memset(this, 0, sizeof(dbid_list)); - max_ids = 1000; - DBId = (DBId_t *)malloc(max_ids * sizeof(DBId_t)); - num_ids = num_seen = tot_ids = 0; - PurgedFiles = NULL; -} - -dbid_list::~dbid_list() -{ - free(DBId); -} - -/* - * Called here to retrieve an string list from the database - */ -int db_string_list_handler(void *ctx, int num_fields, char **row) -{ - alist **val = (alist **)ctx; - - if (row[0]) { - (*val)->append(bstrdup(row[0])); - } - - return 0; -} - -/* - * Called here to retrieve an integer from the database - */ -int db_int_handler(void *ctx, int num_fields, char **row) -{ - uint32_t *val = (uint32_t *)ctx; - - Dmsg1(800, "int_handler starts with row pointing at %x\n", row); - - if (row[0]) { - Dmsg1(800, "int_handler finds '%s'\n", row[0]); - *val = str_to_int64(row[0]); - } else { - Dmsg0(800, "int_handler finds zero\n"); - *val = 0; - } - Dmsg0(800, "int_handler finishes\n"); - return 0; -} - -/* - * Called here to retrieve a 32/64 bit integer from the database. - * The returned integer will be extended to 64 bit. - */ -int db_int64_handler(void *ctx, int num_fields, char **row) -{ - db_int64_ctx *lctx = (db_int64_ctx *)ctx; - - if (row[0]) { - lctx->value = str_to_int64(row[0]); - lctx->count++; - } - return 0; -} - -/* - * Called here to retrieve a btime from the database. - * The returned integer will be extended to 64 bit. - */ -int db_strtime_handler(void *ctx, int num_fields, char **row) -{ - db_int64_ctx *lctx = (db_int64_ctx *)ctx; - - if (row[0]) { - lctx->value = str_to_utime(row[0]); - lctx->count++; - } - return 0; -} - -/* - * Use to build a comma separated list of values from a query. "10,20,30" - */ -int db_list_handler(void *ctx, int num_fields, char **row) -{ - db_list_ctx *lctx = (db_list_ctx *)ctx; - if (num_fields == 1 && row[0]) { - lctx->add(row[0]); - } - return 0; -} - -/* - * specific context passed from db_check_max_connections to db_max_connections_handler. - */ -struct max_connections_context { - B_DB *db; - uint32_t nr_connections; -}; - -/* - * Called here to retrieve an integer from the database - */ -static inline int db_max_connections_handler(void *ctx, int num_fields, char **row) -{ - struct max_connections_context *context; - uint32_t index; - - context = (struct max_connections_context *)ctx; - switch (db_get_type_index(context->db)) { - case SQL_TYPE_MYSQL: - index = 1; - default: - index = 0; - } - - if (row[index]) { - context->nr_connections = str_to_int64(row[index]); - } else { - Dmsg0(800, "int_handler finds zero\n"); - context->nr_connections = 0; - } - return 0; -} - -/* - * Check catalog max_connections setting - */ -bool db_check_max_connections(JCR *jcr, B_DB *mdb, uint32_t max_concurrent_jobs) -{ - struct max_connections_context context; - - /* Without Batch insert, no need to verify max_connections */ - if (!mdb->batch_insert_available()) - return true; - - context.db = mdb; - context.nr_connections = 0; - - /* Check max_connections setting */ - if (!db_sql_query(mdb, sql_get_max_connections[db_get_type_index(mdb)], - db_max_connections_handler, &context)) { - Jmsg(jcr, M_ERROR, 0, "Can't verify max_connections settings %s", mdb->errmsg); - return false; - } - if (context.nr_connections && max_concurrent_jobs && max_concurrent_jobs > context.nr_connections) { - Mmsg(mdb->errmsg, - _("Potential performance problem:\n" - "max_connections=%d set for %s database \"%s\" should be larger than Director's " - "MaxConcurrentJobs=%d\n"), - context.nr_connections, db_get_type(mdb), mdb->get_db_name(), max_concurrent_jobs); - Jmsg(jcr, M_WARNING, 0, "%s", mdb->errmsg); - return false; - } - - return true; -} - -/* NOTE!!! The following routines expect that the - * calling subroutine sets and clears the mutex - */ - -/* Check that the tables correspond to the version we want */ -bool check_tables_version(JCR *jcr, B_DB *mdb) -{ - uint32_t bacula_db_version = 0; - const char *query = "SELECT VersionId FROM Version"; - - bacula_db_version = 0; - if (!db_sql_query(mdb, query, db_int_handler, (void *)&bacula_db_version)) { - Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg); - return false; - } - if (bacula_db_version != BDB_VERSION) { - Mmsg(mdb->errmsg, "Version error for database \"%s\". Wanted %d, got %d\n", - mdb->get_db_name(), BDB_VERSION, bacula_db_version); - Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg); - return false; - } - return true; -} - -/* - * Utility routine for queries. The database MUST be locked before calling here. - * Returns: 0 on failure - * 1 on success - */ -int -QueryDB(const char *file, int line, JCR *jcr, B_DB *mdb, char *cmd) -{ - sql_free_result(mdb); - if (!sql_query(mdb, cmd, QF_STORE_RESULT)) { - m_msg(file, line, &mdb->errmsg, _("query %s failed:\n%s\n"), cmd, sql_strerror(mdb)); - j_msg(file, line, jcr, M_FATAL, 0, "%s", mdb->errmsg); - if (verbose) { - j_msg(file, line, jcr, M_INFO, 0, "%s\n", cmd); - } - return 0; - } - - return 1; -} - -/* - * Utility routine to do inserts - * Returns: 0 on failure - * 1 on success - */ -int -InsertDB(const char *file, int line, JCR *jcr, B_DB *mdb, char *cmd) -{ - int num_rows; - - if (!sql_query(mdb, cmd)) { - m_msg(file, line, &mdb->errmsg, _("insert %s failed:\n%s\n"), cmd, sql_strerror(mdb)); - j_msg(file, line, jcr, M_FATAL, 0, "%s", mdb->errmsg); - if (verbose) { - j_msg(file, line, jcr, M_INFO, 0, "%s\n", cmd); - } - return 0; - } - num_rows = sql_affected_rows(mdb); - if (num_rows != 1) { - char ed1[30]; - m_msg(file, line, &mdb->errmsg, _("Insertion problem: affected_rows=%s\n"), - edit_uint64(num_rows, ed1)); - if (verbose) { - j_msg(file, line, jcr, M_INFO, 0, "%s\n", cmd); - } - return 0; - } - mdb->changes++; - return 1; -} - -/* Utility routine for updates. - * Returns: 0 on failure - * 1 on success - */ -int -UpdateDB(const char *file, int line, JCR *jcr, B_DB *mdb, char *cmd) -{ - int num_rows; - - if (!sql_query(mdb, cmd)) { - m_msg(file, line, &mdb->errmsg, _("update %s failed:\n%s\n"), cmd, sql_strerror(mdb)); - j_msg(file, line, jcr, M_ERROR, 0, "%s", mdb->errmsg); - if (verbose) { - j_msg(file, line, jcr, M_INFO, 0, "%s\n", cmd); - } - return 0; - } - num_rows = sql_affected_rows(mdb); - if (num_rows < 1) { - char ed1[30]; - m_msg(file, line, &mdb->errmsg, _("Update failed: affected_rows=%s for %s\n"), - edit_uint64(num_rows, ed1), cmd); - if (verbose) { -// j_msg(file, line, jcr, M_INFO, 0, "%s\n", cmd); - } - return 0; - } - mdb->changes++; - return 1; -} - -/* - * Utility routine for deletes - * - * Returns: -1 on error - * n number of rows affected - */ -int -DeleteDB(const char *file, int line, JCR *jcr, B_DB *mdb, char *cmd) -{ - - if (!sql_query(mdb, cmd)) { - m_msg(file, line, &mdb->errmsg, _("delete %s failed:\n%s\n"), cmd, sql_strerror(mdb)); - j_msg(file, line, jcr, M_ERROR, 0, "%s", mdb->errmsg); - if (verbose) { - j_msg(file, line, jcr, M_INFO, 0, "%s\n", cmd); - } - return -1; - } - mdb->changes++; - return sql_affected_rows(mdb); -} - - -/* - * Get record max. Query is already in mdb->cmd - * No locking done - * - * Returns: -1 on failure - * count on success - */ -int get_sql_record_max(JCR *jcr, B_DB *mdb) -{ - SQL_ROW row; - int stat = 0; - - if (QUERY_DB(jcr, mdb, mdb->cmd)) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(&mdb->errmsg, _("error fetching row: %s\n"), sql_strerror(mdb)); - stat = -1; - } else { - stat = str_to_int64(row[0]); - } - sql_free_result(mdb); - } else { - Mmsg1(&mdb->errmsg, _("error fetching row: %s\n"), sql_strerror(mdb)); - stat = -1; - } - return stat; -} - -/* - * Return pre-edited error message - */ -char *db_strerror(B_DB *mdb) -{ - return mdb->errmsg; -} - -/* - * Given a full filename, split it into its path - * and filename parts. They are returned in pool memory - * in the mdb structure. - */ -void split_path_and_file(JCR *jcr, B_DB *mdb, const char *fname) -{ - const char *p, *f; - - /* Find path without the filename. - * I.e. everything after the last / is a "filename". - * OK, maybe it is a directory name, but we treat it like - * a filename. If we don't find a / then the whole name - * must be a path name (e.g. c:). - */ - for (p=f=fname; *p; p++) { - if (IsPathSeparator(*p)) { - f = p; /* set pos of last slash */ - } - } - if (IsPathSeparator(*f)) { /* did we find a slash? */ - f++; /* yes, point to filename */ - } else { /* no, whole thing must be path name */ - f = p; - } - - /* If filename doesn't exist (i.e. root directory), we - * simply create a blank name consisting of a single - * space. This makes handling zero length filenames - * easier. - */ - mdb->fnl = p - f; - if (mdb->fnl > 0) { - mdb->fname = check_pool_memory_size(mdb->fname, mdb->fnl+1); - memcpy(mdb->fname, f, mdb->fnl); /* copy filename */ - mdb->fname[mdb->fnl] = 0; - } else { - mdb->fname[0] = 0; - mdb->fnl = 0; - } - - mdb->pnl = f - fname; - if (mdb->pnl > 0) { - mdb->path = check_pool_memory_size(mdb->path, mdb->pnl+1); - memcpy(mdb->path, fname, mdb->pnl); - mdb->path[mdb->pnl] = 0; - } else { - Mmsg1(&mdb->errmsg, _("Path length is zero. File=%s\n"), fname); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); - mdb->path[0] = 0; - mdb->pnl = 0; - } - - Dmsg2(500, "split path=%s file=%s\n", mdb->path, mdb->fname); -} - -/* - * Set maximum field length to something reasonable - */ -static int max_length(int max_length) -{ - int max_len = max_length; - /* Sanity check */ - if (max_len < 0) { - max_len = 2; - } else if (max_len > 100) { - max_len = 100; - } - return max_len; -} - -/* - * List dashes as part of header for listing SQL results in a table - */ -void list_dashes(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx) -{ - SQL_FIELD *field; - int i, j; - int len; - int num_fields; - - sql_field_seek(mdb, 0); - send(ctx, "+"); - num_fields = sql_num_fields(mdb); - for (i = 0; i < num_fields; i++) { - field = sql_fetch_field(mdb); - if (!field) { - break; - } - len = max_length(field->max_length + 2); - for (j = 0; j < len; j++) { - send(ctx, "-"); - } - send(ctx, "+"); - } - send(ctx, "\n"); -} - -/* Small handler to print the last line of a list xxx command */ -static void last_line_handler(void *vctx, const char *str) -{ - LIST_CTX *ctx = (LIST_CTX *)vctx; - bstrncat(ctx->line, str, sizeof(ctx->line)); -} - -int list_result(void *vctx, int nb_col, char **row) -{ - SQL_FIELD *field; - int i, col_len, max_len = 0; - int num_fields; - char buf[2000], ewc[30]; - - LIST_CTX *pctx = (LIST_CTX *)vctx; - DB_LIST_HANDLER *send = pctx->send; - e_list_type type = pctx->type; - B_DB *mdb = pctx->mdb; - void *ctx = pctx->ctx; - JCR *jcr = pctx->jcr; - - num_fields = sql_num_fields(mdb); - if (!pctx->once) { - pctx->once = true; - - Dmsg1(800, "list_result starts looking at %d fields\n", num_fields); - /* determine column display widths */ - sql_field_seek(mdb, 0); - for (i = 0; i < num_fields; i++) { - Dmsg1(800, "list_result processing field %d\n", i); - field = sql_fetch_field(mdb); - if (!field) { - break; - } - col_len = cstrlen(field->name); - if (type == VERT_LIST) { - if (col_len > max_len) { - max_len = col_len; - } - } else { - if (sql_field_is_numeric(mdb, field->type) && (int)field->max_length > 0) { /* fixup for commas */ - field->max_length += (field->max_length - 1) / 3; - } - if (col_len < (int)field->max_length) { - col_len = field->max_length; - } - if (col_len < 4 && !sql_field_is_not_null(mdb, field->flags)) { - col_len = 4; /* 4 = length of the word "NULL" */ - } - field->max_length = col_len; /* reset column info */ - } - } - - pctx->num_rows++; - - Dmsg0(800, "list_result finished first loop\n"); - if (type == VERT_LIST) { - goto vertical_list; - } - - Dmsg1(800, "list_result starts second loop looking at %d fields\n", num_fields); - - /* Keep the result to display the same line at the end of the table */ - list_dashes(mdb, last_line_handler, pctx); - send(ctx, pctx->line); - - send(ctx, "|"); - sql_field_seek(mdb, 0); - for (i = 0; i < num_fields; i++) { - Dmsg1(800, "list_result looking at field %d\n", i); - field = sql_fetch_field(mdb); - if (!field) { - break; - } - max_len = max_length(field->max_length); - bsnprintf(buf, sizeof(buf), " %-*s |", max_len, field->name); - send(ctx, buf); - } - send(ctx, "\n"); - list_dashes(mdb, send, ctx); - } - - Dmsg1(800, "list_result starts third loop looking at %d fields\n", num_fields); - - sql_field_seek(mdb, 0); - send(ctx, "|"); - for (i = 0; i < num_fields; i++) { - field = sql_fetch_field(mdb); - if (!field) { - break; - } - max_len = max_length(field->max_length); - if (row[i] == NULL) { - bsnprintf(buf, sizeof(buf), " %-*s |", max_len, "NULL"); - } else if (sql_field_is_numeric(mdb, field->type) && !jcr->gui && is_an_integer(row[i])) { - bsnprintf(buf, sizeof(buf), " %*s |", max_len, - add_commas(row[i], ewc)); - } else { - bsnprintf(buf, sizeof(buf), " %-*s |", max_len, row[i]); - } - send(ctx, buf); - } - send(ctx, "\n"); - return 0; - -vertical_list: - - Dmsg1(800, "list_result starts vertical list at %d fields\n", num_fields); - - sql_field_seek(mdb, 0); - for (i = 0; i < num_fields; i++) { - field = sql_fetch_field(mdb); - if (!field) { - break; - } - if (row[i] == NULL) { - bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, "NULL"); - } else if (sql_field_is_numeric(mdb, field->type) && !jcr->gui && is_an_integer(row[i])) { - bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, - add_commas(row[i], ewc)); - } else { - bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, row[i]); - } - send(ctx, buf); - } - send(ctx, "\n"); - return 0; -} - -/* - * If full_list is set, we list vertically, otherwise, we - * list on one line horizontally. - * Return number of rows - */ -int list_result(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *send, void *ctx, e_list_type type) -{ - SQL_FIELD *field; - SQL_ROW row; - int i, col_len, max_len = 0; - int num_fields; - char buf[2000], ewc[30]; - - Dmsg0(800, "list_result starts\n"); - if (sql_num_rows(mdb) == 0) { - send(ctx, _("No results to list.\n")); - return sql_num_rows(mdb); - } - - num_fields = sql_num_fields(mdb); - Dmsg1(800, "list_result starts looking at %d fields\n", num_fields); - /* determine column display widths */ - sql_field_seek(mdb, 0); - for (i = 0; i < num_fields; i++) { - Dmsg1(800, "list_result processing field %d\n", i); - field = sql_fetch_field(mdb); - if (!field) { - break; - } - col_len = cstrlen(field->name); - if (type == VERT_LIST) { - if (col_len > max_len) { - max_len = col_len; - } - } else { - if (sql_field_is_numeric(mdb, field->type) && (int)field->max_length > 0) { /* fixup for commas */ - field->max_length += (field->max_length - 1) / 3; - } - if (col_len < (int)field->max_length) { - col_len = field->max_length; - } - if (col_len < 4 && !sql_field_is_not_null(mdb, field->flags)) { - col_len = 4; /* 4 = length of the word "NULL" */ - } - field->max_length = col_len; /* reset column info */ - } - } - - Dmsg0(800, "list_result finished first loop\n"); - if (type == VERT_LIST) { - goto vertical_list; - } - - Dmsg1(800, "list_result starts second loop looking at %d fields\n", num_fields); - list_dashes(mdb, send, ctx); - send(ctx, "|"); - sql_field_seek(mdb, 0); - for (i = 0; i < num_fields; i++) { - Dmsg1(800, "list_result looking at field %d\n", i); - field = sql_fetch_field(mdb); - if (!field) { - break; - } - max_len = max_length(field->max_length); - bsnprintf(buf, sizeof(buf), " %-*s |", max_len, field->name); - send(ctx, buf); - } - send(ctx, "\n"); - list_dashes(mdb, send, ctx); - - Dmsg1(800, "list_result starts third loop looking at %d fields\n", num_fields); - while ((row = sql_fetch_row(mdb)) != NULL) { - sql_field_seek(mdb, 0); - send(ctx, "|"); - for (i = 0; i < num_fields; i++) { - field = sql_fetch_field(mdb); - if (!field) { - break; - } - max_len = max_length(field->max_length); - if (row[i] == NULL) { - bsnprintf(buf, sizeof(buf), " %-*s |", max_len, "NULL"); - } else if (sql_field_is_numeric(mdb, field->type) && !jcr->gui && is_an_integer(row[i])) { - bsnprintf(buf, sizeof(buf), " %*s |", max_len, - add_commas(row[i], ewc)); - } else { - bsnprintf(buf, sizeof(buf), " %-*s |", max_len, row[i]); - } - send(ctx, buf); - } - send(ctx, "\n"); - } - list_dashes(mdb, send, ctx); - return sql_num_rows(mdb); - -vertical_list: - - Dmsg1(800, "list_result starts vertical list at %d fields\n", num_fields); - while ((row = sql_fetch_row(mdb)) != NULL) { - sql_field_seek(mdb, 0); - for (i = 0; i < num_fields; i++) { - field = sql_fetch_field(mdb); - if (!field) { - break; - } - if (row[i] == NULL) { - bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, "NULL"); - } else if (sql_field_is_numeric(mdb, field->type) && !jcr->gui && is_an_integer(row[i])) { - bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, - add_commas(row[i], ewc)); - } else { - bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, row[i]); - } - send(ctx, buf); - } - send(ctx, "\n"); - } - return sql_num_rows(mdb); -} - -/* - * Open a new connexion to mdb catalog. This function is used - * by batch and accurate mode. - */ -bool db_open_batch_connexion(JCR *jcr, B_DB *mdb) -{ - bool multi_db; - - multi_db = mdb->batch_insert_available(); - - if (!jcr->db_batch) { - jcr->db_batch = db_clone_database_connection(mdb, jcr, multi_db); - if (!jcr->db_batch) { - Mmsg0(&mdb->errmsg, _("Could not init database batch connection\n")); - Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg); - return false; - } - - if (!db_open_database(jcr, jcr->db_batch)) { - Mmsg2(&mdb->errmsg, _("Could not open database \"%s\": ERR=%s\n"), - jcr->db_batch->get_db_name(), db_strerror(jcr->db_batch)); - Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg); - return false; - } - } - return true; -} - -/* - * !!! WARNING !!! Use this function only when bacula is stopped. - * ie, after a fatal signal and before exiting the program - * Print information about a B_DB object. - */ -void db_debug_print(JCR *jcr, FILE *fp) -{ - B_DB *mdb = jcr->db; - - if (!mdb) { - return; - } - - fprintf(fp, "B_DB=%p db_name=%s db_user=%s connected=%s\n", - mdb, NPRTB(mdb->get_db_name()), NPRTB(mdb->get_db_user()), mdb->is_connected() ? "true" : "false"); - fprintf(fp, "\tcmd=\"%s\" changes=%i\n", NPRTB(mdb->cmd), mdb->changes); - mdb->print_lock_info(fp); -} - -#endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL */ + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. +*/ +/* + * Bacula Catalog Database interface routines + * + * Almost generic set of SQL database interface routines + * (with a little more work) + * SQL engine specific routines are in mysql.c, postgresql.c, + * sqlite.c, ... + * + * Written by Kern Sibbald, March 2000 + * + * Note: at one point, this file was changed to class based by a certain + * programmer, and other than "wrapping" in a class, which is a trivial + * change for a C++ programmer, nothing substantial was done, yet all the + * code was recommitted under this programmer's name. Consequently, we + * undo those changes here. + */ + +#include "bacula.h" + +#if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL + +#include "cats.h" + +/* Forward referenced subroutines */ +void print_dashes(BDB *mdb); +void print_result(BDB *mdb); + +dbid_list::dbid_list() +{ + memset(this, 0, sizeof(dbid_list)); + max_ids = 1000; + DBId = (DBId_t *)malloc(max_ids * sizeof(DBId_t)); + num_ids = num_seen = tot_ids = 0; + PurgedFiles = NULL; +} + +dbid_list::~dbid_list() +{ + free(DBId); +} + +/* + * Called here to retrieve an string list from the database + */ +int db_string_list_handler(void *ctx, int num_fields, char **row) +{ + alist **val = (alist **)ctx; + + if (row[0]) { + (*val)->append(bstrdup(row[0])); + } + + return 0; +} + +/* + * Called here to retrieve an integer from the database + */ +int db_int_handler(void *ctx, int num_fields, char **row) +{ + uint32_t *val = (uint32_t *)ctx; + + Dmsg1(800, "int_handler starts with row pointing at %x\n", row); + + if (row[0]) { + Dmsg1(800, "int_handler finds '%s'\n", row[0]); + *val = str_to_int64(row[0]); + } else { + Dmsg0(800, "int_handler finds zero\n"); + *val = 0; + } + Dmsg0(800, "int_handler finishes\n"); + return 0; +} + +/* + * Called here to retrieve a 32/64 bit integer from the database. + * The returned integer will be extended to 64 bit. + */ +int db_int64_handler(void *ctx, int num_fields, char **row) +{ + db_int64_ctx *lctx = (db_int64_ctx *)ctx; + + if (row[0]) { + lctx->value = str_to_int64(row[0]); + lctx->count++; + } + return 0; +} + +/* + * Called here to retrieve a btime from the database. + * The returned integer will be extended to 64 bit. + */ +int db_strtime_handler(void *ctx, int num_fields, char **row) +{ + db_int64_ctx *lctx = (db_int64_ctx *)ctx; + + if (row[0]) { + lctx->value = str_to_utime(row[0]); + lctx->count++; + } + return 0; +} + +/* + * Use to build a comma separated list of values from a query. "10,20,30" + */ +int db_list_handler(void *ctx, int num_fields, char **row) +{ + db_list_ctx *lctx = (db_list_ctx *)ctx; + if (num_fields == 1 && row[0]) { + lctx->add(row[0]); + } + return 0; +} + +/* + * specific context passed from bdb_check_max_connections to + * db_max_connections_handler. + */ +struct max_connections_context { + BDB *db; + uint32_t nr_connections; +}; + +/* + * Called here to retrieve max_connections from db + */ +static int db_max_connections_handler(void *ctx, int num_fields, char **row) +{ + struct max_connections_context *context; + uint32_t index; + + context = (struct max_connections_context *)ctx; + switch (context->db->bdb_get_type_index()) { + case SQL_TYPE_MYSQL: + index = 1; + default: + index = 0; + } + + if (row[index]) { + context->nr_connections = str_to_int64(row[index]); + } else { + Dmsg0(800, "int_handler finds zero\n"); + context->nr_connections = 0; + } + return 0; +} + +/* + * Check catalog max_connections setting + */ +bool BDB::bdb_check_max_connections(JCR *jcr, uint32_t max_concurrent_jobs) +{ + struct max_connections_context context; + + /* Without Batch insert, no need to verify max_connections */ + if (!batch_insert_available()) + return true; + + context.db = this; + context.nr_connections = 0; + + /* Check max_connections setting */ + if (!bdb_sql_query(sql_get_max_connections[bdb_get_type_index()], + db_max_connections_handler, &context)) { + Jmsg(jcr, M_ERROR, 0, "Can't verify max_connections settings %s", errmsg); + return false; + } + if (context.nr_connections && max_concurrent_jobs && max_concurrent_jobs > context.nr_connections) { + Mmsg(errmsg, + _("Potential performance problem:\n" + "max_connections=%d set for %s database \"%s\" should be larger than Director's " + "MaxConcurrentJobs=%d\n"), + context.nr_connections, bdb_get_engine_name(), get_db_name(), max_concurrent_jobs); + Jmsg(jcr, M_WARNING, 0, "%s", errmsg); + return false; + } + + return true; +} + +/* NOTE!!! The following routines expect that the + * calling subroutine sets and clears the mutex + */ + +/* Check that the tables correspond to the version we want */ +bool BDB::bdb_check_version(JCR *jcr) +{ + uint32_t bacula_db_version = 0; + const char *query = "SELECT VersionId FROM Version"; + + bacula_db_version = 0; + if (!bdb_sql_query(query, db_int_handler, (void *)&bacula_db_version)) { + Jmsg(jcr, M_FATAL, 0, "%s", errmsg); + return false; + } + if (bacula_db_version != BDB_VERSION) { + Mmsg(errmsg, "Version error for database \"%s\". Wanted %d, got %d\n", + get_db_name(), BDB_VERSION, bacula_db_version); + Jmsg(jcr, M_FATAL, 0, "%s", errmsg); + return false; + } + return true; +} + +/* + * Utility routine for queries. The database MUST be locked before calling here. + * Returns: 0 on failure + * 1 on success + */ +bool BDB::QueryDB(JCR *jcr, char *cmd, const char *file, int line) +{ + sql_free_result(); + if (!sql_query(cmd, QF_STORE_RESULT)) { + m_msg(file, line, &errmsg, _("query %s failed:\n%s\n"), cmd, sql_strerror()); + if (use_fatal_jmsg()) { + j_msg(file, line, jcr, M_FATAL, 0, "%s", errmsg); + } + if (verbose) { + j_msg(file, line, jcr, M_INFO, 0, "%s\n", cmd); + } + return false; + } + + return true; +} + +/* + * Utility routine to do inserts + * Returns: 0 on failure + * 1 on success + */ +bool BDB::InsertDB(JCR *jcr, char *cmd, const char *file, int line) +{ + if (!sql_query(cmd)) { + m_msg(file, line, &errmsg, _("insert %s failed:\n%s\n"), cmd, sql_strerror()); + if (use_fatal_jmsg()) { + j_msg(file, line, jcr, M_FATAL, 0, "%s", errmsg); + } + if (verbose) { + j_msg(file, line, jcr, M_INFO, 0, "%s\n", cmd); + } + return false; + } + int num_rows = sql_affected_rows(); + if (num_rows != 1) { + char ed1[30]; + m_msg(file, line, &errmsg, _("Insertion problem: affected_rows=%s\n"), + edit_uint64(num_rows, ed1)); + if (verbose) { + j_msg(file, line, jcr, M_INFO, 0, "%s\n", cmd); + } + return false; + } + changes++; + return true; +} + +/* Utility routine for updates. + * Returns: false on failure + * true on success + */ +bool BDB::UpdateDB(JCR *jcr, char *cmd, const char *file, int line) +{ + if (!sql_query(cmd)) { + m_msg(file, line, &errmsg, _("update %s failed:\n%s\n"), cmd, sql_strerror()); + j_msg(file, line, jcr, M_ERROR, 0, "%s", errmsg); + if (verbose) { + j_msg(file, line, jcr, M_INFO, 0, "%s\n", cmd); + } + return false; + } + int num_rows = sql_affected_rows(); + if (num_rows < 1) { + char ed1[30]; + m_msg(file, line, &errmsg, _("Update failed: affected_rows=%s for %s\n"), + edit_uint64(num_rows, ed1), cmd); + if (verbose) { +// j_msg(file, line, jcr, M_INFO, 0, "%s\n", cmd); + } + return false; + } + changes++; + return true; +} + +/* Utility routine for deletes + * + * Returns: -1 on error + * n number of rows affected + */ +int BDB::DeleteDB(JCR *jcr, char *cmd, const char *file, int line) +{ + + if (!sql_query(cmd)) { + m_msg(file, line, &errmsg, _("delete %s failed:\n%s\n"), cmd, sql_strerror()); + j_msg(file, line, jcr, M_ERROR, 0, "%s", errmsg); + if (verbose) { + j_msg(file, line, jcr, M_INFO, 0, "%s\n", cmd); + } + return -1; + } + changes++; + return sql_affected_rows(); +} + + +/* + * Get record max. Query is already in mdb->cmd + * No locking done + * + * Returns: -1 on failure + * count on success + */ +int get_sql_record_max(JCR *jcr, BDB *mdb) +{ + SQL_ROW row; + int stat = 0; + + if (mdb->QueryDB(jcr, mdb->cmd)) { + if ((row = mdb->sql_fetch_row()) == NULL) { + Mmsg1(&mdb->errmsg, _("error fetching row: %s\n"), mdb->sql_strerror()); + stat = -1; + } else { + stat = str_to_int64(row[0]); + } + mdb->sql_free_result(); + } else { + Mmsg1(&mdb->errmsg, _("error fetching row: %s\n"), mdb->sql_strerror()); + stat = -1; + } + return stat; +} + +/* + * Given a full filename, split it into its path + * and filename parts. They are returned in pool memory + * in the mdb structure. + */ +void split_path_and_file(JCR *jcr, BDB *mdb, const char *afname) +{ + const char *p, *f; + + /* Find path without the filename. + * I.e. everything after the last / is a "filename". + * OK, maybe it is a directory name, but we treat it like + * a filename. If we don't find a / then the whole name + * must be a path name (e.g. c:). + */ + for (p=f=afname; *p; p++) { + if (IsPathSeparator(*p)) { + f = p; /* set pos of last slash */ + } + } + if (IsPathSeparator(*f)) { /* did we find a slash? */ + f++; /* yes, point to filename */ + } else { /* no, whole thing must be path name */ + f = p; + } + + /* If filename doesn't exist (i.e. root directory), we + * simply create a blank name consisting of a single + * space. This makes handling zero length filenames + * easier. + */ + mdb->fnl = p - f; + if (mdb->fnl > 0) { + mdb->fname = check_pool_memory_size(mdb->fname, mdb->fnl+1); + memcpy(mdb->fname, f, mdb->fnl); /* copy filename */ + mdb->fname[mdb->fnl] = 0; + } else { + mdb->fname[0] = 0; + mdb->fnl = 0; + } + + mdb->pnl = f - afname; + if (mdb->pnl > 0) { + mdb->path = check_pool_memory_size(mdb->path, mdb->pnl+1); + memcpy(mdb->path, afname, mdb->pnl); + mdb->path[mdb->pnl] = 0; + } else { + Mmsg1(&mdb->errmsg, _("Path length is zero. File=%s\n"), afname); + Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg); + mdb->path[0] = 0; + mdb->pnl = 0; + } + + Dmsg3(500, "split fname=%s: path=%s file=%s\n", afname, mdb->path, mdb->fname); +} + +/* + * Set maximum field length to something reasonable + */ +static int max_length(int max_length) +{ + int max_len = max_length; + /* Sanity check */ + if (max_len < 0) { + max_len = 2; + } else if (max_len > 100) { + max_len = 100; + } + return max_len; +} + +/* + * List dashes as part of header for listing SQL results in a table + */ +void +list_dashes(BDB *mdb, DB_LIST_HANDLER *send, void *ctx) +{ + SQL_FIELD *field; + int i, j; + int len; + + mdb->sql_field_seek(0); + send(ctx, "+"); + for (i = 0; i < mdb->sql_num_fields(); i++) { + field = mdb->sql_fetch_field(); + if (!field) { + break; + } + len = max_length(field->max_length + 2); + for (j = 0; j < len; j++) { + send(ctx, "-"); + } + send(ctx, "+"); + } + send(ctx, "\n"); +} + +/* Small handler to print the last line of a list xxx command */ +static void last_line_handler(void *vctx, const char *str) +{ + LIST_CTX *ctx = (LIST_CTX *)vctx; + bstrncat(ctx->line, str, sizeof(ctx->line)); +} + +int list_result(void *vctx, int nb_col, char **row) +{ + SQL_FIELD *field; + int i, col_len, max_len = 0; + char buf[2000], ewc[30]; + + LIST_CTX *pctx = (LIST_CTX *)vctx; + DB_LIST_HANDLER *send = pctx->send; + e_list_type type = pctx->type; + BDB *mdb = pctx->mdb; + void *ctx = pctx->ctx; + JCR *jcr = pctx->jcr; + + if (!pctx->once) { + pctx->once = true; + + Dmsg1(800, "list_result starts looking at %d fields\n", mdb->sql_num_fields()); + /* determine column display widths */ + mdb->sql_field_seek(0); + for (i = 0; i < mdb->sql_num_fields(); i++) { + Dmsg1(800, "list_result processing field %d\n", i); + field = mdb->sql_fetch_field(); + if (!field) { + break; + } + col_len = cstrlen(field->name); + if (type == VERT_LIST) { + if (col_len > max_len) { + max_len = col_len; + } + } else { + if (mdb->sql_field_is_numeric(field->type) && (int)field->max_length > 0) { /* fixup for commas */ + field->max_length += (field->max_length - 1) / 3; + } + if (col_len < (int)field->max_length) { + col_len = field->max_length; + } + if (col_len < 4 && !mdb->sql_field_is_not_null(field->flags)) { + col_len = 4; /* 4 = length of the word "NULL" */ + } + field->max_length = col_len; /* reset column info */ + } + } + + pctx->num_rows++; + + Dmsg0(800, "list_result finished first loop\n"); + if (type == VERT_LIST) { + goto vertical_list; + } + if (type == ARG_LIST) { + goto arg_list; + } + + Dmsg1(800, "list_result starts second loop looking at %d fields\n", + mdb->sql_num_fields()); + + /* Keep the result to display the same line at the end of the table */ + list_dashes(mdb, last_line_handler, pctx); + send(ctx, pctx->line); + + send(ctx, "|"); + mdb->sql_field_seek(0); + for (i = 0; i < mdb->sql_num_fields(); i++) { + Dmsg1(800, "list_result looking at field %d\n", i); + field = mdb->sql_fetch_field(); + if (!field) { + break; + } + max_len = max_length(field->max_length); + bsnprintf(buf, sizeof(buf), " %-*s |", max_len, field->name); + send(ctx, buf); + } + send(ctx, "\n"); + list_dashes(mdb, send, ctx); + } + Dmsg1(800, "list_result starts third loop looking at %d fields\n", + mdb->sql_num_fields()); + mdb->sql_field_seek(0); + send(ctx, "|"); + for (i = 0; i < mdb->sql_num_fields(); i++) { + field = mdb->sql_fetch_field(); + if (!field) { + break; + } + max_len = max_length(field->max_length); + if (row[i] == NULL) { + bsnprintf(buf, sizeof(buf), " %-*s |", max_len, "NULL"); + } else if (mdb->sql_field_is_numeric(field->type) && !jcr->gui && is_an_integer(row[i])) { + bsnprintf(buf, sizeof(buf), " %*s |", max_len, + add_commas(row[i], ewc)); + } else { + bsnprintf(buf, sizeof(buf), " %-*s |", max_len, row[i]); + } + send(ctx, buf); + } + send(ctx, "\n"); + return 0; + +vertical_list: + + Dmsg1(800, "list_result starts vertical list at %d fields\n", mdb->sql_num_fields()); + mdb->sql_field_seek(0); + for (i = 0; i < mdb->sql_num_fields(); i++) { + field = mdb->sql_fetch_field(); + if (!field) { + break; + } + if (row[i] == NULL) { + bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, "NULL"); + } else if (mdb->sql_field_is_numeric(field->type) && !jcr->gui && is_an_integer(row[i])) { + bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, + add_commas(row[i], ewc)); + } else { + bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, row[i]); + } + send(ctx, buf); + } + send(ctx, "\n"); + return 0; + +arg_list: + Dmsg1(800, "list_result starts simple list at %d fields\n", mdb->sql_num_fields()); + mdb->sql_field_seek(0); + for (i = 0; i < mdb->sql_num_fields(); i++) { + field = mdb->sql_fetch_field(); + if (!field) { + break; + } + if (row[i] == NULL) { + bsnprintf(buf, sizeof(buf), "%s%s=", (i>0?" ":""), field->name); + } else { + bash_spaces(row[i]); + bsnprintf(buf, sizeof(buf), "%s%s=%s ", (i>0?" ":""), field->name, row[i]); + } + send(ctx, buf); + } + send(ctx, "\n"); + return 0; + +} + +/* + * If full_list is set, we list vertically, otherwise, we + * list on one line horizontally. + * Return number of rows + */ +int +list_result(JCR *jcr, BDB *mdb, DB_LIST_HANDLER *send, void *ctx, e_list_type type) +{ + SQL_FIELD *field; + SQL_ROW row; + int i, col_len, max_len = 0; + char buf[2000], ewc[30]; + + Dmsg0(800, "list_result starts\n"); + if (mdb->sql_num_rows() == 0) { + send(ctx, _("No results to list.\n")); + return mdb->sql_num_rows(); + } + + Dmsg1(800, "list_result starts looking at %d fields\n", mdb->sql_num_fields()); + /* determine column display widths */ + mdb->sql_field_seek(0); + for (i = 0; i < mdb->sql_num_fields(); i++) { + Dmsg1(800, "list_result processing field %d\n", i); + field = mdb->sql_fetch_field(); + if (!field) { + break; + } + col_len = cstrlen(field->name); + if (type == VERT_LIST) { + if (col_len > max_len) { + max_len = col_len; + } + } else { + if (mdb->sql_field_is_numeric(field->type) && (int)field->max_length > 0) { /* fixup for commas */ + field->max_length += (field->max_length - 1) / 3; + } + if (col_len < (int)field->max_length) { + col_len = field->max_length; + } + if (col_len < 4 && !mdb->sql_field_is_not_null(field->flags)) { + col_len = 4; /* 4 = length of the word "NULL" */ + } + field->max_length = col_len; /* reset column info */ + } + } + + Dmsg0(800, "list_result finished first loop\n"); + if (type == VERT_LIST) { + goto vertical_list; + } + if (type == ARG_LIST) { + goto arg_list; + } + + Dmsg1(800, "list_result starts second loop looking at %d fields\n", mdb->sql_num_fields()); + list_dashes(mdb, send, ctx); + send(ctx, "|"); + mdb->sql_field_seek(0); + for (i = 0; i < mdb->sql_num_fields(); i++) { + Dmsg1(800, "list_result looking at field %d\n", i); + field = mdb->sql_fetch_field(); + if (!field) { + break; + } + max_len = max_length(field->max_length); + bsnprintf(buf, sizeof(buf), " %-*s |", max_len, field->name); + send(ctx, buf); + } + send(ctx, "\n"); + list_dashes(mdb, send, ctx); + + Dmsg1(800, "list_result starts third loop looking at %d fields\n", mdb->sql_num_fields()); + while ((row = mdb->sql_fetch_row()) != NULL) { + mdb->sql_field_seek(0); + send(ctx, "|"); + for (i = 0; i < mdb->sql_num_fields(); i++) { + field = mdb->sql_fetch_field(); + if (!field) { + break; + } + max_len = max_length(field->max_length); + if (row[i] == NULL) { + bsnprintf(buf, sizeof(buf), " %-*s |", max_len, "NULL"); + } else if (mdb->sql_field_is_numeric(field->type) && !jcr->gui && is_an_integer(row[i])) { + bsnprintf(buf, sizeof(buf), " %*s |", max_len, + add_commas(row[i], ewc)); + } else { + bsnprintf(buf, sizeof(buf), " %-*s |", max_len, row[i]); + } + send(ctx, buf); + } + send(ctx, "\n"); + } + list_dashes(mdb, send, ctx); + return mdb->sql_num_rows(); + +vertical_list: + + Dmsg1(800, "list_result starts vertical list at %d fields\n", mdb->sql_num_fields()); + while ((row = mdb->sql_fetch_row()) != NULL) { + mdb->sql_field_seek(0); + for (i = 0; i < mdb->sql_num_fields(); i++) { + field = mdb->sql_fetch_field(); + if (!field) { + break; + } + if (row[i] == NULL) { + bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, "NULL"); + } else if (mdb->sql_field_is_numeric(field->type) && !jcr->gui && is_an_integer(row[i])) { + bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, + add_commas(row[i], ewc)); + } else { + bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, row[i]); + } + send(ctx, buf); + } + send(ctx, "\n"); + } + +arg_list: + + Dmsg1(800, "list_result starts arg list at %d fields\n", mdb->sql_num_fields()); + while ((row = mdb->sql_fetch_row()) != NULL) { + mdb->sql_field_seek(0); + for (i = 0; i < mdb->sql_num_fields(); i++) { + field = mdb->sql_fetch_field(); + if (!field) { + break; + } + if (row[i] == NULL) { + bsnprintf(buf, sizeof(buf), "%s%s=", (i>0?" ":""), field->name); + } else { + bash_spaces(row[i]); + bsnprintf(buf, sizeof(buf), "%s%s=%s", (i>0?" ":""), field->name, row[i]); + } + send(ctx, buf); + } + send(ctx, "\n"); + } + return mdb->sql_num_rows(); +} + +/* + * Open a new connexion to mdb catalog. This function is used + * by batch and accurate mode. + */ +bool BDB::bdb_open_batch_connexion(JCR *jcr) +{ + bool multi_db; + + multi_db = batch_insert_available(); + + if (!jcr->db_batch) { + jcr->db_batch = bdb_clone_database_connection(jcr, multi_db); + if (!jcr->db_batch) { + Mmsg0(&errmsg, _("Could not init database batch connection\n")); + Jmsg(jcr, M_FATAL, 0, "%s", errmsg); + return false; + } + + if (!jcr->db_batch->bdb_open_database(jcr)) { + Mmsg2(&errmsg, _("Could not open database \"%s\": ERR=%s\n"), + jcr->db_batch->get_db_name(), jcr->db_batch->bdb_strerror()); + Jmsg(jcr, M_FATAL, 0, "%s", errmsg); + return false; + } + } + return true; +} + +/* + * !!! WARNING !!! Use this function only when bacula is stopped. + * ie, after a fatal signal and before exiting the program + * Print information about a BDB object. + */ +void bdb_debug_print(JCR *jcr, FILE *fp) +{ + BDB *mdb = jcr->db; + + if (!mdb) { + return; + } + + fprintf(fp, "BDB=%p db_name=%s db_user=%s connected=%s\n", + mdb, NPRTB(mdb->get_db_name()), NPRTB(mdb->get_db_user()), mdb->is_connected() ? "true" : "false"); + fprintf(fp, "\tcmd=\"%s\" changes=%i\n", NPRTB(mdb->cmd), mdb->changes); + mdb->print_lock_info(fp); +} + +#endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL */ diff --git a/bacula/src/cats/sql_cmds.c b/bacula/src/cats/sql_cmds.c index c996ee2c39..d80003bf25 100644 --- a/bacula/src/cats/sql_cmds.c +++ b/bacula/src/cats/sql_cmds.c @@ -1,21 +1,25 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 2002-2014 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * This file contains all the SQL commands that are either issued by the - * Director or which are database backend specific. + * This file contains all the SQL commands that are either issued by + * the Director or which are database backend specific. * * Written by Kern Sibbald, July MMII */ @@ -28,7 +32,7 @@ #include "bacula.h" -const char *get_restore_objects = +const char *get_restore_objects = "SELECT JobId,ObjectLength,ObjectFullLength,ObjectIndex," "ObjectType,ObjectCompression,FileIndex,ObjectName," "RestoreObject,PluginName " @@ -40,28 +44,27 @@ const char *get_restore_objects = const char *cleanup_created_job = "UPDATE Job SET JobStatus='f', StartTime=SchedTime, EndTime=SchedTime " "WHERE JobStatus = 'C'"; -const char *cleanup_running_job = +const char *cleanup_running_job = "UPDATE Job SET JobStatus='f', EndTime=StartTime WHERE JobStatus = 'R'"; /* For sql_update.c db_update_stats */ const char *fill_jobhisto = - "INSERT INTO JobHisto (" - "JobId, Job, Name, Type, Level, ClientId, JobStatus, " - "SchedTime, StartTime, EndTime, RealEndTime, JobTDate, " - "VolSessionId, VolSessionTime, JobFiles, JobBytes, ReadBytes, " - "JobErrors, JobMissingFiles, PoolId, FileSetId, PriorJobId, " - "PurgedFiles, HasBase, Reviewed, Comment ) " - "SELECT " - "JobId, Job, Name, Type, Level, ClientId, JobStatus, " - "SchedTime, StartTime, EndTime, RealEndTime, JobTDate, " - "VolSessionId, VolSessionTime, JobFiles, JobBytes, ReadBytes, " - "JobErrors, JobMissingFiles, PoolId, FileSetId, PriorJobId, " + "INSERT INTO JobHisto (JobId, Job, Name, Type, Level," + "ClientId, JobStatus," + "SchedTime, StartTime, EndTime, RealEndTime, JobTDate," + "VolSessionId, VolSessionTime, JobFiles, JobBytes, ReadBytes," + "JobErrors, JobMissingFiles, PoolId, FileSetId, PriorJobId," + "PurgedFiles, HasBase, Reviewed, Comment)" + "SELECT JobId, Job, Name, Type, Level, ClientId, JobStatus," + "SchedTime, StartTime, EndTime, RealEndTime, JobTDate," + "VolSessionId, VolSessionTime, JobFiles, JobBytes, ReadBytes," + "JobErrors, JobMissingFiles, PoolId, FileSetId, PriorJobId," "PurgedFiles, HasBase, Reviewed, Comment " "FROM Job " - "WHERE JobStatus IN ('T','W','f','A','E') " + "WHERE JobStatus IN ('T','W','f','A','E')" "AND NOT EXISTS " "(SELECT JobHisto.JobId " - "FROM JobHisto WHERE JobHisto.Jobid=Job.JobId) " + "FROM JobHisto WHERE JobHisto.Jobid=Job.JobId)" "AND JobTDate < %s "; /* For ua_update.c */ @@ -74,18 +77,18 @@ const char *client_backups = " FROM Client,Job,JobMedia,Media,FileSet" " WHERE Client.Name='%s'" " AND FileSet='%s'" - " AND Client.ClientId=Job.ClientId" - " AND JobStatus IN ('T','W') AND Type='B'" - " AND JobMedia.JobId=Job.JobId AND JobMedia.MediaId=Media.MediaId" + " AND Client.ClientId=Job.ClientId " + " AND JobStatus IN ('T','W') AND Type='B' " + " AND JobMedia.JobId=Job.JobId AND JobMedia.MediaId=Media.MediaId " " AND Job.FileSetId=FileSet.FileSetId" " ORDER BY Job.StartTime"; /* ====== ua_prune.c */ -const char *sel_JobMedia = - "SELECT DISTINCT JobMedia.JobId FROM JobMedia,Job " - "WHERE MediaId=%s AND Job.JobId=JobMedia.JobId " - "AND Job.JobTDate<%s"; +const char *sel_JobMedia = + "SELECT DISTINCT JobMedia.JobId FROM JobMedia,Job" + " WHERE MediaId=%s AND Job.JobId=JobMedia.JobId " + " AND Job.JobTDate<%s"; /* Delete temp tables and indexes */ const char *drop_deltabs[] = { @@ -105,7 +108,7 @@ const char *uar_list_jobs = "FROM Client,Job WHERE Client.ClientId=Job.ClientId AND JobStatus IN ('T','W') " "AND Type='B' ORDER BY StartTime DESC LIMIT 20"; -const char *uar_print_jobs = +const char *uar_print_jobs = "SELECT DISTINCT JobId,Level,JobFiles,JobBytes,StartTime,VolumeName" " FROM Job JOIN JobMedia USING (JobId) JOIN Media USING (MediaId) " " WHERE JobId IN (%s) " @@ -187,7 +190,7 @@ const char *uar_list_temp = " ORDER BY StartTime ASC"; -const char *uar_sel_jobid_temp = +const char *uar_sel_jobid_temp = "SELECT DISTINCT JobId,StartTime FROM temp ORDER BY StartTime ASC"; const char *uar_sel_all_temp1 = "SELECT * FROM temp1"; @@ -245,18 +248,18 @@ const char *uar_jobids_fileindex = "ORDER BY Job.StartTime DESC LIMIT 1"; /* Query to get list of files from table -- presuably built by an external program */ -const char *uar_jobid_fileindex_from_table = - "SELECT JobId,FileIndex FROM %s ORDER BY JobId, FileIndex ASC"; +const char *uar_jobid_fileindex_from_table = + "SELECT JobId, FileIndex FROM %s ORDER BY JobId, FileIndex ASC"; -/* Get the list of the last recent version per Delta with a given jobid list - * This is a tricky part because with SQL the result of +/* Get the list of the last recent version per Delta with a given + * jobid list. This is a tricky part because with SQL the result of: * - * SELECT MAX(A), B, C, D FROM... GROUP BY (B,C) + * SELECT MAX(A), B, C, D FROM... GROUP BY (B,C) * * doesn't give the good result (for D). * * With PostgreSQL, we can use DISTINCT ON(), but with Mysql or Sqlite, - * we need an extra join using JobTDate. + * we need an extra join using JobTDate. */ static const char *select_recent_version_with_basejob_default = "SELECT FileId, Job.JobId AS JobId, FileIndex, File.PathId AS PathId, " @@ -285,8 +288,9 @@ static const char *select_recent_version_with_basejob_default = "AND T1.PathId = File.PathId " "AND T1.FilenameId = File.FilenameId"; -const char *select_recent_version_with_basejob[] = { - /* MySQL */ +const char *select_recent_version_with_basejob[] = +{ + /* MySQL */ select_recent_version_with_basejob_default, /* Postgresql */ /* The DISTINCT ON () permits to avoid extra join */ @@ -303,10 +307,10 @@ const char *select_recent_version_with_basejob[] = { ") AS T JOIN Job USING (JobId) " "ORDER BY FilenameId, PathId, JobTDate DESC ", - /* SQLite3 */ + /* SQLite */ select_recent_version_with_basejob_default }; - + /* We do the same thing than the previous query, but we include * all delta parts. If the file has been deleted, we can have irrelevant * parts. @@ -318,8 +322,7 @@ const char *select_recent_version_with_basejob[] = { * * If we detect a gap, we can discard further pieces * If a file starts at 1 instead of 0, the file has been deleted, and further - * pieces are useless. - * + * pieces are useless. * This control should be reset for each new file */ static const char *select_recent_version_with_basejob_and_delta_default = @@ -367,14 +370,14 @@ const char *select_recent_version_with_basejob_and_delta[] = { ") AS T JOIN Job USING (JobId) " "ORDER BY FilenameId, PathId, DeltaSeq, JobTDate DESC ", - /* SQLite3 */ + /* SQLite */ select_recent_version_with_basejob_and_delta_default }; /* Get the list of the last recent version with a given BaseJob jobid list * We don't handle Delta with BaseJobs, they have only Full files */ -static const char *select_recent_version_default = +static const char *select_recent_version_default = "SELECT j1.JobId AS JobId, f1.FileId AS FileId, f1.FileIndex AS FileIndex, " "f1.PathId AS PathId, f1.FilenameId AS FilenameId, " "f1.LStat AS LStat, f1.MD5 AS MD5, j1.JobTDate " @@ -390,7 +393,8 @@ static const char *select_recent_version_default = "AND t1.PathId = f1.PathId " "AND j1.JobId = f1.JobId"; -const char *select_recent_version[] = { +const char *select_recent_version[] = +{ /* MySQL */ select_recent_version_default, @@ -401,14 +405,14 @@ const char *select_recent_version[] = { "WHERE JobId IN (%s) " "ORDER BY FilenameId, PathId, JobTDate DESC ", - /* SQLite3 */ + /* SQLite */ select_recent_version_default }; -/* We don't create this table as TEMPORARY because MySQL MyISAM - * 5.0 and 5.1 are unable to run further queries in this mode +/* We don't create this table as TEMPORARY because MySQL + MyISAM 5.0 and 5.1 are unable to run further queries in this mode */ -static const char *create_temp_accurate_jobids_default = +static const char *create_temp_accurate_jobids_default = "CREATE TABLE btemp3%s AS " "SELECT JobId, StartTime, EndTime, JobTDate, PurgedFiles " "FROM Job JOIN FileSet USING (FileSetId) " @@ -482,7 +486,8 @@ const char *create_temp_new_basefile[] = { /* ====== ua_prune.c */ /* List of SQL commands to create temp table and indicies */ -const char *create_deltabs[] = { +const char *create_deltabs[] = +{ /* MySQL */ "CREATE TEMPORARY TABLE DelCandidates (" "JobId INTEGER UNSIGNED NOT NULL, " @@ -490,29 +495,29 @@ const char *create_deltabs[] = { "FileSetId INTEGER UNSIGNED, " "JobFiles INTEGER UNSIGNED, " "JobStatus BINARY(1))", - - /* Postgresql */ - "CREATE TEMPORARY TABLE DelCandidates (" + + /* PostgreSQL */ + "CREATE TEMPORARY TABLE DelCandidates ( " "JobId INTEGER NOT NULL, " "PurgedFiles SMALLINT, " "FileSetId INTEGER, " "JobFiles INTEGER, " "JobStatus char(1))", - - /* SQLite3 */ + + /* SQLite */ "CREATE TEMPORARY TABLE DelCandidates (" "JobId INTEGER UNSIGNED NOT NULL, " "PurgedFiles TINYINT, " "FileSetId INTEGER UNSIGNED, " "JobFiles INTEGER UNSIGNED, " "JobStatus CHAR)" -}; - -/* ======= ua_purge.c */ +}; -/* Select the first available Copy Job that must be upgraded to a Backup job when the original backup job is expired. */ - -static const char *uap_upgrade_copies_oldest_job_default = +/* ======= ua_purge.c ====== */ +/* Select the first available Copy Job that must be upgraded + * to a Backup job when the original backup job is expired. + */ +static const char *uap_upgrade_copies_oldest_job_default = "CREATE TEMPORARY TABLE cpy_tmp AS " "SELECT MIN(JobId) AS JobId FROM Job " /* Choose the oldest job */ "WHERE Type='%c' " /* JT_JOB_COPY */ @@ -527,22 +532,22 @@ static const char *uap_upgrade_copies_oldest_job_default = ") " "GROUP BY PriorJobId "; /* one result per copy */ -const char *uap_upgrade_copies_oldest_job[] = { - /* Mysql */ +const char *uap_upgrade_copies_oldest_job[] = +{ + /* MySQL */ uap_upgrade_copies_oldest_job_default, - - /* Postgresql */ + /* PostgreSQL */ uap_upgrade_copies_oldest_job_default, - - /* SQLite3 */ + /* SQLite */ uap_upgrade_copies_oldest_job_default -}; - -/* ======= ua_restore.c */ +}; + +/* ======= ua_restore.c ====== */ /* List Jobs where a particular file is saved */ -const char *uar_file[] = { - /* Mysql */ +const char *uar_file[] = +{ + /* MySQL */ "SELECT Job.JobId as JobId," "CONCAT(Path.Path,Filename.Name) as Name, " "StartTime,Type as JobType,JobStatus,JobFiles,JobBytes " @@ -587,8 +592,8 @@ const char *uar_create_temp[] = { "StartFile INTEGER UNSIGNED," "VolSessionId INTEGER UNSIGNED," "VolSessionTime INTEGER UNSIGNED)", - - /* Postgresql */ + + /* PostgreSQL */ "CREATE TEMPORARY TABLE temp (" "JobId INTEGER NOT NULL," "JobTDate BIGINT," @@ -601,8 +606,8 @@ const char *uar_create_temp[] = { "StartFile INTEGER," "VolSessionId INTEGER," "VolSessionTime INTEGER)", - - /* SQLite3 */ + + /* SQLite */ "CREATE TEMPORARY TABLE temp (" "JobId INTEGER UNSIGNED NOT NULL," "JobTDate BIGINT UNSIGNED," @@ -615,26 +620,25 @@ const char *uar_create_temp[] = { "StartFile INTEGER UNSIGNED," "VolSessionId INTEGER UNSIGNED," "VolSessionTime INTEGER UNSIGNED)" -}; +}; -const char *uar_create_temp1[] = { - /* Mysql */ +const char *uar_create_temp1[] = +{ + /* MySQL */ "CREATE TEMPORARY TABLE temp1 (" "JobId INTEGER UNSIGNED NOT NULL," "JobTDate BIGINT UNSIGNED)", - - /* Postgresql */ + /* PostgreSQL */ "CREATE TEMPORARY TABLE temp1 (" "JobId INTEGER NOT NULL," "JobTDate BIGINT)", - - /* SQLite3 */ + /* SQLite */ "CREATE TEMPORARY TABLE temp1 (" "JobId INTEGER UNSIGNED NOT NULL," "JobTDate BIGINT UNSIGNED)" -}; +}; -/* Query to get all files in a directory -- no recursing +/* Query to get all files in a directory no recursing * Note, for PostgreSQL since it respects the "Single Value * rule", the results of the SELECT will be unoptimized. * I.e. the same file will be restored multiple times, once @@ -689,12 +693,10 @@ const char *sql_media_order_most_recently_written[] = { const char *sql_get_max_connections[] = { /* Mysql */ "SHOW VARIABLES LIKE 'max_connections'", - - /* Postgresql */ + /* PostgreSQL */ "SHOW max_connections", - - /* SQLite3 */ - "SELECT 0" + /* SQLite */ + "SELECT 0" }; /* @@ -715,11 +717,11 @@ const char *default_sql_bvfs_select = "AND File.FileIndex > 0 " "AND Job.JobId IN (SELECT DISTINCT JobId FROM btemp%s) "; -const char *sql_bvfs_select[] = { - /* Mysql */ +const char *sql_bvfs_select[] = +{ + /* MySQL */ default_sql_bvfs_select, - - /* Postgresql */ + /* PostgreSQL */ "CREATE TABLE %s AS ( " "SELECT JobId, FileIndex, FileId " "FROM ( " @@ -729,8 +731,7 @@ const char *sql_bvfs_select[] = { "ORDER BY PathId, FilenameId, JobTDate DESC " ") AS T " "WHERE FileIndex > 0)", - - /* SQLite3 */ + /* SQLite */ default_sql_bvfs_select }; @@ -764,8 +765,7 @@ static const char *sql_bvfs_list_files_default = "OR Job.JobId IN (%s)) "; const char *sql_bvfs_list_files[] = { - /* Mysql */ - /* JobId PathId JobId PathId Limit Offset AND? Filename? JobId JobId*/ + /* MySQL */ sql_bvfs_list_files_default, /* JobId PathId JobId PathId WHERE? Filename? Limit Offset*/ @@ -792,13 +792,13 @@ const char *sql_bvfs_list_files[] = { /* SQLite */ sql_bvfs_list_files_default, - /* SQLite3 */ + /* SQLite */ sql_bvfs_list_files_default }; /* Basically the same thing than select_recent_version_with_basejob_and_delta_default, * but we specify a single file with FilenameId/PathId - * + * * Input: * 1 JobId to look at * 2 FilenameId @@ -820,7 +820,7 @@ const char *bvfs_select_delta_version_with_basejob_and_delta_default = "FROM File JOIN Job USING (JobId) " /* from selected backup */ "WHERE File.JobId IN (%s) AND FilenameId = %s AND PathId = %s " "UNION ALL " - "SELECT JobTDate, PathId, FilenameId, DeltaSeq " /*Get all files from */ + "SELECT JobTDate, PathId, FilenameId, DeltaSeq " /*Get all files from */ "FROM BaseFiles " /* BaseJob */ "JOIN File USING (FileId) " "JOIN Job ON (BaseJobId = Job.JobId) " @@ -838,7 +838,8 @@ const char *bvfs_select_delta_version_with_basejob_and_delta_default = "AND T1.FilenameId = File.FilenameId"; -const char *bvfs_select_delta_version_with_basejob_and_delta[] = { +const char *bvfs_select_delta_version_with_basejob_and_delta[] = +{ /* MySQL */ bvfs_select_delta_version_with_basejob_and_delta_default, @@ -856,7 +857,7 @@ const char *bvfs_select_delta_version_with_basejob_and_delta[] = { ") AS T JOIN Job USING (JobId) " "ORDER BY FilenameId, PathId, DeltaSeq, JobTDate DESC ", - /* SQLite3 */ + /* SQLite */ bvfs_select_delta_version_with_basejob_and_delta_default }; @@ -900,15 +901,15 @@ const char *batch_fill_path_query[] = { "SELECT a.Path FROM " "(SELECT DISTINCT Path FROM batch) AS a WHERE NOT EXISTS " "(SELECT Path FROM Path AS p WHERE p.Path = a.Path)", - - /* Postgresql */ - "INSERT INTO Path (Path) " + + /* PostgreSQL */ + "INSERT INTO Path (Path)" "SELECT a.Path FROM " "(SELECT DISTINCT Path FROM batch) AS a " "WHERE NOT EXISTS (SELECT Path FROM Path WHERE Path = a.Path) ", - - /* SQLite3 */ - "INSERT INTO Path (Path) " + + /* SQLite */ + "INSERT INTO Path (Path)" "SELECT DISTINCT Path FROM batch " "EXCEPT SELECT Path FROM Path" }; @@ -936,85 +937,79 @@ const char *batch_fill_filename_query[] = { const char *match_query[] = { /* Mysql */ "REGEXP", - - /* Postgresql */ - "~", - - /* SQLite3 */ - "LIKE" /* MATCH doesn't seems to work anymore... */ -}; - + /* PostgreSQL */ + "~", + /* SQLite */ + "LIKE" /* MATCH doesn't seems to work anymore... */ +}; + static const char *insert_counter_values_default = "INSERT INTO Counters (Counter, MinValue, " "MaxValue, CurrentValue, WrapCounter) " "VALUES ('%s','%d','%d','%d','%s')"; const char *insert_counter_values[] = { - /* Mysql */ + /* MySQL */ "INSERT INTO Counters (Counter, Counters.MinValue, " "Counters.MaxValue, CurrentValue, WrapCounter) " "VALUES ('%s','%d','%d','%d','%s')", - /* Postgresql */ + /* PostgreSQL */ insert_counter_values_default, - /* SQLite3 */ + /* SQLite */ insert_counter_values_default }; -static const char *select_counter_values_default = - "SELECT MinValue, MaxValue, CurrentValue, WrapCounter " - "FROM Counters WHERE Counter='%s'"; - -const char *select_counter_values[] = { - /* Mysql */ - "SELECT Counters.MinValue, Counters.MaxValue, CurrentValue, WrapCounter " - "FROM Counters WHERE Counter='%s'", - - /* Postgresql */ - select_counter_values_default, - - /* SQLite3 */ - select_counter_values_default -}; - -static const char *update_counter_values_default = - "UPDATE Counters SET " - "MinValue=%d, MaxValue=%d, CurrentValue=%d, WrapCounter='%s'" - "WHERE Counter='%s'"; - -const char *update_counter_values[] = { - /* Mysql */ - "UPDATE Counters SET " - "Counters.MinValue=%d, Counters.MaxValue=%d, CurrentValue=%d, WrapCounter='%s'" - "WHERE Counter='%s'", - - /* Postgresql */ - update_counter_values_default, - - /* SQLite3 */ - update_counter_values_default -}; - +static const char *select_counter_values_default = + "SELECT MinValue, MaxValue, CurrentValue, WrapCounter" + " FROM Counters WHERE Counter='%s'"; + +const char *select_counter_values[] = +{ + /* MySQL */ + "SELECT Counters.MinValue, Counters.MaxValue, CurrentValue, WrapCounter" + " FROM Counters WHERE Counter='%s'", + + /* PostgreSQL */ + select_counter_values_default, + + /* SQLite */ + select_counter_values_default +}; + +static const char *update_counter_values_default = + "UPDATE Counters SET MinValue=%d, MaxValue=%d, CurrentValue=%d," + "WrapCounter='%s' WHERE Counter='%s'"; + +const char *update_counter_values[] = +{ + /* MySQL */ + "UPDATE Counters SET Counters.MinValue=%d, Counters.MaxValue=%d," + "CurrentValue=%d, WrapCounter='%s' WHERE Counter='%s'", + /* PostgreSQL */ + update_counter_values_default, + /* SQLite */ + update_counter_values_default +}; + static const char *expired_volumes_defaults = -"SELECT Media.VolumeName AS volumename, " - "Media.LastWritten AS lastwritten " -" FROM Media " -" WHERE VolStatus IN ('Full', 'Used') " - " AND ( Media.LastWritten + Media.VolRetention ) < NOW() " +"SELECT Media.VolumeName AS volumename," + "Media.LastWritten AS lastwritten" +" FROM Media" +" WHERE VolStatus IN ('Full', 'Used')" + " AND ( Media.LastWritten + Media.VolRetention ) < NOW()" " %s "; const char *expired_volumes[] = { - /* Mysql */ + /* MySQL */ expired_volumes_defaults, - - /* Postgresql */ + /* PostgreSQL */ "SELECT Media.VolumeName, Media.LastWritten " " FROM Media " " WHERE VolStatus IN ('Full', 'Used') " " AND ( Media.LastWritten + (interval '1 second' * Media.VolRetention ) < NOW()) " " %s ", - - /* SQLite3 */ + /* SQLite */ expired_volumes_defaults }; diff --git a/bacula/src/cats/sql_cmds.h b/bacula/src/cats/sql_cmds.h index 9f989783b2..2c91f6f9da 100644 --- a/bacula/src/cats/sql_cmds.h +++ b/bacula/src/cats/sql_cmds.h @@ -1,24 +1,39 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ +/* + * sql_cmds.c contains all the SQL commands that are either issued by the + * Director or which are database backend specific. + * + * This file defines the external definitions necessary to + * build on Windows + * + * Kern Sibbald, July MMII + */ + extern const char CATS_IMP_EXP *batch_fill_filename_query[]; extern const char CATS_IMP_EXP *batch_fill_path_query[]; extern const char CATS_IMP_EXP *batch_lock_filename_query[]; extern const char CATS_IMP_EXP *batch_lock_path_query[]; extern const char CATS_IMP_EXP *batch_unlock_tables_query[]; +extern const char CATS_IMP_EXP *bvfs_select_delta_version_with_basejob_and_delta[]; extern const char CATS_IMP_EXP *cleanup_created_job; extern const char CATS_IMP_EXP *cleanup_running_job; extern const char CATS_IMP_EXP *client_backups; @@ -71,4 +86,4 @@ extern const char CATS_IMP_EXP *uar_sel_files; extern const char CATS_IMP_EXP *uar_sel_fileset; extern const char CATS_IMP_EXP *uar_sel_filesetid; extern const char CATS_IMP_EXP *uar_sel_jobid_temp; -extern const char CATS_IMP_EXP *update_counter_values[]; +extern const char CATS_IMP_EXP *update_counter_values[]; diff --git a/bacula/src/cats/sql_create.c b/bacula/src/cats/sql_create.c index 74d7603e90..9a84a49c33 100644 --- a/bacula/src/cats/sql_create.c +++ b/bacula/src/cats/sql_create.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula Catalog Database Create record interface routines @@ -20,15 +24,13 @@ * */ -#include "bacula.h" +#include "bacula.h" static const int dbglevel = 100; #if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL - -#include "cats.h" -#include "bdb_priv.h" -#include "sql_glue.h" + +#include "cats.h" /* ----------------------------------------------------------------------- * @@ -37,16 +39,11 @@ static const int dbglevel = 100; * ----------------------------------------------------------------------- */ -/* Forward referenced subroutines */ -static int db_create_file_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar); -static int db_create_filename_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar); - /** Create a new record for the Job * Returns: false on failure * true on success */ -bool -db_create_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) +bool BDB::bdb_create_job_record(JCR *jcr, JOB_DBR *jr) { POOL_MEM buf; char dt[MAX_TIME_LENGTH]; @@ -59,7 +56,7 @@ db_create_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) char esc_job[MAX_ESCAPE_NAME_LENGTH]; char esc_name[MAX_ESCAPE_NAME_LENGTH]; - db_lock(mdb); + bdb_lock(); stime = jr->SchedTime; ASSERT(stime != 0); @@ -70,13 +67,13 @@ db_create_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) len = strlen(jcr->comment); /* TODO: use jr instead of jcr to get comment */ buf.check_size(len*2+1); - mdb->db_escape_string(jcr, buf.c_str(), jcr->comment, len); + bdb_escape_string(jcr, buf.c_str(), jcr->comment, len); - mdb->db_escape_string(jcr, esc_job, jr->Job, strlen(jr->Job)); - mdb->db_escape_string(jcr, esc_name, jr->Name, strlen(jr->Name)); + bdb_escape_string(jcr, esc_job, jr->Job, strlen(jr->Job)); + bdb_escape_string(jcr, esc_name, jr->Name, strlen(jr->Name)); /* Must create it */ - Mmsg(mdb->cmd, + Mmsg(cmd, "INSERT INTO Job (Job,Name,Type,Level,JobStatus,SchedTime,JobTDate," "ClientId,Comment) " "VALUES ('%s','%s','%c','%c','%c','%s',%s,%s,'%s')", @@ -84,15 +81,14 @@ db_create_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) (char)(jr->JobStatus), dt, edit_uint64(JobTDate, ed1), edit_int64(jr->ClientId, ed2), buf.c_str()); - jr->JobId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("Job")); - if (jr->JobId == 0) { - Mmsg2(&mdb->errmsg, _("Create DB Job record %s failed. ERR=%s\n"), - mdb->cmd, sql_strerror(mdb)); + if ((jr->JobId = sql_insert_autokey_record(cmd, NT_("Job"))) == 0) { + Mmsg2(&errmsg, _("Create DB Job record %s failed. ERR=%s\n"), + cmd, sql_strerror()); ok = false; } else { ok = true; } - db_unlock(mdb); + bdb_unlock(); return ok; } @@ -101,25 +97,24 @@ db_create_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) * Returns: false on failure * true on success */ -bool -db_create_jobmedia_record(JCR *jcr, B_DB *mdb, JOBMEDIA_DBR *jm) +bool BDB::bdb_create_jobmedia_record(JCR *jcr, JOBMEDIA_DBR *jm) { bool ok = true; int count; char ed1[50], ed2[50]; - db_lock(mdb); + bdb_lock(); /* Now get count for VolIndex */ - Mmsg(mdb->cmd, "SELECT count(*) from JobMedia WHERE JobId=%s", + Mmsg(cmd, "SELECT count(*) from JobMedia WHERE JobId=%s", edit_int64(jm->JobId, ed1)); - count = get_sql_record_max(jcr, mdb); + count = get_sql_record_max(jcr, this); if (count < 0) { count = 0; } count++; - Mmsg(mdb->cmd, + Mmsg(cmd, "INSERT INTO JobMedia (JobId,MediaId,FirstIndex,LastIndex," "StartFile,EndFile,StartBlock,EndBlock,VolIndex) " "VALUES (%s,%s,%u,%u,%u,%u,%u,%u,%u)", @@ -128,23 +123,23 @@ db_create_jobmedia_record(JCR *jcr, B_DB *mdb, JOBMEDIA_DBR *jm) jm->FirstIndex, jm->LastIndex, jm->StartFile, jm->EndFile, jm->StartBlock, jm->EndBlock,count); - Dmsg0(300, mdb->cmd); - if (!INSERT_DB(jcr, mdb, mdb->cmd)) { - Mmsg2(&mdb->errmsg, _("Create JobMedia record %s failed: ERR=%s\n"), mdb->cmd, - sql_strerror(mdb)); + Dmsg0(300, cmd); + if (!InsertDB(jcr, cmd)) { + Mmsg2(&errmsg, _("Create JobMedia record %s failed: ERR=%s\n"), cmd, + sql_strerror()); ok = false; } else { /* Worked, now update the Media record with the EndFile and EndBlock */ - Mmsg(mdb->cmd, + Mmsg(cmd, "UPDATE Media SET EndFile=%u, EndBlock=%u WHERE MediaId=%u", jm->EndFile, jm->EndBlock, jm->MediaId); - if (!UPDATE_DB(jcr, mdb, mdb->cmd)) { - Mmsg2(&mdb->errmsg, _("Update Media record %s failed: ERR=%s\n"), mdb->cmd, - sql_strerror(mdb)); + if (!UpdateDB(jcr, cmd)) { + Mmsg2(&errmsg, _("Update Media record %s failed: ERR=%s\n"), cmd, + sql_strerror()); ok = false; } } - db_unlock(mdb); + bdb_unlock(); Dmsg0(300, "Return from JobMedia\n"); return ok; } @@ -153,37 +148,33 @@ db_create_jobmedia_record(JCR *jcr, B_DB *mdb, JOBMEDIA_DBR *jm) * Returns: false on failure * true on success */ -bool -db_create_pool_record(JCR *jcr, B_DB *mdb, POOL_DBR *pr) +bool BDB::bdb_create_pool_record(JCR *jcr, POOL_DBR *pr) { bool stat; char ed1[30], ed2[30], ed3[50], ed4[50], ed5[50]; char esc_name[MAX_ESCAPE_NAME_LENGTH]; char esc_lf[MAX_ESCAPE_NAME_LENGTH]; - int num_rows; - - Dmsg0(200, "In create pool\n"); - db_lock(mdb); - mdb->db_escape_string(jcr, esc_name, pr->Name, strlen(pr->Name)); - mdb->db_escape_string(jcr, esc_lf, pr->LabelFormat, strlen(pr->LabelFormat)); - Mmsg(mdb->cmd, "SELECT PoolId,Name FROM Pool WHERE Name='%s'", esc_name); - Dmsg1(200, "selectpool: %s\n", mdb->cmd); - - if (QUERY_DB(jcr, mdb, mdb->cmd)) { - num_rows = sql_num_rows(mdb); - if (num_rows > 0) { - Mmsg1(&mdb->errmsg, _("pool record %s already exists\n"), pr->Name); - sql_free_result(mdb); - db_unlock(mdb); + bdb_lock(); + bdb_escape_string(jcr, esc_name, pr->Name, strlen(pr->Name)); + bdb_escape_string(jcr, esc_lf, pr->LabelFormat, strlen(pr->LabelFormat)); + Mmsg(cmd, "SELECT PoolId,Name FROM Pool WHERE Name='%s'", esc_name); + Dmsg1(200, "selectpool: %s\n", cmd); + + if (QueryDB(jcr, cmd)) { + if (sql_num_rows() > 0) { + Mmsg1(&errmsg, _("pool record %s already exists\n"), pr->Name); + sql_free_result(); + bdb_unlock(); + Dmsg1(200, "%s", errmsg); /* pool already exists */ return false; } - sql_free_result(mdb); + sql_free_result(); } /* Must create it */ - Mmsg(mdb->cmd, + Mmsg(cmd, "INSERT INTO Pool (Name,NumVols,MaxVols,UseOnce,UseCatalog," "AcceptAnyVolume,AutoPrune,Recycle,VolRetention,VolUseDuration," "MaxVolJobs,MaxVolFiles,MaxVolBytes,PoolType,LabelType,LabelFormat," @@ -203,17 +194,15 @@ db_create_pool_record(JCR *jcr, B_DB *mdb, POOL_DBR *pr) edit_int64(pr->ScratchPoolId,ed5), pr->ActionOnPurge ); - Dmsg1(200, "Create Pool: %s\n", mdb->cmd); - pr->PoolId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("Pool")); - if (pr->PoolId == 0) { - Mmsg2(&mdb->errmsg, _("Create db Pool record %s failed: ERR=%s\n"), - mdb->cmd, sql_strerror(mdb)); + Dmsg1(200, "Create Pool: %s\n", cmd); + if ((pr->PoolId = sql_insert_autokey_record(cmd, NT_("Pool"))) == 0) { + Mmsg2(&errmsg, _("Create db Pool record %s failed: ERR=%s\n"), + cmd, sql_strerror()); stat = false; } else { stat = true; } - db_unlock(mdb); - Dmsg0(500, "Create Pool: done\n"); + bdb_unlock(); return stat; } @@ -222,47 +211,43 @@ db_create_pool_record(JCR *jcr, B_DB *mdb, POOL_DBR *pr) * Returns: false on failure * true on success */ -bool -db_create_device_record(JCR *jcr, B_DB *mdb, DEVICE_DBR *dr) +bool BDB::bdb_create_device_record(JCR *jcr, DEVICE_DBR *dr) { bool ok; char ed1[30], ed2[30]; char esc[MAX_ESCAPE_NAME_LENGTH]; - int num_rows; Dmsg0(200, "In create Device\n"); - db_lock(mdb); - mdb->db_escape_string(jcr, esc, dr->Name, strlen(dr->Name)); - Mmsg(mdb->cmd, "SELECT DeviceId,Name FROM Device WHERE Name='%s'", esc); - Dmsg1(200, "selectdevice: %s\n", mdb->cmd); - - if (QUERY_DB(jcr, mdb, mdb->cmd)) { - num_rows = sql_num_rows(mdb); - if (num_rows > 0) { - Mmsg1(&mdb->errmsg, _("Device record %s already exists\n"), dr->Name); - sql_free_result(mdb); - db_unlock(mdb); + bdb_lock(); + bdb_escape_string(jcr, esc, dr->Name, strlen(dr->Name)); + Mmsg(cmd, "SELECT DeviceId,Name FROM Device WHERE Name='%s'", esc); + Dmsg1(200, "selectdevice: %s\n", cmd); + + if (QueryDB(jcr, cmd)) { + if (sql_num_rows() > 0) { + Mmsg1(&errmsg, _("Device record %s already exists\n"), dr->Name); + sql_free_result(); + bdb_unlock(); return false; } - sql_free_result(mdb); + sql_free_result(); } /* Must create it */ - Mmsg(mdb->cmd, + Mmsg(cmd, "INSERT INTO Device (Name,MediaTypeId,StorageId) VALUES ('%s',%s,%s)", esc, edit_uint64(dr->MediaTypeId, ed1), edit_int64(dr->StorageId, ed2)); - Dmsg1(200, "Create Device: %s\n", mdb->cmd); - dr->DeviceId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("Device")); - if (dr->DeviceId == 0) { - Mmsg2(&mdb->errmsg, _("Create db Device record %s failed: ERR=%s\n"), - mdb->cmd, sql_strerror(mdb)); + Dmsg1(200, "Create Device: %s\n", cmd); + if ((dr->DeviceId = sql_insert_autokey_record(cmd, NT_("Device"))) == 0) { + Mmsg2(&errmsg, _("Create db Device record %s failed: ERR=%s\n"), + cmd, sql_strerror()); ok = false; } else { ok = true; } - db_unlock(mdb); + bdb_unlock(); return ok; } @@ -273,59 +258,56 @@ db_create_device_record(JCR *jcr, B_DB *mdb, DEVICE_DBR *dr) * Returns: false on failure * true on success with id in sr->StorageId */ -bool db_create_storage_record(JCR *jcr, B_DB *mdb, STORAGE_DBR *sr) +bool BDB::bdb_create_storage_record(JCR *jcr, STORAGE_DBR *sr) { SQL_ROW row; bool ok; - int num_rows; char esc[MAX_ESCAPE_NAME_LENGTH]; - db_lock(mdb); - mdb->db_escape_string(jcr, esc, sr->Name, strlen(sr->Name)); - Mmsg(mdb->cmd, "SELECT StorageId,AutoChanger FROM Storage WHERE Name='%s'",esc); + bdb_lock(); + bdb_escape_string(jcr, esc, sr->Name, strlen(sr->Name)); + Mmsg(cmd, "SELECT StorageId,AutoChanger FROM Storage WHERE Name='%s'",esc); sr->StorageId = 0; sr->created = false; /* Check if it already exists */ - if (QUERY_DB(jcr, mdb, mdb->cmd)) { - num_rows = sql_num_rows(mdb); + if (QueryDB(jcr, cmd)) { /* If more than one, report error, but return first row */ - if (num_rows > 1) { - Mmsg1(&mdb->errmsg, _("More than one Storage record!: %d\n"), num_rows); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); + if (sql_num_rows() > 1) { + Mmsg1(&errmsg, _("More than one Storage record!: %d\n"), sql_num_rows()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); } - if (num_rows >= 1) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(&mdb->errmsg, _("error fetching Storage row: %s\n"), sql_strerror(mdb)); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); - sql_free_result(mdb); - db_unlock(mdb); + if (sql_num_rows() >= 1) { + if ((row = sql_fetch_row()) == NULL) { + Mmsg1(&errmsg, _("error fetching Storage row: %s\n"), sql_strerror()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); + sql_free_result(); + bdb_unlock(); return false; } sr->StorageId = str_to_int64(row[0]); sr->AutoChanger = atoi(row[1]); /* bool */ - sql_free_result(mdb); - db_unlock(mdb); + sql_free_result(); + bdb_unlock(); return true; } - sql_free_result(mdb); + sql_free_result(); } /* Must create it */ - Mmsg(mdb->cmd, "INSERT INTO Storage (Name,AutoChanger)" + Mmsg(cmd, "INSERT INTO Storage (Name,AutoChanger)" " VALUES ('%s',%d)", esc, sr->AutoChanger); - sr->StorageId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("Storage")); - if (sr->StorageId == 0) { - Mmsg2(&mdb->errmsg, _("Create DB Storage record %s failed. ERR=%s\n"), - mdb->cmd, sql_strerror(mdb)); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); + if ((sr->StorageId = sql_insert_autokey_record(cmd, NT_("Storage"))) == 0) { + Mmsg2(&errmsg, _("Create DB Storage record %s failed. ERR=%s\n"), + cmd, sql_strerror()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); ok = false; } else { sr->created = true; ok = true; } - db_unlock(mdb); + bdb_unlock(); return ok; } @@ -335,46 +317,42 @@ bool db_create_storage_record(JCR *jcr, B_DB *mdb, STORAGE_DBR *sr) * Returns: false on failure * true on success */ -bool -db_create_mediatype_record(JCR *jcr, B_DB *mdb, MEDIATYPE_DBR *mr) +bool BDB::bdb_create_mediatype_record(JCR *jcr, MEDIATYPE_DBR *mr) { bool stat; - int num_rows; char esc[MAX_ESCAPE_NAME_LENGTH]; Dmsg0(200, "In create mediatype\n"); - db_lock(mdb); - mdb->db_escape_string(jcr, esc, mr->MediaType, strlen(mr->MediaType)); - Mmsg(mdb->cmd, "SELECT MediaTypeId,MediaType FROM MediaType WHERE MediaType='%s'", esc); - Dmsg1(200, "selectmediatype: %s\n", mdb->cmd); - - if (QUERY_DB(jcr, mdb, mdb->cmd)) { - num_rows = sql_num_rows(mdb); - if (num_rows > 0) { - Mmsg1(&mdb->errmsg, _("mediatype record %s already exists\n"), mr->MediaType); - sql_free_result(mdb); - db_unlock(mdb); + bdb_lock(); + bdb_escape_string(jcr, esc, mr->MediaType, strlen(mr->MediaType)); + Mmsg(cmd, "SELECT MediaTypeId,MediaType FROM MediaType WHERE MediaType='%s'", esc); + Dmsg1(200, "selectmediatype: %s\n", cmd); + + if (QueryDB(jcr, cmd)) { + if (sql_num_rows() > 0) { + Mmsg1(&errmsg, _("mediatype record %s already exists\n"), mr->MediaType); + sql_free_result(); + bdb_unlock(); return false; } - sql_free_result(mdb); + sql_free_result(); } /* Must create it */ - Mmsg(mdb->cmd, + Mmsg(cmd, "INSERT INTO MediaType (MediaType,ReadOnly) " "VALUES ('%s',%d)", mr->MediaType, mr->ReadOnly); - Dmsg1(200, "Create mediatype: %s\n", mdb->cmd); - mr->MediaTypeId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("MediaType")); - if (mr->MediaTypeId == 0) { - Mmsg2(&mdb->errmsg, _("Create db mediatype record %s failed: ERR=%s\n"), - mdb->cmd, sql_strerror(mdb)); + Dmsg1(200, "Create mediatype: %s\n", cmd); + if ((mr->MediaTypeId = sql_insert_autokey_record(cmd, NT_("MediaType"))) == 0) { + Mmsg2(&errmsg, _("Create db mediatype record %s failed: ERR=%s\n"), + cmd, sql_strerror()); stat = false; } else { stat = true; } - db_unlock(mdb); + bdb_unlock(); return stat; } @@ -385,40 +363,37 @@ db_create_mediatype_record(JCR *jcr, B_DB *mdb, MEDIATYPE_DBR *mr) * Returns: 0 on failure * 1 on success */ -int -db_create_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) +int BDB::bdb_create_media_record(JCR *jcr, MEDIA_DBR *mr) { int stat; char ed1[50], ed2[50], ed3[50], ed4[50], ed5[50], ed6[50], ed7[50], ed8[50]; char ed9[50], ed10[50], ed11[50], ed12[50]; struct tm tm; - int num_rows; char esc_name[MAX_ESCAPE_NAME_LENGTH]; char esc_mtype[MAX_ESCAPE_NAME_LENGTH]; char esc_status[MAX_ESCAPE_NAME_LENGTH]; - db_lock(mdb); - mdb->db_escape_string(jcr, esc_name, mr->VolumeName, strlen(mr->VolumeName)); - mdb->db_escape_string(jcr, esc_mtype, mr->MediaType, strlen(mr->MediaType)); - mdb->db_escape_string(jcr, esc_status, mr->VolStatus, strlen(mr->VolStatus)); + bdb_lock(); + bdb_escape_string(jcr, esc_name, mr->VolumeName, strlen(mr->VolumeName)); + bdb_escape_string(jcr, esc_mtype, mr->MediaType, strlen(mr->MediaType)); + bdb_escape_string(jcr, esc_status, mr->VolStatus, strlen(mr->VolStatus)); - Mmsg(mdb->cmd, "SELECT MediaId FROM Media WHERE VolumeName='%s'", esc_name); - Dmsg1(500, "selectpool: %s\n", mdb->cmd); + Mmsg(cmd, "SELECT MediaId FROM Media WHERE VolumeName='%s'", esc_name); + Dmsg1(500, "selectpool: %s\n", cmd); - if (QUERY_DB(jcr, mdb, mdb->cmd)) { - num_rows = sql_num_rows(mdb); - if (num_rows > 0) { - Mmsg1(&mdb->errmsg, _("Volume \"%s\" already exists.\n"), mr->VolumeName); - sql_free_result(mdb); - db_unlock(mdb); + if (QueryDB(jcr, cmd)) { + if (sql_num_rows() > 0) { + Mmsg1(&errmsg, _("Volume \"%s\" already exists.\n"), mr->VolumeName); + sql_free_result(); + bdb_unlock(); return 0; } - sql_free_result(mdb); + sql_free_result(); } /* Must create it */ - Mmsg(mdb->cmd, + Mmsg(cmd, "INSERT INTO Media (VolumeName,MediaType,MediaTypeId,PoolId,MaxVolBytes," "VolCapacityBytes,Recycle,VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles," "VolStatus,Slot,VolBytes,InChanger,VolReadTime,VolWriteTime,VolParts," @@ -441,7 +416,7 @@ db_create_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) mr->InChanger, edit_int64(mr->VolReadTime, ed6), edit_int64(mr->VolWriteTime, ed7), - mr->VolParts, + mr->VolType, /* formerly VolParts */ mr->LabelType, edit_int64(mr->StorageId, ed8), edit_int64(mr->DeviceId, ed9), @@ -452,11 +427,10 @@ db_create_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) ); - Dmsg1(500, "Create Volume: %s\n", mdb->cmd); - mr->MediaId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("Media")); - if (mr->MediaId == 0) { - Mmsg2(&mdb->errmsg, _("Create DB Media record %s failed. ERR=%s\n"), - mdb->cmd, sql_strerror(mdb)); + Dmsg1(500, "Create Volume: %s\n", cmd); + if ((mr->MediaId = sql_insert_autokey_record(cmd, NT_("Media"))) == 0) { + Mmsg2(&errmsg, _("Create DB Media record %s failed. ERR=%s\n"), + cmd, sql_strerror()); stat = 0; } else { stat = 1; @@ -467,18 +441,18 @@ db_create_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) } (void)localtime_r(&mr->LabelDate, &tm); strftime(dt, sizeof(dt), "%Y-%m-%d %H:%M:%S", &tm); - Mmsg(mdb->cmd, "UPDATE Media SET LabelDate='%s' " + Mmsg(cmd, "UPDATE Media SET LabelDate='%s' " "WHERE MediaId=%d", dt, mr->MediaId); - stat = UPDATE_DB(jcr, mdb, mdb->cmd); + stat = UpdateDB(jcr, cmd); } /* * Make sure that if InChanger is non-zero any other identical slot * has InChanger zero. */ - db_make_inchanger_unique(jcr, mdb, mr); + db_make_inchanger_unique(jcr, this, mr); } - db_unlock(mdb); + bdb_unlock(); return stat; } @@ -487,34 +461,32 @@ db_create_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) * Returns: 0 on failure * 1 on success with id in cr->ClientId */ -int db_create_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cr) +int BDB::bdb_create_client_record(JCR *jcr, CLIENT_DBR *cr) { SQL_ROW row; int stat; char ed1[50], ed2[50]; - int num_rows; char esc_name[MAX_ESCAPE_NAME_LENGTH]; char esc_uname[MAX_ESCAPE_NAME_LENGTH]; - db_lock(mdb); - mdb->db_escape_string(jcr, esc_name, cr->Name, strlen(cr->Name)); - mdb->db_escape_string(jcr, esc_uname, cr->Uname, strlen(cr->Uname)); - Mmsg(mdb->cmd, "SELECT ClientId,Uname FROM Client WHERE Name='%s'",esc_name); + bdb_lock(); + bdb_escape_string(jcr, esc_name, cr->Name, strlen(cr->Name)); + bdb_escape_string(jcr, esc_uname, cr->Uname, strlen(cr->Uname)); + Mmsg(cmd, "SELECT ClientId,Uname FROM Client WHERE Name='%s'",esc_name); cr->ClientId = 0; - if (QUERY_DB(jcr, mdb, mdb->cmd)) { - num_rows = sql_num_rows(mdb); + if (QueryDB(jcr, cmd)) { /* If more than one, report error, but return first row */ - if (num_rows > 1) { - Mmsg1(&mdb->errmsg, _("More than one Client!: %d\n"), num_rows); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); + if (sql_num_rows() > 1) { + Mmsg1(&errmsg, _("More than one Client!: %d\n"), sql_num_rows()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); } - if (num_rows >= 1) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(&mdb->errmsg, _("error fetching Client row: %s\n"), sql_strerror(mdb)); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); - sql_free_result(mdb); - db_unlock(mdb); + if (sql_num_rows() >= 1) { + if ((row = sql_fetch_row()) == NULL) { + Mmsg1(&errmsg, _("error fetching Client row: %s\n"), sql_strerror()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); + sql_free_result(); + bdb_unlock(); return 0; } cr->ClientId = str_to_int64(row[0]); @@ -523,67 +495,64 @@ int db_create_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cr) } else { cr->Uname[0] = 0; /* no name */ } - sql_free_result(mdb); - db_unlock(mdb); + sql_free_result(); + bdb_unlock(); return 1; } - sql_free_result(mdb); + sql_free_result(); } /* Must create it */ - Mmsg(mdb->cmd, "INSERT INTO Client (Name,Uname,AutoPrune," + Mmsg(cmd, "INSERT INTO Client (Name,Uname,AutoPrune," "FileRetention,JobRetention) VALUES " "('%s','%s',%d,%s,%s)", esc_name, esc_uname, cr->AutoPrune, edit_uint64(cr->FileRetention, ed1), edit_uint64(cr->JobRetention, ed2)); - cr->ClientId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("Client")); - if (cr->ClientId == 0) { - Mmsg2(&mdb->errmsg, _("Create DB Client record %s failed. ERR=%s\n"), - mdb->cmd, sql_strerror(mdb)); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); + if ((cr->ClientId = sql_insert_autokey_record(cmd, NT_("Client"))) == 0) { + Mmsg2(&errmsg, _("Create DB Client record %s failed. ERR=%s\n"), + cmd, sql_strerror()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); stat = 0; } else { stat = 1; } - db_unlock(mdb); + bdb_unlock(); return stat; } /** Create a Unique record for the Path -- no duplicates */ -int db_create_path_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) +int BDB::bdb_create_path_record(JCR *jcr, ATTR_DBR *ar) { SQL_ROW row; int stat; - int num_rows; - mdb->errmsg[0] = 0; - mdb->esc_name = check_pool_memory_size(mdb->esc_name, 2*mdb->pnl+2); - db_escape_string(jcr, mdb, mdb->esc_name, mdb->path, mdb->pnl); + errmsg[0] = 0; + esc_name = check_pool_memory_size(esc_name, 2*pnl+2); + bdb_escape_string(jcr, esc_name, path, pnl); - if (mdb->cached_path_id != 0 && mdb->cached_path_len == mdb->pnl && - strcmp(mdb->cached_path, mdb->path) == 0) { - ar->PathId = mdb->cached_path_id; + if (cached_path_id != 0 && cached_path_len == pnl && + strcmp(cached_path, path) == 0) { + ar->PathId = cached_path_id; return 1; } - Mmsg(mdb->cmd, "SELECT PathId FROM Path WHERE Path='%s'", mdb->esc_name); + Mmsg(cmd, "SELECT PathId FROM Path WHERE Path='%s'", esc_name); - if (QUERY_DB(jcr, mdb, mdb->cmd)) { - num_rows = sql_num_rows(mdb); - if (num_rows > 1) { + if (QueryDB(jcr, cmd)) { + if (sql_num_rows() > 1) { char ed1[30]; - Mmsg2(&mdb->errmsg, _("More than one Path!: %s for path: %s\n"), - edit_uint64(num_rows, ed1), mdb->path); - Jmsg(jcr, M_WARNING, 0, "%s", mdb->errmsg); + Mmsg2(&errmsg, _("More than one Path!: %s for path: %s\n"), + edit_uint64(sql_num_rows(), ed1), path); + Jmsg(jcr, M_WARNING, 0, "%s", errmsg); } /* Even if there are multiple paths, take the first one */ - if (num_rows >= 1) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(&mdb->errmsg, _("error fetching row: %s\n"), sql_strerror(mdb)); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); - sql_free_result(mdb); + if (sql_num_rows() >= 1) { + if ((row = sql_fetch_row()) == NULL) { + Mmsg1(&errmsg, _("error fetching row: %s\n"), sql_strerror()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); + sql_free_result(); ar->PathId = 0; ASSERT2(ar->PathId, "Your Path table is broken. " @@ -591,26 +560,25 @@ int db_create_path_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) return 0; } ar->PathId = str_to_int64(row[0]); - sql_free_result(mdb); + sql_free_result(); /* Cache path */ - if (ar->PathId != mdb->cached_path_id) { - mdb->cached_path_id = ar->PathId; - mdb->cached_path_len = mdb->pnl; - pm_strcpy(mdb->cached_path, mdb->path); + if (ar->PathId != cached_path_id) { + cached_path_id = ar->PathId; + cached_path_len = pnl; + pm_strcpy(cached_path, path); } ASSERT(ar->PathId); return 1; } - sql_free_result(mdb); + sql_free_result(); } - Mmsg(mdb->cmd, "INSERT INTO Path (Path) VALUES ('%s')", mdb->esc_name); + Mmsg(cmd, "INSERT INTO Path (Path) VALUES ('%s')", esc_name); - ar->PathId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("Path")); - if (ar->PathId == 0) { - Mmsg2(&mdb->errmsg, _("Create db Path record %s failed. ERR=%s\n"), - mdb->cmd, sql_strerror(mdb)); - Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg); + if ((ar->PathId = sql_insert_autokey_record(cmd, NT_("Path"))) == 0) { + Mmsg2(&errmsg, _("Create db Path record %s failed. ERR=%s\n"), + cmd, sql_strerror()); + Jmsg(jcr, M_FATAL, 0, "%s", errmsg); ar->PathId = 0; stat = 0; } else { @@ -618,10 +586,10 @@ int db_create_path_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) } /* Cache path */ - if (stat && ar->PathId != mdb->cached_path_id) { - mdb->cached_path_id = ar->PathId; - mdb->cached_path_len = mdb->pnl; - pm_strcpy(mdb->cached_path, mdb->path); + if (stat && ar->PathId != cached_path_id) { + cached_path_id = ar->PathId; + cached_path_len = pnl; + pm_strcpy(cached_path, path); } return stat; } @@ -631,36 +599,36 @@ int db_create_path_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) * Returns: 0 on failure * 1 on success with counter filled in */ -int db_create_counter_record(JCR *jcr, B_DB *mdb, COUNTER_DBR *cr) +int BDB::bdb_create_counter_record(JCR *jcr, COUNTER_DBR *cr) { char esc[MAX_ESCAPE_NAME_LENGTH]; COUNTER_DBR mcr; int stat; - db_lock(mdb); + bdb_lock(); memset(&mcr, 0, sizeof(mcr)); bstrncpy(mcr.Counter, cr->Counter, sizeof(mcr.Counter)); - if (db_get_counter_record(jcr, mdb, &mcr)) { + if (bdb_get_counter_record(jcr, &mcr)) { memcpy(cr, &mcr, sizeof(COUNTER_DBR)); - db_unlock(mdb); + bdb_unlock(); return 1; } - mdb->db_escape_string(jcr, esc, cr->Counter, strlen(cr->Counter)); + bdb_escape_string(jcr, esc, cr->Counter, strlen(cr->Counter)); /* Must create it */ - Mmsg(mdb->cmd, insert_counter_values[db_get_type_index(mdb)], + Mmsg(cmd, insert_counter_values[bdb_get_type_index()], esc, cr->MinValue, cr->MaxValue, cr->CurrentValue, cr->WrapCounter); - if (!INSERT_DB(jcr, mdb, mdb->cmd)) { - Mmsg2(&mdb->errmsg, _("Create DB Counters record %s failed. ERR=%s\n"), - mdb->cmd, sql_strerror(mdb)); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); + if (!InsertDB(jcr, cmd)) { + Mmsg2(&errmsg, _("Create DB Counters record %s failed. ERR=%s\n"), + cmd, sql_strerror()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); stat = 0; } else { stat = 1; } - db_unlock(mdb); + bdb_unlock(); return stat; } @@ -670,36 +638,34 @@ int db_create_counter_record(JCR *jcr, B_DB *mdb, COUNTER_DBR *cr) * Returns: 0 on failure * 1 on success with FileSetId in record */ -bool db_create_fileset_record(JCR *jcr, B_DB *mdb, FILESET_DBR *fsr) +bool BDB::bdb_create_fileset_record(JCR *jcr, FILESET_DBR *fsr) { SQL_ROW row; bool stat; struct tm tm; - int num_rows; char esc_fs[MAX_ESCAPE_NAME_LENGTH]; char esc_md5[MAX_ESCAPE_NAME_LENGTH]; /* TODO: Escape FileSet and MD5 */ - db_lock(mdb); + bdb_lock(); fsr->created = false; - mdb->db_escape_string(jcr, esc_fs, fsr->FileSet, strlen(fsr->FileSet)); - mdb->db_escape_string(jcr, esc_md5, fsr->MD5, strlen(fsr->MD5)); - Mmsg(mdb->cmd, "SELECT FileSetId,CreateTime FROM FileSet WHERE " + bdb_escape_string(jcr, esc_fs, fsr->FileSet, strlen(fsr->FileSet)); + bdb_escape_string(jcr, esc_md5, fsr->MD5, strlen(fsr->MD5)); + Mmsg(cmd, "SELECT FileSetId,CreateTime FROM FileSet WHERE " "FileSet='%s' AND MD5='%s'", esc_fs, esc_md5); fsr->FileSetId = 0; - if (QUERY_DB(jcr, mdb, mdb->cmd)) { - num_rows = sql_num_rows(mdb); - if (num_rows > 1) { - Mmsg1(&mdb->errmsg, _("More than one FileSet!: %d\n"), num_rows); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); + if (QueryDB(jcr, cmd)) { + if (sql_num_rows() > 1) { + Mmsg1(&errmsg, _("More than one FileSet!: %d\n"), sql_num_rows()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); } - if (num_rows >= 1) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(&mdb->errmsg, _("error fetching FileSet row: ERR=%s\n"), sql_strerror(mdb)); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); - sql_free_result(mdb); - db_unlock(mdb); + if (sql_num_rows() >= 1) { + if ((row = sql_fetch_row()) == NULL) { + Mmsg1(&errmsg, _("error fetching FileSet row: ERR=%s\n"), sql_strerror()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); + sql_free_result(); + bdb_unlock(); return false; } fsr->FileSetId = str_to_int64(row[0]); @@ -708,11 +674,11 @@ bool db_create_fileset_record(JCR *jcr, B_DB *mdb, FILESET_DBR *fsr) } else { bstrncpy(fsr->cCreateTime, row[1], sizeof(fsr->cCreateTime)); } - sql_free_result(mdb); - db_unlock(mdb); + sql_free_result(); + bdb_unlock(); return true; } - sql_free_result(mdb); + sql_free_result(); } if (fsr->CreateTime == 0 && fsr->cCreateTime[0] == 0) { @@ -722,21 +688,20 @@ bool db_create_fileset_record(JCR *jcr, B_DB *mdb, FILESET_DBR *fsr) strftime(fsr->cCreateTime, sizeof(fsr->cCreateTime), "%Y-%m-%d %H:%M:%S", &tm); /* Must create it */ - Mmsg(mdb->cmd, "INSERT INTO FileSet (FileSet,MD5,CreateTime) " + Mmsg(cmd, "INSERT INTO FileSet (FileSet,MD5,CreateTime) " "VALUES ('%s','%s','%s')", esc_fs, esc_md5, fsr->cCreateTime); - fsr->FileSetId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("FileSet")); - if (fsr->FileSetId == 0) { - Mmsg2(&mdb->errmsg, _("Create DB FileSet record %s failed. ERR=%s\n"), - mdb->cmd, sql_strerror(mdb)); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); + if ((fsr->FileSetId = sql_insert_autokey_record(cmd, NT_("FileSet"))) == 0) { + Mmsg2(&errmsg, _("Create DB FileSet record %s failed. ERR=%s\n"), + cmd, sql_strerror()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); stat = false; } else { fsr->created = true; stat = true; } - db_unlock(mdb); + bdb_unlock(); return stat; } @@ -763,39 +728,39 @@ bool db_create_fileset_record(JCR *jcr, B_DB *mdb, FILESET_DBR *fsr) /* For maintenance, we can put batch mode in hold */ static bool batch_mode_enabled = true; -void db_disable_batch_insert(bool enabled) +void bdb_disable_batch_insert(bool enabled) { batch_mode_enabled = enabled; } -/** - * All sql_batch_* functions are used to do bulk batch insert in File/Filename/Path - * tables. +/* + * All sql_batch_xx functions are used to do bulk batch + * insert in File/Filename/Path tables. * * To sum up : * - bulk load a temp table - * - insert missing filenames into filename with a single query (lock filenames + * - insert missing filenames into filename with a single query (lock filenames * - table before that to avoid possible duplicate inserts with concurrent update) * - insert missing paths into path with another single query * - then insert the join between the temp, filename and path tables into file. */ /* - * Returns true if OK - * false if failed + * Returns true if OK + * false if failed */ -bool db_write_batch_file_records(JCR *jcr) +bool bdb_write_batch_file_records(JCR *jcr) { - bool retval = false; + bool retval = false; int JobStatus = jcr->JobStatus; if (!jcr->batch_started) { /* no files to backup ? */ - Dmsg0(50,"db_create_file_record : no files\n"); + Dmsg0(50,"db_write_batch_file_records: no files\n"); return true; } if (job_canceled(jcr)) { - goto bail_out; + goto bail_out; } jcr->JobStatus = JS_AttrInserting; @@ -806,37 +771,35 @@ bool db_write_batch_file_records(JCR *jcr) bmicrosleep(10, 0); if (job_canceled(jcr)) { - goto bail_out; + goto bail_out; } } - Dmsg1(50,"db_create_file_record changes=%u\n",jcr->db_batch->changes); + Dmsg1(50,"db_write_batch_file_records changes=%u\n",jcr->db_batch->changes); - if (!sql_batch_end(jcr, jcr->db_batch, NULL)) { + if (!jcr->db_batch->sql_batch_end(jcr, NULL)) { Jmsg1(jcr, M_FATAL, 0, "Batch end %s\n", jcr->db_batch->errmsg); - goto bail_out; + goto bail_out; } if (job_canceled(jcr)) { - goto bail_out; + goto bail_out; } - /* - * We have to lock tables - */ - if (!db_sql_query(jcr->db_batch, batch_lock_path_query[db_get_type_index(jcr->db_batch)], NULL, NULL)) { + /* We have to lock tables */ + if (!jcr->db_batch->bdb_sql_query(batch_lock_path_query[jcr->db_batch->bdb_get_type_index()], NULL, NULL)) { Jmsg1(jcr, M_FATAL, 0, "Lock Path table %s\n", jcr->db_batch->errmsg); - goto bail_out; + goto bail_out; } - if (!db_sql_query(jcr->db_batch, batch_fill_path_query[db_get_type_index(jcr->db_batch)], NULL, NULL)) { + if (!jcr->db_batch->bdb_sql_query(batch_fill_path_query[jcr->db_batch->bdb_get_type_index()], NULL, NULL)) { Jmsg1(jcr, M_FATAL, 0, "Fill Path table %s\n",jcr->db_batch->errmsg); - db_sql_query(jcr->db_batch, batch_unlock_tables_query[db_get_type_index(jcr->db_batch)], NULL, NULL); - goto bail_out; + jcr->db_batch->bdb_sql_query(batch_unlock_tables_query[jcr->db_batch->bdb_get_type_index()], NULL, NULL); + goto bail_out; } - if (!db_sql_query(jcr->db_batch, batch_unlock_tables_query[db_get_type_index(jcr->db_batch)], NULL, NULL)) { + if (!jcr->db_batch->bdb_sql_query(batch_unlock_tables_query[jcr->db_batch->bdb_get_type_index()], NULL, NULL)) { Jmsg1(jcr, M_FATAL, 0, "Unlock Path table %s\n", jcr->db_batch->errmsg); - goto bail_out; + goto bail_out; } /* @@ -846,7 +809,7 @@ bool db_write_batch_file_records(JCR *jcr) Jmsg1(jcr, M_FATAL, 0, "Lock Filename table %s\n", jcr->db_batch->errmsg); goto bail_out; } - + if (!db_sql_query(jcr->db_batch, batch_fill_filename_query[db_get_type_index(jcr->db_batch)], NULL, NULL)) { Jmsg1(jcr,M_FATAL,0,"Fill Filename table %s\n",jcr->db_batch->errmsg); db_sql_query(jcr->db_batch, batch_unlock_tables_query[db_get_type_index(jcr->db_batch)], NULL, NULL); @@ -857,8 +820,8 @@ bool db_write_batch_file_records(JCR *jcr) Jmsg1(jcr, M_FATAL, 0, "Unlock Filename table %s\n", jcr->db_batch->errmsg); goto bail_out; } - - if (!db_sql_query(jcr->db_batch, + + if (!db_sql_query(jcr->db_batch, "INSERT INTO File (FileIndex, JobId, PathId, FilenameId, LStat, MD5, DeltaSeq) " "SELECT batch.FileIndex, batch.JobId, Path.PathId, " "Filename.FilenameId,batch.LStat, batch.MD5, batch.DeltaSeq " @@ -868,21 +831,21 @@ bool db_write_batch_file_records(JCR *jcr) NULL, NULL)) { Jmsg1(jcr, M_FATAL, 0, "Fill File table %s\n", jcr->db_batch->errmsg); - goto bail_out; + goto bail_out; } - jcr->JobStatus = JobStatus; /* reset entry status */ - retval = true; - -bail_out: - db_sql_query(jcr->db_batch, "DROP TABLE batch", NULL,NULL); + jcr->JobStatus = JobStatus; /* reset entry status */ + retval = true; + +bail_out: + jcr->db_batch->bdb_sql_query("DROP TABLE batch", NULL,NULL); jcr->batch_started = false; - return retval; + return retval; } /** - * Create File record in B_DB + * Create File record in BDB * * In order to reduce database size, we store the File attributes, * the FileName, and the Path separately. In principle, there @@ -892,29 +855,28 @@ bail_out: * * Note: all routines that call this expect to be able to call * db_strerror(mdb) to get the error message, so the error message - * MUST be edited into mdb->errmsg before returning an error status. + * MUST be edited into errmsg before returning an error status. */ -bool db_create_batch_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) +bool BDB::bdb_create_batch_file_attributes_record(JCR *jcr, ATTR_DBR *ar) { ASSERT(ar->FileType != FT_BASE); - Dmsg1(dbglevel, "Fname=%s\n", ar->fname); Dmsg0(dbglevel, "put_file_into_catalog\n"); if (jcr->batch_started && jcr->db_batch->changes > 500000) { - db_write_batch_file_records(jcr); + bdb_write_batch_file_records(jcr); jcr->db_batch->changes = 0; } /* Open the dedicated connexion */ if (!jcr->batch_started) { - if (!db_open_batch_connexion(jcr, mdb)) { + if (!bdb_open_batch_connexion(jcr)) { return false; /* error already printed */ } - if (!sql_batch_start(jcr, jcr->db_batch)) { - Mmsg1(&mdb->errmsg, + if (!jcr->db_batch->sql_batch_start(jcr)) { + Mmsg1(&errmsg, "Can't start batch mode: ERR=%s", db_strerror(jcr->db_batch)); - Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg); + Jmsg(jcr, M_FATAL, 0, "%s", errmsg); return false; } jcr->batch_started = true; @@ -922,11 +884,11 @@ bool db_create_batch_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) split_path_and_file(jcr, jcr->db_batch, ar->fname); - return sql_batch_insert(jcr, jcr->db_batch, ar); + return jcr->db_batch->sql_batch_insert(jcr, ar); } /** - * Create File record in B_DB + * Create File record in BDB * * In order to reduce database size, we store the File attributes, * the FileName, and the Path separately. In principle, there @@ -934,44 +896,44 @@ bool db_create_batch_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) * how many times it occurs. This is this subroutine, we separate * the file and the path and create three database records. */ -bool db_create_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) +bool BDB::bdb_create_file_attributes_record(JCR *jcr, ATTR_DBR *ar) { - db_lock(mdb); + bdb_lock(); Dmsg1(dbglevel, "Fname=%s\n", ar->fname); Dmsg0(dbglevel, "put_file_into_catalog\n"); - split_path_and_file(jcr, mdb, ar->fname); + split_path_and_file(jcr, this, ar->fname); - if (!db_create_filename_record(jcr, mdb, ar)) { + if (!bdb_create_filename_record(jcr, ar)) { goto bail_out; } - Dmsg1(dbglevel, "db_create_filename_record: %s\n", mdb->esc_name); + Dmsg1(dbglevel, "bdb_create_filename_record: %s\n", esc_name); - if (!db_create_path_record(jcr, mdb, ar)) { + if (!bdb_create_path_record(jcr, ar)) { goto bail_out; } - Dmsg1(dbglevel, "db_create_path_record: %s\n", mdb->esc_name); + Dmsg1(dbglevel, "bdb_create_path_record: %s\n", esc_name); /* Now create master File record */ - if (!db_create_file_record(jcr, mdb, ar)) { - goto bail_out; + if (!bdb_create_file_record(jcr, ar)) { + goto bail_out; } Dmsg0(dbglevel, "db_create_file_record OK\n"); - Dmsg3(dbglevel, "CreateAttributes Path=%s File=%s FilenameId=%d\n", mdb->path, mdb->fname, ar->FilenameId); - db_unlock(mdb); + Dmsg3(dbglevel, "CreateAttributes Path=%s File=%s FilenameId=%d\n", path, fname, ar->FilenameId); + bdb_unlock(); return true; -bail_out: - db_unlock(mdb); +bail_out: + bdb_unlock(); return false; } /** * This is the master File entry containing the attributes. * The filename and path records have already been created. */ -static int db_create_file_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) +int BDB::bdb_create_file_record(JCR *jcr, ATTR_DBR *ar) { int stat; static const char *no_digest = "0"; @@ -988,17 +950,16 @@ static int db_create_file_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) } /* Must create it */ - Mmsg(mdb->cmd, + Mmsg(cmd, "INSERT INTO File (FileIndex,JobId,PathId,FilenameId," "LStat,MD5,DeltaSeq) VALUES (%u,%u,%u,%u,'%s','%s',%u)", ar->FileIndex, ar->JobId, ar->PathId, ar->FilenameId, ar->attr, digest, ar->DeltaSeq); - ar->FileId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("File")); - if (ar->FileId == 0) { - Mmsg2(&mdb->errmsg, _("Create db File record %s failed. ERR=%s"), - mdb->cmd, sql_strerror(mdb)); - Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg); + if ((ar->FileId = sql_insert_autokey_record(cmd, NT_("File"))) == 0) { + Mmsg2(&errmsg, _("Create db File record %s failed. ERR=%s"), + cmd, sql_strerror()); + Jmsg(jcr, M_FATAL, 0, "%s", errmsg); stat = 0; } else { stat = 1; @@ -1007,82 +968,82 @@ static int db_create_file_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) } /** Create a Unique record for the filename -- no duplicates */ -static int db_create_filename_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) +int BDB::bdb_create_filename_record(JCR *jcr, ATTR_DBR *ar) { SQL_ROW row; int num_rows; - mdb->errmsg[0] = 0; - mdb->esc_name = check_pool_memory_size(mdb->esc_name, 2*mdb->fnl+2); - db_escape_string(jcr, mdb, mdb->esc_name, mdb->fname, mdb->fnl); - - Mmsg(mdb->cmd, "SELECT FilenameId FROM Filename WHERE Name='%s'", mdb->esc_name); + errmsg[0] = 0; + esc_name = check_pool_memory_size(esc_name, 2*fnl+2); + bdb_escape_string(jcr, esc_name, fname, fnl); + + Mmsg(cmd, "SELECT FilenameId FROM Filename WHERE Name='%s'", esc_name); - if (QUERY_DB(jcr, mdb, mdb->cmd)) { - num_rows = sql_num_rows(mdb); + if (QueryDB(jcr, cmd)) { + num_rows = sql_num_rows(); if (num_rows > 1) { char ed1[30]; - Mmsg2(&mdb->errmsg, _("More than one Filename! %s for file: %s\n"), - edit_uint64(num_rows, ed1), mdb->fname); - Jmsg(jcr, M_WARNING, 0, "%s", mdb->errmsg); + Mmsg2(&errmsg, _("More than one Filename! %s for file: %s\n"), + edit_uint64(num_rows, ed1), fname); + Jmsg(jcr, M_WARNING, 0, "%s", errmsg); } if (num_rows >= 1) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg2(&mdb->errmsg, _("Error fetching row for file=%s: ERR=%s\n"), - mdb->fname, sql_strerror(mdb)); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); + if ((row = sql_fetch_row()) == NULL) { + Mmsg2(&errmsg, _("Error fetching row for file=%s: ERR=%s\n"), + fname, sql_strerror()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); ar->FilenameId = 0; } else { ar->FilenameId = str_to_int64(row[0]); } - sql_free_result(mdb); + sql_free_result(); return ar->FilenameId > 0; } - sql_free_result(mdb); + sql_free_result(); } - Mmsg(mdb->cmd, "INSERT INTO Filename (Name) VALUES ('%s')", mdb->esc_name); + Mmsg(cmd, "INSERT INTO Filename (Name) VALUES ('%s')", esc_name); - ar->FilenameId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("Filename")); + ar->FilenameId = sql_insert_autokey_record(cmd, NT_("Filename")); if (ar->FilenameId == 0) { - Mmsg2(&mdb->errmsg, _("Create db Filename record %s failed. ERR=%s\n"), - mdb->cmd, sql_strerror(mdb)); - Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg); + Mmsg2(&errmsg, _("Create db Filename record %s failed. ERR=%s\n"), + cmd, sql_strerror()); + Jmsg(jcr, M_FATAL, 0, "%s", errmsg); } return ar->FilenameId > 0; } -/** +/* * Create file attributes record, or base file attributes record */ -bool db_create_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) +bool BDB::bdb_create_attributes_record(JCR *jcr, ATTR_DBR *ar) { bool ret; - mdb->errmsg[0] = 0; + errmsg[0] = 0; /* * Make sure we have an acceptable attributes record. */ if (!(ar->Stream == STREAM_UNIX_ATTRIBUTES || ar->Stream == STREAM_UNIX_ATTRIBUTES_EX)) { - Mmsg1(&mdb->errmsg, _("Attempt to put non-attributes into catalog. Stream=%d\n"), + Mmsg1(&errmsg, _("Attempt to put non-attributes into catalog. Stream=%d\n"), ar->Stream); - Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg); + Jmsg(jcr, M_FATAL, 0, "%s", errmsg); return false; } if (ar->FileType != FT_BASE) { - if (mdb->batch_insert_available()) { - ret = db_create_batch_file_attributes_record(jcr, mdb, ar); + if (batch_insert_available()) { + ret = bdb_create_batch_file_attributes_record(jcr, ar); /* Error message already printed */ - } else { - ret = db_create_file_attributes_record(jcr, mdb, ar); - } + } else { + ret = bdb_create_file_attributes_record(jcr, ar); + } } else if (jcr->HasBase) { - ret = db_create_base_file_attributes_record(jcr, mdb, ar); + ret = bdb_create_base_file_attributes_record(jcr, ar); } else { - Mmsg0(&mdb->errmsg, _("Cannot Copy/Migrate job using BaseJob.\n")); - Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg); + Mmsg0(&errmsg, _("Cannot Copy/Migrate job using BaseJob.\n")); + Jmsg(jcr, M_FATAL, 0, "%s", errmsg); ret = true; /* in copy/migration what do we do ? */ } @@ -1090,29 +1051,30 @@ bool db_create_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) } /** - * Create Base File record in B_DB + * Create Base File record in BDB * */ -bool db_create_base_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) +bool BDB::bdb_create_base_file_attributes_record(JCR *jcr, ATTR_DBR *ar) { bool ret; + Dmsg1(dbglevel, "create_base_file Fname=%s\n", ar->fname); Dmsg0(dbglevel, "put_base_file_into_catalog\n"); - db_lock(mdb); - split_path_and_file(jcr, mdb, ar->fname); + bdb_lock(); + split_path_and_file(jcr, this, ar->fname); - mdb->esc_name = check_pool_memory_size(mdb->esc_name, mdb->fnl*2+1); - db_escape_string(jcr, mdb, mdb->esc_name, mdb->fname, mdb->fnl); + esc_name = check_pool_memory_size(esc_name, fnl*2+1); + bdb_escape_string(jcr, esc_name, fname, fnl); - mdb->esc_path = check_pool_memory_size(mdb->esc_path, mdb->pnl*2+1); - db_escape_string(jcr, mdb, mdb->esc_path, mdb->path, mdb->pnl); + esc_path = check_pool_memory_size(esc_path, pnl*2+1); + bdb_escape_string(jcr, esc_path, path, pnl); - Mmsg(mdb->cmd, "INSERT INTO basefile%lld (Path, Name) VALUES ('%s','%s')", - (uint64_t)jcr->JobId, mdb->esc_path, mdb->esc_name); + Mmsg(cmd, "INSERT INTO basefile%lld (Path, Name) VALUES ('%s','%s')", + (uint64_t)jcr->JobId, esc_path, esc_name); - ret = INSERT_DB(jcr, mdb, mdb->cmd); - db_unlock(mdb); + ret = InsertDB(jcr, cmd); + bdb_unlock(); return ret; } @@ -1120,28 +1082,28 @@ bool db_create_base_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) /** * Cleanup the base file temporary tables */ -static void db_cleanup_base_file(JCR *jcr, B_DB *mdb) +static void db_cleanup_base_file(JCR *jcr, BDB *mdb) { POOL_MEM buf(PM_MESSAGE); Mmsg(buf, "DROP TABLE new_basefile%lld", (uint64_t) jcr->JobId); - db_sql_query(mdb, buf.c_str(), NULL, NULL); + mdb->bdb_sql_query(buf.c_str(), NULL, NULL); Mmsg(buf, "DROP TABLE basefile%lld", (uint64_t) jcr->JobId); - db_sql_query(mdb, buf.c_str(), NULL, NULL); + mdb->bdb_sql_query(buf.c_str(), NULL, NULL); } /** * Put all base file seen in the backup to the BaseFile table * and cleanup temporary tables */ -bool db_commit_base_file_attributes_record(JCR *jcr, B_DB *mdb) +bool BDB::bdb_commit_base_file_attributes_record(JCR *jcr) { bool ret; char ed1[50]; - db_lock(mdb); + bdb_lock(); - Mmsg(mdb->cmd, + Mmsg(cmd, "INSERT INTO BaseFiles (BaseJobId, JobId, FileId, FileIndex) " "SELECT B.JobId AS BaseJobId, %s AS JobId, " "B.FileId, B.FileIndex " @@ -1150,18 +1112,18 @@ bool db_commit_base_file_attributes_record(JCR *jcr, B_DB *mdb) "AND A.Name = B.Name " "ORDER BY B.FileId", edit_uint64(jcr->JobId, ed1), ed1, ed1); - ret = db_sql_query(mdb, mdb->cmd, NULL, NULL); + ret = bdb_sql_query(cmd, NULL, NULL); /* * Display error now, because the subsequent cleanup destroys the * error message from the above query. */ if (!ret) { - Jmsg1(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db)); + Jmsg1(jcr, M_FATAL, 0, "%s", jcr->db->bdb_strerror()); } - jcr->nb_base_files_used = sql_affected_rows(mdb); - db_cleanup_base_file(jcr, mdb); + jcr->nb_base_files_used = sql_affected_rows(); + db_cleanup_base_file(jcr, this); - db_unlock(mdb); + bdb_unlock(); return ret; } @@ -1172,77 +1134,148 @@ bool db_commit_base_file_attributes_record(JCR *jcr, B_DB *mdb) * 3) Put the result in a temporary table for the end of job * */ -bool db_create_base_file_list(JCR *jcr, B_DB *mdb, char *jobids) +bool BDB::bdb_create_base_file_list(JCR *jcr, char *jobids) { POOL_MEM buf; - bool ret=false; + bool ret = false; - db_lock(mdb); + bdb_lock(); if (!*jobids) { - Mmsg(mdb->errmsg, _("ERR=JobIds are empty\n")); - goto bail_out; + Mmsg(errmsg, _("ERR=JobIds are empty\n")); + goto bail_out; } - Mmsg(mdb->cmd, create_temp_basefile[db_get_type_index(mdb)], (uint64_t) jcr->JobId); - if (!db_sql_query(mdb, mdb->cmd, NULL, NULL)) { - goto bail_out; + Mmsg(cmd, create_temp_basefile[bdb_get_type_index()], (uint64_t) jcr->JobId); + if (!bdb_sql_query(cmd, NULL, NULL)) { + goto bail_out; } - Mmsg(buf, select_recent_version[db_get_type_index(mdb)], jobids, jobids); - Mmsg(mdb->cmd, create_temp_new_basefile[db_get_type_index(mdb)], (uint64_t)jcr->JobId, buf.c_str()); + Mmsg(buf, select_recent_version[bdb_get_type_index()], jobids, jobids); + Mmsg(cmd, create_temp_new_basefile[bdb_get_type_index()], (uint64_t)jcr->JobId, buf.c_str()); - ret = db_sql_query(mdb, mdb->cmd, NULL, NULL); -bail_out: - db_unlock(mdb); + ret = bdb_sql_query(cmd, NULL, NULL); +bail_out: + bdb_unlock(); return ret; } /** - * Create Restore Object record in B_DB + * Create Restore Object record in BDB * */ -bool db_create_restore_object_record(JCR *jcr, B_DB *mdb, ROBJECT_DBR *ro) +bool BDB::bdb_create_restore_object_record(JCR *jcr, ROBJECT_DBR *ro) { bool stat; int plug_name_len; POOLMEM *esc_plug_name = get_pool_memory(PM_MESSAGE); - db_lock(mdb); + bdb_lock(); Dmsg1(dbglevel, "Oname=%s\n", ro->object_name); Dmsg0(dbglevel, "put_object_into_catalog\n"); - mdb->fnl = strlen(ro->object_name); - mdb->esc_name = check_pool_memory_size(mdb->esc_name, mdb->fnl*2+1); - db_escape_string(jcr, mdb, mdb->esc_name, ro->object_name, mdb->fnl); + fnl = strlen(ro->object_name); + esc_name = check_pool_memory_size(esc_name, fnl*2+1); + bdb_escape_string(jcr, esc_name, ro->object_name, fnl); - db_escape_object(jcr, mdb, ro->object, ro->object_len); + bdb_escape_object(jcr, ro->object, ro->object_len); plug_name_len = strlen(ro->plugin_name); esc_plug_name = check_pool_memory_size(esc_plug_name, plug_name_len*2+1); - db_escape_string(jcr, mdb, esc_plug_name, ro->plugin_name, plug_name_len); + bdb_escape_string(jcr, esc_plug_name, ro->plugin_name, plug_name_len); - Mmsg(mdb->cmd, + Mmsg(cmd, "INSERT INTO RestoreObject (ObjectName,PluginName,RestoreObject," "ObjectLength,ObjectFullLength,ObjectIndex,ObjectType," "ObjectCompression,FileIndex,JobId) " "VALUES ('%s','%s','%s',%d,%d,%d,%d,%d,%d,%u)", - mdb->esc_name, esc_plug_name, mdb->esc_obj, + esc_name, esc_plug_name, esc_obj, ro->object_len, ro->object_full_len, ro->object_index, ro->FileType, ro->object_compression, ro->FileIndex, ro->JobId); - ro->RestoreObjectId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("RestoreObject")); + ro->RestoreObjectId = sql_insert_autokey_record(cmd, NT_("RestoreObject")); if (ro->RestoreObjectId == 0) { - Mmsg2(&mdb->errmsg, _("Create db Object record %s failed. ERR=%s"), - mdb->cmd, sql_strerror(mdb)); - Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg); + Mmsg2(&errmsg, _("Create db Object record %s failed. ERR=%s"), + cmd, sql_strerror()); + Jmsg(jcr, M_FATAL, 0, "%s", errmsg); stat = false; } else { stat = true; } - db_unlock(mdb); + bdb_unlock(); free_pool_memory(esc_plug_name); return stat; } +bool BDB::bdb_create_snapshot_record(JCR *jcr, SNAPSHOT_DBR *snap) +{ + bool status = false; + char esc_name[MAX_ESCAPE_NAME_LENGTH]; + POOLMEM *esc_vol = get_pool_memory(PM_MESSAGE); + POOLMEM *esc_dev = get_pool_memory(PM_MESSAGE); + POOLMEM *esc_type = get_pool_memory(PM_MESSAGE); + POOLMEM *esc_client = get_pool_memory(PM_MESSAGE); + POOLMEM *esc_fs = get_pool_memory(PM_MESSAGE); + char esc_comment[MAX_ESCAPE_NAME_LENGTH]; + char dt[MAX_TIME_LENGTH], ed1[50], ed2[50]; + time_t stime; + struct tm tm; + + bdb_lock(); + + esc_vol = check_pool_memory_size(esc_vol, strlen(snap->Volume) * 2 + 1); + bdb_escape_string(jcr, esc_vol, snap->Volume, strlen(snap->Volume)); + + esc_dev = check_pool_memory_size(esc_dev, strlen(snap->Device) * 2 + 1); + bdb_escape_string(jcr, esc_dev, snap->Device, strlen(snap->Device)); + + esc_type = check_pool_memory_size(esc_type, strlen(snap->Type) * 2 + 1); + bdb_escape_string(jcr, esc_type, snap->Type, strlen(snap->Type)); + + bdb_escape_string(jcr, esc_comment, snap->Comment, strlen(snap->Comment)); + + if (*snap->Client) { + bdb_escape_string(jcr, esc_name, snap->Client, strlen(snap->Client)); + Mmsg(esc_client, "(SELECT ClientId FROM Client WHERE Name='%s')", esc_name); + + } else { + Mmsg(esc_client, "%d", snap->ClientId); + } + + if (*snap->FileSet) { + bdb_escape_string(jcr, esc_name, snap->FileSet, strlen(snap->FileSet)); + Mmsg(esc_fs, "(SELECT FileSetId FROM FileSet WHERE FileSet='%s' ORDER BY CreateTime DESC LIMIT 1)", esc_name); + + } else { + Mmsg(esc_fs, "%d", snap->FileSetId); + } + + bdb_escape_string(jcr, esc_name, snap->Name, strlen(snap->Name)); + + stime = snap->CreateTDate; + (void)localtime_r(&stime, &tm); + strftime(dt, sizeof(dt), "%Y-%m-%d %H:%M:%S", &tm); + + Mmsg(cmd, "INSERT INTO Snapshot " + "(Name, JobId, CreateTDate, CreateDate, ClientId, FileSetId, Volume, Device, Type, Retention, Comment) " + "VALUES ('%s', %s, %d, '%s', %s, %s, '%s', '%s', '%s', %s, '%s')", + esc_name, edit_uint64(snap->JobId, ed2), stime, dt, esc_client, esc_fs, esc_vol, + esc_dev, esc_type, edit_int64(snap->Retention, ed1), esc_comment); + + if (bdb_sql_query(cmd, NULL, NULL)) { + snap->SnapshotId = sql_insert_autokey_record(cmd, NT_("Snapshot")); + status = true; + } + + bdb_unlock(); + + free_pool_memory(esc_vol); + free_pool_memory(esc_dev); + free_pool_memory(esc_type); + free_pool_memory(esc_client); + free_pool_memory(esc_fs); + + return status; +} + #endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL */ diff --git a/bacula/src/cats/sql_delete.c b/bacula/src/cats/sql_delete.c index 33bd3edcd1..7a6faa8218 100644 --- a/bacula/src/cats/sql_delete.c +++ b/bacula/src/cats/sql_delete.c @@ -1,33 +1,34 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula Catalog Database Delete record interface routines * - * Written by Kern Sibbald, December 2000 + * Written by Kern Sibbald, December 2000-2014 * */ -#include "bacula.h" +#include "bacula.h" #if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL - -#include "cats.h" -#include "bdb_priv.h" -#include "sql_glue.h" - +#include "cats.h" + /* ----------------------------------------------------------------------- * * Generic Routines (or almost generic) @@ -44,57 +45,54 @@ * PoolId = number of Pools deleted (should be 1) * NumVols = number of Media records deleted */ -int -db_delete_pool_record(JCR *jcr, B_DB *mdb, POOL_DBR *pr) +int BDB::bdb_delete_pool_record(JCR *jcr, POOL_DBR *pr) { SQL_ROW row; - int num_rows; char esc[MAX_ESCAPE_NAME_LENGTH]; - db_lock(mdb); - mdb->db_escape_string(jcr, esc, pr->Name, strlen(pr->Name)); - Mmsg(mdb->cmd, "SELECT PoolId FROM Pool WHERE Name='%s'", esc); - Dmsg1(10, "selectpool: %s\n", mdb->cmd); + bdb_lock(); + bdb_escape_string(jcr, esc, pr->Name, strlen(pr->Name)); + Mmsg(cmd, "SELECT PoolId FROM Pool WHERE Name='%s'", esc); + Dmsg1(10, "selectpool: %s\n", cmd); pr->PoolId = pr->NumVols = 0; - if (QUERY_DB(jcr, mdb, mdb->cmd)) { - - num_rows = sql_num_rows(mdb); - if (num_rows == 0) { - Mmsg(mdb->errmsg, _("No pool record %s exists\n"), pr->Name); - sql_free_result(mdb); - db_unlock(mdb); + if (QueryDB(jcr, cmd)) { + int nrows = sql_num_rows(); + if (nrows == 0) { + Mmsg(errmsg, _("No pool record %s exists\n"), pr->Name); + sql_free_result(); + bdb_unlock(); return 0; - } else if (num_rows != 1) { - Mmsg(mdb->errmsg, _("Expecting one pool record, got %d\n"), num_rows); - sql_free_result(mdb); - db_unlock(mdb); + } else if (nrows != 1) { + Mmsg(errmsg, _("Expecting one pool record, got %d\n"), nrows); + sql_free_result(); + bdb_unlock(); return 0; } - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(&mdb->errmsg, _("Error fetching row %s\n"), sql_strerror(mdb)); - db_unlock(mdb); + if ((row = sql_fetch_row()) == NULL) { + Mmsg1(&errmsg, _("Error fetching row %s\n"), sql_strerror()); + bdb_unlock(); return 0; } pr->PoolId = str_to_int64(row[0]); - sql_free_result(mdb); + sql_free_result(); } /* Delete Media owned by this pool */ - Mmsg(mdb->cmd, + Mmsg(cmd, "DELETE FROM Media WHERE Media.PoolId = %d", pr->PoolId); - pr->NumVols = DELETE_DB(jcr, mdb, mdb->cmd); + pr->NumVols = DeleteDB(jcr, cmd); Dmsg1(200, "Deleted %d Media records\n", pr->NumVols); /* Delete Pool */ - Mmsg(mdb->cmd, + Mmsg(cmd, "DELETE FROM Pool WHERE Pool.PoolId = %d", pr->PoolId); - pr->PoolId = DELETE_DB(jcr, mdb, mdb->cmd); + pr->PoolId = DeleteDB(jcr, cmd); Dmsg1(200, "Deleted %d Pool records\n", pr->PoolId); - db_unlock(mdb); + bdb_unlock(); return 1; } @@ -141,7 +139,7 @@ static int delete_handler(void *ctx, int num_fields, char **row) * We call it from relabel and delete volume=, both ensure * that the volume is properly purged. */ -static int do_media_purge(B_DB *mdb, MEDIA_DBR *mr) +static int do_media_purge(BDB *mdb, MEDIA_DBR *mr) { POOLMEM *query = get_pool_memory(PM_MESSAGE); struct s_del_ctx del; @@ -160,16 +158,16 @@ static int do_media_purge(B_DB *mdb, MEDIA_DBR *mr) del.max_ids = MAX_DEL_LIST_LEN; } del.JobId = (JobId_t *)malloc(sizeof(JobId_t) * del.max_ids); - db_sql_query(mdb, mdb->cmd, delete_handler, (void *)&del); + mdb->bdb_sql_query(mdb->cmd, delete_handler, (void *)&del); for (i=0; i < del.num_ids; i++) { Dmsg1(400, "Delete JobId=%d\n", del.JobId[i]); Mmsg(query, "DELETE FROM Job WHERE JobId=%s", edit_int64(del.JobId[i], ed1)); - db_sql_query(mdb, query, NULL, (void *)NULL); + mdb->bdb_sql_query(query, NULL, (void *)NULL); Mmsg(query, "DELETE FROM File WHERE JobId=%s", edit_int64(del.JobId[i], ed1)); - db_sql_query(mdb, query, NULL, (void *)NULL); + mdb->bdb_sql_query(query, NULL, (void *)NULL); Mmsg(query, "DELETE FROM JobMedia WHERE JobId=%s", edit_int64(del.JobId[i], ed1)); - db_sql_query(mdb, query, NULL, (void *)NULL); + mdb->bdb_sql_query(query, NULL, (void *)NULL); } free(del.JobId); free_pool_memory(query); @@ -179,22 +177,22 @@ static int do_media_purge(B_DB *mdb, MEDIA_DBR *mr) /* Delete Media record and all records that * are associated with it. */ -int db_delete_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) +int BDB::bdb_delete_media_record(JCR *jcr, MEDIA_DBR *mr) { - db_lock(mdb); - if (mr->MediaId == 0 && !db_get_media_record(jcr, mdb, mr)) { - db_unlock(mdb); + bdb_lock(); + if (mr->MediaId == 0 && !bdb_get_media_record(jcr, mr)) { + bdb_unlock(); return 0; } /* Do purge if not already purged */ if (strcmp(mr->VolStatus, "Purged") != 0) { /* Delete associated records */ - do_media_purge(mdb, mr); + do_media_purge(this, mr); } - Mmsg(mdb->cmd, "DELETE FROM Media WHERE MediaId=%d", mr->MediaId); - db_sql_query(mdb, mdb->cmd, NULL, (void *)NULL); - db_unlock(mdb); + Mmsg(cmd, "DELETE FROM Media WHERE MediaId=%d", mr->MediaId); + bdb_sql_query(cmd, NULL, (void *)NULL); + bdb_unlock(); return 1; } @@ -204,26 +202,40 @@ int db_delete_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) * media record itself. But the media status * is changed to "Purged". */ -int db_purge_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) +int BDB::bdb_purge_media_record(JCR *jcr, MEDIA_DBR *mr) { - db_lock(mdb); - if (mr->MediaId == 0 && !db_get_media_record(jcr, mdb, mr)) { - db_unlock(mdb); + bdb_lock(); + if (mr->MediaId == 0 && !bdb_get_media_record(jcr, mr)) { + bdb_unlock(); return 0; } /* Delete associated records */ - do_media_purge(mdb, mr); /* Note, always purge */ + do_media_purge(this, mr); /* Note, always purge */ /* Mark Volume as purged */ strcpy(mr->VolStatus, "Purged"); - if (!db_update_media_record(jcr, mdb, mr)) { - db_unlock(mdb); + if (!bdb_update_media_record(jcr, mr)) { + bdb_unlock(); return 0; } - db_unlock(mdb); + bdb_unlock(); return 1; } +/* Delete Snapshot record */ +int BDB::bdb_delete_snapshot_record(JCR *jcr, SNAPSHOT_DBR *sr) +{ + bdb_lock(); + if (sr->SnapshotId == 0 && !bdb_get_snapshot_record(jcr, sr)) { + bdb_unlock(); + return 0; + } + + Mmsg(cmd, "DELETE FROM Snapshot WHERE SnapshotId=%d", sr->SnapshotId); + bdb_sql_query(cmd, NULL, (void *)NULL); + bdb_unlock(); + return 1; +} #endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL */ diff --git a/bacula/src/cats/sql_find.c b/bacula/src/cats/sql_find.c index ba9c75dbcb..7c83b2e663 100644 --- a/bacula/src/cats/sql_find.c +++ b/bacula/src/cats/sql_find.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula Catalog Database Find record interface routines @@ -24,13 +28,11 @@ * */ -#include "bacula.h" +#include "bacula.h" #if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL #include "cats.h" -#include "bdb_priv.h" -#include "sql_glue.h" /* ----------------------------------------------------------------------- * @@ -49,22 +51,21 @@ * Returns: 0 on failure * 1 on success, jr is unchanged, but stime and job are set */ -bool -db_find_job_start_time(JCR *jcr, B_DB *mdb, JOB_DBR *jr, POOLMEM **stime, char *job) +bool BDB::bdb_find_job_start_time(JCR *jcr, JOB_DBR *jr, POOLMEM **stime, char *job) { SQL_ROW row; char ed1[50], ed2[50]; char esc_name[MAX_ESCAPE_NAME_LENGTH]; - db_lock(mdb); - mdb->db_escape_string(jcr, esc_name, jr->Name, strlen(jr->Name)); + bdb_lock(); + bdb_escape_string(jcr, esc_name, jr->Name, strlen(jr->Name)); pm_strcpy(stime, "0000-00-00 00:00:00"); /* default */ job[0] = 0; /* If no Id given, we must find corresponding job */ if (jr->JobId == 0) { /* Differential is since last Full backup */ - Mmsg(mdb->cmd, + Mmsg(cmd, "SELECT StartTime, Job FROM Job WHERE JobStatus IN ('T','W') AND Type='%c' AND " "Level='%c' AND Name='%s' AND ClientId=%s AND FileSetId=%s " "ORDER BY StartTime DESC LIMIT 1", @@ -82,58 +83,58 @@ db_find_job_start_time(JCR *jcr, B_DB *mdb, JOB_DBR *jr, POOLMEM **stime, char * * then we do a second look to find the most recent * backup */ - if (!QUERY_DB(jcr, mdb, mdb->cmd)) { - Mmsg2(&mdb->errmsg, _("Query error for start time request: ERR=%s\nCMD=%s\n"), - sql_strerror(mdb), mdb->cmd); + if (!QueryDB(jcr, cmd)) { + Mmsg2(&errmsg, _("Query error for start time request: ERR=%s\nCMD=%s\n"), + sql_strerror(), cmd); goto bail_out; } - if ((row = sql_fetch_row(mdb)) == NULL) { - sql_free_result(mdb); - Mmsg(mdb->errmsg, _("No prior Full backup Job record found.\n")); + if ((row = sql_fetch_row()) == NULL) { + sql_free_result(); + Mmsg(errmsg, _("No prior Full backup Job record found.\n")); goto bail_out; } - sql_free_result(mdb); + sql_free_result(); /* Now edit SQL command for Incremental Job */ - Mmsg(mdb->cmd, + Mmsg(cmd, "SELECT StartTime, Job FROM Job WHERE JobStatus IN ('T','W') AND Type='%c' AND " "Level IN ('%c','%c','%c') AND Name='%s' AND ClientId=%s " "AND FileSetId=%s ORDER BY StartTime DESC LIMIT 1", jr->JobType, L_INCREMENTAL, L_DIFFERENTIAL, L_FULL, esc_name, edit_int64(jr->ClientId, ed1), edit_int64(jr->FileSetId, ed2)); } else { - Mmsg1(mdb->errmsg, _("Unknown level=%d\n"), jr->JobLevel); + Mmsg1(errmsg, _("Unknown level=%d\n"), jr->JobLevel); goto bail_out; } } else { - Dmsg1(100, "Submitting: %s\n", mdb->cmd); - Mmsg(mdb->cmd, "SELECT StartTime, Job FROM Job WHERE Job.JobId=%s", + Dmsg1(100, "Submitting: %s\n", cmd); + Mmsg(cmd, "SELECT StartTime, Job FROM Job WHERE Job.JobId=%s", edit_int64(jr->JobId, ed1)); } - if (!QUERY_DB(jcr, mdb, mdb->cmd)) { + if (!QueryDB(jcr, cmd)) { pm_strcpy(stime, ""); /* set EOS */ - Mmsg2(&mdb->errmsg, _("Query error for start time request: ERR=%s\nCMD=%s\n"), - sql_strerror(mdb), mdb->cmd); + Mmsg2(&errmsg, _("Query error for start time request: ERR=%s\nCMD=%s\n"), + sql_strerror(), cmd); goto bail_out; } - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg2(&mdb->errmsg, _("No Job record found: ERR=%s\nCMD=%s\n"), - sql_strerror(mdb), mdb->cmd); - sql_free_result(mdb); + if ((row = sql_fetch_row()) == NULL) { + Mmsg2(&errmsg, _("No Job record found: ERR=%s\nCMD=%s\n"), + sql_strerror(), cmd); + sql_free_result(); goto bail_out; } Dmsg2(100, "Got start time: %s, job: %s\n", row[0], row[1]); pm_strcpy(stime, row[0]); bstrncpy(job, row[1], MAX_NAME_LENGTH); - sql_free_result(mdb); + sql_free_result(); - db_unlock(mdb); + bdb_unlock(); return true; bail_out: - db_unlock(mdb); + bdb_unlock(); return false; } @@ -147,45 +148,44 @@ bail_out: * Returns: false on failure * true on success, jr is unchanged, but stime and job are set */ -bool -db_find_last_job_start_time(JCR *jcr, B_DB *mdb, JOB_DBR *jr, +bool BDB::bdb_find_last_job_start_time(JCR *jcr, JOB_DBR *jr, POOLMEM **stime, char *job, int JobLevel) { SQL_ROW row; char ed1[50], ed2[50]; char esc_name[MAX_ESCAPE_NAME_LENGTH]; - db_lock(mdb); - mdb->db_escape_string(jcr, esc_name, jr->Name, strlen(jr->Name)); + bdb_lock(); + bdb_escape_string(jcr, esc_name, jr->Name, strlen(jr->Name)); pm_strcpy(stime, "0000-00-00 00:00:00"); /* default */ job[0] = 0; - Mmsg(mdb->cmd, + Mmsg(cmd, "SELECT StartTime, Job FROM Job WHERE JobStatus IN ('T','W') AND Type='%c' AND " "Level='%c' AND Name='%s' AND ClientId=%s AND FileSetId=%s " "ORDER BY StartTime DESC LIMIT 1", jr->JobType, JobLevel, esc_name, edit_int64(jr->ClientId, ed1), edit_int64(jr->FileSetId, ed2)); - if (!QUERY_DB(jcr, mdb, mdb->cmd)) { - Mmsg2(&mdb->errmsg, _("Query error for start time request: ERR=%s\nCMD=%s\n"), - sql_strerror(mdb), mdb->cmd); + if (!QueryDB(jcr, cmd)) { + Mmsg2(&errmsg, _("Query error for start time request: ERR=%s\nCMD=%s\n"), + sql_strerror(), cmd); goto bail_out; } - if ((row = sql_fetch_row(mdb)) == NULL) { - sql_free_result(mdb); - Mmsg(mdb->errmsg, _("No prior Full backup Job record found.\n")); + if ((row = sql_fetch_row()) == NULL) { + sql_free_result(); + Mmsg(errmsg, _("No prior Full backup Job record found.\n")); goto bail_out; } Dmsg1(100, "Got start time: %s\n", row[0]); pm_strcpy(stime, row[0]); bstrncpy(job, row[1], MAX_NAME_LENGTH); - sql_free_result(mdb); - db_unlock(mdb); + sql_free_result(); + bdb_unlock(); return true; bail_out: - db_unlock(mdb); + bdb_unlock(); return false; } @@ -197,18 +197,17 @@ bail_out: * true on success, jr is unchanged and stime unchanged * level returned in JobLevel */ -bool -db_find_failed_job_since(JCR *jcr, B_DB *mdb, JOB_DBR *jr, POOLMEM *stime, int &JobLevel) +bool BDB::bdb_find_failed_job_since(JCR *jcr, JOB_DBR *jr, POOLMEM *stime, int &JobLevel) { SQL_ROW row; char ed1[50], ed2[50]; char esc_name[MAX_ESCAPE_NAME_LENGTH]; - db_lock(mdb); - mdb->db_escape_string(jcr, esc_name, jr->Name, strlen(jr->Name)); + bdb_lock(); + bdb_escape_string(jcr, esc_name, jr->Name, strlen(jr->Name)); /* Differential is since last Full backup */ - Mmsg(mdb->cmd, + Mmsg(cmd, "SELECT Level FROM Job WHERE JobStatus NOT IN ('T','W') AND " "Type='%c' AND Level IN ('%c','%c') AND Name='%s' AND ClientId=%s " "AND FileSetId=%s AND StartTime>'%s' " @@ -216,20 +215,20 @@ db_find_failed_job_since(JCR *jcr, B_DB *mdb, JOB_DBR *jr, POOLMEM *stime, int & jr->JobType, L_FULL, L_DIFFERENTIAL, esc_name, edit_int64(jr->ClientId, ed1), edit_int64(jr->FileSetId, ed2), stime); - if (!QUERY_DB(jcr, mdb, mdb->cmd)) { - db_unlock(mdb); + if (!QueryDB(jcr, cmd)) { + bdb_unlock(); return false; } - if ((row = sql_fetch_row(mdb)) == NULL) { - sql_free_result(mdb); - db_unlock(mdb); + if ((row = sql_fetch_row()) == NULL) { + sql_free_result(); + bdb_unlock(); return false; } JobLevel = (int)*row[0]; - sql_free_result(mdb); + sql_free_result(); - db_unlock(mdb); + bdb_unlock(); return true; } @@ -242,19 +241,18 @@ db_find_failed_job_since(JCR *jcr, B_DB *mdb, JOB_DBR *jr, POOLMEM *stime, int & * Returns: true on success * false on failure */ -bool -db_find_last_jobid(JCR *jcr, B_DB *mdb, const char *Name, JOB_DBR *jr) +bool BDB::bdb_find_last_jobid(JCR *jcr, const char *Name, JOB_DBR *jr) { SQL_ROW row; char ed1[50]; char esc_name[MAX_ESCAPE_NAME_LENGTH]; - db_lock(mdb); + bdb_lock(); /* Find last full */ Dmsg2(100, "JobLevel=%d JobType=%d\n", jr->JobLevel, jr->JobType); if (jr->JobLevel == L_VERIFY_CATALOG) { - mdb->db_escape_string(jcr, esc_name, jr->Name, strlen(jr->Name)); - Mmsg(mdb->cmd, + bdb_escape_string(jcr, esc_name, jr->Name, strlen(jr->Name)); + Mmsg(cmd, "SELECT JobId FROM Job WHERE Type='V' AND Level='%c' AND " " JobStatus IN ('T','W') AND Name='%s' AND " "ClientId=%s ORDER BY StartTime DESC LIMIT 1", @@ -264,45 +262,45 @@ db_find_last_jobid(JCR *jcr, B_DB *mdb, const char *Name, JOB_DBR *jr) jr->JobLevel == L_VERIFY_DISK_TO_CATALOG || jr->JobType == JT_BACKUP) { if (Name) { - mdb->db_escape_string(jcr, esc_name, (char*)Name, + bdb_escape_string(jcr, esc_name, (char*)Name, MIN(strlen(Name), sizeof(esc_name))); - Mmsg(mdb->cmd, + Mmsg(cmd, "SELECT JobId FROM Job WHERE Type='B' AND JobStatus IN ('T','W') AND " "Name='%s' ORDER BY StartTime DESC LIMIT 1", esc_name); } else { - Mmsg(mdb->cmd, + Mmsg(cmd, "SELECT JobId FROM Job WHERE Type='B' AND JobStatus IN ('T','W') AND " "ClientId=%s ORDER BY StartTime DESC LIMIT 1", edit_int64(jr->ClientId, ed1)); } } else { - Mmsg1(&mdb->errmsg, _("Unknown Job level=%d\n"), jr->JobLevel); - db_unlock(mdb); + Mmsg1(&errmsg, _("Unknown Job level=%d\n"), jr->JobLevel); + bdb_unlock(); return false; } - Dmsg1(100, "Query: %s\n", mdb->cmd); - if (!QUERY_DB(jcr, mdb, mdb->cmd)) { - db_unlock(mdb); + Dmsg1(100, "Query: %s\n", cmd); + if (!QueryDB(jcr, cmd)) { + bdb_unlock(); return false; } - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(&mdb->errmsg, _("No Job found for: %s.\n"), mdb->cmd); - sql_free_result(mdb); - db_unlock(mdb); + if ((row = sql_fetch_row()) == NULL) { + Mmsg1(&errmsg, _("No Job found for: %s.\n"), cmd); + sql_free_result(); + bdb_unlock(); return false; } jr->JobId = str_to_int64(row[0]); - sql_free_result(mdb); + sql_free_result(); Dmsg1(100, "db_get_last_jobid: got JobId=%d\n", jr->JobId); if (jr->JobId <= 0) { - Mmsg1(&mdb->errmsg, _("No Job found for: %s\n"), mdb->cmd); - db_unlock(mdb); + Mmsg1(&errmsg, _("No Job found for: %s\n"), cmd); + bdb_unlock(); return false; } - db_unlock(mdb); + bdb_unlock(); return true; } @@ -314,8 +312,7 @@ db_find_last_jobid(JCR *jcr, B_DB *mdb, const char *Name, JOB_DBR *jr) * Returns: 0 on failure * numrows on success */ -int -db_find_next_volume(JCR *jcr, B_DB *mdb, int item, bool InChanger, MEDIA_DBR *mr) +int BDB::bdb_find_next_volume(JCR *jcr, int item, bool InChanger, MEDIA_DBR *mr) { SQL_ROW row = NULL; int numrows; @@ -324,13 +321,13 @@ db_find_next_volume(JCR *jcr, B_DB *mdb, int item, bool InChanger, MEDIA_DBR *mr char esc_status[MAX_ESCAPE_NAME_LENGTH]; char ed1[50]; - db_lock(mdb); - mdb->db_escape_string(jcr, esc_type, mr->MediaType, strlen(mr->MediaType)); - mdb->db_escape_string(jcr, esc_status, mr->VolStatus, strlen(mr->VolStatus)); + bdb_lock(); + bdb_escape_string(jcr, esc_type, mr->MediaType, strlen(mr->MediaType)); + bdb_escape_string(jcr, esc_status, mr->VolStatus, strlen(mr->VolStatus)); if (item == -1) { /* find oldest volume */ /* Find oldest volume */ - Mmsg(mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks," + Mmsg(cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks," "VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes," "MediaType,VolStatus,PoolId,VolRetention,VolUseDuration,MaxVolJobs," "MaxVolFiles,Recycle,Slot,FirstWritten,LastWritten,InChanger," @@ -344,23 +341,19 @@ db_find_next_volume(JCR *jcr, B_DB *mdb, int item, bool InChanger, MEDIA_DBR *mr item = 1; } else { POOL_MEM changer(PM_FNAME); + POOL_MEM voltype(PM_FNAME); /* Find next available volume */ - /* ***FIXME*** - * replace switch with - * if (StorageId == 0) - * break; - */ if (InChanger) { Mmsg(changer, " AND InChanger=1 AND StorageId=%s ", - edit_int64(mr->StorageId, ed1)); + edit_int64(mr->StorageId, ed1)); } if (strcmp(mr->VolStatus, "Recycle") == 0 || strcmp(mr->VolStatus, "Purged") == 0) { order = "AND Recycle=1 ORDER BY LastWritten ASC,MediaId"; /* take oldest that can be recycled */ } else { - order = sql_media_order_most_recently_written[db_get_type_index(mdb)]; /* take most recently written */ + order = sql_media_order_most_recently_written[bdb_get_type_index()]; /* take most recently written */ } - Mmsg(mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks," + Mmsg(cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks," "VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes," "MediaType,VolStatus,PoolId,VolRetention,VolUseDuration,MaxVolJobs," "MaxVolFiles,Recycle,Slot,FirstWritten,LastWritten,InChanger," @@ -370,37 +363,40 @@ db_find_next_volume(JCR *jcr, B_DB *mdb, int item, bool InChanger, MEDIA_DBR *mr "FROM Media WHERE PoolId=%s AND MediaType='%s' AND Enabled=1 " "AND VolStatus='%s' " "%s " + "%s " "%s LIMIT %d", edit_int64(mr->PoolId, ed1), esc_type, - esc_status, changer.c_str(), order, item); + esc_status, + voltype.c_str(), + changer.c_str(), order, item); } - Dmsg1(100, "fnextvol=%s\n", mdb->cmd); - if (!QUERY_DB(jcr, mdb, mdb->cmd)) { - db_unlock(mdb); + Dmsg1(100, "fnextvol=%s\n", cmd); + if (!QueryDB(jcr, cmd)) { + bdb_unlock(); return 0; } - numrows = sql_num_rows(mdb); + numrows = sql_num_rows(); if (item > numrows || item < 1) { Dmsg2(050, "item=%d got=%d\n", item, numrows); - Mmsg2(&mdb->errmsg, _("Request for Volume item %d greater than max %d or less than 1\n"), + Mmsg2(&errmsg, _("Request for Volume item %d greater than max %d or less than 1\n"), item, numrows); - db_unlock(mdb); + bdb_unlock(); return 0; } /* Note, we previously seeked to the row using: - * sql_data_seek(mdb, item-1); + * sql_data_seek(item-1); * but this failed on PostgreSQL, so now we loop * over all the records. This should not be too horrible since * the maximum Volumes we look at in any case is 20. */ while (item-- > 0) { - if ((row = sql_fetch_row(mdb)) == NULL) { + if ((row = sql_fetch_row()) == NULL) { Dmsg1(050, "Fail fetch item=%d\n", item+1); - Mmsg1(&mdb->errmsg, _("No Volume record found for item %d.\n"), item); - sql_free_result(mdb); - db_unlock(mdb); + Mmsg1(&errmsg, _("No Volume record found for item %d.\n"), item); + sql_free_result(); + bdb_unlock(); return 0; } } @@ -433,7 +429,7 @@ db_find_next_volume(JCR *jcr, B_DB *mdb, int item, bool InChanger, MEDIA_DBR *mr mr->InChanger = str_to_uint64(row[22]); mr->EndFile = str_to_uint64(row[23]); mr->EndBlock = str_to_uint64(row[24]); - mr->VolParts = str_to_int64(row[25]); + mr->VolType = str_to_int64(row[25]); /* formerly VolParts */ mr->LabelType = str_to_int64(row[26]); bstrncpy(mr->cLabelDate, row[27]!=NULL?row[27]:"", sizeof(mr->cLabelDate)); mr->LabelDate = (time_t)str_to_utime(mr->cLabelDate); @@ -449,9 +445,9 @@ db_find_next_volume(JCR *jcr, B_DB *mdb, int item, bool InChanger, MEDIA_DBR *mr mr->VolWriteTime = str_to_int64(row[36]); mr->ActionOnPurge = str_to_int64(row[37]); - sql_free_result(mdb); + sql_free_result(); - db_unlock(mdb); + bdb_unlock(); Dmsg1(050, "Rtn numrows=%d\n", numrows); return numrows; } diff --git a/bacula/src/cats/sql_get.c b/bacula/src/cats/sql_get.c index 5aa39750ef..2414a1392a 100644 --- a/bacula/src/cats/sql_get.c +++ b/bacula/src/cats/sql_get.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /** * Bacula Catalog Database Get record interface routines @@ -23,13 +27,11 @@ * */ -#include "bacula.h" +#include "bacula.h" #if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL -#include "cats.h" -#include "bdb_priv.h" -#include "sql_glue.h" +#include "cats.h" /* ----------------------------------------------------------------------- * @@ -38,42 +40,37 @@ * ----------------------------------------------------------------------- */ -/* Forward referenced functions */ -static int db_get_file_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr, FILE_DBR *fdbr); -static int db_get_filename_record(JCR *jcr, B_DB *mdb); - - -/** +/* * Given a full filename (with path), look up the File record * (with attributes) in the database. * - * Returns: 0 on failure - * 1 on success with the File record in FILE_DBR + * Returns: false on failure + * true on success with the File record in FILE_DBR */ -int db_get_file_attributes_record(JCR *jcr, B_DB *mdb, char *fname, JOB_DBR *jr, FILE_DBR *fdbr) +bool BDB::bdb_get_file_attributes_record(JCR *jcr, char *afname, JOB_DBR *jr, FILE_DBR *fdbr) { - int stat; - Dmsg1(100, "db_get_file_att_record fname=%s \n", fname); + bool ok; - db_lock(mdb); - split_path_and_file(jcr, mdb, fname); + Dmsg1(500, "db_get_file_att_record fname=%s \n", afname); - fdbr->FilenameId = db_get_filename_record(jcr, mdb); + bdb_lock(); - fdbr->PathId = db_get_path_record(jcr, mdb); + split_path_and_file(jcr, this, afname); - stat = db_get_file_record(jcr, mdb, jr, fdbr); + fdbr->FilenameId = bdb_get_filename_record(jcr); - db_unlock(mdb); + fdbr->PathId = bdb_get_path_record(jcr); - return stat; + ok = bdb_get_file_record(jcr, jr, fdbr); + + bdb_unlock(); + + return ok; } /** * Get a File record - * Returns: 0 on failure - * 1 on success * * DO NOT use Jmsg in this routine. * @@ -87,79 +84,85 @@ int db_get_file_attributes_record(JCR *jcr, B_DB *mdb, char *fname, JOB_DBR *jr, * we cannot recurse into it, and the other is when we find an * explicit mention of the directory. This can also happen if the * use includes the directory twice. In this case, Verify - * VolumeToCatalog fails because we have two copies in the catalog, - * and only the first one is marked (twice). So, when calling from Verify, - * VolumeToCatalog jr is not NULL and we know jr->FileIndex is the fileindex + * VolumeToCatalog fails because we have two copies in the catalog, and + * only the first one is marked (twice). So, when calling from Verify, + * VolumeToCatalog jr is not NULL, and we know jr->FileIndex is the fileindex * of the version of the directory/file we actually want and do * a more explicit SQL search. + * + * Returns: false on failure + * true on success + * */ -static -int db_get_file_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr, FILE_DBR *fdbr) +bool BDB::bdb_get_file_record(JCR *jcr, JOB_DBR *jr, FILE_DBR *fdbr) { SQL_ROW row; - int stat = 0; + bool ok = false; char ed1[50], ed2[50], ed3[50]; - int num_rows; - if (jcr->getJobLevel() == L_VERIFY_DISK_TO_CATALOG) { - Mmsg(mdb->cmd, + switch (jcr->getJobLevel()) { + case L_VERIFY_VOLUME_TO_CATALOG: + Mmsg(cmd, +"SELECT FileId, LStat, MD5 FROM File WHERE File.JobId=%s AND File.PathId=%s AND " +"File.FilenameId=%s AND File.FileIndex=%u", + edit_int64(fdbr->JobId, ed1), + edit_int64(fdbr->PathId, ed2), + edit_int64(fdbr->FilenameId,ed3), + jr->FileIndex); + break; + case L_VERIFY_DISK_TO_CATALOG: + Mmsg(cmd, "SELECT FileId, LStat, MD5 FROM File,Job WHERE " "File.JobId=Job.JobId AND File.PathId=%s AND " "File.FilenameId=%s AND Job.Type='B' AND Job.JobStatus IN ('T','W') AND " "ClientId=%s ORDER BY StartTime DESC LIMIT 1", - edit_int64(fdbr->PathId, ed1), - edit_int64(fdbr->FilenameId, ed2), + edit_int64(fdbr->PathId, ed1), + edit_int64(fdbr->FilenameId, ed2), edit_int64(jr->ClientId,ed3)); - } else if (jcr->getJobLevel() == L_VERIFY_VOLUME_TO_CATALOG) { - Mmsg(mdb->cmd, - "SELECT FileId, LStat, MD5 FROM File WHERE File.JobId=%s AND File.PathId=%s AND " - "File.FilenameId=%s AND File.FileIndex=%u", - edit_int64(fdbr->JobId, ed1), - edit_int64(fdbr->PathId, ed2), - edit_int64(fdbr->FilenameId,ed3), - jr->FileIndex); - } else { - Mmsg(mdb->cmd, + break; + default: + Mmsg(cmd, "SELECT FileId, LStat, MD5 FROM File WHERE File.JobId=%s AND File.PathId=%s AND " "File.FilenameId=%s", edit_int64(fdbr->JobId, ed1), edit_int64(fdbr->PathId, ed2), edit_int64(fdbr->FilenameId,ed3)); + break; } + Dmsg3(450, "Get_file_record JobId=%u FilenameId=%u PathId=%u\n", fdbr->JobId, fdbr->FilenameId, fdbr->PathId); - Dmsg1(100, "Query=%s\n", mdb->cmd); + Dmsg1(100, "Query=%s\n", cmd); - if (QUERY_DB(jcr, mdb, mdb->cmd)) { - num_rows = sql_num_rows(mdb); - Dmsg1(050, "get_file_record num_rows=%d\n", num_rows); - if (num_rows >= 1) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(mdb->errmsg, _("Error fetching row: %s\n"), sql_strerror(mdb)); + if (QueryDB(jcr, cmd)) { + Dmsg1(100, "get_file_record sql_num_rows()=%d\n", sql_num_rows()); + if (sql_num_rows() >= 1) { + if ((row = sql_fetch_row()) == NULL) { + Mmsg1(errmsg, _("Error fetching row: %s\n"), sql_strerror()); } else { fdbr->FileId = (FileId_t)str_to_int64(row[0]); bstrncpy(fdbr->LStat, row[1], sizeof(fdbr->LStat)); bstrncpy(fdbr->Digest, row[2], sizeof(fdbr->Digest)); - stat = 1; - if (num_rows > 1) { - Mmsg3(mdb->errmsg, _("get_file_record want 1 got rows=%d PathId=%s FilenameId=%s\n"), - num_rows, - edit_int64(fdbr->PathId, ed1), + ok = true; + if (sql_num_rows() > 1) { + Mmsg3(errmsg, _("get_file_record want 1 got rows=%d PathId=%s FilenameId=%s\n"), + sql_num_rows(), + edit_int64(fdbr->PathId, ed1), edit_int64(fdbr->FilenameId, ed2)); - Dmsg1(000, "=== Problem! %s", mdb->errmsg); + Dmsg1(000, "=== Problem! %s", errmsg); } } } else { - Mmsg2(mdb->errmsg, _("File record for PathId=%s FilenameId=%s not found.\n"), - edit_int64(fdbr->PathId, ed1), + Mmsg2(errmsg, _("File record for PathId=%s FilenameId=%s not found.\n"), + edit_int64(fdbr->PathId, ed1), edit_int64(fdbr->FilenameId, ed2)); } - sql_free_result(mdb); + sql_free_result(); } else { - Mmsg(mdb->errmsg, _("File record not found in Catalog.\n")); + Mmsg(errmsg, _("File record not found in Catalog.\n")); } - return stat; + return ok; } @@ -170,41 +173,41 @@ int db_get_file_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr, FILE_DBR *fdbr) * * DO NOT use Jmsg in this routine (see notes for get_file_record) */ -static int db_get_filename_record(JCR *jcr, B_DB *mdb) +int BDB::bdb_get_filename_record(JCR *jcr) { SQL_ROW row; int FilenameId = 0; int num_rows; - mdb->esc_name = check_pool_memory_size(mdb->esc_name, 2*mdb->fnl+2); - db_escape_string(jcr, mdb, mdb->esc_name, mdb->fname, mdb->fnl); + esc_name = check_pool_memory_size(esc_name, 2*fnl+2); + bdb_escape_string(jcr, esc_name, fname, fnl); - Mmsg(mdb->cmd, "SELECT FilenameId FROM Filename WHERE Name='%s'", mdb->esc_name); - if (QUERY_DB(jcr, mdb, mdb->cmd)) { + Mmsg(cmd, "SELECT FilenameId FROM Filename WHERE Name='%s'", esc_name); + if (QueryDB(jcr, cmd)) { char ed1[30]; - num_rows = sql_num_rows(mdb); + num_rows = sql_num_rows(); if (num_rows > 1) { - Mmsg2(mdb->errmsg, _("More than one Filename!: %s for file: %s\n"), - edit_uint64(num_rows, ed1), mdb->fname); - Jmsg(jcr, M_WARNING, 0, "%s", mdb->errmsg); + Mmsg2(errmsg, _("More than one Filename!: %s for file: %s\n"), + edit_uint64(num_rows, ed1), fname); + Jmsg(jcr, M_WARNING, 0, "%s", errmsg); } if (num_rows >= 1) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(mdb->errmsg, _("error fetching row: %s\n"), sql_strerror(mdb)); + if ((row = sql_fetch_row()) == NULL) { + Mmsg1(errmsg, _("error fetching row: %s\n"), sql_strerror()); } else { FilenameId = str_to_int64(row[0]); if (FilenameId <= 0) { - Mmsg2(mdb->errmsg, _("Get DB Filename record %s found bad record: %d\n"), - mdb->cmd, FilenameId); + Mmsg2(errmsg, _("Get DB Filename record %s found bad record: %d\n"), + cmd, FilenameId); FilenameId = 0; } } } else { - Mmsg1(mdb->errmsg, _("Filename record: %s not found.\n"), mdb->fname); + Mmsg1(errmsg, _("Filename record: %s not found.\n"), fname); } - sql_free_result(mdb); + sql_free_result(); } else { - Mmsg(mdb->errmsg, _("Filename record: %s not found in Catalog.\n"), mdb->fname); + Mmsg(errmsg, _("Filename record: %s not found in Catalog.\n"), fname); } return FilenameId; } @@ -216,55 +219,53 @@ static int db_get_filename_record(JCR *jcr, B_DB *mdb) * * DO NOT use Jmsg in this routine (see notes for get_file_record) */ -int db_get_path_record(JCR *jcr, B_DB *mdb) +int BDB::bdb_get_path_record(JCR *jcr) { SQL_ROW row; uint32_t PathId = 0; - int num_rows; - mdb->esc_name = check_pool_memory_size(mdb->esc_name, 2*mdb->pnl+2); - db_escape_string(jcr, mdb, mdb->esc_name, mdb->path, mdb->pnl); + esc_name = check_pool_memory_size(esc_name, 2*pnl+2); + bdb_escape_string(jcr, esc_name, path, pnl); - if (mdb->cached_path_id != 0 && mdb->cached_path_len == mdb->pnl && - strcmp(mdb->cached_path, mdb->path) == 0) { - return mdb->cached_path_id; + if (cached_path_id != 0 && cached_path_len == pnl && + strcmp(cached_path, path) == 0) { + return cached_path_id; } - Mmsg(mdb->cmd, "SELECT PathId FROM Path WHERE Path='%s'", mdb->esc_name); + Mmsg(cmd, "SELECT PathId FROM Path WHERE Path='%s'", esc_name); - if (QUERY_DB(jcr, mdb, mdb->cmd)) { + if (QueryDB(jcr, cmd)) { char ed1[30]; - num_rows = sql_num_rows(mdb); - if (num_rows > 1) { - Mmsg2(mdb->errmsg, _("More than one Path!: %s for path: %s\n"), - edit_uint64(num_rows, ed1), mdb->path); - Jmsg(jcr, M_WARNING, 0, "%s", mdb->errmsg); + if (sql_num_rows() > 1) { + Mmsg2(errmsg, _("More than one Path!: %s for path: %s\n"), + edit_uint64(sql_num_rows(), ed1), path); + Jmsg(jcr, M_WARNING, 0, "%s", errmsg); } /* Even if there are multiple paths, take the first one */ - if (num_rows >= 1) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(mdb->errmsg, _("error fetching row: %s\n"), sql_strerror(mdb)); + if (sql_num_rows() >= 1) { + if ((row = sql_fetch_row()) == NULL) { + Mmsg1(errmsg, _("error fetching row: %s\n"), sql_strerror()); } else { PathId = str_to_int64(row[0]); if (PathId <= 0) { - Mmsg2(mdb->errmsg, _("Get DB path record %s found bad record: %s\n"), - mdb->cmd, edit_int64(PathId, ed1)); + Mmsg2(errmsg, _("Get DB path record %s found bad record: %s\n"), + cmd, edit_int64(PathId, ed1)); PathId = 0; } else { /* Cache path */ - if (PathId != mdb->cached_path_id) { - mdb->cached_path_id = PathId; - mdb->cached_path_len = mdb->pnl; - pm_strcpy(mdb->cached_path, mdb->path); + if (PathId != cached_path_id) { + cached_path_id = PathId; + cached_path_len = pnl; + pm_strcpy(cached_path, path); } } } } else { - Mmsg1(mdb->errmsg, _("Path record: %s not found.\n"), mdb->path); + Mmsg1(errmsg, _("Path record: %s not found.\n"), path); } - sql_free_result(mdb); + sql_free_result(); } else { - Mmsg(mdb->errmsg, _("Path record: %s not found in Catalog.\n"), mdb->path); + Mmsg(errmsg, _("Path record: %s not found in Catalog.\n"), path); } return PathId; } @@ -275,22 +276,22 @@ int db_get_path_record(JCR *jcr, B_DB *mdb) * Returns: false on failure * true on success */ -bool db_get_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) +bool BDB::bdb_get_job_record(JCR *jcr, JOB_DBR *jr) { SQL_ROW row; char ed1[50]; char esc[MAX_ESCAPE_NAME_LENGTH]; - db_lock(mdb); + bdb_lock(); if (jr->JobId == 0) { - mdb->db_escape_string(jcr, esc, jr->Job, strlen(jr->Job)); - Mmsg(mdb->cmd, "SELECT VolSessionId,VolSessionTime," + bdb_escape_string(jcr, esc, jr->Job, strlen(jr->Job)); + Mmsg(cmd, "SELECT VolSessionId,VolSessionTime," "PoolId,StartTime,EndTime,JobFiles,JobBytes,JobTDate,Job,JobStatus," "Type,Level,ClientId,Name,PriorJobId,RealEndTime,JobId,FileSetId," "SchedTime,RealEndTime,ReadBytes,HasBase,PurgedFiles " "FROM Job WHERE Job='%s'", esc); } else { - Mmsg(mdb->cmd, "SELECT VolSessionId,VolSessionTime," + Mmsg(cmd, "SELECT VolSessionId,VolSessionTime," "PoolId,StartTime,EndTime,JobFiles,JobBytes,JobTDate,Job,JobStatus," "Type,Level,ClientId,Name,PriorJobId,RealEndTime,JobId,FileSetId," "SchedTime,RealEndTime,ReadBytes,HasBase,PurgedFiles " @@ -298,14 +299,14 @@ bool db_get_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) edit_int64(jr->JobId, ed1)); } - if (!QUERY_DB(jcr, mdb, mdb->cmd)) { - db_unlock(mdb); + if (!QueryDB(jcr, cmd)) { + bdb_unlock(); return false; /* failed */ } - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(mdb->errmsg, _("No Job found for JobId %s\n"), edit_int64(jr->JobId, ed1)); - sql_free_result(mdb); - db_unlock(mdb); + if ((row = sql_fetch_row()) == NULL) { + Mmsg1(errmsg, _("No Job found for JobId %s\n"), edit_int64(jr->JobId, ed1)); + sql_free_result(); + bdb_unlock(); return false; /* failed */ } @@ -329,8 +330,8 @@ bool db_get_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) jr->JobId = str_to_int64(row[16]); } jr->FileSetId = str_to_int64(row[17]); - bstrncpy(jr->cSchedTime, row[3]!=NULL?row[18]:"", sizeof(jr->cSchedTime)); - bstrncpy(jr->cRealEndTime, row[3]!=NULL?row[19]:"", sizeof(jr->cRealEndTime)); + bstrncpy(jr->cSchedTime, row[18]!=NULL?row[18]:"", sizeof(jr->cSchedTime)); + bstrncpy(jr->cRealEndTime, row[19]!=NULL?row[19]:"", sizeof(jr->cRealEndTime)); jr->ReadBytes = str_to_int64(row[20]); jr->StartTime = str_to_utime(jr->cStartTime); jr->SchedTime = str_to_utime(jr->cSchedTime); @@ -338,9 +339,9 @@ bool db_get_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) jr->RealEndTime = str_to_utime(jr->cRealEndTime); jr->HasBase = str_to_int64(row[21]); jr->PurgedFiles = str_to_int64(row[22]); - sql_free_result(mdb); + sql_free_result(); - db_unlock(mdb); + bdb_unlock(); return true; } @@ -354,36 +355,34 @@ bool db_get_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) * * Returns: number of volumes on success */ -int db_get_job_volume_names(JCR *jcr, B_DB *mdb, JobId_t JobId, POOLMEM **VolumeNames) +int BDB::bdb_get_job_volume_names(JCR *jcr, JobId_t JobId, POOLMEM **VolumeNames) { SQL_ROW row; char ed1[50]; int stat = 0; int i; - int num_rows; - db_lock(mdb); + bdb_lock(); /* Get one entry per VolumeName, but "sort" by VolIndex */ - Mmsg(mdb->cmd, + Mmsg(cmd, "SELECT VolumeName,MAX(VolIndex) FROM JobMedia,Media WHERE " "JobMedia.JobId=%s AND JobMedia.MediaId=Media.MediaId " "GROUP BY VolumeName " "ORDER BY 2 ASC", edit_int64(JobId,ed1)); - Dmsg1(130, "VolNam=%s\n", mdb->cmd); + Dmsg1(130, "VolNam=%s\n", cmd); *VolumeNames[0] = 0; - if (QUERY_DB(jcr, mdb, mdb->cmd)) { - num_rows = sql_num_rows(mdb); - Dmsg1(130, "Num rows=%d\n", num_rows); - if (num_rows <= 0) { - Mmsg1(mdb->errmsg, _("No volumes found for JobId=%d\n"), JobId); + if (QueryDB(jcr, cmd)) { + Dmsg1(130, "Num rows=%d\n", sql_num_rows()); + if (sql_num_rows() <= 0) { + Mmsg1(errmsg, _("No volumes found for JobId=%d\n"), JobId); stat = 0; } else { - stat = num_rows; + stat = sql_num_rows(); for (i=0; i < stat; i++) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg2(mdb->errmsg, _("Error fetching row %d: ERR=%s\n"), i, sql_strerror(mdb)); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); + if ((row = sql_fetch_row()) == NULL) { + Mmsg2(errmsg, _("Error fetching row %d: ERR=%s\n"), i, sql_strerror()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); stat = 0; break; } else { @@ -394,11 +393,11 @@ int db_get_job_volume_names(JCR *jcr, B_DB *mdb, JobId_t JobId, POOLMEM **Volume } } } - sql_free_result(mdb); + sql_free_result(); } else { - Mmsg(mdb->errmsg, _("No Volume for JobId %d found in Catalog.\n"), JobId); + Mmsg(errmsg, _("No Volume for JobId %d found in Catalog.\n"), JobId); } - db_unlock(mdb); + bdb_unlock(); return stat; } @@ -410,17 +409,16 @@ int db_get_job_volume_names(JCR *jcr, B_DB *mdb, JobId_t JobId, POOLMEM **Volume * * Returns: number of volumes on success */ -int db_get_job_volume_parameters(JCR *jcr, B_DB *mdb, JobId_t JobId, VOL_PARAMS **VolParams) +int BDB::bdb_get_job_volume_parameters(JCR *jcr, JobId_t JobId, VOL_PARAMS **VolParams) { SQL_ROW row; char ed1[50]; int stat = 0; int i; VOL_PARAMS *Vols = NULL; - int num_rows; - db_lock(mdb); - Mmsg(mdb->cmd, + bdb_lock(); + Mmsg(cmd, "SELECT VolumeName,MediaType,FirstIndex,LastIndex,StartFile," "JobMedia.EndFile,StartBlock,JobMedia.EndBlock," "Slot,StorageId,InChanger" @@ -428,24 +426,23 @@ int db_get_job_volume_parameters(JCR *jcr, B_DB *mdb, JobId_t JobId, VOL_PARAMS " AND JobMedia.MediaId=Media.MediaId ORDER BY VolIndex,JobMediaId", edit_int64(JobId, ed1)); - Dmsg1(130, "VolNam=%s\n", mdb->cmd); - if (QUERY_DB(jcr, mdb, mdb->cmd)) { - num_rows = sql_num_rows(mdb); - Dmsg1(200, "Num rows=%d\n", num_rows); - if (num_rows <= 0) { - Mmsg1(mdb->errmsg, _("No volumes found for JobId=%d\n"), JobId); + Dmsg1(130, "VolNam=%s\n", cmd); + if (QueryDB(jcr, cmd)) { + Dmsg1(200, "Num rows=%d\n", sql_num_rows()); + if (sql_num_rows() <= 0) { + Mmsg1(errmsg, _("No volumes found for JobId=%d\n"), JobId); stat = 0; } else { - stat = num_rows; + stat = sql_num_rows(); DBId_t *SId = NULL; if (stat > 0) { *VolParams = Vols = (VOL_PARAMS *)malloc(stat * sizeof(VOL_PARAMS)); SId = (DBId_t *)malloc(stat * sizeof(DBId_t)); } for (i=0; i < stat; i++) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg2(mdb->errmsg, _("Error fetching row %d: ERR=%s\n"), i, sql_strerror(mdb)); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); + if ((row = sql_fetch_row()) == NULL) { + Mmsg2(errmsg, _("Error fetching row %d: ERR=%s\n"), i, sql_strerror()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); stat = 0; break; } else { @@ -470,10 +467,10 @@ int db_get_job_volume_parameters(JCR *jcr, B_DB *mdb, JobId_t JobId, VOL_PARAMS } for (i=0; i < stat; i++) { if (SId[i] != 0) { - Mmsg(mdb->cmd, "SELECT Name from Storage WHERE StorageId=%s", + Mmsg(cmd, "SELECT Name from Storage WHERE StorageId=%s", edit_int64(SId[i], ed1)); - if (QUERY_DB(jcr, mdb, mdb->cmd)) { - if ((row = sql_fetch_row(mdb)) && row[0]) { + if (QueryDB(jcr, cmd)) { + if ((row = sql_fetch_row()) && row[0]) { bstrncpy(Vols[i].Storage, row[0], MAX_NAME_LENGTH); } } @@ -483,9 +480,9 @@ int db_get_job_volume_parameters(JCR *jcr, B_DB *mdb, JobId_t JobId, VOL_PARAMS free(SId); } } - sql_free_result(mdb); + sql_free_result(); } - db_unlock(mdb); + bdb_unlock(); return stat; } @@ -497,14 +494,14 @@ int db_get_job_volume_parameters(JCR *jcr, B_DB *mdb, JobId_t JobId, VOL_PARAMS * Returns: -1 on failure * number on success */ -int db_get_num_pool_records(JCR *jcr, B_DB *mdb) +int BDB::bdb_get_num_pool_records(JCR *jcr) { int stat = 0; - db_lock(mdb); - Mmsg(mdb->cmd, "SELECT count(*) from Pool"); - stat = get_sql_record_max(jcr, mdb); - db_unlock(mdb); + bdb_lock(); + Mmsg(cmd, "SELECT count(*) from Pool"); + stat = get_sql_record_max(jcr, this); + bdb_unlock(); return stat; } @@ -515,33 +512,33 @@ int db_get_num_pool_records(JCR *jcr, B_DB *mdb) * Returns 0: on failure * 1: on success */ -int db_get_pool_ids(JCR *jcr, B_DB *mdb, int *num_ids, uint32_t *ids[]) +int BDB::bdb_get_pool_ids(JCR *jcr, int *num_ids, uint32_t *ids[]) { SQL_ROW row; int stat = 0; int i = 0; uint32_t *id; - db_lock(mdb); + bdb_lock(); *ids = NULL; - Mmsg(mdb->cmd, "SELECT PoolId FROM Pool"); - if (QUERY_DB(jcr, mdb, mdb->cmd)) { - *num_ids = sql_num_rows(mdb); + Mmsg(cmd, "SELECT PoolId FROM Pool"); + if (QueryDB(jcr, cmd)) { + *num_ids = sql_num_rows(); if (*num_ids > 0) { id = (uint32_t *)malloc(*num_ids * sizeof(uint32_t)); - while ((row = sql_fetch_row(mdb)) != NULL) { + while ((row = sql_fetch_row()) != NULL) { id[i++] = str_to_uint64(row[0]); } *ids = id; } - sql_free_result(mdb); + sql_free_result(); stat = 1; } else { - Mmsg(mdb->errmsg, _("Pool id select failed: ERR=%s\n"), sql_strerror(mdb)); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); + Mmsg(errmsg, _("Pool id select failed: ERR=%s\n"), sql_strerror()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); stat = 0; } - db_unlock(mdb); + bdb_unlock(); return stat; } @@ -552,33 +549,33 @@ int db_get_pool_ids(JCR *jcr, B_DB *mdb, int *num_ids, uint32_t *ids[]) * Returns 0: on failure * 1: on success */ -int db_get_client_ids(JCR *jcr, B_DB *mdb, int *num_ids, uint32_t *ids[]) +int BDB::bdb_get_client_ids(JCR *jcr, int *num_ids, uint32_t *ids[]) { SQL_ROW row; int stat = 0; int i = 0; uint32_t *id; - db_lock(mdb); + bdb_lock(); *ids = NULL; - Mmsg(mdb->cmd, "SELECT ClientId FROM Client ORDER BY Name"); - if (QUERY_DB(jcr, mdb, mdb->cmd)) { - *num_ids = sql_num_rows(mdb); + Mmsg(cmd, "SELECT ClientId FROM Client ORDER BY Name ASC"); + if (QueryDB(jcr, cmd)) { + *num_ids = sql_num_rows(); if (*num_ids > 0) { id = (uint32_t *)malloc(*num_ids * sizeof(uint32_t)); - while ((row = sql_fetch_row(mdb)) != NULL) { + while ((row = sql_fetch_row()) != NULL) { id[i++] = str_to_uint64(row[0]); } *ids = id; } - sql_free_result(mdb); + sql_free_result(); stat = 1; } else { - Mmsg(mdb->errmsg, _("Client id select failed: ERR=%s\n"), sql_strerror(mdb)); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); + Mmsg(errmsg, _("Client id select failed: ERR=%s\n"), sql_strerror()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); stat = 0; } - db_unlock(mdb); + bdb_unlock(); return stat; } @@ -587,41 +584,39 @@ int db_get_client_ids(JCR *jcr, B_DB *mdb, int *num_ids, uint32_t *ids[]) * Returns: false on failure * true on success */ -bool db_get_pool_record(JCR *jcr, B_DB *mdb, POOL_DBR *pdbr) +bool BDB::bdb_get_pool_record(JCR *jcr, POOL_DBR *pdbr) { SQL_ROW row; bool ok = false; char ed1[50]; - int num_rows; char esc[MAX_ESCAPE_NAME_LENGTH]; - db_lock(mdb); + bdb_lock(); if (pdbr->PoolId != 0) { /* find by id */ - Mmsg(mdb->cmd, + Mmsg(cmd, "SELECT PoolId,Name,NumVols,MaxVols,UseOnce,UseCatalog,AcceptAnyVolume," "AutoPrune,Recycle,VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles," "MaxVolBytes,PoolType,LabelType,LabelFormat,RecyclePoolId,ScratchPoolId," "ActionOnPurge FROM Pool WHERE Pool.PoolId=%s", edit_int64(pdbr->PoolId, ed1)); } else { /* find by name */ - mdb->db_escape_string(jcr, esc, pdbr->Name, strlen(pdbr->Name)); - Mmsg(mdb->cmd, + bdb_escape_string(jcr, esc, pdbr->Name, strlen(pdbr->Name)); + Mmsg(cmd, "SELECT PoolId,Name,NumVols,MaxVols,UseOnce,UseCatalog,AcceptAnyVolume," "AutoPrune,Recycle,VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles," "MaxVolBytes,PoolType,LabelType,LabelFormat,RecyclePoolId,ScratchPoolId," "ActionOnPurge FROM Pool WHERE Pool.Name='%s'", esc); } - if (QUERY_DB(jcr, mdb, mdb->cmd)) { - num_rows = sql_num_rows(mdb); - if (num_rows > 1) { + if (QueryDB(jcr, cmd)) { + if (sql_num_rows() > 1) { char ed1[30]; - Mmsg1(mdb->errmsg, _("More than one Pool!: %s\n"), - edit_uint64(num_rows, ed1)); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); - } else if (num_rows == 1) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(mdb->errmsg, _("error fetching row: %s\n"), sql_strerror(mdb)); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); + Mmsg1(errmsg, _("More than one Pool! Num=%s\n"), + edit_uint64(sql_num_rows(), ed1)); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); + } else if (sql_num_rows() == 1) { + if ((row = sql_fetch_row()) == NULL) { + Mmsg1(errmsg, _("error fetching row: %s\n"), sql_strerror()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); } else { pdbr->PoolId = str_to_int64(row[0]); bstrncpy(pdbr->Name, row[1]!=NULL?row[1]:"", sizeof(pdbr->Name)); @@ -646,9 +641,9 @@ bool db_get_pool_record(JCR *jcr, B_DB *mdb, POOL_DBR *pdbr) ok = true; } } - sql_free_result(mdb); + sql_free_result(); } - db_unlock(mdb); + bdb_unlock(); return ok; } /** @@ -659,31 +654,142 @@ bool db_get_pool_record(JCR *jcr, B_DB *mdb, POOL_DBR *pdbr) * Returns: false on failure * true on success */ -bool db_get_pool_numvols(JCR *jcr, B_DB *mdb, POOL_DBR *pdbr) +bool BDB::bdb_get_pool_numvols(JCR *jcr, POOL_DBR *pdbr) { bool ok; char ed1[50]; - ok = db_get_pool_record(jcr, mdb, pdbr); + ok = db_get_pool_record(jcr, this, pdbr); - db_lock(mdb); + bdb_lock(); if (ok) { uint32_t NumVols; - Mmsg(mdb->cmd, "SELECT count(*) from Media WHERE PoolId=%s", + Mmsg(cmd, "SELECT count(*) from Media WHERE PoolId=%s", edit_int64(pdbr->PoolId, ed1)); - NumVols = get_sql_record_max(jcr, mdb); + NumVols = get_sql_record_max(jcr, this); Dmsg2(400, "Actual NumVols=%d Pool NumVols=%d\n", NumVols, pdbr->NumVols); if (NumVols != pdbr->NumVols) { pdbr->NumVols = NumVols; - db_update_pool_record(jcr, mdb, pdbr); + db_update_pool_record(jcr, this, pdbr); } } else { - Mmsg(mdb->errmsg, _("Pool record not found in Catalog.\n")); + Mmsg(errmsg, _("Pool record not found in Catalog.\n")); } - db_unlock(mdb); + bdb_unlock(); return ok; } +/* + * Free restoreobject record (some fields are allocated through malloc) + */ +void db_free_restoreobject_record(JCR *jcr, ROBJECT_DBR *rr) +{ + if (rr->object) { + free(rr->object); + } + if (rr->object_name) { + free(rr->object_name); + } + if (rr->plugin_name) { + free(rr->plugin_name); + } + rr->object = rr->plugin_name = rr->object_name = NULL; +} + +/* + * Get RestoreObject Record + * If the RestoreObjectId is non-zero, we get its record + * + * You must call db_free_restoreobject_record() after db_get_restoreobject_record() + * + * Returns: false on failure + * true on success + */ +bool BDB::bdb_get_restoreobject_record(JCR *jcr, ROBJECT_DBR *rr) +{ + SQL_ROW row; + int stat = false; + char ed1[50]; + int32_t len; + + bdb_lock(); + Mmsg(cmd, + "SELECT ObjectName, PluginName, ObjectType, JobId, ObjectCompression, " + "RestoreObject, ObjectLength, ObjectFullLength, FileIndex " + "FROM RestoreObject " + "WHERE RestoreObjectId=%s", + edit_int64(rr->RestoreObjectId, ed1)); + + /* Using the JobId permits to check the Job name against ACLs and + * make sure that the current user is authorized to see the Restore object + */ + if (rr->JobId) { + pm_strcat(cmd, " AND JobId="); + pm_strcat(cmd, edit_int64(rr->JobId, ed1)); + + } else if (rr->JobIds && is_a_number_list(rr->JobIds)) { + pm_strcat(cmd, " AND JobId IN ("); + pm_strcat(cmd, rr->JobIds); + pm_strcat(cmd, ")"); + } + + if (QueryDB(jcr, cmd)) { + if (sql_num_rows() > 1) { + char ed1[30]; + Mmsg1(errmsg, _("Error got %s RestoreObjects but expected only one!\n"), + edit_uint64(sql_num_rows(), ed1)); + sql_data_seek(sql_num_rows()-1); + } + if ((row = sql_fetch_row()) == NULL) { + Mmsg1(errmsg, _("RestoreObject record \"%d\" not found.\n"), rr->RestoreObjectId); + } else { + db_free_restoreobject_record(jcr, rr); + rr->object_name = bstrdup(row[0]); + rr->plugin_name = bstrdup(row[1]); + rr->FileType = str_to_uint64(row[2]); + rr->JobId = str_to_uint64(row[3]); + rr->object_compression = str_to_int64(row[4]); + rr->object_len = str_to_uint64(row[6]); + rr->object_full_len = str_to_uint64(row[7]); + rr->object_index = str_to_uint64(row[8]); + + bdb_unescape_object(jcr, + row[5], /* Object */ + rr->object_len, /* Object length */ + &cmd, &len); + + if (rr->object_compression > 0) { + int out_len = rr->object_full_len + 100; /* full length */ + char *obj = (char *)malloc(out_len); + Zinflate(cmd, rr->object_len, obj, out_len); /* out_len is updated */ + if (out_len != (int)rr->object_full_len) { + Dmsg3(10, "Decompression failed. Len wanted=%d got=%d. Object=%s\n", + rr->object_full_len, out_len, rr->plugin_name); + + Mmsg(errmsg, _("Decompression failed. Len wanted=%d got=%d. Object=%s\n"), + rr->object_full_len, out_len, rr->plugin_name); + } + obj[out_len] = 0; + rr->object = obj; + rr->object_len = out_len; + + } else { + rr->object = (char *)malloc(sizeof(char)*(len+1)); + memcpy(rr->object, cmd, len); + rr->object[len] = 0; + rr->object_len = len; + } + + stat = true; + } + sql_free_result(); + } else { + Mmsg(errmsg, _("RestoreObject record not found in Catalog.\n")); + } + bdb_unlock(); + return stat; +} + /** * Get Client Record * If the ClientId is non-zero, we get its record, @@ -692,37 +798,35 @@ bool db_get_pool_numvols(JCR *jcr, B_DB *mdb, POOL_DBR *pdbr) * Returns: 0 on failure * 1 on success */ -int db_get_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cdbr) +int BDB::bdb_get_client_record(JCR *jcr, CLIENT_DBR *cdbr) { SQL_ROW row; int stat = 0; char ed1[50]; - int num_rows; char esc[MAX_ESCAPE_NAME_LENGTH]; - db_lock(mdb); + bdb_lock(); if (cdbr->ClientId != 0) { /* find by id */ - Mmsg(mdb->cmd, + Mmsg(cmd, "SELECT ClientId,Name,Uname,AutoPrune,FileRetention,JobRetention " "FROM Client WHERE Client.ClientId=%s", edit_int64(cdbr->ClientId, ed1)); } else { /* find by name */ - mdb->db_escape_string(jcr, esc, cdbr->Name, strlen(cdbr->Name)); - Mmsg(mdb->cmd, + bdb_escape_string(jcr, esc, cdbr->Name, strlen(cdbr->Name)); + Mmsg(cmd, "SELECT ClientId,Name,Uname,AutoPrune,FileRetention,JobRetention " "FROM Client WHERE Client.Name='%s'", esc); } - if (QUERY_DB(jcr, mdb, mdb->cmd)) { - num_rows = sql_num_rows(mdb); - if (num_rows > 1) { - Mmsg1(mdb->errmsg, _("More than one Client!: %s\n"), - edit_uint64(num_rows, ed1)); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); - } else if (num_rows == 1) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(mdb->errmsg, _("error fetching row: %s\n"), sql_strerror(mdb)); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); + if (QueryDB(jcr, cmd)) { + if (sql_num_rows() > 1) { + Mmsg1(errmsg, _("More than one Client!: %s\n"), + edit_uint64(sql_num_rows(), ed1)); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); + } else if (sql_num_rows() == 1) { + if ((row = sql_fetch_row()) == NULL) { + Mmsg1(errmsg, _("error fetching row: %s\n"), sql_strerror()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); } else { cdbr->ClientId = str_to_int64(row[0]); bstrncpy(cdbr->Name, row[1]!=NULL?row[1]:"", sizeof(cdbr->Name)); @@ -733,13 +837,13 @@ int db_get_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cdbr) stat = 1; } } else { - Mmsg(mdb->errmsg, _("Client record not found in Catalog.\n")); + Mmsg(errmsg, _("Client record not found in Catalog.\n")); } - sql_free_result(mdb); + sql_free_result(); } else { - Mmsg(mdb->errmsg, _("Client record not found in Catalog.\n")); + Mmsg(errmsg, _("Client record not found in Catalog.\n")); } - db_unlock(mdb); + bdb_unlock(); return stat; } @@ -749,31 +853,29 @@ int db_get_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cdbr) * Returns: 0 on failure * 1 on success */ -int db_get_counter_record(JCR *jcr, B_DB *mdb, COUNTER_DBR *cr) +bool BDB::bdb_get_counter_record(JCR *jcr, COUNTER_DBR *cr) { SQL_ROW row; - int num_rows; char esc[MAX_ESCAPE_NAME_LENGTH]; - db_lock(mdb); - mdb->db_escape_string(jcr, esc, cr->Counter, strlen(cr->Counter)); + bdb_lock(); + bdb_escape_string(jcr, esc, cr->Counter, strlen(cr->Counter)); - Mmsg(mdb->cmd, select_counter_values[mdb->db_get_type_index()], esc); - if (QUERY_DB(jcr, mdb, mdb->cmd)) { - num_rows = sql_num_rows(mdb); + Mmsg(cmd, select_counter_values[bdb_get_type_index()], esc); + if (QueryDB(jcr, cmd)) { /* If more than one, report error, but return first row */ - if (num_rows > 1) { - Mmsg1(mdb->errmsg, _("More than one Counter!: %d\n"), num_rows); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); + if (sql_num_rows() > 1) { + Mmsg1(errmsg, _("More than one Counter!: %d\n"), sql_num_rows()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); } - if (num_rows >= 1) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(mdb->errmsg, _("error fetching Counter row: %s\n"), sql_strerror(mdb)); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); - sql_free_result(mdb); - db_unlock(mdb); - return 0; + if (sql_num_rows() >= 1) { + if ((row = sql_fetch_row()) == NULL) { + Mmsg1(errmsg, _("error fetching Counter row: %s\n"), sql_strerror()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); + sql_free_result(); + bdb_unlock(); + return false; } cr->MinValue = str_to_int64(row[0]); cr->MaxValue = str_to_int64(row[1]); @@ -783,16 +885,16 @@ int db_get_counter_record(JCR *jcr, B_DB *mdb, COUNTER_DBR *cr) } else { cr->WrapCounter[0] = 0; } - sql_free_result(mdb); - db_unlock(mdb); - return 1; + sql_free_result(); + bdb_unlock(); + return true; } - sql_free_result(mdb); + sql_free_result(); } else { - Mmsg(mdb->errmsg, _("Counter record: %s not found in Catalog.\n"), cr->Counter); + Mmsg(errmsg, _("Counter record: %s not found in Catalog.\n"), cr->Counter); } - db_unlock(mdb); - return 0; + bdb_unlock(); + return false; } @@ -804,37 +906,35 @@ int db_get_counter_record(JCR *jcr, B_DB *mdb, COUNTER_DBR *cr) * Returns: 0 on failure * id on success */ -int db_get_fileset_record(JCR *jcr, B_DB *mdb, FILESET_DBR *fsr) +int BDB::bdb_get_fileset_record(JCR *jcr, FILESET_DBR *fsr) { SQL_ROW row; int stat = 0; char ed1[50]; - int num_rows; char esc[MAX_ESCAPE_NAME_LENGTH]; - db_lock(mdb); + bdb_lock(); if (fsr->FileSetId != 0) { /* find by id */ - Mmsg(mdb->cmd, + Mmsg(cmd, "SELECT FileSetId,FileSet,MD5,CreateTime FROM FileSet " "WHERE FileSetId=%s", edit_int64(fsr->FileSetId, ed1)); } else { /* find by name */ - mdb->db_escape_string(jcr, esc, fsr->FileSet, strlen(fsr->FileSet)); - Mmsg(mdb->cmd, + bdb_escape_string(jcr, esc, fsr->FileSet, strlen(fsr->FileSet)); + Mmsg(cmd, "SELECT FileSetId,FileSet,MD5,CreateTime FROM FileSet " "WHERE FileSet='%s' ORDER BY CreateTime DESC LIMIT 1", esc); } - if (QUERY_DB(jcr, mdb, mdb->cmd)) { - num_rows = sql_num_rows(mdb); - if (num_rows > 1) { + if (QueryDB(jcr, cmd)) { + if (sql_num_rows() > 1) { char ed1[30]; - Mmsg1(mdb->errmsg, _("Error got %s FileSets but expected only one!\n"), - edit_uint64(num_rows, ed1)); - sql_data_seek(mdb, num_rows-1); + Mmsg1(errmsg, _("Error got %s FileSets but expected only one!\n"), + edit_uint64(sql_num_rows(), ed1)); + sql_data_seek(sql_num_rows()-1); } - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(mdb->errmsg, _("FileSet record \"%s\" not found.\n"), fsr->FileSet); + if ((row = sql_fetch_row()) == NULL) { + Mmsg1(errmsg, _("FileSet record \"%s\" not found.\n"), fsr->FileSet); } else { fsr->FileSetId = str_to_int64(row[0]); bstrncpy(fsr->FileSet, row[1]!=NULL?row[1]:"", sizeof(fsr->FileSet)); @@ -842,11 +942,11 @@ int db_get_fileset_record(JCR *jcr, B_DB *mdb, FILESET_DBR *fsr) bstrncpy(fsr->cCreateTime, row[3]!=NULL?row[3]:"", sizeof(fsr->cCreateTime)); stat = fsr->FileSetId; } - sql_free_result(mdb); + sql_free_result(); } else { - Mmsg(mdb->errmsg, _("FileSet record not found in Catalog.\n")); + Mmsg(errmsg, _("FileSet record not found in Catalog.\n")); } - db_unlock(mdb); + bdb_unlock(); return stat; } @@ -857,14 +957,14 @@ int db_get_fileset_record(JCR *jcr, B_DB *mdb, FILESET_DBR *fsr) * Returns: -1 on failure * number on success */ -int db_get_num_media_records(JCR *jcr, B_DB *mdb) +int BDB::bdb_get_num_media_records(JCR *jcr) { int stat = 0; - db_lock(mdb); - Mmsg(mdb->cmd, "SELECT count(*) from Media"); - stat = get_sql_record_max(jcr, mdb); - db_unlock(mdb); + bdb_lock(); + Mmsg(cmd, "SELECT count(*) from Media"); + stat = get_sql_record_max(jcr, this); + bdb_unlock(); return stat; } @@ -877,7 +977,7 @@ int db_get_num_media_records(JCR *jcr, B_DB *mdb) * Returns false: on failure * true: on success */ -bool db_get_media_ids(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr, int *num_ids, uint32_t *ids[]) +bool BDB::bdb_get_media_ids(JCR *jcr, MEDIA_DBR *mr, int *num_ids, uint32_t *ids[]) { SQL_ROW row; int i = 0; @@ -887,64 +987,64 @@ bool db_get_media_ids(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr, int *num_ids, uint32_t char buf[MAX_NAME_LENGTH*3]; /* Can contain MAX_NAME_LENGTH*2+1 + AND ....='' */ char esc[MAX_NAME_LENGTH*2+1]; - db_lock(mdb); + bdb_lock(); *ids = NULL; - Mmsg(mdb->cmd, "SELECT DISTINCT MediaId FROM Media WHERE Recycle=%d AND Enabled=%d ", + Mmsg(cmd, "SELECT DISTINCT MediaId FROM Media WHERE Recycle=%d AND Enabled=%d ", mr->Recycle, mr->Enabled); if (*mr->MediaType) { - db_escape_string(jcr, mdb, esc, mr->MediaType, strlen(mr->MediaType)); + bdb_escape_string(jcr, esc, mr->MediaType, strlen(mr->MediaType)); bsnprintf(buf, sizeof(buf), "AND MediaType='%s' ", esc); - pm_strcat(mdb->cmd, buf); + pm_strcat(cmd, buf); } if (mr->StorageId) { bsnprintf(buf, sizeof(buf), "AND StorageId=%s ", edit_uint64(mr->StorageId, ed1)); - pm_strcat(mdb->cmd, buf); + pm_strcat(cmd, buf); } if (mr->PoolId) { bsnprintf(buf, sizeof(buf), "AND PoolId=%s ", edit_uint64(mr->PoolId, ed1)); - pm_strcat(mdb->cmd, buf); + pm_strcat(cmd, buf); } if (mr->VolBytes) { bsnprintf(buf, sizeof(buf), "AND VolBytes > %s ", edit_uint64(mr->VolBytes, ed1)); - pm_strcat(mdb->cmd, buf); + pm_strcat(cmd, buf); } if (*mr->VolumeName) { - db_escape_string(jcr, mdb, esc, mr->VolumeName, strlen(mr->VolumeName)); + bdb_escape_string(jcr, esc, mr->VolumeName, strlen(mr->VolumeName)); bsnprintf(buf, sizeof(buf), "AND VolumeName = '%s' ", esc); - pm_strcat(mdb->cmd, buf); + pm_strcat(cmd, buf); } if (*mr->VolStatus) { - db_escape_string(jcr, mdb, esc, mr->VolStatus, strlen(mr->VolStatus)); + bdb_escape_string(jcr, esc, mr->VolStatus, strlen(mr->VolStatus)); bsnprintf(buf, sizeof(buf), "AND VolStatus = '%s' ", esc); - pm_strcat(mdb->cmd, buf); + pm_strcat(cmd, buf); } - Dmsg1(100, "q=%s\n", mdb->cmd); + Dmsg1(100, "q=%s\n", cmd); - if (QUERY_DB(jcr, mdb, mdb->cmd)) { - *num_ids = sql_num_rows(mdb); + if (QueryDB(jcr, cmd)) { + *num_ids = sql_num_rows(); if (*num_ids > 0) { id = (uint32_t *)malloc(*num_ids * sizeof(uint32_t)); - while ((row = sql_fetch_row(mdb)) != NULL) { + while ((row = sql_fetch_row()) != NULL) { id[i++] = str_to_uint64(row[0]); } *ids = id; } - sql_free_result(mdb); + sql_free_result(); ok = true; } else { - Mmsg(mdb->errmsg, _("Media id select failed: ERR=%s\n"), sql_strerror(mdb)); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); + Mmsg(errmsg, _("Media id select failed: ERR=%s\n"), sql_strerror()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); ok = false; } - db_unlock(mdb); + bdb_unlock(); return ok; } @@ -956,33 +1056,33 @@ bool db_get_media_ids(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr, int *num_ids, uint32_t * Returns false: on failure * true: on success */ -bool db_get_query_dbids(JCR *jcr, B_DB *mdb, POOL_MEM &query, dbid_list &ids) +bool BDB::bdb_get_query_dbids(JCR *jcr, POOL_MEM &query, dbid_list &ids) { SQL_ROW row; int i = 0; bool ok = false; - db_lock(mdb); + bdb_lock(); ids.num_ids = 0; - if (QUERY_DB(jcr, mdb, query.c_str())) { - ids.num_ids = sql_num_rows(mdb); + if (QueryDB(jcr, query.c_str())) { + ids.num_ids = sql_num_rows(); if (ids.num_ids > 0) { if (ids.max_ids < ids.num_ids) { free(ids.DBId); ids.DBId = (DBId_t *)malloc(ids.num_ids * sizeof(DBId_t)); } - while ((row = sql_fetch_row(mdb)) != NULL) { + while ((row = sql_fetch_row()) != NULL) { ids.DBId[i++] = str_to_uint64(row[0]); } } - sql_free_result(mdb); + sql_free_result(); ok = true; } else { - Mmsg(mdb->errmsg, _("query dbids failed: ERR=%s\n"), sql_strerror(mdb)); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); + Mmsg(errmsg, _("query dbids failed: ERR=%s\n"), sql_strerror()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); ok = false; } - db_unlock(mdb); + bdb_unlock(); return ok; } @@ -992,24 +1092,23 @@ bool db_get_query_dbids(JCR *jcr, B_DB *mdb, POOL_MEM &query, dbid_list &ids) * Returns: false: on failure * true: on success */ -bool db_get_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) +bool BDB::bdb_get_media_record(JCR *jcr, MEDIA_DBR *mr) { SQL_ROW row; char ed1[50]; bool ok = false; - int num_rows; char esc[MAX_ESCAPE_NAME_LENGTH]; - db_lock(mdb); + bdb_lock(); if (mr->MediaId == 0 && mr->VolumeName[0] == 0) { - Mmsg(mdb->cmd, "SELECT count(*) from Media"); - mr->MediaId = get_sql_record_max(jcr, mdb); - db_unlock(mdb); + Mmsg(cmd, "SELECT count(*) from Media"); + mr->MediaId = get_sql_record_max(jcr, this); + bdb_unlock(); return true; } if (mr->MediaId != 0) { /* find by id */ - Mmsg(mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles," - "VolBlocks,VolBytes,VolMounts," + Mmsg(cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles," + "VolBlocks,VolBytes,VolABytes,VolHoleBytes,VolHoles,VolMounts," "VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes," "MediaType,VolStatus,PoolId,VolRetention,VolUseDuration,MaxVolJobs," "MaxVolFiles,Recycle,Slot,FirstWritten,LastWritten,InChanger," @@ -1019,9 +1118,9 @@ bool db_get_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) "FROM Media WHERE MediaId=%s", edit_int64(mr->MediaId, ed1)); } else { /* find by name */ - mdb->db_escape_string(jcr, esc, mr->VolumeName, strlen(mr->VolumeName)); - Mmsg(mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles," - "VolBlocks,VolBytes,VolMounts," + bdb_escape_string(jcr, esc, mr->VolumeName, strlen(mr->VolumeName)); + Mmsg(cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles," + "VolBlocks,VolBytes,VolABytes,VolHoleBytes,VolHoles,VolMounts," "VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes," "MediaType,VolStatus,PoolId,VolRetention,VolUseDuration,MaxVolJobs," "MaxVolFiles,Recycle,Slot,FirstWritten,LastWritten,InChanger," @@ -1031,17 +1130,16 @@ bool db_get_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) "FROM Media WHERE VolumeName='%s'", esc); } - if (QUERY_DB(jcr, mdb, mdb->cmd)) { + if (QueryDB(jcr, cmd)) { char ed1[50]; - num_rows = sql_num_rows(mdb); - if (num_rows > 1) { - Mmsg1(mdb->errmsg, _("More than one Volume!: %s\n"), - edit_uint64(num_rows, ed1)); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); - } else if (num_rows == 1) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(mdb->errmsg, _("error fetching row: %s\n"), sql_strerror(mdb)); - Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); + if (sql_num_rows() > 1) { + Mmsg1(errmsg, _("More than one Volume!: %s\n"), + edit_uint64(sql_num_rows(), ed1)); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); + } else if (sql_num_rows() == 1) { + if ((row = sql_fetch_row()) == NULL) { + Mmsg1(errmsg, _("error fetching row: %s\n"), sql_strerror()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); } else { /* return values */ mr->MediaId = str_to_int64(row[0]); @@ -1050,64 +1148,67 @@ bool db_get_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) mr->VolFiles = str_to_int64(row[3]); mr->VolBlocks = str_to_int64(row[4]); mr->VolBytes = str_to_uint64(row[5]); - mr->VolMounts = str_to_int64(row[6]); - mr->VolErrors = str_to_int64(row[7]); - mr->VolWrites = str_to_int64(row[8]); - mr->MaxVolBytes = str_to_uint64(row[9]); - mr->VolCapacityBytes = str_to_uint64(row[10]); - bstrncpy(mr->MediaType, row[11]!=NULL?row[11]:"", sizeof(mr->MediaType)); - bstrncpy(mr->VolStatus, row[12]!=NULL?row[12]:"", sizeof(mr->VolStatus)); - mr->PoolId = str_to_int64(row[13]); - mr->VolRetention = str_to_uint64(row[14]); - mr->VolUseDuration = str_to_uint64(row[15]); - mr->MaxVolJobs = str_to_int64(row[16]); - mr->MaxVolFiles = str_to_int64(row[17]); - mr->Recycle = str_to_int64(row[18]); - mr->Slot = str_to_int64(row[19]); - bstrncpy(mr->cFirstWritten, row[20]!=NULL?row[20]:"", sizeof(mr->cFirstWritten)); + mr->VolABytes = str_to_uint64(row[6]); + mr->VolHoleBytes = str_to_uint64(row[7]); + mr->VolHoles = str_to_int64(row[8]); + mr->VolMounts = str_to_int64(row[9]); + mr->VolErrors = str_to_int64(row[10]); + mr->VolWrites = str_to_int64(row[11]); + mr->MaxVolBytes = str_to_uint64(row[12]); + mr->VolCapacityBytes = str_to_uint64(row[13]); + bstrncpy(mr->MediaType, row[14]!=NULL?row[14]:"", sizeof(mr->MediaType)); + bstrncpy(mr->VolStatus, row[15]!=NULL?row[15]:"", sizeof(mr->VolStatus)); + mr->PoolId = str_to_int64(row[16]); + mr->VolRetention = str_to_uint64(row[17]); + mr->VolUseDuration = str_to_uint64(row[18]); + mr->MaxVolJobs = str_to_int64(row[19]); + mr->MaxVolFiles = str_to_int64(row[20]); + mr->Recycle = str_to_int64(row[21]); + mr->Slot = str_to_int64(row[22]); + bstrncpy(mr->cFirstWritten, row[23]!=NULL?row[23]:"", sizeof(mr->cFirstWritten)); mr->FirstWritten = (time_t)str_to_utime(mr->cFirstWritten); - bstrncpy(mr->cLastWritten, row[21]!=NULL?row[21]:"", sizeof(mr->cLastWritten)); + bstrncpy(mr->cLastWritten, row[24]!=NULL?row[24]:"", sizeof(mr->cLastWritten)); mr->LastWritten = (time_t)str_to_utime(mr->cLastWritten); - mr->InChanger = str_to_uint64(row[22]); - mr->EndFile = str_to_uint64(row[23]); - mr->EndBlock = str_to_uint64(row[24]); - mr->VolParts = str_to_int64(row[25]); - mr->LabelType = str_to_int64(row[26]); - bstrncpy(mr->cLabelDate, row[27]!=NULL?row[27]:"", sizeof(mr->cLabelDate)); + mr->InChanger = str_to_uint64(row[25]); + mr->EndFile = str_to_uint64(row[26]); + mr->EndBlock = str_to_uint64(row[27]); + mr->VolType = str_to_int64(row[28]); /* formerly VolParts */ + mr->LabelType = str_to_int64(row[29]); + bstrncpy(mr->cLabelDate, row[30]!=NULL?row[30]:"", sizeof(mr->cLabelDate)); mr->LabelDate = (time_t)str_to_utime(mr->cLabelDate); - mr->StorageId = str_to_int64(row[28]); - mr->Enabled = str_to_int64(row[29]); - mr->LocationId = str_to_int64(row[30]); - mr->RecycleCount = str_to_int64(row[31]); - bstrncpy(mr->cInitialWrite, row[32]!=NULL?row[32]:"", sizeof(mr->cInitialWrite)); + mr->StorageId = str_to_int64(row[31]); + mr->Enabled = str_to_int64(row[32]); + mr->LocationId = str_to_int64(row[33]); + mr->RecycleCount = str_to_int64(row[34]); + bstrncpy(mr->cInitialWrite, row[35]!=NULL?row[35]:"", sizeof(mr->cInitialWrite)); mr->InitialWrite = (time_t)str_to_utime(mr->cInitialWrite); - mr->ScratchPoolId = str_to_int64(row[33]); - mr->RecyclePoolId = str_to_int64(row[34]); - mr->VolReadTime = str_to_int64(row[35]); - mr->VolWriteTime = str_to_int64(row[36]); - mr->ActionOnPurge = str_to_int32(row[37]); + mr->ScratchPoolId = str_to_int64(row[36]); + mr->RecyclePoolId = str_to_int64(row[37]); + mr->VolReadTime = str_to_int64(row[38]); + mr->VolWriteTime = str_to_int64(row[39]); + mr->ActionOnPurge = str_to_int32(row[40]); ok = true; } } else { if (mr->MediaId != 0) { - Mmsg1(mdb->errmsg, _("Media record with MediaId=%s not found.\n"), + Mmsg1(errmsg, _("Media record with MediaId=%s not found.\n"), edit_int64(mr->MediaId, ed1)); } else { - Mmsg1(mdb->errmsg, _("Media record for Volume name \"%s\" not found.\n"), + Mmsg1(errmsg, _("Media record for Volume name \"%s\" not found.\n"), mr->VolumeName); } } - sql_free_result(mdb); + sql_free_result(); } else { if (mr->MediaId != 0) { - Mmsg(mdb->errmsg, _("Media record for MediaId=%u not found in Catalog.\n"), + Mmsg(errmsg, _("Media record for MediaId=%u not found in Catalog.\n"), mr->MediaId); } else { - Mmsg(mdb->errmsg, _("Media record for Volume Name \"%s\" not found in Catalog.\n"), + Mmsg(errmsg, _("Media record for Volume Name \"%s\" not found in Catalog.\n"), mr->VolumeName); } } - db_unlock(mdb); + bdb_unlock(); return ok; } @@ -1131,24 +1232,24 @@ static void strip_md5(char *q) * * TODO: See if we can do the SORT only if needed (as an argument) */ -bool db_get_file_list(JCR *jcr, B_DB *mdb, char *jobids, +bool BDB::bdb_get_file_list(JCR *jcr, char *jobids, bool use_md5, bool use_delta, DB_RESULT_HANDLER *result_handler, void *ctx) { if (!*jobids) { - db_lock(mdb); - Mmsg(mdb->errmsg, _("ERR=JobIds are empty\n")); - db_unlock(mdb); + bdb_lock(); + Mmsg(errmsg, _("ERR=JobIds are empty\n")); + bdb_unlock(); return false; } POOL_MEM buf(PM_MESSAGE); POOL_MEM buf2(PM_MESSAGE); if (use_delta) { - Mmsg(buf2, select_recent_version_with_basejob_and_delta[db_get_type_index(mdb)], + Mmsg(buf2, select_recent_version_with_basejob_and_delta[bdb_get_type_index()], jobids, jobids, jobids, jobids); } else { - Mmsg(buf2, select_recent_version_with_basejob[db_get_type_index(mdb)], + Mmsg(buf2, select_recent_version_with_basejob[bdb_get_type_index()], jobids, jobids, jobids, jobids); } @@ -1172,22 +1273,23 @@ bool db_get_file_list(JCR *jcr, B_DB *mdb, char *jobids, Dmsg1(100, "q=%s\n", buf.c_str()); - return db_big_sql_query(mdb, buf.c_str(), result_handler, ctx); + return bdb_big_sql_query(buf.c_str(), result_handler, ctx); } /** * This procedure gets the base jobid list used by jobids, */ -bool db_get_used_base_jobids(JCR *jcr, B_DB *mdb, +bool BDB::bdb_get_used_base_jobids(JCR *jcr, POOLMEM *jobids, db_list_ctx *result) { POOL_MEM buf; + Mmsg(buf, "SELECT DISTINCT BaseJobId " " FROM Job JOIN BaseFiles USING (JobId) " " WHERE Job.HasBase = 1 " " AND Job.JobId IN (%s) ", jobids); - return db_sql_query(mdb, buf.c_str(), db_list_handler, result); + return bdb_sql_query(buf.c_str(), db_list_handler, result); } /** @@ -1201,7 +1303,7 @@ bool db_get_used_base_jobids(JCR *jcr, B_DB *mdb, * * TODO: look and merge from ua_restore.c */ -bool db_accurate_get_jobids(JCR *jcr, B_DB *mdb, +bool BDB::bdb_get_accurate_jobids(JCR *jcr, JOB_DBR *jr, db_list_ctx *jobids) { bool ret=false; @@ -1216,13 +1318,13 @@ bool db_accurate_get_jobids(JCR *jcr, B_DB *mdb, jobids->reset(); /* First, find the last good Full backup for this job/client/fileset */ - Mmsg(query, create_temp_accurate_jobids[db_get_type_index(mdb)], + Mmsg(query, create_temp_accurate_jobids[bdb_get_type_index()], edit_uint64(jcr->JobId, jobid), edit_uint64(jr->ClientId, clientid), date, edit_uint64(jr->FileSetId, filesetid)); - if (!db_sql_query(mdb, query.c_str(), NULL, NULL)) { + if (!bdb_sql_query(query.c_str(), NULL, NULL)) { goto bail_out; } @@ -1244,7 +1346,7 @@ bool db_accurate_get_jobids(JCR *jcr, B_DB *mdb, date, filesetid); - if (!db_sql_query(mdb, query.c_str(), NULL, NULL)) { + if (!bdb_sql_query(query.c_str(), NULL, NULL)) { goto bail_out; } @@ -1264,25 +1366,25 @@ bool db_accurate_get_jobids(JCR *jcr, B_DB *mdb, jobid, date, filesetid); - if (!db_sql_query(mdb, query.c_str(), NULL, NULL)) { + if (!bdb_sql_query(query.c_str(), NULL, NULL)) { goto bail_out; } } /* build a jobid list ie: 1,2,3,4 */ Mmsg(query, "SELECT JobId FROM btemp3%s ORDER by JobTDate", jobid); - db_sql_query(mdb, query.c_str(), db_list_handler, jobids); - Dmsg1(1, "db_accurate_get_jobids=%s\n", jobids->list); + bdb_sql_query(query.c_str(), db_list_handler, jobids); + Dmsg1(1, "db_get_accurate_jobids=%s\n", jobids->list); ret = true; bail_out: Mmsg(query, "DROP TABLE btemp3%s", jobid); - db_sql_query(mdb, query.c_str(), NULL, NULL); + bdb_sql_query(query.c_str(), NULL, NULL); return ret; } -bool db_get_base_file_list(JCR *jcr, B_DB *mdb, bool use_md5, +bool BDB::bdb_get_base_file_list(JCR *jcr, bool use_md5, DB_RESULT_HANDLER *result_handler, void *ctx) { POOL_MEM buf(PM_MESSAGE); @@ -1295,25 +1397,25 @@ bool db_get_base_file_list(JCR *jcr, B_DB *mdb, bool use_md5, if (!use_md5) { strip_md5(buf.c_str()); } - return db_sql_query(mdb, buf.c_str(), result_handler, ctx); + return bdb_sql_query(buf.c_str(), result_handler, ctx); } -bool db_get_base_jobid(JCR *jcr, B_DB *mdb, JOB_DBR *jr, JobId_t *jobid) +bool BDB::bdb_get_base_jobid(JCR *jcr, JOB_DBR *jr, JobId_t *jobid) { POOL_MEM query(PM_FNAME); utime_t StartTime; db_int64_ctx lctx; char date[MAX_TIME_LENGTH]; char esc[MAX_ESCAPE_NAME_LENGTH]; - bool ret=false; -// char clientid[50], filesetid[50]; + bool ret = false; + *jobid = 0; lctx.count = 0; lctx.value = 0; StartTime = (jr->StartTime)?jr->StartTime:time(NULL); bstrutime(date, sizeof(date), StartTime + 1); - mdb->db_escape_string(jcr, esc, jr->Name, strlen(jr->Name)); + bdb_escape_string(jcr, esc, jr->Name, strlen(jr->Name)); /* we can take also client name, fileset, etc... */ @@ -1333,7 +1435,7 @@ bool db_get_base_jobid(JCR *jcr, B_DB *mdb, JOB_DBR *jr, JobId_t *jobid) date); Dmsg1(10, "db_get_base_jobid q=%s\n", query.c_str()); - if (!db_sql_query(mdb, query.c_str(), db_int64_handler, &lctx)) { + if (!bdb_sql_query(query.c_str(), db_int64_handler, &lctx)) { goto bail_out; } *jobid = (JobId_t) lctx.value; @@ -1346,18 +1448,112 @@ bail_out: } /* Get JobIds associated with a volume */ -bool db_get_volume_jobids(JCR *jcr, B_DB *mdb, +bool BDB::bdb_get_volume_jobids(JCR *jcr, MEDIA_DBR *mr, db_list_ctx *lst) { char ed1[50]; - bool ret=false; + bool ret = false; - db_lock(mdb); - Mmsg(mdb->cmd, "SELECT DISTINCT JobId FROM JobMedia WHERE MediaId=%s", + bdb_lock(); + Mmsg(cmd, "SELECT DISTINCT JobId FROM JobMedia WHERE MediaId=%s", edit_int64(mr->MediaId, ed1)); - ret = db_sql_query(mdb, mdb->cmd, db_list_handler, lst); - db_unlock(mdb); + ret = bdb_sql_query(cmd, db_list_handler, lst); + bdb_unlock(); return ret; } +/** + * Get Snapshot Record + * + * Returns: false: on failure + * true: on success + */ +bool BDB::bdb_get_snapshot_record(JCR *jcr, SNAPSHOT_DBR *sr) +{ + SQL_ROW row; + char ed1[50]; + bool ok = false; + char esc[MAX_ESCAPE_NAME_LENGTH]; + POOL_MEM filter1, filter2; + + if (sr->SnapshotId == 0 && (sr->Name[0] == 0 || sr->Device[0] == 0)) { + Dmsg0(10, "No SnapshotId or Name/Device provided\n"); + return false; + } + + bdb_lock(); + + if (sr->SnapshotId != 0) { /* find by id */ + Mmsg(filter1, "Snapshot.SnapshotId=%d", sr->SnapshotId); + + } else if (*sr->Name && *sr->Device) { /* find by name */ + bdb_escape_string(jcr, esc, sr->Name, strlen(sr->Name)); + Mmsg(filter1, "Snapshot.Name='%s'", esc); + bdb_escape_string(jcr, esc, sr->Device, strlen(sr->Device)); + Mmsg(filter2, "AND Snapshot.Device='%s'", esc); + + } else { + Dmsg0(10, "No SnapshotId or Name and Device\n"); + return false; + } + + Mmsg(cmd, "SELECT SnapshotId, Snapshot.Name, JobId, Snapshot.FileSetId, " + "FileSet.FileSet, CreateTDate, CreateDate, " + "Client.Name AS Client, Snapshot.ClientId, Volume, Device, Type, Retention, " + "Comment FROM Snapshot JOIN Client USING (ClientId) LEFT JOIN FileSet USING (FileSetId) WHERE %s %s", + filter1.c_str(), filter2.c_str()); + + if (QueryDB(jcr, cmd)) { + char ed1[50]; + if (sql_num_rows() > 1) { + Mmsg1(errmsg, _("More than one Snapshot!: %s\n"), + edit_uint64(sql_num_rows(), ed1)); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); + } else if (sql_num_rows() == 1) { + if ((row = sql_fetch_row()) == NULL) { + Mmsg1(errmsg, _("error fetching row: %s\n"), sql_strerror()); + Jmsg(jcr, M_ERROR, 0, "%s", errmsg); + } else { + /* return values */ + sr->reset(); + sr->need_to_free = true; + sr->SnapshotId = str_to_int64(row[0]); + bstrncpy(sr->Name, row[1], sizeof(sr->Name)); + sr->JobId = str_to_int64(row[2]); + sr->FileSetId = str_to_int64(row[3]); + bstrncpy(sr->FileSet, row[4], sizeof(sr->FileSet)); + sr->CreateTDate = str_to_uint64(row[5]); + bstrncpy(sr->CreateDate, row[6], sizeof(sr->CreateDate)); + bstrncpy(sr->Client, row[7], sizeof(sr->Client)); + sr->ClientId = str_to_int64(row[8]); + sr->Volume = bstrdup(row[9]); + sr->Device = bstrdup(row[10]); + bstrncpy(sr->Type, row[11], sizeof(sr->Type)); + sr->Retention = str_to_int64(row[12]); + bstrncpy(sr->Comment, NPRTB(row[13]), sizeof(sr->Comment)); + ok = true; + } + } else { + if (sr->SnapshotId != 0) { + Mmsg1(errmsg, _("Snapshot record with SnapshotId=%s not found.\n"), + edit_int64(sr->SnapshotId, ed1)); + } else { + Mmsg1(errmsg, _("Snapshot record for Snapshot name \"%s\" not found.\n"), + sr->Name); + } + } + sql_free_result(); + } else { + if (sr->SnapshotId != 0) { + Mmsg1(errmsg, _("Snapshot record with SnapshotId=%s not found.\n"), + edit_int64(sr->SnapshotId, ed1)); + } else { + Mmsg1(errmsg, _("Snapshot record for Snapshot name \"%s\" not found.\n"), + sr->Name); + } + } + bdb_unlock(); + return ok; +} + #endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL */ diff --git a/bacula/src/cats/sql_glue.c b/bacula/src/cats/sql_glue.c deleted file mode 100644 index 3607eb0cbb..0000000000 --- a/bacula/src/cats/sql_glue.c +++ /dev/null @@ -1,200 +0,0 @@ -/* - Bacula® - The Network Backup Solution - - Copyright (C) 2009-2014 Free Software Foundation Europe e.V. - - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. - - You may use this file and others of this release according to the - license defined in the LICENSE file, which includes the Affero General - Public License, v3.0 ("AGPLv3") and some additional permissions and - terms pursuant to its AGPLv3 Section 7. - - Bacula® is a registered trademark of Kern Sibbald. -*/ -/* - * Bacula Glue code for the catalog refactoring. - * - * Written by Marco van Wieringen, November 2009 - */ - -#include "bacula.h" - -#if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL - -#include "cats.h" -#include "bdb_priv.h" -#include "sql_glue.h" - -/* ----------------------------------------------------------------------- - * - * Generic Glue Routines - * - * ----------------------------------------------------------------------- - */ -bool db_match_database(B_DB *mdb, const char *db_driver, const char *db_name, - const char *db_address, int db_port) -{ - return mdb->db_match_database(db_driver, db_name, db_address, db_port); -} - -B_DB *db_clone_database_connection(B_DB *mdb, JCR *jcr, bool mult_db_connections) -{ - return mdb->db_clone_database_connection(jcr, mult_db_connections); -} - -const char *db_get_type(B_DB *mdb) -{ - return mdb->db_get_type(); -} - -int db_get_type_index(B_DB *mdb) -{ - return mdb->db_get_type_index(); -} - -bool db_open_database(JCR *jcr, B_DB *mdb) -{ - return mdb->db_open_database(jcr); -} - -void db_close_database(JCR *jcr, B_DB *mdb) -{ - if (mdb) { - mdb->db_close_database(jcr); - } -} - -void db_thread_cleanup(B_DB *mdb) -{ - mdb->db_thread_cleanup(); -} - -void db_escape_string(JCR *jcr, B_DB *mdb, char *snew, char *old, int len) -{ - mdb->db_escape_string(jcr, snew, old, len); -} - -char *db_escape_object(JCR *jcr, B_DB *mdb, char *old, int len) -{ - return mdb->db_escape_object(jcr, old, len); -} - -void db_unescape_object(JCR *jcr, B_DB *mdb, - char *from, int32_t expected_len, - POOLMEM **dest, int32_t *len) -{ - mdb->db_unescape_object(jcr, from, expected_len, dest, len); -} - -void db_start_transaction(JCR *jcr, B_DB *mdb) -{ - mdb->db_start_transaction(jcr); -} - -void db_end_transaction(JCR *jcr, B_DB *mdb) -{ - mdb->db_end_transaction(jcr); -} - -bool db_sql_query(B_DB *mdb, const char *query, int flags) -{ - mdb->errmsg[0] = 0; - return mdb->db_sql_query(query, flags); -} - -bool db_sql_query(B_DB *mdb, const char *query, DB_RESULT_HANDLER *result_handler, void *ctx) -{ - mdb->errmsg[0] = 0; - return mdb->db_sql_query(query, result_handler, ctx); -} - -bool db_big_sql_query(B_DB *mdb, const char *query, DB_RESULT_HANDLER *result_handler, void *ctx) -{ - mdb->errmsg[0] = 0; - return mdb->db_big_sql_query(query, result_handler, ctx); -} - -void sql_free_result(B_DB *mdb) -{ - ((B_DB_PRIV *)mdb)->sql_free_result(); -} - -SQL_ROW sql_fetch_row(B_DB *mdb) -{ - return ((B_DB_PRIV *)mdb)->sql_fetch_row(); -} - -bool sql_query(B_DB *mdb, const char *query, int flags) -{ - mdb->errmsg[0] = 0; - return ((B_DB_PRIV *)mdb)->sql_query(query, flags); -} - -const char *sql_strerror(B_DB *mdb) -{ - return ((B_DB_PRIV *)mdb)->sql_strerror(); -} - -int sql_num_rows(B_DB *mdb) -{ - return ((B_DB_PRIV *)mdb)->sql_num_rows(); -} - -void sql_data_seek(B_DB *mdb, int row) -{ - ((B_DB_PRIV *)mdb)->sql_data_seek(row); -} - -int sql_affected_rows(B_DB *mdb) -{ - return ((B_DB_PRIV *)mdb)->sql_affected_rows(); -} - -uint64_t sql_insert_autokey_record(B_DB *mdb, const char *query, const char *table_name) -{ - return ((B_DB_PRIV *)mdb)->sql_insert_autokey_record(query, table_name); -} - -void sql_field_seek(B_DB *mdb, int field) -{ - ((B_DB_PRIV *)mdb)->sql_field_seek(field); -} - -SQL_FIELD *sql_fetch_field(B_DB *mdb) -{ - return ((B_DB_PRIV *)mdb)->sql_fetch_field(); -} - -int sql_num_fields(B_DB *mdb) -{ - return ((B_DB_PRIV *)mdb)->sql_num_fields(); -} - -bool sql_field_is_not_null(B_DB *mdb, int field_type) -{ - return ((B_DB_PRIV *)mdb)->sql_field_is_not_null(field_type); -} - -bool sql_field_is_numeric(B_DB *mdb, int field_type) -{ - return ((B_DB_PRIV *)mdb)->sql_field_is_numeric(field_type); -} - -bool sql_batch_start(JCR *jcr, B_DB *mdb) -{ - return ((B_DB_PRIV *)mdb)->sql_batch_start(jcr); -} - -bool sql_batch_end(JCR *jcr, B_DB *mdb, const char *error) -{ - return ((B_DB_PRIV *)mdb)->sql_batch_end(jcr, error); -} - -bool sql_batch_insert(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) -{ - return ((B_DB_PRIV *)mdb)->sql_batch_insert(jcr, ar); -} - -#endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL */ diff --git a/bacula/src/cats/sql_glue.h b/bacula/src/cats/sql_glue.h deleted file mode 100644 index 3ae685a6f5..0000000000 --- a/bacula/src/cats/sql_glue.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - Bacula® - The Network Backup Solution - - Copyright (C) 2009-2014 Free Software Foundation Europe e.V. - - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. - - You may use this file and others of this release according to the - license defined in the LICENSE file, which includes the Affero General - Public License, v3.0 ("AGPLv3") and some additional permissions and - terms pursuant to its AGPLv3 Section 7. - - Bacula® is a registered trademark of Kern Sibbald. -*/ -#ifndef __SQL_GLUE_H_ -#define __SQL_GLUE_H_ 1 - -/* - * Prototypes for entry points into the different backends. - */ -bool db_match_database(B_DB *mdb, const char *db_driver, const char *db_name, - const char *db_address, int db_port); -B_DB *db_clone_database_connection(B_DB *mdb, JCR *jcr, bool mult_db_connections); -int db_get_type_index(B_DB *mdb); -const char *db_get_type(B_DB *mdb); -B_DB *db_init_database(JCR *jcr, const char *db_driver, const char *db_name, - const char *db_user, const char *db_password, - const char *db_address, int db_port, - const char *db_socket, bool mult_db_connections, bool disable_batch_insert); -bool db_open_database(JCR *jcr, B_DB *mdb); -void db_close_database(JCR *jcr, B_DB *mdb); -void db_thread_cleanup(B_DB *mdb); -void db_escape_string(JCR *jcr, B_DB *mdb, char *snew, char *old, int len); -char *db_escape_object(JCR *jcr, B_DB *mdb, char *old, int len); -void db_unescape_object(JCR *jcr, B_DB *mdb, - char *from, int32_t expected_len, - POOLMEM **dest, int32_t *len); -void db_start_transaction(JCR *jcr, B_DB *mdb); -void db_end_transaction(JCR *jcr, B_DB *mdb); -bool db_sql_query(B_DB *mdb, const char *query, int flags=0); -bool db_sql_query(B_DB *mdb, const char *query, DB_RESULT_HANDLER *result_handler, void *ctx); -bool db_big_sql_query(B_DB *mdb, const char *query, DB_RESULT_HANDLER *result_handler, void *ctx); - -#ifdef _BDB_PRIV_INTERFACE_ -void sql_free_result(B_DB *mdb); -SQL_ROW sql_fetch_row(B_DB *mdb); -bool sql_query(B_DB *mdb, const char *query, int flags=0); -const char *sql_strerror(B_DB *mdb); -int sql_num_rows(B_DB *mdb); -void sql_data_seek(B_DB *mdb, int row); -int sql_affected_rows(B_DB *mdb); -uint64_t sql_insert_autokey_record(B_DB *mdb, const char *query, const char *table_name); -void sql_field_seek(B_DB *mdb, int field); -SQL_FIELD *sql_fetch_field(B_DB *mdb); -int sql_num_fields(B_DB *mdb); -bool sql_field_is_not_null(B_DB *mdb, int field_type); -bool sql_field_is_numeric(B_DB *mdb, int field_type); -bool sql_batch_start(JCR *jcr, B_DB *mdb); -bool sql_batch_end(JCR *jcr, B_DB *mdb, const char *error); -bool sql_batch_insert(JCR *jcr, B_DB *mdb, ATTR_DBR *ar); -#endif /* _BDB_PRIV_INTERFACE_ */ -#endif /* __SQL_GLUE_H_ */ diff --git a/bacula/src/cats/sql_list.c b/bacula/src/cats/sql_list.c index 9cd86bb88f..9f237e52af 100644 --- a/bacula/src/cats/sql_list.c +++ b/bacula/src/cats/sql_list.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula Catalog Database List records interface routines @@ -20,13 +24,11 @@ * */ -#include "bacula.h" +#include "bacula.h" #if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL -#include "cats.h" -#include "bdb_priv.h" -#include "sql_glue.h" +#include "cats.h" /* ----------------------------------------------------------------------- * @@ -38,43 +40,42 @@ /* * Submit general SQL query */ -int db_list_sql_query(JCR *jcr, B_DB *mdb, const char *query, DB_LIST_HANDLER *sendit, +int BDB::bdb_list_sql_query(JCR *jcr, const char *query, DB_LIST_HANDLER *sendit, void *ctx, int verbose, e_list_type type) { - db_lock(mdb); - if (!sql_query(mdb, query, QF_STORE_RESULT)) { - Mmsg(mdb->errmsg, _("Query failed: %s\n"), sql_strerror(mdb)); + bdb_lock(); + if (!sql_query(query, QF_STORE_RESULT)) { + Mmsg(errmsg, _("Query failed: %s\n"), sql_strerror()); if (verbose) { - sendit(ctx, mdb->errmsg); + sendit(ctx, errmsg); } - db_unlock(mdb); + bdb_unlock(); return 0; } - list_result(jcr, mdb, sendit, ctx, type); - sql_free_result(mdb); - db_unlock(mdb); + list_result(jcr,this, sendit, ctx, type); + sql_free_result(); + bdb_unlock(); return 1; } -void -db_list_pool_records(JCR *jcr, B_DB *mdb, POOL_DBR *pdbr, +void BDB::bdb_list_pool_records(JCR *jcr, POOL_DBR *pdbr, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type) { char esc[MAX_ESCAPE_NAME_LENGTH]; - db_lock(mdb); - mdb->db_escape_string(jcr, esc, pdbr->Name, strlen(pdbr->Name)); + bdb_lock(); + bdb_escape_string(jcr, esc, pdbr->Name, strlen(pdbr->Name)); if (type == VERT_LIST) { if (pdbr->Name[0] != 0) { - Mmsg(mdb->cmd, "SELECT PoolId,Name,NumVols,MaxVols,UseOnce,UseCatalog," + Mmsg(cmd, "SELECT PoolId,Name,NumVols,MaxVols,UseOnce,UseCatalog," "AcceptAnyVolume,VolRetention,VolUseDuration,MaxVolJobs,MaxVolBytes," "AutoPrune,Recycle,PoolType,LabelFormat,Enabled,ScratchPoolId," "RecyclePoolId,LabelType " " FROM Pool WHERE Name='%s'", esc); } else { - Mmsg(mdb->cmd, "SELECT PoolId,Name,NumVols,MaxVols,UseOnce,UseCatalog," + Mmsg(cmd, "SELECT PoolId,Name,NumVols,MaxVols,UseOnce,UseCatalog," "AcceptAnyVolume,VolRetention,VolUseDuration,MaxVolJobs,MaxVolBytes," "AutoPrune,Recycle,PoolType,LabelFormat,Enabled,ScratchPoolId," "RecyclePoolId,LabelType " @@ -82,82 +83,135 @@ db_list_pool_records(JCR *jcr, B_DB *mdb, POOL_DBR *pdbr, } } else { if (pdbr->Name[0] != 0) { - Mmsg(mdb->cmd, "SELECT PoolId,Name,NumVols,MaxVols,PoolType,LabelFormat " + Mmsg(cmd, "SELECT PoolId,Name,NumVols,MaxVols,PoolType,LabelFormat " "FROM Pool WHERE Name='%s'", esc); } else { - Mmsg(mdb->cmd, "SELECT PoolId,Name,NumVols,MaxVols,PoolType,LabelFormat " + Mmsg(cmd, "SELECT PoolId,Name,NumVols,MaxVols,PoolType,LabelFormat " "FROM Pool ORDER BY PoolId"); } } - if (!QUERY_DB(jcr, mdb, mdb->cmd)) { - db_unlock(mdb); + if (!QueryDB(jcr, cmd)) { + bdb_unlock(); return; } - list_result(jcr, mdb, sendit, ctx, type); + list_result(jcr, this, sendit, ctx, type); - sql_free_result(mdb); - db_unlock(mdb); + sql_free_result(); + bdb_unlock(); } -void -db_list_client_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type) +void BDB::bdb_list_client_records(JCR *jcr, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type) { - db_lock(mdb); + bdb_lock(); if (type == VERT_LIST) { - Mmsg(mdb->cmd, "SELECT ClientId,Name,Uname,AutoPrune,FileRetention," + Mmsg(cmd, "SELECT ClientId,Name,Uname,AutoPrune,FileRetention," "JobRetention " "FROM Client ORDER BY ClientId"); } else { - Mmsg(mdb->cmd, "SELECT ClientId,Name,FileRetention,JobRetention " + Mmsg(cmd, "SELECT ClientId,Name,FileRetention,JobRetention " "FROM Client ORDER BY ClientId"); } - if (!QUERY_DB(jcr, mdb, mdb->cmd)) { - db_unlock(mdb); + if (!QueryDB(jcr, cmd)) { + bdb_unlock(); return; } - list_result(jcr, mdb, sendit, ctx, type); + list_result(jcr, this, sendit, ctx, type); - sql_free_result(mdb); - db_unlock(mdb); + sql_free_result(); + bdb_unlock(); } +/* + * List restore objects + * + * JobId | JobIds: List RestoreObjects for specific Job(s) + * It is possible to specify the ObjectType using FileType field. + */ +void BDB::bdb_list_restore_objects(JCR *jcr, ROBJECT_DBR *rr, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type) +{ + POOL_MEM filter; + char ed1[50]; + char *jobid; + + if (rr->JobIds && is_a_number_list(rr->JobIds)) { + jobid = rr->JobIds; + + } else if (rr->JobId) { + jobid = edit_int64(rr->JobId, ed1); + + } else { + return; + } + + if (rr->FileType > 0) { + Mmsg(filter, "AND ObjectType = %d ", rr->FileType); + } + + bdb_lock(); + if (type == VERT_LIST) { + Mmsg(cmd, "SELECT JobId, RestoreObjectId, ObjectName, " + "PluginName, ObjectType " + "FROM RestoreObject JOIN Job USING (JobId) WHERE JobId IN (%s) %s " + "ORDER BY JobTDate ASC, RestoreObjectId", + jobid, filter.c_str()); + } else { + Mmsg(cmd, "SELECT JobId, RestoreObjectId, ObjectName, " + "PluginName, ObjectType, ObjectLength " + "FROM RestoreObject JOIN Job USING (JobId) WHERE JobId IN (%s) %s " + "ORDER BY JobTDate ASC, RestoreObjectId", + jobid, filter.c_str()); + } + + if (!QueryDB(jcr, cmd)) { + bdb_unlock(); + return; + } + + list_result(jcr, this, sendit, ctx, type); + + sql_free_result(); + bdb_unlock(); +} /* * If VolumeName is non-zero, list the record for that Volume * otherwise, list the Volumes in the Pool specified by PoolId */ -void -db_list_media_records(JCR *jcr, B_DB *mdb, MEDIA_DBR *mdbr, +void BDB::bdb_list_media_records(JCR *jcr, MEDIA_DBR *mdbr, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type) { char ed1[50]; char esc[MAX_ESCAPE_NAME_LENGTH]; - db_lock(mdb); - mdb->db_escape_string(jcr, esc, mdbr->VolumeName, strlen(mdbr->VolumeName)); + bdb_lock(); + bdb_escape_string(jcr, esc, mdbr->VolumeName, strlen(mdbr->VolumeName)); if (type == VERT_LIST) { if (mdbr->VolumeName[0] != 0) { - Mmsg(mdb->cmd, "SELECT MediaId,VolumeName,Slot,PoolId," - "MediaType,FirstWritten,LastWritten,LabelDate,VolJobs," - "VolFiles,VolBlocks,VolMounts,VolBytes,VolErrors,VolWrites," + Mmsg(cmd, "SELECT MediaId,VolumeName,Slot,PoolId," + "MediaType,MediaTypeId,FirstWritten,LastWritten,LabelDate,VolJobs," + "VolFiles,VolBlocks,VolMounts,VolBytes,VolABytes,VolAPadding," + "VolHoleBytes,VolHoles,VolErrors,VolWrites," "VolCapacityBytes,VolStatus,Enabled,Recycle,VolRetention," "VolUseDuration,MaxVolJobs,MaxVolFiles,MaxVolBytes,InChanger," "EndFile,EndBlock,VolParts,LabelType,StorageId,DeviceId," + "MediaAddressing,VolReadTime,VolWriteTime," "LocationId,RecycleCount,InitialWrite,ScratchPoolId,RecyclePoolId, " "ActionOnPurge,Comment" " FROM Media WHERE Media.VolumeName='%s'", esc); } else { - Mmsg(mdb->cmd, "SELECT MediaId,VolumeName,Slot,PoolId," - "MediaType,FirstWritten,LastWritten,LabelDate,VolJobs," - "VolFiles,VolBlocks,VolMounts,VolBytes,VolErrors,VolWrites," + Mmsg(cmd, "SELECT MediaId,VolumeName,Slot,PoolId," + "MediaType,MediaTypeId,FirstWritten,LastWritten,LabelDate,VolJobs," + "VolFiles,VolBlocks,VolMounts,VolBytes,VolABytes,VolAPadding," + "VolHoleBytes,VolHoles,VolErrors,VolWrites," "VolCapacityBytes,VolStatus,Enabled,Recycle,VolRetention," "VolUseDuration,MaxVolJobs,MaxVolFiles,MaxVolBytes,InChanger," "EndFile,EndBlock,VolParts,LabelType,StorageId,DeviceId," + "MediaAddressing,VolReadTime,VolWriteTime," "LocationId,RecycleCount,InitialWrite,ScratchPoolId,RecyclePoolId, " "ActionOnPurge,Comment" " FROM Media WHERE Media.PoolId=%s ORDER BY MediaId", @@ -165,42 +219,43 @@ db_list_media_records(JCR *jcr, B_DB *mdb, MEDIA_DBR *mdbr, } } else { if (mdbr->VolumeName[0] != 0) { - Mmsg(mdb->cmd, "SELECT MediaId,VolumeName,VolStatus,Enabled," - "VolBytes,VolFiles,VolRetention,Recycle,Slot,InChanger,MediaType,LastWritten " + Mmsg(cmd, "SELECT MediaId,VolumeName,VolStatus,Enabled," + "VolBytes,VolFiles,VolRetention,Recycle,Slot,InChanger,MediaType,VolParts,LastWritten " "FROM Media WHERE Media.VolumeName='%s'", esc); } else { - Mmsg(mdb->cmd, "SELECT MediaId,VolumeName,VolStatus,Enabled," - "VolBytes,VolFiles,VolRetention,Recycle,Slot,InChanger,MediaType,LastWritten " + Mmsg(cmd, "SELECT MediaId,VolumeName,VolStatus,Enabled," + "VolBytes,VolFiles,VolRetention,Recycle,Slot,InChanger,MediaType,VolParts,LastWritten " "FROM Media WHERE Media.PoolId=%s ORDER BY MediaId", edit_int64(mdbr->PoolId, ed1)); } } - if (!QUERY_DB(jcr, mdb, mdb->cmd)) { - db_unlock(mdb); + if (!QueryDB(jcr, cmd)) { + bdb_unlock(); return; } - list_result(jcr, mdb, sendit, ctx, type); + list_result(jcr, this, sendit, ctx, type); - sql_free_result(mdb); - db_unlock(mdb); + sql_free_result(); + bdb_unlock(); } -void db_list_jobmedia_records(JCR *jcr, B_DB *mdb, uint32_t JobId, +void BDB::bdb_list_jobmedia_records(JCR *jcr, uint32_t JobId, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type) { char ed1[50]; - db_lock(mdb); + + bdb_lock(); if (type == VERT_LIST) { if (JobId > 0) { /* do by JobId */ - Mmsg(mdb->cmd, "SELECT JobMediaId,JobId,Media.MediaId,Media.VolumeName," + Mmsg(cmd, "SELECT JobMediaId,JobId,Media.MediaId,Media.VolumeName," "FirstIndex,LastIndex,StartFile,JobMedia.EndFile,StartBlock," "JobMedia.EndBlock " "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId " "AND JobMedia.JobId=%s", edit_int64(JobId, ed1)); } else { - Mmsg(mdb->cmd, "SELECT JobMediaId,JobId,Media.MediaId,Media.VolumeName," + Mmsg(cmd, "SELECT JobMediaId,JobId,Media.MediaId,Media.VolumeName," "FirstIndex,LastIndex,StartFile,JobMedia.EndFile,StartBlock," "JobMedia.EndBlock " "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId"); @@ -208,27 +263,27 @@ void db_list_jobmedia_records(JCR *jcr, B_DB *mdb, uint32_t JobId, } else { if (JobId > 0) { /* do by JobId */ - Mmsg(mdb->cmd, "SELECT JobId,Media.VolumeName,FirstIndex,LastIndex " + Mmsg(cmd, "SELECT JobId,Media.VolumeName,FirstIndex,LastIndex " "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId " "AND JobMedia.JobId=%s", edit_int64(JobId, ed1)); } else { - Mmsg(mdb->cmd, "SELECT JobId,Media.VolumeName,FirstIndex,LastIndex " + Mmsg(cmd, "SELECT JobId,Media.VolumeName,FirstIndex,LastIndex " "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId"); } } - if (!QUERY_DB(jcr, mdb, mdb->cmd)) { - db_unlock(mdb); + if (!QueryDB(jcr, cmd)) { + bdb_unlock(); return; } - list_result(jcr, mdb, sendit, ctx, type); + list_result(jcr, this, sendit, ctx, type); - sql_free_result(mdb); - db_unlock(mdb); + sql_free_result(); + bdb_unlock(); } -void db_list_copies_records(JCR *jcr, B_DB *mdb, uint32_t limit, char *JobIds, +void BDB::bdb_list_copies_records(JCR *jcr, uint32_t limit, char *JobIds, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type) { POOL_MEM str_limit(PM_MESSAGE); @@ -243,8 +298,8 @@ void db_list_copies_records(JCR *jcr, B_DB *mdb, uint32_t limit, char *JobIds, JobIds, JobIds); } - db_lock(mdb); - Mmsg(mdb->cmd, + bdb_lock(); + Mmsg(cmd, "SELECT DISTINCT Job.PriorJobId AS JobId, Job.Job, " "Job.JobId AS CopyJobId, Media.MediaType " "FROM Job " @@ -253,52 +308,52 @@ void db_list_copies_records(JCR *jcr, B_DB *mdb, uint32_t limit, char *JobIds, "WHERE Job.Type = '%c' %s ORDER BY Job.PriorJobId DESC %s", (char) JT_JOB_COPY, str_jobids.c_str(), str_limit.c_str()); - if (!QUERY_DB(jcr, mdb, mdb->cmd)) { + if (!QueryDB(jcr, cmd)) { goto bail_out; } - if (sql_num_rows(mdb)) { + if (sql_num_rows()) { if (JobIds && JobIds[0]) { sendit(ctx, _("These JobIds have copies as follows:\n")); } else { sendit(ctx, _("The catalog contains copies as follows:\n")); } - list_result(jcr, mdb, sendit, ctx, type); + list_result(jcr, this, sendit, ctx, type); } - sql_free_result(mdb); + sql_free_result(); bail_out: - db_unlock(mdb); + bdb_unlock(); } -void db_list_joblog_records(JCR *jcr, B_DB *mdb, uint32_t JobId, +void BDB::bdb_list_joblog_records(JCR *jcr, uint32_t JobId, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type) { char ed1[50]; - + if (JobId <= 0) { return; } - db_lock(mdb); + bdb_lock(); if (type == VERT_LIST) { - Mmsg(mdb->cmd, "SELECT Time,LogText FROM Log " + Mmsg(cmd, "SELECT Time,LogText FROM Log " "WHERE Log.JobId=%s ORDER BY LogId ASC", edit_int64(JobId, ed1)); } else { - Mmsg(mdb->cmd, "SELECT LogText FROM Log " + Mmsg(cmd, "SELECT LogText FROM Log " "WHERE Log.JobId=%s ORDER BY LogId ASC", edit_int64(JobId, ed1)); } - if (!QUERY_DB(jcr, mdb, mdb->cmd)) { + if (!QueryDB(jcr, cmd)) { goto bail_out; } - list_result(jcr, mdb, sendit, ctx, type); + list_result(jcr, this, sendit, ctx, type); - sql_free_result(mdb); + sql_free_result(); bail_out: - db_unlock(mdb); + bdb_unlock(); } @@ -308,8 +363,7 @@ bail_out: * Currently, we return all jobs or if jr->JobId is set, * only the job with the specified id. */ -alist * -db_list_job_records(JCR *jcr, B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit, +alist *BDB::bdb_list_job_records(JCR *jcr, JOB_DBR *jr, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type) { char ed1[50]; @@ -318,7 +372,7 @@ db_list_job_records(JCR *jcr, B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit, char esc[MAX_ESCAPE_NAME_LENGTH]; alist *list = NULL; - db_lock(mdb); + bdb_lock(); if (jr->limit > 0) { snprintf(limit, sizeof(limit), " LIMIT %d", jr->limit); } else { @@ -327,62 +381,96 @@ db_list_job_records(JCR *jcr, B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit, switch (type) { case VERT_LIST: if (jr->JobId == 0 && jr->Job[0] == 0) { - Mmsg(mdb->cmd, + Mmsg(cmd, "SELECT JobId,Job,Job.Name,PurgedFiles,Type,Level," "Job.ClientId,Client.Name as ClientName,JobStatus,SchedTime," "StartTime,EndTime,RealEndTime,JobTDate," - "VolSessionId,VolSessionTime,JobFiles,JobErrors," + "VolSessionId,VolSessionTime,JobFiles,JobBytes,ReadBytes,JobErrors," "JobMissingFiles,Job.PoolId,Pool.Name as PooLname,PriorJobId," "Job.FileSetId,FileSet.FileSet,Job.HasCache " - "FROM Job,Client,Pool,FileSet WHERE " - "Client.ClientId=Job.ClientId AND Pool.PoolId=Job.PoolId " - "AND FileSet.FileSetId=Job.FileSetId ORDER BY StartTime%s", limit); + "FROM Job JOIN Client USING (ClientId) LEFT JOIN Pool USING (PoolId) " + "LEFT JOIN FileSet USING (FileSetId) ", + "ORDER BY StartTime%s", limit); } else { /* single record */ - Mmsg(mdb->cmd, + Mmsg(cmd, "SELECT JobId,Job,Job.Name,PurgedFiles,Type,Level," - "Job.ClientId,Client.Name,JobStatus,SchedTime," + "Job.ClientId,Client.Name as ClientName,JobStatus,SchedTime," "StartTime,EndTime,RealEndTime,JobTDate," - "VolSessionId,VolSessionTime,JobFiles,JobErrors," + "VolSessionId,VolSessionTime,JobFiles,JobBytes,ReadBytes,JobErrors," "JobMissingFiles,Job.PoolId,Pool.Name as PooLname,PriorJobId," "Job.FileSetId,FileSet.FileSet,Job.HasCache " - "FROM Job,Client,Pool,FileSet WHERE Job.JobId=%s AND " - "Client.ClientId=Job.ClientId AND Pool.PoolId=Job.PoolId " - "AND FileSet.FileSetId=Job.FileSetId", + "FROM Job JOIN Client USING (ClientId) LEFT JOIN Pool USING (PoolId) " + "LEFT JOIN FileSet USING (FileSetId) WHERE Job.JobId=%s ", edit_int64(jr->JobId, ed1)); } break; case HORZ_LIST: if (jr->Name[0] != 0) { - mdb->db_escape_string(jcr, esc, jr->Name, strlen(jr->Name)); - Mmsg(mdb->cmd, + bdb_escape_string(jcr, esc, jr->Name, strlen(jr->Name)); + Mmsg(cmd, "SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus " "FROM Job WHERE Name='%s' ORDER BY StartTime,JobId ASC", esc); } else if (jr->Job[0] != 0) { - mdb->db_escape_string(jcr, esc, jr->Job, strlen(jr->Job)); - Mmsg(mdb->cmd, + bdb_escape_string(jcr, esc, jr->Job, strlen(jr->Job)); + Mmsg(cmd, "SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus " "FROM Job WHERE Job='%s' ORDER BY StartTime,JobId ASC", esc); } else if (jr->JobId != 0) { - Mmsg(mdb->cmd, + Mmsg(cmd, "SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus " "FROM Job WHERE JobId=%s", edit_int64(jr->JobId, ed1)); } else { /* all records */ - Mmsg(mdb->cmd, + Mmsg(cmd, "SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus " "FROM Job ORDER BY StartTime,JobId ASC%s", limit); } break; + case INCOMPLETE_JOBS: + if (jr->Name[0] != 0) { + bdb_escape_string(jcr, esc, jr->Name, strlen(jr->Name)); + if (jr->JobStatus == JS_FatalError) { + snprintf(status, sizeof(status), "JobStatus IN ('E','f') AND"); + } else if (jr->JobStatus != 0) { + snprintf(status, sizeof(status), "JobStatus='%c' AND", jr->JobStatus); + } else { + status[0] = 0; + } + Mmsg(cmd, + "SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus " + "FROM Job WHERE %s Name='%s' ORDER BY StartTime,JobId ASC%s", + status, esc, limit); + Dmsg1(100, "SQL: %s\n", cmd); + } else { /* all records */ + if (jr->JobStatus != 0) { + snprintf(status, sizeof(status), "WHERE JobStatus='%c'", jr->JobStatus); + } else { + status[0] = 0; + } + Mmsg(cmd, + "SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus " + "FROM Job %s ORDER BY StartTime,JobId ASC%s", status, limit); + Dmsg1(100, "SQL: %s\n", cmd); + } + break; default: break; } - if (!QUERY_DB(jcr, mdb, mdb->cmd)) { - db_unlock(mdb); + if (!QueryDB(jcr, cmd)) { + bdb_unlock(); return NULL; } - sql_data_seek(mdb, 0); - list_result(jcr, mdb, sendit, ctx, type); - sql_free_result(mdb); - db_unlock(mdb); + if (type == INCOMPLETE_JOBS) { + SQL_ROW row; + list = New(alist(10)); + sql_data_seek(0); + for (int i=0; (row=sql_fetch_row()) != NULL; i++) { + list->append(bstrdup(row[0])); + } + } + sql_data_seek(0); + list_result(jcr, this, sendit, ctx, type); + sql_free_result(); + bdb_unlock(); return list; } @@ -390,52 +478,50 @@ db_list_job_records(JCR *jcr, B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit, * List Job totals * */ -void -db_list_job_totals(JCR *jcr, B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit, void *ctx) +void BDB::bdb_list_job_totals(JCR *jcr, JOB_DBR *jr, DB_LIST_HANDLER *sendit, void *ctx) { - db_lock(mdb); + bdb_lock(); /* List by Job */ - Mmsg(mdb->cmd, "SELECT count(*) AS Jobs,sum(JobFiles) " + Mmsg(cmd, "SELECT count(*) AS Jobs,sum(JobFiles) " "AS Files,sum(JobBytes) AS Bytes,Name AS Job FROM Job GROUP BY Name"); - if (!QUERY_DB(jcr, mdb, mdb->cmd)) { - db_unlock(mdb); + if (!QueryDB(jcr, cmd)) { + bdb_unlock(); return; } - list_result(jcr, mdb, sendit, ctx, HORZ_LIST); + list_result(jcr, this, sendit, ctx, HORZ_LIST); - sql_free_result(mdb); + sql_free_result(); /* Do Grand Total */ - Mmsg(mdb->cmd, "SELECT count(*) AS Jobs,sum(JobFiles) " + Mmsg(cmd, "SELECT count(*) AS Jobs,sum(JobFiles) " "AS Files,sum(JobBytes) As Bytes FROM Job"); - if (!QUERY_DB(jcr, mdb, mdb->cmd)) { - db_unlock(mdb); + if (!QueryDB(jcr, cmd)) { + bdb_unlock(); return; } - list_result(jcr, mdb, sendit, ctx, HORZ_LIST); + list_result(jcr, this, sendit, ctx, HORZ_LIST); - sql_free_result(mdb); - db_unlock(mdb); + sql_free_result(); + bdb_unlock(); } -void -db_list_files_for_job(JCR *jcr, B_DB *mdb, JobId_t jobid, DB_LIST_HANDLER *sendit, void *ctx) +void BDB::bdb_list_files_for_job(JCR *jcr, JobId_t jobid, DB_LIST_HANDLER *sendit, void *ctx) { char ed1[50]; - LIST_CTX lctx(jcr, mdb, sendit, ctx, HORZ_LIST); + LIST_CTX lctx(jcr, this, sendit, ctx, HORZ_LIST); - db_lock(mdb); + bdb_lock(); /* * Stupid MySQL is NON-STANDARD ! */ - if (db_get_type_index(mdb) == SQL_TYPE_MYSQL) { - Mmsg(mdb->cmd, "SELECT CONCAT(Path.Path,Filename.Name) AS Filename " + if (bdb_get_type_index() == SQL_TYPE_MYSQL) { + Mmsg(cmd, "SELECT CONCAT(Path.Path,Filename.Name) AS Filename " "FROM (SELECT PathId, FilenameId FROM File WHERE JobId=%s " "UNION ALL " "SELECT PathId, FilenameId " @@ -447,7 +533,7 @@ db_list_files_for_job(JCR *jcr, B_DB *mdb, JobId_t jobid, DB_LIST_HANDLER *sendi "AND Path.PathId=F.PathId", edit_int64(jobid, ed1), ed1); } else { - Mmsg(mdb->cmd, "SELECT Path.Path||Filename.Name AS Filename " + Mmsg(cmd, "SELECT Path.Path||Filename.Name AS Filename " "FROM (SELECT PathId, FilenameId FROM File WHERE JobId=%s " "UNION ALL " "SELECT PathId, FilenameId " @@ -460,30 +546,29 @@ db_list_files_for_job(JCR *jcr, B_DB *mdb, JobId_t jobid, DB_LIST_HANDLER *sendi edit_int64(jobid, ed1), ed1); } - if (!db_big_sql_query(mdb, mdb->cmd, list_result, &lctx)) { - db_unlock(mdb); + if (!bdb_big_sql_query(cmd, list_result, &lctx)) { + bdb_unlock(); return; } lctx.send_dashes(); - sql_free_result(mdb); - db_unlock(mdb); + sql_free_result(); + bdb_unlock(); } -void -db_list_base_files_for_job(JCR *jcr, B_DB *mdb, JobId_t jobid, DB_LIST_HANDLER *sendit, void *ctx) +void BDB::bdb_list_base_files_for_job(JCR *jcr, JobId_t jobid, DB_LIST_HANDLER *sendit, void *ctx) { char ed1[50]; - LIST_CTX lctx(jcr, mdb, sendit, ctx, HORZ_LIST); + LIST_CTX lctx(jcr, this, sendit, ctx, HORZ_LIST); - db_lock(mdb); + bdb_lock(); /* * Stupid MySQL is NON-STANDARD ! */ - if (db_get_type_index(mdb) == SQL_TYPE_MYSQL) { - Mmsg(mdb->cmd, "SELECT CONCAT(Path.Path,Filename.Name) AS Filename " + if (bdb_get_type_index() == SQL_TYPE_MYSQL) { + Mmsg(cmd, "SELECT CONCAT(Path.Path,Filename.Name) AS Filename " "FROM BaseFiles, File, Filename, Path " "WHERE BaseFiles.JobId=%s AND BaseFiles.BaseJobId = File.JobId " "AND BaseFiles.FileId = File.FileId " @@ -491,7 +576,7 @@ db_list_base_files_for_job(JCR *jcr, B_DB *mdb, JobId_t jobid, DB_LIST_HANDLER * "AND Path.PathId=File.PathId", edit_int64(jobid, ed1)); } else { - Mmsg(mdb->cmd, "SELECT Path.Path||Filename.Name AS Filename " + Mmsg(cmd, "SELECT Path.Path||Filename.Name AS Filename " "FROM BaseFiles, File, Filename, Path " "WHERE BaseFiles.JobId=%s AND BaseFiles.BaseJobId = File.JobId " "AND BaseFiles.FileId = File.FileId " @@ -500,15 +585,122 @@ db_list_base_files_for_job(JCR *jcr, B_DB *mdb, JobId_t jobid, DB_LIST_HANDLER * edit_int64(jobid, ed1)); } - if (!db_big_sql_query(mdb, mdb->cmd, list_result, &lctx)) { - db_unlock(mdb); + if (!bdb_big_sql_query(cmd, list_result, &lctx)) { + bdb_unlock(); return; } lctx.send_dashes(); - sql_free_result(mdb); - db_unlock(mdb); + sql_free_result(); + bdb_unlock(); +} + +#define append_filter(buf, sql) \ + do { \ + if (*buf) { \ + pm_strcat(buf, " AND ");\ + } else { \ + pm_strcpy(buf, " WHERE ");\ + } \ + pm_strcat(buf, sql); \ + } while (0) + +void BDB::bdb_list_snapshot_records(JCR *jcr, SNAPSHOT_DBR *sdbr, + DB_LIST_HANDLER *sendit, void *ctx, e_list_type type) +{ + POOLMEM *filter = get_pool_memory(PM_MESSAGE); + POOLMEM *tmp = get_pool_memory(PM_MESSAGE); + POOLMEM *esc = get_pool_memory(PM_MESSAGE); + char ed1[50]; + + bdb_lock(); + *filter = 0; + + if (sdbr->Name[0]) { + bdb_escape_string(jcr, esc, sdbr->Name, strlen(sdbr->Name)); + Mmsg(tmp, "Name='%s'", esc); + append_filter(filter, tmp); + } + if (sdbr->SnapshotId > 0) { + Mmsg(tmp, "Snapshot.SnapshotId=%d", sdbr->SnapshotId); + append_filter(filter, tmp); + } + if (sdbr->ClientId > 0) { + Mmsg(tmp, "Snapshot.ClientId=%d", sdbr->ClientId); + append_filter(filter, tmp); + } + if (sdbr->JobId > 0) { + Mmsg(tmp, "Snapshot.JobId=%d", sdbr->JobId); + append_filter(filter, tmp); + } + if (*sdbr->Client) { + bdb_escape_string(jcr, esc, sdbr->Client, strlen(sdbr->Client)); + Mmsg(tmp, "Client.Name='%s'", esc); + append_filter(filter, tmp); + } + if (sdbr->Device && *(sdbr->Device)) { + esc = check_pool_memory_size(esc, strlen(sdbr->Device) * 2 + 1); + bdb_escape_string(jcr, esc, sdbr->Device, strlen(sdbr->Device)); + Mmsg(tmp, "Device='%s'", esc); + append_filter(filter, tmp); + } + if (*sdbr->Type) { + bdb_escape_string(jcr, esc, sdbr->Type, strlen(sdbr->Type)); + Mmsg(tmp, "Type='%s'", esc); + append_filter(filter, tmp); + } + if (*sdbr->created_before) { + bdb_escape_string(jcr, esc, sdbr->created_before, strlen(sdbr->created_before)); + Mmsg(tmp, "CreateDate <= '%s'", esc); + append_filter(filter, tmp); + } + if (*sdbr->created_after) { + bdb_escape_string(jcr, esc, sdbr->created_after, strlen(sdbr->created_after)); + Mmsg(tmp, "CreateDate >= '%s'", esc); + append_filter(filter, tmp); + } + if (sdbr->expired) { + Mmsg(tmp, "CreateTDate < (%s - Retention)", edit_int64(time(NULL), ed1)); + append_filter(filter, tmp); + } + if (*sdbr->CreateDate) { + bdb_escape_string(jcr, esc, sdbr->CreateDate, strlen(sdbr->CreateDate)); + Mmsg(tmp, "CreateDate = '%s'", esc); + append_filter(filter, tmp); + } + + if (sdbr->sorted_client) { + pm_strcat(filter, " ORDER BY Client.Name, SnapshotId DESC"); + + } else { + pm_strcat(filter, " ORDER BY SnapshotId DESC"); + } + + if (type == VERT_LIST || type == ARG_LIST) { + Mmsg(cmd, "SELECT SnapshotId, Snapshot.Name, CreateDate, Client.Name AS Client, " + "FileSet.FileSet AS FileSet, JobId, Volume, Device, Type, Retention, Comment " + "FROM Snapshot JOIN Client USING (ClientId) LEFT JOIN FileSet USING (FileSetId) %s", filter); + + } else if (type == HORZ_LIST) { + Mmsg(cmd, "SELECT SnapshotId, Snapshot.Name, CreateDate, Client.Name AS Client, " + "Device, Type " + "FROM Snapshot JOIN Client USING (ClientId) %s", filter); + } + + if (!QueryDB(jcr, cmd)) { + goto bail_out; + } + + list_result(jcr, this, sendit, ctx, type); + +bail_out: + sql_free_result(); + bdb_unlock(); + + free_pool_memory(filter); + free_pool_memory(esc); + free_pool_memory(tmp); } #endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL */ diff --git a/bacula/src/cats/sql_update.c b/bacula/src/cats/sql_update.c index a6c6baab82..3c051aadce 100644 --- a/bacula/src/cats/sql_update.c +++ b/bacula/src/cats/sql_update.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula Catalog Database Update record interface routines @@ -20,13 +24,11 @@ * */ -#include "bacula.h" +#include "bacula.h" #if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL - -#include "cats.h" -#include "bdb_priv.h" -#include "sql_glue.h" + +#include "cats.h" /* ----------------------------------------------------------------------- * @@ -42,37 +44,36 @@ * ----------------------------------------------------------------------- */ /* Update the attributes record by adding the file digest */ -int -db_add_digest_to_file_record(JCR *jcr, B_DB *mdb, FileId_t FileId, char *digest, +int BDB::bdb_add_digest_to_file_record(JCR *jcr, FileId_t FileId, char *digest, int type) { int ret; char ed1[50]; int len = strlen(digest); - db_lock(mdb); - mdb->esc_name = check_pool_memory_size(mdb->esc_name, len*2+1); - mdb->db_escape_string(jcr, mdb->esc_name, digest, len); - Mmsg(mdb->cmd, "UPDATE File SET MD5='%s' WHERE FileId=%s", mdb->esc_name, + bdb_lock(); + esc_name = check_pool_memory_size(esc_name, len*2+1); + bdb_escape_string(jcr, esc_name, digest, len); + Mmsg(cmd, "UPDATE File SET MD5='%s' WHERE FileId=%s", esc_name, edit_int64(FileId, ed1)); - ret = UPDATE_DB(jcr, mdb, mdb->cmd); - db_unlock(mdb); + ret = UpdateDB(jcr, cmd); + bdb_unlock(); return ret; } /* Mark the file record as being visited during database * verify compare. Stuff JobId into the MarkId field */ -int db_mark_file_record(JCR *jcr, B_DB *mdb, FileId_t FileId, JobId_t JobId) +int BDB::bdb_mark_file_record(JCR *jcr, FileId_t FileId, JobId_t JobId) { int stat; char ed1[50], ed2[50]; - db_lock(mdb); - Mmsg(mdb->cmd, "UPDATE File SET MarkId=%s WHERE FileId=%s", + bdb_lock(); + Mmsg(cmd, "UPDATE File SET MarkId=%s WHERE FileId=%s", edit_int64(JobId, ed1), edit_int64(FileId, ed2)); - stat = UPDATE_DB(jcr, mdb, mdb->cmd); - db_unlock(mdb); + stat = UpdateDB(jcr, cmd); + bdb_unlock(); return stat; } @@ -82,8 +83,7 @@ int db_mark_file_record(JCR *jcr, B_DB *mdb, FileId_t FileId, JobId_t JobId) * Returns: false on failure * true on success */ -bool -db_update_job_start_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) +bool BDB::bdb_update_job_start_record(JCR *jcr, JOB_DBR *jr) { char dt[MAX_TIME_LENGTH]; time_t stime; @@ -97,8 +97,8 @@ db_update_job_start_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) strftime(dt, sizeof(dt), "%Y-%m-%d %H:%M:%S", &tm); JobTDate = (btime_t)stime; - db_lock(mdb); - Mmsg(mdb->cmd, "UPDATE Job SET JobStatus='%c',Level='%c',StartTime='%s'," + bdb_lock(); + Mmsg(cmd, "UPDATE Job SET JobStatus='%c',Level='%c',StartTime='%s'," "ClientId=%s,JobTDate=%s,PoolId=%s,FileSetId=%s WHERE JobId=%s", (char)(jcr->JobStatus), (char)(jr->JobLevel), dt, @@ -108,9 +108,9 @@ db_update_job_start_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) edit_int64(jr->FileSetId, ed4), edit_int64(jr->JobId, ed5)); - stat = UPDATE_DB(jcr, mdb, mdb->cmd); - mdb->changes = 0; - db_unlock(mdb); + stat = UpdateDB(jcr, cmd); + changes = 0; + bdb_unlock(); return stat; } @@ -118,21 +118,21 @@ db_update_job_start_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) * Update Long term statistics with all jobs that were run before * age seconds */ -int -db_update_stats(JCR *jcr, B_DB *mdb, utime_t age) +int BDB::bdb_update_stats(JCR *jcr, utime_t age) { char ed1[30]; int rows; + utime_t now = (utime_t)time(NULL); edit_uint64(now - age, ed1); - db_lock(mdb); + bdb_lock(); - Mmsg(mdb->cmd, fill_jobhisto, ed1); - QUERY_DB(jcr, mdb, mdb->cmd); /* TODO: get a message ? */ - rows = sql_affected_rows(mdb); + Mmsg(cmd, fill_jobhisto, ed1); + QueryDB(jcr, cmd); /* TODO: get a message ? */ + rows = sql_affected_rows(); - db_unlock(mdb); + bdb_unlock(); return rows; } @@ -143,8 +143,7 @@ db_update_stats(JCR *jcr, B_DB *mdb, utime_t age) * Returns: 0 on failure * 1 on success */ -int -db_update_job_end_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) +int BDB::bdb_update_job_end_record(JCR *jcr, JOB_DBR *jr) { char dt[MAX_TIME_LENGTH]; char rdt[MAX_TIME_LENGTH]; @@ -164,7 +163,7 @@ db_update_job_end_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) ttime = jr->EndTime; (void)localtime_r(&ttime, &tm); strftime(dt, sizeof(dt), "%Y-%m-%d %H:%M:%S", &tm); - + if (jr->RealEndTime == 0 || jr->RealEndTime < jr->EndTime) { jr->RealEndTime = jr->EndTime; } @@ -174,8 +173,8 @@ db_update_job_end_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) JobTDate = ttime; - db_lock(mdb); - Mmsg(mdb->cmd, + bdb_lock(); + Mmsg(cmd, "UPDATE Job SET JobStatus='%c',EndTime='%s'," "ClientId=%u,JobBytes=%s,ReadBytes=%s,JobFiles=%u,JobErrors=%u,VolSessionId=%u," "VolSessionTime=%u,PoolId=%u,FileSetId=%u,JobTDate=%s," @@ -187,9 +186,9 @@ db_update_job_end_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) rdt, PriorJobId, jr->HasBase, jr->PurgedFiles, edit_int64(jr->JobId, ed3)); - stat = UPDATE_DB(jcr, mdb, mdb->cmd); + stat = UpdateDB(jcr, cmd); - db_unlock(mdb); + bdb_unlock(); return stat; } @@ -198,8 +197,7 @@ db_update_job_end_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) * Returns: 0 on failure * 1 on success */ -int -db_update_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cr) +int BDB::bdb_update_client_record(JCR *jcr, CLIENT_DBR *cr) { int stat; char ed1[50], ed2[50]; @@ -207,16 +205,16 @@ db_update_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cr) char esc_uname[MAX_ESCAPE_NAME_LENGTH]; CLIENT_DBR tcr; - db_lock(mdb); + bdb_lock(); memcpy(&tcr, cr, sizeof(tcr)); - if (!db_create_client_record(jcr, mdb, &tcr)) { - db_unlock(mdb); + if (!bdb_create_client_record(jcr, &tcr)) { + bdb_unlock(); return 0; } - mdb->db_escape_string(jcr, esc_name, cr->Name, strlen(cr->Name)); - mdb->db_escape_string(jcr, esc_uname, cr->Uname, strlen(cr->Uname)); - Mmsg(mdb->cmd, + bdb_escape_string(jcr, esc_name, cr->Name, strlen(cr->Name)); + bdb_escape_string(jcr, esc_uname, cr->Uname, strlen(cr->Uname)); + Mmsg(cmd, "UPDATE Client SET AutoPrune=%d,FileRetention=%s,JobRetention=%s," "Uname='%s' WHERE Name='%s'", cr->AutoPrune, @@ -224,8 +222,8 @@ db_update_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cr) edit_uint64(cr->JobRetention, ed2), esc_uname, esc_name); - stat = UPDATE_DB(jcr, mdb, mdb->cmd); - db_unlock(mdb); + stat = UpdateDB(jcr, cmd); + bdb_unlock(); return stat; } @@ -235,37 +233,37 @@ db_update_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cr) * Returns: 0 on failure * 1 on success */ -int db_update_counter_record(JCR *jcr, B_DB *mdb, COUNTER_DBR *cr) +int BDB::bdb_update_counter_record(JCR *jcr, COUNTER_DBR *cr) { char esc[MAX_ESCAPE_NAME_LENGTH]; - db_lock(mdb); - mdb->db_escape_string(jcr, esc, cr->Counter, strlen(cr->Counter)); - Mmsg(mdb->cmd, - update_counter_values[mdb->db_get_type_index()], - cr->MinValue, cr->MaxValue, cr->CurrentValue, - cr->WrapCounter, esc); - - int stat = UPDATE_DB(jcr, mdb, mdb->cmd); - db_unlock(mdb); + + bdb_lock(); + bdb_escape_string(jcr, esc, cr->Counter, strlen(cr->Counter)); + Mmsg(cmd, update_counter_values[bdb_get_type_index()], + cr->MinValue, cr->MaxValue, cr->CurrentValue, + cr->WrapCounter, esc); + + int stat = UpdateDB(jcr, cmd); + bdb_unlock(); return stat; } -int db_update_pool_record(JCR *jcr, B_DB *mdb, POOL_DBR *pr) +int BDB::bdb_update_pool_record(JCR *jcr, POOL_DBR *pr) { int stat; char ed1[50], ed2[50], ed3[50], ed4[50], ed5[50], ed6[50]; char esc[MAX_ESCAPE_NAME_LENGTH]; - db_lock(mdb); - mdb->db_escape_string(jcr, esc, pr->LabelFormat, strlen(pr->LabelFormat)); + bdb_lock(); + bdb_escape_string(jcr, esc, pr->LabelFormat, strlen(pr->LabelFormat)); - Mmsg(mdb->cmd, "SELECT count(*) from Media WHERE PoolId=%s", + Mmsg(cmd, "SELECT count(*) from Media WHERE PoolId=%s", edit_int64(pr->PoolId, ed4)); - pr->NumVols = get_sql_record_max(jcr, mdb); + pr->NumVols = get_sql_record_max(jcr, this); Dmsg1(400, "NumVols=%d\n", pr->NumVols); - Mmsg(mdb->cmd, + Mmsg(cmd, "UPDATE Pool SET NumVols=%u,MaxVols=%u,UseOnce=%d,UseCatalog=%d," "AcceptAnyVolume=%d,VolRetention='%s',VolUseDuration='%s'," "MaxVolJobs=%u,MaxVolFiles=%u,MaxVolBytes=%s,Recycle=%d," @@ -281,22 +279,22 @@ int db_update_pool_record(JCR *jcr, B_DB *mdb, POOL_DBR *pr) edit_int64(pr->ScratchPoolId,ed6), pr->ActionOnPurge, ed4); - stat = UPDATE_DB(jcr, mdb, mdb->cmd); - db_unlock(mdb); + stat = UpdateDB(jcr, cmd); + bdb_unlock(); return stat; } -bool -db_update_storage_record(JCR *jcr, B_DB *mdb, STORAGE_DBR *sr) +bool BDB::bdb_update_storage_record(JCR *jcr, STORAGE_DBR *sr) { int stat; char ed1[50]; - db_lock(mdb); - Mmsg(mdb->cmd, "UPDATE Storage SET AutoChanger=%d WHERE StorageId=%s", + + bdb_lock(); + Mmsg(cmd, "UPDATE Storage SET AutoChanger=%d WHERE StorageId=%s", sr->AutoChanger, edit_int64(sr->StorageId, ed1)); - stat = UPDATE_DB(jcr, mdb, mdb->cmd); - db_unlock(mdb); + stat = UpdateDB(jcr, cmd); + bdb_unlock(); return stat; } @@ -307,33 +305,32 @@ db_update_storage_record(JCR *jcr, B_DB *mdb, STORAGE_DBR *sr) * Returns: 0 on failure * numrows on success */ -int -db_update_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) +int BDB::bdb_update_media_record(JCR *jcr, MEDIA_DBR *mr) { char dt[MAX_TIME_LENGTH]; time_t ttime; struct tm tm; int stat; - char ed1[50], ed4[50]; + char ed1[50], ed2[50], ed3[50], ed4[50]; char ed5[50], ed6[50], ed7[50], ed8[50]; char ed9[50], ed10[50], ed11[50], ed12[50]; - char ed13[50]; + char ed13[50], ed14[50]; char esc_name[MAX_ESCAPE_NAME_LENGTH]; char esc_status[MAX_ESCAPE_NAME_LENGTH]; Dmsg1(100, "update_media: FirstWritten=%d\n", mr->FirstWritten); - db_lock(mdb); - mdb->db_escape_string(jcr, esc_name, mr->VolumeName, strlen(mr->VolumeName)); - mdb->db_escape_string(jcr, esc_status, mr->VolStatus, strlen(mr->VolStatus)); + bdb_lock(); + bdb_escape_string(jcr, esc_name, mr->VolumeName, strlen(mr->VolumeName)); + bdb_escape_string(jcr, esc_status, mr->VolStatus, strlen(mr->VolStatus)); if (mr->set_first_written) { Dmsg1(400, "Set FirstWritten Vol=%s\n", mr->VolumeName); ttime = mr->FirstWritten; (void)localtime_r(&ttime, &tm); strftime(dt, sizeof(dt), "%Y-%m-%d %H:%M:%S", &tm); - Mmsg(mdb->cmd, "UPDATE Media SET FirstWritten='%s'" + Mmsg(cmd, "UPDATE Media SET FirstWritten='%s'" " WHERE VolumeName='%s'", dt, esc_name); - stat = UPDATE_DB(jcr, mdb, mdb->cmd); + stat = UpdateDB(jcr, cmd); Dmsg1(400, "Firstwritten=%d\n", mr->FirstWritten); } @@ -345,18 +342,18 @@ db_update_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) } (void)localtime_r(&ttime, &tm); strftime(dt, sizeof(dt), "%Y-%m-%d %H:%M:%S", &tm); - Mmsg(mdb->cmd, "UPDATE Media SET LabelDate='%s' " + Mmsg(cmd, "UPDATE Media SET LabelDate='%s' " "WHERE VolumeName='%s'", dt, esc_name); - UPDATE_DB(jcr, mdb, mdb->cmd); + UpdateDB(jcr, cmd); } if (mr->LastWritten != 0) { ttime = mr->LastWritten; (void)localtime_r(&ttime, &tm); strftime(dt, sizeof(dt), "%Y-%m-%d %H:%M:%S", &tm); - Mmsg(mdb->cmd, "UPDATE Media Set LastWritten='%s' " + Mmsg(cmd, "UPDATE Media Set LastWritten='%s' " "WHERE VolumeName='%s'", dt, esc_name); - UPDATE_DB(jcr, mdb, mdb->cmd); + UpdateDB(jcr, cmd); } /* sanity checks for #1066 */ @@ -367,43 +364,47 @@ db_update_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) mr->VolWriteTime = 0; } - Mmsg(mdb->cmd, "UPDATE Media SET VolJobs=%u," - "VolFiles=%u,VolBlocks=%u,VolBytes=%s," - "VolMounts=%u,VolErrors=%u," - "VolWrites=%u,MaxVolBytes=%s,VolStatus='%s'," + Mmsg(cmd, "UPDATE Media SET VolJobs=%u," + "VolFiles=%u,VolBlocks=%u,VolBytes=%s,VolABytes=%s," + "VolHoleBytes=%s,VolHoles=%u,VolMounts=%u,VolErrors=%u," + "VolWrites=%s,MaxVolBytes=%s,VolStatus='%s'," "Slot=%d,InChanger=%d,VolReadTime=%s,VolWriteTime=%s,VolParts=%d," "LabelType=%d,StorageId=%s,PoolId=%s,VolRetention=%s,VolUseDuration=%s," "MaxVolJobs=%d,MaxVolFiles=%d,Enabled=%d,LocationId=%s," - "ScratchPoolId=%s,RecyclePoolId=%s,RecycleCount=%d,Recycle=%d,ActionOnPurge=%d" + "ScratchPoolId=%s,RecyclePoolId=%s,RecycleCount=%d,Recycle=%d," + "ActionOnPurge=%d" " WHERE VolumeName='%s'", mr->VolJobs, mr->VolFiles, mr->VolBlocks, edit_uint64(mr->VolBytes, ed1), - mr->VolMounts, mr->VolErrors, mr->VolWrites, - edit_uint64(mr->MaxVolBytes, ed4), + edit_uint64(mr->VolABytes, ed2), + edit_uint64(mr->VolHoleBytes, ed3), + mr->VolHoles, mr->VolMounts, mr->VolErrors, + edit_uint64(mr->VolWrites, ed4), + edit_uint64(mr->MaxVolBytes, ed5), esc_status, mr->Slot, mr->InChanger, - edit_int64(mr->VolReadTime, ed5), - edit_int64(mr->VolWriteTime, ed6), - mr->VolParts, + edit_int64(mr->VolReadTime, ed6), + edit_int64(mr->VolWriteTime, ed7), + mr->VolType, /* formerly VolParts */ mr->LabelType, - edit_int64(mr->StorageId, ed7), - edit_int64(mr->PoolId, ed8), - edit_uint64(mr->VolRetention, ed9), - edit_uint64(mr->VolUseDuration, ed10), + edit_int64(mr->StorageId, ed8), + edit_int64(mr->PoolId, ed9), + edit_uint64(mr->VolRetention, ed10), + edit_uint64(mr->VolUseDuration, ed11), mr->MaxVolJobs, mr->MaxVolFiles, - mr->Enabled, edit_uint64(mr->LocationId, ed11), - edit_uint64(mr->ScratchPoolId, ed12), - edit_uint64(mr->RecyclePoolId, ed13), + mr->Enabled, edit_uint64(mr->LocationId, ed12), + edit_uint64(mr->ScratchPoolId, ed13), + edit_uint64(mr->RecyclePoolId, ed14), mr->RecycleCount,mr->Recycle, mr->ActionOnPurge, esc_name); - Dmsg1(400, "%s\n", mdb->cmd); + Dmsg1(400, "%s\n", cmd); - stat = UPDATE_DB(jcr, mdb, mdb->cmd); + stat = UpdateDB(jcr, cmd); /* Make sure InChanger is 0 for any record having the same Slot */ - db_make_inchanger_unique(jcr, mdb, mr); + db_make_inchanger_unique(jcr, this, mr); - db_unlock(mdb); + bdb_unlock(); return stat; } @@ -413,17 +414,16 @@ db_update_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) * Returns: 0 on failure * numrows on success */ -int -db_update_media_defaults(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) +int BDB::bdb_update_media_defaults(JCR *jcr, MEDIA_DBR *mr) { int stat; char ed1[50], ed2[50], ed3[50], ed4[50], ed5[50]; char esc[MAX_ESCAPE_NAME_LENGTH]; - db_lock(mdb); + bdb_lock(); if (mr->VolumeName[0]) { - mdb->db_escape_string(jcr, esc, mr->VolumeName, strlen(mr->VolumeName)); - Mmsg(mdb->cmd, "UPDATE Media SET " + bdb_escape_string(jcr, esc, mr->VolumeName, strlen(mr->VolumeName)); + Mmsg(cmd, "UPDATE Media SET " "ActionOnPurge=%d, Recycle=%d,VolRetention=%s,VolUseDuration=%s," "MaxVolJobs=%u,MaxVolFiles=%u,MaxVolBytes=%s,RecyclePoolId=%s" " WHERE VolumeName='%s'", @@ -434,7 +434,7 @@ db_update_media_defaults(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) edit_uint64(mr->RecyclePoolId, ed4), esc); } else { - Mmsg(mdb->cmd, "UPDATE Media SET " + Mmsg(cmd, "UPDATE Media SET " "ActionOnPurge=%d, Recycle=%d,VolRetention=%s,VolUseDuration=%s," "MaxVolJobs=%u,MaxVolFiles=%u,MaxVolBytes=%s,RecyclePoolId=%s" " WHERE PoolId=%s", @@ -446,11 +446,11 @@ db_update_media_defaults(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) edit_int64(mr->PoolId, ed5)); } - Dmsg1(400, "%s\n", mdb->cmd); + Dmsg1(400, "%s\n", cmd); - stat = UPDATE_DB(jcr, mdb, mdb->cmd); + stat = UpdateDB(jcr, cmd); - db_unlock(mdb); + bdb_unlock(); return stat; } @@ -461,35 +461,54 @@ db_update_media_defaults(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) * * This routine assumes the database is already locked. */ -void -db_make_inchanger_unique(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) +void BDB::bdb_make_inchanger_unique(JCR *jcr, MEDIA_DBR *mr) { char ed1[50], ed2[50]; char esc[MAX_ESCAPE_NAME_LENGTH]; - if (mr->InChanger != 0 && mr->Slot != 0 && mr->StorageId != 0) { + if (mr->InChanger != 0 && mr->Slot != 0 && mr->StorageId != 0) { if (mr->MediaId != 0) { - Mmsg(mdb->cmd, "UPDATE Media SET InChanger=0, Slot=0 WHERE " + Mmsg(cmd, "UPDATE Media SET InChanger=0, Slot=0 WHERE " "Slot=%d AND StorageId=%s AND MediaId!=%s", mr->Slot, edit_int64(mr->StorageId, ed1), edit_int64(mr->MediaId, ed2)); } else if (*mr->VolumeName) { - mdb->db_escape_string(jcr, esc,mr->VolumeName,strlen(mr->VolumeName)); - Mmsg(mdb->cmd, "UPDATE Media SET InChanger=0, Slot=0 WHERE " + bdb_escape_string(jcr, esc,mr->VolumeName,strlen(mr->VolumeName)); + Mmsg(cmd, "UPDATE Media SET InChanger=0, Slot=0 WHERE " "Slot=%d AND StorageId=%s AND VolumeName!='%s'", mr->Slot, edit_int64(mr->StorageId, ed1), esc); } else { /* used by ua_label to reset all volume with this slot */ - Mmsg(mdb->cmd, "UPDATE Media SET InChanger=0, Slot=0 WHERE " + Mmsg(cmd, "UPDATE Media SET InChanger=0, Slot=0 WHERE " "Slot=%d AND StorageId=%s", mr->Slot, edit_int64(mr->StorageId, ed1), mr->VolumeName); } - Dmsg1(100, "%s\n", mdb->cmd); - UPDATE_DB(jcr, mdb, mdb->cmd); + Dmsg1(100, "%s\n", cmd); + UpdateDB(jcr, cmd); } } +/* Update only Retention */ +bool BDB::bdb_update_snapshot_record(JCR *jcr, SNAPSHOT_DBR *sr) +{ + int stat, len; + char ed1[50], ed2[50]; + + len = strlen(sr->Comment); + bdb_lock(); + + esc_name = check_pool_memory_size(esc_name, len*2+1); + bdb_escape_string(jcr, esc_name, sr->Comment, len); + + Mmsg(cmd, "UPDATE Snapshot SET Retention=%s, Comment='%s' WHERE SnapshotId=%s", + edit_int64(sr->Retention, ed2), sr->Comment, edit_int64(sr->SnapshotId, ed1)); + + stat = UpdateDB(jcr, cmd); + bdb_unlock(); + return stat; +} + #endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL */ diff --git a/bacula/src/cats/sqlite.c b/bacula/src/cats/sqlite.c index ca222e9b9e..c47899c448 100644 --- a/bacula/src/cats/sqlite.c +++ b/bacula/src/cats/sqlite.c @@ -1,736 +1,739 @@ -/* - Bacula® - The Network Backup Solution +/* + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ -/* - * Bacula Catalog Database routines specific to SQLite - * - * Written by Kern Sibbald, January 2002 - * - * Add class wrapper Marco van Wieringen, January 2010 - */ - -#include "bacula.h" - -#if HAVE_SQLITE3 - -#include "cats.h" -#include "bdb_priv.h" -#include -#include "bdb_sqlite.h" - -/* ----------------------------------------------------------------------- - * - * SQLite dependent defines and subroutines - * - * ----------------------------------------------------------------------- - */ - -/* - * List of open databases - */ -static dlist *db_list = NULL; - -static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; - -/* - * When using mult_db_connections = true, - * sqlite can be BUSY. We just need sleep a little in this case. - */ -static int sqlite_busy_handler(void *arg, int calls) -{ - bmicrosleep(0, 500); - return 1; -} - -B_DB_SQLITE::B_DB_SQLITE(JCR *jcr, - const char *db_driver, - const char *db_name, - const char *db_user, - const char *db_password, - const char *db_address, - int db_port, - const char *db_socket, - bool mult_db_connections, - bool disable_batch_insert) -{ - /* - * Initialize the parent class members. - */ - m_db_interface_type = SQL_INTERFACE_TYPE_SQLITE3; - m_db_type = SQL_TYPE_SQLITE3; - m_db_driver = bstrdup("SQLite3"); - m_db_name = bstrdup(db_name); - if (disable_batch_insert) { - m_disabled_batch_insert = true; - m_have_batch_insert = false; - } else { - m_disabled_batch_insert = false; -#if defined(USE_BATCH_FILE_INSERT) -#if defined(HAVE_SQLITE3_THREADSAFE) - m_have_batch_insert = sqlite3_threadsafe(); -#else - m_have_batch_insert = false; -#endif /* HAVE_SQLITE3_THREADSAFE */ -#else - m_have_batch_insert = false; -#endif /* USE_BATCH_FILE_INSERT */ - } - errmsg = get_pool_memory(PM_EMSG); /* get error message buffer */ - *errmsg = 0; - cmd = get_pool_memory(PM_EMSG); /* get command buffer */ - cached_path = get_pool_memory(PM_FNAME); - cached_path_id = 0; - m_ref_count = 1; - fname = get_pool_memory(PM_FNAME); - path = get_pool_memory(PM_FNAME); - esc_name = get_pool_memory(PM_FNAME); - esc_path = get_pool_memory(PM_FNAME); - esc_obj = get_pool_memory(PM_FNAME); - m_allow_transactions = mult_db_connections; - - /* At this time, when mult_db_connections == true, this is for - * specific console command such as bvfs or batch mode, and we don't - * want to share a batch mode or bvfs. In the future, we can change - * the creation function to add this parameter. - */ - m_dedicated = mult_db_connections; - - /* - * Initialize the private members. - */ - m_db_handle = NULL; - m_result = NULL; - m_sqlite_errmsg = NULL; - - /* - * Put the db in the list. - */ - if (db_list == NULL) { - db_list = New(dlist(this, &this->m_link)); - } - db_list->append(this); -} - -B_DB_SQLITE::~B_DB_SQLITE() -{ -} - -/* - * Now actually open the database. This can generate errors, - * which are returned in the errmsg - * - * DO NOT close the database or delete mdb here !!!! - */ -bool B_DB_SQLITE::db_open_database(JCR *jcr) -{ - bool retval = false; - char *db_path; - int len; - struct stat statbuf; - int ret; - int errstat; - int retry = 0; - - P(mutex); - if (m_connected) { - retval = true; - goto bail_out; - } - - if ((errstat=rwl_init(&m_lock)) != 0) { - berrno be; - Mmsg1(&errmsg, _("Unable to initialize DB lock. ERR=%s\n"), - be.bstrerror(errstat)); - goto bail_out; - } - - /* - * Open the database - */ - len = strlen(working_directory) + strlen(m_db_name) + 5; - db_path = (char *)malloc(len); - strcpy(db_path, working_directory); - strcat(db_path, "/"); - strcat(db_path, m_db_name); - strcat(db_path, ".db"); - if (stat(db_path, &statbuf) != 0) { - Mmsg1(&errmsg, _("Database %s does not exist, please create it.\n"), - db_path); - free(db_path); - goto bail_out; - } - - for (m_db_handle = NULL; !m_db_handle && retry++ < 10; ) { - ret = sqlite3_open(db_path, &m_db_handle); - if (ret != SQLITE_OK) { - m_sqlite_errmsg = (char *)sqlite3_errmsg(m_db_handle); - sqlite3_close(m_db_handle); - m_db_handle = NULL; - } else { - m_sqlite_errmsg = NULL; - } - - Dmsg0(300, "sqlite_open\n"); - if (!m_db_handle) { - bmicrosleep(1, 0); - } - } - if (m_db_handle == NULL) { - Mmsg2(&errmsg, _("Unable to open Database=%s. ERR=%s\n"), - db_path, m_sqlite_errmsg ? m_sqlite_errmsg : _("unknown")); - free(db_path); - goto bail_out; - } - m_connected = true; - free(db_path); - - /* - * Set busy handler to wait when we use mult_db_connections = true - */ - sqlite3_busy_handler(m_db_handle, sqlite_busy_handler, NULL); - -#if defined(SQLITE3_INIT_QUERY) - sql_query(SQLITE3_INIT_QUERY); -#endif - - if (!check_tables_version(jcr, this)) { - goto bail_out; - } - retval = true; - -bail_out: - V(mutex); - return retval; -} - -void B_DB_SQLITE::db_close_database(JCR *jcr) -{ - if (m_connected) { - db_end_transaction(jcr); - } - P(mutex); - m_ref_count--; - if (m_ref_count == 0) { - if (m_connected) { - sql_free_result(); - } - db_list->remove(this); - if (m_connected && m_db_handle) { - sqlite3_close(m_db_handle); - } - if (rwl_is_init(&m_lock)) { - rwl_destroy(&m_lock); - } - free_pool_memory(errmsg); - free_pool_memory(cmd); - free_pool_memory(cached_path); - free_pool_memory(fname); - free_pool_memory(path); - free_pool_memory(esc_name); - free_pool_memory(esc_path); - free_pool_memory(esc_obj); - if (m_db_driver) { - free(m_db_driver); - } - if (m_db_name) { - free(m_db_name); - } - delete this; - if (db_list->size() == 0) { - delete db_list; - db_list = NULL; - } - } - V(mutex); -} - -void B_DB_SQLITE::db_thread_cleanup(void) -{ - sqlite3_thread_cleanup(); -} - -/* - * Escape strings so that SQLite is happy - * - * NOTE! len is the length of the old string. Your new - * string must be long enough (max 2*old+1) to hold - * the escaped output. - */ -void B_DB_SQLITE::db_escape_string(JCR *jcr, char *snew, char *old, int len) -{ - char *n, *o; - - n = snew; - o = old; - while (len--) { - switch (*o) { - case '\'': - *n++ = '\''; - *n++ = '\''; - o++; - break; - case 0: - *n++ = '\\'; - *n++ = 0; - o++; - break; - default: - *n++ = *o++; - break; - } - } - *n = 0; -} - -/* - * Escape binary object so that SQLite is happy - * Memory is stored in B_DB struct, no need to free it - * - * TODO: this should be implemented (escape \0) - */ -char *B_DB_SQLITE::db_escape_object(JCR *jcr, char *old, int len) -{ - int l; - int max = len*2; /* TODO: too big, should be *4/3 */ - - esc_obj = check_pool_memory_size(esc_obj, max); - l = bin_to_base64(esc_obj, max, old, len, true); - esc_obj[l] = 0; - ASSERT(l < max); /* TODO: add check for l */ - - return esc_obj; -} - -/* - * Unescape binary object so that SQLIte is happy - * - * TODO: need to be implemented (escape \0) - */ - -void B_DB_SQLITE::db_unescape_object(JCR *jcr, char *from, int32_t expected_len, - POOLMEM **dest, int32_t *dest_len) -{ - if (!from) { - *dest[0] = 0; - *dest_len = 0; - return; - } - *dest = check_pool_memory_size(*dest, expected_len+1); - base64_to_bin(*dest, expected_len+1, from, strlen(from)); - *dest_len = expected_len; - (*dest)[expected_len]=0; -} - -/* - * Start a transaction. This groups inserts and makes things - * much more efficient. Usually started when inserting - * file attributes. - */ -void B_DB_SQLITE::db_start_transaction(JCR *jcr) -{ - if (!jcr->attr) { - jcr->attr = get_pool_memory(PM_FNAME); - } - if (!jcr->ar) { - jcr->ar = (ATTR_DBR *)malloc(sizeof(ATTR_DBR)); - } - - if (!m_allow_transactions) { - return; - } - - db_lock(this); - /* - * Allow only 10,000 changes per transaction - */ - if (m_transaction && changes > 10000) { - db_end_transaction(jcr); - } - if (!m_transaction) { - sql_query("BEGIN"); /* begin transaction */ - Dmsg0(400, "Start SQLite transaction\n"); - m_transaction = true; - } - db_unlock(this); -} - -void B_DB_SQLITE::db_end_transaction(JCR *jcr) -{ - if (jcr && jcr->cached_attribute) { - Dmsg0(400, "Flush last cached attribute.\n"); - if (!db_create_attributes_record(jcr, this, jcr->ar)) { - Jmsg1(jcr, M_FATAL, 0, _("Attribute create error. %s"), db_strerror(jcr->db)); - } - jcr->cached_attribute = false; - } - - if (!m_allow_transactions) { - return; - } - - db_lock(this); - if (m_transaction) { - sql_query("COMMIT"); /* end transaction */ - m_transaction = false; - Dmsg1(400, "End SQLite transaction changes=%d\n", changes); - } - changes = 0; - db_unlock(this); -} - -struct rh_data { - B_DB_SQLITE *mdb; - DB_RESULT_HANDLER *result_handler; - void *ctx; - bool initialized; -}; - -/* - * Convert SQLite's callback into Bacula DB callback - */ -static int sqlite_result_handler(void *arh_data, int num_fields, char **rows, char **col_names) -{ - struct rh_data *rh_data = (struct rh_data *)arh_data; - - /* The db_sql_query doesn't have access to m_results, so if we wan't to get - * fields information, we need to use col_names - */ - if (!rh_data->initialized) { - rh_data->mdb->set_column_names(col_names, num_fields); - rh_data->initialized = true; - } - if (rh_data->result_handler) { - (*(rh_data->result_handler))(rh_data->ctx, num_fields, rows); - } - - return 0; -} - -/* - * Submit a general SQL command (cmd), and for each row returned, - * the result_handler is called with the ctx. - */ -bool B_DB_SQLITE::db_sql_query(const char *query, DB_RESULT_HANDLER *result_handler, void *ctx) -{ - bool retval = false; - int stat; - struct rh_data rh_data; - - Dmsg1(500, "db_sql_query starts with '%s'\n", query); - - db_lock(this); - if (m_sqlite_errmsg) { - sqlite3_free(m_sqlite_errmsg); - m_sqlite_errmsg = NULL; - } - sql_free_result(); - - rh_data.ctx = ctx; - rh_data.mdb = this; - rh_data.initialized = false; - rh_data.result_handler = result_handler; - - stat = sqlite3_exec(m_db_handle, query, sqlite_result_handler, - (void *)&rh_data, &m_sqlite_errmsg); - - if (stat != SQLITE_OK) { - Mmsg(errmsg, _("Query failed: %s: ERR=%s\n"), query, sql_strerror()); - Dmsg0(500, "db_sql_query finished\n"); - goto bail_out; - } - Dmsg0(500, "db_sql_query finished\n"); - sql_free_result(); - retval = true; - -bail_out: - db_unlock(this); - return retval; -} - -/* - * Submit a sqlite query and retrieve all the data - */ -bool B_DB_SQLITE::sql_query(const char *query, int flags) -{ - int stat; - bool retval = false; - - Dmsg1(500, "sql_query starts with '%s'\n", query); - - sql_free_result(); - if (m_sqlite_errmsg) { - sqlite3_free(m_sqlite_errmsg); - m_sqlite_errmsg = NULL; - } - - stat = sqlite3_get_table(m_db_handle, (char *)query, &m_result, - &m_num_rows, &m_num_fields, &m_sqlite_errmsg); - - m_row_number = 0; /* no row fetched */ - if (stat != 0) { /* something went wrong */ - m_num_rows = m_num_fields = 0; - Dmsg0(500, "sql_query finished\n"); - } else { - Dmsg0(500, "sql_query finished\n"); - retval = true; - } - return retval; -} - -void B_DB_SQLITE::sql_free_result(void) -{ - db_lock(this); - if (m_fields) { - free(m_fields); - m_fields = NULL; - } - if (m_result) { - sqlite3_free_table(m_result); - m_result = NULL; - } - m_col_names = NULL; - m_num_rows = m_num_fields = 0; - db_unlock(this); -} - -/* - * Fetch one row at a time - */ -SQL_ROW B_DB_SQLITE::sql_fetch_row(void) -{ - if (!m_result || (m_row_number >= m_num_rows)) { - return NULL; - } - m_row_number++; - return &m_result[m_num_fields * m_row_number]; -} - -const char *B_DB_SQLITE::sql_strerror(void) -{ - return m_sqlite_errmsg ? m_sqlite_errmsg : "unknown"; -} - -void B_DB_SQLITE::sql_data_seek(int row) -{ - /* - * Set the row number to be returned on the next call to sql_fetch_row - */ - m_row_number = row; -} - -int B_DB_SQLITE::sql_affected_rows(void) -{ - return sqlite3_changes(m_db_handle); -} - -uint64_t B_DB_SQLITE::sql_insert_autokey_record(const char *query, const char *table_name) -{ - /* - * First execute the insert query and then retrieve the currval. - */ - if (!sql_query(query)) { - return 0; - } - - m_num_rows = sql_affected_rows(); - if (m_num_rows != 1) { - return 0; - } - - changes++; - - return sqlite3_last_insert_rowid(m_db_handle); -} - -SQL_FIELD *B_DB_SQLITE::sql_fetch_field(void) -{ - int i, j, len; - - /* We are in the middle of a db_sql_query and we want to get fields info */ - if (m_col_names != NULL) { - if (m_num_fields > m_field_number) { - m_sql_field.name = m_col_names[m_field_number]; - /* We don't have the maximum field length, so we can use 80 as - * estimation. - */ - len = MAX(cstrlen(m_sql_field.name), 80/m_num_fields); - m_sql_field.max_length = len; - - m_field_number++; - m_sql_field.type = 0; /* not numeric */ - m_sql_field.flags = 1; /* not null */ - return &m_sql_field; - } else { /* too much fetch_field() */ - return NULL; - } - } - - /* We are after a sql_query() that stores the result in m_results */ - if (!m_fields || m_fields_size < m_num_fields) { - if (m_fields) { - free(m_fields); - m_fields = NULL; - } - Dmsg1(500, "allocating space for %d fields\n", m_num_fields); - m_fields = (SQL_FIELD *)malloc(sizeof(SQL_FIELD) * m_num_fields); - m_fields_size = m_num_fields; - - for (i = 0; i < m_num_fields; i++) { - Dmsg1(500, "filling field %d\n", i); - m_fields[i].name = m_result[i]; - m_fields[i].max_length = cstrlen(m_fields[i].name); - for (j = 1; j <= m_num_rows; j++) { - if (m_result[i + m_num_fields * j]) { - len = (uint32_t)cstrlen(m_result[i + m_num_fields * j]); - } else { - len = 0; - } - if (len > m_fields[i].max_length) { - m_fields[i].max_length = len; - } - } - m_fields[i].type = 0; - m_fields[i].flags = 1; /* not null */ - - Dmsg4(500, "sql_fetch_field finds field '%s' has length='%d' type='%d' and IsNull=%d\n", - m_fields[i].name, m_fields[i].max_length, m_fields[i].type, m_fields[i].flags); - } - } - - /* - * Increment field number for the next time around - */ - return &m_fields[m_field_number++]; -} - -bool B_DB_SQLITE::sql_field_is_not_null(int field_type) -{ - switch (field_type) { - case 1: - return true; - default: - return false; - } -} - -bool B_DB_SQLITE::sql_field_is_numeric(int field_type) -{ - switch (field_type) { - case 1: - return true; - default: - return false; - } -} - -/* - * Returns true if OK - * false if failed - */ -bool B_DB_SQLITE::sql_batch_start(JCR *jcr) -{ - bool retval; - - db_lock(this); - retval = sql_query("CREATE TEMPORARY TABLE batch (" - "FileIndex integer," - "JobId integer," - "Path blob," - "Name blob," - "LStat tinyblob," - "MD5 tinyblob," - "DeltaSeq integer)"); - db_unlock(this); - - return retval; -} - -/* set error to something to abort operation */ -/* - * Returns true if OK - * false if failed - */ -bool B_DB_SQLITE::sql_batch_end(JCR *jcr, const char *error) -{ - m_status = 0; - - return true; -} - -/* - * Returns true if OK - * false if failed - */ -bool B_DB_SQLITE::sql_batch_insert(JCR *jcr, ATTR_DBR *ar) -{ - const char *digest; - char ed1[50]; - - esc_name = check_pool_memory_size(esc_name, fnl*2+1); - db_escape_string(jcr, esc_name, fname, fnl); - - esc_path = check_pool_memory_size(esc_path, pnl*2+1); - db_escape_string(jcr, esc_path, path, pnl); - - if (ar->Digest == NULL || ar->Digest[0] == 0) { - digest = "0"; - } else { - digest = ar->Digest; - } - - Mmsg(cmd, "INSERT INTO batch VALUES " - "(%u,%s,'%s','%s','%s','%s',%u)", - ar->FileIndex, edit_int64(ar->JobId,ed1), esc_path, - esc_name, ar->attr, digest, ar->DeltaSeq); - - return sql_query(cmd); -} - -/* - * Initialize database data structure. In principal this should - * never have errors, or it is really fatal. - */ -B_DB *db_init_database(JCR *jcr, const char *db_driver, const char *db_name, - const char *db_user, const char *db_password, - const char *db_address, int db_port, - const char *db_socket, bool mult_db_connections, - bool disable_batch_insert) -{ - B_DB *mdb = NULL; - - P(mutex); /* lock DB queue */ - /* - * Look to see if DB already open - */ - if (db_list && !mult_db_connections) { - foreach_dlist(mdb, db_list) { - if (mdb->db_match_database(db_driver, db_name, db_address, db_port)) { - Dmsg1(300, "DB REopen %s\n", db_name); - mdb->increment_refcount(); - goto bail_out; - } - } - } - Dmsg0(300, "db_init_database first time\n"); - mdb = New(B_DB_SQLITE(jcr, db_driver, db_name, db_user, db_password, - db_address, db_port, db_socket, mult_db_connections, - disable_batch_insert)); - -bail_out: - V(mutex); - return mdb; -} - -#endif /* HAVE_SQLITE3 */ + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. +*/ +/* + * Bacula Catalog Database routines specific to SQLite + * + * Written by Kern Sibbald, January 2002 + * + * Note: at one point, this file was changed to class based by a certain + * programmer, and other than "wrapping" in a class, which is a trivial + * change for a C++ programmer, nothing substantial was done, yet all the + * code was recommitted under this programmer's name. Consequently, we + * undo those changes here. + */ + +#include "bacula.h" + +#if HAVE_SQLITE3 + +#include "cats.h" +#include +#define __BDB_SQLITE_H_ 1 +#include "bdb_sqlite.h" + +/* ----------------------------------------------------------------------- + * + * SQLite dependent defines and subroutines + * + * ----------------------------------------------------------------------- + */ + +/* List of open databases */ +static dlist *db_list = NULL; + +static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; + +/* + * When using mult_db_connections + * sqlite can be BUSY. We just need sleep a little in this case. + */ +static int my_sqlite_busy_handler(void *arg, int calls) +{ + bmicrosleep(0, 500); + return 1; +} + +BDB_SQLITE::BDB_SQLITE() +{ + BDB_SQLITE *mdb = this; + + if (db_list == NULL) { + db_list = New(dlist(mdb, &mdb->m_link)); + } + mdb->m_db_driver_type = SQL_DRIVER_TYPE_SQLITE3; + mdb->m_db_type = SQL_TYPE_SQLITE3; + mdb->m_db_driver = bstrdup("SQLite3"); + + mdb->errmsg = get_pool_memory(PM_EMSG); /* get error message buffer */ + mdb->errmsg[0] = 0; + mdb->cmd = get_pool_memory(PM_EMSG); /* get command buffer */ + mdb->cached_path = get_pool_memory(PM_FNAME); + mdb->cached_path_id = 0; + mdb->m_ref_count = 1; + mdb->fname = get_pool_memory(PM_FNAME); + mdb->path = get_pool_memory(PM_FNAME); + mdb->esc_name = get_pool_memory(PM_FNAME); + mdb->esc_path = get_pool_memory(PM_FNAME); + mdb->esc_obj = get_pool_memory(PM_FNAME); + mdb->m_use_fatal_jmsg = true; + + /* Initialize the private members. */ + mdb->m_db_handle = NULL; + mdb->m_result = NULL; + mdb->m_sqlite_errmsg = NULL; + + db_list->append(this); +} + +BDB_SQLITE::~BDB_SQLITE() +{ +} + +/* + * Initialize database data structure. In principal this should + * never have errors, or it is really fatal. + */ +BDB *db_init_database(JCR *jcr, const char *db_driver, const char *db_name, + const char *db_user, const char *db_password, + const char *db_address, int db_port, + const char *db_socket, bool mult_db_connections, + bool disable_batch_insert) +{ + BDB_SQLITE *mdb = NULL; + + P(mutex); /* lock DB queue */ + /* + * Look to see if DB already open + */ + if (db_list && !mult_db_connections) { + foreach_dlist(mdb, db_list) { + if (mdb->bdb_match_database(db_driver, db_name, db_address, db_port)) { + Dmsg1(300, "DB REopen %s\n", db_name); + mdb->increment_refcount(); + goto bail_out; + } + } + } + Dmsg0(300, "db_init_database first time\n"); + mdb = New(BDB_SQLITE()); + + mdb->m_db_name = bstrdup(db_name); + if (disable_batch_insert) { + mdb->m_disabled_batch_insert = true; + mdb->m_have_batch_insert = false; + } else { + mdb->m_disabled_batch_insert = false; +#ifdef USE_BATCH_FILE_INSERT +#ifdef HAVE_SQLITE3_THREADSAFE + mdb->m_have_batch_insert = sqlite3_threadsafe(); +#else + mdb->m_have_batch_insert = false; +#endif /* HAVE_SQLITE3_THREADSAFE */ +#else + mdb->m_have_batch_insert = false; +#endif /* USE_BATCH_FILE_INSERT */ + } + mdb->m_allow_transactions = mult_db_connections; + + /* At this time, when mult_db_connections == true, this is for + * specific console command such as bvfs or batch mode, and we don't + * want to share a batch mode or bvfs. In the future, we can change + * the creation function to add this parameter. + */ + mdb->m_dedicated = mult_db_connections; + +bail_out: + V(mutex); + return mdb; +} + + +/* + * Now actually open the database. This can generate errors, + * which are returned in the errmsg + * + * DO NOT close the database or delete mdb here !!!! + */ +bool BDB_SQLITE::bdb_open_database(JCR *jcr) +{ + bool retval = false; + char *db_file; + int len; + struct stat statbuf; + int ret; + int errstat; + int retry = 0; + int64_t starttime; + BDB_SQLITE *mdb = this; + + P(mutex); + if (mdb->m_connected) { + retval = true; + goto bail_out; + } + + if ((errstat=rwl_init(&mdb->m_lock)) != 0) { + berrno be; + Mmsg1(&mdb->errmsg, _("Unable to initialize DB lock. ERR=%s\n"), + be.bstrerror(errstat)); + goto bail_out; + } + + /* + * Open the database + */ + len = strlen(working_directory) + strlen(mdb->m_db_name) + 5; + db_file = (char *)malloc(len); + strcpy(db_file, working_directory); + strcat(db_file, "/"); + strcat(db_file, m_db_name); + strcat(db_file, ".db"); + if (stat(db_file, &statbuf) != 0) { + Mmsg1(&mdb->errmsg, _("Database %s does not exist, please create it.\n"), + db_file); + free(db_file); + goto bail_out; + } + + for (mdb->m_db_handle = NULL; !mdb->m_db_handle && retry++ < 10; ) { + ret = sqlite3_open(db_file, &mdb->m_db_handle); + if (ret != SQLITE_OK) { + mdb->m_sqlite_errmsg = (char *)sqlite3_errmsg(mdb->m_db_handle); + sqlite3_close(mdb->m_db_handle); + mdb->m_db_handle = NULL; + } else { + mdb->m_sqlite_errmsg = NULL; + } + + Dmsg0(300, "sqlite_open\n"); + if (!mdb->m_db_handle) { + bmicrosleep(1, 0); + } + } + if (mdb->m_db_handle == NULL) { + Mmsg2(&mdb->errmsg, _("Unable to open Database=%s. ERR=%s\n"), + db_file, mdb->m_sqlite_errmsg ? mdb->m_sqlite_errmsg : _("unknown")); + free(db_file); + goto bail_out; + } + mdb->m_connected = true; + free(db_file); + + /* + * Set busy handler to wait when we use mult_db_connections = true + */ + sqlite3_busy_handler(mdb->m_db_handle, my_sqlite_busy_handler, NULL); + +#if defined(SQLITE3_INIT_QUERY) + sql_query(SQLITE3_INIT_QUERY); +#endif + + if (!bdb_check_version(jcr)) { + goto bail_out; + } + + retval = true; + +bail_out: + V(mutex); + return retval; +} + +void BDB_SQLITE::bdb_close_database(JCR *jcr) +{ + BDB_SQLITE *mdb = this; + + if (mdb->m_connected) { + bdb_end_transaction(jcr); + } + P(mutex); + mdb->m_ref_count--; + if (mdb->m_ref_count == 0) { + if (mdb->m_connected) { + sql_free_result(); + } + db_list->remove(mdb); + if (mdb->m_connected && mdb->m_db_handle) { + sqlite3_close(mdb->m_db_handle); + } + if (is_rwl_valid(&mdb->m_lock)) { + rwl_destroy(&mdb->m_lock); + } + free_pool_memory(mdb->errmsg); + free_pool_memory(mdb->cmd); + free_pool_memory(mdb->cached_path); + free_pool_memory(mdb->fname); + free_pool_memory(mdb->path); + free_pool_memory(mdb->esc_name); + free_pool_memory(mdb->esc_path); + free_pool_memory(mdb->esc_obj); + if (mdb->m_db_driver) { + free(mdb->m_db_driver); + } + if (mdb->m_db_name) { + free(mdb->m_db_name); + } + delete this; + if (db_list->size() == 0) { + delete db_list; + db_list = NULL; + } + } + V(mutex); +} + +void BDB_SQLITE::bdb_thread_cleanup(void) +{ + sqlite3_thread_cleanup(); +} + +/* + * Escape strings so SQLite is happy + * + * len is the length of the old string. Your new + * string must be long enough (max 2*old+1) to hold + * the escaped output. + */ +void BDB_SQLITE::bdb_escape_string(JCR *jcr, char *snew, char *sold, int len) +{ + char *n, *o; + + n = snew; + o = sold; + while (len--) { + switch (*o) { + case '\'': + *n++ = '\''; + *n++ = '\''; + o++; + break; + case 0: + *n++ = '\\'; + *n++ = 0; + o++; + break; + default: + *n++ = *o++; + break; + } + } + *n = 0; +} + +/* + * Escape binary object so that SQLite is happy + * Memory is stored in BDB struct, no need to free it + * + * TODO: this should be implemented (escape \0) + */ +char *BDB_SQLITE::bdb_escape_object(JCR *jcr, char *old, int len) +{ + int l; + int max = len*2; /* TODO: too big, should be *4/3 */ + + esc_obj = check_pool_memory_size(esc_obj, max); + l = bin_to_base64(esc_obj, max, old, len, true); + esc_obj[l] = 0; + ASSERT(l < max); /* TODO: add check for l */ + + return esc_obj; +} + +/* + * Unescape binary object so that SQLIte is happy + * + * TODO: need to be implemented (escape \0) + */ + +void BDB_SQLITE::bdb_unescape_object(JCR *jcr, char *from, int32_t expected_len, + POOLMEM **dest, int32_t *dest_len) +{ + if (!from) { + *dest[0] = 0; + *dest_len = 0; + return; + } + *dest = check_pool_memory_size(*dest, expected_len+1); + base64_to_bin(*dest, expected_len+1, from, strlen(from)); + *dest_len = expected_len; + (*dest)[expected_len] = 0; +} + +/* + * Start a transaction. This groups inserts and makes things + * more efficient. Usually started when inserting file attributes. + */ +void BDB_SQLITE::bdb_start_transaction(JCR *jcr) +{ + BDB_SQLITE *mdb = this; + + if (!jcr->attr) { + jcr->attr = get_pool_memory(PM_FNAME); + } + if (!jcr->ar) { + jcr->ar = (ATTR_DBR *)malloc(sizeof(ATTR_DBR)); + } + + if (!mdb->m_allow_transactions) { + return; + } + + bdb_lock(); + /* + * Allow only 10,000 changes per transaction + */ + if (mdb->m_transaction && mdb->changes > 10000) { + bdb_end_transaction(jcr); + } + if (!mdb->m_transaction) { + sql_query("BEGIN"); /* begin transaction */ + Dmsg0(400, "Start SQLite transaction\n"); + mdb->m_transaction = true; + } + bdb_unlock(); +} + +void BDB_SQLITE::bdb_end_transaction(JCR *jcr) +{ + BDB_SQLITE *mdb = this; + + if (jcr && jcr->cached_attribute) { + Dmsg0(400, "Flush last cached attribute.\n"); + if (!bdb_create_attributes_record(jcr, jcr->ar)) { + Jmsg1(jcr, M_FATAL, 0, _("Attribute create error. %s"), jcr->db->bdb_strerror()); + } + jcr->cached_attribute = false; + } + + if (!mdb->m_allow_transactions) { + return; + } + + bdb_lock(); + if (mdb->m_transaction) { + sql_query("COMMIT"); /* end transaction */ + mdb->m_transaction = false; + Dmsg1(400, "End SQLite transaction changes=%d\n", changes); + } + mdb->changes = 0; + bdb_unlock(); +} + +struct rh_data { + BDB_SQLITE *mdb; + DB_RESULT_HANDLER *result_handler; + void *ctx; + bool initialized; +}; + +/* + * Convert SQLite's callback into Bacula DB callback + */ +static int sqlite_result_handler(void *arh_data, int num_fields, char **rows, char **col_names) +{ + struct rh_data *rh_data = (struct rh_data *)arh_data; + + /* The db_sql_query doesn't have access to m_results, so if we wan't to get + * fields information, we need to use col_names + */ + if (!rh_data->initialized) { + rh_data->mdb->set_column_names(col_names, num_fields); + rh_data->initialized = true; + } + if (rh_data->result_handler) { + (*(rh_data->result_handler))(rh_data->ctx, num_fields, rows); + } + + return 0; +} + +/* + * Submit a general SQL command (cmd), and for each row returned, + * the result_handler is called with the ctx. + */ +bool BDB_SQLITE::bdb_sql_query(const char *query, DB_RESULT_HANDLER *result_handler, void *ctx) +{ + BDB_SQLITE *mdb = this; + bool retval = false; + int stat; + struct rh_data rh_data; + + Dmsg1(500, "db_sql_query starts with '%s'\n", query); + + bdb_lock(); + mdb->errmsg[0] = 0; + if (mdb->m_sqlite_errmsg) { + sqlite3_free(mdb->m_sqlite_errmsg); + mdb->m_sqlite_errmsg = NULL; + } + sql_free_result(); + + rh_data.ctx = ctx; + rh_data.mdb = this; + rh_data.initialized = false; + rh_data.result_handler = result_handler; + + stat = sqlite3_exec(m_db_handle, query, sqlite_result_handler, + (void *)&rh_data, &m_sqlite_errmsg); + + if (stat != SQLITE_OK) { + Mmsg(mdb->errmsg, _("Query failed: %s: ERR=%s\n"), query, sql_strerror()); + Dmsg0(500, "db_sql_query finished\n"); + goto bail_out; + } + Dmsg0(500, "db_sql_query finished\n"); + sql_free_result(); + retval = true; + +bail_out: + bdb_unlock(); + return retval; +} + +/* + * Submit a sqlite query and retrieve all the data + */ +bool BDB_SQLITE::sql_query(const char *query, int flags) +{ + int stat; + bool retval = false; + BDB_SQLITE *mdb = this; + + Dmsg1(500, "sql_query starts with '%s'\n", query); + + sql_free_result(); + if (mdb->m_sqlite_errmsg) { + sqlite3_free(mdb->m_sqlite_errmsg); + mdb->m_sqlite_errmsg = NULL; + } + + stat = sqlite3_get_table(m_db_handle, (char *)query, &m_result, + &m_num_rows, &m_num_fields, &m_sqlite_errmsg); + + mdb->m_row_number = 0; /* no row fetched */ + if (stat != 0) { /* something went wrong */ + mdb->m_num_rows = mdb->m_num_fields = 0; + Dmsg0(500, "sql_query finished\n"); + } else { + Dmsg0(500, "sql_query finished\n"); + retval = true; + } + return retval; +} + +void BDB_SQLITE::sql_free_result(void) +{ + BDB_SQLITE *mdb = this; + + bdb_lock(); + if (mdb->m_fields) { + free(mdb->m_fields); + mdb->m_fields = NULL; + } + if (mdb->m_result) { + sqlite3_free_table(mdb->m_result); + mdb->m_result = NULL; + } + mdb->m_col_names = NULL; + mdb->m_num_rows = mdb->m_num_fields = 0; + bdb_unlock(); +} + +/* + * Fetch one row at a time + */ +SQL_ROW BDB_SQLITE::sql_fetch_row(void) +{ + BDB_SQLITE *mdb = this; + if (!mdb->m_result || (mdb->m_row_number >= mdb->m_num_rows)) { + return NULL; + } + mdb->m_row_number++; + return &mdb->m_result[mdb->m_num_fields * mdb->m_row_number]; +} + +const char *BDB_SQLITE::sql_strerror(void) +{ + BDB_SQLITE *mdb = this; + return mdb->m_sqlite_errmsg ? mdb->m_sqlite_errmsg : "unknown"; +} + +void BDB_SQLITE::sql_data_seek(int row) +{ + BDB_SQLITE *mdb = this; + /* Set the row number to be returned on the next call to sql_fetch_row */ + mdb->m_row_number = row; +} + +int BDB_SQLITE::sql_affected_rows(void) +{ + BDB_SQLITE *mdb = this; + return sqlite3_changes(mdb->m_db_handle); +} + +uint64_t BDB_SQLITE::sql_insert_autokey_record(const char *query, const char *table_name) +{ + BDB_SQLITE *mdb = this; + /* First execute the insert query and then retrieve the currval. */ + if (!sql_query(query)) { + return 0; + } + + mdb->m_num_rows = sql_affected_rows(); + if (mdb->m_num_rows != 1) { + return 0; + } + + mdb->changes++; + + return sqlite3_last_insert_rowid(mdb->m_db_handle); +} + +SQL_FIELD *BDB_SQLITE::sql_fetch_field(void) +{ + BDB_SQLITE *mdb = this; + int i, j, len; + + /* We are in the middle of a db_sql_query and we want to get fields info */ + if (mdb->m_col_names != NULL) { + if (mdb->m_num_fields > mdb->m_field_number) { + mdb->m_sql_field.name = mdb->m_col_names[mdb->m_field_number]; + /* We don't have the maximum field length, so we can use 80 as + * estimation. + */ + len = MAX(cstrlen(mdb->m_sql_field.name), 80/mdb->m_num_fields); + mdb->m_sql_field.max_length = len; + + mdb->m_field_number++; + mdb->m_sql_field.type = 0; /* not numeric */ + mdb->m_sql_field.flags = 1; /* not null */ + return &mdb->m_sql_field; + } else { /* too much fetch_field() */ + return NULL; + } + } + + /* We are after a sql_query() that stores the result in m_results */ + if (!mdb->m_fields || mdb->m_fields_size < mdb->m_num_fields) { + if (mdb->m_fields) { + free(mdb->m_fields); + mdb->m_fields = NULL; + } + Dmsg1(500, "allocating space for %d fields\n", m_num_fields); + mdb->m_fields = (SQL_FIELD *)malloc(sizeof(SQL_FIELD) * mdb->m_num_fields); + mdb->m_fields_size = mdb->m_num_fields; + + for (i = 0; i < mdb->m_num_fields; i++) { + Dmsg1(500, "filling field %d\n", i); + mdb->m_fields[i].name = mdb->m_result[i]; + mdb->m_fields[i].max_length = cstrlen(mdb->m_fields[i].name); + for (j = 1; j <= mdb->m_num_rows; j++) { + if (mdb->m_result[i + mdb->m_num_fields * j]) { + len = (uint32_t)cstrlen(mdb->m_result[i + mdb->m_num_fields * j]); + } else { + len = 0; + } + if (len > mdb->m_fields[i].max_length) { + mdb->m_fields[i].max_length = len; + } + } + mdb->m_fields[i].type = 0; + mdb->m_fields[i].flags = 1; /* not null */ + + Dmsg4(500, "sql_fetch_field finds field '%s' has length='%d' type='%d' and IsNull=%d\n", + mdb->m_fields[i].name, mdb->m_fields[i].max_length, mdb->m_fields[i].type, mdb->m_fields[i].flags); + } + } + + /* Increment field number for the next time around */ + return &mdb->m_fields[mdb->m_field_number++]; +} + +bool BDB_SQLITE::sql_field_is_not_null(int field_type) +{ + if (field_type == 1) { + return true; + } + return false; +} + +bool BDB_SQLITE::sql_field_is_numeric(int field_type) +{ + if (field_type == 1) { + return true; + } + return false; +} + +/* + * Returns true if OK + * false if failed + */ +bool BDB_SQLITE::sql_batch_start(JCR *jcr) +{ + bool ret; + + bdb_lock(); + ret = sql_query("CREATE TEMPORARY TABLE batch (" + "FileIndex integer," + "JobId integer," + "Path blob," + "Name blob," + "LStat tinyblob," + "MD5 tinyblob," + "DeltaSeq integer)"); + bdb_unlock(); + + return ret; +} + +/* Set error to something to abort operation */ +/* + * Returns true if OK + * false if failed + */ +bool BDB_SQLITE::sql_batch_end(JCR *jcr, const char *error) +{ + m_status = 0; + return true; +} + +/* + * Returns true if OK + * false if failed + */ +bool BDB_SQLITE::sql_batch_insert(JCR *jcr, ATTR_DBR *ar) +{ + BDB_SQLITE *mdb = this; + const char *digest; + char ed1[50]; + + mdb->esc_name = check_pool_memory_size(mdb->esc_name, mdb->fnl*2+1); + bdb_escape_string(jcr, mdb->esc_name, mdb->fname, mdb->fnl); + + mdb->esc_path = check_pool_memory_size(mdb->esc_path, mdb->pnl*2+1); + bdb_escape_string(jcr, mdb->esc_path, mdb->path, mdb->pnl); + + if (ar->Digest == NULL || ar->Digest[0] == 0) { + digest = "0"; + } else { + digest = ar->Digest; + } + + Mmsg(mdb->cmd, "INSERT INTO batch VALUES " + "(%u,%s,'%s','%s','%s','%s',%u)", + ar->FileIndex, edit_int64(ar->JobId,ed1), mdb->esc_path, + mdb->esc_name, ar->attr, digest, ar->DeltaSeq); + + return sql_query(mdb->cmd); +} + + +#endif /* HAVE_SQLITE3 */ diff --git a/bacula/src/cats/sqlite.in b/bacula/src/cats/sqlite.in index 425e2d9178..61c23aedf7 100644 --- a/bacula/src/cats/sqlite.in +++ b/bacula/src/cats/sqlite.in @@ -1,21 +1,9 @@ #!/bin/sh # -# shell script to invoke SQLite on Bacula database -# -# Bacula® - The Network Backup Solution -# -# Copyright (C) 2000-2014 Free Software Foundation Europe e.V. -# -# The main author of Bacula is Kern Sibbald, with contributions from many -# others, a complete list can be found in the file AUTHORS. -# -# You may use this file and others of this release according to the -# license defined in the LICENSE file, which includes the Affero General -# Public License, v3.0 ("AGPLv3") and some additional permissions and -# terms pursuant to its AGPLv3 Section 7. -# -# Bacula® is a registered trademark of Kern Sibbald. +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # +# shell script to invoke SQLite on Bacula database bindir=@SQLITE_BINDIR@ db_name=@db_name@ diff --git a/bacula/src/cats/update_bacula_tables.in b/bacula/src/cats/update_bacula_tables.in index 176989e95c..1249077f96 100755 --- a/bacula/src/cats/update_bacula_tables.in +++ b/bacula/src/cats/update_bacula_tables.in @@ -1,11 +1,14 @@ #!/bin/sh # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # This routine alters the appropriately configured # Bacula tables for PostgreSQL, Ingres, MySQL, or SQLite. # -# Author: Kern Sibbald -# License: LGPLv3 -# + +# can be used to change the current user with su +pre_command="sh -c" default_db_type=@DEFAULT_DB_TYPE@ @@ -27,10 +30,6 @@ if [ $# -gt 0 ]; then db_type=$1 shift ;; - ingres) - db_type=$1 - shift - ;; *) ;; esac @@ -43,5 +42,9 @@ if [ -z "${db_type}" ]; then db_type="${default_db_type}" fi +if [ $db_type = postgresql -a "$UID" = 0 ]; then + pre_command="su - postgres -c" +fi + echo "Altering ${db_type} tables" -@scriptdir@/update_${db_type}_tables $* +$pre_command "@scriptdir@/update_${db_type}_tables $*" diff --git a/bacula/src/cats/update_mysql_tables.in b/bacula/src/cats/update_mysql_tables.in index 204925f43f..f2862fe234 100644 --- a/bacula/src/cats/update_mysql_tables.in +++ b/bacula/src/cats/update_mysql_tables.in @@ -1,31 +1,59 @@ #!/bin/sh # -# Shell script to update MySQL Community version 5.0.x to 5.2.x +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # -# Author: Kern Sibbald -# License: LGPLv3 +# Shell script to update MySQL tables from Bacula Community version +# 5.0.x, 5.2.x, 7.0.x # - echo " " -echo "This script will update a Bacula MySQL database from version 12 to 14" -echo " which is needed to convert from Bacula Community version 5.0.x to 5.2.x" +echo "This script will update a Bacula MySQL database from version 12-14 to 15" +echo " " +echo "Depending on the current version of your catalog, you may have to run this script" +echo " multiple times" echo " " + bindir=@MYSQL_BINDIR@ PATH="$bindir:$PATH" -db_name=${db_name:-@db_name@} - -mysql -D ${db_name} $* -e "select VersionId from Version\G" >/tmp/$$ -DBVERSION=`sed -n -e 's/^VersionId: \(.*\)$/\1/p' /tmp/$$` -if [ $DBVERSION != 12 ] ; then - echo " " - echo "The existing database is version $DBVERSION !!" - echo "This script can only update an existing version 12 database to version 14." - echo "Error. Cannot upgrade this database." - echo " " - exit 1 +db_name=@db_name@ + +ARGS=$* + +getVersion() +{ + mysql $ARGS -D ${db_name} -e "select VersionId from Version LIMIT 1\G" >/tmp/$$ + DBVERSION=`sed -n -e 's/^VersionId: \(.*\)$/\1/p' /tmp/$$` +} + +getVersion + +if [ "x$DBVERSION" = x ]; then + echo + echo "Unable to detect database version, you can specify connection information" + echo "on the command line." + echo "Error. Cannot upgrade this database." + exit 1 fi -if mysql -D ${db_name} $* -f </dev/null 2> /dev/null +# CREATE INDEX media_storageid_idx ON Media (StorageId); +# END-OF-DATA + +if [ "$DBVERSION" -eq 12 ] ; then + if mysql $* -f <dir_bsock; int tls_local_need = BNET_TLS_NONE; int tls_remote_need = BNET_TLS_NONE; bool tls_authenticate; @@ -166,6 +168,6 @@ bail_out: sendit( _("Director authorization problem.\n" "Most likely the passwords do not agree.\n" "If you are using TLS, there may have been a certificate validation error during the TLS handshake.\n" - "Please see " MANUAL_AUTH_URL " for help.\n")); + "For help, please see " MANUAL_AUTH_URL "\n")); return 0; } diff --git a/bacula/src/console/bconsole.conf.in b/bacula/src/console/bconsole.conf.in index 08016a171b..84d23a282f 100644 --- a/bacula/src/console/bconsole.conf.in +++ b/bacula/src/console/bconsole.conf.in @@ -1,6 +1,9 @@ # # Bacula User Agent (or Console) Configuration File # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# Director { Name = @basename@-dir diff --git a/bacula/src/console/conio.c b/bacula/src/console/conio.c index bf284da6a3..f2c69f1489 100755 --- a/bacula/src/console/conio.c +++ b/bacula/src/console/conio.c @@ -1,24 +1,30 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 1981-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ /* - Generalized console input/output handler - A maintanable replacement for readline() + Generalized console input/output handler + A maintanable replacement for readline() - Written in 1981, updated for Bacula, Kern Sibbald, December MMIII + Updated for Bacula, Kern Sibbald, December MMIII + + This code is in part derived from code that I wrote in + 1981, so some of it is a bit old and could use a cleanup. */ @@ -31,6 +37,7 @@ * Each subsequent character starts with 10 (i.e. (c & 0xC0) == 0x80) */ + #ifdef TEST_PROGRAM #include #include diff --git a/bacula/src/console/conio.h b/bacula/src/console/conio.h index 57296af6a7..c00985079e 100644 --- a/bacula/src/console/conio.h +++ b/bacula/src/console/conio.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2004-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ #ifndef __CONIO_H diff --git a/bacula/src/console/console.c b/bacula/src/console/console.c index d716e36265..b2f0814097 100644 --- a/bacula/src/console/console.c +++ b/bacula/src/console/console.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -47,7 +51,7 @@ //extern int rl_catch_signals; /* Imported functions */ -int authenticate_director(JCR *jcr, DIRRES *director, CONRES *cons); +int authenticate_director(BSOCK *dir, DIRRES *director, CONRES *cons); extern bool parse_cons_config(CONFIG *config, const char *configfile, int exit_code); /* Forward referenced functions */ @@ -93,6 +97,7 @@ static int echocmd(FILE *input, BSOCK *UA_sock); static int timecmd(FILE *input, BSOCK *UA_sock); static int sleepcmd(FILE *input, BSOCK *UA_sock); static int execcmd(FILE *input, BSOCK *UA_sock); + #ifdef HAVE_READLINE static int eolcmd(FILE *input, BSOCK *UA_sock); @@ -111,7 +116,7 @@ static void usage() { fprintf(stderr, _( PROG_COPYRIGHT -"\nVersion: " VERSION " (" BDATE ") %s %s %s\n\n" +"\n%sVersion: " VERSION " (" BDATE ") %s %s %s\n\n" "Usage: bconsole [-s] [-c config_file] [-d debug_level]\n" " -D select a Director\n" " -l list Directors defined\n" @@ -123,7 +128,7 @@ PROG_COPYRIGHT " -u set command execution timeout to seconds\n" " -t test - read configuration and exit\n" " -? print this message.\n" -"\n"), 2000, HOST_OS, DISTNAME, DISTVER); +"\n"), 2000, "", HOST_OS, DISTNAME, DISTVER); } @@ -217,7 +222,6 @@ static int do_a_command(FILE *input, BSOCK *UA_sock) return stat; } - static void read_and_process_input(FILE *input, BSOCK *UA_sock) { const char *prompt = "*"; @@ -243,11 +247,10 @@ static void read_and_process_input(FILE *input, BSOCK *UA_sock) } } else { /* Reading input from a file */ - int len = sizeof_pool_memory(UA_sock->msg) - 1; if (usrbrk()) { break; } - if (fgets(UA_sock->msg, len, input) == NULL) { + if (bfgets(UA_sock->msg, input) == NULL) { stat = -1; } else { sendit(UA_sock->msg); /* echo to terminal */ @@ -283,11 +286,17 @@ static void read_and_process_input(FILE *input, BSOCK *UA_sock) } stop_bsock_timer(tid); } - if (strcmp(UA_sock->msg, ".quit") == 0 || strcmp(UA_sock->msg, ".exit") == 0) { + if (strcasecmp(UA_sock->msg, ".quit") == 0 || strcasecmp(UA_sock->msg, ".exit") == 0) { break; } tid = start_bsock_timer(UA_sock, timeout); - while ((stat = UA_sock->recv()) >= 0) { + while (1) { + stat = UA_sock->recv(); + + if (stat < 0) { + break; + } + if (at_prompt) { if (!stop) { sendit("\n"); @@ -314,7 +323,7 @@ static void read_and_process_input(FILE *input, BSOCK *UA_sock) if (UA_sock->msglen == BNET_SUB_PROMPT) { at_prompt = true; } - Dmsg1(100, "Got poll %s\n", bnet_sig_to_ascii(UA_sock)); + Dmsg1(100, "Got poll %s\n", bnet_sig_to_ascii(UA_sock->msglen)); } } } @@ -448,12 +457,12 @@ static void match_kw(regex_t *preg, const char *what, int len, POOLMEM **buf) { int rc, size; int nmatch=20; - regmatch_t pmatch[20]; + regmatch_t pmatch[nmatch]; if (len <= 0) { return; } - rc = regexec(preg, what, nmatch, pmatch, 0); + rc = regexec(preg, what, nmatch, pmatch, 0); if (rc == 0) { #if 0 Pmsg1(0, "\n\n%s\n0123456789012345678901234567890123456789\n 10 20 30\n", what); @@ -599,7 +608,10 @@ static struct cpl_keywords_t cpl_keywords[] = { {"m", ".ls" }, {"unmark", ".lsmark" }, {"catalog=", ".catalogs" }, - {"actiononpurge=", ".actiononpurge" } + {"actiononpurge=", ".actiononpurge" }, + {"tags=", ".tags" }, + {"recylepool=", ".pool" }, + {"allfrompool=",".pool" } }; #define key_size ((int)(sizeof(cpl_keywords)/sizeof(struct cpl_keywords_t))) @@ -873,7 +885,7 @@ static int console_init_history(const char *histfile) return ret; } -bool select_director(const char *director, DIRRES **ret_dir, CONRES **ret_cons) +static bool select_director(const char *director, DIRRES **ret_dir, CONRES **ret_cons) { int numcon=0, numdir=0; int i=0, item=0; @@ -1189,13 +1201,15 @@ int main(int argc, char *argv[]) } if (!UA_sock->connect(NULL, 5, 15, heart_beat, "Director daemon", dir->address, NULL, dir->DIRport, 0)) { + UA_sock->destroy(); + UA_sock = NULL; terminate_console(0); return 1; } jcr.dir_bsock = UA_sock; /* If cons==NULL, default console will be used */ - if (!authenticate_director(&jcr, dir, cons)) { + if (!authenticate_director(UA_sock, dir, cons)) { terminate_console(0); return 1; } @@ -1455,7 +1469,6 @@ static int execcmd(FILE *input, BSOCK *UA_sock) return 1; } - /* @echo xxx yyy */ static int echocmd(FILE *input, BSOCK *UA_sock) { diff --git a/bacula/src/console/console_conf.c b/bacula/src/console/console_conf.c index 5ea82aa098..65c850a9a6 100644 --- a/bacula/src/console/console_conf.c +++ b/bacula/src/console/console_conf.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Main configuration file parser for Bacula User Agent @@ -71,53 +75,54 @@ int32_t res_all_size = sizeof(res_all); /* Console "globals" */ static RES_ITEM cons_items[] = { - {"name", store_name, ITEM(res_cons.hdr.name), 0, ITEM_REQUIRED, 0}, - {"description", store_str, ITEM(res_cons.hdr.desc), 0, 0, 0}, - {"rcfile", store_dir, ITEM(res_cons.rc_file), 0, 0, 0}, - {"historyfile", store_dir, ITEM(res_cons.hist_file), 0, 0, 0}, - {"password", store_password, ITEM(res_cons.password), 0, ITEM_REQUIRED, 0}, - {"tlsauthenticate",store_bool, ITEM(res_cons.tls_authenticate), 0, 0, 0}, - {"tlsenable", store_bool, ITEM(res_cons.tls_enable), 0, 0, 0}, - {"tlsrequire", store_bool, ITEM(res_cons.tls_require), 0, 0, 0}, - {"tlscacertificatefile", store_dir, ITEM(res_cons.tls_ca_certfile), 0, 0, 0}, - {"tlscacertificatedir", store_dir, ITEM(res_cons.tls_ca_certdir), 0, 0, 0}, - {"tlscertificate", store_dir, ITEM(res_cons.tls_certfile), 0, 0, 0}, - {"tlskey", store_dir, ITEM(res_cons.tls_keyfile), 0, 0, 0}, - {"director", store_str, ITEM(res_cons.director), 0, 0, 0}, - {"heartbeatinterval", store_time, ITEM(res_cons.heartbeat_interval), 0, ITEM_DEFAULT, 0}, + {"Name", store_name, ITEM(res_cons.hdr.name), 0, ITEM_REQUIRED, 0}, + {"Description", store_str, ITEM(res_cons.hdr.desc), 0, 0, 0}, + {"RCFile", store_dir, ITEM(res_cons.rc_file), 0, 0, 0}, + {"HistoryFile", store_dir, ITEM(res_cons.hist_file), 0, 0, 0}, + {"Password", store_password, ITEM(res_cons.password), 0, ITEM_REQUIRED, 0}, + {"TlsAuthenticate",store_bool, ITEM(res_cons.tls_authenticate), 0, 0, 0}, + {"TlsEnable", store_bool, ITEM(res_cons.tls_enable), 0, 0, 0}, + {"TlsRequire", store_bool, ITEM(res_cons.tls_require), 0, 0, 0}, + {"TlsCaCertificateFile", store_dir, ITEM(res_cons.tls_ca_certfile), 0, 0, 0}, + {"TlsCaCertificateDir", store_dir, ITEM(res_cons.tls_ca_certdir), 0, 0, 0}, + {"TlsCertificate", store_dir, ITEM(res_cons.tls_certfile), 0, 0, 0}, + {"TlsKey", store_dir, ITEM(res_cons.tls_keyfile), 0, 0, 0}, + {"Director", store_str, ITEM(res_cons.director), 0, 0, 0}, + {"HeartbeatInterval", store_time, ITEM(res_cons.heartbeat_interval), 0, ITEM_DEFAULT, 5 * 60}, {NULL, NULL, {0}, 0, 0, 0} }; /* Director's that we can contact */ static RES_ITEM dir_items[] = { - {"name", store_name, ITEM(res_dir.hdr.name), 0, ITEM_REQUIRED, 0}, - {"description", store_str, ITEM(res_dir.hdr.desc), 0, 0, 0}, - {"dirport", store_pint32, ITEM(res_dir.DIRport), 0, ITEM_DEFAULT, 9101}, - {"address", store_str, ITEM(res_dir.address), 0, 0, 0}, - {"password", store_password, ITEM(res_dir.password), 0, ITEM_REQUIRED, 0}, - {"tlsauthenticate",store_bool, ITEM(res_dir.tls_enable), 0, 0, 0}, - {"tlsenable", store_bool, ITEM(res_dir.tls_enable), 0, 0, 0}, - {"tlsrequire", store_bool, ITEM(res_dir.tls_require), 0, 0, 0}, - {"tlscacertificatefile", store_dir, ITEM(res_dir.tls_ca_certfile), 0, 0, 0}, - {"tlscacertificatedir", store_dir, ITEM(res_dir.tls_ca_certdir), 0, 0, 0}, - {"tlscertificate", store_dir, ITEM(res_dir.tls_certfile), 0, 0, 0}, - {"tlskey", store_dir, ITEM(res_dir.tls_keyfile), 0, 0, 0}, - {"heartbeatinterval", store_time, ITEM(res_dir.heartbeat_interval), 0, ITEM_DEFAULT, 0}, + {"Name", store_name, ITEM(res_dir.hdr.name), 0, ITEM_REQUIRED, 0}, + {"Description", store_str, ITEM(res_dir.hdr.desc), 0, 0, 0}, + {"DirPort", store_pint32, ITEM(res_dir.DIRport), 0, ITEM_DEFAULT, 9101}, + {"Address", store_str, ITEM(res_dir.address), 0, 0, 0}, + {"Password", store_password, ITEM(res_dir.password), 0, ITEM_REQUIRED, 0}, + {"TlsAuthenticate",store_bool, ITEM(res_dir.tls_enable), 0, 0, 0}, + {"TlsEnable", store_bool, ITEM(res_dir.tls_enable), 0, 0, 0}, + {"TlsRequire", store_bool, ITEM(res_dir.tls_require), 0, 0, 0}, + {"TlsCaCertificateFile", store_dir, ITEM(res_dir.tls_ca_certfile), 0, 0, 0}, + {"TlsCaCertificateDir", store_dir, ITEM(res_dir.tls_ca_certdir), 0, 0, 0}, + {"TlsCertificate", store_dir, ITEM(res_dir.tls_certfile), 0, 0, 0}, + {"TlsKey", store_dir, ITEM(res_dir.tls_keyfile), 0, 0, 0}, + {"HeartbeatInterval", store_time, ITEM(res_dir.heartbeat_interval), 0, ITEM_DEFAULT, 5 * 60}, {NULL, NULL, {0}, 0, 0, 0} }; /* * This is the master resource definition. * It must have one item for each of the resources. + * + * name item rcode */ RES_TABLE resources[] = { - {"console", cons_items, R_CONSOLE}, - {"director", dir_items, R_DIRECTOR}, + {"Console", cons_items, R_CONSOLE}, + {"Director", dir_items, R_DIRECTOR}, {NULL, NULL, 0} }; - /* Dump contents of resource */ void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fmt, ...), void *sock) { @@ -161,8 +166,9 @@ void free_resource(RES *sres, int type) RES *nres; URES *res = (URES *)sres; - if (res == NULL) + if (res == NULL) { return; + } /* common stuff -- free the resource name */ nres = (RES *)res->res_dir.hdr.next; @@ -247,7 +253,7 @@ void save_resource(int type, RES_ITEM *items, int pass) for (i=0; items[i].name; i++) { if (items[i].flags & ITEM_REQUIRED) { if (!bit_is_set(i, res_all.res_dir.hdr.item_present)) { - Emsg2(M_ABORT, 0, _("%s item is required in %s resource, but not found.\n"), + Emsg2(M_ERROR_TERM, 0, _("%s item is required in %s resource, but not found.\n"), items[i].name, resources[rindex]); } } diff --git a/bacula/src/console/console_conf.h b/bacula/src/console/console_conf.h index 042790e813..d54995ff97 100644 --- a/bacula/src/console/console_conf.h +++ b/bacula/src/console/console_conf.h @@ -1,24 +1,27 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula User Agent specific configuration and defines * * Kern Sibbald, Sep MM * - * Version $Id$ */ /* diff --git a/bacula/src/console/func.h b/bacula/src/console/func.h index e096c9cb19..2a717a1882 100755 --- a/bacula/src/console/func.h +++ b/bacula/src/console/func.h @@ -1,3 +1,22 @@ +/* + Bacula(R) - The Network Backup Solution + + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 1981-2014 Free Software Foundation Europe e.V. + + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. + + You may use this file and others of this release according to the + license defined in the LICENSE file, which includes the Affero General + Public License, v3.0 ("AGPLv3") and some additional permissions and + terms pursuant to its AGPLv3 Section 7. + + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. +*/ /* Definitions of internal function codes */ /* Functions that work on current line */ diff --git a/bacula/src/count-lines b/bacula/src/count-lines new file mode 100755 index 0000000000..a680905b1b --- /dev/null +++ b/bacula/src/count-lines @@ -0,0 +1,9 @@ +#!/bin/sh +rm -f 1 +touch 1 +find . -type d >2 +for i in `cat 2` ; do + ls -1 $i/*.c $i/*.cpp $i/*.h $i/*.in 2>/dev/null >>1 +done +cat 1 | $HOME/bin/lines +# rm -f 1 2 diff --git a/bacula/src/dird/Makefile.in b/bacula/src/dird/Makefile.in index 5d723dfca2..256737228c 100644 --- a/bacula/src/dird/Makefile.in +++ b/bacula/src/dird/Makefile.in @@ -1,8 +1,8 @@ # # Bacula Director Makefile # -# Author: Kern Sibbald -# License: LGPLv3 +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # @MCOMMON@ @@ -13,9 +13,9 @@ VPATH = . dir_group=@dir_group@ # one up -basedir = .. +basedir = @BUILD_DIR@/src # top dir -topdir = ../.. +topdir = @BUILD_DIR@ # this dir relative to top dir thisdir = src/dird @@ -23,7 +23,6 @@ DEBUG=@DEBUG@ GETTEXT_LIBS = @LIBINTL@ CAP_LIBS = @CAP_LIBS@ - DB_LIBS=@DB_LIBS@ first_rule: all @@ -42,7 +41,7 @@ SVRSRCS = dird.c admin.c authenticate.c \ ua_query.c \ ua_input.c ua_label.c ua_output.c ua_prune.c \ ua_purge.c ua_restore.c ua_run.c \ - ua_select.c ua_server.c \ + ua_select.c ua_server.c snapshot.c \ ua_status.c ua_tree.c ua_update.c vbackup.c verify.c SVROBJS = $(SVRSRCS:.c=.o) @@ -117,7 +116,7 @@ install: all @if test -f ${DESTDIR}${scriptdir}/query.sql; then \ echo " ==> Saving existing query.sql to query.sql.old"; \ $(MV) -f ${DESTDIR}${scriptdir}/query.sql ${DESTDIR}${scriptdir}/query.sql.old; \ - fi + fi ${INSTALL_DATA} query.sql ${DESTDIR}${scriptdir}/query.sql @if test -f static-bacula-dir; then \ $(LIBTOOL_INSTALL) $(INSTALL_PROGRAM) static-bacula-dir $(DESTDIR)$(sbindir)/static-bacula-dir; \ @@ -125,7 +124,6 @@ install: all uninstall: - (cd $(DESTDIR)$(sbindir); $(RMF) bacula-dir (cd $(DESTDIR)$(sysconfdir); $(RMF) bacula-dir.conf bacula-dir.conf.new) (cd $(DESTDIR)$(scriptdir); $(RMF) query.sql) diff --git a/bacula/src/dird/admin.c b/bacula/src/dird/admin.c index 05bd6dbef3..c056bcee97 100644 --- a/bacula/src/dird/admin.c +++ b/bacula/src/dird/admin.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2003-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * diff --git a/bacula/src/dird/authenticate.c b/bacula/src/dird/authenticate.c index a7254081c7..621251917d 100644 --- a/bacula/src/dird/authenticate.c +++ b/bacula/src/dird/authenticate.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -33,9 +37,9 @@ extern DIRRES *director; /* Version at end of Hello * prior to 06Aug13 no version - * 1 06Aug13 - added comm line compression + * 102 04Jun15 - added jobmedia change */ -#define DIR_VERSION 1 +#define DIR_VERSION 102 /* Command sent to SD */ @@ -110,7 +114,7 @@ bool authenticate_storage_daemon(JCR *jcr, STORE *store) "Passwords or names not the same or\n" "Maximum Concurrent Jobs exceeded on the SD or\n" "SD networking messed up (restart daemon).\n" - "Please see " MANUAL_AUTH_URL " for help.\n"), + "For help, please see: " MANUAL_AUTH_URL "\n"), sd->host(), sd->port()); return 0; } @@ -160,6 +164,11 @@ bool authenticate_storage_daemon(JCR *jcr, STORE *store) sd->host(), sd->port()); return 0; } + if (jcr->SDVersion < 305) { + Jmsg2(jcr, M_FATAL, 0, _("Older Storage daemon at \"%s:%d\" incompatible with this Director.\n"), + sd->host(), sd->port()); + return 0; + } return 1; } @@ -223,7 +232,7 @@ int authenticate_file_daemon(JCR *jcr) "Passwords or names not the same or\n" "Maximum Concurrent Jobs exceeded on the FD or\n" "FD networking messed up (restart daemon).\n" - "Please see " MANUAL_AUTH_URL " for help.\n"), + "For help, please see: " MANUAL_AUTH_URL "\n"), fd->host(), fd->port()); return 0; } @@ -416,7 +425,7 @@ auth_done: sleep(5); return 0; } - ua->fsend(_("1000 OK: %d %s Version: %s (%s)\n"), - DIR_VERSION, my_name, VERSION, BDATE); + ua->fsend(_("1000 OK: %d %s %sVersion: %s (%s)\n"), + DIR_VERSION, my_name, "", VERSION, BDATE); return 1; } diff --git a/bacula/src/dird/autoprune.c b/bacula/src/dird/autoprune.c index 01bef33ea7..2b8233fe1d 100644 --- a/bacula/src/dird/autoprune.c +++ b/bacula/src/dird/autoprune.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -136,7 +140,7 @@ void prune_volumes(JCR *jcr, bool InChanger, MEDIA_DBR *mr, set_storageid_in_mr(store, mr); if (InChanger) { - Mmsg(changer, "AND InChanger=1 AND StorageId IN (%s) ", edit_int64(mr->StorageId, ed3)); + Mmsg(changer, "AND InChanger=1 AND StorageId=%s ", edit_int64(mr->StorageId, ed3)); } Mmsg(query, select, ed1, ed2, mr->MediaType, changer.c_str()); @@ -174,7 +178,7 @@ void prune_volumes(JCR *jcr, bool InChanger, MEDIA_DBR *mr, purge_job_list_from_catalog(ua, prune_list); prune_list.num_ids = 0; /* reset count */ } - if (!is_volume_purged(ua, &lmr)) { + if (!is_volume_purged(ua, &lmr, false)) { Dmsg1(100, "Vol=%s not pruned\n", lmr.VolumeName); continue; } diff --git a/bacula/src/dird/backup.c b/bacula/src/dird/backup.c index 89109f2b28..9f2f9391b1 100644 --- a/bacula/src/dird/backup.c +++ b/bacula/src/dird/backup.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -39,7 +43,6 @@ static char storaddr[] = "storage address=%s port=%d ssl=%d\n"; /* Responses received from File daemon */ static char OKbackup[] = "2000 OK backup\n"; static char OKstore[] = "2000 OK storage\n"; -/* Pre 17 Aug 2013 */ static char EndJob[] = "2800 End Job TermCode=%d JobFiles=%u " "ReadBytes=%llu JobBytes=%llu Errors=%u " "VSS=%d Encrypt=%d\n"; @@ -240,6 +243,7 @@ bool send_accurate_current_files(JCR *jcr) db_list_ctx nb; char ed1[50]; + /* In base level, no previous job is used and no restart incomplete jobs */ if (jcr->is_canceled() || jcr->is_JobLevel(L_BASE)) { return true; } @@ -257,7 +261,7 @@ bool send_accurate_current_files(JCR *jcr) } } else { /* For Incr/Diff level, we search for older jobs */ - db_accurate_get_jobids(jcr, jcr->db, &jcr->jr, &jobids); + db_get_accurate_jobids(jcr, jcr->db, &jcr->jr, &jobids); /* We are in Incr/Diff, but no Full to build the accurate list... */ if (jobids.count == 0) { @@ -266,6 +270,7 @@ bool send_accurate_current_files(JCR *jcr) } } + /* For incomplete Jobs, we add our own id */ if (jcr->rerunning) { edit_int64(jcr->JobId, ed1); jobids.add(ed1); @@ -305,7 +310,7 @@ bool send_accurate_current_files(JCR *jcr) if (!db_get_file_list(jcr, jcr->db_batch, jobids.list, jcr->use_accurate_chksum, false /* no delta */, accurate_list_handler, (void *)jcr)) { - Jmsg1(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db)); + Jmsg1(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db_batch)); return false; } } @@ -432,8 +437,13 @@ bool do_backup(JCR *jcr) } /* Print Job Start message */ - Jmsg(jcr, M_INFO, 0, _("Start Backup JobId %s, Job=%s\n"), + if (jcr->rerunning) { + Jmsg(jcr, M_INFO, 0, _("Restart Incomplete Backup JobId %s, Job=%s\n"), edit_uint64(jcr->JobId, ed1), jcr->Job); + } else { + Jmsg(jcr, M_INFO, 0, _("Start Backup JobId %s, Job=%s\n"), + edit_uint64(jcr->JobId, ed1), jcr->Job); + } jcr->setJobStatus(JS_Running); Dmsg2(100, "JobId=%d JobLevel=%c\n", jcr->jr.JobId, jcr->jr.JobLevel); @@ -442,6 +452,34 @@ bool do_backup(JCR *jcr) return false; } + /* For incomplete Jobs, we add our own id */ + if (jcr->rerunning) { + edit_int64(jcr->JobId, ed1); + Mmsg(buf, "SELECT max(FileIndex) FROM File WHERE JobId=%s", ed1); + if (db_sql_query(jcr->db, buf.c_str(), db_int64_handler, &job)) { + Jmsg(jcr, M_INFO, 0, _("Found %ld files from prior incomplete Job.\n"), + (int32_t)job.value); + } else { + Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db)); + return false; + } + jcr->JobFiles = job.value; + Dmsg1(100, "==== FI=%ld\n", jcr->JobFiles); + Mmsg(buf, "SELECT VolSessionId FROM Job WHERE JobId=%s", ed1); + if (!db_sql_query(jcr->db, buf.c_str(), db_int64_handler, &job)) { + Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db)); + return false; + } + jcr->VolSessionId = job.value; + Mmsg(buf, "SELECT VolSessionTime FROM Job WHERE JobId=%s", ed1); + if (!db_sql_query(jcr->db, buf.c_str(), db_int64_handler, &job)) { + Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db)); + return false; + } + jcr->VolSessionTime = job.value; + Dmsg4(100, "JobId=%s JobFiles=%ld VolSessionId=%ld VolSessionTime=%ld\n", ed1, + jcr->JobFiles, jcr->VolSessionId, jcr->VolSessionTime); + } /* * Open a message channel connection with the Storage @@ -507,10 +545,12 @@ bool do_backup(JCR *jcr) send_bwlimit(jcr, jcr->Job); /* Old clients don't have this command */ } + send_snapshot_retention(jcr, jcr->snapshot_retention); + store = jcr->wstore; if (jcr->sd_calls_client) { - if (jcr->FDVersion < 5) { + if (jcr->FDVersion < 10) { Jmsg(jcr, M_FATAL, 0, _("The File daemon does not support SDCallsClient.\n")); goto bail_out; } @@ -620,7 +660,7 @@ int wait_for_job_termination(JCR *jcr, int timeout) uint32_t JobWarnings = 0; uint64_t ReadBytes = 0; uint64_t JobBytes = 0; - int VSS = 0; + int VSS = 0; /* or Snapshot on Unix */ int Encrypt = 0; btimer_t *tid=NULL; @@ -630,10 +670,10 @@ int wait_for_job_termination(JCR *jcr, int timeout) } /* Wait for Client to terminate */ while ((n = bget_dirmsg(fd)) >= 0) { - if (!fd_ok && + if (!fd_ok && (sscanf(fd->msg, EndJob, &jcr->FDJobStatus, &JobFiles, &ReadBytes, &JobBytes, &JobErrors, &VSS, &Encrypt) == 7 || - sscanf(fd->msg, OldEndJob, &jcr->FDJobStatus, &JobFiles, + sscanf(fd->msg, OldEndJob, &jcr->FDJobStatus, &JobFiles, &ReadBytes, &JobBytes, &JobErrors) == 5)) { fd_ok = true; jcr->setJobStatus(jcr->FDJobStatus); @@ -662,7 +702,7 @@ int wait_for_job_termination(JCR *jcr, int timeout) } /* - * Force cancel in SD if failing, + * Force cancel in SD if failing, but not for Incomplete jobs * so that we let the SD despool. */ Dmsg5(100, "cancel=%d fd_ok=%d FDJS=%d JS=%d SDJS=%d\n", jcr->is_canceled(), fd_ok, jcr->FDJobStatus, @@ -683,7 +723,7 @@ int wait_for_job_termination(JCR *jcr, int timeout) jcr->ReadBytes = ReadBytes; jcr->JobBytes = JobBytes; jcr->JobWarnings = JobWarnings; - jcr->VSS = VSS; + jcr->Snapshot = VSS; jcr->Encrypt = Encrypt; } else if (jcr->getJobStatus() != JS_Canceled) { Jmsg(jcr, M_FATAL, 0, _("No Job status returned from FD.\n")); @@ -713,7 +753,7 @@ void backup_cleanup(JCR *jcr, int TermCode) { char sdt[50], edt[50], schedt[50]; char ec1[30], ec2[30], ec3[30], ec4[30], ec5[30]; - char ec6[30], ec7[30], ec8[30], elapsed[50]; + char ec6[30], ec7[30], ec8[30], ec9[30], ec10[30], elapsed[50]; char data_compress[200]; char term_code[100], fd_term_msg[100], sd_term_msg[100]; const char *term_msg; @@ -733,18 +773,6 @@ void backup_cleanup(JCR *jcr, int TermCode) Dmsg2(100, "Enter backup_cleanup %d %c\n", TermCode, TermCode); memset(&cr, 0, sizeof(cr)); -#ifdef xxxx - /* The current implementation of the JS_Warning status is not - * completed. SQL part looks to be ok, but the code is using - * JS_Terminated almost everywhere instead of (JS_Terminated || JS_Warning) - * as we do with is_canceled() - */ - if (jcr->getJobStatus() == JS_Terminated && - (jcr->JobErrors || jcr->SDErrors || jcr->JobWarnings)) { - TermCode = JS_Warnings; - } -#endif - update_job_end(jcr, TermCode); if (!db_get_job_record(jcr, jcr->db, &jcr->jr)) { @@ -776,6 +804,9 @@ void backup_cleanup(JCR *jcr, int TermCode) term_msg = _("Backup OK"); } break; + case JS_Incomplete: + term_msg = _("Backup failed -- incomplete"); + break; case JS_Warnings: term_msg = _("Backup OK -- with warnings"); break; @@ -829,12 +860,12 @@ void backup_cleanup(JCR *jcr, int TermCode) if (jcr->ReadBytes == 0) { bstrncpy(data_compress, "None", sizeof(data_compress)); } else { - compression = (double)100 - 100.0 * ((double)jcr->JobBytes / (double)jcr->ReadBytes); + compression = (double)100 - 100.0 * ((double)jcr->SDJobBytes / (double)jcr->ReadBytes); if (compression < 0.5) { bstrncpy(data_compress, "None", sizeof(data_compress)); } else { - if (jcr->JobBytes > 0) { - ratio = (double)jcr->ReadBytes / (double)jcr->JobBytes; + if (jcr->SDJobBytes > 0) { + ratio = (double)jcr->ReadBytes / (double)jcr->SDJobBytes; } else { ratio = 1.0; } @@ -852,10 +883,19 @@ void backup_cleanup(JCR *jcr, int TermCode) jcr->nb_base_files_used*100.0/jcr->nb_base_files); } /* Edit string for last volume size */ - Mmsg(vol_info, _("%s (%sB)"), + if (mr.VolABytes != 0) { + Mmsg(vol_info, _("meta: %s (%sB) aligned: %s (%sB)"), + edit_uint64_with_commas(mr.VolBytes, ec7), + edit_uint64_with_suffix(mr.VolBytes, ec8), + edit_uint64_with_commas(mr.VolABytes, ec9), + edit_uint64_with_suffix(mr.VolABytes, ec10)); + } else { + Mmsg(vol_info, _("%s (%sB)"), edit_uint64_with_commas(mr.VolBytes, ec7), edit_uint64_with_suffix(mr.VolBytes, ec8)); + } +// bmicrosleep(15, 0); /* for debugging SIGHUP */ Jmsg(jcr, msg_type, 0, _("%s %s %s (%s):\n" " Build OS: %s %s %s\n" @@ -879,7 +919,7 @@ void backup_cleanup(JCR *jcr, int TermCode) " Rate: %.1f KB/s\n" " Software Compression: %s\n" "%s" /* Basefile info */ -" VSS: %s\n" +" Snapshot/VSS: %s\n" " Encryption: %s\n" " Accurate: %s\n" " Volume name(s): %s\n" @@ -915,7 +955,7 @@ void backup_cleanup(JCR *jcr, int TermCode) kbps, data_compress, base_info.c_str(), - jcr->VSS?_("yes"):_("no"), + jcr->Snapshot?_("yes"):_("no"), jcr->Encrypt?_("yes"):_("no"), jcr->accurate?_("yes"):_("no"), jcr->VolumeName, diff --git a/bacula/src/dird/bsr.c b/bacula/src/dird/bsr.c index 97d16076e3..b24a28c842 100644 --- a/bacula/src/dird/bsr.c +++ b/bacula/src/dird/bsr.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -50,7 +54,7 @@ static void free_findex(RBSR_FINDEX *fi) } } -/* +/* * Get storage device name from Storage resource */ static bool get_storage_device(char *device, char *storage) @@ -59,7 +63,7 @@ static bool get_storage_device(char *device, char *storage) if (storage[0] == 0) { return false; } - store = (STORE *)GetResWithName(R_STORAGE, storage); + store = (STORE *)GetResWithName(R_STORAGE, storage); if (!store) { return false; } @@ -188,7 +192,7 @@ static void make_unique_restore_filename(UAContext *ua, POOL_MEM &fname) JCR *jcr = ua->jcr; int i = find_arg_with_value(ua, "bootstrap"); if (i >= 0) { - Mmsg(fname, "%s", ua->argv[i]); + Mmsg(fname, "%s", ua->argv[i]); jcr->unlink_bsr = false; } else { P(mutex); @@ -237,7 +241,7 @@ uint32_t write_bsr_file(UAContext *ua, RESTORE_CTX &rx) ua->send_msg(_("Bootstrap records written to %s\n"), fname.c_str()); - if (chk_dbglvl(10)) { + if (debug_level >= 10) { print_bsr(ua, rx); } @@ -267,7 +271,7 @@ static void display_vol_info(UAContext *ua, RESTORE_CTX &rx, JobId_t JobId) } else { online = ' '; } - Mmsg(volmsg, "%c%-25s %-25s %-25s", + Mmsg(volmsg, "%c%-25s %-25s %-25s", online, bsr->VolParams[i].VolumeName, bsr->VolParams[i].Storage, Device); add_prompt(ua, volmsg.c_str()); @@ -316,7 +320,7 @@ void display_bsr_info(UAContext *ua, RESTORE_CTX &rx) /* * Write bsr data for a single bsr record */ -static uint32_t write_bsr_item(RBSR *bsr, UAContext *ua, +static uint32_t write_bsr_item(RBSR *bsr, UAContext *ua, RESTORE_CTX &rx, FILE *fd, bool &first, uint32_t &LastIndex) { char ed1[50], ed2[50]; @@ -381,7 +385,7 @@ static uint32_t write_bsr_item(RBSR *bsr, UAContext *ua, * Here we actually write out the details of the bsr file. * Note, there is one bsr for each JobId, but the bsr may * have multiple volumes, which have been entered in the - * order they were written. + * order they were written. * The bsrs must be written out in the order the JobIds * are found in the jobid list. */ @@ -551,7 +555,7 @@ void add_findex_all(RBSR *bsr, uint32_t JobId) nbsr->next->JobId = JobId; /* If we use regexp to restore, set it for each jobid */ - if (bsr->fileregex) { + if (bsr->fileregex) { nbsr->next->fileregex = bstrdup(bsr->fileregex); } diff --git a/bacula/src/dird/bsr.h b/bacula/src/dird/bsr.h index 18446461c3..216e16f078 100644 --- a/bacula/src/dird/bsr.h +++ b/bacula/src/dird/bsr.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -22,7 +26,6 @@ * * Kern Sibbald, July MMII * - * Version $Id$ */ @@ -52,4 +55,3 @@ struct RBSR { RBSR_FINDEX *fi; /* File indexes this JobId */ char *fileregex; /* Only restore files matching regex */ }; - diff --git a/bacula/src/dird/catreq.c b/bacula/src/dird/catreq.c index 5e4c6631b8..3bb86d0c97 100644 --- a/bacula/src/dird/catreq.c +++ b/bacula/src/dird/catreq.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -37,27 +41,25 @@ */ /* Requests from the Storage daemon */ -static char Find_media[] = "CatReq Job=%127s FindMedia=%d pool_name=%127s media_type=%127s\n"; +static char Find_media[] = "CatReq Job=%127s FindMedia=%d pool_name=%127s media_type=%127s vol_type=%d\n"; static char Get_Vol_Info[] = "CatReq Job=%127s GetVolInfo VolName=%127s write=%d\n"; static char Update_media[] = "CatReq Job=%127s UpdateMedia VolName=%s" - " VolJobs=%u VolFiles=%u VolBlocks=%u VolBytes=%lld VolMounts=%u" + " VolJobs=%u VolFiles=%u VolBlocks=%u VolBytes=%lld VolABytes=%lld" + " VolHoleBytes=%lld VolHoles=%u VolMounts=%u" " VolErrors=%u VolWrites=%lld MaxVolBytes=%lld EndTime=%lld VolStatus=%10s" " Slot=%d relabel=%d InChanger=%d VolReadTime=%lld VolWriteTime=%lld" - " VolFirstWritten=%lld VolParts=%u\n"; - -static char Create_job_media[] = "CatReq Job=%127s CreateJobMedia " - " FirstIndex=%u LastIndex=%u StartFile=%u EndFile=%u " - " StartBlock=%u EndBlock=%u Copy=%d Strip=%d MediaId=%" lld "\n"; + " VolFirstWritten=%lld VolType=%u\n"; +static char Create_jobmedia[] = "CatReq Job=%127s CreateJobMedia\n"; /* Responses sent to Storage daemon */ static char OK_media[] = "1000 OK VolName=%s VolJobs=%u VolFiles=%u" - " VolBlocks=%u VolBytes=%s" + " VolBlocks=%u VolBytes=%s VolABytes=%s VolHoleBytes=%s VolHoles=%u" " VolMounts=%u VolErrors=%u VolWrites=%s" " MaxVolBytes=%s VolCapacityBytes=%s VolStatus=%s Slot=%d" " MaxVolJobs=%u MaxVolFiles=%u InChanger=%d VolReadTime=%s" - " VolWriteTime=%s EndFile=%u EndBlock=%u VolParts=%u LabelType=%d" + " VolWriteTime=%s EndFile=%u EndBlock=%u VolType=%u LabelType=%d" " MediaId=%s ScratchPoolId=%s\n"; static char OK_create[] = "1000 OK CreateJobMedia\n"; @@ -66,7 +68,7 @@ static char OK_create[] = "1000 OK CreateJobMedia\n"; static int send_volume_info_to_storage_daemon(JCR *jcr, BSOCK *sd, MEDIA_DBR *mr) { int stat; - char ed1[50], ed4[50], ed5[50], ed6[50], ed7[50], ed8[50], + char ed1[50], ed2[50], ed3[50], ed4[50], ed5[50], ed6[50], ed7[50], ed8[50], ed9[50], ed10[50]; jcr->MediaId = mr->MediaId; @@ -74,7 +76,9 @@ static int send_volume_info_to_storage_daemon(JCR *jcr, BSOCK *sd, MEDIA_DBR *mr bash_spaces(mr->VolumeName); stat = sd->fsend(OK_media, mr->VolumeName, mr->VolJobs, mr->VolFiles, mr->VolBlocks, edit_uint64(mr->VolBytes, ed1), - mr->VolMounts, mr->VolErrors, + edit_uint64(mr->VolABytes, ed2), + edit_uint64(mr->VolHoleBytes, ed3), + mr->VolHoles, mr->VolMounts, mr->VolErrors, edit_uint64(mr->VolWrites, ed4), edit_uint64(mr->MaxVolBytes, ed5), edit_uint64(mr->VolCapacityBytes, ed6), @@ -83,7 +87,7 @@ static int send_volume_info_to_storage_daemon(JCR *jcr, BSOCK *sd, MEDIA_DBR *mr edit_int64(mr->VolReadTime, ed7), edit_int64(mr->VolWriteTime, ed8), mr->EndFile, mr->EndBlock, - mr->VolParts, + mr->VolType, mr->LabelType, edit_uint64(mr->MediaId, ed9), edit_uint64(mr->ScratchPoolId, ed10)); @@ -92,6 +96,9 @@ static int send_volume_info_to_storage_daemon(JCR *jcr, BSOCK *sd, MEDIA_DBR *mr return stat; } +/* TODO: See if we want to let the FD do all kind + * of catalog request/update + */ void catalog_request(JCR *jcr, BSOCK *bs) { MEDIA_DBR mr, sdmr; @@ -101,7 +108,6 @@ void catalog_request(JCR *jcr, BSOCK *bs) int index, ok, label, writing; POOLMEM *omsg; POOL_DBR pr; - uint32_t Stripe, Copy; uint64_t MediaId; utime_t VolFirstWritten; utime_t VolLastWritten; @@ -126,8 +132,8 @@ void catalog_request(JCR *jcr, BSOCK *bs) /* * Find next appendable medium for SD */ - n = sscanf(bs->msg, Find_media, &Job, &index, &pool_name, &mr.MediaType); - if (n == 4) { + n = sscanf(bs->msg, Find_media, &Job, &index, &pool_name, &mr.MediaType, &mr.VolType); + if (n == 5) { memset(&pr, 0, sizeof(pr)); bstrncpy(pr.Name, pool_name, sizeof(pr.Name)); unbash_spaces(pr.Name); @@ -222,11 +228,12 @@ void catalog_request(JCR *jcr, BSOCK *bs) */ n = sscanf(bs->msg, Update_media, &Job, &sdmr.VolumeName, &sdmr.VolJobs, &sdmr.VolFiles, &sdmr.VolBlocks, &sdmr.VolBytes, + &sdmr.VolABytes, &sdmr.VolHoleBytes, &sdmr.VolHoles, &sdmr.VolMounts, &sdmr.VolErrors, &sdmr.VolWrites, &sdmr.MaxVolBytes, &VolLastWritten, &sdmr.VolStatus, &sdmr.Slot, &label, &sdmr.InChanger, &sdmr.VolReadTime, &sdmr.VolWriteTime, &VolFirstWritten, - &sdmr.VolParts); - if (n == 19) { + &sdmr.VolType); + if (n == 22) { db_lock(jcr->db); Dmsg3(400, "Update media %s oldStat=%s newStat=%s\n", sdmr.VolumeName, mr.VolStatus, sdmr.VolStatus); @@ -298,12 +305,15 @@ void catalog_request(JCR *jcr, BSOCK *bs) mr.VolFiles = sdmr.VolFiles; mr.VolBlocks = sdmr.VolBlocks; mr.VolBytes = sdmr.VolBytes; + mr.VolABytes = sdmr.VolABytes; + mr.VolHoleBytes = sdmr.VolHoleBytes; + mr.VolHoles = sdmr.VolHoles; mr.VolMounts = sdmr.VolMounts; mr.VolErrors = sdmr.VolErrors; mr.VolWrites = sdmr.VolWrites; mr.Slot = sdmr.Slot; mr.InChanger = sdmr.InChanger; - mr.VolParts = sdmr.VolParts; + mr.VolType = sdmr.VolType; bstrncpy(mr.VolStatus, sdmr.VolStatus, sizeof(mr.VolStatus)); if (sdmr.VolReadTime >= 0) { mr.VolReadTime = sdmr.VolReadTime; @@ -334,28 +344,48 @@ void catalog_request(JCR *jcr, BSOCK *bs) /* * Request to create a JobMedia record */ - n = sscanf(bs->msg, Create_job_media, &Job, - &jm.FirstIndex, &jm.LastIndex, &jm.StartFile, &jm.EndFile, - &jm.StartBlock, &jm.EndBlock, &Copy, &Stripe, &MediaId); - if (n == 10) { + if (sscanf(bs->msg, Create_jobmedia, &Job) == 1) { if (jcr->wjcr) { jm.JobId = jcr->wjcr->JobId; } else { jm.JobId = jcr->JobId; } - jm.MediaId = MediaId; - Dmsg6(400, "create_jobmedia JobId=%d MediaId=%d SF=%d EF=%d FI=%d LI=%d\n", - jm.JobId, jm.MediaId, jm.StartFile, jm.EndFile, jm.FirstIndex, jm.LastIndex); - if (!db_create_jobmedia_record(jcr, jcr->db, &jm)) { + ok = true; + db_lock(jcr->db); + db_start_transaction(jcr, jcr->db); + while (bs->recv() >= 0) { + if (ok && sscanf(bs->msg, "%u %u %u %u %u %u %lld\n", + &jm.FirstIndex, &jm.LastIndex, &jm.StartFile, &jm.EndFile, + &jm.StartBlock, &jm.EndBlock, &MediaId) != 7) { + ok = false; + continue; + } + if (ok) { + jm.MediaId = MediaId; + Dmsg6(400, "create_jobmedia JobId=%d MediaId=%d SF=%d EF=%d FI=%d LI=%d\n", + jm.JobId, jm.MediaId, jm.StartFile, jm.EndFile, jm.FirstIndex, jm.LastIndex); + ok = db_create_jobmedia_record(jcr, jcr->db, &jm); + } + } + db_end_transaction(jcr, jcr->db); + if (!ok) { Jmsg(jcr, M_FATAL, 0, _("Catalog error creating JobMedia record. %s"), db_strerror(jcr->db)); + db_unlock(jcr->db); bs->fsend(_("1992 Create JobMedia error\n")); - } else { - Dmsg0(400, "JobMedia record created\n"); - bs->fsend(OK_create); + goto ok_out; } + db_unlock(jcr->db); + Dmsg0(400, "JobMedia record created\n"); + bs->fsend(OK_create); goto ok_out; } + + /* Handle snapshot catalog request */ + if (snapshot_catreq(jcr, bs)) { + goto ok_out; + } + Dmsg1(1000, "Tried create_jobmedia. fields wanted=10, got=%d\n", n); /* Everything failed. Send error message. */ @@ -389,7 +419,7 @@ static void update_attribute(JCR *jcr, char *msg, int32_t msglen) uint32_t reclen; /* Start transaction allocates jcr->attr and jcr->ar if needed */ - db_start_transaction(jcr, jcr->db); /* start transaction if not already open */ + db_start_transaction(jcr, jcr->db); /* start transaction if not already open */ ar = jcr->ar; /* @@ -595,7 +625,7 @@ static void update_attribute(JCR *jcr, char *msg, int32_t msglen) /* Update BaseFile table */ if (!db_create_attributes_record(jcr, jcr->db, ar)) { - Jmsg1(jcr, M_FATAL, 0, _("attribute create error. %s"), + Jmsg1(jcr, M_FATAL, 0, _("attribute create error. ERR=%s"), db_strerror(jcr->db)); } jcr->cached_attribute = false; diff --git a/bacula/src/dird/dir_plugins.c b/bacula/src/dird/dir_plugins.c index 6f693feb20..c6723414ca 100644 --- a/bacula/src/dird/dir_plugins.c +++ b/bacula/src/dird/dir_plugins.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Main program to test loading and running Bacula plugins. @@ -89,10 +93,10 @@ int generate_plugin_event(JCR *jcr, bDirEventType eventType, void *value) bpContext *plugin_ctx; bDirEvent event; Plugin *plugin; - int i; + int i = 0; bRC rc = bRC_OK; - if (!bplugin_list || !jcr || !jcr->plugin_ctx_list) { + if (!b_plugin_list || !jcr || !jcr->plugin_ctx_list) { return bRC_OK; /* Return if no plugins loaded */ } if (jcr->is_job_canceled()) { @@ -104,7 +108,7 @@ int generate_plugin_event(JCR *jcr, bDirEventType eventType, void *value) Dmsg2(dbglvl, "dir-plugin_ctx_list=%p JobId=%d\n", jcr->plugin_ctx_list, jcr->JobId); - foreach_alist_index(i, plugin, bplugin_list) { + foreach_alist_index(i, plugin, b_plugin_list) { plugin_ctx = &plugin_ctx_list[i]; if (is_plugin_disabled(plugin_ctx)) { continue; @@ -145,18 +149,18 @@ void load_dir_plugins(const char *plugin_dir) Plugin *plugin; int i; - Dmsg0(dbglvl, "Load dir plugins\n"); + Dmsg0(dbglvl, "Load Director plugins\n"); if (!plugin_dir) { - Dmsg0(dbglvl, "No dir plugin dir!\n"); + Dmsg0(dbglvl, "No Director plugin directory!\n"); return; } - bplugin_list = New(alist(10, not_owned_by_alist)); + b_plugin_list = New(alist(10, not_owned_by_alist)); if (!load_plugins((void *)&binfo, (void *)&bfuncs, plugin_dir, plugin_type, is_plugin_compatible)) { /* Either none found, or some error */ - if (bplugin_list->size() == 0) { - delete bplugin_list; - bplugin_list = NULL; + if (b_plugin_list->size() == 0) { + delete b_plugin_list; + b_plugin_list = NULL; Dmsg0(dbglvl, "No plugins loaded\n"); return; } @@ -165,12 +169,12 @@ void load_dir_plugins(const char *plugin_dir) * Verify that the plugin is acceptable, and print information * about it. */ - foreach_alist_index(i, plugin, bplugin_list) { + foreach_alist_index(i, plugin, b_plugin_list) { Jmsg(NULL, M_INFO, 0, _("Loaded plugin: %s\n"), plugin->file); Dmsg1(dbglvl, "Loaded plugin: %s\n", plugin->file); } - Dmsg1(dbglvl, "num plugins=%d\n", bplugin_list->size()); + Dmsg1(dbglvl, "num plugins=%d\n", b_plugin_list->size()); dbg_plugin_add_hook(dump_dir_plugin); } @@ -226,18 +230,18 @@ static bool is_plugin_compatible(Plugin *plugin) void new_plugins(JCR *jcr) { Plugin *plugin; - int i; + int i = 0; Dmsg0(dbglvl, "=== enter new_plugins ===\n"); - if (!bplugin_list) { - Dmsg0(dbglvl, "No dir plugin list!\n"); + if (!b_plugin_list) { + Dmsg0(dbglvl, "No Director plugin list!\n"); return; } if (jcr->is_job_canceled()) { return; } - int num = bplugin_list->size(); + int num = b_plugin_list->size(); Dmsg1(dbglvl, "dir-plugin-list size=%d\n", num); if (num == 0) { @@ -248,7 +252,7 @@ void new_plugins(JCR *jcr) bpContext *plugin_ctx_list = jcr->plugin_ctx_list; Dmsg2(dbglvl, "Instantiate dir-plugin_ctx_list=%p JobId=%d\n", jcr->plugin_ctx_list, jcr->JobId); - foreach_alist_index(i, plugin, bplugin_list) { + foreach_alist_index(i, plugin, b_plugin_list) { /* Start a new instance of each plugin */ bacula_ctx *b_ctx = (bacula_ctx *)malloc(sizeof(bacula_ctx)); memset(b_ctx, 0, sizeof(bacula_ctx)); @@ -267,15 +271,15 @@ void new_plugins(JCR *jcr) void free_plugins(JCR *jcr) { Plugin *plugin; - int i; + int i = 0; - if (!bplugin_list || !jcr->plugin_ctx_list) { + if (!b_plugin_list || !jcr->plugin_ctx_list) { return; } bpContext *plugin_ctx_list = (bpContext *)jcr->plugin_ctx_list; Dmsg2(dbglvl, "Free instance dir-plugin_ctx_list=%p JobId=%d\n", jcr->plugin_ctx_list, jcr->JobId); - foreach_alist_index(i, plugin, bplugin_list) { + foreach_alist_index(i, plugin, b_plugin_list) { /* Free the plugin instance */ dirplug_func(plugin)->freePlugin(&plugin_ctx_list[i]); free(plugin_ctx_list[i].bContext); /* free Bacula private context */ diff --git a/bacula/src/dird/dir_plugins.h b/bacula/src/dird/dir_plugins.h index 363acd0df5..0fa7f721d7 100644 --- a/bacula/src/dird/dir_plugins.h +++ b/bacula/src/dird/dir_plugins.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Interface definition for Bacula Plugins diff --git a/bacula/src/dird/dird.c b/bacula/src/dird/dird.c index 2df4c6d601..aa1ec186a8 100644 --- a/bacula/src/dird/dird.c +++ b/bacula/src/dird/dird.c @@ -1,23 +1,27 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * * Bacula Director daemon -- this is the main program * - * Written by Kern Sibbald, March MM + * Kern Sibbald, March MM * */ @@ -59,6 +63,7 @@ void store_replace(LEX *lc, RES_ITEM *item, int index, int pass); void store_migtype(LEX *lc, RES_ITEM *item, int index, int pass); void init_device_resources(); + static char *runjob = NULL; static bool background = true; static void init_reload(void); @@ -70,6 +75,7 @@ int FDConnectTimeout; int SDConnectTimeout; char *configfile = NULL; void *start_heap; +utime_t last_reload_time = 0; /* Globals Imported */ extern RES_ITEM job_items[]; @@ -90,56 +96,57 @@ static bool check_catalog(cat_op mode); #define CONFIG_FILE "bacula-dir.conf" /* default configuration file */ -/* - * This allows the message handler to operate on the database - * by using a pointer to this function. The pointer is - * needed because the other daemons do not have access - * to the database. If the pointer is - * not defined (other daemons), then writing the database - * is disabled. - */ -static bool dir_sql_query(JCR *jcr, const char *cmd) -{ - if (!jcr || !jcr->db || !jcr->db->is_connected()) { - return false; - } - - return db_sql_query(jcr->db, cmd); -} - -static bool dir_sql_escape(JCR *jcr, B_DB *mdb, char *snew, char *old, int len) -{ - if (!jcr || !jcr->db || !jcr->db->is_connected()) { - return false; - } - - db_escape_string(jcr, mdb, snew, old, len); - return true; -} +static bool dir_sql_query(JCR *jcr, const char *cmd) +{ + if (jcr && jcr->db && jcr->db->is_connected()) { + return db_sql_query(jcr->db, cmd, NULL, NULL); + } + return false; +} + +static bool dir_sql_escape(JCR *jcr, BDB *mdb, char *snew, char *sold, int len) +{ + if (jcr && jcr->db && jcr->db->is_connected()) { + db_escape_string(jcr, mdb, snew, sold, len); + return true; + } + return false; +} static void usage() { fprintf(stderr, _( -PROG_COPYRIGHT -"\nVersion: %s (%s)\n\n" -"Usage: bacula-dir [-f -s] [-c config_file] [-d debug_level] [config_file]\n" -" -c set configuration file to file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -f run in foreground (for debugging)\n" -" -g groupid\n" -" -m print kaboom output (for debugging)\n" -" -r run now\n" -" -s no signals\n" -" -t test - read configuration and exit\n" -" -u userid\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n"), 2000, VERSION, BDATE); + PROG_COPYRIGHT + "\nVersion: %s (%s)\n\n" + "Usage: bacula-dir [-f -s] [-c config_file] [-d debug_level] [config_file]\n" + " -c set configuration file to file\n" + " -d [,] set debug level to , debug tags to \n" + " -dt print timestamp in debug output\n" + " -T set trace on\n" + " -f run in foreground (for debugging)\n" + " -g groupid\n" + " -m print kaboom output (for debugging)\n" + " -r run now\n" + " -s no signals\n" + " -t test - read configuration and exit\n" + " -u userid\n" + " -v verbose user messages\n" + " -? print this message.\n" + "\n"), 2000, VERSION, BDATE); exit(1); } +/* + * !!! WARNING !!! Use this function only when bacula is stopped. + * ie, after a fatal signal and before exiting the program + * Print information about a JCR + */ +static void dir_debug_print(JCR *jcr, FILE *fp) +{ + fprintf(fp, "\twstore=%p rstore=%p wjcr=%p client=%p reschedule_count=%d SD_msg_chan_started=%d\n", + jcr->wstore, jcr->rstore, jcr->wjcr, jcr->client, jcr->reschedule_count, (int)jcr->SD_msg_chan_started); +} /********************************************************************* * @@ -173,7 +180,7 @@ int main (int argc, char *argv[]) console_command = run_console_command; - while ((ch = getopt(argc, argv, "c:d:fg:mr:stu:v?")) != -1) { + while ((ch = getopt(argc, argv, "c:d:fg:mr:stu:v?T")) != -1) { switch (ch) { case 'c': /* specify config file */ if (configfile != NULL) { @@ -186,12 +193,24 @@ int main (int argc, char *argv[]) if (*optarg == 't') { dbg_timestamp = true; } else { + char *p; + /* We probably find a tag list -d 10,sql,bvfs */ + if ((p = strchr(optarg, ',')) != NULL) { + *p = 0; + } debug_level = atoi(optarg); if (debug_level <= 0) { debug_level = 1; } + if (p) { + debug_parse_tags(p+1, &debug_level_tags); + } } - Dmsg1(10, "Debug level = %d\n", debug_level); + Dmsg1(10, "Debug level = %lld\n", debug_level); + break; + + case 'T': + set_trace(true); break; case 'f': /* run in foreground */ @@ -268,6 +287,7 @@ int main (int argc, char *argv[]) } config = new_config_parser(); + parse_dir_config(config, configfile, M_ERROR_TERM); if (init_crypto() != 0) { @@ -311,8 +331,8 @@ int main (int argc, char *argv[]) cleanup_old_files(); /* Plug database interface for library routines */ - p_sql_query = (sql_query_func)dir_sql_query; - p_sql_escape = (sql_escape_func)dir_sql_escape; + p_sql_query = (sql_query_call)dir_sql_query; + p_sql_escape = (sql_escape_call)dir_sql_escape; FDConnectTimeout = (int)director->FDConnectTimeout; SDConnectTimeout = (int)director->SDConnectTimeout; @@ -332,7 +352,10 @@ int main (int argc, char *argv[]) init_job_server(director->MaxConcurrentJobs); - dbg_jcr_add_hook(db_debug_print); /* used to debug B_DB connexion after fatal signal */ + dbg_jcr_add_hook(dir_debug_print); /* used to director variables */ + dbg_jcr_add_hook(bdb_debug_print); /* used to debug B_DB connexion after fatal signal */ + +// init_device_resources(); Dmsg0(200, "wait for next job\n"); /* Main loop -- call scheduler to get next job to run */ @@ -350,53 +373,12 @@ int main (int argc, char *argv[]) return 0; } -/* Cleanup and then exit */ -void terminate_dird(int sig) -{ - static bool already_here = false; - - if (already_here) { /* avoid recursive temination problems */ - bmicrosleep(2, 0); /* yield */ - exit(1); - } - already_here = true; - debug_level = 0; /* turn off debug */ - stop_watchdog(); - generate_daemon_event(NULL, "Exit"); - unload_plugins(); - write_state_file(director->working_directory, "bacula-dir", get_first_port_host_order(director->DIRaddrs)); - delete_pid_file(director->pid_directory, "bacula-dir", get_first_port_host_order(director->DIRaddrs)); - term_scheduler(); - term_job_server(); - if (runjob) { - free(runjob); - } - if (configfile != NULL) { - free(configfile); - } - if (debug_level > 5) { - print_memory_pool_stats(); - } - if (config) { - config->free_resources(); - free(config); - config = NULL; - } - term_ua_server(); - term_msg(); /* terminate message handler */ - cleanup_crypto(); - close_memory_pool(); /* release free memory in pool */ - lmgr_cleanup_main(); - sm_dump(false); - exit(sig); -} - struct RELOAD_TABLE { int job_count; RES **res_table; }; -static const int max_reloads = 32; +static const int max_reloads = 50; static RELOAD_TABLE reload_table[max_reloads]; static void init_reload(void) @@ -407,6 +389,10 @@ static void init_reload(void) } } +/* + * This subroutine frees a saved resource table. + * It was saved when a new table was created with "reload" + */ static void free_saved_resources(int table) { int num = r_last - r_first + 1; @@ -567,6 +553,47 @@ bail_out: already_here = false; } +/* Cleanup and then exit */ +void terminate_dird(int sig) +{ + static bool already_here = false; + + if (already_here) { /* avoid recursive temination problems */ + bmicrosleep(2, 0); /* yield */ + exit(1); + } + already_here = true; + debug_level = 0; /* turn off debug */ + stop_watchdog(); + generate_daemon_event(NULL, "Exit"); + unload_plugins(); + write_state_file(director->working_directory, "bacula-dir", get_first_port_host_order(director->DIRaddrs)); + delete_pid_file(director->pid_directory, "bacula-dir", get_first_port_host_order(director->DIRaddrs)); + term_scheduler(); + term_job_server(); + if (runjob) { + free(runjob); + } + if (configfile != NULL) { + free(configfile); + } + if (chk_dbglvl(5)) { + print_memory_pool_stats(); + } + if (config) { + config->free_resources(); + free(config); + config = NULL; + } + term_ua_server(); + term_msg(); /* terminate message handler */ + cleanup_crypto(); + close_memory_pool(); /* release free memory in pool */ + lmgr_cleanup_main(); + sm_dump(false); + exit(sig); +} + /* * Make a quick check to see that we have all the * resources needed. @@ -760,6 +787,7 @@ static bool check_resources() */ } else if (job_items[i].handler == store_time || job_items[i].handler == store_size64 || + job_items[i].handler == store_speed || job_items[i].handler == store_int64) { def_lvalue = (int64_t *)((char *)(job->jobdefs) + offset); Dmsg5(400, "Job \"%s\", field \"%s\" def_lvalue=%" lld " item %d offset=%u\n", @@ -899,50 +927,11 @@ static bool check_resources() } } - /* Loop over Storages */ - STORE *store; - foreach_res(store, R_STORAGE) { - /* tls_require implies tls_enable */ - if (store->tls_require) { - if (have_tls) { - store->tls_enable = true; - } else { - Jmsg(NULL, M_FATAL, 0, _("TLS required but not configured in Bacula.\n")); - OK = false; - continue; - } - } - - need_tls = store->tls_enable || store->tls_authenticate; - - if ((!store->tls_ca_certfile && !store->tls_ca_certdir) && need_tls) { - Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\"" - " or \"TLS CA Certificate Dir\" are defined for Storage \"%s\" in %s.\n"), - store->name(), configfile); - OK = false; - } - - /* If everything is well, attempt to initialize our per-resource TLS context */ - if (OK && (need_tls || store->tls_require)) { - /* Initialize TLS context: - * Args: CA certfile, CA certdir, Certfile, Keyfile, - * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */ - store->tls_ctx = new_tls_context(store->tls_ca_certfile, - store->tls_ca_certdir, store->tls_certfile, - store->tls_keyfile, NULL, NULL, NULL, true); - - if (!store->tls_ctx) { - Jmsg(NULL, M_FATAL, 0, _("Failed to initialize TLS context for Storage \"%s\" in %s.\n"), - store->name(), configfile); - OK = false; - } - } - } - UnlockRes(); if (OK) { close_msg(NULL); /* close temp message handler */ init_msg(NULL, director->messages); /* open daemon message handler */ + last_reload_time = time(NULL); } return OK; } @@ -956,20 +945,22 @@ static bool check_resources() static bool check_catalog(cat_op mode) { bool OK = true; + bool need_tls; /* Loop over databases */ CAT *catalog; foreach_res(catalog, R_CATALOG) { - B_DB *db; + BDB *db; /* * Make sure we can open catalog, otherwise print a warning * message because the server is probably not running. */ - db = db_init_database(NULL, catalog->db_driver, catalog->db_name, catalog->db_user, - catalog->db_password, catalog->db_address, - catalog->db_port, catalog->db_socket, - catalog->mult_db_connections, - catalog->disable_batch_insert); + db = db_init_database(NULL, catalog->db_driver, catalog->db_name, + catalog->db_user, + catalog->db_password, catalog->db_address, + catalog->db_port, catalog->db_socket, + catalog->mult_db_connections, + catalog->disable_batch_insert); if (!db || !db_open_database(NULL, db)) { Pmsg2(000, _("Could not open Catalog \"%s\", database \"%s\".\n"), catalog->name(), catalog->db_name); @@ -992,7 +983,7 @@ static bool check_catalog(cat_op mode) /* we are in testing mode, so don't touch anything in the catalog */ if (mode == CHECK_CONNECTION) { - db_close_database(NULL, db); + if (db) db_close_database(NULL, db); continue; } @@ -1035,6 +1026,7 @@ static bool check_catalog(cat_op mode) client->catalog->name(), client->name()); memset(&cr, 0, sizeof(cr)); bstrncpy(cr.Name, client->name(), sizeof(cr.Name)); + db_create_client_record(NULL, db, &cr); } @@ -1068,6 +1060,41 @@ static bool check_catalog(cat_op mode) OK = false; } } + + /* tls_require implies tls_enable */ + if (store->tls_require) { + if (have_tls) { + store->tls_enable = true; + } else { + Jmsg(NULL, M_FATAL, 0, _("TLS required but not configured in Bacula.\n")); + OK = false; + } + } + + need_tls = store->tls_enable || store->tls_authenticate; + + if ((!store->tls_ca_certfile && !store->tls_ca_certdir) && need_tls) { + Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\"" + " or \"TLS CA Certificate Dir\" are defined for Storage \"%s\" in %s.\n"), + store->name(), configfile); + OK = false; + } + + /* If everything is well, attempt to initialize our per-resource TLS context */ + if (OK && (need_tls || store->tls_require)) { + /* Initialize TLS context: + * Args: CA certfile, CA certdir, Certfile, Keyfile, + * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */ + store->tls_ctx = new_tls_context(store->tls_ca_certfile, + store->tls_ca_certdir, store->tls_certfile, + store->tls_keyfile, NULL, NULL, NULL, true); + + if (!store->tls_ctx) { + Jmsg(NULL, M_FATAL, 0, _("Failed to initialize TLS context for Storage \"%s\" in %s.\n"), + store->name(), configfile); + OK = false; + } + } } /* Loop over all counters, defining them in each database */ @@ -1102,10 +1129,9 @@ static bool check_catalog(cat_op mode) db_sql_query(db, cleanup_running_job, NULL, NULL); } - /* Set type in global for debugging */ - set_db_type(db_get_type(db)); - - db_close_database(NULL, db); + /* Set SQL engine name in global for debugging */ + set_db_engine_name(db_get_engine_name(db)); + if (db) db_close_database(NULL, db); } return OK; } @@ -1125,8 +1151,8 @@ static void cleanup_old_files() regmatch_t pmatch[nmatch]; berrno be; - /* Exclude spaces and look for .mail or .restore.xx.bsr files */ - const char *pat1 = "^[^ ]+\\.(restore\\.[^ ]+\\.bsr|mail)$"; + /* Exclude spaces and look for .mail, .tmp or .restore.xx.bsr files */ + const char *pat1 = "^[^ ]+\\.(restore\\.[^ ]+\\.bsr|mail|tmp)$"; /* Setup working directory prefix */ pm_strcpy(basename, director->working_directory); diff --git a/bacula/src/dird/dird.h b/bacula/src/dird/dird.h index 9b87a0133b..6f35c1373f 100644 --- a/bacula/src/dird/dird.h +++ b/bacula/src/dird/dird.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Includes specific to the Director @@ -29,7 +33,6 @@ #include "dir_plugins.h" #include "cats/cats.h" -#include "cats/sql_glue.h" #include "jcr.h" #include "bsr.h" diff --git a/bacula/src/dird/dird_conf.c b/bacula/src/dird/dird_conf.c index 82e2070d20..9e237116c5 100644 --- a/bacula/src/dird/dird_conf.c +++ b/bacula/src/dird/dird_conf.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Main configuration file parser for Bacula Directors, @@ -62,9 +66,8 @@ void store_level(LEX *lc, RES_ITEM *item, int index, int pass); void store_replace(LEX *lc, RES_ITEM *item, int index, int pass); void store_acl(LEX *lc, RES_ITEM *item, int index, int pass); void store_migtype(LEX *lc, RES_ITEM *item, int index, int pass); -static void store_actiononpurge(LEX *lc, RES_ITEM *item, int index, int pass); static void store_device(LEX *lc, RES_ITEM *item, int index, int pass); -static void store_runscript(LEX *lc, RES_ITEM *item, int index, int pass); +void store_actiononpurge(LEX *lc, RES_ITEM *item, int index, int pass); static void store_runscript_when(LEX *lc, RES_ITEM *item, int index, int pass); static void store_runscript_cmd(LEX *lc, RES_ITEM *item, int index, int pass); static void store_short_runscript(LEX *lc, RES_ITEM *item, int index, int pass); @@ -83,10 +86,10 @@ URES res_all; #endif int32_t res_all_size = sizeof(res_all); - -/* Definition of records permitted within each +/* + * Definition of records permitted within each * resource with the routine to process the record - * information. NOTE! quoted names must be in lower case. + * information. */ /* * Director Resource @@ -94,37 +97,38 @@ int32_t res_all_size = sizeof(res_all); * name handler value code flags default_value */ static RES_ITEM dir_items[] = { - {"name", store_name, ITEM(res_dir.hdr.name), 0, ITEM_REQUIRED, 0}, - {"description", store_str, ITEM(res_dir.hdr.desc), 0, 0, 0}, - {"messages", store_res, ITEM(res_dir.messages), R_MSGS, 0, 0}, - {"dirport", store_addresses_port, ITEM(res_dir.DIRaddrs), 0, ITEM_DEFAULT, 9101}, - {"diraddress", store_addresses_address, ITEM(res_dir.DIRaddrs), 0, ITEM_DEFAULT, 9101}, - {"diraddresses",store_addresses, ITEM(res_dir.DIRaddrs), 0, ITEM_DEFAULT, 9101}, - {"dirsourceaddress",store_addresses_address, ITEM(res_dir.DIRsrc_addr), 0, ITEM_DEFAULT, 0}, - {"queryfile", store_dir, ITEM(res_dir.query_file), 0, ITEM_REQUIRED, 0}, - {"workingdirectory", store_dir, ITEM(res_dir.working_directory), 0, ITEM_REQUIRED, 0}, - {"plugindirectory", store_dir, ITEM(res_dir.plugin_directory), 0, 0, 0}, - {"scriptsdirectory", store_dir, ITEM(res_dir.scripts_directory), 0, 0, 0}, - {"piddirectory", store_dir, ITEM(res_dir.pid_directory), 0, ITEM_REQUIRED, 0}, - {"subsysdirectory", store_dir, ITEM(res_dir.subsys_directory), 0, 0, 0}, - {"maximumconcurrentjobs", store_pint32, ITEM(res_dir.MaxConcurrentJobs), 0, ITEM_DEFAULT, 1}, - {"maximumconsoleconnections", store_pint32, ITEM(res_dir.MaxConsoleConnect), 0, ITEM_DEFAULT, 20}, - {"password", store_password, ITEM(res_dir.password), 0, ITEM_REQUIRED, 0}, - {"fdconnecttimeout", store_time,ITEM(res_dir.FDConnectTimeout), 0, ITEM_DEFAULT, 3 * 60}, - {"sdconnecttimeout", store_time,ITEM(res_dir.SDConnectTimeout), 0, ITEM_DEFAULT, 30 * 60}, - {"heartbeatinterval", store_time, ITEM(res_dir.heartbeat_interval), 0, ITEM_DEFAULT, 5 * 60}, - {"tlsauthenticate", store_bool, ITEM(res_dir.tls_authenticate), 0, 0, 0}, - {"tlsenable", store_bool, ITEM(res_dir.tls_enable), 0, 0, 0}, - {"tlsrequire", store_bool, ITEM(res_dir.tls_require), 0, 0, 0}, - {"tlsverifypeer", store_bool, ITEM(res_dir.tls_verify_peer), 0, ITEM_DEFAULT, true}, - {"tlscacertificatefile", store_dir, ITEM(res_dir.tls_ca_certfile), 0, 0, 0}, - {"tlscacertificatedir", store_dir, ITEM(res_dir.tls_ca_certdir), 0, 0, 0}, - {"tlscertificate", store_dir, ITEM(res_dir.tls_certfile), 0, 0, 0}, - {"tlskey", store_dir, ITEM(res_dir.tls_keyfile), 0, 0, 0}, - {"tlsdhfile", store_dir, ITEM(res_dir.tls_dhfile), 0, 0, 0}, - {"tlsallowedcn", store_alist_str, ITEM(res_dir.tls_allowed_cns), 0, 0, 0}, - {"statisticsretention", store_time, ITEM(res_dir.stats_retention), 0, ITEM_DEFAULT, 60*60*24*31*12*5}, - {"verid", store_str, ITEM(res_dir.verid), 0, 0, 0}, + {"Name", store_name, ITEM(res_dir.hdr.name), 0, ITEM_REQUIRED, 0}, + {"Description", store_str, ITEM(res_dir.hdr.desc), 0, 0, 0}, + {"Messages", store_res, ITEM(res_dir.messages), R_MSGS, 0, 0}, + {"DirPort", store_addresses_port, ITEM(res_dir.DIRaddrs), 0, ITEM_DEFAULT, 9101}, + {"DirAddress", store_addresses_address, ITEM(res_dir.DIRaddrs), 0, ITEM_DEFAULT, 9101}, + {"DirAddresses",store_addresses, ITEM(res_dir.DIRaddrs), 0, ITEM_DEFAULT, 9101}, + {"DirSourceAddress",store_addresses_address, ITEM(res_dir.DIRsrc_addr), 0, ITEM_DEFAULT, 0}, + {"QueryFile", store_dir, ITEM(res_dir.query_file), 0, ITEM_REQUIRED, 0}, + {"WorkingDirectory", store_dir, ITEM(res_dir.working_directory), 0, ITEM_REQUIRED, 0}, + {"PluginDirectory", store_dir, ITEM(res_dir.plugin_directory), 0, 0, 0}, + {"ScriptsDirectory", store_dir, ITEM(res_dir.scripts_directory), 0, 0, 0}, + {"PidDirectory", store_dir, ITEM(res_dir.pid_directory), 0, ITEM_REQUIRED, 0}, + {"SubsysDirectory", store_dir, ITEM(res_dir.subsys_directory), 0, 0, 0}, + {"MaximumConcurrentJobs", store_pint32, ITEM(res_dir.MaxConcurrentJobs), 0, ITEM_DEFAULT, 1}, + {"MaximumReloadRequests", store_pint32, ITEM(res_dir.MaxReload), 0, ITEM_DEFAULT, 32}, + {"MaximumConsoleConnections", store_pint32, ITEM(res_dir.MaxConsoleConnect), 0, ITEM_DEFAULT, 20}, + {"Password", store_password, ITEM(res_dir.password), 0, ITEM_REQUIRED, 0}, + {"FdConnectTimeout", store_time,ITEM(res_dir.FDConnectTimeout), 0, ITEM_DEFAULT, 3 * 60}, + {"SdConnectTimeout", store_time,ITEM(res_dir.SDConnectTimeout), 0, ITEM_DEFAULT, 30 * 60}, + {"HeartbeatInterval", store_time, ITEM(res_dir.heartbeat_interval), 0, ITEM_DEFAULT, 5 * 60}, + {"TlsAuthenticate", store_bool, ITEM(res_dir.tls_authenticate), 0, 0, 0}, + {"TlsEnable", store_bool, ITEM(res_dir.tls_enable), 0, 0, 0}, + {"TlsRequire", store_bool, ITEM(res_dir.tls_require), 0, 0, 0}, + {"TlsVerifyPeer", store_bool, ITEM(res_dir.tls_verify_peer), 0, ITEM_DEFAULT, true}, + {"TlsCaCertificateFile", store_dir, ITEM(res_dir.tls_ca_certfile), 0, 0, 0}, + {"TlsCaCertificateDir", store_dir, ITEM(res_dir.tls_ca_certdir), 0, 0, 0}, + {"TlsCertificate", store_dir, ITEM(res_dir.tls_certfile), 0, 0, 0}, + {"TlsKey", store_dir, ITEM(res_dir.tls_keyfile), 0, 0, 0}, + {"TlsDhFile", store_dir, ITEM(res_dir.tls_dhfile), 0, 0, 0}, + {"TlsAllowedCn", store_alist_str, ITEM(res_dir.tls_allowed_cns), 0, 0, 0}, + {"StatisticsRetention", store_time, ITEM(res_dir.stats_retention), 0, ITEM_DEFAULT, 60*60*24*31*12*5}, + {"VerId", store_str, ITEM(res_dir.verid), 0, 0, 0}, {NULL, NULL, {0}, 0, 0, 0} }; @@ -134,30 +138,30 @@ static RES_ITEM dir_items[] = { * name handler value code flags default_value */ static RES_ITEM con_items[] = { - {"name", store_name, ITEM(res_con.hdr.name), 0, ITEM_REQUIRED, 0}, - {"description", store_str, ITEM(res_con.hdr.desc), 0, 0, 0}, - {"password", store_password, ITEM(res_con.password), 0, ITEM_REQUIRED, 0}, - {"jobacl", store_acl, ITEM(res_con.ACL_lists), Job_ACL, 0, 0}, - {"clientacl", store_acl, ITEM(res_con.ACL_lists), Client_ACL, 0, 0}, - {"storageacl", store_acl, ITEM(res_con.ACL_lists), Storage_ACL, 0, 0}, - {"scheduleacl", store_acl, ITEM(res_con.ACL_lists), Schedule_ACL, 0, 0}, - {"runacl", store_acl, ITEM(res_con.ACL_lists), Run_ACL, 0, 0}, - {"poolacl", store_acl, ITEM(res_con.ACL_lists), Pool_ACL, 0, 0}, - {"commandacl", store_acl, ITEM(res_con.ACL_lists), Command_ACL, 0, 0}, - {"filesetacl", store_acl, ITEM(res_con.ACL_lists), FileSet_ACL, 0, 0}, - {"catalogacl", store_acl, ITEM(res_con.ACL_lists), Catalog_ACL, 0, 0}, - {"whereacl", store_acl, ITEM(res_con.ACL_lists), Where_ACL, 0, 0}, - {"pluginoptionsacl", store_acl, ITEM(res_con.ACL_lists), PluginOptions_ACL, 0, 0}, - {"tlsauthenticate", store_bool, ITEM(res_con.tls_authenticate), 0, 0, 0}, - {"tlsenable", store_bool, ITEM(res_con.tls_enable), 0, 0, 0}, - {"tlsrequire", store_bool, ITEM(res_con.tls_require), 0, 0, 0}, - {"tlsverifypeer", store_bool, ITEM(res_con.tls_verify_peer), 0, ITEM_DEFAULT, true}, - {"tlscacertificatefile", store_dir, ITEM(res_con.tls_ca_certfile), 0, 0, 0}, - {"tlscacertificatedir", store_dir, ITEM(res_con.tls_ca_certdir), 0, 0, 0}, - {"tlscertificate", store_dir, ITEM(res_con.tls_certfile), 0, 0, 0}, - {"tlskey", store_dir, ITEM(res_con.tls_keyfile), 0, 0, 0}, - {"tlsdhfile", store_dir, ITEM(res_con.tls_dhfile), 0, 0, 0}, - {"tlsallowedcn", store_alist_str, ITEM(res_con.tls_allowed_cns), 0, 0, 0}, + {"Name", store_name, ITEM(res_con.hdr.name), 0, ITEM_REQUIRED, 0}, + {"Description", store_str, ITEM(res_con.hdr.desc), 0, 0, 0}, + {"Password", store_password, ITEM(res_con.password), 0, ITEM_REQUIRED, 0}, + {"JobAcl", store_acl, ITEM(res_con.ACL_lists), Job_ACL, 0, 0}, + {"ClientAcl", store_acl, ITEM(res_con.ACL_lists), Client_ACL, 0, 0}, + {"StorageAcl", store_acl, ITEM(res_con.ACL_lists), Storage_ACL, 0, 0}, + {"ScheduleAcl", store_acl, ITEM(res_con.ACL_lists), Schedule_ACL, 0, 0}, + {"RunAcl", store_acl, ITEM(res_con.ACL_lists), Run_ACL, 0, 0}, + {"PoolAcl", store_acl, ITEM(res_con.ACL_lists), Pool_ACL, 0, 0}, + {"CommandAcl", store_acl, ITEM(res_con.ACL_lists), Command_ACL, 0, 0}, + {"FilesetAcl", store_acl, ITEM(res_con.ACL_lists), FileSet_ACL, 0, 0}, + {"CatalogAcl", store_acl, ITEM(res_con.ACL_lists), Catalog_ACL, 0, 0}, + {"WhereAcl", store_acl, ITEM(res_con.ACL_lists), Where_ACL, 0, 0}, + {"PluginOptionsAcl", store_acl, ITEM(res_con.ACL_lists), PluginOptions_ACL, 0, 0}, + {"TlsAuthenticate", store_bool, ITEM(res_con.tls_authenticate), 0, 0, 0}, + {"TlsEnable", store_bool, ITEM(res_con.tls_enable), 0, 0, 0}, + {"TlsRequire", store_bool, ITEM(res_con.tls_require), 0, 0, 0}, + {"TlsVerifyPeer", store_bool, ITEM(res_con.tls_verify_peer), 0, ITEM_DEFAULT, true}, + {"TlsCaCertificateFile", store_dir, ITEM(res_con.tls_ca_certfile), 0, 0, 0}, + {"TlsCaCertificateDir", store_dir, ITEM(res_con.tls_ca_certdir), 0, 0, 0}, + {"TlsCertificate", store_dir, ITEM(res_con.tls_certfile), 0, 0, 0}, + {"TlsKey", store_dir, ITEM(res_con.tls_keyfile), 0, 0, 0}, + {"TlsDhFile", store_dir, ITEM(res_con.tls_dhfile), 0, 0, 0}, + {"TlsAllowedCn", store_alist_str, ITEM(res_con.tls_allowed_cns), 0, 0, 0}, {NULL, NULL, {0}, 0, 0, 0} }; @@ -169,30 +173,32 @@ static RES_ITEM con_items[] = { */ static RES_ITEM cli_items[] = { - {"name", store_name, ITEM(res_client.hdr.name), 0, ITEM_REQUIRED, 0}, - {"description", store_str, ITEM(res_client.hdr.desc), 0, 0, 0}, - {"address", store_str, ITEM(res_client.address), 0, ITEM_REQUIRED, 0}, + {"Name", store_name, ITEM(res_client.hdr.name), 0, ITEM_REQUIRED, 0}, + {"Description", store_str, ITEM(res_client.hdr.desc), 0, 0, 0}, {"fdaddress", store_str, ITEM(res_client.address), 0, 0, 0}, - {"fdport", store_pint32, ITEM(res_client.FDport), 0, ITEM_DEFAULT, 9102}, - {"password", store_password, ITEM(res_client.password), 0, ITEM_REQUIRED, 0}, + {"Address", store_str, ITEM(res_client.address), 0, ITEM_REQUIRED, 0}, + {"FdPort", store_pint32, ITEM(res_client.FDport), 0, ITEM_DEFAULT, 9102}, {"fdpassword", store_password, ITEM(res_client.password), 0, 0, 0}, - {"fdstorageaddress", store_str, ITEM(res_client.fd_storage_address), 0, 0, 0}, - {"catalog", store_res, ITEM(res_client.catalog), R_CATALOG, ITEM_REQUIRED, 0}, - {"fileretention", store_time, ITEM(res_client.FileRetention), 0, ITEM_DEFAULT, 60*60*24*60}, - {"jobretention", store_time, ITEM(res_client.JobRetention), 0, ITEM_DEFAULT, 60*60*24*180}, - {"heartbeatinterval", store_time, ITEM(res_client.heartbeat_interval), 0, ITEM_DEFAULT, 5 * 60}, - {"autoprune", store_bool, ITEM(res_client.AutoPrune), 0, ITEM_DEFAULT, true}, - {"sdcallsclient", store_bool, ITEM(res_client.sd_calls_client), 0, ITEM_DEFAULT, false}, - {"maximumconcurrentjobs", store_pint32, ITEM(res_client.MaxConcurrentJobs), 0, ITEM_DEFAULT, 1}, - {"tlsauthenticate", store_bool, ITEM(res_client.tls_authenticate), 0, 0, 0}, - {"tlsenable", store_bool, ITEM(res_client.tls_enable), 0, 0, 0}, - {"tlsrequire", store_bool, ITEM(res_client.tls_require), 0, 0, 0}, - {"tlscacertificatefile", store_dir, ITEM(res_client.tls_ca_certfile), 0, 0, 0}, - {"tlscacertificatedir", store_dir, ITEM(res_client.tls_ca_certdir), 0, 0, 0}, - {"tlscertificate", store_dir, ITEM(res_client.tls_certfile), 0, 0, 0}, - {"tlskey", store_dir, ITEM(res_client.tls_keyfile), 0, 0, 0}, - {"tlsallowedcn", store_alist_str, ITEM(res_client.tls_allowed_cns), 0, 0, 0}, - {"maximumbandwidthperjob", store_speed, ITEM(res_client.max_bandwidth), 0, 0, 0}, + {"Password", store_password, ITEM(res_client.password), 0, ITEM_REQUIRED, 0}, + {"FdStorageAddress", store_str, ITEM(res_client.fd_storage_address), 0, 0, 0}, + {"Catalog", store_res, ITEM(res_client.catalog), R_CATALOG, ITEM_REQUIRED, 0}, + {"FileRetention", store_time, ITEM(res_client.FileRetention), 0, ITEM_DEFAULT, 60*60*24*60}, + {"JobRetention", store_time, ITEM(res_client.JobRetention), 0, ITEM_DEFAULT, 60*60*24*180}, + {"HeartbeatInterval", store_time, ITEM(res_client.heartbeat_interval), 0, ITEM_DEFAULT, 5 * 60}, + {"AutoPrune", store_bool, ITEM(res_client.AutoPrune), 0, ITEM_DEFAULT, true}, + {"SDCallsClient", store_bool, ITEM(res_client.sd_calls_client), 0, ITEM_DEFAULT, false}, + {"SnapshotRetention", store_time, ITEM(res_client.SnapRetention), 0, ITEM_DEFAULT, 0}, + {"MaximumConcurrentJobs", store_pint32, ITEM(res_client.MaxConcurrentJobs), 0, ITEM_DEFAULT, 1}, + {"TlsAuthenticate", store_bool, ITEM(res_client.tls_authenticate), 0, 0, 0}, + {"TlsEnable", store_bool, ITEM(res_client.tls_enable), 0, 0, 0}, + {"TlsRequire", store_bool, ITEM(res_client.tls_require), 0, 0, 0}, + {"TlsCaCertificateFile", store_dir, ITEM(res_client.tls_ca_certfile), 0, 0, 0}, + {"TlsCaCertificateDir", store_dir, ITEM(res_client.tls_ca_certdir), 0, 0, 0}, + {"TlsCertificate", store_dir, ITEM(res_client.tls_certfile), 0, 0, 0}, + {"TlsKey", store_dir, ITEM(res_client.tls_keyfile), 0, 0, 0}, + {"TlsAllowedCn", store_alist_str, ITEM(res_client.tls_allowed_cns), 0, 0, 0}, + {"MaximumBandwidthPerJob", store_speed, ITEM(res_client.max_bandwidth), 0, 0, 0}, + {"Enabled", store_bool, ITEM(res_client.enabled), 0, ITEM_DEFAULT, true}, {NULL, NULL, {0}, 0, 0, 0} }; @@ -201,30 +207,30 @@ static RES_ITEM cli_items[] = { * name handler value code flags default_value */ static RES_ITEM store_items[] = { - {"name", store_name, ITEM(res_store.hdr.name), 0, ITEM_REQUIRED, 0}, - {"description", store_str, ITEM(res_store.hdr.desc), 0, 0, 0}, - {"sdport", store_pint32, ITEM(res_store.SDport), 0, ITEM_DEFAULT, 9103}, - {"address", store_str, ITEM(res_store.address), 0, ITEM_REQUIRED, 0}, + {"Name", store_name, ITEM(res_store.hdr.name), 0, ITEM_REQUIRED, 0}, + {"Description", store_str, ITEM(res_store.hdr.desc), 0, 0, 0}, + {"SdPort", store_pint32, ITEM(res_store.SDport), 0, ITEM_DEFAULT, 9103}, {"sdaddress", store_str, ITEM(res_store.address), 0, 0, 0}, - {"password", store_password, ITEM(res_store.password), 0, ITEM_REQUIRED, 0}, - {"fdstorageaddress", store_str, ITEM(res_store.fd_storage_address), 0, 0, 0}, + {"Address", store_str, ITEM(res_store.address), 0, ITEM_REQUIRED, 0}, + {"FdStorageAddress", store_str, ITEM(res_store.fd_storage_address), 0, 0, 0}, {"sdpassword", store_password, ITEM(res_store.password), 0, 0, 0}, - {"device", store_device, ITEM(res_store.device), R_DEVICE, ITEM_REQUIRED, 0}, - {"mediatype", store_strname, ITEM(res_store.media_type), 0, ITEM_REQUIRED, 0}, - {"autochanger", store_bool, ITEM(res_store.autochanger), 0, ITEM_DEFAULT, 0}, - {"enabled", store_bool, ITEM(res_store.enabled), 0, ITEM_DEFAULT, true}, - {"allowcompression", store_bool, ITEM(res_store.AllowCompress), 0, ITEM_DEFAULT, true}, - {"heartbeatinterval", store_time, ITEM(res_store.heartbeat_interval), 0, ITEM_DEFAULT, 5 * 60}, - {"maximumconcurrentjobs", store_pint32, ITEM(res_store.MaxConcurrentJobs), 0, ITEM_DEFAULT, 1}, - {"maximumconcurrentreadjobs", store_pint32, ITEM(res_store.MaxConcurrentReadJobs), 0, ITEM_DEFAULT, 0}, + {"Password", store_password, ITEM(res_store.password), 0, ITEM_REQUIRED, 0}, + {"Device", store_device, ITEM(res_store.device), R_DEVICE, ITEM_REQUIRED, 0}, + {"MediaType", store_strname, ITEM(res_store.media_type), 0, ITEM_REQUIRED, 0}, + {"Autochanger", store_bool, ITEM(res_store.autochanger), 0, ITEM_DEFAULT, false}, + {"Enabled", store_bool, ITEM(res_store.enabled), 0, ITEM_DEFAULT, true}, + {"AllowCompression", store_bool, ITEM(res_store.AllowCompress), 0, ITEM_DEFAULT, true}, + {"HeartbeatInterval", store_time, ITEM(res_store.heartbeat_interval), 0, ITEM_DEFAULT, 5 * 60}, + {"MaximumConcurrentJobs", store_pint32, ITEM(res_store.MaxConcurrentJobs), 0, ITEM_DEFAULT, 1}, + {"MaximumConcurrentReadjobs", store_pint32, ITEM(res_store.MaxConcurrentReadJobs), 0, ITEM_DEFAULT, 0}, {"sddport", store_pint32, ITEM(res_store.SDDport), 0, 0, 0}, /* deprecated */ - {"tlsauthenticate", store_bool, ITEM(res_store.tls_authenticate), 0, 0, 0}, - {"tlsenable", store_bool, ITEM(res_store.tls_enable), 0, 0, 0}, - {"tlsrequire", store_bool, ITEM(res_store.tls_require), 0, 0, 0}, - {"tlscacertificatefile", store_dir, ITEM(res_store.tls_ca_certfile), 0, 0, 0}, - {"tlscacertificatedir", store_dir, ITEM(res_store.tls_ca_certdir), 0, 0, 0}, - {"tlscertificate", store_dir, ITEM(res_store.tls_certfile), 0, 0, 0}, - {"tlskey", store_dir, ITEM(res_store.tls_keyfile), 0, 0, 0}, + {"TlsAuthenticate", store_bool, ITEM(res_store.tls_authenticate), 0, 0, 0}, + {"TlsEnable", store_bool, ITEM(res_store.tls_enable), 0, 0, 0}, + {"TlsRequire", store_bool, ITEM(res_store.tls_require), 0, 0, 0}, + {"TlsCaCertificateFile", store_dir, ITEM(res_store.tls_ca_certfile), 0, 0, 0}, + {"TlsCaCertificateDir", store_dir, ITEM(res_store.tls_ca_certdir), 0, 0, 0}, + {"TlsCertificate", store_dir, ITEM(res_store.tls_certfile), 0, 0, 0}, + {"TlsKey", store_dir, ITEM(res_store.tls_keyfile), 0, 0, 0}, {NULL, NULL, {0}, 0, 0, 0} }; @@ -234,22 +240,22 @@ static RES_ITEM store_items[] = { * name handler value code flags default_value */ static RES_ITEM cat_items[] = { - {"name", store_name, ITEM(res_cat.hdr.name), 0, ITEM_REQUIRED, 0}, - {"description", store_str, ITEM(res_cat.hdr.desc), 0, 0, 0}, - {"address", store_str, ITEM(res_cat.db_address), 0, 0, 0}, + {"Name", store_name, ITEM(res_cat.hdr.name), 0, ITEM_REQUIRED, 0}, + {"Description", store_str, ITEM(res_cat.hdr.desc), 0, 0, 0}, {"dbaddress", store_str, ITEM(res_cat.db_address), 0, 0, 0}, - {"dbport", store_pint32, ITEM(res_cat.db_port), 0, 0, 0}, + {"Address", store_str, ITEM(res_cat.db_address), 0, 0, 0}, + {"DbPort", store_pint32, ITEM(res_cat.db_port), 0, 0, 0}, /* keep this password as store_str for the moment */ - {"password", store_str, ITEM(res_cat.db_password), 0, 0, 0}, {"dbpassword", store_str, ITEM(res_cat.db_password), 0, 0, 0}, + {"Password", store_str, ITEM(res_cat.db_password), 0, 0, 0}, {"dbuser", store_str, ITEM(res_cat.db_user), 0, 0, 0}, - {"user", store_str, ITEM(res_cat.db_user), 0, 0, 0}, - {"dbname", store_str, ITEM(res_cat.db_name), 0, ITEM_REQUIRED, 0}, + {"User", store_str, ITEM(res_cat.db_user), 0, 0, 0}, + {"DbName", store_str, ITEM(res_cat.db_name), 0, ITEM_REQUIRED, 0}, {"dbdriver", store_str, ITEM(res_cat.db_driver), 0, 0, 0}, - {"dbsocket", store_str, ITEM(res_cat.db_socket), 0, 0, 0}, + {"DbSocket", store_str, ITEM(res_cat.db_socket), 0, 0, 0}, /* Turned off for the moment */ - {"multipleconnections", store_bit, ITEM(res_cat.mult_db_connections), 0, 0, 0}, - {"disablebatchinsert", store_bool, ITEM(res_cat.disable_batch_insert), 0, ITEM_DEFAULT, false}, + {"MultipleConnections", store_bit, ITEM(res_cat.mult_db_connections), 0, 0, 0}, + {"DisableBatchInsert", store_bool, ITEM(res_cat.disable_batch_insert), 0, ITEM_DEFAULT, false}, {NULL, NULL, {0}, 0, 0, 0} }; @@ -259,99 +265,102 @@ static RES_ITEM cat_items[] = { * name handler value code flags default_value */ RES_ITEM job_items[] = { - {"name", store_name, ITEM(res_job.hdr.name), 0, ITEM_REQUIRED, 0}, - {"description", store_str, ITEM(res_job.hdr.desc), 0, 0, 0}, - {"type", store_jobtype, ITEM(res_job.JobType), 0, ITEM_REQUIRED, 0}, - {"level", store_level, ITEM(res_job.JobLevel), 0, 0, 0}, - {"messages", store_res, ITEM(res_job.messages), R_MSGS, ITEM_REQUIRED, 0}, - {"storage", store_alist_res, ITEM(res_job.storage), R_STORAGE, 0, 0}, - {"pool", store_res, ITEM(res_job.pool), R_POOL, ITEM_REQUIRED, 0}, - {"nextpool", store_res, ITEM(res_job.next_pool), R_POOL, 0, 0}, - {"fullbackuppool", store_res, ITEM(res_job.full_pool), R_POOL, 0, 0}, - {"incrementalbackuppool", store_res, ITEM(res_job.inc_pool), R_POOL, 0, 0}, - {"differentialbackuppool", store_res, ITEM(res_job.diff_pool), R_POOL, 0, 0}, - {"client", store_res, ITEM(res_job.client), R_CLIENT, ITEM_REQUIRED, 0}, - {"fileset", store_res, ITEM(res_job.fileset), R_FILESET, ITEM_REQUIRED, 0}, - {"schedule", store_res, ITEM(res_job.schedule), R_SCHEDULE, 0, 0}, - {"verifyjob", store_res, ITEM(res_job.verify_job), R_JOB, 0, 0}, - {"jobtoverify", store_res, ITEM(res_job.verify_job), R_JOB, 0, 0}, - {"jobdefs", store_res, ITEM(res_job.jobdefs), R_JOBDEFS, 0, 0}, - {"run", store_alist_str, ITEM(res_job.run_cmds), 0, 0, 0}, + {"Name", store_name, ITEM(res_job.hdr.name), 0, ITEM_REQUIRED, 0}, + {"Description", store_str, ITEM(res_job.hdr.desc), 0, 0, 0}, + {"Type", store_jobtype, ITEM(res_job.JobType), 0, ITEM_REQUIRED, 0}, + {"Level", store_level, ITEM(res_job.JobLevel), 0, 0, 0}, + {"Messages", store_res, ITEM(res_job.messages), R_MSGS, ITEM_REQUIRED, 0}, + {"Storage", store_alist_res, ITEM(res_job.storage), R_STORAGE, 0, 0}, + {"Pool", store_res, ITEM(res_job.pool), R_POOL, ITEM_REQUIRED, 0}, + {"NextPool", store_res, ITEM(res_job.next_pool), R_POOL, 0, 0}, + {"FullBackupPool", store_res, ITEM(res_job.full_pool), R_POOL, 0, 0}, + {"IncrementalBackupPool", store_res, ITEM(res_job.inc_pool), R_POOL, 0, 0}, + {"DifferentialBackupPool", store_res, ITEM(res_job.diff_pool), R_POOL, 0, 0}, + {"Client", store_res, ITEM(res_job.client), R_CLIENT, ITEM_REQUIRED, 0}, + {"Fileset", store_res, ITEM(res_job.fileset), R_FILESET, ITEM_REQUIRED, 0}, + {"Schedule", store_res, ITEM(res_job.schedule), R_SCHEDULE, 0, 0}, + {"VerifyJob", store_res, ITEM(res_job.verify_job), R_JOB, 0, 0}, + {"JobToVerify", store_res, ITEM(res_job.verify_job), R_JOB, 0, 0}, + {"JobDefs", store_res, ITEM(res_job.jobdefs), R_JOBDEFS, 0, 0}, + {"Run", store_alist_str, ITEM(res_job.run_cmds), 0, 0, 0}, /* Root of where to restore files */ - {"where", store_dir, ITEM(res_job.RestoreWhere), 0, 0, 0}, - {"regexwhere", store_str, ITEM(res_job.RegexWhere), 0, 0, 0}, - {"stripprefix", store_str, ITEM(res_job.strip_prefix), 0, 0, 0}, - {"addprefix", store_str, ITEM(res_job.add_prefix), 0, 0, 0}, - {"addsuffix", store_str, ITEM(res_job.add_suffix), 0, 0, 0}, + {"Where", store_dir, ITEM(res_job.RestoreWhere), 0, 0, 0}, + {"RegexWhere", store_str, ITEM(res_job.RegexWhere), 0, 0, 0}, + {"StripPrefix", store_str, ITEM(res_job.strip_prefix), 0, 0, 0}, + {"AddPrefix", store_str, ITEM(res_job.add_prefix), 0, 0, 0}, + {"AddSuffix", store_str, ITEM(res_job.add_suffix), 0, 0, 0}, /* Where to find bootstrap during restore */ - {"bootstrap",store_dir, ITEM(res_job.RestoreBootstrap), 0, 0, 0}, + {"Bootstrap",store_dir, ITEM(res_job.RestoreBootstrap), 0, 0, 0}, /* Where to write bootstrap file during backup */ - {"writebootstrap",store_dir, ITEM(res_job.WriteBootstrap), 0, 0, 0}, - {"writeverifylist",store_dir,ITEM(res_job.WriteVerifyList), 0, 0, 0}, - {"replace", store_replace, ITEM(res_job.replace), 0, ITEM_DEFAULT, REPLACE_ALWAYS}, - {"maximumbandwidth", store_speed, ITEM(res_job.max_bandwidth), 0, 0, 0}, - {"maxrunschedtime", store_time, ITEM(res_job.MaxRunSchedTime), 0, 0, 0}, - {"maxruntime", store_time, ITEM(res_job.MaxRunTime), 0, 0, 0}, + {"WriteBootstrap",store_dir, ITEM(res_job.WriteBootstrap), 0, 0, 0}, + {"WriteVerifyList",store_dir,ITEM(res_job.WriteVerifyList), 0, 0, 0}, + {"Replace", store_replace, ITEM(res_job.replace), 0, ITEM_DEFAULT, REPLACE_ALWAYS}, + {"MaximumBandwidth", store_speed, ITEM(res_job.max_bandwidth), 0, 0, 0}, + {"MaxRunSchedTime", store_time, ITEM(res_job.MaxRunSchedTime), 0, 0, 0}, + {"MaxRunTime", store_time, ITEM(res_job.MaxRunTime), 0, 0, 0}, /* xxxMaxWaitTime are deprecated */ {"fullmaxwaittime", store_time, ITEM(res_job.FullMaxRunTime), 0, 0, 0}, {"incrementalmaxwaittime", store_time, ITEM(res_job.IncMaxRunTime), 0, 0, 0}, {"differentialmaxwaittime", store_time, ITEM(res_job.DiffMaxRunTime), 0, 0, 0}, - {"fullmaxruntime", store_time, ITEM(res_job.FullMaxRunTime), 0, 0, 0}, - {"incrementalmaxruntime", store_time, ITEM(res_job.IncMaxRunTime), 0, 0, 0}, - {"differentialmaxruntime", store_time, ITEM(res_job.DiffMaxRunTime), 0, 0, 0}, - {"maxwaittime", store_time, ITEM(res_job.MaxWaitTime), 0, 0, 0}, - {"maxstartdelay",store_time, ITEM(res_job.MaxStartDelay), 0, 0, 0}, - {"maxfullinterval", store_time, ITEM(res_job.MaxFullInterval), 0, 0, 0}, - {"maxdiffinterval", store_time, ITEM(res_job.MaxDiffInterval), 0, 0, 0}, - {"prefixlinks", store_bool, ITEM(res_job.PrefixLinks), 0, ITEM_DEFAULT, false}, - {"prunejobs", store_bool, ITEM(res_job.PruneJobs), 0, ITEM_DEFAULT, false}, - {"prunefiles", store_bool, ITEM(res_job.PruneFiles), 0, ITEM_DEFAULT, false}, - {"prunevolumes",store_bool, ITEM(res_job.PruneVolumes), 0, ITEM_DEFAULT, false}, - {"purgemigrationjob", store_bool, ITEM(res_job.PurgeMigrateJob), 0, ITEM_DEFAULT, false}, - {"enabled", store_bool, ITEM(res_job.enabled), 0, ITEM_DEFAULT, true}, - {"spoolattributes",store_bool, ITEM(res_job.SpoolAttributes), 0, ITEM_DEFAULT, false}, - {"spooldata", store_bool, ITEM(res_job.spool_data), 0, ITEM_DEFAULT, false}, - {"spoolsize", store_size64, ITEM(res_job.spool_size), 0, 0, 0}, - {"rerunfailedlevels", store_bool, ITEM(res_job.rerun_failed_levels), 0, ITEM_DEFAULT, false}, - {"prefermountedvolumes", store_bool, ITEM(res_job.PreferMountedVolumes), 0, ITEM_DEFAULT, true}, + {"FullMaxRunTime", store_time, ITEM(res_job.FullMaxRunTime), 0, 0, 0}, + {"IncrementalMaxRunTime", store_time, ITEM(res_job.IncMaxRunTime), 0, 0, 0}, + {"DifferentialMaxRunTime", store_time, ITEM(res_job.DiffMaxRunTime), 0, 0, 0}, + {"MaxWaitTime", store_time, ITEM(res_job.MaxWaitTime), 0, 0, 0}, + {"MaxStartDelay",store_time, ITEM(res_job.MaxStartDelay), 0, 0, 0}, + {"MaxFullInterval", store_time, ITEM(res_job.MaxFullInterval), 0, 0, 0}, + {"MaxDiffInterval", store_time, ITEM(res_job.MaxDiffInterval), 0, 0, 0}, + {"PrefixLinks", store_bool, ITEM(res_job.PrefixLinks), 0, ITEM_DEFAULT, false}, + {"PruneJobs", store_bool, ITEM(res_job.PruneJobs), 0, ITEM_DEFAULT, false}, + {"PruneFiles", store_bool, ITEM(res_job.PruneFiles), 0, ITEM_DEFAULT, false}, + {"PruneVolumes",store_bool, ITEM(res_job.PruneVolumes), 0, ITEM_DEFAULT, false}, + {"PurgeMigrationJob", store_bool, ITEM(res_job.PurgeMigrateJob), 0, ITEM_DEFAULT, false}, + {"Enabled", store_bool, ITEM(res_job.enabled), 0, ITEM_DEFAULT, true}, + {"SnapshotRetention", store_time, ITEM(res_job.SnapRetention), 0, ITEM_DEFAULT, 0}, + {"SpoolAttributes",store_bool, ITEM(res_job.SpoolAttributes), 0, ITEM_DEFAULT, true}, + {"SpoolData", store_bool, ITEM(res_job.spool_data), 0, ITEM_DEFAULT, false}, + {"SpoolSize", store_size64, ITEM(res_job.spool_size), 0, 0, 0}, + {"ReRunFailedLevels", store_bool, ITEM(res_job.rerun_failed_levels), 0, ITEM_DEFAULT, false}, + {"PreferMountedVolumes", store_bool, ITEM(res_job.PreferMountedVolumes), 0, ITEM_DEFAULT, true}, {"runbeforejob", store_short_runscript, ITEM(res_job.RunScripts), 0, 0, 0}, {"runafterjob", store_short_runscript, ITEM(res_job.RunScripts), 0, 0, 0}, {"runafterfailedjob", store_short_runscript, ITEM(res_job.RunScripts), 0, 0, 0}, {"clientrunbeforejob", store_short_runscript, ITEM(res_job.RunScripts), 0, 0, 0}, {"clientrunafterjob", store_short_runscript, ITEM(res_job.RunScripts), 0, 0, 0}, - {"maximumconcurrentjobs", store_pint32, ITEM(res_job.MaxConcurrentJobs), 0, ITEM_DEFAULT, 1}, - {"maximumspawnedjobs", store_pint32, ITEM(res_job.MaxSpawnedJobs), 0, ITEM_DEFAULT, 600}, - {"rescheduleonerror", store_bool, ITEM(res_job.RescheduleOnError), 0, ITEM_DEFAULT, false}, - {"rescheduleinterval", store_time, ITEM(res_job.RescheduleInterval), 0, ITEM_DEFAULT, 60 * 30}, - {"rescheduletimes", store_pint32, ITEM(res_job.RescheduleTimes), 0, 0, 0}, - {"priority", store_pint32, ITEM(res_job.Priority), 0, ITEM_DEFAULT, 10}, - {"allowmixedpriority", store_bool, ITEM(res_job.allow_mixed_priority), 0, ITEM_DEFAULT, false}, - {"writepartafterjob", store_bool, ITEM(res_job.write_part_after_job), 0, ITEM_DEFAULT, true}, - {"selectionpattern", store_str, ITEM(res_job.selection_pattern), 0, 0, 0}, - {"runscript", store_runscript, ITEM(res_job.RunScripts), 0, ITEM_NO_EQUALS, 0}, - {"selectiontype", store_migtype, ITEM(res_job.selection_type), 0, 0, 0}, - {"accurate", store_bool, ITEM(res_job.accurate), 0,0,0}, - {"allowduplicatejobs", store_bool, ITEM(res_job.AllowDuplicateJobs), 0, ITEM_DEFAULT, true}, + {"Runscript", store_runscript, ITEM(res_job.RunScripts), 0, ITEM_NO_EQUALS, 0}, + {"MaximumConcurrentJobs", store_pint32, ITEM(res_job.MaxConcurrentJobs), 0, ITEM_DEFAULT, 1}, + {"MaximumSpawnedJobs", store_pint32, ITEM(res_job.MaxSpawnedJobs), 0, ITEM_DEFAULT, 600}, + {"RescheduleOnError", store_bool, ITEM(res_job.RescheduleOnError), 0, ITEM_DEFAULT, false}, + {"RescheduleIncompleteJobs", store_bool, ITEM(res_job.RescheduleIncompleteJobs), 0, ITEM_DEFAULT, true}, + {"RescheduleInterval", store_time, ITEM(res_job.RescheduleInterval), 0, ITEM_DEFAULT, 60 * 30}, + {"RescheduleTimes", store_pint32, ITEM(res_job.RescheduleTimes), 0, 0, 0}, + {"Priority", store_pint32, ITEM(res_job.Priority), 0, ITEM_DEFAULT, 10}, + {"AllowMixedPriority", store_bool, ITEM(res_job.allow_mixed_priority), 0, ITEM_DEFAULT, false}, + {"WritePartAfterJob", store_bool, ITEM(res_job.write_part_after_job), 0, ITEM_DEFAULT, true}, + {"SelectionPattern", store_str, ITEM(res_job.selection_pattern), 0, 0, 0}, + {"SelectionType", store_migtype, ITEM(res_job.selection_type), 0, 0, 0}, + {"Accurate", store_bool, ITEM(res_job.accurate), 0,0,0}, + {"AllowDuplicateJobs", store_bool, ITEM(res_job.AllowDuplicateJobs), 0, ITEM_DEFAULT, true}, {"allowhigherduplicates", store_bool, ITEM(res_job.AllowHigherDuplicates), 0, ITEM_DEFAULT, true}, - {"cancellowerlevelduplicates", store_bool, ITEM(res_job.CancelLowerLevelDuplicates), 0, ITEM_DEFAULT, false}, - {"cancelqueuedduplicates", store_bool, ITEM(res_job.CancelQueuedDuplicates), 0, ITEM_DEFAULT, false}, - {"cancelrunningduplicates", store_bool, ITEM(res_job.CancelRunningDuplicates), 0, ITEM_DEFAULT, false}, - {"pluginoptions", store_str, ITEM(res_job.PluginOptions), 0, 0, 0}, - {"base", store_alist_res, ITEM(res_job.base), R_JOB, 0, 0}, + {"CancelLowerLevelDuplicates", store_bool, ITEM(res_job.CancelLowerLevelDuplicates), 0, ITEM_DEFAULT, false}, + {"CancelQueuedDuplicates", store_bool, ITEM(res_job.CancelQueuedDuplicates), 0, ITEM_DEFAULT, false}, + {"CancelRunningDuplicates", store_bool, ITEM(res_job.CancelRunningDuplicates), 0, ITEM_DEFAULT, false}, + {"PluginOptions", store_str, ITEM(res_job.PluginOptions), 0, 0, 0}, + {"Base", store_alist_res, ITEM(res_job.base), R_JOB, 0, 0}, {NULL, NULL, {0}, 0, 0, 0} }; -/* FileSet resource +/* Fileset resource * - * name handler value code flags default_value + * Name handler value code flags default_value */ static RES_ITEM fs_items[] = { - {"name", store_name, ITEM(res_fs.hdr.name), 0, ITEM_REQUIRED, 0}, - {"description", store_str, ITEM(res_fs.hdr.desc), 0, 0, 0}, - {"include", store_inc, {0}, 0, ITEM_NO_EQUALS, 0}, - {"exclude", store_inc, {0}, 1, ITEM_NO_EQUALS, 0}, - {"ignorefilesetchanges", store_bool, ITEM(res_fs.ignore_fs_changes), 0, ITEM_DEFAULT, false}, - {"enablevss", store_bool, ITEM(res_fs.enable_vss), 0, ITEM_DEFAULT, true}, + {"Name", store_name, ITEM(res_fs.hdr.name), 0, ITEM_REQUIRED, 0}, + {"Description", store_str, ITEM(res_fs.hdr.desc), 0, 0, 0}, + {"IgnoreFilesetChanges", store_bool, ITEM(res_fs.ignore_fs_changes), 0, ITEM_DEFAULT, false}, + {"EnableVss", store_bool, ITEM(res_fs.enable_vss), 0, ITEM_DEFAULT, true}, + {"EnableSnapshot",store_bool, ITEM(res_fs.enable_snapshot), 0, ITEM_DEFAULT, false}, + {"Include", store_inc, {0}, 0, ITEM_NO_EQUALS, 0}, + {"Exclude", store_inc, {0}, 1, ITEM_NO_EQUALS, 0}, {NULL, NULL, {0}, 0, 0, 0} }; @@ -361,9 +370,10 @@ static RES_ITEM fs_items[] = { * name handler value code flags default_value */ static RES_ITEM sch_items[] = { - {"name", store_name, ITEM(res_sch.hdr.name), 0, ITEM_REQUIRED, 0}, - {"description", store_str, ITEM(res_sch.hdr.desc), 0, 0, 0}, - {"run", store_run, ITEM(res_sch.run), 0, 0, 0}, + {"Name", store_name, ITEM(res_sch.hdr.name), 0, ITEM_REQUIRED, 0}, + {"Description", store_str, ITEM(res_sch.hdr.desc), 0, 0, 0}, + {"Run", store_run, ITEM(res_sch.run), 0, 0, 0}, + {"Enabled", store_bool, ITEM(res_sch.enabled), 0, ITEM_DEFAULT, true}, {NULL, NULL, {0}, 0, 0, 0} }; @@ -372,38 +382,38 @@ static RES_ITEM sch_items[] = { * name handler value code flags default_value */ static RES_ITEM pool_items[] = { - {"name", store_name, ITEM(res_pool.hdr.name), 0, ITEM_REQUIRED, 0}, - {"description", store_str, ITEM(res_pool.hdr.desc), 0, 0, 0}, - {"pooltype", store_strname, ITEM(res_pool.pool_type), 0, ITEM_REQUIRED, 0}, - {"labelformat", store_strname, ITEM(res_pool.label_format), 0, 0, 0}, - {"labeltype", store_label, ITEM(res_pool.LabelType), 0, 0, 0}, - {"cleaningprefix", store_strname, ITEM(res_pool.cleaning_prefix), 0, 0, 0}, - {"usecatalog", store_bool, ITEM(res_pool.use_catalog), 0, ITEM_DEFAULT, true}, - {"usevolumeonce", store_bool, ITEM(res_pool.use_volume_once), 0, 0, 0}, - {"purgeoldestvolume", store_bool, ITEM(res_pool.purge_oldest_volume), 0, 0, 0}, - {"actiononpurge", store_actiononpurge, ITEM(res_pool.action_on_purge), 0, 0, 0}, - {"recycleoldestvolume", store_bool, ITEM(res_pool.recycle_oldest_volume), 0, 0, 0}, - {"recyclecurrentvolume", store_bool, ITEM(res_pool.recycle_current_volume), 0, 0, 0}, - {"maximumvolumes", store_pint32, ITEM(res_pool.max_volumes), 0, 0, 0}, - {"maximumvolumejobs", store_pint32, ITEM(res_pool.MaxVolJobs), 0, 0, 0}, - {"maximumvolumefiles", store_pint32, ITEM(res_pool.MaxVolFiles), 0, 0, 0}, - {"maximumvolumebytes", store_size64, ITEM(res_pool.MaxVolBytes), 0, 0, 0}, - {"catalogfiles", store_bool, ITEM(res_pool.catalog_files), 0, ITEM_DEFAULT, true}, - {"volumeretention", store_time, ITEM(res_pool.VolRetention), 0, ITEM_DEFAULT, 60*60*24*365}, - {"volumeuseduration", store_time, ITEM(res_pool.VolUseDuration), 0, 0, 0}, - {"migrationtime", store_time, ITEM(res_pool.MigrationTime), 0, 0, 0}, - {"migrationhighbytes", store_size64, ITEM(res_pool.MigrationHighBytes), 0, 0, 0}, - {"migrationlowbytes", store_size64, ITEM(res_pool.MigrationLowBytes), 0, 0, 0}, - {"nextpool", store_res, ITEM(res_pool.NextPool), R_POOL, 0, 0}, - {"storage", store_alist_res, ITEM(res_pool.storage), R_STORAGE, 0, 0}, - {"autoprune", store_bool, ITEM(res_pool.AutoPrune), 0, ITEM_DEFAULT, true}, - {"recycle", store_bool, ITEM(res_pool.Recycle), 0, ITEM_DEFAULT, true}, - {"recyclepool", store_res, ITEM(res_pool.RecyclePool), R_POOL, 0, 0}, - {"scratchpool", store_res, ITEM(res_pool.ScratchPool), R_POOL, 0, 0}, - {"copypool", store_alist_res, ITEM(res_pool.CopyPool), R_POOL, 0, 0}, - {"catalog", store_res, ITEM(res_pool.catalog), R_CATALOG, 0, 0}, - {"fileretention", store_time, ITEM(res_pool.FileRetention), 0, 0, 0}, - {"jobretention", store_time, ITEM(res_pool.JobRetention), 0, 0, 0}, + {"Name", store_name, ITEM(res_pool.hdr.name), 0, ITEM_REQUIRED, 0}, + {"Description", store_str, ITEM(res_pool.hdr.desc), 0, 0, 0}, + {"PoolType", store_strname, ITEM(res_pool.pool_type), 0, ITEM_REQUIRED, 0}, + {"LabelFormat", store_strname, ITEM(res_pool.label_format), 0, 0, 0}, + {"LabelType", store_label, ITEM(res_pool.LabelType), 0, 0, 0}, + {"CleaningPrefix", store_strname, ITEM(res_pool.cleaning_prefix), 0, 0, 0}, + {"UseCatalog", store_bool, ITEM(res_pool.use_catalog), 0, ITEM_DEFAULT, true}, + {"UseVolumeOnce", store_bool, ITEM(res_pool.use_volume_once), 0, 0, 0}, + {"PurgeOldestVolume", store_bool, ITEM(res_pool.purge_oldest_volume), 0, 0, 0}, + {"ActionOnPurge", store_actiononpurge, ITEM(res_pool.action_on_purge), 0, 0, 0}, + {"RecycleOldestVolume", store_bool, ITEM(res_pool.recycle_oldest_volume), 0, 0, 0}, + {"RecycleCurrentVolume", store_bool, ITEM(res_pool.recycle_current_volume), 0, 0, 0}, + {"MaximumVolumes", store_pint32, ITEM(res_pool.max_volumes), 0, 0, 0}, + {"MaximumVolumeJobs", store_pint32, ITEM(res_pool.MaxVolJobs), 0, 0, 0}, + {"MaximumVolumeFiles", store_pint32, ITEM(res_pool.MaxVolFiles), 0, 0, 0}, + {"MaximumVolumeBytes", store_size64, ITEM(res_pool.MaxVolBytes), 0, 0, 0}, + {"CatalogFiles", store_bool, ITEM(res_pool.catalog_files), 0, ITEM_DEFAULT, true}, + {"VolumeRetention", store_time, ITEM(res_pool.VolRetention), 0, ITEM_DEFAULT, 60*60*24*365}, + {"VolumeUseDuration", store_time, ITEM(res_pool.VolUseDuration), 0, 0, 0}, + {"MigrationTime", store_time, ITEM(res_pool.MigrationTime), 0, 0, 0}, + {"MigrationHighBytes", store_size64, ITEM(res_pool.MigrationHighBytes), 0, 0, 0}, + {"MigrationLowBytes", store_size64, ITEM(res_pool.MigrationLowBytes), 0, 0, 0}, + {"NextPool", store_res, ITEM(res_pool.NextPool), R_POOL, 0, 0}, + {"Storage", store_alist_res, ITEM(res_pool.storage), R_STORAGE, 0, 0}, + {"AutoPrune", store_bool, ITEM(res_pool.AutoPrune), 0, ITEM_DEFAULT, true}, + {"Recycle", store_bool, ITEM(res_pool.Recycle), 0, ITEM_DEFAULT, true}, + {"RecyclePool", store_res, ITEM(res_pool.RecyclePool), R_POOL, 0, 0}, + {"ScratchPool", store_res, ITEM(res_pool.ScratchPool), R_POOL, 0, 0}, + {"CopyPool", store_alist_res, ITEM(res_pool.CopyPool), R_POOL, 0, 0}, + {"Catalog", store_res, ITEM(res_pool.catalog), R_CATALOG, 0, 0}, + {"FileRetention", store_time, ITEM(res_pool.FileRetention), 0, 0, 0}, + {"JobRetention", store_time, ITEM(res_pool.JobRetention), 0, 0, 0}, {NULL, NULL, {0}, 0, 0, 0} }; @@ -413,12 +423,12 @@ static RES_ITEM pool_items[] = { * name handler value code flags default_value */ static RES_ITEM counter_items[] = { - {"name", store_name, ITEM(res_counter.hdr.name), 0, ITEM_REQUIRED, 0}, - {"description", store_str, ITEM(res_counter.hdr.desc), 0, 0, 0}, - {"minimum", store_int32, ITEM(res_counter.MinValue), 0, ITEM_DEFAULT, 0}, - {"maximum", store_pint32, ITEM(res_counter.MaxValue), 0, ITEM_DEFAULT, INT32_MAX}, - {"wrapcounter", store_res, ITEM(res_counter.WrapCounter), R_COUNTER, 0, 0}, - {"catalog", store_res, ITEM(res_counter.Catalog), R_CATALOG, 0, 0}, + {"Name", store_name, ITEM(res_counter.hdr.name), 0, ITEM_REQUIRED, 0}, + {"Description", store_str, ITEM(res_counter.hdr.desc), 0, 0, 0}, + {"Minimum", store_int32, ITEM(res_counter.MinValue), 0, ITEM_DEFAULT, 0}, + {"Maximum", store_pint32, ITEM(res_counter.MaxValue), 0, ITEM_DEFAULT, INT32_MAX}, + {"WrapCounter", store_res, ITEM(res_counter.WrapCounter), R_COUNTER, 0, 0}, + {"Catalog", store_res, ITEM(res_counter.Catalog), R_CATALOG, 0, 0}, {NULL, NULL, {0}, 0, 0, 0} }; @@ -433,22 +443,22 @@ extern RES_ITEM msgs_items[]; * NOTE!!! keep it in the same order as the R_codes * or eliminate all resources[rindex].name * - * name items rcode res_head + * name items rcode */ RES_TABLE resources[] = { - {"director", dir_items, R_DIRECTOR}, - {"client", cli_items, R_CLIENT}, - {"job", job_items, R_JOB}, - {"storage", store_items, R_STORAGE}, - {"catalog", cat_items, R_CATALOG}, - {"schedule", sch_items, R_SCHEDULE}, - {"fileset", fs_items, R_FILESET}, - {"pool", pool_items, R_POOL}, - {"messages", msgs_items, R_MSGS}, - {"counter", counter_items, R_COUNTER}, - {"console", con_items, R_CONSOLE}, - {"jobdefs", job_items, R_JOBDEFS}, - {"device", NULL, R_DEVICE}, /* info obtained from SD */ + {"Director", dir_items, R_DIRECTOR}, + {"Client", cli_items, R_CLIENT}, + {"Job", job_items, R_JOB}, + {"Storage", store_items, R_STORAGE}, + {"Catalog", cat_items, R_CATALOG}, + {"Schedule", sch_items, R_SCHEDULE}, + {"Fileset", fs_items, R_FILESET}, + {"Pool", pool_items, R_POOL}, + {"Messages", msgs_items, R_MSGS}, + {"Counter", counter_items, R_COUNTER}, + {"Console", con_items, R_CONSOLE}, + {"JobDefs", job_items, R_JOBDEFS}, + {"Device", NULL, R_DEVICE}, /* info obtained from SD */ {NULL, NULL, 0} }; @@ -480,17 +490,18 @@ struct s_jl joblevels[] = { {NULL, 0, 0} }; + /* Keywords (RHS) permitted in Job type records * * type_name job_type */ -struct s_jt jobtypes[] = { - {"backup", JT_BACKUP}, - {"admin", JT_ADMIN}, - {"verify", JT_VERIFY}, - {"restore", JT_RESTORE}, - {"migrate", JT_MIGRATE}, - {"copy", JT_COPY}, +s_jt jobtypes[] = { + {"Backup", JT_BACKUP}, + {"Admin", JT_ADMIN}, + {"Verify", JT_VERIFY}, + {"Restore", JT_RESTORE}, + {"Migrate", JT_MIGRATE}, + {"Copy", JT_COPY}, {NULL, 0} }; @@ -499,16 +510,16 @@ struct s_jt jobtypes[] = { * * type_name job_type */ -struct s_jt migtypes[] = { - {"smallestvolume", MT_SMALLEST_VOL}, - {"oldestvolume", MT_OLDEST_VOL}, - {"pooloccupancy", MT_POOL_OCCUPANCY}, - {"pooltime", MT_POOL_TIME}, - {"pooluncopiedjobs", MT_POOL_UNCOPIED_JOBS}, - {"client", MT_CLIENT}, - {"volume", MT_VOLUME}, - {"job", MT_JOB}, - {"sqlquery", MT_SQLQUERY}, +s_jt migtypes[] = { + {"SmallestVolume", MT_SMALLEST_VOL}, + {"OldestVolume", MT_OLDEST_VOL}, + {"PoolOccupancy", MT_POOL_OCCUPANCY}, + {"PoolTime", MT_POOL_TIME}, + {"PoolUncopiedJobs", MT_POOL_UNCOPIED_JOBS}, + {"Client", MT_CLIENT}, + {"Volume", MT_VOLUME}, + {"Job", MT_JOB}, + {"SqlQuery", MT_SQLQUERY}, {NULL, 0} }; @@ -516,10 +527,10 @@ struct s_jt migtypes[] = { /* Options permitted in Restore replace= */ struct s_kw ReplaceOptions[] = { - {"always", REPLACE_ALWAYS}, - {"ifnewer", REPLACE_IFNEWER}, - {"ifolder", REPLACE_IFOLDER}, - {"never", REPLACE_NEVER}, + {"Always", REPLACE_ALWAYS}, + {"IfNewer", REPLACE_IFNEWER}, + {"IfOlder", REPLACE_IFOLDER}, + {"Never", REPLACE_NEVER}, {NULL, 0} }; @@ -550,9 +561,9 @@ const char *level_to_str(int level) } /* Dump contents of resource */ -void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fmt, ...), void *sock) +void dump_resource(int type, RES *ares, void sendit(void *sock, const char *fmt, ...), void *sock) { - URES *res = (URES *)reshdr; + URES *res = (URES *)ares; bool recurse = true; char ed1[100], ed2[100], ed3[100]; DEVICE *dev; @@ -563,13 +574,13 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fm return; } if (type < 0) { /* no recursion */ - type = - type; + type = -type; recurse = false; } switch (type) { case R_DIRECTOR: sendit(sock, _("Director: name=%s MaxJobs=%d FDtimeout=%s SDtimeout=%s\n"), - reshdr->name, res->res_dir.MaxConcurrentJobs, + ares->name, res->res_dir.MaxConcurrentJobs, edit_uint64(res->res_dir.FDConnectTimeout, ed1), edit_uint64(res->res_dir.SDConnectTimeout, ed2)); if (res->res_dir.query_file) { @@ -605,8 +616,9 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fm if (!acl_access_ok(ua, Client_ACL, res->res_client.hdr.name)) { break; } - sendit(sock, _("Client: name=%s address=%s FDport=%d MaxJobs=%u\n"), - res->res_client.hdr.name, res->res_client.address, res->res_client.FDport, + sendit(sock, _("Client: Name=%s Enabled=%d Address=%s FDport=%d MaxJobs=%u\n"), + res->res_client.hdr.name, res->res_client.enabled, + res->res_client.address, res->res_client.FDport, res->res_client.MaxConcurrentJobs); sendit(sock, _(" JobRetention=%s FileRetention=%s AutoPrune=%d\n"), edit_utime(res->res_client.JobRetention, ed1, sizeof(ed1)), @@ -643,12 +655,13 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fm break; } sendit(sock, _("Storage: name=%s address=%s SDport=%d MaxJobs=%u\n" -" DeviceName=%s MediaType=%s StorageId=%s\n"), +" DeviceName=%s MediaType=%s StorageId=%s Autochanger=%d\n"), res->res_store.hdr.name, res->res_store.address, res->res_store.SDport, res->res_store.MaxConcurrentJobs, res->res_store.dev_name(), res->res_store.media_type, - edit_int64(res->res_store.StorageId, ed1)); + edit_int64(res->res_store.StorageId, ed1), + res->res_store.autochanger); if (res->res_store.fd_storage_address) { sendit(sock, " FDStorageAddress=%s\n", res->res_store.fd_storage_address); } @@ -763,15 +776,15 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fm dump_resource(-R_POOL, (RES *)res->res_job.pool, sendit, sock); } if (res->res_job.full_pool) { - sendit(sock, _(" --> ")); + sendit(sock, _(" --> FullBackup")); dump_resource(-R_POOL, (RES *)res->res_job.full_pool, sendit, sock); } if (res->res_job.inc_pool) { - sendit(sock, _(" --> ")); + sendit(sock, _(" --> IncrementalBackup")); dump_resource(-R_POOL, (RES *)res->res_job.inc_pool, sendit, sock); } if (res->res_job.diff_pool) { - sendit(sock, _(" --> ")); + sendit(sock, _(" --> DifferentialBackup")); dump_resource(-R_POOL, (RES *)res->res_job.diff_pool, sendit, sock); } if (res->res_job.verify_job) { @@ -870,8 +883,7 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fm if (incexe->plugin_list.size()) { sendit(sock, " N\n"); } - - } + } /* end for over includes */ for (i=0; ires_fs.num_excludes; i++) { INCEXE *incexe = res->res_fs.exclude_items[i]; @@ -883,17 +895,19 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fm } } break; - } + } /* end case R_FILESET */ case R_SCHEDULE: if (!acl_access_ok(ua, Schedule_ACL, res->res_sch.hdr.name)) { break; } + if (res->res_sch.run) { int i; RUN *run = res->res_sch.run; char buf[1000], num[30]; - sendit(sock, _("Schedule: name=%s\n"), res->res_sch.hdr.name); + sendit(sock, _("Schedule: Name=%s Enabled=%d\n"), + res->res_sch.hdr.name, res->res_sch.enabled); if (!run) { break; } @@ -1059,6 +1073,7 @@ next_run: if (recurse && res->res_dir.hdr.next) { dump_resource(type, res->res_dir.hdr.next, sendit, sock); } + } /* @@ -1100,6 +1115,7 @@ static void free_incexe(INCEXE *incexe) free(incexe); } + /* * Free memory of resource -- called when daemon terminates. * NB, we don't need to worry about freeing any references @@ -1107,15 +1123,17 @@ static void free_incexe(INCEXE *incexe) * resource chain is traversed. Mainly we worry about freeing * allocated strings (names). */ -void free_resource(RES *sres, int type) +void free_resource(RES *rres, int type) { int num; - RES *nres; /* next resource if linked */ - URES *res = (URES *)sres; + RES *nres; + URES *res = (URES *)rres; - if (res == NULL) + if (res == NULL) { return; + } + Dmsg3(200, "type=%d res=%p name=%s\n", type, res, res->res_dir.hdr.name); /* common stuff -- free the resource name and description */ nres = (RES *)res->res_dir.hdr.next; if (res->res_dir.hdr.name) { @@ -1672,7 +1690,7 @@ void save_resource(int type, RES_ITEM *items, int pass) } } -static void store_actiononpurge(LEX *lc, RES_ITEM *item, int index, int pass) +void store_actiononpurge(LEX *lc, RES_ITEM *item, int index, int pass) { uint32_t *destination = (uint32_t*)item->value; lex_get_token(lc, T_NAME); @@ -1868,6 +1886,8 @@ static void store_runscript_when(LEX *lc, RES_ITEM *item, int index, int pass) *(uint32_t *)(item->value) = SCRIPT_After; } else if (strcasecmp(lc->str, "aftervss") == 0) { *(uint32_t *)(item->value) = SCRIPT_AfterVSS; + } else if (strcasecmp(lc->str, "aftersnapshot") == 0) { + *(uint32_t *)(item->value) = SCRIPT_AfterVSS; } else if (strcasecmp(lc->str, "always") == 0) { *(uint32_t *)(item->value) = SCRIPT_Any; } else { @@ -1934,31 +1954,31 @@ static void store_short_runscript(LEX *lc, RES_ITEM *item, int index, int pass) /* TODO: remove all script->old_proto with bacula 1.42 */ - if (strcmp(item->name, "runbeforejob") == 0) { + if (strcasecmp(item->name, "runbeforejob") == 0) { script->when = SCRIPT_Before; script->fail_on_error = true; script->set_target(""); - } else if (strcmp(item->name, "runafterjob") == 0) { + } else if (strcasecmp(item->name, "runafterjob") == 0) { script->when = SCRIPT_After; script->on_success = true; script->on_failure = false; script->set_target(""); - } else if (strcmp(item->name, "clientrunafterjob") == 0) { + } else if (strcasecmp(item->name, "clientrunafterjob") == 0) { script->old_proto = true; script->when = SCRIPT_After; script->set_target("%c"); script->on_success = true; script->on_failure = false; - } else if (strcmp(item->name, "clientrunbeforejob") == 0) { + } else if (strcasecmp(item->name, "clientrunbeforejob") == 0) { script->old_proto = true; script->when = SCRIPT_Before; script->set_target("%c"); script->fail_on_error = true; - } else if (strcmp(item->name, "runafterfailedjob") == 0) { + } else if (strcasecmp(item->name, "runafterfailedjob") == 0) { script->when = SCRIPT_After; script->on_failure = true; script->on_success = false; @@ -1972,8 +1992,8 @@ static void store_short_runscript(LEX *lc, RES_ITEM *item, int index, int pass) (*runscripts)->append(script); script->debug(); } - scan_to_eol(lc); + set_bit(index, res_all.hdr.item_present); } /* Store a bool in a bit field without modifing res_all.hdr @@ -2016,7 +2036,7 @@ static RES_ITEM runscript_items[] = { * resource. We treat the RunScript like a sort of * mini-resource within the Job resource. */ -static void store_runscript(LEX *lc, RES_ITEM *item, int index, int pass) +void store_runscript(LEX *lc, RES_ITEM *item, int index, int pass) { char *c; int token, i, t; diff --git a/bacula/src/dird/dird_conf.h b/bacula/src/dird/dird_conf.h index b3eea1ebfc..90700e58b7 100644 --- a/bacula/src/dird/dird_conf.h +++ b/bacula/src/dird/dird_conf.h @@ -1,22 +1,26 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Director specific configuration and defines * - * Written by Kern Sibbald, Feb MM + * Kern Sibbald, Feb MM * */ @@ -38,7 +42,8 @@ enum { R_COUNTER, R_CONSOLE, R_JOBDEFS, - R_DEVICE, + R_DEVICE, /* This is the real last device class */ + R_FIRST = R_DIRECTOR, R_LAST = R_DEVICE /* keep this updated */ }; @@ -55,11 +60,11 @@ enum { R_BACKUP }; - -/* Used for certain KeyWord tables */ -struct s_kw { +/* Options for FileSet keywords */ +struct s_fs_opt { const char *name; - uint32_t token; + int keyword; + const char *option; }; /* Job Level keyword structure */ @@ -105,6 +110,7 @@ public: uint32_t MaxConcurrentJobs; /* Max concurrent jobs for whole director */ uint32_t MaxSpawnedJobs; /* Max Jobs that can be started by Migration/Copy */ uint32_t MaxConsoleConnect; /* Max concurrent console session */ + uint32_t MaxReload; /* Maximum reload requests */ utime_t FDConnectTimeout; /* timeout for connect in seconds */ utime_t SDConnectTimeout; /* timeout in seconds */ utime_t heartbeat_interval; /* Interval to send heartbeats */ @@ -222,8 +228,8 @@ public: char *db_user; char *db_name; char *db_driver; /* Select appropriate driver */ - uint32_t mult_db_connections; /* set if multiple connections wanted */ - bool disable_batch_insert; /* set if batch inserts should be disabled */ + uint32_t mult_db_connections; /* set for multiple db connections */ + bool disable_batch_insert; /* set to disable batch inserts */ /* Methods */ char *name() const; @@ -244,6 +250,7 @@ public: uint32_t FDport; /* Where File daemon listens */ utime_t FileRetention; /* file retention period in seconds */ utime_t JobRetention; /* job retention period in seconds */ + utime_t SnapRetention; /* Snapshot retention period in seconds */ utime_t heartbeat_interval; /* Interval to send heartbeats */ char *address; char *fd_storage_address; /* Storage address to use from FD side */ @@ -260,6 +267,7 @@ public: bool tls_authenticate; /* Authenticated with TLS */ bool tls_enable; /* Enable TLS */ bool tls_require; /* Require TLS */ + bool enabled; /* Set if client enabled */ bool AutoPrune; /* Do automatic pruning? */ bool sd_calls_client; /* SD calls the client */ int64_t max_bandwidth; /* Limit speed on this client */ @@ -299,8 +307,8 @@ public: bool tls_enable; /* Enable TLS */ bool tls_require; /* Require TLS */ bool enabled; /* Set if device is enabled */ - bool autochanger; /* set if autochanger */ bool AllowCompress; /* set if this Storage should allow jobs to enable compression */ + bool autochanger; /* set if we are part of an autochanger */ int64_t StorageId; /* Set from Storage DB record */ utime_t heartbeat_interval; /* Interval to send heartbeats */ uint32_t drives; /* number of drives in autochanger */ @@ -361,13 +369,14 @@ class JOB { public: RES hdr; - uint32_t JobType; /* job type (backup, verify, restore */ - uint32_t JobLevel; /* default backup/verify level */ - int32_t Priority; /* Job priority */ - uint32_t RestoreJobId; /* What -- JobId to restore */ - int32_t RescheduleTimes; /* Number of times to reschedule job */ - uint32_t replace; /* How (overwrite, ..) */ - uint32_t selection_type; + uint32_t JobType; /* job type (backup, verify, restore */ + uint32_t JobLevel; /* default backup/verify level */ + uint32_t RestoreJobId; /* What -- JobId to restore */ + uint32_t replace; /* How (overwrite, ..) */ + uint32_t selection_type; + + int32_t Priority; /* Job priority */ + int32_t RescheduleTimes; /* Number of times to reschedule job */ char *RestoreWhere; /* Where on disk to restore -- directory */ char *RegexWhere; /* RegexWhere option */ @@ -391,6 +400,7 @@ public: utime_t MaxFullInterval; /* Maximum time interval between Fulls */ utime_t MaxDiffInterval; /* Maximum time interval between Diffs */ utime_t DuplicateJobProximity; /* Permitted time between duplicicates */ + utime_t SnapRetention; /* Snapshot retention period in seconds */ int64_t spool_size; /* Size of spool file for this job */ int32_t MaxConcurrentJobs; /* Maximum concurrent jobs */ int32_t NumConcurrentJobs; /* number of concurrent jobs running */ @@ -435,7 +445,7 @@ public: bool CancelQueuedDuplicates; /* Cancel queued jobs */ bool CancelRunningDuplicates; /* Cancel Running jobs */ bool PurgeMigrateJob; /* Purges source job on completion */ - bool IgnoreDuplicateJobChecking; /* Ignore Duplicate Job Checking */ + bool IgnoreDuplicateJobChecking; /* Set to ignore Duplicate Job Checking */ alist *base; /* Base jobs */ int64_t max_bandwidth; /* Speed limit on this job */ @@ -446,8 +456,40 @@ public: inline char *JOB::name() const { return hdr.name; } +/* Define FileSet Options keyword values */ +enum { + INC_KW_NONE, + INC_KW_COMPRESSION, + INC_KW_DIGEST, + INC_KW_ENCRYPTION, + INC_KW_VERIFY, + INC_KW_BASEJOB, + INC_KW_ACCURATE, + INC_KW_ONEFS, + INC_KW_RECURSE, + INC_KW_SPARSE, + INC_KW_HARDLINK, + INC_KW_REPLACE, /* restore options */ + INC_KW_READFIFO, /* Causes fifo data to be read */ + INC_KW_PORTABLE, + INC_KW_MTIMEONLY, + INC_KW_KEEPATIME, + INC_KW_EXCLUDE, + INC_KW_ACL, + INC_KW_IGNORECASE, + INC_KW_HFSPLUS, + INC_KW_NOATIME, + INC_KW_ENHANCEDWILD, + INC_KW_CHKCHANGES, + INC_KW_STRIPPATH, + INC_KW_HONOR_NODUMP, + INC_KW_XATTR, + INC_KW_MAX /* Keep this last */ +}; + + #undef MAX_FOPTS -#define MAX_FOPTS 40 +#define MAX_FOPTS 50 /* File options structure */ struct FOPTS { @@ -470,6 +512,7 @@ struct FOPTS { /* This is either an include item or an exclude item */ struct INCEXE { + char opt_present[INC_KW_MAX+1]; /* set if option is present in conf file */ FOPTS *current_opts; /* points to current options structure */ FOPTS **opts_list; /* options list */ int32_t num_opts; /* number of options items */ @@ -496,6 +539,7 @@ public: char MD5[30]; /* base 64 representation of MD5 */ bool ignore_fs_changes; /* Don't force Full if FS changed */ bool enable_vss; /* Enable Volume Shadow Copy */ + bool enable_snapshot; /* Enable Snapshot */ /* Methods */ char *name() const; @@ -512,6 +556,8 @@ public: RES hdr; RUN *run; + bool enabled; /* set if enabled */ + /* Methods */ char *name() const; }; @@ -582,8 +628,6 @@ public: inline char *POOL::name() const { return hdr.name; } - - /* Define the Union of all the above * resource structure definitions. */ @@ -636,6 +680,7 @@ public: uint32_t minute; /* minute to run job */ time_t last_run; /* last time run */ time_t next_run; /* next time to run */ + bool last_day_set; /* set if last_day is used */ char hour[nbytes_for_bits(24)]; /* bit set for each hour */ char mday[nbytes_for_bits(32)]; /* bit set for each day of month */ char month[nbytes_for_bits(12)]; /* bit set for each month */ @@ -650,3 +695,23 @@ public: #define GetJobResWithName(x) ((JOB *)GetResWithName(R_JOB, (x))) #define GetFileSetResWithName(x) ((FILESET *)GetResWithName(R_FILESET, (x))) #define GetCatalogResWithName(x) ((CAT *)GetResWithName(R_CATALOG, (x))) + +/* Imported subroutines */ +void store_jobtype(LEX *lc, RES_ITEM *item, int index, int pass); +void store_level(LEX *lc, RES_ITEM *item, int index, int pass); +void store_replace(LEX *lc, RES_ITEM *item, int index, int pass); +void store_migtype(LEX *lc, RES_ITEM *item, int index, int pass); +void store_acl(LEX *lc, RES_ITEM *item, int index, int pass); +void store_ac_res(LEX *lc, RES_ITEM *item, int index, int pass); +void store_actiononpurge(LEX *lc, RES_ITEM *item, int index, int pass); +void store_inc(LEX *lc, RES_ITEM *item, int index, int pass); +void store_regex(LEX *lc, RES_ITEM *item, int index, int pass); +void store_wild(LEX *lc, RES_ITEM *item, int index, int pass); +void store_fstype(LEX *lc, RES_ITEM *item, int index, int pass); +void store_drivetype(LEX *lc, RES_ITEM *item, int index, int pass); +void store_opts(LEX *lc, RES_ITEM *item, int index, int pass); +void store_lopts(LEX *lc, RES_ITEM *item, int index, int pass); +void store_base(LEX *lc, RES_ITEM *item, int index, int pass); +void store_plugin(LEX *lc, RES_ITEM *item, int index, int pass); +void store_run(LEX *lc, RES_ITEM *item, int index, int pass); +void store_runscript(LEX *lc, RES_ITEM *item, int index, int pass); diff --git a/bacula/src/dird/expand.c b/bacula/src/dird/expand.c index c9be631624..00a057777c 100644 --- a/bacula/src/dird/expand.c +++ b/bacula/src/dird/expand.c @@ -8,19 +8,23 @@ * Version $Id$ */ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2003-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ #include "bacula.h" diff --git a/bacula/src/dird/fd_cmds.c b/bacula/src/dird/fd_cmds.c index adff580b9a..9d69048612 100644 --- a/bacula/src/dird/fd_cmds.c +++ b/bacula/src/dird/fd_cmds.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -34,13 +38,14 @@ const int dbglvl = 400; /* Commands sent to File daemon */ -static char filesetcmd[] = "fileset%s\n"; /* set full fileset */ +static char filesetcmd[] = "fileset%s%s\n"; /* set full fileset */ static char jobcmd[] = "JobId=%s Job=%s SDid=%u SDtime=%u Authorization=%s\n"; /* Note, mtime_only is not used here -- implemented as file option */ static char levelcmd[] = "level = %s%s%s mtime_only=%d %s%s\n"; static char runscript[] = "Run OnSuccess=%u OnFailure=%u AbortOnError=%u When=%u Command=%s\n"; static char runbeforenow[]= "RunBeforeNow\n"; static char bandwidthcmd[] = "setbandwidth=%lld Job=%s\n"; +static char component_info[] = "component_info\n"; /* Responses received from File daemon */ static char OKinc[] = "2000 OK include\n"; @@ -49,6 +54,7 @@ static char OKlevel[] = "2000 OK level\n"; static char OKRunScript[] = "2000 OK RunScript\n"; static char OKRunBeforeNow[] = "2000 OK RunBeforeNow\n"; static char OKRestoreObject[] = "2000 OK ObjectRestored\n"; +static char OKComponentInfo[] = "2000 OK ComponentInfo\n"; static char OKBandwidth[] = "2000 OK Bandwidth\n"; /* Forward referenced functions */ @@ -74,6 +80,12 @@ int connect_to_file_daemon(JCR *jcr, int retry_interval, int max_retry_time, char ed1[30]; utime_t heart_beat; + if (!jcr->client) { + Jmsg(jcr, M_FATAL, 0, _("File daemon not defined for current Job\n")); + Dmsg0(10, "No Client defined for the job.\n"); + return 0; + } + if (jcr->client->heartbeat_interval) { heart_beat = jcr->client->heartbeat_interval; } else { @@ -193,7 +205,7 @@ void get_level_since_time(JCR *jcr, char *since, int since_len) * This is probably redundant, but some of the code below * uses jcr->stime, so don't remove unless you are sure. */ - if (!db_find_job_start_time(jcr,jcr->db, &jcr->jr, &jcr->stime, jcr->PrevJob)) { + if (!db_find_job_start_time(jcr, jcr->db, &jcr->jr, &jcr->stime, jcr->PrevJob)) { do_full = true; } have_full = db_find_last_job_start_time(jcr, jcr->db, &jcr->jr, @@ -371,8 +383,11 @@ static bool send_fileset(JCR *jcr) } for (j=0; jnum_opts; j++) { FOPTS *fo = ie->opts_list[j]; - bool enhanced_wild = false; + bool stripped_opts = false; + bool compress_disabled = false; + char newopts[MAX_FOPTS]; + for (k=0; fo->opts[k]!='\0'; k++) { if (fo->opts[k]=='W') { enhanced_wild = true; @@ -380,34 +395,41 @@ static bool send_fileset(JCR *jcr) } } - /* Strip out compression option Zn if disallowed for this Storage */ - if (store && !store->AllowCompress) { - char newopts[MAX_FOPTS]; - bool done=false; /* print warning only if compression enabled in FS */ + /* + * Strip out compression option Zn if disallowed + * for this Storage. + * Strip out dedup option dn if old FD + */ + bool strip_compress = store && !store->AllowCompress; + if (strip_compress || jcr->FDVersion >= 11) { int j = 0; for (k=0; fo->opts[k]!='\0'; k++) { - /* Z compress option is followed by the single-digit compress level or 'o' */ - if (fo->opts[k]=='Z') { - done=true; - k++; /* skip option and level */ - } else { - newopts[j] = fo->opts[k]; - j++; - } + /* Z compress option is followed by the single-digit compress level or 'o' */ + if (strip_compress && fo->opts[k]=='Z') { + stripped_opts = true; + compress_disabled = true; + k++; /* skip level */ + } else if (jcr->FDVersion < 11 && fo->opts[k]=='d') { + stripped_opts = true; + k++; /* skip level */ + } else { + newopts[j] = fo->opts[k]; + j++; + } } newopts[j] = '\0'; - - if (done) { + if (compress_disabled) { Jmsg(jcr, M_INFO, 0, _("FD compression disabled for this Job because AllowCompress=No in Storage resource.\n") ); } + } + if (stripped_opts) { /* Send the new trimmed option set without overwriting fo->opts */ fd->fsend("O %s\n", newopts); } else { /* Send the original options */ fd->fsend("O %s\n", fo->opts); } - for (k=0; kregex.size(); k++) { fd->fsend("R %s\n", fo->regex.get(k)); } @@ -566,7 +588,9 @@ bool send_include_list(JCR *jcr) { BSOCK *fd = jcr->file_bsock; if (jcr->fileset->new_include) { - fd->fsend(filesetcmd, jcr->fileset->enable_vss ? " vss=1" : ""); + fd->fsend(filesetcmd, + jcr->fileset->enable_vss ? " vss=1" : "", + jcr->fileset->enable_snapshot ? " snap=1" : ""); return send_fileset(jcr); } return true; @@ -782,6 +806,48 @@ bool send_restore_objects(JCR *jcr) return true; } +/* + * Send the plugin a list of component info files. These + * were files that were created during the backup for + * the VSS plugin. The list is a list of those component + * files that have been chosen for restore. We + * send them before the Restore Objects. + */ +bool send_component_info(JCR *jcr) +{ + BSOCK *fd; + char buf[2000]; + bool ok = true; + + if (!jcr->component_fd) { + return true; /* nothing to send */ + } + /* Don't send if old version FD */ + if (jcr->FDVersion < 6) { + goto bail_out; + } + + rewind(jcr->component_fd); + fd = jcr->file_bsock; + fd->fsend(component_info); + while (fgets(buf, sizeof(buf), jcr->component_fd)) { + fd->fsend("%s", buf); + Dmsg1(050, "Send component_info to FD: %s\n", buf); + } + fd->signal(BNET_EOD); + if (!response(jcr, fd, OKComponentInfo, "ComponentInfo", DISPLAY_ERROR)) { + Jmsg(jcr, M_FATAL, 0, _("ComponentInfo failed.\n")); + ok = false; + } + +bail_out: + fclose(jcr->component_fd); + jcr->component_fd = NULL; + unlink(jcr->component_fname); + free_and_null_pool_memory(jcr->component_fname); + return ok; +} + /* * Read the attributes from the File daemon for * a Verify job and store them in the catalog. @@ -856,6 +922,7 @@ int get_attributes_and_put_in_catalog(JCR *jcr) ar->JobId = jcr->JobId; ar->ClientId = jcr->ClientId; ar->PathId = 0; + ar->FilenameId = 0; ar->Digest = NULL; ar->DigestType = CRYPTO_DIGEST_NONE; ar->DeltaSeq = 0; diff --git a/bacula/src/dird/getmsg.c b/bacula/src/dird/getmsg.c index 364298b258..28b2d6ecfd 100644 --- a/bacula/src/dird/getmsg.c +++ b/bacula/src/dird/getmsg.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -82,6 +86,10 @@ static void set_jcr_sd_job_status(JCR *jcr, int SDJobStatus) jcr->wait_time = time(NULL); } jcr->SDJobStatus = SDJobStatus; + if (jcr->SDJobStatus == JS_Incomplete) { + jcr->setJobStatus(JS_Incomplete); + } + } /* @@ -214,17 +222,17 @@ int bget_dirmsg(BSOCK *bs) * CatReq Job=nn Catalog-Request-Message */ if (bs->msg[0] == 'C') { /* Catalog request */ - Dmsg2(900, "Catalog req jcr 0x%x: %s", jcr, bs->msg); + Dmsg2(900, "Catalog req jcr=%p: %s", jcr, bs->msg); catalog_request(jcr, bs); continue; } if (bs->msg[0] == 'U') { /* SD sending attributes */ - Dmsg2(900, "Catalog upd jcr 0x%x: %s", jcr, bs->msg); + Dmsg2(900, "Catalog upd jcr=%p: %s", jcr, bs->msg); catalog_update(jcr, bs); continue; } if (bs->msg[0] == 'B') { /* SD sending file spool attributes */ - Dmsg2(100, "Blast attributes jcr 0x%x: %s", jcr, bs->msg); + Dmsg2(100, "Blast attributes jcr=%p: %s", jcr, bs->msg); char filename[256]; if (sscanf(bs->msg, "BlastAttr Job=%127s File=%255s", Job, filename) != 2) { diff --git a/bacula/src/dird/inc_conf.c b/bacula/src/dird/inc_conf.c index a463553e3f..560fc1a414 100644 --- a/bacula/src/dird/inc_conf.c +++ b/bacula/src/dird/inc_conf.c @@ -1,23 +1,27 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Configuration file parser for new and old Include and * Exclude records * - * Written by Kern Sibbald, March MMIII + * Kern Sibbald, March MMIII * */ @@ -34,19 +38,20 @@ void store_inc(LEX *lc, RES_ITEM *item, int index, int pass); static void store_newinc(LEX *lc, RES_ITEM *item, int index, int pass); -static void store_regex(LEX *lc, RES_ITEM *item, int index, int pass); -static void store_wild(LEX *lc, RES_ITEM *item, int index, int pass); -static void store_fstype(LEX *lc, RES_ITEM *item, int index, int pass); -static void store_drivetype(LEX *lc, RES_ITEM *item, int index, int pass); -static void store_opts(LEX *lc, RES_ITEM *item, int index, int pass); -static void store_base(LEX *lc, RES_ITEM *item, int index, int pass); -static void store_plugin(LEX *lc, RES_ITEM *item, int index, int pass); +void store_regex(LEX *lc, RES_ITEM *item, int index, int pass); +void store_wild(LEX *lc, RES_ITEM *item, int index, int pass); +void store_fstype(LEX *lc, RES_ITEM *item, int index, int pass); +void store_drivetype(LEX *lc, RES_ITEM *item, int index, int pass); +void store_opts(LEX *lc, RES_ITEM *item, int index, int pass); +void store_lopts(LEX *lc, RES_ITEM *item, int index, int pass); +void store_base(LEX *lc, RES_ITEM *item, int index, int pass); +void store_plugin(LEX *lc, RES_ITEM *item, int index, int pass); static void setup_current_opts(void); /* Include and Exclude items */ static void store_fname(LEX *lc, RES_ITEM2 *item, int index, int pass, bool exclude); static void store_plugin_name(LEX *lc, RES_ITEM2 *item, int index, int pass, bool exclude); -static void options_res(LEX *lc, RES_ITEM2 *item, int index, int pass, bool exclude); +static void store_options_res(LEX *lc, RES_ITEM2 *item, int index, int pass, bool exclude); static void store_excludedir(LEX *lc, RES_ITEM2 *item, int index, int pass, bool exclude); @@ -71,190 +76,170 @@ static INCEXE res_incexe; * new Include/Exclude items * name handler value code flags default_value */ -static RES_ITEM2 newinc_items[] = { - {"file", store_fname, {0}, 0, 0, 0}, - {"plugin", store_plugin_name, {0}, 0, 0, 0}, - {"excludedircontaining", store_excludedir, {0}, 0, 0, 0}, - {"options", options_res, {0}, 0, 0, 0}, +RES_ITEM2 newinc_items[] = { + {"File", store_fname, {0}, 0, 0, 0}, + {"Plugin", store_plugin_name, {0}, 0, 0, 0}, + {"ExcludeDirContaining", store_excludedir, {0}, 0, 0, 0}, + {"Options", store_options_res, {0}, 0, 0, 0}, {NULL, NULL, {0}, 0, 0, 0} }; /* * Items that are valid in an Options resource + * + * name handler value code flags default_value + * + * Encryption in FS_option_kw table ??? + * ReadFifo not in FS_option_kw table ??? + * */ -static RES_ITEM options_items[] = { - {"compression", store_opts, {0}, 0, 0, 0}, - {"signature", store_opts, {0}, 0, 0, 0}, - {"basejob", store_opts, {0}, 0, 0, 0}, - {"accurate", store_opts, {0}, 0, 0, 0}, - {"verify", store_opts, {0}, 0, 0, 0}, - {"onefs", store_opts, {0}, 0, 0, 0}, - {"recurse", store_opts, {0}, 0, 0, 0}, - {"sparse", store_opts, {0}, 0, 0, 0}, - {"hardlinks", store_opts, {0}, 0, 0, 0}, - {"readfifo", store_opts, {0}, 0, 0, 0}, - {"replace", store_opts, {0}, 0, 0, 0}, - {"portable", store_opts, {0}, 0, 0, 0}, - {"mtimeonly", store_opts, {0}, 0, 0, 0}, - {"keepatime", store_opts, {0}, 0, 0, 0}, - {"regex", store_regex, {0}, 0, 0, 0}, - {"regexdir", store_regex, {0}, 1, 0, 0}, - {"regexfile", store_regex, {0}, 2, 0, 0}, - {"base", store_base, {0}, 0, 0, 0}, - {"wild", store_wild, {0}, 0, 0, 0}, - {"wilddir", store_wild, {0}, 1, 0, 0}, - {"wildfile", store_wild, {0}, 2, 0, 0}, - {"exclude", store_opts, {0}, 0, 0, 0}, - {"aclsupport", store_opts, {0}, 0, 0, 0}, - {"plugin", store_plugin, {0}, 0, 0, 0}, - {"ignorecase", store_opts, {0}, 0, 0, 0}, - {"fstype", store_fstype, {0}, 0, 0, 0}, - {"hfsplussupport", store_opts, {0}, 0, 0, 0}, - {"noatime", store_opts, {0}, 0, 0, 0}, - {"enhancedwild", store_opts, {0}, 0, 0, 0}, - {"drivetype", store_drivetype, {0}, 0, 0, 0}, - {"checkfilechanges",store_opts, {0}, 0, 0, 1}, - {"strippath", store_opts, {0}, 0, 0, 0}, - {"honornodumpflag", store_opts, {0}, 0, 0, 0}, - {"xattrsupport", store_opts, {0}, 0, 0, 0}, +RES_ITEM options_items[] = { + {"Compression", store_opts, {0}, 0, INC_KW_COMPRESSION, 0}, + {"Signature", store_opts, {0}, 0, INC_KW_DIGEST, 0}, + {"OneFs", store_opts, {0}, 0, INC_KW_ONEFS, 0}, + {"Recurse", store_opts, {0}, 0, INC_KW_RECURSE, 0}, + {"Sparse", store_opts, {0}, 0, INC_KW_SPARSE, 0}, + {"HardLinks", store_opts, {0}, 0, INC_KW_HARDLINK, 0}, + {"Replace", store_opts, {0}, 0, INC_KW_REPLACE, 0}, + {"Portable", store_opts, {0}, 0, INC_KW_PORTABLE, 0}, + {"MtimeOnly", store_opts, {0}, 0, INC_KW_MTIMEONLY, 0}, + {"KeepAtime", store_opts, {0}, 0, INC_KW_KEEPATIME, 0}, + {"Exclude", store_opts, {0}, 0, INC_KW_EXCLUDE, 0}, + {"AclSupport", store_opts, {0}, 0, INC_KW_ACL, 0}, + {"IgnoreCase", store_opts, {0}, 0, INC_KW_IGNORECASE, 0}, + {"HfsPlusSupport", store_opts, {0}, 0, INC_KW_HFSPLUS, 0}, + {"NoAtime", store_opts, {0}, 0, INC_KW_NOATIME, 0}, + {"EnhancedWild", store_opts, {0}, 0, INC_KW_ENHANCEDWILD, 0}, + {"CheckFileChanges",store_opts, {0}, 0, INC_KW_CHKCHANGES, 1}, + {"HonorNoDumpFlag", store_opts, {0}, 0, INC_KW_HONOR_NODUMP, 0}, + {"XattrSupport", store_opts, {0}, 0, INC_KW_XATTR, 0}, + {"ReadFifo", store_opts, {0}, 0, INC_KW_READFIFO, 0}, + {"BaseJob", store_lopts, {0}, 'J', INC_KW_BASEJOB, 0}, + {"Accurate", store_lopts, {0}, 'C', INC_KW_ACCURATE, 0}, + {"Verify", store_lopts, {0}, 'V', INC_KW_VERIFY, 0}, + {"StripPath", store_lopts, {0}, 'P', INC_KW_STRIPPATH, 0}, + {"Regex", store_regex, {0}, 0, 0, 0}, + {"RegexDir", store_regex, {0}, 1, 0, 0}, + {"RegexFile", store_regex, {0}, 2, 0, 0}, + {"Base", store_base, {0}, 0, 0, 0}, + {"Wild", store_wild, {0}, 0, 0, 0}, + {"WildDir", store_wild, {0}, 1, 0, 0}, + {"WildFile", store_wild, {0}, 2, 0, 0}, + {"Plugin", store_plugin, {0}, 0, 0, 0}, + {"FsType", store_fstype, {0}, 0, 0, 0}, + {"DriveType", store_drivetype, {0}, 0, 0, 0}, {NULL, NULL, {0}, 0, 0, 0} }; - -/* Define FileSet KeyWord values */ -enum { - INC_KW_NONE, - INC_KW_COMPRESSION, - INC_KW_DIGEST, - INC_KW_ENCRYPTION, - INC_KW_VERIFY, - INC_KW_BASEJOB, - INC_KW_ACCURATE, - INC_KW_ONEFS, - INC_KW_RECURSE, - INC_KW_SPARSE, - INC_KW_HARDLINK, - INC_KW_REPLACE, /* restore options */ - INC_KW_READFIFO, /* Causes fifo data to be read */ - INC_KW_PORTABLE, - INC_KW_MTIMEONLY, - INC_KW_KEEPATIME, - INC_KW_EXCLUDE, - INC_KW_ACL, - INC_KW_IGNORECASE, - INC_KW_HFSPLUS, - INC_KW_NOATIME, - INC_KW_ENHANCEDWILD, - INC_KW_CHKCHANGES, - INC_KW_STRIPPATH, - INC_KW_HONOR_NODUMP, - INC_KW_XATTR -}; - /* * This is the list of options that can be stored by store_opts * Note, now that the old style Include/Exclude code is gone, * the INC_KW code could be put into the "code" field of the * options given above. + * + * name token */ -static struct s_kw FS_option_kw[] = { - {"compression", INC_KW_COMPRESSION}, - {"signature", INC_KW_DIGEST}, - {"encryption", INC_KW_ENCRYPTION}, - {"verify", INC_KW_VERIFY}, - {"basejob", INC_KW_BASEJOB}, - {"accurate", INC_KW_ACCURATE}, - {"onefs", INC_KW_ONEFS}, - {"recurse", INC_KW_RECURSE}, - {"sparse", INC_KW_SPARSE}, - {"hardlinks", INC_KW_HARDLINK}, - {"replace", INC_KW_REPLACE}, - {"readfifo", INC_KW_READFIFO}, - {"portable", INC_KW_PORTABLE}, - {"mtimeonly", INC_KW_MTIMEONLY}, - {"keepatime", INC_KW_KEEPATIME}, - {"exclude", INC_KW_EXCLUDE}, - {"aclsupport", INC_KW_ACL}, - {"ignorecase", INC_KW_IGNORECASE}, - {"hfsplussupport", INC_KW_HFSPLUS}, - {"noatime", INC_KW_NOATIME}, - {"enhancedwild", INC_KW_ENHANCEDWILD}, - {"checkfilechanges", INC_KW_CHKCHANGES}, - {"strippath", INC_KW_STRIPPATH}, - {"honornodumpflag", INC_KW_HONOR_NODUMP}, - {"xattrsupport", INC_KW_XATTR}, +s_kw FS_option_kw[] = { + {"Compression", INC_KW_COMPRESSION}, + {"Signature", INC_KW_DIGEST}, + {"Encryption", INC_KW_ENCRYPTION}, + {"Verify", INC_KW_VERIFY}, + {"BaseJob", INC_KW_BASEJOB}, + {"Accurate", INC_KW_ACCURATE}, + {"OneFs", INC_KW_ONEFS}, + {"Recurse", INC_KW_RECURSE}, + {"Sparse", INC_KW_SPARSE}, + {"HardLinks", INC_KW_HARDLINK}, + {"Replace", INC_KW_REPLACE}, + {"ReadFifo", INC_KW_READFIFO}, + {"Portable", INC_KW_PORTABLE}, + {"MtimeOnly", INC_KW_MTIMEONLY}, + {"KeepAtime", INC_KW_KEEPATIME}, + {"Exclude", INC_KW_EXCLUDE}, + {"AclSupport", INC_KW_ACL}, + {"IgnoreCase", INC_KW_IGNORECASE}, + {"HfsPlusSupport", INC_KW_HFSPLUS}, + {"NoAtime", INC_KW_NOATIME}, + {"EnhancedWild", INC_KW_ENHANCEDWILD}, + {"CheckFileChanges", INC_KW_CHKCHANGES}, + {"StripPath", INC_KW_STRIPPATH}, + {"HonorNoDumpFlag", INC_KW_HONOR_NODUMP}, + {"XattrSupport", INC_KW_XATTR}, {NULL, 0} }; -/* Options for FileSet keywords */ - -struct s_fs_opt { - const char *name; - int keyword; - const char *option; -}; - /* * Options permitted for each keyword and resulting value. * The output goes into opts, which are then transmitted to * the FD for application as options to the following list of * included files. + * + * Note! all 0's in options must come after the value that + * is non-zero. + * + * NOTE!! The following long options (see scan_include_options()) + * V = Verify + * C = Accurate + * J = BaseJob + * P = StripPath + * + * name keyword option */ -static struct s_fs_opt FS_options[] = { - {"md5", INC_KW_DIGEST, "M"}, - {"sha1", INC_KW_DIGEST, "S"}, - {"sha256", INC_KW_DIGEST, "S2"}, - {"sha512", INC_KW_DIGEST, "S3"}, - {"gzip", INC_KW_COMPRESSION, "Z6"}, - {"gzip1", INC_KW_COMPRESSION, "Z1"}, - {"gzip2", INC_KW_COMPRESSION, "Z2"}, - {"gzip3", INC_KW_COMPRESSION, "Z3"}, - {"gzip4", INC_KW_COMPRESSION, "Z4"}, - {"gzip5", INC_KW_COMPRESSION, "Z5"}, - {"gzip6", INC_KW_COMPRESSION, "Z6"}, - {"gzip7", INC_KW_COMPRESSION, "Z7"}, - {"gzip8", INC_KW_COMPRESSION, "Z8"}, - {"gzip9", INC_KW_COMPRESSION, "Z9"}, - {"lzo", INC_KW_COMPRESSION, "Zo"}, +struct s_fs_opt FS_options[] = { + {"Md5", INC_KW_DIGEST, "M"}, + {"Sha1", INC_KW_DIGEST, "S"}, + {"Sha256", INC_KW_DIGEST, "S2"}, + {"Sha512", INC_KW_DIGEST, "S3"}, + {"Gzip", INC_KW_COMPRESSION, "Z6"}, + {"Gzip1", INC_KW_COMPRESSION, "Z1"}, + {"Gzip2", INC_KW_COMPRESSION, "Z2"}, + {"Gzip3", INC_KW_COMPRESSION, "Z3"}, + {"Gzip4", INC_KW_COMPRESSION, "Z4"}, + {"Gzip5", INC_KW_COMPRESSION, "Z5"}, + {"Gzip6", INC_KW_COMPRESSION, "Z6"}, + {"Gzip7", INC_KW_COMPRESSION, "Z7"}, + {"Gzip8", INC_KW_COMPRESSION, "Z8"}, + {"Gzip9", INC_KW_COMPRESSION, "Z9"}, + {"Lzo", INC_KW_COMPRESSION, "Zo"}, {"blowfish", INC_KW_ENCRYPTION, "B"}, /* ***FIXME*** not implemented */ {"3des", INC_KW_ENCRYPTION, "3"}, /* ***FIXME*** not implemented */ - {"yes", INC_KW_ONEFS, "0"}, - {"no", INC_KW_ONEFS, "f"}, - {"yes", INC_KW_RECURSE, "0"}, - {"no", INC_KW_RECURSE, "h"}, - {"yes", INC_KW_SPARSE, "s"}, - {"no", INC_KW_SPARSE, "0"}, - {"yes", INC_KW_HARDLINK, "0"}, - {"no", INC_KW_HARDLINK, "H"}, - {"always", INC_KW_REPLACE, "a"}, - {"ifnewer", INC_KW_REPLACE, "w"}, - {"never", INC_KW_REPLACE, "n"}, - {"yes", INC_KW_READFIFO, "r"}, - {"no", INC_KW_READFIFO, "0"}, - {"yes", INC_KW_PORTABLE, "p"}, - {"no", INC_KW_PORTABLE, "0"}, - {"yes", INC_KW_MTIMEONLY, "m"}, - {"no", INC_KW_MTIMEONLY, "0"}, - {"yes", INC_KW_KEEPATIME, "k"}, - {"no", INC_KW_KEEPATIME, "0"}, - {"yes", INC_KW_EXCLUDE, "e"}, - {"no", INC_KW_EXCLUDE, "0"}, - {"yes", INC_KW_ACL, "A"}, - {"no", INC_KW_ACL, "0"}, - {"yes", INC_KW_IGNORECASE, "i"}, - {"no", INC_KW_IGNORECASE, "0"}, - {"yes", INC_KW_HFSPLUS, "R"}, /* "R" for resource fork */ - {"no", INC_KW_HFSPLUS, "0"}, - {"yes", INC_KW_NOATIME, "K"}, - {"no", INC_KW_NOATIME, "0"}, - {"yes", INC_KW_ENHANCEDWILD, "K"}, - {"no", INC_KW_ENHANCEDWILD, "0"}, - {"yes", INC_KW_CHKCHANGES, "c"}, - {"no", INC_KW_CHKCHANGES, "0"}, - {"yes", INC_KW_HONOR_NODUMP, "N"}, - {"no", INC_KW_HONOR_NODUMP, "0"}, - {"yes", INC_KW_XATTR, "X"}, - {"no", INC_KW_XATTR, "0"}, + {"No", INC_KW_ONEFS, "f"}, + {"Yes", INC_KW_ONEFS, "0"}, + {"No", INC_KW_RECURSE, "h"}, + {"Yes", INC_KW_RECURSE, "0"}, + {"Yes", INC_KW_SPARSE, "s"}, + {"No", INC_KW_SPARSE, "0"}, + {"No", INC_KW_HARDLINK, "H"}, + {"Yes", INC_KW_HARDLINK, "0"}, + {"Always", INC_KW_REPLACE, "a"}, + {"IfNewer", INC_KW_REPLACE, "w"}, + {"Never", INC_KW_REPLACE, "n"}, + {"Yes", INC_KW_READFIFO, "r"}, + {"No", INC_KW_READFIFO, "0"}, + {"Yes", INC_KW_PORTABLE, "p"}, + {"No", INC_KW_PORTABLE, "0"}, + {"Yes", INC_KW_MTIMEONLY, "m"}, + {"No", INC_KW_MTIMEONLY, "0"}, + {"Yes", INC_KW_KEEPATIME, "k"}, + {"No", INC_KW_KEEPATIME, "0"}, + {"Yes", INC_KW_EXCLUDE, "e"}, + {"No", INC_KW_EXCLUDE, "0"}, + {"Yes", INC_KW_ACL, "A"}, + {"No", INC_KW_ACL, "0"}, + {"Yes", INC_KW_IGNORECASE, "i"}, + {"No", INC_KW_IGNORECASE, "0"}, + {"Yes", INC_KW_HFSPLUS, "R"}, /* "R" for resource fork */ + {"No", INC_KW_HFSPLUS, "0"}, + {"Yes", INC_KW_NOATIME, "K"}, + {"No", INC_KW_NOATIME, "0"}, + {"Yes", INC_KW_ENHANCEDWILD, "K"}, + {"No", INC_KW_ENHANCEDWILD, "0"}, + {"Yes", INC_KW_CHKCHANGES, "c"}, + {"No", INC_KW_CHKCHANGES, "0"}, + {"Yes", INC_KW_HONOR_NODUMP, "N"}, + {"No", INC_KW_HONOR_NODUMP, "0"}, + {"Yes", INC_KW_XATTR, "X"}, + {"No", INC_KW_XATTR, "0"}, {NULL, 0, 0} }; @@ -262,9 +247,12 @@ static struct s_fs_opt FS_options[] = { /* * Scan for right hand side of Include options (keyword=option) is - * converted into one or two characters. Verifyopts=xxxx is Vxxxx: + * converted into one or two characters. Verify=xxxx is Vxxxx: * Whatever is found is concatenated to the opts string. * This code is also used inside an Options resource. + * + * This function returns true for a long option (terminates with :) + * and false for a normal 1 or 2 character option. */ static void scan_include_options(LEX *lc, int keyword, char *opts, int optlen) { @@ -276,20 +264,20 @@ static void scan_include_options(LEX *lc, int keyword, char *opts, int optlen) option[2] = 0; /* terminate options */ lc->options |= LOPT_STRING; /* force string */ lex_get_token(lc, T_STRING); /* expect at least one option */ + /* + * ***FIXME**** ensure these are in permitted set + */ if (keyword == INC_KW_VERIFY) { /* special case */ - /* ***FIXME**** ensure these are in permitted set */ bstrncat(opts, "V", optlen); /* indicate Verify */ bstrncat(opts, lc->str, optlen); bstrncat(opts, ":", optlen); /* terminate it */ Dmsg3(900, "Catopts=%s option=%s optlen=%d\n", opts, option,optlen); } else if (keyword == INC_KW_ACCURATE) { /* special case */ - /* ***FIXME**** ensure these are in permitted set */ bstrncat(opts, "C", optlen); /* indicate Accurate */ bstrncat(opts, lc->str, optlen); bstrncat(opts, ":", optlen); /* terminate it */ Dmsg3(900, "Catopts=%s option=%s optlen=%d\n", opts, option,optlen); } else if (keyword == INC_KW_BASEJOB) { /* special case */ - /* ***FIXME**** ensure these are in permitted set */ bstrncat(opts, "J", optlen); /* indicate BaseJob */ bstrncat(opts, lc->str, optlen); bstrncat(opts, ":", optlen); /* terminate it */ @@ -428,7 +416,7 @@ static void store_newinc(LEX *lc, RES_ITEM *item, int index, int pass) /* Store regex info */ -static void store_regex(LEX *lc, RES_ITEM *item, int index, int pass) +void store_regex(LEX *lc, RES_ITEM *item, int index, int pass) { int token, rc; regex_t preg; @@ -476,7 +464,7 @@ static void store_regex(LEX *lc, RES_ITEM *item, int index, int pass) } /* Store Base info */ -static void store_base(LEX *lc, RES_ITEM *item, int index, int pass) +void store_base(LEX *lc, RES_ITEM *item, int index, int pass) { lex_get_token(lc, T_NAME); @@ -490,7 +478,7 @@ static void store_base(LEX *lc, RES_ITEM *item, int index, int pass) } /* Store reader info */ -static void store_plugin(LEX *lc, RES_ITEM *item, int index, int pass) +void store_plugin(LEX *lc, RES_ITEM *item, int index, int pass) { lex_get_token(lc, T_NAME); @@ -505,7 +493,7 @@ static void store_plugin(LEX *lc, RES_ITEM *item, int index, int pass) /* Store Wild-card info */ -static void store_wild(LEX *lc, RES_ITEM *item, int index, int pass) +void store_wild(LEX *lc, RES_ITEM *item, int index, int pass) { int token; const char *type; @@ -550,23 +538,24 @@ static void store_wild(LEX *lc, RES_ITEM *item, int index, int pass) } /* Store fstype info */ -static void store_fstype(LEX *lc, RES_ITEM *item, int index, int pass) +void store_fstype(LEX *lc, RES_ITEM *item, int index, int pass) { int token; - - token = lex_get_token(lc, T_SKIP_EOL); if (pass == 1) { - /* Pickup fstype string */ - switch (token) { - case T_IDENTIFIER: - case T_UNQUOTED_STRING: - case T_QUOTED_STRING: + for (;;) { + token = lex_get_token(lc, T_STRING); /* scan next item */ + if (token == T_ERROR) { + break; + } res_incexe.current_opts->fstype.append(bstrdup(lc->str)); + Dmsg3(900, "set fstype %p size=%d %s\n", - res_incexe.current_opts, res_incexe.current_opts->fstype.size(), lc->str); - break; - default: - scan_err1(lc, _("Expected an fstype string, got: %s\n"), lc->str); + res_incexe.current_opts, res_incexe.current_opts->fstype.size(),lc->str); + + if (lc->ch != ',') { /* if no other item follows */ + break; /* get out */ + } + lex_get_token(lc, T_ALL); /* eat comma */ } } scan_to_eol(lc); @@ -588,23 +577,22 @@ static void store_excludedir(LEX *lc, RES_ITEM2 *item, int index, int pass, bool } /* Store drivetype info */ -static void store_drivetype(LEX *lc, RES_ITEM *item, int index, int pass) +void store_drivetype(LEX *lc, RES_ITEM *item, int index, int pass) { int token; - - token = lex_get_token(lc, T_SKIP_EOL); if (pass == 1) { - /* Pickup drivetype string */ - switch (token) { - case T_IDENTIFIER: - case T_UNQUOTED_STRING: - case T_QUOTED_STRING: + for (;;) { + token = lex_get_token(lc, T_STRING); /* scan next item */ + if (token == T_ERROR) { + break; + } res_incexe.current_opts->drivetype.append(bstrdup(lc->str)); Dmsg3(900, "set drivetype %p size=%d %s\n", - res_incexe.current_opts, res_incexe.current_opts->drivetype.size(), lc->str); - break; - default: - scan_err1(lc, _("Expected an drivetype string, got: %s\n"), lc->str); + res_incexe.current_opts, res_incexe.current_opts->drivetype.size(),lc->str); + if (lc->ch != ',') { /* if no other item follows */ + break; /* get out */ + } + lex_get_token(lc, T_ALL); /* eat comma */ } } scan_to_eol(lc); @@ -698,7 +686,7 @@ static void store_plugin_name(LEX *lc, RES_ITEM2 *item, int index, int pass, boo /* * Come here when Options seen in Include/Exclude */ -static void options_res(LEX *lc, RES_ITEM2 *item, int index, int pass, bool exclude) +static void store_options_res(LEX *lc, RES_ITEM2 *item, int index, int pass, bool exclude) { int token, i; @@ -743,11 +731,18 @@ static void options_res(LEX *lc, RES_ITEM2 *item, int index, int pass, bool excl } } +/* + * Different subroutine, but uses store_opts + */ +void store_lopts(LEX *lc, RES_ITEM *item, int index, int pass) +{ + store_opts(lc, item, index, pass); +} /* * New style options come here */ -static void store_opts(LEX *lc, RES_ITEM *item, int index, int pass) +void store_opts(LEX *lc, RES_ITEM *item, int index, int pass) { int i; int keyword; @@ -772,10 +767,12 @@ static void store_opts(LEX *lc, RES_ITEM *item, int index, int pass) Dmsg2(900, "new pass=%d incexe opts=%s\n", pass, res_incexe.current_opts->opts); } scan_to_eol(lc); + set_bit(keyword, res_incexe.opt_present); } + /* If current_opts not defined, create first entry */ static void setup_current_opts(void) { diff --git a/bacula/src/dird/job.c b/bacula/src/dird/job.c index 62181bd198..20b09050eb 100644 --- a/bacula/src/dird/job.c +++ b/bacula/src/dird/job.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -113,19 +117,21 @@ bool setup_job(JCR *jcr) */ Dmsg0(100, "Open database\n"); jcr->db = db_init_database(jcr, jcr->catalog->db_driver, jcr->catalog->db_name, - jcr->catalog->db_user, jcr->catalog->db_password, - jcr->catalog->db_address, jcr->catalog->db_port, - jcr->catalog->db_socket, jcr->catalog->mult_db_connections, - jcr->catalog->disable_batch_insert); + jcr->catalog->db_user, jcr->catalog->db_password, + jcr->catalog->db_address, jcr->catalog->db_port, + jcr->catalog->db_socket, jcr->catalog->mult_db_connections, + jcr->catalog->disable_batch_insert); if (!jcr->db || !db_open_database(jcr, jcr->db)) { Jmsg(jcr, M_FATAL, 0, _("Could not open database \"%s\".\n"), jcr->catalog->db_name); if (jcr->db) { Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db)); db_close_database(jcr, jcr->db); + jcr->db = NULL; } goto bail_out; } + Dmsg0(150, "DB opened\n"); if (!jcr->fname) { jcr->fname = get_pool_memory(PM_FNAME); @@ -232,6 +238,144 @@ bail_out: return false; } +/* + * Setup a job for a resume command + */ +static bool setup_resume_job(JCR *jcr, JOB_DBR *jr) +{ + int errstat; + jcr->lock(); + Dsm_check(100); + init_msg(jcr, jcr->messages); + + /* Initialize termination condition variable */ + if ((errstat = pthread_cond_init(&jcr->term_wait, NULL)) != 0) { + berrno be; + Jmsg1(jcr, M_FATAL, 0, _("Unable to init job cond variable: ERR=%s\n"), be.bstrerror(errstat)); + jcr->unlock(); + goto bail_out; + } + jcr->term_wait_inited = true; + + jcr->setJobStatus(JS_Created); + jcr->unlock(); + + /* + * Open database + */ + Dmsg0(100, "Open database\n"); + jcr->db = db_init_database(jcr, jcr->catalog->db_driver, jcr->catalog->db_name, + jcr->catalog->db_user, jcr->catalog->db_password, + jcr->catalog->db_address, jcr->catalog->db_port, + jcr->catalog->db_socket, jcr->catalog->mult_db_connections, + jcr->catalog->disable_batch_insert); + if (!jcr->db || !db_open_database(jcr, jcr->db)) { + Jmsg(jcr, M_FATAL, 0, _("Could not open database \"%s\".\n"), + jcr->catalog->db_name); + if (jcr->db) { + Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db)); + db_close_database(jcr, jcr->db); + jcr->db = NULL; + } + goto bail_out; + } + Dmsg0(100, "DB opened\n"); + if (!jcr->fname) { + jcr->fname = get_pool_memory(PM_FNAME); + } + if (!jcr->pool_source) { + jcr->pool_source = get_pool_memory(PM_MESSAGE); + pm_strcpy(jcr->pool_source, _("unknown source")); + } + if (!jcr->next_pool_source) { + jcr->next_pool_source = get_pool_memory(PM_MESSAGE); + pm_strcpy(jcr->next_pool_source, _("unknown source")); + } + + + /* + * Setup Job record. Make sure original job is Incomplete. + */ + memcpy(&jcr->jr, jr, sizeof(JOB_DBR)); + jcr->sched_time = jcr->jr.SchedTime; + jcr->start_time = jcr->jr.StartTime; + jcr->jr.EndTime = 0; /* perhaps rescheduled, clear it */ + jcr->setJobType(jcr->jr.JobType); + jcr->setJobLevel(jcr->jr.JobLevel); + jcr->JobId = jcr->jr.JobId; + if (!get_or_create_client_record(jcr)) { + Dmsg0(100, "Could not create client record.\n"); + goto bail_out; + } + + Dmsg6(100, "Got job record JobId=%d Job=%s Name=%s Type=%c Level=%c Status=%c\n", + jcr->jr.JobId, jcr->jr.Job, jcr->jr.Name, jcr->jr.JobType, jcr->jr.JobLevel, + jcr->jr.JobStatus); + if (jcr->jr.JobStatus != JS_Incomplete) { + /* ***FIXME*** add error message */ + Dmsg1(100, "Job is not an Incomplete: status=%c\n", jcr->jr.JobStatus); + goto bail_out; + } + bstrncpy(jcr->Job, jcr->jr.Job, sizeof(jcr->Job)); + jcr->setJobType(jcr->jr.JobType); + jcr->setJobLevel(jcr->jr.JobLevel); + + generate_daemon_event(jcr, "JobStart"); + new_plugins(jcr); /* instantiate plugins for this jcr */ + generate_plugin_event(jcr, bDirEventJobStart); + + if (job_canceled(jcr)) { + Dmsg0(100, "Oops. Job canceled\n"); + goto bail_out; + } + + /* Re-run the old job */ + jcr->rerunning = true; + + /* + * Now, do pre-run stuff, like setting job level (Inc/diff, ...) + * this allows us to setup a proper job start record for restarting + * in case of later errors. + */ + switch (jcr->getJobType()) { + case JT_BACKUP: + if (!do_backup_init(jcr)) { + backup_cleanup(jcr, JS_ErrorTerminated); + goto bail_out; + } + break; + default: + Pmsg1(0, _("Unimplemented job type: %d\n"), jcr->getJobType()); + jcr->setJobStatus(JS_ErrorTerminated); + goto bail_out; + } + + generate_plugin_event(jcr, bDirEventJobInit); + Dsm_check(100); + return true; + +bail_out: + return false; +} + +JobId_t resume_job(JCR *jcr, JOB_DBR *jr) +{ + int stat; + if (setup_resume_job(jcr, jr)) { + Dmsg0(200, "Add jrc to work queue\n"); + /* Queue the job to be run */ + if ((stat = jobq_add(&job_queue, jcr)) != 0) { + berrno be; + Jmsg(jcr, M_FATAL, 0, _("Could not add job queue: ERR=%s\n"), be.bstrerror(stat)); + return 0; + } + return jcr->JobId; + } + return 0; +} + + + void update_job_end(JCR *jcr, int TermCode) { dequeue_messages(jcr); /* display any queued messages */ @@ -382,7 +526,8 @@ static bool cancel_file_daemon_job(UAContext *ua, const char *cmd, JCR *jcr) ua->jcr->client = old_client; return false; } - Dmsg0(100, "Connected to file daemon\n"); + Dmsg3(10, "Connected to file daemon %s for cancel ua.jcr=%p jcr=%p\n", + ua->jcr->client->name(), ua->jcr, jcr); BSOCK *fd = ua->jcr->file_bsock; fd->fsend("%s Job=%s\n", cmd, jcr->Job); while (fd->recv() >= 0) { @@ -421,7 +566,10 @@ static bool cancel_sd_job(UAContext *ua, const char *cmd, JCR *jcr) ua->error_msg(_("Failed to connect to Storage daemon.\n")); return false; } - Dmsg0(200, "Connected to storage daemon\n"); + + Dmsg3(10, "Connected to storage daemon %s for cancel ua.jcr=%p jcr=%p\n", + ua->jcr->wstore->name(), ua->jcr, jcr); + BSOCK *sd = ua->jcr->store_bsock; sd->fsend("%s Job=%s\n", cmd, jcr->Job); while (sd->recv() >= 0) { @@ -443,13 +591,14 @@ static int cancel_inactive_job(UAContext *ua, JCR *jcr) USTORE store; CLIENT *client; + Dmsg2(10, "cancel_inactive_job ua.jcr=%p jcr=%p\n", ua->jcr, jcr); + if (!jcr->client) { memset(&cr, 0, sizeof(cr)); /* User is kind enough to provide the client name */ if ((i = find_arg_with_value(ua, "client")) > 0) { bstrncpy(cr.Name, ua->argv[i], sizeof(cr.Name)); - } else { memset(&jr, 0, sizeof(jr)); bstrncpy(jr.Job, jcr->Job, sizeof(jr.Job)); @@ -504,15 +653,16 @@ bail_out: * Returns: true if cancel appears to be successful * false on failure. Message sent to ua->jcr. */ -bool cancel_job(UAContext *ua, JCR *jcr, bool cancel) +bool +cancel_job(UAContext *ua, JCR *jcr, bool cancel) { char ed1[50]; int32_t old_status = jcr->JobStatus; int status; const char *reason, *cmd; bool force = find_arg(ua, "inactive") > 0; - JCR *wjcr = jcr->wjcr; + Dmsg3(10, "cancel_job jcr=%p jobid=%d use_count\n", jcr, jcr->JobId, jcr->use_count()); /* If the user explicitely ask, we can send the cancel command to * the FD. @@ -521,9 +671,16 @@ bool cancel_job(UAContext *ua, JCR *jcr, bool cancel) return cancel_inactive_job(ua, jcr); } - status = JS_Canceled; - reason = _("canceled"); - cmd = NT_("cancel"); + if (cancel) { + status = JS_Canceled; + reason = _("canceled"); + cmd = NT_("cancel"); + } else { + status = JS_Incomplete; + reason = _("stopped"); + cmd = NT_("stop"); + jcr->RescheduleIncompleteJobs = false; /* do not restart */ + } jcr->setJobStatus(status); @@ -575,10 +732,14 @@ bool cancel_job(UAContext *ua, JCR *jcr, bool cancel) } /* Cancel Copy/Migration Storage daemon */ - if (wjcr && wjcr->store_bsock) { - /* do not return now, we want to try to cancel the sd socket */ - cancel_sd_job(ua, cmd, wjcr); + if (jcr->wjcr) { + /* The wjcr is valid until we call free_jcr(jcr) */ + JCR *wjcr = jcr->wjcr; + if (wjcr->store_bsock) { + /* do not return now, we want to try to cancel the sd socket */ + cancel_sd_job(ua, cmd, wjcr); + } /* We test file_bsock because the previous operation can take * several minutes */ @@ -803,7 +964,7 @@ DBId_t get_or_create_pool_record(JCR *jcr, char *pool_name) while (!db_get_pool_record(jcr, jcr->db, &pr)) { /* get by Name */ /* Try to create the pool */ if (create_pool(jcr, jcr->db, jcr->pool, POOL_OP_CREATE) < 0) { - Jmsg(jcr, M_FATAL, 0, _("Pool \"%s\" not in database. ERR=%s"), pr.Name, + Jmsg(jcr, M_FATAL, 0, _("Cannot create pool \"%s\" in database. ERR=%s"), pr.Name, db_strerror(jcr->db)); return 0; } else { @@ -822,19 +983,13 @@ bool allow_duplicate_job(JCR *jcr) { JOB *job = jcr->job; JCR *djcr; /* possible duplicate job */ - bool cancel_dup = false; - bool cancel_me = false; - /* - * See if AllowDuplicateJobs is set or - * if duplicate checking is disabled for this job. - */ + /* Is AllowDuplicateJobs is set or is duplicate checking + * disabled for this job? */ if (job->AllowDuplicateJobs || jcr->IgnoreDuplicateJobChecking) { return true; } - Dmsg0(800, "Enter allow_duplicate_job\n"); - /* * After this point, we do not want to allow any duplicate * job to run. @@ -844,16 +999,14 @@ bool allow_duplicate_job(JCR *jcr) if (jcr == djcr || djcr->JobId == 0) { continue; /* do not cancel this job or consoles */ } - - /* - * See if this Job has the IgnoreDuplicateJobChecking flag set, ignore it - * for any checking against other jobs. - */ + /* Does Job has the IgnoreDuplicateJobChecking flag set, + * if so do not check it against other jobs */ if (djcr->IgnoreDuplicateJobChecking) { - continue; - } - + continue; + } if (strcmp(job->name(), djcr->job->name()) == 0) { + bool cancel_dup = false; + bool cancel_me = false; if (job->DuplicateJobProximity > 0) { utime_t now = (utime_t)time(NULL); if ((now - djcr->start_time) > job->DuplicateJobProximity) { @@ -893,12 +1046,9 @@ bool allow_duplicate_job(JCR *jcr) djcr->JobId); break; /* get out of foreach_jcr */ } - } - - /* - * Cancel one of the two jobs (me or dup) - * If CancelQueuedDuplicates is set do so only if job is queued. - */ + } + /* Cancel one of the two jobs (me or dup) */ + /* If CancelQueuedDuplicates is set do so only if job is queued */ if (job->CancelQueuedDuplicates) { switch (djcr->JobStatus) { case JS_Created: @@ -915,11 +1065,8 @@ bool allow_duplicate_job(JCR *jcr) break; } } - if (cancel_dup || job->CancelRunningDuplicates) { - /* - * Zap the duplicated job djcr - */ + /* Zap the duplicated job djcr */ UAContext *ua = new_ua_context(jcr); Jmsg(jcr, M_INFO, 0, _("Cancelling duplicate JobId=%d.\n"), djcr->JobId); cancel_job(ua, djcr); @@ -929,9 +1076,7 @@ bool allow_duplicate_job(JCR *jcr) free_ua_context(ua); Dmsg2(800, "Cancel dup %p JobId=%d\n", djcr, djcr->JobId); } else { - /* - * Zap current job - */ + /* Zap current job */ jcr->setJobStatus(JS_Canceled); Jmsg(jcr, M_FATAL, 0, _("JobId %d already running. Duplicate job not allowed.\n"), djcr->JobId); @@ -955,7 +1100,10 @@ bool apply_wstorage_overrides(JCR *jcr, POOL *opool) const char *source; Dmsg1(100, "Original pool=%s\n", opool->name()); - if (jcr->run_next_pool_override) { + if (jcr->cmdline_next_pool_override) { + /* Can be Command line or User input */ + source = NPRT(jcr->next_pool_source); + } else if (jcr->run_next_pool_override) { pm_strcpy(jcr->next_pool_source, _("Run NextPool override")); pm_strcpy(jcr->pool_source, _("Run NextPool override")); source = _("Run NextPool override"); @@ -1060,6 +1208,10 @@ bool get_or_create_client_record(JCR *jcr) { CLIENT_DBR cr; + if (!jcr->client) { + Jmsg(jcr, M_FATAL, 0, _("No Client specified.\n")); + return false; + } memset(&cr, 0, sizeof(cr)); bstrncpy(cr.Name, jcr->client->hdr.name, sizeof(cr.Name)); cr.AutoPrune = jcr->client->AutoPrune; @@ -1182,6 +1334,7 @@ void create_unique_job_name(JCR *jcr, const char *base_name) char name[MAX_NAME_LENGTH]; char *p; int len; + int local_seq; /* Guarantee unique start time -- maximum one per second, and * thus unique Job Name @@ -1196,6 +1349,7 @@ void create_unique_job_name(JCR *jcr, const char *base_name) } } last_start_time = now; + local_seq = seq; V(mutex); /* allow creation of jobs */ jcr->start_time = now; /* Form Unique JobName */ @@ -1205,7 +1359,7 @@ void create_unique_job_name(JCR *jcr, const char *base_name) len = strlen(dt) + 5; /* dt + .%02d EOS */ bstrncpy(name, base_name, sizeof(name)); name[sizeof(name)-len] = 0; /* truncate if too long */ - bsnprintf(jcr->Job, sizeof(jcr->Job), "%s.%s_%02d", name, dt, seq); /* add date & time */ + bsnprintf(jcr->Job, sizeof(jcr->Job), "%s.%s_%02d", name, dt, local_seq); /* add date & time */ /* Convert spaces into underscores */ for (p=jcr->Job; *p; p++) { if (*p == ' ') { @@ -1251,6 +1405,10 @@ void dird_free_jcr(JCR *jcr) Dmsg0(200, "Start dird free_jcr\n"); dird_free_jcr_pointers(jcr); + if (jcr->wjcr) { + free_jcr(jcr->wjcr); + jcr->wjcr = NULL; + } /* Free bsock packets */ free_bsock(jcr->file_bsock); free_bsock(jcr->store_bsock); diff --git a/bacula/src/dird/jobq.c b/bacula/src/dird/jobq.c index ddd33bea15..5c95825b30 100644 --- a/bacula/src/dird/jobq.c +++ b/bacula/src/dird/jobq.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2003-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula job queue routines. @@ -188,6 +192,30 @@ void *sched_wait(void *arg) return NULL; } +/* Procedure to update the Client->NumConcurrentJobs */ +static void update_client_numconcurrentjobs(JCR *jcr, int val) +{ + if (!jcr->client) { + return; + } + + switch (jcr->getJobType()) + { + case JT_MIGRATE: + case JT_COPY: + case JT_ADMIN: + break; + case JT_BACKUP: + if (jcr->no_client_used()) { + break; + } + /* Failback wanted */ + default: + jcr->client->NumConcurrentJobs += val; + break; + } +} + /* * Add a job to the queue * jq is a queue that was created with jobq_init @@ -442,9 +470,6 @@ void *jobq_server(void *arg) remove_jcr_from_tsd(je->jcr); je->jcr->set_killable(false); - /* Clear the threadid, probably not necessary */ - memset(&jcr->my_thread_id, 0, sizeof(jcr->my_thread_id)); - Dmsg2(2300, "Back from user engine jobid=%d use=%d.\n", jcr->JobId, jcr->use_count()); @@ -460,9 +485,7 @@ void *jobq_server(void *arg) if (jcr->acquired_resource_locks) { dec_read_store(jcr); dec_write_store(jcr); - if (jcr->client) { - jcr->client->NumConcurrentJobs--; - } + update_client_numconcurrentjobs(jcr, -1); jcr->job->NumConcurrentJobs--; jcr->acquired_resource_locks = false; } @@ -614,6 +637,10 @@ static bool reschedule_job(JCR *jcr, jobq_t *jq, jobq_item_t *je) if (jcr->job->RescheduleTimes == 0 || jcr->reschedule_count < jcr->job->RescheduleTimes) { resched = + /* Check for incomplete jobs */ + (jcr->RescheduleIncompleteJobs && + jcr->is_incomplete() && jcr->is_JobType(JT_BACKUP) && + !(jcr->HasBase||jcr->is_JobLevel(L_BASE))) || /* Check for failed jobs */ (jcr->job->RescheduleOnError && !jcr->is_JobStatus(JS_Terminated) && @@ -627,6 +654,7 @@ static bool reschedule_job(JCR *jcr, jobq_t *jq, jobq_item_t *je) * Reschedule this job by cleaning it up, but * reuse the same JobId if possible. */ + jcr->rerunning = jcr->is_incomplete(); /* save incomplete status */ time_t now = time(NULL); jcr->reschedule_count++; jcr->sched_time = now + jcr->job->RescheduleInterval; @@ -644,8 +672,8 @@ static bool reschedule_job(JCR *jcr, jobq_t *jq, jobq_item_t *je) if (!allow_duplicate_job(jcr)) { return false; } - /* Only jobs with no output jobs can run on same JCR */ - if (jcr->JobBytes == 0) { + /* Only jobs with no output or Incomplete jobs can run on same JCR */ + if (jcr->JobBytes == 0 || jcr->rerunning) { Dmsg2(2300, "Requeue job=%d use=%d\n", jcr->JobId, jcr->use_count()); V(jq->mutex); /* @@ -655,9 +683,9 @@ static bool reschedule_job(JCR *jcr, jobq_t *jq, jobq_item_t *je) if (jcr->wasVirtualFull) { jcr->setJobLevel(L_VIRTUAL_FULL); } - /* + /* * When we are using the same jcr then make sure to reset - * RealEndTime back to zero. + * RealEndTime back to zero. */ jcr->jr.RealEndTime = 0; jobq_add(jq, jcr); /* queue the job to run again */ @@ -674,6 +702,21 @@ static bool reschedule_job(JCR *jcr, jobq_t *jq, jobq_item_t *je) */ JCR *njcr = new_jcr(sizeof(JCR), dird_free_jcr); set_jcr_defaults(njcr, jcr->job); + /* + * Eliminate the new job_end_push, then copy the one from + * the old job, and set the old one to be empty. + */ + void *v; + lock_jobs(); /* protect ourself from reload_config() */ + LockRes(); + foreach_alist(v, (&jcr->job_end_push)) { + njcr->job_end_push.append(v); + } + jcr->job_end_push.destroy(); + jcr->job_end_push.init(1, false); + UnlockRes(); + unlock_jobs(); + njcr->reschedule_count = jcr->reschedule_count; njcr->sched_time = jcr->sched_time; njcr->initial_sched_time = jcr->initial_sched_time; @@ -776,7 +819,7 @@ static bool acquire_resources(JCR *jcr) if (jcr->client) { if (jcr->client->NumConcurrentJobs < jcr->client->MaxConcurrentJobs) { - jcr->client->NumConcurrentJobs++; + update_client_numconcurrentjobs(jcr, 1); } else { /* Back out previous locks */ dec_write_store(jcr); @@ -791,9 +834,7 @@ static bool acquire_resources(JCR *jcr) /* Back out previous locks */ dec_write_store(jcr); dec_read_store(jcr); - if (jcr->client) { - jcr->client->NumConcurrentJobs--; - } + update_client_numconcurrentjobs(jcr, -1); jcr->setJobStatus(JS_WaitJobRes); return false; } diff --git a/bacula/src/dird/jobq.h b/bacula/src/dird/jobq.h index 8ee20b2ec3..c365d269a4 100644 --- a/bacula/src/dird/jobq.h +++ b/bacula/src/dird/jobq.h @@ -7,22 +7,25 @@ * adapted from "Programming with POSIX Threads", by * David R. Butenhof * - * Version $Id$ */ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ #ifndef __JOBQ_H diff --git a/bacula/src/dird/mac.c b/bacula/src/dird/mac.c index 6483011839..eb1c17b1ae 100644 --- a/bacula/src/dird/mac.c +++ b/bacula/src/dird/mac.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2004-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -179,6 +183,13 @@ bool do_mac_init(JCR *jcr) * the previous backup job "prev_job". */ set_jcr_defaults(wjcr, prev_job); + /* fix MA 987 cannot copy/migrate jobs with a Level=VF in the job resource + * If the prev_job level definition is VirtualFull, + * change it to Incremental, otherwise the writing SD would do a VF + */ + if (wjcr->getJobLevel() == L_VIRTUAL_FULL) { + wjcr->setJobLevel(L_INCREMENTAL); + } if (!setup_job(wjcr)) { Jmsg(jcr, M_FATAL, 0, _("setup job failed.\n")); return false; @@ -361,7 +372,7 @@ bool do_mac(JCR *jcr) /* TODO: See priority with bandwidth parameter */ if (jcr->job->max_bandwidth > 0) { jcr->max_bandwidth = jcr->job->max_bandwidth; - } else if (jcr->client->max_bandwidth > 0) { + } else if (jcr->client && jcr->client->max_bandwidth > 0) { jcr->max_bandwidth = jcr->client->max_bandwidth; } @@ -395,7 +406,9 @@ bool do_mac(JCR *jcr) goto bail_out; } sd = jcr->store_bsock; - jcr->sd_calls_client = jcr->client->sd_calls_client; + if (jcr->client) { + jcr->sd_calls_client = jcr->client->sd_calls_client; + } Dmsg2(dbglevel, "Read store=%s, write store=%s\n", ((STORE *)jcr->rstorage->first())->name(), @@ -607,7 +620,7 @@ void mac_cleanup(JCR *jcr, int TermCode, int writeTermCode) { char sdt[MAX_TIME_LENGTH], edt[MAX_TIME_LENGTH]; char ec1[30], ec2[30], ec3[30], ec4[30], ec5[30], elapsed[50]; - char ec6[50], ec7[50], ec8[50]; + char ec6[50], ec7[50], ec8[50], ec9[30], ec10[30]; char term_code[100], sd_term_msg[100]; const char *term_msg; int msg_type = M_INFO; @@ -662,6 +675,11 @@ void mac_cleanup(JCR *jcr, int TermCode, int writeTermCode) new_jobid, old_jobid); db_sql_query(wjcr->db, query.c_str(), NULL, NULL); + /* Move RestoreObjects */ + Mmsg(query, "UPDATE RestoreObject SET JobId=%s WHERE JobId=%s", + new_jobid, old_jobid); + db_sql_query(wjcr->db, query.c_str(), NULL, NULL); + if (jcr->job->PurgeMigrateJob) { /* Purge old Job record */ purge_jobs_from_catalog(ua, old_jobid); @@ -684,9 +702,20 @@ void mac_cleanup(JCR *jcr, int TermCode, int writeTermCode) "SELECT %s, Time, LogText FROM Log WHERE JobId=%s", new_jobid, old_jobid); db_sql_query(wjcr->db, query.c_str(), NULL, NULL); + Mmsg(query, "UPDATE Job SET Type='%c' WHERE JobId=%s", (char)JT_JOB_COPY, new_jobid); db_sql_query(wjcr->db, query.c_str(), NULL, NULL); + + /* Copy RestoreObjects */ + Mmsg(query, "INSERT INTO RestoreObject (ObjectName,PluginName,RestoreObject," + "ObjectLength,ObjectFullLength,ObjectIndex,ObjectType," + "ObjectCompression,FileIndex,JobId) " + "SELECT ObjectName,PluginName,RestoreObject," + "ObjectLength,ObjectFullLength,ObjectIndex,ObjectType," + "ObjectCompression,FileIndex,%s FROM RestoreObject WHERE JobId=%s", + new_jobid, old_jobid); + db_sql_query(wjcr->db, query.c_str(), NULL, NULL); } if (!db_get_job_record(jcr, jcr->db, &jcr->jr)) { @@ -792,9 +821,17 @@ void mac_cleanup(JCR *jcr, int TermCode, int writeTermCode) jobstatus_to_ascii(jcr->SDJobStatus, sd_term_msg, sizeof(sd_term_msg)); /* Edit string for last volume size */ - Mmsg(vol_info, _("%s (%sB)"), + if (mr.VolABytes != 0) { + Mmsg(vol_info, _("meta: %s (%sB) aligned: %s (%sB)"), + edit_uint64_with_commas(mr.VolBytes, ec4), + edit_uint64_with_suffix(mr.VolBytes, ec5), + edit_uint64_with_commas(mr.VolABytes, ec9), + edit_uint64_with_suffix(mr.VolBytes, ec10)); + } else { + Mmsg(vol_info, _("%s (%sB)"), edit_uint64_with_commas(mr.VolBytes, ec4), edit_uint64_with_suffix(mr.VolBytes, ec5)); + } Jmsg(jcr, msg_type, 0, _("%s %s %s (%s):\n" " Build OS: %s %s %s\n" @@ -858,11 +895,6 @@ void mac_cleanup(JCR *jcr, int TermCode, int writeTermCode) sd_term_msg, term_code); - Dmsg1(100, "migrate_cleanup() wjcr=0x%x\n", jcr->wjcr); - if (jcr->wjcr) { - free_jcr(jcr->wjcr); - jcr->wjcr = NULL; - } Dmsg0(100, "Leave migrate_cleanup()\n"); } diff --git a/bacula/src/dird/mac_sql.c b/bacula/src/dird/mac_sql.c index e81fdbd4b7..a7623a768e 100644 --- a/bacula/src/dird/mac_sql.c +++ b/bacula/src/dird/mac_sql.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2004-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -566,8 +570,8 @@ static bool regex_find_jobids(JCR *jcr, idpkt *ids, const char *query1, } } if (last_item) { - free(last_item->item); Dmsg1(dbglevel, "Remove item %s\n", last_item->item); + free(last_item->item); item_chain->remove(last_item); } regfree(&preg); diff --git a/bacula/src/dird/mountreq.c b/bacula/src/dird/mountreq.c index 52a178b388..ab101b7249 100644 --- a/bacula/src/dird/mountreq.c +++ b/bacula/src/dird/mountreq.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * diff --git a/bacula/src/dird/msgchan.c b/bacula/src/dird/msgchan.c index 7ea6359152..b287f4abab 100644 --- a/bacula/src/dird/msgchan.c +++ b/bacula/src/dird/msgchan.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -185,7 +189,11 @@ bool start_storage_daemon_job(JCR *jcr, alist *rstore, alist *wstore, bool send_ */ pm_strcpy(job_name, jcr->job->name()); bash_spaces(job_name); - pm_strcpy(client_name, jcr->client->name()); + if (jcr->client) { + pm_strcpy(client_name, jcr->client->name()); + } else { + pm_strcpy(client_name, "**Dummy**"); + } bash_spaces(client_name); pm_strcpy(fileset_name, jcr->fileset->name()); bash_spaces(fileset_name); @@ -375,7 +383,7 @@ bool start_storage_daemon_message_thread(JCR *jcr) Jmsg1(jcr, M_ABORT, 0, _("Cannot create message thread: %s\n"), be.bstrerror(status)); } /* Wait for thread to start */ - while (!jcr->SD_msg_chan_started) { + while (jcr->SD_msg_chan_started == false) { bmicrosleep(0, 50); if (job_canceled(jcr) || jcr->sd_msg_thread_done) { return false; @@ -388,15 +396,15 @@ bool start_storage_daemon_message_thread(JCR *jcr) extern "C" void msg_thread_cleanup(void *arg) { JCR *jcr = (JCR *)arg; - db_end_transaction(jcr, jcr->db); /* terminate any open transaction */ + db_end_transaction(jcr, jcr->db); /* terminate any open transaction */ jcr->lock(); jcr->sd_msg_thread_done = true; jcr->SD_msg_chan_started = false; jcr->unlock(); pthread_cond_broadcast(&jcr->term_wait); /* wakeup any waiting threads */ Dmsg2(100, "=== End msg_thread. JobId=%d usecnt=%d\n", jcr->JobId, jcr->use_count()); - db_thread_cleanup(jcr->db); /* remove thread specific data */ - free_jcr(jcr); /* release jcr */ + db_thread_cleanup(jcr->db); /* remove thread specific data */ + free_jcr(jcr); /* release jcr */ } /* diff --git a/bacula/src/dird/newvol.c b/bacula/src/dird/newvol.c index 2f7eab3b9d..46f5b9212a 100644 --- a/bacula/src/dird/newvol.c +++ b/bacula/src/dird/newvol.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * diff --git a/bacula/src/dird/next_vol.c b/bacula/src/dird/next_vol.c index 74238fc026..54fa108eb1 100644 --- a/bacula/src/dird/next_vol.c +++ b/bacula/src/dird/next_vol.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -19,7 +23,7 @@ * volume for append. Split out of catreq.c August MMIII * catalog request from the Storage daemon. - * Written by Kern Sibbald, March MMI + * Kern Sibbald, March MMI * */ diff --git a/bacula/src/dird/protos.h b/bacula/src/dird/protos.h index 6c86360fc8..9c68e0d688 100644 --- a/bacula/src/dird/protos.h +++ b/bacula/src/dird/protos.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Director external function prototypes @@ -121,7 +125,8 @@ extern DBId_t get_or_create_pool_record(JCR *jcr, char *pool_name); extern void apply_pool_overrides(JCR *jcr); extern bool apply_wstorage_overrides(JCR *jcr, POOL *original_pool); extern JobId_t run_job(JCR *jcr); -extern bool cancel_job(UAContext *ua, JCR *jcr, bool cancel = true); +extern JobId_t resume_job(JCR *jcr, JOB_DBR *jr); +extern bool cancel_job(UAContext *ua, JCR *jcr, bool cancel=true); extern void get_job_storage(USTORE *store, JOB *job, RUN *run); extern void init_jcr_job_record(JCR *jcr); extern void update_job_end(JCR *jcr, int TermCode); @@ -205,11 +210,11 @@ enum e_pool_op { POOL_OP_UPDATE, POOL_OP_CREATE }; -int create_pool(JCR *jcr, B_DB *db, POOL *pool, e_pool_op op); +int create_pool(JCR *jcr, BDB *db, POOL *pool, e_pool_op op); void set_pool_dbr_defaults_in_media_dbr(MEDIA_DBR *mr, POOL_DBR *pr); -bool set_pooldbr_references(JCR *jcr, B_DB *db, POOL_DBR *pr, POOL *pool); +bool set_pooldbr_references(JCR *jcr, BDB *db, POOL_DBR *pr, POOL *pool); void set_pooldbr_from_poolres(POOL_DBR *pr, POOL *pool, e_pool_op op); -int update_pool_references(JCR *jcr, B_DB *db, POOL *pool); +int update_pool_references(JCR *jcr, BDB *db, POOL *pool); /* ua_input.c */ bool get_cmd(UAContext *ua, const char *prompt, bool subprompt=false); @@ -237,6 +242,9 @@ bool acl_access_jobid_ok(UAContext *ua, const char *jobids); /* ua_restore.c */ void find_storage_resource(UAContext *ua, RESTORE_CTX &rx, char *Storage, char *MediaType); +bool insert_table_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *table); +void new_rx(RESTORE_CTX *rx); +void free_rx(RESTORE_CTX *rx); /* ua_server.c */ void bsendmsg(void *ua_ctx, const char *fmt, ...); @@ -252,8 +260,10 @@ STORE *select_storage_resource(UAContext *ua, bool unique=false); JOB *select_job_resource(UAContext *ua); JOB *select_enable_disable_job_resource(UAContext *ua, bool enable); JOB *select_restore_job_resource(UAContext *ua); +CLIENT *select_enable_disable_client_resource(UAContext *ua, bool enable); CLIENT *select_client_resource(UAContext *ua); FILESET *select_fileset_resource(UAContext *ua); +SCHED *select_enable_disable_schedule_resource(UAContext *ua, bool enable); int select_pool_and_media_dbr(UAContext *ua, POOL_DBR *pr, MEDIA_DBR *mr); int select_media_dbr(UAContext *ua, MEDIA_DBR *mr); bool select_pool_dbr(UAContext *ua, POOL_DBR *pr, const char *argk="pool"); @@ -283,6 +293,7 @@ int find_arg(UAContext *ua, const char *keyword); int find_arg_with_value(UAContext *ua, const char *keyword); int do_keyword_prompt(UAContext *ua, const char *msg, const char **list); int confirm_retention(UAContext *ua, utime_t *ret, const char *msg); +int confirm_retention_yesno(UAContext *ua, utime_t ret, const char *msg); bool get_level_from_name(JCR *jcr, const char *level_name); /* ua_status.c */ @@ -316,8 +327,19 @@ void purge_files_from_job_list(UAContext *ua, del_ctx &del); /* ua_run.c */ extern int run_cmd(UAContext *ua, const char *cmd); +extern int restart_cmd(UAContext *ua, const char *cmd); /* verify.c */ extern bool do_verify(JCR *jcr); extern bool do_verify_init(JCR *jcr); extern void verify_cleanup(JCR *jcr, int TermCode); + +/* snapshot.c */ +int select_snapshot_dbr(UAContext *ua, SNAPSHOT_DBR *sr); +void snapshot_list(UAContext *ua, int i, DB_LIST_HANDLER *sendit, e_list_type llist); +int snapshot_cmd(UAContext *ua, const char *cmd); +int snapshot_catreq(JCR *jcr, BSOCK *bs); +int delete_snapshot(UAContext *ua); +bool update_snapshot(UAContext *ua); +int prune_snapshot(UAContext *ua); +bool send_snapshot_retention(JCR *jcr, utime_t val); diff --git a/bacula/src/dird/query.sql b/bacula/src/dird/query.sql index d85277549e..d04cb8c018 100644 --- a/bacula/src/dird/query.sql +++ b/bacula/src/dird/query.sql @@ -3,5 +3,5 @@ # for some sample queries. # # 1 -:The default file is empty, see /examples/sample-query.sql for samples -SELECT 'See /examples/sample-query.sql for samples' AS Info; +:The default file is empty, see sample-query.sql (in /opt/bacula/scripts or /examples) for samples +SELECT 'See sample-query.sql (in /opt/bacula/scripts or /examples) for samples' AS Info; diff --git a/bacula/src/dird/recycle.c b/bacula/src/dird/recycle.c index 4cd2d4f3da..6ba990c1aa 100644 --- a/bacula/src/dird/recycle.c +++ b/bacula/src/dird/recycle.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * diff --git a/bacula/src/dird/restore.c b/bacula/src/dird/restore.c index 99bffc6706..52283902be 100644 --- a/bacula/src/dird/restore.c +++ b/bacula/src/dird/restore.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 2000-2014 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2015 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /** * Bacula Director -- restore.c -- responsible for restoring files @@ -178,7 +182,8 @@ static bool is_on_same_storage(JCR *jcr, char *new_one) if (!new_store) { Jmsg(jcr, M_WARNING, 0, _("Could not get storage resource '%s'.\n"), new_one); - return false; + /* If not storage found, use last one */ + return true; } /* if Port and Hostname/IP are same, we are talking to the same * Storage Daemon @@ -403,7 +408,7 @@ bool restore_bootstrap(JCR *jcr) /* * SD must call "client" i.e. FD */ - if (jcr->FDVersion < 5) { + if (jcr->FDVersion < 10) { Jmsg(jcr, M_FATAL, 0, _("The File daemon does not support SDCallsClient.\n")); goto bail_out; } @@ -413,8 +418,9 @@ bool restore_bootstrap(JCR *jcr) if (!run_storage_and_start_message_thread(jcr, sd)) { goto bail_out; } - store_address = jcr->wstore->address; /* dummy */ - store_port = 0; /* flag that SD calls FD */ + + store_address = jcr->rstore->address; /* dummy */ + store_port = 0; /* flag that SD calls FD */ } else { /* @@ -466,6 +472,14 @@ bool restore_bootstrap(JCR *jcr) if (!send_runscripts_commands(jcr)) { goto bail_out; } + if (!send_component_info(jcr)) { + Pmsg0(000, "FAIL: Send component info\n"); + goto bail_out; + } + if (!send_restore_objects(jcr)) { + Pmsg0(000, "FAIL: Send restore objects\n"); + goto bail_out; + } } fd->fsend("%s", restore_cmd.c_str()); @@ -532,6 +546,10 @@ bool do_restore(JCR *jcr) /* Print Job Start message */ Jmsg(jcr, M_INFO, 0, _("Start Restore Job %s\n"), jcr->Job); + if (jcr->client) { + jcr->sd_calls_client = jcr->client->sd_calls_client; + } + /* Read the bootstrap file and do the restore */ if (!restore_bootstrap(jcr)) { goto bail_out; @@ -569,6 +587,15 @@ void restore_cleanup(JCR *jcr, int TermCode) Dmsg0(20, "In restore_cleanup\n"); update_job_end(jcr, TermCode); + if (jcr->component_fd) { + fclose(jcr->component_fd); + jcr->component_fd = NULL; + } + if (jcr->component_fname && *jcr->component_fname) { + unlink(jcr->component_fname); + } + free_and_null_pool_memory(jcr->component_fname); + if (jcr->unlink_bsr && jcr->RestoreBootstrap) { unlink(jcr->RestoreBootstrap); jcr->unlink_bsr = false; diff --git a/bacula/src/dird/run_conf.c b/bacula/src/dird/run_conf.c index e96882d76d..9d21eb9a39 100644 --- a/bacula/src/dird/run_conf.c +++ b/bacula/src/dird/run_conf.c @@ -1,24 +1,28 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * * Configuration parser for Director Run Configuration * directives, which are part of the Schedule Resource * - * Written by Kern Sibbald, May MM + * Kern Sibbald, May MM * */ @@ -148,19 +152,19 @@ static void set_defaults() * name token */ s_kw RunFields[] = { - {"pool", 'P'}, - {"fullpool", 'f'}, - {"incrementalpool", 'i'}, - {"differentialpool", 'd'}, - {"level", 'L'}, - {"storage", 'S'}, - {"messages", 'M'}, - {"priority", 'p'}, - {"spooldata", 's'}, + {"Pool", 'P'}, + {"FullPool", 'f'}, + {"IncrementalPool", 'i'}, + {"DifferentialPool", 'd'}, + {"Level", 'L'}, + {"Storage", 'S'}, + {"Messages", 'M'}, + {"Priority", 'p'}, + {"SpoolData", 's'}, {"writepartafterjob", 'W'}, - {"maxrunschedtime", 'm'}, - {"accurate", 'a'}, - {"nextpool", 'N'}, + {"MaxRunSchedTime", 'm'}, + {"Accurate", 'a'}, + {"NextPool", 'N'}, {NULL, 0} }; @@ -513,6 +517,7 @@ void store_run(LEX *lc, RES_ITEM *item, int index, int pass) clear_bits(0, 30, lrun.mday); have_mday = true; } + lrun.last_day_set = true; set_bit(31, lrun.mday); /* day 32 => last day of month */ break; case s_range: diff --git a/bacula/src/dird/scheduler.c b/bacula/src/dird/scheduler.c index f9252f809c..eb8dc0bba6 100644 --- a/bacula/src/dird/scheduler.c +++ b/bacula/src/dird/scheduler.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -174,11 +178,11 @@ again: jcr = new_jcr(sizeof(JCR), dird_free_jcr); run = next_job->run; /* pick up needed values */ job = next_job->job; - if (job->enabled) { - dump_job(next_job, _("Run job")); + if (job->enabled && (!job->client || job->client->enabled)) { + dump_job(next_job, _("Run job")); /* no client and job enabled */ } free(next_job); - if (!job->enabled) { + if (!job->enabled || (job->client && !job->client->enabled)) { free_jcr(jcr); goto again; /* ignore this job */ } @@ -300,7 +304,8 @@ static void find_runs() LockRes(); foreach_res(job, R_JOB) { sched = job->schedule; - if (sched == NULL || !job->enabled) { /* scheduled? or enabled? */ + if (!sched || !job->enabled || (sched && !sched->enabled) || + (job->client && !job->client->enabled)) { continue; /* no, skip this job */ } Dmsg1(dbglvl, "Got job: %s\n", job->hdr.name); @@ -434,6 +439,7 @@ static void dump_job(job_item *ji, const char *msg) #ifdef SCHED_DEBUG char dt[MAX_TIME_LENGTH]; int64_t save_debug = debug_level; + if (!chk_dbglvl(dbglvl)) { return; } diff --git a/bacula/src/dird/snapshot.c b/bacula/src/dird/snapshot.c new file mode 100644 index 0000000000..3cf9ad2646 --- /dev/null +++ b/bacula/src/dird/snapshot.c @@ -0,0 +1,765 @@ +/* + Bacula(R) - The Network Backup Solution + + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2014 Free Software Foundation Europe e.V. + + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. + + You may use this file and others of this release according to the + license defined in the LICENSE file, which includes the Affero General + Public License, v3.0 ("AGPLv3") and some additional permissions and + terms pursuant to its AGPLv3 Section 7. + + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. + + Written by Eric Bollengier, 2015 +*/ + +#include "bacula.h" +#include "dird.h" + +static char CreateSnap[] = "CatReq Job=%127s new_snapshot name=%127s volume=%s device=%s tdate=%d type=%127s retention=%50s"; +static char ListSnap[] = "CatReq Job=%127s list_snapshot name=%127s volume=%s device=%s tdate=%d type=%127s before=%50s after=%50s"; +static char DelSnap[] = "CatReq Job=%127s del_snapshot name=%127s device=%s"; +static char snapretentioncmd[] = "snapshot retention=%s\n"; + + +static void send_list(void *ctx, const char *msg) +{ + BSOCK *bs = (BSOCK *)ctx; + bs->fsend("%s", msg); +} + + +/* Scan command line for common snapshot arguments */ +static void snapshot_scan_cmdline(UAContext *ua, int start, SNAPSHOT_DBR *snapdbr) +{ + for (int j=start; jargc; j++) { + if (strcasecmp(ua->argk[j], NT_("device")) == 0 && ua->argv[j]) { + snapdbr->Device = bstrdup(ua->argv[j]); + snapdbr->need_to_free = true; + + } else if (strcasecmp(ua->argk[j], NT_("jobid")) == 0 && ua->argv[j]) { + snapdbr->JobId = str_to_int64(ua->argv[j]); + + } else if (strcasecmp(ua->argk[j], NT_("type")) == 0 && ua->argv[j]) { + bstrncpy(snapdbr->Type, ua->argv[j], sizeof(snapdbr->Type)); + + } else if (strcasecmp(ua->argk[j], NT_("client")) == 0 && ua->argv[j]) { + bstrncpy(snapdbr->Client, ua->argv[j], sizeof(snapdbr->Client)); + + } else if (strcasecmp(ua->argk[j], NT_("snapshotid")) == 0 && ua->argv[j]) { + snapdbr->SnapshotId = str_to_int64(ua->argv[j]); + + } else if (strcasecmp(ua->argk[j], NT_("snapshot")) == 0 && ua->argv[j]) { + bstrncpy(snapdbr->Name, ua->argv[j], sizeof(snapdbr->Name)); + + } else if (strcasecmp(ua->argk[j], NT_("volume")) == 0 && ua->argv[j]) { + snapdbr->Volume = bstrdup(ua->argv[j]); + snapdbr->need_to_free = true; + + } else if (strcasecmp(ua->argk[j], NT_("createdate")) == 0 && ua->argv[j]) { + bstrncpy(snapdbr->CreateDate, ua->argv[j], sizeof(snapdbr->CreateDate)); + snapdbr->CreateTDate = str_to_utime(ua->argv[j]); + + } else if (strcasecmp(ua->argk[j], NT_("createtdate")) == 0 && ua->argv[j]) { + snapdbr->CreateTDate = str_to_uint64(ua->argv[j]); + bstrutime(snapdbr->CreateDate, sizeof(snapdbr->CreateDate), snapdbr->CreateTDate); + + } else if (strcasecmp(ua->argk[j], NT_("name")) == 0 && ua->argv[j]) { + bstrncpy(snapdbr->Name, ua->argv[j], sizeof(snapdbr->Name)); + + } else if (strcasecmp(ua->argk[j], NT_("size")) == 0 && ua->argv[j]) { + snapdbr->Size = str_to_uint64(ua->argv[j]); + + } else if (strcasecmp(ua->argk[j], NT_("status")) == 0 && ua->argv[j]) { + snapdbr->status = str_to_uint64(ua->argv[j]); + + } else if (strcasecmp(ua->argk[j], NT_("error")) == 0 && ua->argv[j]) { + snapdbr->errmsg = bstrdup(ua->argv[j]); + unbash_spaces(snapdbr->errmsg); + snapdbr->need_to_free = true; + + } else { + continue; + } + } +} + +/* Get a snapshot record, and check that the current UA can access to the Client/FileSet */ +static int get_snapshot_record(UAContext *ua, SNAPSHOT_DBR *snapdbr) +{ + if (!open_client_db(ua)) { + Dmsg0(10, "Unable to open database\n"); + return 0; + } + if (!db_get_snapshot_record(ua->jcr, ua->db, snapdbr)) { + Dmsg0(10, "Unable to get snapshot record\n"); + return 0; + } + /* Need to check if the client is authorized */ + if (!acl_access_ok(ua, Client_ACL, snapdbr->Client)) { + Dmsg0(10, "Client access denied\n"); + return 0; + } + if (snapdbr->FileSetId && !acl_access_ok(ua, FileSet_ACL, snapdbr->FileSet)) { + Dmsg0(10, "Fileset access denied\n"); + return 0; + } + return 1; +} + +static int check_response(UAContext *ua, BSOCK *sd, const char *resp, const char *cmd) +{ + if (sd->errors) { + return 0; + } + if (bget_msg(sd) > 0) { + unbash_spaces(sd->msg); + if (strcmp(sd->msg, resp) == 0) { + return 1; + } + } + if (sd->is_error()) { + ua->error_msg(_("Comm error with SD. bad response to %s. ERR=%s\n"), + cmd, sd->bstrerror()); + } else { + ua->error_msg(_("Bad response from SD to %s command. Wanted %s, got %s len=%ld\n"), + cmd, resp, sd->msg, sd->msglen); + } + return 0; +} + +bool send_snapshot_retention(JCR *jcr, utime_t val) +{ + BSOCK *fd = jcr->file_bsock; + char ed1[50]; + if (val > 0 && jcr->FDVersion >= 13) { + fd->fsend(snapretentioncmd, edit_uint64(val, ed1)); + if (!response(jcr, fd, (char*)"2000 Snapshot retention\n", "set Snapshot Retention", DISPLAY_ERROR)) { + jcr->snapshot_retention = 0; /* can't set snapshot retention */ + return false; + } + } + return true; +} + +/* Called from delete_cmd() in ua_cmd.c */ +int delete_snapshot(UAContext *ua) +{ + POOLMEM *out; + SNAPSHOT_DBR snapdbr; + CLIENT *client; + BSOCK *fd; + + if (!open_new_client_db(ua)) { + return 1; + } + + /* If the client or the fileset are not authorized, + * the function will fail. + */ + if (!select_snapshot_dbr(ua, &snapdbr)) { + ua->error_msg(_("Snapshot not found\n")); + snapdbr.debug(0); + return 0; + } + + client = (CLIENT *)GetResWithName(R_CLIENT, snapdbr.Client); + if (!client) { + ua->error_msg(_("Client resource not found\n")); + return 0; + } + + /* Connect to File daemon */ + ua->jcr->client = client; + + /* Try to connect for 15 seconds */ + ua->send_msg(_("Connecting to Client %s at %s:%d\n"), + client->name(), client->address, client->FDport); + if (!connect_to_file_daemon(ua->jcr, 1, 15, 0)) { + ua->error_msg(_("Failed to connect to Client.\n")); + ua->jcr->client = NULL; + return 0; + } + + fd = ua->jcr->file_bsock; + out = get_pool_memory(PM_FNAME); + fd->fsend("snapshot del %s\n", snapdbr.as_arg(&out)); + free_pool_memory(out); + + /* If the snapshot is not found, still delete ours */ + if (check_response(ua, fd, "2000 Snapshot deleted ERR=\n", "Snapshot")) { + ua->send_msg(_("Snapshot \"%s\" deleted from client %s\n"), snapdbr.Name, + snapdbr.Client); + } + + ua->jcr->file_bsock->signal(BNET_TERMINATE); + free_bsock(ua->jcr->file_bsock); + ua->jcr->client = NULL; + + db_delete_snapshot_record(ua->jcr, ua->db, &snapdbr); + ua->send_msg(_("Snapshot \"%s\" deleted from catalog\n"), snapdbr.Name); + return 1; +} + +/* Called from menu, if snap_list is valid, the snapshot + * list will be stored in this list. (not_owned_by_alist) + */ +int list_snapshot(UAContext *ua, alist *snap_list) +{ + SNAPSHOT_DBR snap; + POOLMEM *buf; + CLIENT *client; + BSOCK *fd; + + client = select_client_resource(ua); + if (!client) { + return 0; + } + + /* Connect to File daemon */ + ua->jcr->client = client; + + /* Try to connect for 15 seconds */ + ua->send_msg(_("Connecting to Client %s at %s:%d\n"), + client->name(), client->address, client->FDport); + if (!connect_to_file_daemon(ua->jcr, 1, 15, 0)) { + ua->error_msg(_("Failed to connect to Client.\n")); + return 0; + } + + fd = ua->jcr->file_bsock; + + /* The command line can have filters */ + snapshot_scan_cmdline(ua, 0, &snap); + buf = get_pool_memory(PM_FNAME); + + fd->fsend("snapshot list %s\n", snap.as_arg(&buf)); + while (fd->recv() >= 0) { + if (snap_list) { + SNAPSHOT_DBR *snapr = new SNAPSHOT_DBR(); + parse_args(fd->msg, &ua->args, &ua->argc, ua->argk, ua->argv, MAX_CMD_ARGS); + snapshot_scan_cmdline(ua, 0, snapr); + bstrncpy(snapr->Client, client->name(), sizeof(snapr->Client)); + snap_list->append(snapr); + snapr->debug(0); + } else { + ua->send_msg("%s", fd->msg); + } + } + + /* Reset the UA arg list */ + parse_args(ua->cmd, &ua->args, &ua->argc, ua->argk, ua->argv, MAX_CMD_ARGS); + + ua->jcr->file_bsock->signal(BNET_TERMINATE); + free_bsock(ua->jcr->file_bsock); + ua->jcr->client = NULL; + free_pool_memory(buf); + return 1; +} + +static void storeit(void *ctx, const char *msg) +{ + char ed1[51]; + alist *lst = (alist *)ctx; + if (sscanf(msg, "snapshotid=%50s", ed1) == 1) { + lst->append((void *)(intptr_t) str_to_int64(ed1)); + } +} + +int prune_snapshot(UAContext *ua) +{ + /* First, we get the snapshot list that can be pruned */ + CLIENT *client = NULL; + BSOCK *fd = NULL; + POOLMEM *buf = NULL; + SNAPSHOT_DBR snapdbr; + alist *lst; + intptr_t id; + + snapshot_scan_cmdline(ua, 0, &snapdbr); + snapdbr.expired = true; + if (!open_client_db(ua)) { + Dmsg0(10, "Unable to open database\n"); + return 0; + } + + buf = get_pool_memory(PM_FNAME); + lst = New(alist(10, not_owned_by_alist)); + db_list_snapshot_records(ua->jcr, ua->db, &snapdbr, storeit, lst, ARG_LIST); + foreach_alist(id, lst) { + snapdbr.reset(); + snapdbr.SnapshotId = id; + if (get_snapshot_record(ua, &snapdbr)) { + + ua->send_msg(_("Snapshot \"%s\" on Client %s\n"), snapdbr.Name, snapdbr.Client); + if (!confirm_retention_yesno(ua, snapdbr.Retention, "Snapshot")) { + continue; + } + + if (client && strcmp(client->hdr.name, snapdbr.Client) != 0) { + ua->jcr->file_bsock->signal(BNET_TERMINATE); + free_bsock(ua->jcr->file_bsock); + ua->jcr->client = NULL; + client = NULL; + } + + if (!client) { + client = (CLIENT *)GetResWithName(R_CLIENT, snapdbr.Client); + if (!client) { + continue; + } + + /* Connect to File daemon */ + ua->jcr->client = client; + + /* Try to connect for 15 seconds */ + ua->send_msg(_("Connecting to Client %s at %s:%d\n"), + client->name(), client->address, client->FDport); + if (!connect_to_file_daemon(ua->jcr, 1, 15, 0)) { + ua->error_msg(_("Failed to connect to Client.\n")); + free_bsock(ua->jcr->file_bsock); + ua->jcr->client = NULL; + client = NULL; + continue; + } + + fd = ua->jcr->file_bsock; + } + + fd->fsend("snapshot del %s\n", snapdbr.as_arg(&buf)); + + fd->recv(); + if (strncmp(fd->msg, "2000", 4) == 0) { + ua->send_msg("Snapshot %s deleted\n", snapdbr.Volume); + db_delete_snapshot_record(ua->jcr, ua->db, &snapdbr); + } else { + unbash_spaces(fd->msg); + ua->send_msg("%s", fd->msg); + } + } + } + + if (ua->jcr->file_bsock) { + ua->jcr->file_bsock->signal(BNET_TERMINATE); + free_bsock(ua->jcr->file_bsock); + ua->jcr->client = NULL; + } + + free_pool_memory(buf); + delete lst; + return 1; +} + + +/* Called from the FD, in catreq.c */ +int snapshot_catreq(JCR *jcr, BSOCK *bs) +{ + SNAPSHOT_DBR snapdbr; + char Job[MAX_NAME_LENGTH], ed1[50]; + POOLMEM *vol = get_memory(bs->msglen); + POOLMEM *dev = get_memory(bs->msglen); + POOLMEM *err = get_pool_memory(PM_MESSAGE); + int n, ret = 1, expired; + *vol = *dev = 0; + + Dmsg1(DT_SNAPSHOT|10, "Get snapshot catalog request %s\n", bs->msg); + + /* We need to create a snapshot record in the catalog */ + n = sscanf(bs->msg, CreateSnap, Job, snapdbr.Name, vol, dev, + &snapdbr.CreateTDate, snapdbr.Type, ed1); + if (n == 7) { + snapdbr.Volume = vol; + snapdbr.Device = dev; + snapdbr.JobId = jcr->JobId; + unbash_spaces(snapdbr.Name); + unbash_spaces(snapdbr.Volume); + unbash_spaces(snapdbr.Device); + snapdbr.Retention = str_to_uint64(ed1); + bstrftimes(snapdbr.CreateDate, sizeof(snapdbr.CreateDate), snapdbr.CreateTDate); + unbash_spaces(snapdbr.Type); + bstrncpy(snapdbr.Client, jcr->client->hdr.name, sizeof(snapdbr.Client)); + bstrncpy(snapdbr.FileSet, (jcr->fileset)?jcr->fileset->hdr.name:"", sizeof(snapdbr.FileSet)); + + Dmsg1(DT_SNAPSHOT|10, "Creating snapshot %s\n", snapdbr.Name); + snapdbr.debug(20); + + /* We lock the db before to keep the error message */ + db_lock(jcr->db); + ret = db_create_snapshot_record(jcr, jcr->db, &snapdbr); + pm_strcpy(err, jcr->db->errmsg); + db_unlock(jcr->db); + + if (ret) { + bs->fsend("1000 Snapshot created\n"); + + } else { + bs->fsend("1999 Snapshot not created ERR=%s\n", err); + } + goto bail_out; + } + + n = sscanf(bs->msg, ListSnap, Job, snapdbr.Name, vol, dev, &snapdbr.CreateTDate, snapdbr.Type, + snapdbr.created_before, snapdbr.created_after, &expired); + if (n == 8) { + snapdbr.Volume = vol; + snapdbr.Device = dev; + unbash_spaces(snapdbr.Name); + unbash_spaces(snapdbr.Volume); + unbash_spaces(snapdbr.Device); + bstrftimes(snapdbr.CreateDate, sizeof(snapdbr.CreateDate), snapdbr.CreateTDate); + unbash_spaces(snapdbr.Type); + unbash_spaces(snapdbr.created_before); + unbash_spaces(snapdbr.created_after); + bstrncpy(snapdbr.Client, jcr->client->hdr.name, sizeof(snapdbr.Client)); + snapdbr.expired = (expired != 0); + Dmsg0(DT_SNAPSHOT|10, "List snapshots\n"); + snapdbr.debug(20); + db_list_snapshot_records(jcr, jcr->db, &snapdbr, send_list, bs, ARG_LIST); + bs->signal(BNET_EOD); + goto bail_out; + } + + n = sscanf(bs->msg, DelSnap, Job, snapdbr.Name, dev); + if (n == 3) { + snapdbr.Device = dev; + unbash_spaces(snapdbr.Name); + unbash_spaces(snapdbr.Device); + bstrncpy(snapdbr.Client, jcr->client->hdr.name, sizeof(snapdbr.Client)); + Dmsg2(DT_SNAPSHOT|10, "Delete snapshot %s from %s\n", snapdbr.Name, snapdbr.Client); + snapdbr.debug(20); + + /* We lock the db before to keep the error message */ + db_lock(jcr->db); + ret = db_delete_snapshot_record(jcr, jcr->db, &snapdbr); + pm_strcpy(err, jcr->db->errmsg); + db_unlock(jcr->db); + + if (ret) { + bs->fsend("1000 Snapshot deleted\n"); + + } else { + bs->fsend("1999 Snapshot not deleted ERR=%s\n", err); + } + goto bail_out; + } + ret = 0; + +bail_out: + free_pool_memory(vol); + free_pool_memory(dev); + free_pool_memory(err); + return ret; +} + +/* List snapshots, allow to use some parameters from the command line */ +void snapshot_list(UAContext *ua, int i, DB_LIST_HANDLER *sendit, e_list_type llist) +{ + SNAPSHOT_DBR snapdbr; + snapshot_scan_cmdline(ua, i, &snapdbr); + if (open_new_client_db(ua)) { + db_list_snapshot_records(ua->jcr, ua->db, &snapdbr, sendit, ua, llist); + } +} + +static int list_client_snapshot(UAContext *ua, bool sync) +{ + SNAPSHOT_DBR *s, stemp; + alist *lst; +// char ed1[50]; + + if (sync) { + if (!open_new_client_db(ua)) { + return 1; + } + } + + lst = New(alist(10, not_owned_by_alist)); + if (list_snapshot(ua, lst)) { + foreach_alist(s, lst) { + ua->send_msg(_( + "Snapshot %s:\n" + " Volume: %s\n" + " Device: %s\n" + " CreateDate: %s\n" +// " Size: %sB\n", + " Type: %s\n" + " Status: %s\n" + " Error: %s\n"), + s->Name, NPRT(s->Volume), NPRT(s->Device), + s->CreateDate, +// edit_uint64_with_suffix(s->Size, ed1), + s->Type, s->status?_("OK"):_("Error"), s->errmsg); + if (sync && s->Device && *s->Name) { + stemp.reset(); + stemp.Device = s->Device; + bstrncpy(stemp.Name, s->Name, sizeof(stemp.Name)); + if (!db_get_snapshot_record(ua->jcr, ua->db, &stemp)) { + if (db_create_snapshot_record(ua->jcr, ua->db, s)) { + ua->send_msg(_("Snapshot added in Catalog\n")); + } + } + } + } + if (lst->size() == 0) { + ua->send_msg(_("No snapshot found\n")); + } + } + /* Cleanup the list */ + foreach_alist (s, lst) { + delete s; + } + delete lst; + return 1; +} + +/* Ask client to create/prune/delete a snapshot via the command line */ +int snapshot_cmd(UAContext *ua, const char *cmd) +{ + SNAPSHOT_DBR snapdbr; + for (int i=0; iargc; i++) { + if (strcasecmp(ua->argk[i], NT_("purge")) == 0) { + + } else if (strcasecmp(ua->argk[i], NT_("prune")) == 0) { + return prune_snapshot(ua); + + } else if (strcasecmp(ua->argk[i], NT_("listclient")) == 0) { + return list_client_snapshot(ua, false); + + } else if (strcasecmp(ua->argk[i], NT_("list")) == 0) { + snapshot_list(ua, 0, prtit, HORZ_LIST); + return 1; + + } else if (strcasecmp(ua->argk[i], NT_("create")) == 0) { + /* We need a job definition, or a client */ + + } else if (strcasecmp(ua->argk[i], NT_("delete")) == 0) { + return delete_snapshot(ua); + + } else if (strcasecmp(ua->argk[i], NT_("status")) == 0) { + + } else if (strcasecmp(ua->argk[i], NT_("sync")) == 0) { + return list_client_snapshot(ua, true); + + } else if (strcasecmp(ua->argk[i], NT_("update")) == 0) { + return update_snapshot(ua); + + } else { + continue; + } + } + + for ( ;; ) { + + start_prompt(ua, _("Snapshot choice: \n")); + add_prompt(ua, _("List snapshots in Catalog")); + add_prompt(ua, _("List snapshots on Client")); + add_prompt(ua, _("Prune snapshots")); + add_prompt(ua, _("Delete snapshot")); + add_prompt(ua, _("Update snapshot parameters")); + add_prompt(ua, _("Update catalog with Client snapshots")); + add_prompt(ua, _("Done")); + + switch(do_prompt(ua, "", _("Select action to perform on Snapshot Engine"), NULL, 0)) { + case 0: /* list catalog */ + snapshot_list(ua, 0, prtit, HORZ_LIST); + break; + case 1: /* list client */ + list_client_snapshot(ua, false); + break; + case 2: /* prune */ + prune_snapshot(ua); + break; + case 3: /* delete */ + delete_snapshot(ua); + break; + case 4: /* update snapshot */ + update_snapshot(ua); + break; + case 5: /* sync snapshot */ + list_client_snapshot(ua, true); + break; + case 6: /* done */ + default: + ua->info_msg(_("Selection terminated.\n")); + return 1; + } + } + return 1; +} + +/* Select a Snapshot record from the database, might be in ua_select.c */ +int select_snapshot_dbr(UAContext *ua, SNAPSHOT_DBR *sr) +{ + int ret = 0; + char *p; + POOLMEM *err = get_pool_memory(PM_FNAME); + *err=0; + + sr->reset(); + snapshot_scan_cmdline(ua, 0, sr); + + if (sr->SnapshotId == 0 && (sr->Name[0] == 0 || sr->Client[0] == 0)) { + CLIENT_DBR cr; + memset(&cr, 0, sizeof(cr)); + /* Get the pool from client= */ + if (!get_client_dbr(ua, &cr)) { + goto bail_out; + } + sr->ClientId = cr.ClientId; + db_list_snapshot_records(ua->jcr, ua->db, sr, prtit, ua, HORZ_LIST); + if (!get_cmd(ua, _("Enter a SnapshotId: "))) { + goto bail_out; + } + p = ua->cmd; + if (*p == '*') { + p++; + } + if (is_a_number(p)) { + sr->SnapshotId = str_to_int64(p); + } else { + goto bail_out; + } + } + + if (!get_snapshot_record(ua, sr)) { + ua->error_msg(_("Unable to get Snapshot record.\n")); + goto bail_out; + } + + ret = 1; + +bail_out: + if (!ret && *err) { + ua->error_msg("%s", err); + } + free_pool_memory(err); + return ret; +} + +/* This part should be in ua_update.c */ +static void update_snapretention(UAContext *ua, char *val, SNAPSHOT_DBR *sr) +{ + char ed1[150]; + POOL_MEM tmp(PM_MESSAGE); + bool ret; + if (!duration_to_utime(val, &sr->Retention)) { + ua->error_msg(_("Invalid retention period specified: %s\n"), val); + return; + } + + db_lock(ua->db); + if (!(ret = db_update_snapshot_record(ua->jcr, ua->db, sr))) { + pm_strcpy(tmp, db_strerror(ua->db)); + } + db_unlock(ua->db); + + if (!ret) { + ua->error_msg("%s", tmp.c_str()); + + } else { + ua->info_msg(_("New retention period is: %s\n"), + edit_utime(sr->Retention, ed1, sizeof(ed1))); + } +} + +/* This part should be in ua_update.c */ +static void update_snapcomment(UAContext *ua, char *val, SNAPSHOT_DBR *sr) +{ + POOL_MEM tmp(PM_MESSAGE); + bool ret; + + bstrncpy(sr->Comment, val, sizeof(sr->Comment)); + + db_lock(ua->db); + if (!(ret = db_update_snapshot_record(ua->jcr, ua->db, sr))) { + pm_strcpy(tmp, db_strerror(ua->db)); + } + db_unlock(ua->db); + + if (!ret) { + ua->error_msg("%s", tmp.c_str()); + + } else { + ua->info_msg(_("New Comment is: %s\n"), sr->Comment); + } +} + +/* This part should be in ua_update.c */ +bool update_snapshot(UAContext *ua) +{ + SNAPSHOT_DBR sr; + POOL_MEM ret; + char ed1[130]; + bool done = false; + int i; + const char *kw[] = { + NT_("Retention"), /* 0 */ + NT_("Comment"), /* 1 */ + NULL }; + + for (i=0; kw[i]; i++) { + int j; + if ((j=find_arg_with_value(ua, kw[i])) > 0) { + /* If all from pool don't select a media record */ + if (!select_snapshot_dbr(ua, &sr)) { + return 0; + } + switch (i) { + case 0: + update_snapretention(ua, ua->argv[j], &sr); + break; + case 1: + update_snapcomment(ua, ua->argv[j], &sr); + break; + default: + break; + } + done = true; + } + } + + for ( ; !done; ) { + start_prompt(ua, _("Parameters to modify:\n")); + add_prompt(ua, _("Snapshot Retention Period")); /* 0 */ + add_prompt(ua, _("Snapshot Comment")); /* 1 */ + add_prompt(ua, _("Done")); /* 2 */ + i = do_prompt(ua, "", _("Select parameter to modify"), NULL, 0); + if (i == 2) { + return 0; + } + + if (!select_snapshot_dbr(ua, &sr)) { /* Get Snapshot record */ + return 0; + } + ua->info_msg(_("Updating Snapshot \"%s\" on \"%s\"\n"), sr.Name, sr.Client); + + switch (i) { + case 0: /* Snapshot retention */ + ua->info_msg(_("Current retention period is: %s\n"), + edit_utime(sr.Retention, ed1, sizeof(ed1))); + if (!get_cmd(ua, _("Enter Snapshot Retention period: "))) { + return 0; + } + update_snapretention(ua, ua->cmd, &sr); + break; + case 1: + ua->info_msg(_("Current comment is: %s\n"), NPRTB(sr.Comment)); + if (!get_cmd(ua, _("Enter Snapshot comment: "))) { + return 0; + } + update_snapcomment(ua, ua->cmd, &sr); + break; + default: /* Done or error */ + ua->info_msg(_("Selection terminated.\n")); + return 1; + } + } + return 1; +} diff --git a/bacula/src/dird/ua.h b/bacula/src/dird/ua.h index 0e3e85558d..aed04ce475 100644 --- a/bacula/src/dird/ua.h +++ b/bacula/src/dird/ua.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Includes specific to the Director User Agent Server @@ -28,9 +32,9 @@ public: BSOCK *UA_sock; BSOCK *sd; JCR *jcr; - B_DB *db; /* Pointing to shared or private db */ - B_DB *shared_db; /* Main Bacula DB access */ - B_DB *private_db; /* Private DB access */ + BDB *db; /* Pointing to shared or private db */ + BDB *shared_db; /* Main Bacula DB access */ + BDB *private_db; /* Private DB access */ CAT *catalog; CONRES *cons; /* console resource */ POOLMEM *cmd; /* return command/name buffer */ @@ -122,6 +126,8 @@ struct RESTORE_CTX { bool all; /* mark all as default */ bool hardlinks_in_mem; /* keep hard links in memory */ NAME_LIST name_list; + POOLMEM *component_fname; + FILE *component_fd; }; #define MAX_ID_LIST_LEN 2000000 diff --git a/bacula/src/dird/ua_acl.c b/bacula/src/dird/ua_acl.c index 4b703741fa..23a0ec8181 100644 --- a/bacula/src/dird/ua_acl.c +++ b/bacula/src/dird/ua_acl.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2004-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * diff --git a/bacula/src/dird/ua_cmds.c b/bacula/src/dird/ua_cmds.c index c1c626d06a..ab8d979a24 100644 --- a/bacula/src/dird/ua_cmds.c +++ b/bacula/src/dird/ua_cmds.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -78,6 +82,7 @@ static void do_job_delete(UAContext *ua, JobId_t JobId); static int delete_volume(UAContext *ua); static int delete_pool(UAContext *ua); static void delete_job(UAContext *ua); +static void do_storage_cmd(UAContext *ua, const char *command); int qhelp_cmd(UAContext *ua, const char *cmd); int quit_cmd(UAContext *ua, const char *cmd); @@ -97,7 +102,7 @@ static struct cmdstruct commands[] = { /* C { NT_("automount"), automount_cmd, _("Automount after label"), NT_("on | off"), false}, { NT_("cancel"), cancel_cmd, _("Cancel a job"), NT_("jobid= | job= | ujobid= | inactive client= storage= | all"), false}, { NT_("create"), create_cmd, _("Create DB Pool from resource"), NT_("pool="), false}, - { NT_("delete"), delete_cmd, _("Delete volume, pool or job"), NT_("volume= pool= jobid="), true}, + { NT_("delete"), delete_cmd, _("Delete volume, pool or job"), NT_("volume= | pool= | jobid= | snapshot"), true}, { NT_("disable"), disable_cmd, _("Disable a job, attributes batch process"), NT_("job= | batch"), true}, { NT_("enable"), enable_cmd, _("Enable a job, attributes batch process"), NT_("job= | batch"), true}, { NT_("estimate"), estimate_cmd, _("Performs FileSet estimate, listing gives full listing"), @@ -108,23 +113,24 @@ static struct cmdstruct commands[] = { /* C { NT_("help"), help_cmd, _("Print help on specific command"), NT_("add autodisplay automount cancel create delete disable\n\tenable estimate exit gui label list llist" "\n\tmessages memory mount prune purge quit query\n\trestore relabel release reload run status" - "\n\tsetbandwidth setdebug setip show sqlquery time trace unmount\n\tumount update use var version wait"), false}, + "\n\tsetbandwidth setdebug setip show sqlquery time trace unmount\n\tumount update use var version wait" + "\n\tsnapshot"), false}, { NT_("label"), label_cmd, _("Label a tape"), NT_("storage= volume= pool= slot= barcodes"), false}, { NT_("list"), list_cmd, _("List objects from catalog"), NT_("pools | jobs | jobtotals | volume | media | files jobid= | copies jobid= |\n" - "\tjoblog jobid="), false}, + "\tjoblog jobid= | snapshot"), false}, { NT_("llist"), llist_cmd, _("Full or long list like list command"), - NT_("pools | jobs | joblog jobid= | jobtotals | media | files jobid= | copies jobid="), true}, + NT_("pools | jobs | joblog jobid= | jobtotals | media | files jobid= | copies jobid= | snapshot"), false}, { NT_("messages"), messagescmd, _("Display pending messages"), NT_(""), false}, { NT_("memory"), memory_cmd, _("Print current memory usage"), NT_(""), true}, { NT_("mount"), mount_cmd, _("Mount storage"), - NT_("storage= slot= drive= [ jobid= | job= ]"), false}, + NT_("storage= slot= drive= [ device= ] [ jobid= | job= ]"), false}, { NT_("prune"), prunecmd, _("Prune expired records from catalog"), - NT_("files | jobs | pool= | client= | [ expired ] volume= "), true}, + NT_("files | jobs | pool= | snapshot [client=] | client= | [ expired ] volume= "), true}, { NT_("purge"), purge_cmd, _("Purge records from catalog"), NT_("files jobs volume= [mediatype= pool= allpools storage= drive=]"), true}, { NT_("quit"), quit_cmd, _("Terminate Bconsole session"), NT_(""), false}, @@ -137,26 +143,40 @@ static struct cmdstruct commands[] = { /* C { NT_("relabel"), relabel_cmd, _("Relabel a tape"), NT_("storage= oldvolume=\n\tvolume= pool="), false}, - { NT_("release"), release_cmd, _("Release storage"), NT_("storage="), false}, + { NT_("release"), release_cmd, _("Release storage"), NT_("storage= [ device= ] "), false}, { NT_("reload"), reload_cmd, _("Reload conf file"), NT_(""), true}, { NT_("run"), run_cmd, _("Run a job"), NT_("job= client=\n\tfileset= level=\n\tstorage=" " where=\n\twhen= pool=\n\t" " nextpool= comment= accurate= spooldata= yes"), false}, + { NT_("restart"), restart_cmd, _("Restart a job"), + NT_("incomplete job= client=\n\tfileset= level=\n\tstorage=" + "when=\n\tcomment= spooldata= jobid="), false}, + + { NT_("resume"), restart_cmd, _("Resume a job"), + NT_("incomplete job= client=\n\tfileset= level=\n\tstorage=" + "when=\n\tcomment= spooldata= jobid="), false}, + { NT_("status"), status_cmd, _("Report status"), - NT_("all | dir= | director | client= | storage= slots | days=nnn"), true}, + NT_("all | dir= | director | client= |\n" + "\tstorage= slots |\n" + "\tschedule [job=] [days=] [limit=] [toto]\n" + "\t\t[time=]"), true}, { NT_("stop"), cancel_cmd, _("Stop a job"), NT_("jobid= job= ujobid= all"), false}, { NT_("setdebug"), setdebug_cmd, _("Sets debug level"), - NT_("level= trace=0/1 client= | dir | storage= | all"), true}, + NT_("level= tags= trace=0/1 options=<0tTc> tags= | client= | dir | storage= | all"), true}, { NT_("setbandwidth"), setbwlimit_cmd, _("Sets bandwidth"), NT_("limit= client= jobid= job= ujobid="), true}, + { NT_("snapshot"), snapshot_cmd, _("Handle snapshots"), + NT_("[client= | job= | jobid=] [delete | list | listclient | prune | sync | update]"), true}, + { NT_("setip"), setip_cmd, _("Sets new client address -- if authorized"), NT_(""), false}, { NT_("show"), show_cmd, _("Show resource records"), - NT_("job= | pool= | fileset= schedule= | client= | disabled | all"), true}, + NT_("job= | pool= | fileset= | schedule= | client= | storage= | disabled | all"), true}, { NT_("sqlquery"), sqlquerycmd, _("Use SQL to query catalog"), NT_(""), false}, { NT_("time"), time_cmd, _("Print current time"), NT_(""), true}, @@ -166,10 +186,10 @@ static struct cmdstruct commands[] = { /* C NT_("storage= [ drive= ] | jobid= | job="), false}, { NT_("umount"), unmount_cmd, _("Umount - for old-time Unix guys, see unmount"), - NT_("storage= [ drive= ] | jobid= | job="), false}, + NT_("storage= [ drive= ] [ device= ]| jobid= | job="), false}, { NT_("update"), update_cmd, _("Update volume, pool or stats"), - NT_("stats\n\tpool=\n\tslots storage= scan" + NT_("stats\n\tsnapshot\n\tpool=\n\tslots storage= scan" "\n\tvolume= volstatus= volretention=" "\n\t pool= recycle= slot=\n\t inchanger=" "\n\t maxvolbytes= maxvolfiles= maxvoljobs=" @@ -226,7 +246,7 @@ bool do_a_command(UAContext *ua) if (ua->api) user->signal(BNET_CMD_BEGIN); ok = (*commands[i].func)(ua, ua->cmd); /* go execute command */ if (ua->api) user->signal(ok?BNET_CMD_OK:BNET_CMD_FAILED); - found = true; + found = (user && user->is_stop()) ? false : true; break; } } @@ -430,7 +450,8 @@ int automount_cmd(UAContext *ua, const char *cmd) } /* - * Cancel a job + * Cancel/Stop a job -- Stop marks it as Incomplete + * so that it can be restarted. */ static int cancel_cmd(UAContext *ua, const char *cmd) { @@ -499,7 +520,7 @@ void set_pooldbr_from_poolres(POOL_DBR *pr, POOL *pool, e_pool_op op) } /* set/update Pool.RecyclePoolId and Pool.ScratchPoolId in Catalog */ -int update_pool_references(JCR *jcr, B_DB *db, POOL *pool) +int update_pool_references(JCR *jcr, BDB *db, POOL *pool) { POOL_DBR pr; @@ -531,7 +552,7 @@ int update_pool_references(JCR *jcr, B_DB *db, POOL *pool) /* set POOL_DBR.RecyclePoolId and POOL_DBR.ScratchPoolId from Pool resource * works with set_pooldbr_from_poolres */ -bool set_pooldbr_references(JCR *jcr, B_DB *db, POOL_DBR *pr, POOL *pool) +bool set_pooldbr_references(JCR *jcr, BDB *db, POOL_DBR *pr, POOL *pool) { POOL_DBR rpool; bool ret = true; @@ -583,7 +604,7 @@ bool set_pooldbr_references(JCR *jcr, B_DB *db, POOL_DBR *pr, POOL *pool) * 1 record created */ -int create_pool(JCR *jcr, B_DB *db, POOL *pool, e_pool_op op) +int create_pool(JCR *jcr, BDB *db, POOL *pool, e_pool_op op) { POOL_DBR pr; memset(&pr, 0, sizeof(POOL_DBR)); @@ -729,8 +750,8 @@ static int setbwlimit_cmd(UAContext *ua, const char *cmd) jcr->max_bandwidth = limit; /* TODO: see for locking (Should be safe)*/ bstrncpy(Job, jcr->Job, sizeof(Job)); client = jcr->client; - free_jcr(jcr); setbwlimit_client(ua, client, Job, limit); + free_jcr(jcr); } } else { @@ -776,10 +797,15 @@ get_out: return 1; } - -static void do_en_disable_cmd(UAContext *ua, bool setting) +/* + * Does all sorts of enable/disable commands: batch, scheduler (not implemented) + * job, client, schedule, storage + */ +static void do_enable_disable_cmd(UAContext *ua, bool setting) { - JOB *job; + JOB *job = NULL; + CLIENT *client = NULL; + SCHED *sched = NULL; int i; if (find_arg(ua, NT_("batch")) > 0) { @@ -795,45 +821,99 @@ static void do_en_disable_cmd(UAContext *ua, bool setting) * } */ - i = find_arg_with_value(ua, NT_("job")); - if (i < 0) { - job = select_enable_disable_job_resource(ua, setting); - if (!job) { + i = find_arg(ua, NT_("job")); + if (i >= 0) { + if (ua->argv[i]) { + LockRes(); + job = GetJobResWithName(ua->argv[i]); + UnlockRes(); + } else { + job = select_enable_disable_job_resource(ua, setting); + if (!job) { + return; + } + } + } + if (job) { + if (!acl_access_ok(ua, Job_ACL, job->name())) { + ua->error_msg(_("Unauthorized command from this console.\n")); return; } - } else { - LockRes(); - job = GetJobResWithName(ua->argv[i]); - UnlockRes(); + job->enabled = setting; + ua->send_msg(_("Job \"%s\" %sabled\n"), job->name(), setting?"en":"dis"); } - if (!job) { - ua->error_msg(_("Job \"%s\" not found.\n"), ua->argv[i]); - return; + + i = find_arg(ua, NT_("client")); + if (i >= 0) { + if (ua->argv[i]) { + LockRes(); + client = GetClientResWithName(ua->argv[i]); + UnlockRes(); + } else { + client = select_enable_disable_client_resource(ua, setting); + if (!client) { + return; + } + } + } + if (client) { + if (!acl_access_ok(ua, Client_ACL, client->name())) { + ua->error_msg(_("Unauthorized command from this console.\n")); + return; + } + client->enabled = setting; + ua->send_msg(_("Client \"%s\" %sabled\n"), client->name(), setting?"en":"dis"); } - if (!acl_access_ok(ua, Job_ACL, job->name())) { - ua->error_msg(_("Unauthorized command from this console.\n")); - return; + i = find_arg(ua, NT_("schedule")); + if (i >= 0) { + if (ua->argv[i]) { + LockRes(); + sched = (SCHED *)GetResWithName(R_SCHEDULE, ua->argv[i]); + UnlockRes(); + } else { + sched = select_enable_disable_schedule_resource(ua, setting); + if (!sched) { + return; + } + } } - job->enabled = setting; - ua->send_msg(_("Job \"%s\" %sabled\n"), job->name(), setting?"en":"dis"); + if (sched) { + if (!acl_access_ok(ua, Schedule_ACL, sched->name())) { + ua->error_msg(_("Unauthorized command from this console.\n")); + return; + } + sched->enabled = setting; + ua->send_msg(_("Schedule \"%s\" %sabled\n"), sched->name(), setting?"en":"dis"); + } + + i = find_arg(ua, NT_("storage")); + if (i >= 0) { + do_storage_cmd(ua, setting?"enable":"disable"); + } + + if (i < 0 && !sched && !client && !job) { + ua->error_msg(_("You must enter one of the following keywords: job, client, schedule, or storage.\n")); + } + return; } static int enable_cmd(UAContext *ua, const char *cmd) { - do_en_disable_cmd(ua, true); + do_enable_disable_cmd(ua, true); return 1; } static int disable_cmd(UAContext *ua, const char *cmd) { - do_en_disable_cmd(ua, false); + do_enable_disable_cmd(ua, false); return 1; } static void do_storage_setdebug(UAContext *ua, STORE *store, - int64_t level, int trace_flag, char *options, char *tags) + int64_t level, int trace_flag, int hangup, int blowup, + char *options, char *tags) { BSOCK *sd; USTORE lstore; @@ -850,8 +930,8 @@ static void do_storage_setdebug(UAContext *ua, STORE *store, } Dmsg0(120, _("Connected to storage daemon\n")); sd = ua->jcr->store_bsock; - sd->fsend("setdebug=%ld trace=%ld hangup=0 options=%s tags=%s\n", - (int32_t)level, trace_flag, options, NPRTB(tags)); + sd->fsend("setdebug=%ld trace=%ld hangup=%ld blowup=%ld options=%s tags=%s\n", + (int32_t)level, trace_flag, hangup, blowup, options, NPRTB(tags)); if (sd->recv() >= 0) { ua->send_msg("%s", sd->msg); } @@ -865,12 +945,14 @@ static void do_storage_setdebug(UAContext *ua, STORE *store, * level = debug level * trace = send debug output to a file * options = various options for debug or specific FD behavior - * hangup = how many records to send to SD before hanging up + * hangup = how many records to send to FD before hanging up * obviously this is most useful for testing restarting * failed jobs. + * blowup = how many records to send to FD before blowing up the FD. */ static void do_client_setdebug(UAContext *ua, CLIENT *client, - int64_t level, int trace, int hangup, char *options, char *tags) + int64_t level, int trace, int hangup, int blowup, + char *options, char *tags) { CLIENT *old_client; BSOCK *fd; @@ -890,12 +972,12 @@ static void do_client_setdebug(UAContext *ua, CLIENT *client, Dmsg0(120, "Connected to file daemon\n"); fd = ua->jcr->file_bsock; - if (ua->jcr->FDVersion < 8 || !options) { + if (ua->jcr->FDVersion <= 10) { fd->fsend("setdebug=%ld trace=%d hangup=%d\n", (int32_t)level, trace, hangup); } else { - fd->fsend("setdebug=%ld trace=%d hangup=%d options=%s tags=%s\n", - (int32_t)level, trace, hangup, options, NPRTB(tags)); + fd->fsend("setdebug=%ld trace=%d hangup=%d blowup=%d options=%s tags=%s\n", + (int32_t)level, trace, hangup, blowup, options, NPRTB(tags)); } if (fd->recv() >= 0) { ua->send_msg("%s", fd->msg); @@ -907,7 +989,9 @@ static void do_client_setdebug(UAContext *ua, CLIENT *client, } -static void do_all_setdebug(UAContext *ua, int64_t level, int trace_flag, int hangup, char *options, char *tags) +static void do_all_setdebug(UAContext *ua, int64_t level, + int trace_flag, int hangup, int blowup, + char *options, char *tags) { STORE *store, **unique_store; CLIENT *client, **unique_client; @@ -946,7 +1030,8 @@ static void do_all_setdebug(UAContext *ua, int64_t level, int trace_flag, int ha /* Call each unique Storage daemon */ for (j=0; j not change */ + /* Look for hangup (debug only) flag. -1 => not change */ i = find_arg_with_value(ua, "hangup"); if (i >= 0) { hangup = atoi(ua->argv[i]); } + /* Look for blowup (debug only) flag. -1 => not change */ + i = find_arg_with_value(ua, "blowup"); + if (i >= 0) { + blowup = atoi(ua->argv[i]); + } /* General debug? */ for (i=1; iargc; i++) { if (strcasecmp(ua->argk[i], "all") == 0) { - do_all_setdebug(ua, level, trace_flag, hangup, options, tags_str); + do_all_setdebug(ua, level, trace_flag, hangup, blowup, options, tags_str); return 1; } if (strcasecmp(ua->argk[i], "dir") == 0 || strcasecmp(ua->argk[i], "director") == 0) { - debug_level = level | tags; + debug_level = level; + debug_level_tags = tags; set_trace(trace_flag); set_debug_flags(options); return 1; @@ -1065,13 +1158,15 @@ static int setdebug_cmd(UAContext *ua, const char *cmd) if (ua->argv[i]) { client = GetClientResWithName(ua->argv[i]); if (client) { - do_client_setdebug(ua, client, level, trace_flag, hangup, options, tags_str); + do_client_setdebug(ua, client, level, trace_flag, + hangup, blowup, options, tags_str); return 1; } } client = select_client_resource(ua); if (client) { - do_client_setdebug(ua, client, level, trace_flag, hangup, options, tags_str); + do_client_setdebug(ua, client, level, trace_flag, + hangup, blowup, options, tags_str); return 1; } } @@ -1083,13 +1178,15 @@ static int setdebug_cmd(UAContext *ua, const char *cmd) if (ua->argv[i]) { store = GetStoreResWithName(ua->argv[i]); if (store) { - do_storage_setdebug(ua, store, level, trace_flag, options, tags_str); + do_storage_setdebug(ua, store, level, trace_flag, + hangup, blowup, options, tags_str); return 1; } } store = get_storage_resource(ua, false/*no default*/, true/*unique*/); if (store) { - do_storage_setdebug(ua, store, level, trace_flag, options, tags_str); + do_storage_setdebug(ua, store, level, trace_flag, + hangup, blowup, options, tags_str); return 1; } } @@ -1105,24 +1202,26 @@ static int setdebug_cmd(UAContext *ua, const char *cmd) add_prompt(ua, _("All")); switch(do_prompt(ua, "", _("Select daemon type to set debug level"), NULL, 0)) { case 0: /* Director */ - debug_level = level | tags; + debug_level = level; set_trace(trace_flag); set_debug_flags(options); break; case 1: store = get_storage_resource(ua, false/*no default*/, true/*unique*/); if (store) { - do_storage_setdebug(ua, store, level, trace_flag, options, tags_str); + do_storage_setdebug(ua, store, level, trace_flag, hangup, blowup, + options, tags_str); } break; case 2: client = select_client_resource(ua); if (client) { - do_client_setdebug(ua, client, level, trace_flag, hangup, options, tags_str); + do_client_setdebug(ua, client, level, trace_flag, hangup, blowup, + options, tags_str); } break; case 3: - do_all_setdebug(ua, level, trace_flag, hangup, options, tags_str); + do_all_setdebug(ua, level, trace_flag, hangup, blowup, options, tags_str); break; default: break; @@ -1139,7 +1238,7 @@ static int trace_cmd(UAContext *ua, const char *cmd) if (ua->argc != 2) { if (!get_cmd(ua, _("Turn on or off? "))) { - return 1; + return 1; } onoff = ua->cmd; } else { @@ -1148,7 +1247,6 @@ static int trace_cmd(UAContext *ua, const char *cmd) set_trace((strcasecmp(onoff, NT_("off")) == 0) ? false : true); return 1; - } static int var_cmd(UAContext *ua, const char *cmd) @@ -1245,11 +1343,12 @@ static int estimate_cmd(UAContext *ua, const char *cmd) if (ua->argv[i]) { if (!get_level_from_name(ua->jcr, ua->argv[i])) { ua->error_msg(_("Level \"%s\" not valid.\n"), ua->argv[i]); + return 1; } continue; } else { - ua->error_msg(_("Level value missing.\n")); - return 1; + ua->error_msg(_("Level value missing.\n")); + return 1; } } if (strcasecmp(ua->argk[i], NT_("accurate")) == 0) { @@ -1257,11 +1356,12 @@ static int estimate_cmd(UAContext *ua, const char *cmd) if (!is_yesno(ua->argv[i], &accurate)) { ua->error_msg(_("Invalid value for accurate. " "It must be yes or no.\n")); + return 1; } continue; } else { ua->error_msg(_("Accurate value missing.\n")); - return 1; + return 1; } } } @@ -1364,7 +1464,6 @@ bail_out: return 1; } - /* * print time */ @@ -1403,6 +1502,7 @@ static int delete_cmd(UAContext *ua, const char *cmd) NT_("volume"), NT_("pool"), NT_("jobid"), + NT_("snapshot"), NULL}; /* Deleting large jobs can take time! */ @@ -1419,11 +1519,14 @@ static int delete_cmd(UAContext *ua, const char *cmd) return 1; case 2: int i; - while ((i = find_arg(ua, "jobid")) > 0) { + while ((i=find_arg(ua, "jobid")) > 0) { delete_job(ua); *ua->argk[i] = 0; /* zap keyword already visited */ } return 1; + case 3: + delete_snapshot(ua); + return 1; default: break; } @@ -1442,6 +1545,9 @@ static int delete_cmd(UAContext *ua, const char *cmd) case 2: delete_job(ua); return 1; + case 3: + delete_snapshot(ua); + return 1; default: ua->warning_msg(_("Nothing done.\n")); break; @@ -1450,31 +1556,31 @@ static int delete_cmd(UAContext *ua, const char *cmd) } /* - * delete_job has been modified to parse JobID lists like the following: + * delete_job has been modified to parse JobID lists like the + * following: * delete JobID=3,4,6,7-11,14 * * Thanks to Phil Stracchino for the above addition. */ static void delete_job(UAContext *ua) { - int i; int JobId; /* not JobId_t because it's unsigned and not compatible with sellist */ char buf[256]; sellist sl; - i = find_arg_with_value(ua, NT_("jobid")); + int i = find_arg_with_value(ua, NT_("jobid")); if (i >= 0) { if (!sl.set_string(ua->argv[i], true)) { ua->warning_msg("%s", sl.get_errmsg()); return; - } - + } + if (sl.size() > 25 && (find_arg(ua, "yes") < 0)) { bsnprintf(buf, sizeof(buf), _("Are you sure you want to delete %d JobIds ? (yes/no): "), sl.size()); if (!get_yesno(ua, buf)) { return; - } + } } foreach_sellist(JobId, &sl) { @@ -1499,7 +1605,7 @@ static void do_job_delete(UAContext *ua, JobId_t JobId) edit_int64(JobId, ed1); purge_jobs_from_catalog(ua, ed1); - ua->send_msg(_("Jobid %s and associated records deleted from the catalog.\n"), ed1); + ua->send_msg(_("JobId=%s and associated records deleted from the catalog.\n"), ed1); } /* @@ -1578,14 +1684,14 @@ int memory_cmd(UAContext *ua, const char *cmd) return 1; } -static void do_mount_cmd(UAContext *ua, const char *command) +static void do_storage_cmd(UAContext *ua, const char *command) { USTORE store; BSOCK *sd; JCR *jcr = ua->jcr; char dev_name[MAX_NAME_LENGTH]; - int drive; - int slot = -1; + int drive, i; + int slot; if (!open_client_db(ua)) { return; @@ -1599,25 +1705,34 @@ static void do_mount_cmd(UAContext *ua, const char *command) pm_strcpy(store.store_source, _("unknown source")); set_wstorage(jcr, &store); drive = get_storage_drive(ua, store.store); - if (strcmp(command, "mount") == 0) { - slot = get_storage_slot(ua, store.store); + slot = get_storage_slot(ua, store.store); + + /* Users may set a device name directly on the command line */ + if ((i = find_arg_with_value(ua, "device")) > 0) { + POOLMEM *errmsg = get_pool_memory(PM_NAME); + if (!is_name_valid(ua->argv[i], &errmsg)) { + ua->error_msg(_("Invalid device name. %s"), errmsg); + free_pool_memory(errmsg); + return; + } + free_pool_memory(errmsg); + bstrncpy(dev_name, ua->argv[i], sizeof(dev_name)); + + } else { /* We take the default device name */ + bstrncpy(dev_name, store.store->dev_name(), sizeof(dev_name)); } Dmsg3(120, "Found storage, MediaType=%s DevName=%s drive=%d\n", store.store->media_type, store.store->dev_name(), drive); + Dmsg4(120, "Cmd: %s %s drive=%d slot=%d\n", command, dev_name, drive, slot); if (!connect_to_storage_daemon(jcr, 10, SDConnectTimeout, 1)) { ua->error_msg(_("Failed to connect to Storage daemon.\n")); return; } sd = jcr->store_bsock; - bstrncpy(dev_name, store.store->dev_name(), sizeof(dev_name)); bash_spaces(dev_name); - if (slot > 0) { - sd->fsend("%s %s drive=%d slot=%d", command, dev_name, drive, slot); - } else { - sd->fsend("%s %s drive=%d", command, dev_name, drive); - } + sd->fsend("%s %s drive=%d slot=%d", command, dev_name, drive, slot); while (sd->recv() >= 0) { ua->send_msg("%s", sd->msg); } @@ -1630,7 +1745,7 @@ static void do_mount_cmd(UAContext *ua, const char *command) */ static int mount_cmd(UAContext *ua, const char *cmd) { - do_mount_cmd(ua, "mount"); /* mount */ + do_storage_cmd(ua, "mount") ; /* mount */ return 1; } @@ -1640,7 +1755,7 @@ static int mount_cmd(UAContext *ua, const char *cmd) */ static int unmount_cmd(UAContext *ua, const char *cmd) { - do_mount_cmd(ua, "unmount"); /* unmount */ + do_storage_cmd(ua, "unmount"); /* unmount */ return 1; } @@ -1650,7 +1765,7 @@ static int unmount_cmd(UAContext *ua, const char *cmd) */ static int release_cmd(UAContext *ua, const char *cmd) { - do_mount_cmd(ua, "release"); /* release */ + do_storage_cmd(ua, "release"); /* release */ return 1; } @@ -1834,14 +1949,14 @@ int wait_cmd(UAContext *ua, const char *cmd) "SELECT JobStatus FROM Job WHERE JobId='%i'", jobid); - db_sql_query(ua->db, buf, - status_handler, (void *)&jobstatus); + db_sql_query(ua->db, buf, status_handler, (void *)&jobstatus); switch (jobstatus) { case JS_Error: status = 1 ; /* Warning */ break; + case JS_Incomplete: case JS_FatalError: case JS_ErrorTerminated: case JS_Canceled: @@ -1860,8 +1975,8 @@ int wait_cmd(UAContext *ua, const char *cmd) ua->send_msg("JobId=%i\n", jobid) ; ua->send_msg("JobStatus=%s (%c)\n", - job_status_to_str(jobstatus), - jobstatus) ; + job_status_to_str(jobstatus, 0), + jobstatus) ; if (ua->gui || ua->api) { ua->send_msg("ExitStatus=%i\n", status) ; @@ -2088,7 +2203,7 @@ bool open_db(UAContext *ua) ua->catalog->db_user, ua->catalog->db_password, ua->catalog->db_address, ua->catalog->db_port, ua->catalog->db_socket, - mult_db_conn, ua->catalog->disable_batch_insert); + mult_db_conn, ua->catalog->disable_batch_insert); if (!ua->db || !db_open_database(ua->jcr, ua->db)) { ua->error_msg(_("Could not open catalog database \"%s\".\n"), ua->catalog->db_name); diff --git a/bacula/src/dird/ua_dotcmds.c b/bacula/src/dird/ua_dotcmds.c index a764d7dc2f..4aeadfbc2a 100644 --- a/bacula/src/dird/ua_dotcmds.c +++ b/bacula/src/dird/ua_dotcmds.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -52,6 +56,7 @@ static bool schedulescmd(UAContext *ua, const char *cmd); static bool storagecmd(UAContext *ua, const char *cmd); static bool defaultscmd(UAContext *ua, const char *cmd); static bool typescmd(UAContext *ua, const char *cmd); +static bool tagscmd(UAContext *ua, const char *cmd); static bool backupscmd(UAContext *ua, const char *cmd); static bool levelscmd(UAContext *ua, const char *cmd); static bool getmsgscmd(UAContext *ua, const char *cmd); @@ -71,7 +76,9 @@ static bool dot_bvfs_restore(UAContext *ua, const char *cmd); static bool dot_bvfs_cleanup(UAContext *ua, const char *cmd); static bool dot_bvfs_clear_cache(UAContext *ua, const char *cmd); static bool dot_bvfs_decode_lstat(UAContext *ua, const char *cmd); +static bool dot_bvfs_update_fv(UAContext *ua, const char *cmd); static bool dot_bvfs_get_volumes(UAContext *ua, const char *cmd); +static bool dot_bvfs_get_jobs(UAContext *ua, const char *cmd); static bool putfile_cmd(UAContext *ua, const char *cmd); static bool api_cmd(UAContext *ua, const char *cmd); @@ -113,12 +120,15 @@ static struct cmdstruct commands[] = { /* help */ /* can be used in runscript * { NT_(".bvfs_get_volumes"),dot_bvfs_get_volumes,NULL, true}, { NT_(".bvfs_update"), dot_bvfs_update, NULL, true}, { NT_(".bvfs_get_jobids"), dot_bvfs_get_jobids, NULL, true}, + { NT_(".bvfs_get_jobs"), dot_bvfs_get_jobs, NULL, true}, { NT_(".bvfs_versions"), dot_bvfs_versions, NULL, true}, { NT_(".bvfs_restore"), dot_bvfs_restore, NULL, true}, { NT_(".bvfs_cleanup"), dot_bvfs_cleanup, NULL, true}, { NT_(".bvfs_decode_lstat"),dot_bvfs_decode_lstat,NULL, true}, { NT_(".bvfs_clear_cache"),dot_bvfs_clear_cache,NULL, false}, - { NT_(".types"), typescmd, NULL, false} + { NT_(".bvfs_update_fv"),dot_bvfs_update_fv, NULL, true}, + { NT_(".types"), typescmd, NULL, false}, + { NT_(".tags"), tagscmd, NULL, false} }; #define comsize ((int)(sizeof(commands)/sizeof(struct cmdstruct))) @@ -133,8 +143,8 @@ bool do_a_dot_command(UAContext *ua) bool found = false; BSOCK *user = ua->UA_sock; - Dmsg1(1400, "Dot command: %s\n", user->msg); - if (ua->argc == 0) { + Dmsg1(1400, "Dot command: %s\n", user?user->msg:""); + if (ua->argc == 0 || !user) { return false; } @@ -163,7 +173,7 @@ bool do_a_dot_command(UAContext *ua) ok = (*commands[i].func)(ua, ua->cmd); /* go execute command */ if (ua->api) user->signal(ok?BNET_CMD_OK:BNET_CMD_FAILED); ua->gui = gui; - found = true; + found = user->is_stop() ? false : true; break; } } @@ -174,6 +184,17 @@ bool do_a_dot_command(UAContext *ua) return ok; } +static void bvfs_set_acl(UAContext *ua, Bvfs *bvfs) +{ + /* If no console resource => default console and all is permitted */ + if (!ua || !ua->cons) { + return; + } + bvfs->set_job_acl(ua->cons->ACL_lists[Job_ACL]); + bvfs->set_client_acl(ua->cons->ACL_lists[Client_ACL]); + bvfs->set_fileset_acl(ua->cons->ACL_lists[FileSet_ACL]); + bvfs->set_pool_acl(ua->cons->ACL_lists[Pool_ACL]); +} static bool dot_bvfs_decode_lstat(UAContext *ua, const char *cmd) { @@ -233,6 +254,27 @@ static bool dot_bvfs_update(UAContext *ua, const char *cmd) return true; } +static bool dot_bvfs_update_fv(UAContext *ua, const char *cmd) +{ + int pos = find_arg_with_value(ua, "jobid"); + + if (pos == -1 || !is_a_number_list(ua->argv[pos])) { + ua->error_msg("Expecting to find jobid=1,2,3 argument\n"); + return 1; + } + + if (!open_new_client_db(ua)) { + return 1; + } + + bvfs_update_path_hierarchy_cache(ua->jcr, ua->db, ua->argv[pos]); + bvfs_update_fv_cache(ua->jcr, ua->db, ua->argv[pos]); + + ua->info_msg("OK\n"); + + return true; +} + static bool dot_bvfs_clear_cache(UAContext *ua, const char *cmd) { if (!open_client_db(ua)) { @@ -366,6 +408,25 @@ static bool bvfs_parse_arg(UAContext *ua, } } + if (strcasecmp(ua->argk[i], NT_("ujobid")) == 0) { + JOB_DBR jr; + memset(&jr, 0, sizeof(jr)); + bstrncpy(jr.Job, ua->argv[i], sizeof(jr.Job)); + if (!open_new_client_db(ua)) { + return false; + } + if (!db_get_job_record(ua->jcr, ua->db, &jr)) { + return false; + } + if (!acl_access_ok(ua, Job_ACL, jr.Name)) { + return false; + } + /* Store the jobid after the ua->cmd, a bit kluggy */ + int len = strlen(ua->cmd); + ua->cmd = check_pool_memory_size(ua->cmd, len + 1 + 50); + *jobid = edit_uint64(jr.JobId, ua->cmd + len + 1); + } + if (strcasecmp(ua->argk[i], NT_("limit")) == 0) { if (is_a_number(ua->argv[i])) { *limit = str_to_int64(ua->argv[i]); @@ -428,6 +489,7 @@ static bool dot_bvfs_restore(UAContext *ua, const char *cmd) } Bvfs fs(ua->jcr, ua->db); + bvfs_set_acl(ua, &fs); fs.set_username(username); fs.set_jobids(jobid); @@ -488,6 +550,7 @@ static bool dot_bvfs_get_volumes(UAContext *ua, const char *cmd) } Bvfs fs(ua->jcr, ua->db); + bvfs_set_acl(ua, &fs); fs.set_username(username); fs.set_handler(bvfs_result_handler, ua); fs.set_limit(limit); @@ -532,6 +595,7 @@ static bool dot_bvfs_lsfiles(UAContext *ua, const char *cmd) } Bvfs fs(ua->jcr, ua->db); + bvfs_set_acl(ua, &fs); fs.set_username(username); fs.set_jobids(jobid); fs.set_handler(bvfs_result_handler, ua); @@ -563,8 +627,11 @@ static bool dot_bvfs_lsfiles(UAContext *ua, const char *cmd) static bool dot_bvfs_lsdirs(UAContext *ua, const char *cmd) { DBId_t pathid=0; - int limit=2000, offset=0; + int limit=2000, offset=0; char *path=NULL, *jobid=NULL, *username=NULL; + char *pattern=NULL; + int dironly; + int i; if (!bvfs_parse_arg(ua, &pathid, &path, &jobid, &username, &limit, &offset)) @@ -573,16 +640,27 @@ static bool dot_bvfs_lsdirs(UAContext *ua, const char *cmd) return true; /* not enough param */ } + if ((i = find_arg_with_value(ua, "pattern")) >= 0) { + pattern = ua->argv[i]; + } + + dironly = find_arg(ua, "dironly"); + if (!open_new_client_db(ua)) { return 1; } Bvfs fs(ua->jcr, ua->db); + bvfs_set_acl(ua, &fs); fs.set_username(username); fs.set_jobids(jobid); fs.set_limit(limit); fs.set_handler(bvfs_result_handler, ua); + if (pattern) { + fs.set_pattern(pattern); + } + if (pathid) { fs.ch_dir(pathid); } else { @@ -592,13 +670,15 @@ static bool dot_bvfs_lsdirs(UAContext *ua, const char *cmd) fs.set_offset(offset); fs.ls_special_dirs(); - fs.ls_dirs(); + if (dironly < 0) { + fs.ls_dirs(); + } return true; } /* - * .bvfs_versions fnid=10 pathid=10 copies versions + * .bvfs_versions fnid=10 pathid=10 client=xxx copies versions * */ static bool dot_bvfs_versions(UAContext *ua, const char *cmd) @@ -626,6 +706,7 @@ static bool dot_bvfs_versions(UAContext *ua, const char *cmd) } Bvfs fs(ua->jcr, ua->db); + bvfs_set_acl(ua, &fs); fs.set_limit(limit); fs.set_see_all_versions(versions); fs.set_see_copies(copies); @@ -667,6 +748,7 @@ static bool dot_bvfs_get_jobids(UAContext *ua, const char *cmd) } Bvfs fs(ua->jcr, ua->db); + bvfs_set_acl(ua, &fs); if ((pos = find_arg_with_value(ua, "username")) >= 0) { fs.set_username(ua->argv[pos]); @@ -791,7 +873,7 @@ static bool dot_bvfs_get_jobids(UAContext *ua, const char *cmd) /* Foreach different FileSet, we build a restore jobid list */ for (int i=0; i < ids.num_ids; i++) { jr.FileSetId = ids.DBId[i]; - if (!db_accurate_get_jobids(ua->jcr, ua->db, &jr, &tempids)) { + if (!db_get_accurate_jobids(ua->jcr, ua->db, &jr, &tempids)) { return true; } jobids.add(tempids); @@ -802,6 +884,55 @@ static bool dot_bvfs_get_jobids(UAContext *ua, const char *cmd) return true; } +static int jobs_handler(void *ctx, int num_field, char **row) +{ + UAContext *ua = (UAContext *)ctx; + ua->send_msg("%s %s %s\n", row[0], row[1], row[2]); + return 0; +} + +/* .bvfs_get_jobs client=xxx [fileset=yyyy] + * 1 yyyyy Backup1_xxx_xxx_xxxx_xxx + * 2 yyyyy Backup1_xxx_xxx_xxxx_xxx + */ +static bool dot_bvfs_get_jobs(UAContext *ua, const char *cmd) +{ + int pos, posj; + POOL_MEM tmp; + char esc_cli[MAX_ESCAPE_NAME_LENGTH]; + char esc_job[MAX_ESCAPE_NAME_LENGTH]; + if (!open_new_client_db(ua)) { + return true; + } + + if ((pos = find_arg_with_value(ua, "client")) < 0) { + return true; + } + + posj = find_arg_with_value(ua, "ujobid"); + + if (!acl_access_ok(ua, Client_ACL, ua->argv[pos])) { + return true; + } + + db_lock(ua->db); + db_escape_string(ua->jcr, ua->db, esc_cli, ua->argv[pos], sizeof(esc_cli)); + if (posj >= 0) { + db_escape_string(ua->jcr, ua->db, esc_job, ua->argv[posj], sizeof(esc_job)); + Mmsg(tmp, "AND Job.Job = '%s'", esc_job); + } + Mmsg(ua->db->cmd, + "SELECT JobId, JobTDate, Job " + "FROM Job JOIN Client USING (ClientId) " + "WHERE Client.Name = '%s' AND Job.Type = 'B' AND Job.JobStatus IN ('T', 'W') " + "%s " + "ORDER By JobTDate DESC", + esc_cli, tmp.c_str()); + db_sql_query(ua->db, ua->db->cmd, jobs_handler, ua); + db_unlock(ua->db); + return true; +} + static bool dot_quit_cmd(UAContext *ua, const char *cmd) { quit_cmd(ua, cmd); @@ -1204,6 +1335,15 @@ static bool typescmd(UAContext *ua, const char *cmd) return true; } +static bool tagscmd(UAContext *ua, const char *cmd) +{ + uint32_t i = 0; + for (const char *p = debug_get_tag(i++, NULL) ; p ; p = debug_get_tag(i++, NULL)) { + ua->send_msg("%s\n", p); + } + return true; +} + /* * If this command is called, it tells the director that we * are a program that wants a sort of API, and hence, @@ -1324,8 +1464,8 @@ static bool mediatypescmd(UAContext *ua, const char *cmd) return true; } if (!db_sql_query(ua->db, - "SELECT DISTINCT MediaType FROM MediaType ORDER BY MediaType", - one_handler, (void *)ua)) + "SELECT DISTINCT MediaType FROM MediaType ORDER BY MediaType", + one_handler, (void *)ua)) { ua->error_msg(_("List MediaType failed: ERR=%s\n"), db_strerror(ua->db)); } @@ -1338,8 +1478,8 @@ static bool mediacmd(UAContext *ua, const char *cmd) return true; } if (!db_sql_query(ua->db, - "SELECT DISTINCT Media.VolumeName FROM Media ORDER BY VolumeName", - one_handler, (void *)ua)) + "SELECT DISTINCT Media.VolumeName FROM Media ORDER BY VolumeName", + one_handler, (void *)ua)) { ua->error_msg(_("List Media failed: ERR=%s\n"), db_strerror(ua->db)); } @@ -1352,8 +1492,8 @@ static bool locationscmd(UAContext *ua, const char *cmd) return true; } if (!db_sql_query(ua->db, - "SELECT DISTINCT Location FROM Location ORDER BY Location", - one_handler, (void *)ua)) + "SELECT DISTINCT Location FROM Location ORDER BY Location", + one_handler, (void *)ua)) { ua->error_msg(_("List Location failed: ERR=%s\n"), db_strerror(ua->db)); } @@ -1406,22 +1546,17 @@ static bool volstatuscmd(UAContext *ua, const char *cmd) */ static bool defaultscmd(UAContext *ua, const char *cmd) { - JOB *job; - CLIENT *client; - STORE *storage; - POOL *pool; char ed1[50]; - if (ua->argc != 2 || !ua->argv[1]) { return true; } - /* Job defaults */ + /* Send Job defaults */ if (strcmp(ua->argk[1], "job") == 0) { if (!acl_access_ok(ua, Job_ACL, ua->argv[1])) { return true; } - job = (JOB *)GetResWithName(R_JOB, ua->argv[1]); + JOB *job = (JOB *)GetResWithName(R_JOB, ua->argv[1]); if (job) { USTORE store; ua->send_msg("job=%s", job->name()); @@ -1438,28 +1573,38 @@ static bool defaultscmd(UAContext *ua, const char *cmd) ua->send_msg("catalog=%s", job->client?job->client->catalog->name():_("*None*")); } } - /* Client defaults */ - else if (strcmp(ua->argk[1], "client") == 0) { - if (!acl_access_ok(ua, Client_ACL, ua->argv[1])) { + /* Send Pool defaults */ + else if (strcmp(ua->argk[1], "pool") == 0) { + if (!acl_access_ok(ua, Pool_ACL, ua->argv[1])) { return true; } - client = (CLIENT *)GetResWithName(R_CLIENT, ua->argv[1]); - if (client) { - ua->send_msg("client=%s", client->name()); - ua->send_msg("address=%s", client->address); - ua->send_msg("fdport=%d", client->FDport); - ua->send_msg("file_retention=%s", edit_uint64(client->FileRetention, ed1)); - ua->send_msg("job_retention=%s", edit_uint64(client->JobRetention, ed1)); - ua->send_msg("autoprune=%d", client->AutoPrune); - ua->send_msg("catalog=%s", client->catalog->name()); + POOL *pool = (POOL *)GetResWithName(R_POOL, ua->argv[1]); + if (pool) { + ua->send_msg("pool=%s", pool->name()); + ua->send_msg("pool_type=%s", pool->pool_type); + ua->send_msg("label_format=%s", pool->label_format?pool->label_format:""); + ua->send_msg("use_volume_once=%d", pool->use_volume_once); + ua->send_msg("purge_oldest_volume=%d", pool->purge_oldest_volume); + ua->send_msg("recycle_oldest_volume=%d", pool->recycle_oldest_volume); + ua->send_msg("recycle_current_volume=%d", pool->recycle_current_volume); + ua->send_msg("max_volumes=%d", pool->max_volumes); + ua->send_msg("vol_retention=%s", edit_uint64(pool->VolRetention, ed1)); + ua->send_msg("vol_use_duration=%s", edit_uint64(pool->VolUseDuration, ed1)); + ua->send_msg("max_vol_jobs=%d", pool->MaxVolJobs); + ua->send_msg("max_vol_files=%d", pool->MaxVolFiles); + ua->send_msg("max_vol_bytes=%s", edit_uint64(pool->MaxVolBytes, ed1)); + ua->send_msg("auto_prune=%d", pool->AutoPrune); + ua->send_msg("recycle=%d", pool->Recycle); + ua->send_msg("file_retention=%s", edit_uint64(pool->FileRetention, ed1)); + ua->send_msg("job_retention=%s", edit_uint64(pool->JobRetention, ed1)); } - } - /* Storage defaults */ + } + /* Send Storage defaults */ else if (strcmp(ua->argk[1], "storage") == 0) { if (!acl_access_ok(ua, Storage_ACL, ua->argv[1])) { return true; } - storage = (STORE *)GetResWithName(R_STORAGE, ua->argv[1]); + STORE *storage = (STORE *)GetResWithName(R_STORAGE, ua->argv[1]); DEVICE *device; if (storage) { ua->send_msg("storage=%s", storage->name()); @@ -1475,31 +1620,21 @@ static bool defaultscmd(UAContext *ua, const char *cmd) } } } - } - /* Pool defaults */ - else if (strcmp(ua->argk[1], "pool") == 0) { - if (!acl_access_ok(ua, Pool_ACL, ua->argv[1])) { + } + /* Send Client defaults */ + else if (strcmp(ua->argk[1], "client") == 0) { + if (!acl_access_ok(ua, Client_ACL, ua->argv[1])) { return true; } - pool = (POOL *)GetResWithName(R_POOL, ua->argv[1]); - if (pool) { - ua->send_msg("pool=%s", pool->name()); - ua->send_msg("pool_type=%s", pool->pool_type); - ua->send_msg("label_format=%s", pool->label_format?pool->label_format:""); - ua->send_msg("use_volume_once=%d", pool->use_volume_once); - ua->send_msg("purge_oldest_volume=%d", pool->purge_oldest_volume); - ua->send_msg("recycle_oldest_volume=%d", pool->recycle_oldest_volume); - ua->send_msg("recycle_current_volume=%d", pool->recycle_current_volume); - ua->send_msg("max_volumes=%d", pool->max_volumes); - ua->send_msg("vol_retention=%s", edit_uint64(pool->VolRetention, ed1)); - ua->send_msg("vol_use_duration=%s", edit_uint64(pool->VolUseDuration, ed1)); - ua->send_msg("max_vol_jobs=%d", pool->MaxVolJobs); - ua->send_msg("max_vol_files=%d", pool->MaxVolFiles); - ua->send_msg("max_vol_bytes=%s", edit_uint64(pool->MaxVolBytes, ed1)); - ua->send_msg("auto_prune=%d", pool->AutoPrune); - ua->send_msg("recycle=%d", pool->Recycle); - ua->send_msg("file_retention=%s", edit_uint64(pool->FileRetention, ed1)); - ua->send_msg("job_retention=%s", edit_uint64(pool->JobRetention, ed1)); + CLIENT *client = (CLIENT *)GetResWithName(R_CLIENT, ua->argv[1]); + if (client) { + ua->send_msg("client=%s", client->name()); + ua->send_msg("address=%s", client->address); + ua->send_msg("fdport=%d", client->FDport); + ua->send_msg("file_retention=%s", edit_uint64(client->FileRetention, ed1)); + ua->send_msg("job_retention=%s", edit_uint64(client->JobRetention, ed1)); + ua->send_msg("autoprune=%d", client->AutoPrune); + ua->send_msg("catalog=%s", client->catalog->name()); } } return true; diff --git a/bacula/src/dird/ua_input.c b/bacula/src/dird/ua_input.c index 421a9e6200..7d55aa8502 100644 --- a/bacula/src/dird/ua_input.c +++ b/bacula/src/dird/ua_input.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * diff --git a/bacula/src/dird/ua_label.c b/bacula/src/dird/ua_label.c index 012f337453..1a78c06317 100644 --- a/bacula/src/dird/ua_label.c +++ b/bacula/src/dird/ua_label.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2003-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -671,8 +675,9 @@ static bool send_label_request(UAContext *ua, MEDIA_DBR *mr, MEDIA_DBR *omr, BSOCK *sd; char dev_name[MAX_NAME_LENGTH]; bool ok = false; - bool is_dvd = false; uint64_t VolBytes = 0; + uint64_t VolABytes = 0; + uint32_t VolType = 0; if (!(sd=open_sd_bsock(ua))) { return false; @@ -702,11 +707,9 @@ static bool send_label_request(UAContext *ua, MEDIA_DBR *mr, MEDIA_DBR *omr, } while (sd->recv() >= 0) { - int dvd; ua->send_msg("%s", sd->msg); - if (sscanf(sd->msg, "3000 OK label. VolBytes=%llu DVD=%d ", &VolBytes, - &dvd) == 2) { - is_dvd = dvd; + if (sscanf(sd->msg, "3000 OK label. VolBytes=%llu VolABytes=%lld VolType=%d ", + &VolBytes, &VolABytes, &VolType) == 3) { ok = true; } } @@ -715,14 +718,11 @@ static bool send_label_request(UAContext *ua, MEDIA_DBR *mr, MEDIA_DBR *omr, unbash_spaces(pr->Name); mr->LabelDate = time(NULL); mr->set_label_date = true; - if (is_dvd) { - /* We know that a freshly labelled DVD has 1 VolParts */ - /* This does not apply to auto-labelled DVDs. */ - mr->VolParts = 1; - } if (ok) { if (media_record_exists) { /* we update it */ mr->VolBytes = VolBytes; + mr->VolABytes = VolABytes; + mr->VolType = VolType; mr->InChanger = mr->Slot > 0; /* if slot give assume in changer */ set_storageid_in_mr(ua->jcr->wstore, mr); if (!db_update_media_record(ua->jcr, ua->db, mr)) { @@ -732,6 +732,8 @@ static bool send_label_request(UAContext *ua, MEDIA_DBR *mr, MEDIA_DBR *omr, } else { /* create the media record */ set_pool_dbr_defaults_in_media_dbr(mr, pr); mr->VolBytes = VolBytes; + mr->VolABytes = VolABytes; + mr->VolType = VolType; mr->InChanger = mr->Slot > 0; /* if slot give assume in changer */ mr->Enabled = 1; set_storageid_in_mr(ua->jcr->wstore, mr); @@ -854,7 +856,7 @@ static vol_list_t *get_vol_list_from_SD(UAContext *ua, bool scan) if (!is_volume_name_legal(ua, p)) { p--; *p = ':'; - ua->error_msg(_("Invalid Volume name: %s\n"), sd->msg); + ua->error_msg(_("Invalid Volume name: %s. Volume skipped.\n"), sd->msg); continue; } } diff --git a/bacula/src/dird/ua_output.c b/bacula/src/dird/ua_output.c index d5106fd1b2..a0b6c9bc21 100644 --- a/bacula/src/dird/ua_output.c +++ b/bacula/src/dird/ua_output.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -19,8 +23,6 @@ * I.e. messages, listing database, showing resources, ... * * Kern Sibbald, September MM - * - * Version $Id$ */ #include "bacula.h" @@ -148,18 +150,20 @@ int show_cmd(UAContext *ua, const char *cmd) LockRes(); for (i=1; iargc; i++) { - if (strcasecmp(ua->argk[i], _("disabled")) == 0) { + if (strcasecmp(ua->argk[i], NT_("disabled")) == 0) { show_disabled_jobs(ua); goto bail_out; } + type = 0; + res_name = ua->argk[i]; if (!ua->argv[i]) { /* was a name given? */ /* No name, dump all resources of specified type */ recurse = 1; len = strlen(res_name); for (j=0; reses[j].res_name; j++) { - if (strncasecmp(res_name, _(reses[j].res_name), len) == 0) { + if (strncasecmp(res_name, reses[j].res_name, len) == 0) { type = reses[j].type; if (type > 0) { res = res_head[type-r_first]; @@ -175,7 +179,7 @@ int show_cmd(UAContext *ua, const char *cmd) recurse = 0; len = strlen(res_name); for (j=0; reses[j].res_name; j++) { - if (strncasecmp(res_name, _(reses[j].res_name), len) == 0) { + if (strncasecmp(res_name, reses[j].res_name, len) == 0) { type = reses[j].type; res = (RES *)GetResWithName(type, ua->argv[i]); if (!res) { @@ -187,7 +191,8 @@ int show_cmd(UAContext *ua, const char *cmd) } switch (type) { - case -1: /* all */ + /* All resources */ + case -1: for (j=r_first; j<=r_last; j++) { /* Skip R_DEVICE since it is really not used or updated */ if (j != R_DEVICE) { @@ -195,18 +200,22 @@ int show_cmd(UAContext *ua, const char *cmd) } } break; + /* Help */ case -2: ua->send_msg(_("Keywords for the show command are:\n")); for (j=0; reses[j].res_name; j++) { - ua->error_msg("%s\n", _(reses[j].res_name)); + ua->error_msg("%s\n", reses[j].res_name); } goto bail_out; + /* Resource not found */ case -3: ua->error_msg(_("%s resource %s not found.\n"), res_name, ua->argv[i]); goto bail_out; + /* Resource not found */ case 0: ua->error_msg(_("Resource %s not found\n"), res_name); goto bail_out; + /* Dump a specific type */ default: dump_resource(recurse?type:-type, res, bsendmsg, ua); break; @@ -217,8 +226,72 @@ bail_out: return 1; } +/* + * Check if the access is permitted for a list of jobids + * + * Not in ua_acl.c because it's using db access, and tools such + * as bdirjson are not linked with cats. + */ +bool acl_access_jobid_ok(UAContext *ua, const char *jobids) +{ + char *tmp=NULL, *p; + bool ret=false; + JOB_DBR jr; + uint32_t jid; + + if (!jobids) { + return false; + } + + if (!is_a_number_list(jobids)) { + return false; + } + + /* If no console resource => default console and all is permitted */ + if (!ua || !ua->cons) { + Dmsg0(1400, "Root cons access OK.\n"); + return true; /* No cons resource -> root console OK for everything */ + } + + alist *list = ua->cons->ACL_lists[Job_ACL]; + if (!list) { /* empty list */ + return false; /* List empty, reject everything */ + } + + /* Special case *all* gives full access */ + if (list->size() == 1 && strcasecmp("*all*", (char *)list->get(0)) == 0) { + return true; + } + + /* If we can't open the database, just say no */ + if (!open_new_client_db(ua)) { + return false; + } + + p = tmp = bstrdup(jobids); + while (get_next_jobid_from_list(&p, &jid) > 0) { + memset(&jr, 0, sizeof(jr)); + jr.JobId = jid; + if (db_get_job_record(ua->jcr, ua->db, &jr)) { + for (int i=0; isize(); i++) { + if (strcasecmp(jr.Name, (char *)list->get(i)) == 0) { + Dmsg3(1400, "ACL found %s in %d %s\n", jr.Name, + Job_ACL, (char *)list->get(i)); + ret = true; + goto bail_out; + } + } + } + } + +bail_out: + if (tmp) { + free(tmp); + } + return ret; +} /* * List contents of database @@ -266,7 +339,7 @@ static int do_list_cmd(UAContext *ua, const char *cmd, e_list_type llist) POOL_DBR pr; MEDIA_DBR mr; - if (!open_client_db(ua)) + if (!open_new_client_db(ua)) return 1; memset(&jr, 0, sizeof(jr)); @@ -413,7 +486,6 @@ static int do_list_cmd(UAContext *ua, const char *cmd, e_list_type llist) } else if (strcasecmp(ua->argk[i], NT_("clients")) == 0) { db_list_client_records(ua->jcr, ua->db, prtit, ua, llist); - /* List MEDIA or VOLUMES */ } else if (strcasecmp(ua->argk[i], NT_("media")) == 0 || strcasecmp(ua->argk[i], NT_("volume")) == 0 || @@ -442,7 +514,7 @@ static int do_list_cmd(UAContext *ua, const char *cmd, e_list_type llist) int num_pools; uint32_t *ids; /* List a specific volume? */ - if (ua->argv[i]) { + if (ua->argv[i] && *ua->argv[i]) { bstrncpy(mr.VolumeName, ua->argv[i], sizeof(mr.VolumeName)); db_list_media_records(ua->jcr, ua->db, &mr, prtit, ua, llist); return 1; @@ -509,6 +581,12 @@ static int do_list_cmd(UAContext *ua, const char *cmd, e_list_type llist) } else if (strcasecmp(ua->argk[i], NT_("limit")) == 0 || strcasecmp(ua->argk[i], NT_("days")) == 0) { /* Ignore it */ + } else if (strcasecmp(ua->argk[i], NT_("snapshot")) == 0 || + strcasecmp(ua->argk[i], NT_("snapshots")) == 0) + { + snapshot_list(ua, i, prtit, llist); + return 1; + } else { ua->error_msg(_("Unknown list keyword: %s\n"), NPRT(ua->argk[i])); } @@ -573,10 +651,8 @@ static bool list_nextvol(UAContext *ua, int ndays) } get_out: - if (jcr->db) { - db_close_database(jcr, jcr->db); - jcr->db = NULL; - } + if (jcr->db) db_close_database(jcr, jcr->db); + jcr->db = NULL; free_jcr(jcr); if (!found) { ua->error_msg(_("Could not find next Volume for Job %s.\n"), @@ -602,7 +678,8 @@ RUN *find_next_run(RUN *run, JOB *job, utime_t &runtime, int ndays) bool is_scheduled; sched = job->schedule; - if (sched == NULL) { /* scheduled? */ + if (!sched || !job->enabled || (sched && !sched->enabled) || + (job->client && !job->client->enabled)) { return NULL; /* no nothing to report */ } @@ -705,11 +782,11 @@ bool complete_jcr_for_job(JCR *jcr, JOB *job, POOL *pool) Dmsg0(100, "complete_jcr open db\n"); jcr->db = db_init_database(jcr, jcr->catalog->db_driver, jcr->catalog->db_name, - jcr->catalog->db_user, - jcr->catalog->db_password, jcr->catalog->db_address, - jcr->catalog->db_port, jcr->catalog->db_socket, - jcr->catalog->mult_db_connections, - jcr->catalog->disable_batch_insert); + jcr->catalog->db_user, + jcr->catalog->db_password, jcr->catalog->db_address, + jcr->catalog->db_port, jcr->catalog->db_socket, + jcr->catalog->mult_db_connections, + jcr->catalog->disable_batch_insert); if (!jcr->db || !db_open_database(jcr, jcr->db)) { Jmsg(jcr, M_FATAL, 0, _("Could not open database \"%s\".\n"), jcr->catalog->db_name); @@ -800,7 +877,7 @@ void prtit(void *ctx, const char *msg) { UAContext *ua = (UAContext *)ctx; - ua->UA_sock->fsend("%s", msg); + if (ua) ua->send_msg("%s", msg); } /* diff --git a/bacula/src/dird/ua_prune.c b/bacula/src/dird/ua_prune.c index 9a86f243a3..f83b8310fe 100644 --- a/bacula/src/dird/ua_prune.c +++ b/bacula/src/dird/ua_prune.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -103,6 +107,7 @@ int prunecmd(UAContext *ua, const char *cmd) NT_("Jobs"), NT_("Volume"), NT_("Stats"), + NT_("Snapshots"), NULL}; if (!open_new_client_db(ua)) { @@ -111,7 +116,7 @@ int prunecmd(UAContext *ua, const char *cmd) /* First search args */ kw = find_arg_keyword(ua, keywords); - if (kw < 0 || kw > 3) { + if (kw < 0 || kw > 4) { /* no args, so ask user */ kw = do_keyword_prompt(ua, _("Choose item to prune"), keywords); } @@ -189,6 +194,9 @@ int prunecmd(UAContext *ua, const char *cmd) } prune_stats(ua, retention); return true; + case 4: /* prune snapshots */ + prune_snapshot(ua); + return true; default: break; } @@ -237,7 +245,7 @@ bool prune_set_filter(UAContext *ua, CLIENT *client, POOL *pool, utime_t period, db_lock(ua->db); if (client) { db_escape_string(ua->jcr, ua->db, ed2, - client->name(), strlen(client->name())); + client->name(), strlen(client->name())); Mmsg(tmp, " AND Client.Name = '%s' ", ed2); pm_strcat(*add_where, tmp.c_str()); pm_strcat(*add_from, " JOIN Client USING (ClientId) "); @@ -245,7 +253,7 @@ bool prune_set_filter(UAContext *ua, CLIENT *client, POOL *pool, utime_t period, if (pool) { db_escape_string(ua->jcr, ua->db, ed2, - pool->name(), strlen(pool->name())); + pool->name(), strlen(pool->name())); Mmsg(tmp, " AND Pool.Name = '%s' ", ed2); pm_strcat(*add_where, tmp.c_str()); /* Use ON() instead of USING for some old SQLite */ @@ -360,7 +368,7 @@ static void drop_temp_tables(UAContext *ua) static bool create_temp_tables(UAContext *ua) { /* Create temp tables and indicies */ - if (!db_sql_query(ua->db, create_deltabs[db_get_type_index(ua->db)], NULL, (void *)NULL)) { + if (!db_sql_query(ua->db, create_deltabs[ua->db->bdb_get_type_index()], NULL, (void *)NULL)) { ua->error_msg("%s", db_strerror(ua->db)); Dmsg0(100, "create DelTables table failed\n"); return false; @@ -543,7 +551,7 @@ int prune_jobs(UAContext *ua, CLIENT *client, POOL *pool, int JobType) foreach_alist(elt, jobids_check) { jr.ClientId = elt->ClientId; /* should be always the same */ jr.FileSetId = elt->FileSetId; - db_accurate_get_jobids(ua->jcr, ua->db, &jr, &tempids); + db_get_accurate_jobids(ua->jcr, ua->db, &jr, &tempids); jobids.add(tempids); } @@ -647,7 +655,7 @@ static bool prune_expired_volumes(UAContext *ua) if ((i = find_arg_with_value(ua, "mediatype")) >= 0) { char ed1[MAX_ESCAPE_NAME_LENGTH]; db_escape_string(ua->jcr, ua->db, ed1, - ua->argv[i], strlen(ua->argv[i])); + ua->argv[i], strlen(ua->argv[i])); Mmsg(query, " AND MediaType = '%s' ", ed1); pm_strcat(filter, query.c_str()); } @@ -665,7 +673,7 @@ static bool prune_expired_volumes(UAContext *ua) lst = New(alist(5, owned_by_alist)); - Mmsg(query, expired_volumes[db_get_type_index(ua->db)], filter.c_str()); + Mmsg(query, expired_volumes[db_get_type_index(ua->db)], filter.c_str()); db_sql_query(ua->db, query.c_str(), db_string_list_handler, &lst); foreach_alist(val, lst) { @@ -673,7 +681,9 @@ static bool prune_expired_volumes(UAContext *ua) bstrncpy(mr.VolumeName, val, sizeof(mr.VolumeName)); db_get_media_record(ua->jcr, ua->db, &mr); Mmsg(query, _("Volume \"%s\""), val); + Dmsg1(100, "Do prune %s\n", query.c_str()); if (confirm_retention(ua, &mr.VolRetention, query.c_str())) { + Dmsg1(100, "Call Prune %s\n", query.c_str()); prune_volume(ua, &mr); } } @@ -715,9 +725,15 @@ bool prune_volume(UAContext *ua, MEDIA_DBR *mr) count = get_prune_list_for_volume(ua, mr, &del); Dmsg1(100, "Num pruned = %d\n", count); if (count != 0) { + ua->info_msg(_("Found %d Job(s) associated with the Volume \"%s\" that will be pruned\n"), + count, mr->VolumeName); purge_job_list_from_catalog(ua, del); + + } else { + ua->info_msg(_("Found no Job associated with the Volume \"%s\" to prune\n"), + mr->VolumeName); } - ok = is_volume_purged(ua, mr); + ok = is_volume_purged(ua, mr, false); } db_unlock(ua->db); @@ -749,7 +765,7 @@ int get_prune_list_for_volume(UAContext *ua, MEDIA_DBR *mr, del_ctx *del) now = (utime_t)time(NULL); edit_int64(now-period, ed2); Mmsg(query, sel_JobMedia, ed1, ed2); - Dmsg3(250, "Now=%d period=%d now-period=%s\n", (int)now, (int)period, + Dmsg3(200, "Now=%d period=%d now-period=%s\n", (int)now, (int)period, ed2); Dmsg1(100, "Query=%s\n", query.c_str()); diff --git a/bacula/src/dird/ua_purge.c b/bacula/src/dird/ua_purge.c index 7d87c80d42..2507c576ee 100644 --- a/bacula/src/dird/ua_purge.c +++ b/bacula/src/dird/ua_purge.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -384,11 +388,11 @@ void purge_files_from_job_list(UAContext *ua, del_ctx &del) void upgrade_copies(UAContext *ua, char *jobs) { POOL_MEM query(PM_MESSAGE); + int dbtype = ua->db->bdb_get_type_index(); db_lock(ua->db); - - /* Do it in two times for mysql */ - Mmsg(query, uap_upgrade_copies_oldest_job[db_get_type_index(ua->db)], JT_JOB_COPY, jobs, jobs); + + Mmsg(query, uap_upgrade_copies_oldest_job[dbtype], JT_JOB_COPY, jobs, jobs); db_sql_query(ua->db, query.c_str(), NULL, (void *)NULL); Dmsg1(050, "Upgrade copies Log sql=%s\n", query.c_str()); @@ -426,6 +430,12 @@ void purge_jobs_from_catalog(UAContext *ua, char *jobs) db_sql_query(ua->db, query.c_str(), NULL, (void *)NULL); Dmsg1(050, "Delete RestoreObject sql=%s\n", query.c_str()); + /* The JobId of the Snapshot record is no longer usable + * TODO: Migth want to use a copy for the jobid? + */ + Mmsg(query, "UPDATE Snapshot SET JobId=0 WHERE JobId IN (%s)", jobs); + db_sql_query(ua->db, query.c_str(), NULL, (void *)NULL); + upgrade_copies(ua, jobs); /* Now remove the Job record itself */ @@ -554,9 +564,10 @@ static void do_truncate_on_purge(UAContext *ua, MEDIA_DBR *mr, char *pool, char *storage, int drive, BSOCK *sd) { - int dvd; - bool ok=false; + bool ok = false; uint64_t VolBytes = 0; + uint64_t VolABytes = 0; + uint32_t VolType = 0; /* TODO: Return if not mr->Recyle ? */ if (!mr->Recycle) { @@ -593,13 +604,16 @@ static void do_truncate_on_purge(UAContext *ua, MEDIA_DBR *mr, /* Send relabel command, and check for valid response */ while (sd->recv() >= 0) { ua->send_msg("%s", sd->msg); - if (sscanf(sd->msg, "3000 OK label. VolBytes=%llu DVD=%d ", &VolBytes, &dvd) == 2) { + if (sscanf(sd->msg, "3000 OK label. VolBytes=%llu VolABytes=%lld VolType=%d ", + &VolBytes, &VolABytes, &VolType) == 3) { ok = true; } } if (ok) { mr->VolBytes = VolBytes; + mr->VolABytes = VolABytes; + mr->VolType = VolType; mr->VolFiles = 0; set_storageid_in_mr(NULL, mr); if (!db_update_media_record(ua->jcr, ua->db, mr)) { @@ -700,7 +714,7 @@ int truncate_cmd(UAContext *ua, const char *cmd) } if (!nb) { - ua->send_msg(_("No Volumes found to perform %s action.\n"), action); + ua->send_msg(_("No Volumes found to perform \"truncate\" command.\n")); goto bail_out; } @@ -764,8 +778,7 @@ bool mark_media_purged(UAContext *ua, MEDIA_DBR *mr) newpr.PoolId = mr->RecyclePoolId; oldpr.PoolId = mr->PoolId; if ( db_get_pool_numvols(jcr, ua->db, &oldpr) - && db_get_pool_numvols(jcr, ua->db, &newpr)) - { + && db_get_pool_numvols(jcr, ua->db, &newpr)) { /* check if destination pool size is ok */ if (newpr.MaxVols > 0 && newpr.NumVols >= newpr.MaxVols) { ua->error_msg(_("Unable move recycled Volume in full " diff --git a/bacula/src/dird/ua_query.c b/bacula/src/dird/ua_query.c index f1aa8ab27a..1f8449c5be 100644 --- a/bacula/src/dird/ua_query.c +++ b/bacula/src/dird/ua_query.c @@ -7,19 +7,23 @@ * Version $Id$ */ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ #include "bacula.h" diff --git a/bacula/src/dird/ua_restore.c b/bacula/src/dird/ua_restore.c index 4a629d97dd..2fe9c40677 100644 --- a/bacula/src/dird/ua_restore.c +++ b/bacula/src/dird/ua_restore.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -42,7 +46,6 @@ static int fileset_handler(void *ctx, int num_fields, char **row); static void free_name_list(NAME_LIST *name_list); static bool select_backups_before_date(UAContext *ua, RESTORE_CTX *rx, char *date); static bool build_directory_tree(UAContext *ua, RESTORE_CTX *rx); -static void free_rx(RESTORE_CTX *rx); static void split_path_and_filename(UAContext *ua, RESTORE_CTX *rx, char *fname); static int jobid_fileindex_handler(void *ctx, int num_fields, char **row); static bool insert_file_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *file, @@ -54,9 +57,34 @@ static int get_client_name(UAContext *ua, RESTORE_CTX *rx); static int get_restore_client_name(UAContext *ua, RESTORE_CTX &rx); static bool get_date(UAContext *ua, char *date, int date_len); static int restore_count_handler(void *ctx, int num_fields, char **row); -static bool insert_table_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *table); static void get_and_display_basejobs(UAContext *ua, RESTORE_CTX *rx); +void new_rx(RESTORE_CTX *rx) +{ + RBSR *bsr = NULL; + memset(rx, 0, sizeof(*rx)); + rx->path = get_pool_memory(PM_FNAME); + rx->path[0] = 0; + + rx->fname = get_pool_memory(PM_FNAME); + rx->fname[0] = 0; + + rx->JobIds = get_pool_memory(PM_FNAME); + rx->JobIds[0] = 0; + + rx->component_fname = get_pool_memory(PM_FNAME); + rx->component_fname[0] = 0; + + rx->BaseJobIds = get_pool_memory(PM_FNAME); + rx->BaseJobIds[0] = 0; + + rx->query = get_pool_memory(PM_FNAME); + rx->query[0] = 0; + + rx->bsr = new_bsr(); + rx->hardlinks_in_mem = true; +} + /* * Restore files * @@ -73,25 +101,8 @@ int restore_cmd(UAContext *ua, const char *cmd) char *strip_prefix, *add_prefix, *add_suffix, *regexp; strip_prefix = add_prefix = add_suffix = regexp = NULL; - memset(&rx, 0, sizeof(rx)); - rx.path = get_pool_memory(PM_FNAME); - rx.path[0] = 0; - - rx.fname = get_pool_memory(PM_FNAME); - rx.fname[0] = 0; - - rx.JobIds = get_pool_memory(PM_FNAME); - rx.JobIds[0] = 0; - - rx.BaseJobIds = get_pool_memory(PM_FNAME); - rx.BaseJobIds[0] = 0; - - rx.query = get_pool_memory(PM_FNAME); - rx.query[0] = 0; - - rx.bsr = new_bsr(); - rx.hardlinks_in_mem = true; - + new_rx(&rx); /* Initialize RESTORE_CTX */ + if (!open_new_client_db(ua)) { goto bail_out; } @@ -204,6 +215,8 @@ int restore_cmd(UAContext *ua, const char *cmd) ua->warning_msg(_("No files selected to be restored.\n")); goto bail_out; } + + ua->send_msg(_("Bootstrap records written to %s\n"), ua->jcr->RestoreBootstrap); display_bsr_info(ua, rx); /* display vols needed, etc */ if (rx.selected_files==1) { @@ -289,7 +302,7 @@ int restore_cmd(UAContext *ua, const char *cmd) } Dmsg1(200, "Submitting: %s\n", ua->cmd); /* - * Transfer jobids, to jcr to + * Transfer jobids, component stuff to jcr to * pass to run_cmd(). Note, these are fields and * other things that are not passed on the command * line. @@ -297,6 +310,10 @@ int restore_cmd(UAContext *ua, const char *cmd) /* ***FIXME*** pass jobids on command line */ jcr->JobIds = rx.JobIds; rx.JobIds = NULL; + jcr->component_fname = rx.component_fname; + rx.component_fname = NULL; + jcr->component_fd = rx.component_fd; + rx.component_fd = NULL; parse_ua_args(ua); run_cmd(ua, ua->cmd); free_rx(&rx); @@ -342,7 +359,7 @@ static void get_and_display_basejobs(UAContext *ua, RESTORE_CTX *rx) pm_strcpy(rx->BaseJobIds, jobids.list); } -static void free_rx(RESTORE_CTX *rx) +void free_rx(RESTORE_CTX *rx) { free_bsr(rx->bsr); rx->bsr = NULL; @@ -351,6 +368,14 @@ static void free_rx(RESTORE_CTX *rx) free_and_null_pool_memory(rx->fname); free_and_null_pool_memory(rx->path); free_and_null_pool_memory(rx->query); + if (rx->component_fd) { + fclose(rx->component_fd); + rx->component_fd = NULL; + } + if (rx->component_fname) { + unlink(rx->component_fname); + } + free_and_null_pool_memory(rx->component_fname); free_name_list(&rx->name_list); } @@ -791,7 +816,7 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx) ua->send_msg(_("Selecting jobs to build the Full state at %s\n"), jr.cStartTime); jr.JobLevel = L_INCREMENTAL; /* Take Full+Diff+Incr */ - if (!db_accurate_get_jobids(ua->jcr, ua->db, &jr, &jobids)) { + if (!db_get_accurate_jobids(ua->jcr, ua->db, &jr, &jobids)) { return 0; } pm_strcpy(rx->JobIds, jobids.list); @@ -986,7 +1011,7 @@ static bool insert_dir_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *di /* * Get the JobId and FileIndexes of all files in the specified table */ -static bool insert_table_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *table) +bool insert_table_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *table) { strip_trailing_junk(table); Mmsg(rx->query, uar_jobid_fileindex_from_table, table); @@ -1106,6 +1131,43 @@ static void add_delta_list_findex(RESTORE_CTX *rx, struct delta_list *lst) add_findex(rx->bsr, lst->JobId, lst->FileIndex); } +/* + * This is a list of all the files (components) that the + * user has requested for restore. It is requested by + * the plugin (for now hard coded only for VSS). + * In the future, this will be requested by a RestoreObject + * and the plugin name will be sent to the FD. + */ +static bool write_component_file(UAContext *ua, RESTORE_CTX *rx, char *fname) +{ + int fd; + if (!rx->component_fd) { + Mmsg(rx->component_fname, "%s/%s.restore.sel.XXXXXX", working_directory, my_name); + fd = mkstemp(rx->component_fname); + if (fd < 0) { + berrno be; + ua->error_msg(_("Unable to create component file %s. ERR=%s\n"), + rx->component_fname, be.bstrerror()); + return false; + } + rx->component_fd = fdopen(fd, "w+"); + if (!rx->component_fd) { + berrno be; + ua->error_msg(_("Unable to fdopen component file %s. ERR=%s\n"), + rx->component_fname, be.bstrerror()); + return false; + } + } + fprintf(rx->component_fd, "%s\n", fname); + if (ferror(rx->component_fd)) { + ua->error_msg(_("Error writing component file.\n")); + fclose(rx->component_fd); + unlink(rx->component_fname); + rx->component_fd = NULL; + return false; + } + return true; +} static bool build_directory_tree(UAContext *ua, RESTORE_CTX *rx) { @@ -1230,6 +1292,7 @@ static bool build_directory_tree(UAContext *ua, RESTORE_CTX *rx) * extracted making a bootstrap file. */ if (OK) { + char cwd[2000]; for (TREE_NODE *node=first_tree_node(tree.root); node; node=next_tree_node(node)) { Dmsg2(400, "FI=%d node=0x%x\n", node->FileIndex, node); if (node->extract || node->extract_dir) { @@ -1237,6 +1300,18 @@ static bool build_directory_tree(UAContext *ua, RESTORE_CTX *rx) /* TODO: optimize bsr insertion when jobid are non sorted */ add_delta_list_findex(rx, node->delta_list); add_findex(rx->bsr, node->JobId, node->FileIndex); + /* + * Special VSS plugin code to return selected + * components. For the moment, it is hard coded + * for the VSS plugin. + */ + if (fnmatch(":component_info_*", node->fname, 0) == 0) { + tree_getpath(node, cwd, sizeof(cwd)); + if (!write_component_file(ua, rx, cwd)) { + OK = false; + break; + } + } if (node->extract && node->type != TN_NEWDIR) { rx->selected_files++; /* count only saved files */ } @@ -1265,8 +1340,8 @@ static bool select_backups_before_date(UAContext *ua, RESTORE_CTX *rx, char *dat int i; /* Create temp tables */ - db_sql_query(ua->db, uar_del_temp, NULL, NULL); - db_sql_query(ua->db, uar_del_temp1, NULL, NULL); + db_sql_query(ua->db, uar_del_temp, NULL, NULL); + db_sql_query(ua->db, uar_del_temp1, NULL, NULL); if (!db_sql_query(ua->db, uar_create_temp[db_get_type_index(ua->db)], NULL, NULL)) { ua->error_msg("%s\n", db_strerror(ua->db)); } @@ -1406,8 +1481,8 @@ static bool select_backups_before_date(UAContext *ua, RESTORE_CTX *rx, char *dat } bail_out: - db_sql_query(ua->db, uar_del_temp, NULL, NULL); - db_sql_query(ua->db, uar_del_temp1, NULL, NULL); + db_sql_query(ua->db, uar_del_temp, NULL, NULL); + db_sql_query(ua->db, uar_del_temp1, NULL, NULL); return ok; } @@ -1560,7 +1635,7 @@ void find_storage_resource(UAContext *ua, RESTORE_CTX &rx, char *Storage, char * if (acl_access_ok(ua, Storage_ACL, store->name())) { rx.store = store; Dmsg1(200, "Set store=%s\n", rx.store->name()); - if (Storage == NULL) { + if (Storage == NULL || Storage[0] == 0) { ua->warning_msg(_("Using Storage \"%s\" from MediaType \"%s\".\n"), store->name(), MediaType); } else { diff --git a/bacula/src/dird/ua_run.c b/bacula/src/dird/ua_run.c index 1f593fb2dc..f5756d2f00 100644 --- a/bacula/src/dird/ua_run.c +++ b/bacula/src/dird/ua_run.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -128,6 +132,14 @@ int run_cmd(UAContext *ua, const char *cmd) jcr->JobIds = ua->jcr->JobIds; ua->jcr->JobIds = NULL; } + /* Transfer VSS component info */ + if (ua->jcr->component_fname) { + jcr->component_fname = ua->jcr->component_fname; + ua->jcr->component_fname = NULL; + jcr->component_fd = ua->jcr->component_fd; + ua->jcr->component_fd = NULL; + } + if (!set_run_context_in_jcr(ua, jcr, rc)) { break; /* error get out of while loop */ } @@ -181,7 +193,23 @@ int run_cmd(UAContext *ua, const char *cmd) bail_out: ua->send_msg(_("Job not run.\n")); + if (ua->jcr->component_fd) { + fclose(ua->jcr->component_fd); + ua->jcr->component_fd = NULL; + } + if (ua->jcr->component_fname) { + unlink(ua->jcr->component_fname); + free_and_null_pool_memory(ua->jcr->component_fname); + } if (jcr) { + if (jcr->component_fd) { + fclose(jcr->component_fd); + jcr->component_fd = NULL; + } + if (jcr->component_fname) { + unlink(jcr->component_fname); + free_and_null_pool_memory(jcr->component_fname); + } free_jcr(jcr); } return 0; /* do not run */ @@ -191,8 +219,13 @@ static JobId_t start_job(UAContext *ua, JCR *jcr, run_ctx &rc) { JobId_t JobId; - Dmsg1(100, "Starting JobId=%d\n", rc.jr.JobId); - JobId = run_job(jcr); + if (rc.jr.JobStatus == JS_Incomplete) { + Dmsg1(100, "Ressuming JobId=%d\n", rc.jr.JobId); + JobId = resume_job(jcr, &rc.jr); + } else { + Dmsg1(100, "Starting JobId=%d\n", rc.jr.JobId); + JobId = run_job(jcr); + } Dmsg4(100, "JobId=%u NewJobId=%d pool=%s priority=%d\n", (int)jcr->JobId, JobId, jcr->pool->name(), jcr->JobPriority); free_jcr(jcr); /* release jcr */ @@ -513,7 +546,7 @@ static bool get_jobid_from_list(UAContext *ua, sellist &sl, run_ctx &rc) } /* - * Restart Canceled or Failed + * Restart Canceled, Failed, or Incomplete Jobs * * Returns: 0 on error * JobId if OK @@ -531,6 +564,7 @@ int restart_cmd(UAContext *ua, const char *cmd) int32_t job_status; }; struct s_js kw[] = { + {"Incomplete", JS_Incomplete}, {"Canceled", JS_Canceled}, {"Failed", JS_FatalError}, {"All", 0}, @@ -603,7 +637,6 @@ int restart_cmd(UAContext *ua, const char *cmd) return 0; /* do not run */ } - int modify_job_parameters(UAContext *ua, JCR *jcr, run_ctx &rc) { int i, opt; @@ -653,10 +686,6 @@ int modify_job_parameters(UAContext *ua, JCR *jcr, run_ctx &rc) case 0: /* Level */ select_job_level(ua, jcr); - if (jcr->is_JobType(JT_BACKUP) && !jcr->is_JobLevel(L_VIRTUAL_FULL)) { - apply_pool_overrides(jcr); - rc.pool = jcr->pool; - } goto try_again; case 1: /* Storage */ @@ -725,12 +754,12 @@ int modify_job_parameters(UAContext *ua, JCR *jcr, run_ctx &rc) jcr->getJobType() == JT_MIGRATE || jcr->getJobType() == JT_VERIFY) { /* Pool */ rc.pool = select_pool_resource(ua); - if (rc.pool && rc.pool != jcr->pool) { + if (rc.pool) { jcr->pool = rc.pool; - pm_strcpy(jcr->pool_source, _("User input")); Dmsg1(100, "Set new pool=%s\n", jcr->pool->name()); + goto try_again; } - goto try_again; + break; } /* Bootstrap */ @@ -764,7 +793,6 @@ int modify_job_parameters(UAContext *ua, JCR *jcr, run_ctx &rc) rc.next_pool = select_pool_resource(ua); if (rc.next_pool) { jcr->next_pool = rc.next_pool; - pm_strcpy(jcr->next_pool_source, _("Command input")); goto try_again; } } @@ -818,6 +846,16 @@ int modify_job_parameters(UAContext *ua, JCR *jcr, run_ctx &rc) } goto try_again; case 12: + /* Plugin Options */ + //generate_plugin_event(jcr, bEventJobConfig, &rc); + if (!get_cmd(ua, _("Please Plugin Options string: "))) { + break; + } + if (jcr->plugin_options) { + free(jcr->plugin_options); + jcr->plugin_options = NULL; + } + jcr->plugin_options = bstrdup(ua->cmd); goto try_again; case -1: /* error or cancel */ goto bail_out; @@ -848,8 +886,13 @@ static bool set_run_context_in_jcr(UAContext *ua, JCR *jcr, run_ctx &rc) jcr->previous_job = rc.previous_job; jcr->pool = rc.pool; jcr->next_pool = rc.next_pool; + if (rc.next_pool) { + jcr->cmdline_next_pool_override = true; + } if (rc.pool_name) { pm_strcpy(jcr->pool_source, _("Command input")); + } else if (jcr->pool != jcr->job->pool) { + pm_strcpy(jcr->pool_source, _("User input")); } if (rc.next_pool_name) { pm_strcpy(jcr->next_pool_source, _("Command input")); @@ -859,7 +902,11 @@ static bool set_run_context_in_jcr(UAContext *ua, JCR *jcr, run_ctx &rc) set_rwstorage(jcr, rc.store); jcr->client = rc.client; - pm_strcpy(jcr->client_name, rc.client->name()); + if (jcr->client) { + pm_strcpy(jcr->client_name, rc.client->name()); + } else { + pm_strcpy(jcr->client_name, "**Dummy**"); + } if (rc.media_type) { if (!jcr->media_type) { jcr->media_type = get_pool_memory(PM_NAME); @@ -934,6 +981,14 @@ static bool set_run_context_in_jcr(UAContext *ua, JCR *jcr, run_ctx &rc) } rc.replace = NULL; + /* Set Snapshot Retention (Job <- Client) */ + if (jcr->client) { + jcr->snapshot_retention = jcr->client->SnapRetention; + } + if (jcr->job && jcr->job->SnapRetention > 0) { + jcr->snapshot_retention = jcr->job->SnapRetention; + } + if (rc.Priority) { jcr->JobPriority = rc.Priority; rc.Priority = 0; @@ -962,7 +1017,7 @@ static bool set_run_context_in_jcr(UAContext *ua, JCR *jcr, run_ctx &rc) } rc.replace = ReplaceOptions[0].name; for (i=0; ReplaceOptions[i].name; i++) { - if ((int)ReplaceOptions[i].token == (int)jcr->replace) { + if (ReplaceOptions[i].token == jcr->replace) { rc.replace = ReplaceOptions[i].name; } } @@ -1268,7 +1323,8 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char "%s" "Storage: %s\n" "When: %s\n" - "Priority: %d\n", + "Priority: %d\n" + "%s%s%s", job->name(), level_to_str(jcr->getJobLevel()), jcr->client->name(), @@ -1277,7 +1333,10 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char next_pool, jcr->wstore?jcr->wstore->name():"*None*", bstrutime(dt, sizeof(dt), jcr->sched_time), - jcr->JobPriority); + jcr->JobPriority, + jcr->plugin_options?"Plugin Options: ":"", + jcr->plugin_options?jcr->plugin_options:"", + jcr->plugin_options?"\n":""); } else { if (jcr->is_JobLevel(L_VIRTUAL_FULL)) { bsnprintf(next_pool, sizeof(next_pool), @@ -1294,7 +1353,8 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char "%s" "Storage: %s (From %s)\n" "When: %s\n" - "Priority: %d\n"), + "Priority: %d\n" + "%s%s%s"), job->name(), level_to_str(jcr->getJobLevel()), jcr->client->name(), @@ -1303,7 +1363,10 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char next_pool, jcr->wstore?jcr->wstore->name():"*None*", jcr->wstore_source, bstrutime(dt, sizeof(dt), jcr->sched_time), - jcr->JobPriority); + jcr->JobPriority, + jcr->plugin_options?"Plugin Options: ":"", + jcr->plugin_options?jcr->plugin_options:"", + jcr->plugin_options?"\n":""); } } else { /* JT_VERIFY */ JOB_DBR jr; @@ -1407,7 +1470,8 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char "Storage: %s\n" "When: %s\n" "Catalog: %s\n" - "Priority: %d\n", + "Priority: %d\n" + "Plugin Options: %s\n", job->name(), NPRT(jcr->RestoreBootstrap), jcr->RegexWhere?jcr->RegexWhere:job->RegexWhere, @@ -1418,7 +1482,9 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char jcr->rstore->name(), bstrutime(dt, sizeof(dt), jcr->sched_time), jcr->catalog->name(), - jcr->JobPriority); + jcr->JobPriority, + NPRTB(jcr->plugin_options)); + } else { ua->send_msg(_("Run Restore job\n" "JobName: %s\n" @@ -1431,7 +1497,8 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char "Storage: %s\n" "When: %s\n" "Catalog: %s\n" - "Priority: %d\n"), + "Priority: %d\n" + "Plugin Options: %s\n"), job->name(), NPRT(jcr->RestoreBootstrap), jcr->RegexWhere?jcr->RegexWhere:job->RegexWhere, @@ -1442,7 +1509,8 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char jcr->rstore->name(), bstrutime(dt, sizeof(dt), jcr->sched_time), jcr->catalog->name(), - jcr->JobPriority); + jcr->JobPriority, + NPRTB(jcr->plugin_options)); } } else { if (ua->api) { @@ -1459,7 +1527,8 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char "Storage: %s\n" "When: %s\n" "Catalog: %s\n" - "Priority: %d\n", + "Priority: %d\n" + "Plugin Options: %s\n", job->name(), NPRT(jcr->RestoreBootstrap), jcr->where?jcr->where:NPRT(job->RestoreWhere), @@ -1470,7 +1539,9 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char jcr->rstore->name(), bstrutime(dt, sizeof(dt), jcr->sched_time), jcr->catalog->name(), - jcr->JobPriority); + jcr->JobPriority, + NPRTB(jcr->plugin_options)); + } else { ua->send_msg(_("Run Restore job\n" "JobName: %s\n" @@ -1483,7 +1554,8 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char "Storage: %s\n" "When: %s\n" "Catalog: %s\n" - "Priority: %d\n"), + "Priority: %d\n" + "Plugin Options: %s\n"), job->name(), NPRT(jcr->RestoreBootstrap), jcr->where?jcr->where:NPRT(job->RestoreWhere), @@ -1494,7 +1566,8 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char jcr->rstore->name(), bstrutime(dt, sizeof(dt), jcr->sched_time), jcr->catalog->name(), - jcr->JobPriority); + jcr->JobPriority, + NPRTB(jcr->plugin_options)); } } @@ -1522,14 +1595,16 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char "JobId: %s\n" "When: %s\n" "Catalog: %s\n" - "Priority: %d\n"), + "Priority: %d\n" + "Plugin Options: %s\n"), replace, jcr->client->name(), jcr->rstore->name(), jcr->RestoreJobId==0?"*None*":edit_uint64(jcr->RestoreJobId, ec1), bstrutime(dt, sizeof(dt), jcr->sched_time), jcr->catalog->name(), - jcr->JobPriority); + jcr->JobPriority, + NPRTB(jcr->plugin_options)); } break; case JT_COPY: @@ -1620,7 +1695,7 @@ static bool scan_run_command_line_arguments(UAContext *ua, run_ctx &rc) "alljobid", /* 0 Used in a switch() */ "jobid", /* 1 */ "client", /* 2 */ - "fd", /* 3 */ + "fd", "fileset", /* 4 */ "level", /* 5 */ "storage", /* 6 */ @@ -1631,7 +1706,7 @@ static bool scan_run_command_line_arguments(UAContext *ua, run_ctx &rc) "replace", /* 11 */ "when", /* 12 */ "priority", /* 13 */ - "yes", /* 14 -- if you change this change YES_POS too */ + "yes", /* 14 -- if you change this change YES_POS too */ "verifyjob", /* 15 */ "files", /* 16 number of files to restore */ "catalog", /* 17 override catalog */ @@ -1650,8 +1725,7 @@ static bool scan_run_command_line_arguments(UAContext *ua, run_ctx &rc) "job", /* 30 */ "mediatype", /* 31 */ "nextpool", /* 32 override next pool name */ - NULL - }; + NULL}; #define YES_POS 14 @@ -1670,6 +1744,7 @@ static bool scan_run_command_line_arguments(UAContext *ua, run_ctx &rc) rc.spool_data_set = false; rc.ignoreduplicatecheck = false; rc.comment = NULL; + rc.plugin_options = NULL; for (i=1; iargc; i++) { Dmsg2(800, "Doing arg %d = %s\n", i, ua->argk[i]); diff --git a/bacula/src/dird/ua_select.c b/bacula/src/dird/ua_select.c index 95a0308bb3..343dbbead8 100644 --- a/bacula/src/dird/ua_select.c +++ b/bacula/src/dird/ua_select.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -27,6 +31,28 @@ /* Imported variables */ extern struct s_jl joblevels[]; +int confirm_retention_yesno(UAContext *ua, utime_t ret, const char *msg) +{ + char ed1[100]; + int val; + + /* Look for "yes" in command line */ + if (find_arg(ua, NT_("yes")) != -1) { + return 1; + } + + for ( ;; ) { + ua->info_msg(_("The current %s retention period is: %s\n"), + msg, edit_utime(ret, ed1, sizeof(ed1))); + if (!get_cmd(ua, _("Continue? (yes/no): "))) { + return 0; + } + if (is_yesno(ua->cmd, &val)) { + return val; /* is 1 for yes, 0 for no */ + } + } + return 1; +} /* * Confirm a retention period @@ -36,14 +62,15 @@ int confirm_retention(UAContext *ua, utime_t *ret, const char *msg) char ed1[100]; int val; - int yes_in_arg = find_arg(ua, NT_("yes")); + /* Look for "yes" in command line */ + if (find_arg(ua, NT_("yes")) != -1) { + return 1; + } for ( ;; ) { ua->info_msg(_("The current %s retention period is: %s\n"), msg, edit_utime(*ret, ed1, sizeof(ed1))); - if (yes_in_arg != -1) { - return 1; - } + if (!get_cmd(ua, _("Continue? (yes/mod/no): "))) { return 0; } @@ -251,7 +278,11 @@ JOB *select_enable_disable_job_resource(UAContext *ua, bool enable) JOB *job; LockRes(); - start_prompt(ua, _("The defined Job resources are:\n")); + if (enable) { + start_prompt(ua, _("The disabled Job resources are:\n")); + } else { + start_prompt(ua, _("The enabled Job resources are:\n")); + } foreach_res(job, R_JOB) { if (!acl_access_ok(ua, Job_ACL, job->name())) { continue; @@ -333,6 +364,32 @@ JOB *select_restore_job_resource(UAContext *ua) return job; } +/* + * Select a client to enable or disable + */ +CLIENT *select_enable_disable_client_resource(UAContext *ua, bool enable) +{ + char name[MAX_NAME_LENGTH]; + CLIENT *client; + + LockRes(); + start_prompt(ua, _("The defined Client resources are:\n")); + foreach_res(client, R_CLIENT) { + if (!acl_access_ok(ua, Client_ACL, client->name())) { + continue; + } + if (client->enabled == enable) { /* Already enabled/disabled? */ + continue; /* yes, skip */ + } + add_prompt(ua, client->name()); + } + UnlockRes(); + if (do_prompt(ua, _("Client"), _("Select Client resource"), name, sizeof(name)) < 0) { + return NULL; + } + client = (CLIENT *)GetResWithName(R_CLIENT, name); + return client; +} /* @@ -385,6 +442,34 @@ CLIENT *get_client_resource(UAContext *ua) return select_client_resource(ua); } +/* + * Select a schedule to enable or disable + */ +SCHED *select_enable_disable_schedule_resource(UAContext *ua, bool enable) +{ + char name[MAX_NAME_LENGTH]; + SCHED *sched; + + LockRes(); + start_prompt(ua, _("The defined Schedule resources are:\n")); + foreach_res(sched, R_SCHEDULE) { + if (!acl_access_ok(ua, Schedule_ACL, sched->name())) { + continue; + } + if (sched->enabled == enable) { /* Already enabled/disabled? */ + continue; /* yes, skip */ + } + add_prompt(ua, sched->name()); + } + UnlockRes(); + if (do_prompt(ua, _("Schedule"), _("Select Schedule resource"), name, sizeof(name)) < 0) { + return NULL; + } + sched = (SCHED *)GetResWithName(R_SCHEDULE, name); + return sched; +} + + /* Scan what the user has entered looking for: * * client= @@ -1299,13 +1384,20 @@ int select_running_jobs(UAContext *ua, alist *jcrs, const char *reason) ua->error_msg(_("No value given for \"job\".\n")); goto bail_out; } - if (!(jcr=get_jcr_by_partial_name(ua->argv[i]))) { - ua->warning_msg(_("Warning Job %s is not running.\n"), ua->argv[i]); - jcr = new_jcr(sizeof(JCR), dird_free_jcr); - bstrncpy(jcr->Job, ua->argv[i], sizeof(jcr->Job)); - } + jcr = get_jcr_by_partial_name(ua->argv[i]); + if (jcr && jcr->job && acl_access_ok(ua, Job_ACL, jcr->job->name())) { jcrs->append(jcr); + + } else if (jcr) { + if (jcr->job) { + ua->error_msg(_("Unauthorized command from this console " + "for job=%s.\n"), ua->argv[i]); + } + free_jcr(jcr); + + } else { + ua->warning_msg(_("Warning Job %s is not running.\n"), ua->argv[i]); } if (jcrs->size() == 0) { goto bail_out; /* If we did not find specified jobid, get out */ @@ -1317,13 +1409,20 @@ int select_running_jobs(UAContext *ua, alist *jcrs, const char *reason) ua->error_msg(_("No value given for \"ujobid\".\n")); goto bail_out; } - if (!(jcr=get_jcr_by_full_name(ua->argv[i]))) { - ua->warning_msg(_("Warning Job %s is not running.\n"), ua->argv[i]); - jcr = new_jcr(sizeof(JCR), dird_free_jcr); - bstrncpy(jcr->Job, ua->argv[i], sizeof(jcr->Job)); - } + jcr = get_jcr_by_full_name(ua->argv[i]); + if (jcr && jcr->job && acl_access_ok(ua, Job_ACL, jcr->job->name())) { jcrs->append(jcr); + + } else if (jcr) { + if (jcr->job) { + ua->error_msg(_("Unauthorized command from this console " + "for ujobid=%s.\n"), ua->argv[i]); + } + free_jcr(jcr); + + } else { + ua->warning_msg(_("Warning Job %s is not running.\n"), ua->argv[i]); } if (jcrs->size() == 0) { goto bail_out; /* If we did not find specified jobid, get out */ diff --git a/bacula/src/dird/ua_server.c b/bacula/src/dird/ua_server.c index b099fff98d..eb5c586770 100644 --- a/bacula/src/dird/ua_server.c +++ b/bacula/src/dird/ua_server.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * diff --git a/bacula/src/dird/ua_status.c b/bacula/src/dird/ua_status.c index 1e5d7a322b..6ac3d66ed2 100644 --- a/bacula/src/dird/ua_status.c +++ b/bacula/src/dird/ua_status.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -288,29 +292,30 @@ static void do_all_status(UAContext *ua) void list_dir_status_header(UAContext *ua) { - char dt[MAX_TIME_LENGTH]; + char dt[MAX_TIME_LENGTH], dt1[MAX_TIME_LENGTH]; char b1[35], b2[35], b3[35], b4[35], b5[35]; - ua->send_msg(_("%s Version: %s (%s) %s %s %s\n"), my_name, VERSION, BDATE, - HOST_OS, DISTNAME, DISTVER); + ua->send_msg(_("%s %sVersion: %s (%s) %s %s %s\n"), my_name, + "", VERSION, BDATE, HOST_OS, DISTNAME, DISTVER); bstrftime_nc(dt, sizeof(dt), daemon_start_time); - ua->send_msg(_("Daemon started %s. Jobs: run=%d, running=%d " - "mode=%d,%d\n"), dt, - num_jobs_run, job_count(), (int)DEVELOPER_MODE, (int)BEEF); + bstrftimes(dt1, sizeof(dt1), last_reload_time); + ua->send_msg(_("Daemon started %s, conf reloaded %s\n"), dt, dt1); + ua->send_msg(_(" Jobs: run=%d, running=%d mode=%d\n"), + num_jobs_run, job_count(), (int)DEVELOPER_MODE); ua->send_msg(_(" Heap: heap=%s smbytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"), - edit_uint64_with_commas((char *)sbrk(0)-(char *)start_heap, b1), - edit_uint64_with_commas(sm_bytes, b2), - edit_uint64_with_commas(sm_max_bytes, b3), - edit_uint64_with_commas(sm_buffers, b4), - edit_uint64_with_commas(sm_max_buffers, b5)); + edit_uint64_with_commas((char *)sbrk(0)-(char *)start_heap, b1), + edit_uint64_with_commas(sm_bytes, b2), + edit_uint64_with_commas(sm_max_bytes, b3), + edit_uint64_with_commas(sm_buffers, b4), + edit_uint64_with_commas(sm_max_buffers, b5)); /* TODO: use this function once for all daemons */ - if (bplugin_list->size() > 0) { + if (b_plugin_list->size() > 0) { int len; Plugin *plugin; POOL_MEM msg(PM_FNAME); pm_strcpy(msg, " Plugin: "); - foreach_alist(plugin, bplugin_list) { + foreach_alist(plugin, b_plugin_list) { len = pm_strcat(msg, plugin->file); if (len > 80) { pm_strcat(msg, "\n "); @@ -355,7 +360,7 @@ static void do_storage_status(UAContext *ua, STORE *store, char *cmd) } /* * The Storage daemon is problematic because it shows information - * related to multiple Jobs, so if there is a Client or Job + * related to multiple Job, so if there is a Client or Job * ACL restriction, we forbid all access to the Storage. */ if (have_restricted_acl(ua, Client_ACL) || @@ -379,13 +384,29 @@ static void do_storage_status(UAContext *ua, STORE *store, char *cmd) sd = ua->jcr->store_bsock; if (cmd) { POOL_MEM devname; - int i = find_arg_with_value(ua, "device"); - if (i>0) { - Mmsg(devname, "device=%s", ua->argv[i]); + /* + * For .status storage=xxx shstore list + * send .status shstore list xxx-device + */ + if (strcasecmp(cmd, "shstore") == 0) { + if (!ua->argk[3]) { + ua->send_msg(_("Must have three aguments\n")); + return; + } + pm_strcpy(devname, store->dev_name()); bash_spaces(devname.c_str()); + sd->fsend(".status %s %s %s api=%d api_opts=%s", + cmd, ua->argk[3], devname.c_str(), + ua->api, ua->api_opts); + } else { + int i = find_arg_with_value(ua, "device"); + if (i>0) { + Mmsg(devname, "device=%s", ua->argv[i]); + bash_spaces(devname.c_str()); + } + sd->fsend(".status %s api=%d api_opts=%s %s", + cmd, ua->api, ua->api_opts, devname.c_str()); } - sd->fsend(".status %s api=%d api_opts=%s %s", - cmd, ua->api, ua->api_opts, devname.c_str()); } else { sd->fsend("status"); } @@ -509,7 +530,7 @@ static void prt_runtime(UAContext *ua, sched_pkt *sp) level_ptr = level_to_str(sp->level); break; } - if (ua->api) { + if (ua->api == 1) { ua->send_msg(_("%-14s\t%-8s\t%3d\t%-18s\t%-18s\t%s\n"), level_ptr, job_type_to_str(sp->job->JobType), sp->priority, dt, sp->job->name(), mr.VolumeName); @@ -595,10 +616,11 @@ static void llist_scheduled_jobs(UAContext *ua) LockRes(); foreach_res(job, R_JOB) { sched = job->schedule; - if (sched == NULL || !job->enabled) { /* scheduled? or enabled? */ + if (!sched || !job->enabled || (sched && !sched->enabled) || + (job->client && !job->client->enabled)) { continue; /* no, skip this job */ } - if (job_name[0] && bstrcmp(job_name, job->name()) != 0) { + if (job_name[0] && strcmp(job_name, job->name()) != 0) { continue; } for (run=sched->run; run; run=run->next) { @@ -808,38 +830,46 @@ static void list_running_jobs(UAContext *ua) { JCR *jcr; int njobs = 0; + int i; const char *msg; char *emsg; /* edited message */ char dt[MAX_TIME_LENGTH]; char level[10]; bool pool_mem = false; + JobId_t jid = 0; + + if ((i = find_arg_with_value(ua, "jobid")) >= 0) { + jid = str_to_int64(ua->argv[i]); + } Dmsg0(200, "enter list_run_jobs()\n"); - if (!ua->api) ua->send_msg(_("\nRunning Jobs:\n")); - foreach_jcr(jcr) { - if (jcr->JobId == 0) { /* this is us */ - /* this is a console or other control job. We only show console - * jobs in the status output. - */ - if (jcr->getJobType() == JT_CONSOLE && !ua->api) { - bstrftime_nc(dt, sizeof(dt), jcr->start_time); - ua->send_msg(_("Console connected at %s\n"), dt); + + if (!ua->api) { + ua->send_msg(_("\nRunning Jobs:\n")); + foreach_jcr(jcr) { + if (jcr->JobId == 0) { /* this is us */ + /* this is a console or other control job. We only show console + * jobs in the status output. + */ + if (jcr->getJobType() == JT_CONSOLE) { + bstrftime_nc(dt, sizeof(dt), jcr->start_time); + ua->send_msg(_("Console connected %sat %s\n"), + (ua->UA_sock && ua->UA_sock->tls)?_("using TLS "):"", + dt); + } + continue; } - continue; + njobs++; } - njobs++; - } - endeach_jcr(jcr); - - if (njobs == 0) { - /* Note the following message is used in regress -- don't change */ - if (!ua->api) { + endeach_jcr(jcr); + if (njobs == 0) { + /* Note the following message is used in regress -- don't change */ ua->send_msg(_("No Jobs running.\n====\n")); + Dmsg0(200, "leave list_run_jobs()\n"); + return; } - Dmsg0(200, "leave list_run_jobs()\n"); - return; } - njobs = 0; + if (!ua->api) { ua->send_msg(_(" JobId Type Level Files Bytes Name Status\n")); ua->send_msg(_("======================================================================\n")); @@ -848,7 +878,10 @@ static void list_running_jobs(UAContext *ua) if (jcr->JobId == 0 || !acl_access_ok(ua, Job_ACL, jcr->job->name())) { continue; } - njobs++; + /* JobId keyword found in command line */ + if (jid > 0 && jcr->JobId != jid) { + continue; + } switch (jcr->JobStatus) { case JS_Created: msg = _("is waiting execution"); @@ -865,6 +898,9 @@ static void list_running_jobs(UAContext *ua) case JS_Warnings: msg = _("has terminated with warnings"); break; + case JS_Incomplete: + msg = _("has terminated in incomplete state"); + break; case JS_ErrorTerminated: msg = _("has erred"); break; @@ -1007,6 +1043,7 @@ static void list_running_jobs(UAContext *ua) ua->send_msg(_("%6d\t%-6s\t%-20s\t%s\t%s\n"), jcr->JobId, level, jcr->Job, msg, jcr->comment); unbash_spaces(jcr->comment); + } else { char b1[50], b2[50], b3[50]; level[4] = 0; @@ -1095,6 +1132,9 @@ static void list_terminated_jobs(UAContext *ua) case JS_Warnings: termstat = _("OK -- with warnings"); break; + case JS_Incomplete: + termstat = _("Incomplete"); + break; default: termstat = _("Other"); break; diff --git a/bacula/src/dird/ua_tree.c b/bacula/src/dird/ua_tree.c index 3cf5c15cdb..8230e0cc21 100644 --- a/bacula/src/dird/ua_tree.c +++ b/bacula/src/dird/ua_tree.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -123,7 +127,7 @@ bool user_select_files_from_tree(TREE_CTX *tree) if (ua->api) user->signal(BNET_CMD_BEGIN); parse_args_only(ua->cmd, &ua->args, &ua->argc, ua->argk, ua->argv, MAX_CMD_ARGS); if (ua->argc == 0) { - ua->warning_msg(_("Invalid command \"%s\". Enter \"done\" to exit.\n"), ua->cmd); + ua->warning_msg(_("Invalid command \"%s\". Enter \"done\" to exit.\n"), ua->cmd); if (ua->api) user->signal(BNET_CMD_FAILED); continue; } @@ -142,7 +146,7 @@ bool user_select_files_from_tree(TREE_CTX *tree) /* Some unknow dot command -- probably .messages, ignore it */ continue; } - ua->warning_msg(_("Invalid command \"%s\". Enter \"done\" to exit.\n"), ua->cmd); + ua->warning_msg(_("Invalid command \"%s\". Enter \"done\" to exit.\n"), ua->cmd); if (ua->api) user->signal(BNET_CMD_FAILED); continue; } diff --git a/bacula/src/dird/ua_update.c b/bacula/src/dird/ua_update.c index 65fe68e1cd..6362d8c0b6 100644 --- a/bacula/src/dird/ua_update.c +++ b/bacula/src/dird/ua_update.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -54,6 +58,8 @@ int update_cmd(UAContext *ua, const char *cmd) NT_("slot"), /* 4 */ NT_("jobid"), /* 5 */ NT_("stats"), /* 6 */ + NT_("snap"), /* 7 */ + NT_("snapshot"),/* 8 */ NULL}; if (!open_client_db(ua)) { @@ -78,6 +84,10 @@ int update_cmd(UAContext *ua, const char *cmd) case 6: update_stats(ua); return 1; + case 7: + case 8: + update_snapshot(ua); + return 1; default: break; } @@ -87,6 +97,7 @@ int update_cmd(UAContext *ua, const char *cmd) add_prompt(ua, _("Pool from resource")); add_prompt(ua, _("Slots from autochanger")); add_prompt(ua, _("Long term statistics")); + add_prompt(ua, _("Snapshot parameters")); switch (do_prompt(ua, _("item"), _("Choose catalog item to update"), NULL, 0)) { case 0: update_volume(ua); @@ -100,6 +111,9 @@ int update_cmd(UAContext *ua, const char *cmd) case 3: update_stats(ua); break; + case 4: + update_snapshot(ua); + break; default: break; } diff --git a/bacula/src/dird/vbackup.c b/bacula/src/dird/vbackup.c index 64d69bb66f..a1af9dc0eb 100644 --- a/bacula/src/dird/vbackup.c +++ b/bacula/src/dird/vbackup.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2008-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -146,7 +150,7 @@ _("This Job is not an Accurate backup so is not equivalent to a Full backup.\n") jr.cStartTime); jr.JobLevel = L_INCREMENTAL; /* Take Full+Diff+Incr */ - db_accurate_get_jobids(jcr, jcr->db, &jr, &jobids); + db_get_accurate_jobids(jcr, jcr->db, &jr, &jobids); } else if (sel.set_string(jcr->JobIds, true)) { /* Found alljobid keyword */ @@ -204,7 +208,7 @@ _("This Job is not an Accurate backup so is not equivalent to a Full backup.\n") } else { /* No argument provided */ jcr->jr.JobLevel = L_VIRTUAL_FULL; - db_accurate_get_jobids(jcr, jcr->db, &jcr->jr, &jobids); + db_get_accurate_jobids(jcr, jcr->db, &jcr->jr, &jobids); Dmsg1(10, "Accurate jobids=%s\n", jobids.list); } diff --git a/bacula/src/dird/verify.c b/bacula/src/dird/verify.c index 84575bac87..a811859588 100644 --- a/bacula/src/dird/verify.c +++ b/bacula/src/dird/verify.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -271,7 +275,7 @@ bool do_verify(JCR *jcr) break; case L_VERIFY_VOLUME_TO_CATALOG: if (jcr->sd_calls_client) { - if (jcr->FDVersion < 5) { + if (jcr->FDVersion < 10) { Jmsg(jcr, M_FATAL, 0, _("The File daemon does not support SDCallsClient.\n")); goto bail_out; } @@ -552,22 +556,27 @@ void get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId) * Link name ??? */ while ((n=bget_dirmsg(fd)) >= 0 && !job_canceled(jcr)) { - int stream; + int32_t stream, full_stream; char *attr, *p, *fn; char Opts_Digest[MAXSTRING]; /* Verify Opts or MD5/SHA1 digest */ if (job_canceled(jcr)) { - goto bail_out; + free_pool_memory(fname); + return; } fname = check_pool_memory_size(fname, fd->msglen); jcr->fname = check_pool_memory_size(jcr->fname, fd->msglen); Dmsg1(200, "Atts+Digest=%s\n", fd->msg); - if ((len = sscanf(fd->msg, "%ld %d %100s", &file_index, &stream, + if ((len = sscanf(fd->msg, "%ld %d %100s", &file_index, &full_stream, fname)) != 3) { Jmsg3(jcr, M_FATAL, 0, _("birdmsglen, fd->msg); - goto bail_out; + free_pool_memory(fname); + return; } + stream = full_stream & STREAMMASK_TYPE; + Dmsg4(30, "Got hdr: FilInx=%d FullStream=%d Stream=%d fname=%s.\n", file_index, full_stream, stream, fname); + /* * We read the Options or Signature into fname * to prevent overrun, now copy it to proper location. @@ -737,7 +746,8 @@ void get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId) if (jcr->FileIndex != (uint32_t)file_index) { Jmsg2(jcr, M_FATAL, 0, _("MD5/SHA1 index %d not same as attributes %d\n"), file_index, jcr->FileIndex); - goto bail_out; + free_pool_memory(fname); + return; } if (do_Digest != CRYPTO_DIGEST_NONE) { db_escape_string(jcr, jcr->db, buf, Opts_Digest, strlen(Opts_Digest)); @@ -756,7 +766,8 @@ void get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId) berrno be; Jmsg2(jcr, M_FATAL, 0, _("bdirdfn_printed) { jcr->setJobStatus(JS_Differences); } - -bail_out: free_pool_memory(fname); } diff --git a/bacula/src/filed/Makefile.in b/bacula/src/filed/Makefile.in index bee5d892df..7fca1a8e49 100644 --- a/bacula/src/filed/Makefile.in +++ b/bacula/src/filed/Makefile.in @@ -1,8 +1,8 @@ # # Bacula Makefile for the File daemon # -# Author: Kern Sibbald, 2002 -# License: LGPLv3 +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # @MCOMMON@ @@ -30,9 +30,10 @@ first_rule: all dummy: # -SVRSRCS = filed.c authenticate.c acl.c backup.c estimate.c \ +SVRSRCS = filed.c authenticate.c acl.c backup.c crypto.c \ + estimate.c \ fd_plugins.c accurate.c \ - filed_conf.c heartbeat.c job.c \ + filed_conf.c heartbeat.c hello.c job.c fd_snapshot.c \ restore.c status.c verify.c verify_vol.c xattr.c SVROBJS = $(SVRSRCS:.c=.o) @@ -62,40 +63,15 @@ acl.o: acl.c @echo "Compiling $<" $(NO_ECHO)$(CXX) $(DEFS) $(DEBUG) -c $(WCFLAGS) $(CPPFLAGS) $(LZO_INC) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) $(AFS_CFLAGS) $< -win32/winlib.a: - @if test -f win32/Makefile -a "${GMAKE}" != "none"; then \ - (cd win32; $(GMAKE) DESTDIR=$(DESTDIR)); \ - fi - @rm -f bacula-fd.exe - -win32/winmain.o: - @if test -f win32/Makefile -a "${GMAKE}" != "none"; then \ - (cd win32; $(GMAKE) DESTDIR=$(DESTDIR)); \ - fi - @rm -f bacula-fd.exe - -win32/winres.res: - @if test -f win32/Makefile -a "${GMAKE}" != "none"; then \ - (cd win32; $(GMAKE) DESTDIR=$(DESTDIR)); \ - fi - @rm -f bacula-fd.exe - -# win32 libraries if needed -win32: $(WIN32OBJS) - @if test -f win32/Makefile -a "${GMAKE}" != "none"; then \ - (cd win32; $(GMAKE) DESTDIR=$(DESTDIR)); \ - fi - @rm -f bacula-fd.exe - bacula-fd: Makefile $(SVROBJS) ../findlib/libbacfind$(DEFAULT_ARCHIVE_TYPE) ../lib/libbaccfg$(DEFAULT_ARCHIVE_TYPE) ../lib/libbac$(DEFAULT_ARCHIVE_TYPE) @echo "Linking $@ ..." $(LIBTOOL_LINK) $(CXX) $(WLDFLAGS) $(LDFLAGS) -L../lib -L../findlib -o $@ $(SVROBJS) \ - $(WIN32LIBS) $(FDLIBS) $(ZLIBS) -lbacfind -lbaccfg -lbac -lm $(LIBS) \ + $(FDLIBS) $(ZLIBS) -lbacfind -lbaccfg -lbac -lm $(LIBS) \ $(DLIB) $(WRAPLIBS) $(GETTEXT_LIBS) $(OPENSSL_LIBS) $(CAP_LIBS) $(AFS_LIBS) $(LZO_LIBS) static-bacula-fd: Makefile $(SVROBJS) ../findlib/libbacfind.a ../lib/libbaccfg$(DEFAULT_ARCHIVE_TYPE) ../lib/libbac$(DEFAULT_ARCHIVE_TYPE) $(LIBTOOL_LINK) $(CXX) $(WLDFLAGS) $(LDFLAGS) -static -L../lib -L../findlib -o $@ $(SVROBJS) \ - $(WIN32LIBS) $(FDLIBS) $(ZLIBS) -lbacfind -lbaccfg -lbac -lm $(LIBS) \ + $(FDLIBS) $(ZLIBS) -lbacfind -lbaccfg -lbac -lm $(LIBS) \ $(DLIB) $(WRAPLIBS) $(GETTEXT_LIBS) $(OPENSSL_LIBS) $(CAP_LIBS) $(AFS_LIBS) $(LZO_LIBS) strip $@ @@ -109,9 +85,6 @@ libtool-clean: clean: libtool-clean @$(RMF) bacula-fd filed core core.* a.out *.o *.bak *~ *.intpro *.extpro 1 2 3 @$(RMF) static-bacula-fd - @if test -f win32/Makefile -a "${GMAKE}" != "none"; then \ - (cd win32; $(GMAKE) clean); \ - fi realclean: clean @$(RMF) tags bacula-fd.conf @@ -119,19 +92,13 @@ realclean: clean distclean: realclean if test $(srcdir) = .; then $(MAKE) realclean; fi (cd $(srcdir); $(RMF) Makefile) - @if test -f win32/Makefile -a "${GMAKE}" != "none"; then \ - (cd win32; $(GMAKE) distclean); \ - fi devclean: realclean if test $(srcdir) = .; then $(MAKE) realclean; fi (cd $(srcdir); $(RMF) Makefile) - @if test -f win32/Makefile -a "${GMAKE}" != "none"; then \ - (cd win32; $(GMAKE) devclean); \ - fi install: all - $(LIBTOOL_INSTALL) $(INSTALL_PROGRAM) bacula-fd $(DESTDIR)$(sbindir)/bacula-fd + $(LIBTOOL_INSTALL) $(INSTALL_PROGRAM) bacula-fd $(DESTDIR)$(sbindir)/bacula-fd @srcconf=bacula-fd.conf; \ if test -f ${DESTDIR}${sysconfdir}/$$srcconf; then \ destconf=$$srcconf.new; \ @@ -149,7 +116,6 @@ install: all fi uninstall: - (cd $(DESTDIR)$(sbindir); $(RMF) bacula-fd) (cd $(DESTDIR)$(sysconfdir); $(RMF) bacula-fd.conf) (cd $(DESTDIR)$(sysconfdir); $(RMF) bacula-fd.conf.new) diff --git a/bacula/src/filed/accurate.c b/bacula/src/filed/accurate.c index 4bf7974ebd..62d572b7d7 100644 --- a/bacula/src/filed/accurate.c +++ b/bacula/src/filed/accurate.c @@ -1,25 +1,26 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 2000-2014 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2015 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ -/* - * Version $Id $ - * - */ #include "bacula.h" #include "filed.h" +#include "backup.h" static int dbglvl=100; @@ -86,8 +87,11 @@ static bool accurate_send_base_file_list(JCR *jcr) CurFile *elt; struct stat statc; int32_t LinkFIc; - FF_PKT *ff_pkt; - int stream = STREAM_UNIX_ATTRIBUTES; + bctx_t bctx; + + memset(&bctx, 0, sizeof(bctx)); + bctx.jcr = jcr; + bctx.data_stream = STREAM_UNIX_ATTRIBUTES; if (!jcr->accurate || jcr->getJobLevel() != L_FULL) { return true; @@ -97,22 +101,22 @@ static bool accurate_send_base_file_list(JCR *jcr) return true; } - ff_pkt = init_find_files(); - ff_pkt->type = FT_BASE; + bctx.ff_pkt = init_find_files(); + bctx.ff_pkt->type = FT_BASE; foreach_htable(elt, jcr->file_list) { if (elt->seen) { Dmsg2(dbglvl, "base file fname=%s seen=%i\n", elt->fname, elt->seen); /* TODO: skip the decode and use directly the lstat field */ decode_stat(elt->lstat, &statc, sizeof(statc), &LinkFIc); /* decode catalog stat */ - ff_pkt->fname = elt->fname; - ff_pkt->statp = statc; - encode_and_send_attributes(jcr, ff_pkt, stream); + bctx.ff_pkt->fname = elt->fname; + bctx.ff_pkt->statp = statc; + encode_and_send_attributes(bctx); // free(elt->fname); } } - term_find_files(ff_pkt); + term_find_files(bctx.ff_pkt); return true; } @@ -126,8 +130,11 @@ static bool accurate_send_deleted_list(JCR *jcr) CurFile *elt; struct stat statc; int32_t LinkFIc; - FF_PKT *ff_pkt; - int stream = STREAM_UNIX_ATTRIBUTES; + bctx_t bctx; + + memset(&bctx, 0, sizeof(bctx)); + bctx.jcr = jcr; + bctx.data_stream = STREAM_UNIX_ATTRIBUTES; if (!jcr->accurate) { return true; @@ -137,8 +144,8 @@ static bool accurate_send_deleted_list(JCR *jcr) return true; } - ff_pkt = init_find_files(); - ff_pkt->type = FT_DELETED; + bctx.ff_pkt = init_find_files(); + bctx.ff_pkt->type = FT_DELETED; foreach_htable(elt, jcr->file_list) { if (elt->seen || plugin_check_file(jcr, elt->fname)) { @@ -147,14 +154,14 @@ static bool accurate_send_deleted_list(JCR *jcr) Dmsg2(dbglvl, "deleted fname=%s seen=%i\n", elt->fname, elt->seen); /* TODO: skip the decode and use directly the lstat field */ decode_stat(elt->lstat, &statc, sizeof(statc), &LinkFIc); /* decode catalog stat */ - ff_pkt->fname = elt->fname; - ff_pkt->statp.st_mtime = statc.st_mtime; - ff_pkt->statp.st_ctime = statc.st_ctime; - encode_and_send_attributes(jcr, ff_pkt, stream); + bctx.ff_pkt->fname = elt->fname; + bctx.ff_pkt->statp.st_mtime = statc.st_mtime; + bctx.ff_pkt->statp.st_ctime = statc.st_ctime; + encode_and_send_attributes(bctx); // free(elt->fname); } - term_find_files(ff_pkt); + term_find_files(bctx.ff_pkt); return true; } @@ -172,7 +179,7 @@ bool accurate_finish(JCR *jcr) { bool ret = true; - if (jcr->is_canceled()) { + if (jcr->is_canceled() || jcr->is_incomplete()) { accurate_free(jcr); return ret; } @@ -268,9 +275,11 @@ bool accurate_check_file(JCR *jcr, FF_PKT *ff_pkt) if (!accurate_lookup(jcr, fname, &elt)) { Dmsg1(dbglvl, "accurate %s (not found)\n", fname); stat = true; + unstrip_path(ff_pkt); goto bail_out; } + unstrip_path(ff_pkt); /* Get full path back */ ff_pkt->accurate_found = true; ff_pkt->delta_seq = elt.delta_seq; @@ -354,6 +363,16 @@ bool accurate_check_file(JCR *jcr, FF_PKT *ff_pkt) stat = true; } break; + case 'M': /* Look mtime/ctime like normal incremental backup */ + if (ff_pkt->incremental && + (ff_pkt->statp.st_mtime > ff_pkt->save_time && + ((ff_pkt->flags & FO_MTIMEONLY) || + ff_pkt->statp.st_ctime > ff_pkt->save_time))) + { + Dmsg1(dbglvl-1, "%s mtime/ctime more recent than save_time\n", fname); + stat = true; + } + break; case 'c': /* ctime */ if (statc.st_ctime != ff_pkt->statp.st_ctime) { Dmsg1(dbglvl-1, "%s st_ctime differs\n", fname); @@ -475,7 +494,6 @@ bool accurate_check_file(JCR *jcr, FF_PKT *ff_pkt) } bail_out: - unstrip_path(ff_pkt); return stat; } diff --git a/bacula/src/filed/acl.c b/bacula/src/filed/acl.c index 60c55313ba..8a63b6bbf4 100644 --- a/bacula/src/filed/acl.c +++ b/bacula/src/filed/acl.c @@ -1,19 +1,23 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 2004-2014 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2004-2015 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ -/** +/* * Functions to handle ACLs for bacula. * * Currently we support the following OSes: @@ -46,47 +50,48 @@ * certain platforms and if they use they same encoding we might allow * different platform streams to be decoded on an other similar platform. * - * Original written by Preben 'Peppe' Guldberg, December 2004 - * Major rewrite by Marco van Wieringen, November 2008 - * Major overhaul by Marco van Wieringen, January 2012 + * Original written by Preben 'Peppe' Guldberg, December 2004 + * */ #include "bacula.h" #include "filed.h" #if !defined(HAVE_ACL) && !defined(HAVE_AFS_ACL) -/** +/* * Entry points when compiled without support for ACLs or on an unsupported platform. */ -bacl_exit_code build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) +bool backup_acl_streams(JCR *jcr, FF_PKT *ff_pkt) { - return bacl_exit_fatal; + Jmsg(jcr, M_FATAL, 0, "ACL backup requested but not configured in Bacula.\n"); + return false; } -bacl_exit_code parse_acl_streams(JCR *jcr, +bacl_rtn_code restore_acl_streams(JCR *jcr, int stream, char *content, uint32_t content_length) { - return bacl_exit_fatal; + Jmsg(jcr, M_FATAL, 0, "ACL backup requested but not configured in Bacula.\n"); + return bacl_rtn_fatal; } #else -/** +/* * Send an ACL stream to the SD. */ -static bacl_exit_code send_acl_stream(JCR *jcr, int stream) +static bacl_rtn_code send_acl_stream(JCR *jcr, int stream) { BSOCK *sd = jcr->store_bsock; POOLMEM *msgsave; #ifdef FD_NO_SEND_TEST - return bacl_exit_ok; + return bacl_rtn_ok; #endif /* * Sanity check */ - if (jcr->acl_data->u.build->content_length <= 0) { - return bacl_exit_ok; + if (jcr->acl_ctx->content_length <= 0) { + return bacl_rtn_ok; } /* @@ -95,22 +100,22 @@ static bacl_exit_code send_acl_stream(JCR *jcr, int stream) if (!sd->fsend("%ld %d 0", jcr->JobFiles, stream)) { Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), sd->bstrerror()); - return bacl_exit_fatal; + return bacl_rtn_fatal; } /* * Send the buffer to the storage deamon */ - Dmsg1(400, "Backing up ACL <%s>\n", jcr->acl_data->u.build->content); + Dmsg1(400, "Backing up ACL <%s>\n", jcr->acl_ctx->content); msgsave = sd->msg; - sd->msg = jcr->acl_data->u.build->content; - sd->msglen = jcr->acl_data->u.build->content_length + 1; + sd->msg = jcr->acl_ctx->content; + sd->msglen = jcr->acl_ctx->content_length + 1; if (!sd->send()) { sd->msg = msgsave; sd->msglen = 0; Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), sd->bstrerror()); - return bacl_exit_fatal; + return bacl_rtn_fatal; } jcr->JobBytes += sd->msglen; @@ -118,11 +123,11 @@ static bacl_exit_code send_acl_stream(JCR *jcr, int stream) if (!sd->signal(BNET_EOD)) { Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), sd->bstrerror()); - return bacl_exit_fatal; + return bacl_rtn_fatal; } Dmsg1(200, "ACL of file: %s successfully backed up!\n", jcr->last_fname); - return bacl_exit_ok; + return bacl_rtn_ok; } /* @@ -143,9 +148,6 @@ static bool acl_is_trivial(struct acl *acl) static bool acl_nfs4_is_trivial(nfs4_acl_int_t *acl) { -#if 0 - return (acl->aclEntryN > 0 ? false : true); -#else int i; int count = acl->aclEntryN; nfs4_ace_int_t *ace; @@ -167,7 +169,6 @@ static bool acl_nfs4_is_trivial(nfs4_acl_int_t *acl) } } return true; -#endif } /* @@ -182,12 +183,12 @@ static int os_default_acl_streams[1] = { -1 }; -static bacl_exit_code aix_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) +static bacl_rtn_code aix_backup_acl_streams(JCR *jcr, FF_PKT *ff_pkt) { mode_t mode; acl_type_t type; size_t aclsize, acltxtsize; - bacl_exit_code retval = bacl_exit_error; + bacl_rtn_code retval = bacl_rtn_error; POOLMEM *aclbuf = get_pool_memory(PM_MESSAGE); /* @@ -197,29 +198,23 @@ static bacl_exit_code aix_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) type.u64 = ACL_ANY; if (aclx_get(jcr->last_fname, GET_ACLINFO_ONLY, &type, NULL, &aclsize, &mode) < 0) { berrno be; - - switch (errno) { - case ENOENT: - retval = bacl_exit_ok; - goto bail_out; - case ENOSYS: + if (errno == ENOENT) { + retval = bacl_rtn_ok; + } else if (errno == ENOSYS) { /* * If the filesystem reports it doesn't support ACLs we clear the * BACL_FLAG_SAVE_NATIVE flag so we skip ACL saves on all other files * on the same filesystem. The BACL_FLAG_SAVE_NATIVE flag gets set again * when we change from one filesystem to an other. */ - jcr->acl_data->flags &= ~BACL_FLAG_SAVE_NATIVE; - retval = bacl_exit_ok; - goto bail_out; - default: - Mmsg2(jcr->errmsg, - _("aclx_get error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "aclx_get error file=%s ERR=%s\n", + jcr->acl_ctx->flags &= ~BACL_FLAG_SAVE_NATIVE; + retval = bacl_rtn_ok; + } else { + Mmsg2(jcr->errmsg, _("aclx_get error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); } + goto get_out; } /* @@ -232,19 +227,14 @@ static bacl_exit_code aix_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) */ if (aclx_get(jcr->last_fname, 0, &type, aclbuf, &aclsize, &mode) < 0) { berrno be; - - switch (errno) { - case ENOENT: - retval = bacl_exit_ok; - goto bail_out; - default: - Mmsg2(jcr->errmsg, - _("aclx_get error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "aclx_get error file=%s ERR=%s\n", + if (errno == ENOENT) { + retval = bacl_rtn_ok; + } else { + Mmsg2(jcr->errmsg, _("aclx_get error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); } + goto get_out; } /* @@ -253,60 +243,51 @@ static bacl_exit_code aix_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) switch (type.u64) { case ACL_AIXC: if (acl_is_trivial((struct acl *)aclbuf)) { - retval = bacl_exit_ok; - goto bail_out; + retval = bacl_rtn_ok; + goto get_out; } break; case ACL_NFS4: if (acl_nfs4_is_trivial((nfs4_acl_int_t *)aclbuf)) { - retval = bacl_exit_ok; - goto bail_out; + retval = bacl_rtn_ok; + goto get_out; } break; default: - Mmsg2(jcr->errmsg, - _("Unknown acl type encountered on file \"%s\": %ld\n"), - jcr->last_fname, type.u64); - Dmsg2(100, "Unknown acl type encountered on file \"%s\": %ld\n", + Mmsg2(jcr->errmsg, _("Unknown acl type encountered on file \"%s\": %ld\n"), jcr->last_fname, type.u64); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } /* * We have a non-trivial acl lets convert it into some ASCII form. */ - acltxtsize = sizeof_pool_memory(jcr->acl_data->u.build->content); - if (aclx_printStr(jcr->acl_data->u.build->content, &acltxtsize, aclbuf, + acltxtsize = sizeof_pool_memory(jcr->acl_ctx->content); + if (aclx_printStr(jcr->acl_ctx->content, &acltxtsize, aclbuf, aclsize, type, jcr->last_fname, 0) < 0) { - switch (errno) { - case ENOSPC: + if ((errno == ENOSPC) { /* * Our buffer is not big enough, acltxtsize should be updated with the value * the aclx_printStr really need. So we increase the buffer and try again. */ - jcr->acl_data->u.build->content = - check_pool_memory_size(jcr->acl_data->u.build->content, acltxtsize + 1); - if (aclx_printStr(jcr->acl_data->u.build->content, &acltxtsize, aclbuf, + jcr->acl_ctx->content = check_pool_memory_size(jcr->acl_ctx->content, acltxtsize + 1); + if (aclx_printStr(jcr->acl_ctx->content, &acltxtsize, aclbuf, aclsize, type, jcr->last_fname, 0) < 0) { - Mmsg1(jcr->errmsg, - _("Failed to convert acl into text on file \"%s\"\n"), + Mmsg1(jcr->errmsg, _("Failed to convert acl into text on file \"%s\"\n"), jcr->last_fname); - Dmsg2(100, "Failed to convert acl into text on file \"%s\": %ld\n", - jcr->last_fname, type.u64); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } - break; - default: - Mmsg1(jcr->errmsg, - _("Failed to convert acl into text on file \"%s\"\n"), + } else { + Mmsg1(jcr->errmsg, _("Failed to convert acl into text on file \"%s\"\n"), jcr->last_fname); - Dmsg2(100, "Failed to convert acl into text on file \"%s\": %ld\n", - jcr->last_fname, type.u64); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } } - jcr->acl_data->u.build->content_length = strlen(jcr->acl_data->u.build->content) + 1; + jcr->acl_ctx->content_length = strlen(jcr->acl_ctx->content) + 1; switch (type.u64) { case ACL_AIXC: retval = send_acl_stream(jcr, STREAM_ACL_AIX_AIXC); @@ -316,7 +297,7 @@ static bacl_exit_code aix_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) break; } -bail_out: +get_out: free_pool_memory(aclbuf); return retval; @@ -348,7 +329,7 @@ static inline bool aix_query_acl_support(JCR *jcr, return false; } -static bacl_exit_code aix_parse_acl_streams(JCR *jcr, +static bacl_rtn_code aix_restore_acl_streams(JCR *jcr, int stream, char *content, uint32_t content_length) @@ -356,7 +337,7 @@ static bacl_exit_code aix_parse_acl_streams(JCR *jcr, int cnt; acl_type_t type; size_t aclsize; - bacl_exit_code retval = bacl_exit_error; + bacl_rtn_code retval = bacl_rtn_error; POOLMEM *aclbuf = get_pool_memory(PM_MESSAGE); switch (stream) { @@ -365,17 +346,17 @@ static bacl_exit_code aix_parse_acl_streams(JCR *jcr, * Handle the old stream using the old system call for now. */ if (acl_put(jcr->last_fname, content, 0) != 0) { - retval = bacl_exit_error; - goto bail_out; + retval = bacl_rtn_error; + goto get_out; } - retval = bacl_exit_ok; - goto bail_out; + retval = bacl_rtn_ok; + goto get_out; case STREAM_ACL_AIX_AIXC: if (!aix_query_acl_support(jcr, ACL_AIXC, &type)) { Mmsg1(jcr->errmsg, _("Trying to restore POSIX acl on file \"%s\" on filesystem without AIXC acl support\n"), jcr->last_fname); - goto bail_out; + goto get_out; } break; case STREAM_ACL_AIX_NFS4: @@ -383,12 +364,12 @@ static bacl_exit_code aix_parse_acl_streams(JCR *jcr, Mmsg1(jcr->errmsg, _("Trying to restore NFSv4 acl on file \"%s\" on filesystem without NFS4 acl support\n"), jcr->last_fname); - goto bail_out; + goto get_out; } break; default: - goto bail_out; - } /* end switch (stream) */ + goto get_out; + } /* * Set the acl buffer to an initial size. For now we set it @@ -398,9 +379,7 @@ static bacl_exit_code aix_parse_acl_streams(JCR *jcr, aclsize = content_length; if (aclx_scanStr(content, aclbuf, &aclsize, type) < 0) { berrno be; - - switch (errno) { - case ENOSPC: + if (errno == ENOSPC) { /* * The buffer isn't big enough. The man page doesn't say that aclsize * is updated to the needed size as what is done with aclx_printStr. @@ -419,65 +398,46 @@ static bacl_exit_code aix_parse_acl_streams(JCR *jcr, * See why we failed this time, ENOSPC retry if max retries not met, * otherwise abort. */ - switch (errno) { - case ENOSPC: - if (cnt < 3) { - continue; - } - /* - * FALLTHROUGH - */ - default: - Mmsg2(jcr->errmsg, - _("aclx_scanStr error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror(errno)); - Dmsg2(100, "aclx_scanStr error file=%s ERR=%s\n", - jcr->last_fname, be.bstrerror()); - goto bail_out; + if (errno == ENOSPC && cnt < 3) { + continue; } + Mmsg2(jcr->errmsg, _("aclx_scanStr error on file \"%s\": ERR=%s\n"), + jcr->last_fname, be.bstrerror(errno)); + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } - break; - default: - Mmsg2(jcr->errmsg, - _("aclx_scanStr error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "aclx_scanStr error file=%s ERR=%s\n", + } else { + Mmsg2(jcr->errmsg, _("aclx_scanStr error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); + Dmsg1(100, "%s", jcr->errmsg); + goto get_out } } if (aclx_put(jcr->last_fname, SET_ACL, type, aclbuf, aclsize, 0) < 0) { berrno be; - - switch (errno) { - case ENOENT: - retval = bacl_exit_ok; - goto bail_out; - case ENOSYS: + if (errno == ENOENT) { + retval = bacl_rtn_ok; + } else if (ENOSYS) { /* * If the filesystem reports it doesn't support ACLs we clear the * BACL_FLAG_RESTORE_NATIVE flag so we skip ACL restores on all other files * on the same filesystem. The BACL_FLAG_RESTORE_NATIVE flag gets set again * when we change from one filesystem to an other. */ - jcr->acl_data->flags &= ~BACL_FLAG_RESTORE_NATIVE; - retval = bacl_exit_ok; - goto bail_out; - default: - Mmsg2(jcr->errmsg, - _("aclx_put error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "aclx_put error file=%s ERR=%s\n", + jcr->acl_ctx->flags &= ~BACL_FLAG_RESTORE_NATIVE; + } else { + Mmsg2(jcr->errmsg, _("aclx_put error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } } - retval = bacl_exit_ok; + retval = bacl_rtn_ok; -bail_out: +get_out: free_pool_memory(aclbuf); - return retval; } @@ -495,40 +455,40 @@ static int os_default_acl_streams[1] = { -1 }; -static bacl_exit_code aix_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) +static bacl_rtn_code aix_backup_acl_streams(JCR *jcr, FF_PKT *ff_pkt) { char *acl_text; if ((acl_text = acl_get(jcr->last_fname)) != NULL) { - jcr->acl_data->u.build->content_length = - pm_strcpy(jcr->acl_data->u.build->content, acl_text); + jcr->acl_ctx->content_length = + pm_strcpy(jcr->acl_ctx->content, acl_text); actuallyfree(acl_text); return send_acl_stream(jcr, STREAM_ACL_AIX_TEXT); } - return bacl_exit_error; + return bacl_rtn_error; } -static bacl_exit_code aix_parse_acl_streams(JCR *jcr, +static bacl_rtn_code aix_restore_acl_streams(JCR *jcr, int stream, char *content, uint32_t content_length) { if (acl_put(jcr->last_fname, content, 0) != 0) { - return bacl_exit_error; + return bacl_rtn_error; } - return bacl_exit_ok; + return bacl_rtn_ok; } #endif /* HAVE_EXTENDED_ACL */ /* * For this OS setup the build and parse function pointer to the OS specific functions. */ -static bacl_exit_code (*os_build_acl_streams) +static bacl_rtn_code (*os_backup_acl_streams) (JCR *jcr, FF_PKT *ff_pkt) = - aix_build_acl_streams; -static bacl_exit_code (*os_parse_acl_streams) + aix_backup_acl_streams; +static bacl_rtn_code (*os_restore_acl_streams) (JCR *jcr, int stream, char *content, uint32_t content_length) = - aix_parse_acl_streams; + aix_restore_acl_streams; #elif defined(HAVE_DARWIN_OS) || \ defined(HAVE_FREEBSD_OS) || \ @@ -744,20 +704,20 @@ static bool acl_is_trivial(acl_t acl) } #endif -/** +/* * Generic wrapper around acl_get_file call. */ -static bacl_exit_code generic_get_acl_from_os(JCR *jcr, bacl_type acltype) +static bacl_rtn_code generic_get_acl_from_os(JCR *jcr, bacl_type acltype) { acl_t acl; acl_type_t ostype; char *acl_text; - bacl_exit_code retval = bacl_exit_ok; + bacl_rtn_code retval = bacl_rtn_ok; ostype = bac_to_os_acltype(acltype); acl = acl_get_file(jcr->last_fname, ostype); if (acl) { - /** + /* * From observation, IRIX's acl_get_file() seems to return a * non-NULL acl with a count field of -1 when a file has no ACL * defined, while IRIX's acl_to_text() returns NULL when presented @@ -767,31 +727,29 @@ static bacl_exit_code generic_get_acl_from_os(JCR *jcr, bacl_type acltype) * zero entries in the acl returned. */ if (acl_count_entries(acl) <= 0) { - goto bail_out; + goto get_out; } /* * Make sure this is not just a trivial ACL. */ -#if !defined(HAVE_DARWIN_OS) +#ifndef HAVE_DARWIN_OS if (acltype == BACL_TYPE_ACCESS && acl_is_trivial(acl)) { /* * The ACLs simply reflect the (already known) standard permissions * So we don't send an ACL stream to the SD. */ - goto bail_out; + goto get_out; } #endif + #if defined(HAVE_FREEBSD_OS) && defined(_PC_ACL_NFS4) if (acltype == BACL_TYPE_NFS4) { int trivial; if (acl_is_trivial_np(acl, &trivial) == 0) { + /* Trivial ACLS are standard permissions. Do not send to SD. */ if (trivial == 1) { - /* - * The ACLs simply reflect the (already known) standard permissions - * So we don't send an ACL stream to the SD. - */ - goto bail_out; + goto get_out; } } } @@ -801,22 +759,19 @@ static bacl_exit_code generic_get_acl_from_os(JCR *jcr, bacl_type acltype) * Convert the internal acl representation into a text representation. */ if ((acl_text = acl_to_text(acl, NULL)) != NULL) { - jcr->acl_data->u.build->content_length = - pm_strcpy(jcr->acl_data->u.build->content, acl_text); + jcr->acl_ctx->content_length = + pm_strcpy(jcr->acl_ctx->content, acl_text); acl_free(acl); acl_free(acl_text); - return bacl_exit_ok; + return bacl_rtn_ok; } berrno be; Mmsg2(jcr->errmsg, _("acl_to_text error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg2(100, "acl_to_text error file=%s ERR=%s\n", - jcr->last_fname, be.bstrerror()); - - retval = bacl_exit_error; - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + retval = bacl_rtn_error; } else { berrno be; @@ -824,7 +779,6 @@ static bacl_exit_code generic_get_acl_from_os(JCR *jcr, bacl_type acltype) * Handle errors gracefully. */ switch (errno) { -#if defined(BACL_ENOTSUP) case BACL_ENOTSUP: /* * If the filesystem reports it doesn't support ACLs we clear the @@ -832,37 +786,33 @@ static bacl_exit_code generic_get_acl_from_os(JCR *jcr, bacl_type acltype) * on the same filesystem. The BACL_FLAG_SAVE_NATIVE flag gets set again * when we change from one filesystem to an other. */ - jcr->acl_data->flags &= ~BACL_FLAG_SAVE_NATIVE; - goto bail_out; -#endif + jcr->acl_ctx->flags &= ~BACL_FLAG_SAVE_NATIVE; + break; case ENOENT: - goto bail_out; + break; default: /* Some real error */ - Mmsg2(jcr->errmsg, - _("acl_get_file error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "acl_get_file error file=%s ERR=%s\n", - jcr->last_fname, be.bstrerror()); - - retval = bacl_exit_error; - goto bail_out; + Mmsg2(jcr->errmsg, _("acl_get_file error on file \"%s\": ERR=%s\n"), + jcr->last_fname, be.bstrerror()); + Dmsg1(100, "%s", jcr->errmsg); + retval = bacl_rtn_error; + break; } } -bail_out: +get_out: if (acl) { acl_free(acl); } - pm_strcpy(jcr->acl_data->u.build->content, ""); - jcr->acl_data->u.build->content_length = 0; + pm_strcpy(jcr->acl_ctx->content, ""); + jcr->acl_ctx->content_length = 0; return retval; } -/** +/* * Generic wrapper around acl_set_file call. */ -static bacl_exit_code generic_set_acl_on_os(JCR *jcr, +static bacl_rtn_code generic_set_acl_on_os(JCR *jcr, bacl_type acltype, char *content, uint32_t content_length) @@ -876,14 +826,13 @@ static bacl_exit_code generic_set_acl_on_os(JCR *jcr, ostype = bac_to_os_acltype(acltype); if (ostype == ACL_TYPE_DEFAULT && strlen(content) == 0) { if (acl_delete_def_file(jcr->last_fname) == 0) { - return bacl_exit_ok; + return bacl_rtn_ok; } berrno be; switch (errno) { case ENOENT: - return bacl_exit_ok; -#if defined(BACL_ENOTSUP) + return bacl_rtn_ok; case BACL_ENOTSUP: /* * If the filesystem reports it doesn't support ACLs we clear the @@ -891,17 +840,16 @@ static bacl_exit_code generic_set_acl_on_os(JCR *jcr, * on the same filesystem. The BACL_FLAG_RESTORE_NATIVE flag gets set again * when we change from one filesystem to an other. */ - jcr->acl_data->flags &= ~BACL_FLAG_RESTORE_NATIVE; + jcr->acl_ctx->flags &= ~BACL_FLAG_RESTORE_NATIVE; Mmsg1(jcr->errmsg, _("acl_delete_def_file error on file \"%s\": filesystem doesn't support ACLs\n"), jcr->last_fname); - return bacl_exit_error; -#endif + return bacl_rtn_error; default: Mmsg2(jcr->errmsg, _("acl_delete_def_file error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - return bacl_exit_error; + return bacl_rtn_error; } } @@ -912,13 +860,12 @@ static bacl_exit_code generic_set_acl_on_os(JCR *jcr, Mmsg2(jcr->errmsg, _("acl_from_text error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg3(100, "acl_from_text error acl=%s file=%s ERR=%s\n", - content, jcr->last_fname, be.bstrerror()); - return bacl_exit_error; + Dmsg1(100, "%s", jcr->errmsg); + return bacl_rtn_error; } #ifndef HAVE_FREEBSD_OS - /** + /* * FreeBSD always fails acl_valid() - at least on valid input... * As it does the right thing, given valid input, just ignore acl_valid(). */ @@ -928,14 +875,13 @@ static bacl_exit_code generic_set_acl_on_os(JCR *jcr, Mmsg2(jcr->errmsg, _("acl_valid error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg3(100, "acl_valid error acl=%s file=%s ERR=%s\n", - content, jcr->last_fname, be.bstrerror()); + Dmsg1(100, "%s", jcr->errmsg); acl_free(acl); - return bacl_exit_error; + return bacl_rtn_error; } #endif - /** + /* * Restore the ACLs, but don't complain about links which really should * not have attributes, and the file it is linked to may not yet be restored. * This is only true for the old acl streams as in the new implementation we @@ -943,12 +889,10 @@ static bacl_exit_code generic_set_acl_on_os(JCR *jcr, */ if (acl_set_file(jcr->last_fname, ostype, acl) != 0 && jcr->last_type != FT_LNK) { berrno be; - switch (errno) { case ENOENT: acl_free(acl); - return bacl_exit_ok; -#if defined(BACL_ENOTSUP) + return bacl_rtn_ok; case BACL_ENOTSUP: /* * If the filesystem reports it doesn't support ACLs we clear the @@ -956,34 +900,30 @@ static bacl_exit_code generic_set_acl_on_os(JCR *jcr, * on the same filesystem. The BACL_FLAG_RESTORE_NATIVE flag gets set again * when we change from one filesystem to an other. */ - jcr->acl_data->flags &= ~BACL_FLAG_RESTORE_NATIVE; + jcr->acl_ctx->flags &= ~BACL_FLAG_RESTORE_NATIVE; Mmsg1(jcr->errmsg, _("acl_set_file error on file \"%s\": filesystem doesn't support ACLs\n"), jcr->last_fname); - Dmsg2(100, "acl_set_file error acl=%s file=%s filesystem doesn't support ACLs\n", - content, jcr->last_fname); + Dmsg1(100, "%s", jcr->errmsg); acl_free(acl); - return bacl_exit_error; -#endif + return bacl_rtn_error; default: - Mmsg2(jcr->errmsg, - _("acl_set_file error on file \"%s\": ERR=%s\n"), + Mmsg2(jcr->errmsg, _("acl_set_file error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg3(100, "acl_set_file error acl=%s file=%s ERR=%s\n", - content, jcr->last_fname, be.bstrerror()); + Dmsg1(100, "%s", jcr->errmsg); acl_free(acl); - return bacl_exit_error; + return bacl_rtn_error; } } acl_free(acl); - return bacl_exit_ok; + return bacl_rtn_ok; } -/** +/* * OS specific functions for handling different types of acl streams. */ #if defined(HAVE_DARWIN_OS) -/** +/* * Define the supported ACL streams for this OS */ static int os_access_acl_streams[1] = { @@ -993,10 +933,10 @@ static int os_default_acl_streams[1] = { -1 }; -static bacl_exit_code darwin_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) +static bacl_rtn_code darwin_backup_acl_streams(JCR *jcr, FF_PKT *ff_pkt) { #if defined(HAVE_ACL_TYPE_EXTENDED) - /** + /* * On MacOS X, acl_get_file (name, ACL_TYPE_ACCESS) * and acl_get_file (name, ACL_TYPE_DEFAULT) * always return NULL / EINVAL. There is no point in making @@ -1005,23 +945,23 @@ static bacl_exit_code darwin_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) * * Read access ACLs for files, dirs and links */ - if (generic_get_acl_from_os(jcr, BACL_TYPE_EXTENDED) == bacl_exit_fatal) - return bacl_exit_fatal; + if (generic_get_acl_from_os(jcr, BACL_TYPE_EXTENDED) == bacl_rtn_fatal) + return bacl_rtn_fatal; #else - /** + /* * Read access ACLs for files, dirs and links */ - if (generic_get_acl_from_os(jcr, BACL_TYPE_ACCESS) == bacl_exit_fatal) - return bacl_exit_fatal; + if (generic_get_acl_from_os(jcr, BACL_TYPE_ACCESS) == bacl_rtn_fatal) + return bacl_rtn_fatal; #endif - if (jcr->acl_data->u.build->content_length > 0) { + if (jcr->acl_ctx->content_length > 0) { return send_acl_stream(jcr, STREAM_ACL_DARWIN_ACCESS_ACL); } - return bacl_exit_ok; + return bacl_rtn_ok; } -static bacl_exit_code darwin_parse_acl_streams(JCR *jcr, +static bacl_rtn_code darwin_restore_acl_streams(JCR *jcr, int stream, char *content, uint32_t content_length) @@ -1036,12 +976,12 @@ static bacl_exit_code darwin_parse_acl_streams(JCR *jcr, /* * For this OS setup the build and parse function pointer to the OS specific functions. */ -static bacl_exit_code (*os_build_acl_streams) +static bacl_rtn_code (*os_backup_acl_streams) (JCR *jcr, FF_PKT *ff_pkt) = - darwin_build_acl_streams; -static bacl_exit_code (*os_parse_acl_streams) + darwin_backup_acl_streams; +static bacl_rtn_code (*os_restore_acl_streams) (JCR *jcr, int stream, char *content, uint32_t content_length) = - darwin_parse_acl_streams; + darwin_restore_acl_streams; #elif defined(HAVE_FREEBSD_OS) /* @@ -1055,7 +995,7 @@ static int os_default_acl_streams[1] = { STREAM_ACL_FREEBSD_DEFAULT_ACL }; -static bacl_exit_code freebsd_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) +static bacl_rtn_code freebsd_backup_acl_streams(JCR *jcr, FF_PKT *ff_pkt) { int acl_enabled = 0; bacl_type acltype = BACL_TYPE_NONE; @@ -1065,27 +1005,18 @@ static bacl_exit_code freebsd_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) * See if filesystem supports NFS4 acls. */ acl_enabled = pathconf(jcr->last_fname, _PC_ACL_NFS4); - switch (acl_enabled) { - case -1: { + if (acl_enabled < 0) { berrno be; - - switch (errno) { - case ENOENT: - return bacl_exit_ok; - default: - Mmsg2(jcr->errmsg, - _("pathconf error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "pathconf error file=%s ERR=%s\n", + if (errno == ENOENT) { + return bacl_rtn_ok; + } else { + Mmsg2(jcr->errmsg, _("pathconf error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - return bacl_exit_error; + Dmsg1(100, "%s", jcr->errmsg); + return bacl_rtn_error; } - } - case 0: - break; - default: + } else if (acl_enabled != 0) { acltype = BACL_TYPE_NFS4; - break; } #endif @@ -1094,27 +1025,18 @@ static bacl_exit_code freebsd_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) * See if filesystem supports POSIX acls. */ acl_enabled = pathconf(jcr->last_fname, _PC_ACL_EXTENDED); - switch (acl_enabled) { - case -1: { + if (acl_enabled < 0) { berrno be; - - switch (errno) { - case ENOENT: - return bacl_exit_ok; - default: - Mmsg2(jcr->errmsg, - _("pathconf error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "pathconf error file=%s ERR=%s\n", + if (errno == ENOENT) { + return bacl_rtn_ok; + } else { + Mmsg2(jcr->errmsg, _("pathconf error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - return bacl_exit_error; + Dmsg1(100, "%s", jcr->errmsg); + return bacl_rtn_error; } - } - case 0: - break; - default: + } else if (acl_enabled != 0) { acltype = BACL_TYPE_ACCESS; - break; } } @@ -1125,10 +1047,10 @@ static bacl_exit_code freebsd_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) * when we change from one filesystem to an other. */ if (acl_enabled == 0) { - jcr->acl_data->flags &= ~BACL_FLAG_SAVE_NATIVE; - pm_strcpy(jcr->acl_data->u.build->content, ""); - jcr->acl_data->u.build->content_length = 0; - return bacl_exit_ok; + jcr->acl_ctx->flags &= ~BACL_FLAG_SAVE_NATIVE; + pm_strcpy(jcr->acl_ctx->content, ""); + jcr->acl_ctx->content_length = 0; + return bacl_rtn_ok; } /* @@ -1139,35 +1061,35 @@ static bacl_exit_code freebsd_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) /* * Read NFS4 ACLs for files, dirs and links */ - if (generic_get_acl_from_os(jcr, BACL_TYPE_NFS4) == bacl_exit_fatal) - return bacl_exit_fatal; + if (generic_get_acl_from_os(jcr, BACL_TYPE_NFS4) == bacl_rtn_fatal) + return bacl_rtn_fatal; - if (jcr->acl_data->u.build->content_length > 0) { - if (send_acl_stream(jcr, STREAM_ACL_FREEBSD_NFS4_ACL) == bacl_exit_fatal) - return bacl_exit_fatal; + if (jcr->acl_ctx->content_length > 0) { + if (send_acl_stream(jcr, STREAM_ACL_FREEBSD_NFS4_ACL) == bacl_rtn_fatal) + return bacl_rtn_fatal; } break; case BACL_TYPE_ACCESS: /* * Read access ACLs for files, dirs and links */ - if (generic_get_acl_from_os(jcr, BACL_TYPE_ACCESS) == bacl_exit_fatal) - return bacl_exit_fatal; + if (generic_get_acl_from_os(jcr, BACL_TYPE_ACCESS) == bacl_rtn_fatal) + return bacl_rtn_fatal; - if (jcr->acl_data->u.build->content_length > 0) { - if (send_acl_stream(jcr, STREAM_ACL_FREEBSD_ACCESS_ACL) == bacl_exit_fatal) - return bacl_exit_fatal; + if (jcr->acl_ctx->content_length > 0) { + if (send_acl_stream(jcr, STREAM_ACL_FREEBSD_ACCESS_ACL) == bacl_rtn_fatal) + return bacl_rtn_fatal; } /* * Directories can have default ACLs too */ if (ff_pkt->type == FT_DIREND) { - if (generic_get_acl_from_os(jcr, BACL_TYPE_DEFAULT) == bacl_exit_fatal) - return bacl_exit_fatal; - if (jcr->acl_data->u.build->content_length > 0) { - if (send_acl_stream(jcr, STREAM_ACL_FREEBSD_DEFAULT_ACL) == bacl_exit_fatal) - return bacl_exit_fatal; + if (generic_get_acl_from_os(jcr, BACL_TYPE_DEFAULT) == bacl_rtn_fatal) + return bacl_rtn_fatal; + if (jcr->acl_ctx->content_length > 0) { + if (send_acl_stream(jcr, STREAM_ACL_FREEBSD_DEFAULT_ACL) == bacl_rtn_fatal) + return bacl_rtn_fatal; } } break; @@ -1175,10 +1097,10 @@ static bacl_exit_code freebsd_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) break; } - return bacl_exit_ok; + return bacl_rtn_ok; } -static bacl_exit_code freebsd_parse_acl_streams(JCR *jcr, +static bacl_rtn_code freebsd_restore_acl_streams(JCR *jcr, int stream, char *content, uint32_t content_length) @@ -1208,36 +1130,28 @@ static bacl_exit_code freebsd_parse_acl_streams(JCR *jcr, break; } - switch (acl_enabled) { - case -1: { + if (acl_enabled < 0) { berrno be; - - switch (errno) { - case ENOENT: - return bacl_exit_ok; - default: - Mmsg2(jcr->errmsg, - _("pathconf error on file \"%s\": ERR=%s\n"), + if (errno == ENOENT) { + return bacl_rtn_ok; + } else { + Mmsg2(jcr->errmsg, _("pathconf error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg3(100, "pathconf error acl=%s file=%s ERR=%s\n", - content, jcr->last_fname, be.bstrerror()); - return bacl_exit_error; + Dmsg1(100, "%s", jcr->errmsg); + return bacl_rtn_error; } - } - case 0: + } else if (acl_enabled == 0) { /* * If the filesystem reports it doesn't support ACLs we clear the * BACL_FLAG_RESTORE_NATIVE flag so we skip ACL restores on all other files * on the same filesystem. The BACL_FLAG_RESTORE_NATIVE flag gets set again * when we change from one filesystem to an other. */ - jcr->acl_data->flags &= ~BACL_FLAG_SAVE_NATIVE; + jcr->acl_ctx->flags &= ~BACL_FLAG_SAVE_NATIVE; Mmsg2(jcr->errmsg, _("Trying to restore acl on file \"%s\" on filesystem without %s acl support\n"), jcr->last_fname, acl_type_name); - return bacl_exit_error; - default: - break; + return bacl_rtn_error; } /* @@ -1255,18 +1169,18 @@ static bacl_exit_code freebsd_parse_acl_streams(JCR *jcr, default: break; } - return bacl_exit_error; + return bacl_rtn_error; } /* * For this OSes setup the build and parse function pointer to the OS specific functions. */ -static bacl_exit_code (*os_build_acl_streams) +static bacl_rtn_code (*os_backup_acl_streams) (JCR *jcr, FF_PKT *ff_pkt) = - freebsd_build_acl_streams; -static bacl_exit_code (*os_parse_acl_streams) + freebsd_backup_acl_streams; +static bacl_rtn_code (*os_restore_acl_streams) (JCR *jcr, int stream, char *content, uint32_t content_length) = - freebsd_parse_acl_streams; + freebsd_restore_acl_streams; #elif defined(HAVE_IRIX_OS) || \ defined(HAVE_LINUX_OS) || \ @@ -1275,56 +1189,44 @@ static bacl_exit_code (*os_parse_acl_streams) * Define the supported ACL streams for these OSes */ #if defined(HAVE_IRIX_OS) -static int os_access_acl_streams[1] = { - STREAM_ACL_IRIX_ACCESS_ACL -}; -static int os_default_acl_streams[1] = { - STREAM_ACL_IRIX_DEFAULT_ACL -}; +static int os_access_acl_streams[1] = {STREAM_ACL_IRIX_ACCESS_ACL}; +static int os_default_acl_streams[1] = {STREAM_ACL_IRIX_DEFAULT_ACL}; #elif defined(HAVE_LINUX_OS) -static int os_access_acl_streams[1] = { - STREAM_ACL_LINUX_ACCESS_ACL -}; -static int os_default_acl_streams[1] = { - STREAM_ACL_LINUX_DEFAULT_ACL -}; +static int os_access_acl_streams[1] = {STREAM_ACL_LINUX_ACCESS}; +static int os_default_acl_streams[1] = {STREAM_ACL_LINUX_DEFAULT}; #elif defined(HAVE_HURD_OS) -static int os_access_acl_streams[1] = { - STREAM_ACL_HURD_ACCESS_ACL -}; -static int os_default_acl_streams[1] = { - STREAM_ACL_HURD_DEFAULT_ACL -}; +static int os_access_acl_streams[1] = {STREAM_ACL_HURD_ACCESS}; +static int os_default_acl_streams[1] = {STREAM_ACL_HURD_DEFAULT}; #endif -static bacl_exit_code generic_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) +static bacl_rtn_code generic_backup_acl_streams(JCR *jcr, FF_PKT *ff_pkt) { /* * Read access ACLs for files, dirs and links */ - if (generic_get_acl_from_os(jcr, BACL_TYPE_ACCESS) == bacl_exit_fatal) - return bacl_exit_fatal; + if (generic_get_acl_from_os(jcr, BACL_TYPE_ACCESS) == bacl_rtn_fatal) + return bacl_rtn_fatal; - if (jcr->acl_data->u.build->content_length > 0) { - if (send_acl_stream(jcr, os_access_acl_streams[0]) == bacl_exit_fatal) - return bacl_exit_fatal; + if (jcr->acl_ctx->content_length > 0) { + if (send_acl_stream(jcr, os_access_acl_streams[0]) == bacl_rtn_fatal) + return bacl_rtn_fatal; } /* * Directories can have default ACLs too */ if (ff_pkt->type == FT_DIREND) { - if (generic_get_acl_from_os(jcr, BACL_TYPE_DEFAULT) == bacl_exit_fatal) - return bacl_exit_fatal; - if (jcr->acl_data->u.build->content_length > 0) { - if (send_acl_stream(jcr, os_default_acl_streams[0]) == bacl_exit_fatal) - return bacl_exit_fatal; + if (generic_get_acl_from_os(jcr, BACL_TYPE_DEFAULT) == bacl_rtn_fatal) + return bacl_rtn_fatal; + if (jcr->acl_ctx->content_length > 0) { + if (send_acl_stream(jcr, os_default_acl_streams[0]) == bacl_rtn_fatal) + return bacl_rtn_fatal; } } - return bacl_exit_ok; + return bacl_rtn_ok; } -static bacl_exit_code generic_parse_acl_streams(JCR *jcr, +static bacl_rtn_code generic_restore_acl_streams(JCR *jcr, int stream, char *content, uint32_t content_length) @@ -1352,18 +1254,18 @@ static bacl_exit_code generic_parse_acl_streams(JCR *jcr, } break; } - return bacl_exit_error; + return bacl_rtn_error; } /* * For this OSes setup the build and parse function pointer to the OS specific functions. */ -static bacl_exit_code (*os_build_acl_streams) +static bacl_rtn_code (*os_backup_acl_streams) (JCR *jcr, FF_PKT *ff_pkt) = - generic_build_acl_streams; -static bacl_exit_code (*os_parse_acl_streams) + generic_backup_acl_streams; +static bacl_rtn_code (*os_restore_acl_streams) (JCR *jcr, int stream, char *content, uint32_t content_length) = - generic_parse_acl_streams; + generic_restore_acl_streams; #elif defined(HAVE_OSF1_OS) @@ -1378,44 +1280,44 @@ static int os_default_acl_streams[2] = { STREAM_ACL_TRU64_DEFAULT_DIR_ACL }; -static bacl_exit_code tru64_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) +static bacl_rtn_code tru64_backup_acl_streams(JCR *jcr, FF_PKT *ff_pkt) { /* * Read access ACLs for files, dirs and links */ - if (generic_get_acl_from_os(jcr, BACL_TYPE_ACCESS) == bacl_exit_fatal) { - return bacl_exit_error; - if (jcr->acl_data->u.build->content_length > 0) { + if (generic_get_acl_from_os(jcr, BACL_TYPE_ACCESS) == bacl_rtn_fatal) { + return bacl_rtn_error; + if (jcr->acl_ctx->content_length > 0) { if (!send_acl_stream(jcr, STREAM_ACL_TRU64_ACCESS_ACL)) - return bacl_exit_error; + return bacl_rtn_error; } /* * Directories can have default ACLs too */ if (ff_pkt->type == FT_DIREND) { - if (generic_get_acl_from_os(jcr, BACL_TYPE_DEFAULT) == bacl_exit_fatal) { - return bacl_exit_error; - if (jcr->acl_data->u.build->content_length > 0) { + if (generic_get_acl_from_os(jcr, BACL_TYPE_DEFAULT) == bacl_rtn_fatal) { + return bacl_rtn_error; + if (jcr->acl_ctx->content_length > 0) { if (!send_acl_stream(jcr, STREAM_ACL_TRU64_DEFAULT_ACL)) - return bacl_exit_error; + return bacl_rtn_error; } - /** + /* * Tru64 has next to BACL_TYPE_DEFAULT also BACL_TYPE_DEFAULT_DIR acls. * This is an inherited acl for all subdirs. * See http://www.helsinki.fi/atk/unix/dec_manuals/DOC_40D/AQ0R2DTE/DOCU_018.HTM * Section 21.5 Default ACLs */ - if (generic_get_acl_from_os(jcr, BACL_TYPE_DEFAULT_DIR) == bacl_exit_fatal) { - return bacl_exit_error; - if (jcr->acl_data->u.build->content_length > 0) { + if (generic_get_acl_from_os(jcr, BACL_TYPE_DEFAULT_DIR) == bacl_rtn_fatal) { + return bacl_rtn_error; + if (jcr->acl_ctx->content_length > 0) { if (!send_acl_stream(jcr, STREAM_ACL_TRU64_DEFAULT_DIR_ACL)) - return bacl_exit_error; + return bacl_rtn_error; } } - return bacl_exit_ok; + return bacl_rtn_ok; } -static bacl_exit_code tru64_parse_acl_streams(JCR *jcr, +static bacl_rtn_code tru64_restore_acl_streams(JCR *jcr, int stream, char *content, uint32_t content_length) @@ -1434,12 +1336,12 @@ static bacl_exit_code tru64_parse_acl_streams(JCR *jcr, /* * For this OS setup the build and parse function pointer to the OS specific functions. */ -static bacl_exit_code (*os_build_acl_streams) +static bacl_rtn_code (*os_backup_acl_streams) (JCR *jcr, FF_PKT *ff_pkt) = - tru64_build_acl_streams; -static bacl_exit_code (*os_parse_acl_streams) + tru64_backup_acl_streams; +static bacl_rtn_code (*os_restore_acl_streams) (JCR *jcr, int stream, char *content, uint32_t content_length) = - tru64_parse_acl_streams; + tru64_restore_acl_streams; #endif @@ -1487,7 +1389,7 @@ static bool acl_is_trivial(int count, struct acl_entry *entries, struct stat sb) /* * OS specific functions for handling different types of acl streams. */ -static bacl_exit_code hpux_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) +static bacl_rtn_code hpux_backup_acl_streams(JCR *jcr, FF_PKT *ff_pkt) { int n; struct acl_entry acls[NACLENTRIES]; @@ -1495,9 +1397,7 @@ static bacl_exit_code hpux_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) if ((n = getacl(jcr->last_fname, 0, acls)) < 0) { berrno be; - switch (errno) { -#if defined(BACL_ENOTSUP) case BACL_ENOTSUP: /* * Not supported, just pretend there is nothing to see @@ -1507,31 +1407,27 @@ static bacl_exit_code hpux_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) * on the same filesystem. The BACL_FLAG_SAVE_NATIVE flag gets set again * when we change from one filesystem to an other. */ - jcr->acl_data->flags &= ~BACL_FLAG_SAVE_NATIVE; - pm_strcpy(jcr->acl_data->u.build->content, ""); - jcr->acl_data->u.build->content_length = 0; - return bacl_exit_ok; -#endif + jcr->acl_ctx->flags &= ~BACL_FLAG_SAVE_NATIVE; + pm_strcpy(jcr->acl_ctx->content, ""); + jcr->acl_ctx->content_length = 0; + return bacl_rtn_ok; case ENOENT: - pm_strcpy(jcr->acl_data->u.build->content, ""); - jcr->acl_data->u.build->content_length = 0; - return bacl_exit_ok; + pm_strcpy(jcr->acl_ctx->content, ""); + jcr->acl_ctx->content_length = 0; + return bacl_rtn_ok; default: - Mmsg2(jcr->errmsg, - _("getacl error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "getacl error file=%s ERR=%s\n", + Mmsg2(jcr->errmsg, _("getacl error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - - pm_strcpy(jcr->acl_data->u.build->content, ""); - jcr->acl_data->u.build->content_length = 0; - return bacl_exit_error; + Dmsg1(100, "%s", jcr->errmsg); + pm_strcpy(jcr->acl_ctx->content, ""); + jcr->acl_ctx->content_length = 0; + return bacl_rtn_error; } } if (n == 0) { - pm_strcpy(jcr->acl_data->u.build->content, ""); - jcr->acl_data->u.build->content_length = 0; - return bacl_exit_ok; + pm_strcpy(jcr->acl_ctx->content, ""); + jcr->acl_ctx->content_length = 0; + return bacl_rtn_ok; } if ((n = getacl(jcr->last_fname, n, acls)) > 0) { if (acl_is_trivial(n, acls, ff_pkt->statp)) { @@ -1539,30 +1435,28 @@ static bacl_exit_code hpux_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) * The ACLs simply reflect the (already known) standard permissions * So we don't send an ACL stream to the SD. */ - pm_strcpy(jcr->acl_data->u.build->content, ""); - jcr->acl_data->u.build->content_length = 0; - return bacl_exit_ok; + pm_strcpy(jcr->acl_ctx->content, ""); + jcr->acl_ctx->content_length = 0; + return bacl_rtn_ok; } if ((acl_text = acltostr(n, acls, FORM_SHORT)) != NULL) { - jcr->acl_data->u.build->content_length = - pm_strcpy(jcr->acl_data->u.build->content, acl_text); + jcr->acl_ctx->content_length = + pm_strcpy(jcr->acl_ctx->content, acl_text); actuallyfree(acl_text); return send_acl_stream(jcr, STREAM_ACL_HPUX_ACL_ENTRY); } berrno be; - Mmsg2(jcr->errmsg, - _("acltostr error on file \"%s\": ERR=%s\n"), + Mmsg2(jcr->errmsg, _("acltostr error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg3(100, "acltostr error acl=%s file=%s ERR=%s\n", - jcr->acl_data->u.build->content, jcr->last_fname, be.bstrerror()); - return bacl_exit_error; + Dmsg1(100, "%s", jcr->errmsg); + return bacl_rtn_error; } - return bacl_exit_error; + return bacl_rtn_error; } -static bacl_exit_code hpux_parse_acl_streams(JCR *jcr, +static bacl_rtn_code hpux_restore_acl_streams(JCR *jcr, int stream, char *content, uint32_t content_length) @@ -1573,26 +1467,19 @@ static bacl_exit_code hpux_parse_acl_streams(JCR *jcr, n = strtoacl(content, 0, NACLENTRIES, acls, ACL_FILEOWNER, ACL_FILEGROUP); if (n <= 0) { berrno be; - - Mmsg2(jcr->errmsg, - _("strtoacl error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg3(100, "strtoacl error acl=%s file=%s ERR=%s\n", - content, jcr->last_fname, be.bstrerror()); - return bacl_exit_error; + Mmsg2(jcr->errmsg, _("strtoacl error on file \"%s\": ERR=%s\n"), + jcr->last_fname, be.bstrerror()); + Dmsg1(100, "%s", jcr->errmsg); + return bacl_rtn_error; } if (strtoacl(content, n, NACLENTRIES, acls, ACL_FILEOWNER, ACL_FILEGROUP) != n) { berrno be; - - Mmsg2(jcr->errmsg, - _("strtoacl error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg3(100, "strtoacl error acl=%s file=%s ERR=%s\n", - content, jcr->last_fname, be.bstrerror()); - - return bacl_exit_error; + Mmsg2(jcr->errmsg, _("strtoacl error on file \"%s\": ERR=%s\n"), + jcr->last_fname, be.bstrerror()); + Dmsg1(100, "%s", jcr->errmsg); + return bacl_rtn_error; } - /** + /* * Restore the ACLs, but don't complain about links which really should * not have attributes, and the file it is linked to may not yet be restored. * This is only true for the old acl streams as in the new implementation we @@ -1603,8 +1490,7 @@ static bacl_exit_code hpux_parse_acl_streams(JCR *jcr, switch (errno) { case ENOENT: - return bacl_exit_ok; -#if defined(BACL_ENOTSUP) + return bacl_rtn_ok; case BACL_ENOTSUP: /* * If the filesystem reports it doesn't support ACLs we clear the @@ -1612,35 +1498,32 @@ static bacl_exit_code hpux_parse_acl_streams(JCR *jcr, * on the same filesystem. The BACL_FLAG_RESTORE_NATIVE flag gets set again * when we change from one filesystem to an other. */ - jcr->acl_data->flags &= ~BACL_FLAG_SAVE_NATIVE; + jcr->acl_ctx->flags &= ~BACL_FLAG_SAVE_NATIVE; Mmsg1(jcr->errmsg, _("setacl error on file \"%s\": filesystem doesn't support ACLs\n"), jcr->last_fname); - Dmsg2(100, "setacl error acl=%s file=%s filesystem doesn't support ACLs\n", - content, jcr->last_fname); - return bacl_exit_error; -#endif + Dmsg1(100, "%s", jcr->errmsg); + return bacl_rtn_error; default: - Mmsg2(jcr->errmsg, - _("setacl error on file \"%s\": ERR=%s\n"), + Mmsg2(jcr->errmsg, _("setacl error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg3(100, "setacl error acl=%s file=%s ERR=%s\n", - content, jcr->last_fname, be.bstrerror()); - return bacl_exit_error; + Dmsg1(100, "%s", jcr->errmsg); + return bacl_rtn_error; } } - return bacl_exit_ok; + return bacl_rtn_ok; } /* * For this OS setup the build and parse function pointer to the OS specific functions. */ -static bacl_exit_code (*os_build_acl_streams) +static bacl_rtn_code (*os_backup_acl_streams) (JCR *jcr, FF_PKT *ff_pkt) = - hpux_build_acl_streams; -static bacl_exit_code (*os_parse_acl_streams) + hpux_backup_acl_streams; + +static bacl_rtn_code (*os_restore_acl_streams) (JCR *jcr, int stream, char *content, uint32_t content_length) = - hpux_parse_acl_streams; + hpux_restore_acl_streams; #elif defined(HAVE_SUN_OS) #ifdef HAVE_SYS_ACL_H @@ -1650,7 +1533,7 @@ static bacl_exit_code (*os_parse_acl_streams) #endif #if defined(HAVE_EXTENDED_ACL) -/** +/* * We define some internals of the Solaris acl libs here as those * are not exposed yet. Probably because they want us to see the * acls as opague data. But as we need to support different platforms @@ -1669,7 +1552,7 @@ typedef enum acl_type { } acl_type_t; #endif -/** +/* * Two external references to functions in the libsec library function not in current include files. */ extern "C" { @@ -1688,70 +1571,59 @@ static int os_default_acl_streams[1] = { -1 }; -/** +/* * As the new libsec interface with acl_totext and acl_fromtext also handles * the old format from acltotext we can use the new functions even * for acls retrieved and stored in the database with older fd versions. If the * new interface is not defined (Solaris 9 and older we fall back to the old code) */ -static bacl_exit_code solaris_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) +static bacl_rtn_code solaris_backup_acl_streams(JCR *jcr, FF_PKT *ff_pkt) { int acl_enabled, flags; acl_t *aclp; char *acl_text; - bacl_exit_code stream_status = bacl_exit_error; + bacl_rtn_code stream_status = bacl_rtn_error; /* * See if filesystem supports acls. */ acl_enabled = pathconf(jcr->last_fname, _PC_ACL_ENABLED); - switch (acl_enabled) { - case 0: + if (acl_enabled == 0) { /* * If the filesystem reports it doesn't support ACLs we clear the * BACL_FLAG_SAVE_NATIVE flag so we skip ACL saves on all other files * on the same filesystem. The BACL_FLAG_SAVE_NATIVE flag gets set again * when we change from one filesystem to an other. */ - jcr->acl_data->flags &= ~BACL_FLAG_SAVE_NATIVE; - pm_strcpy(jcr->acl_data->u.build->content, ""); - jcr->acl_data->u.build->content_length = 0; - return bacl_exit_ok; - case -1: { + jcr->acl_ctx->flags &= ~BACL_FLAG_SAVE_NATIVE; + pm_strcpy(jcr->acl_ctx->content, ""); + jcr->acl_ctx->content_length = 0; + return bacl_rtn_ok; + } + if (acl_enabled < 0) { berrno be; - - switch (errno) { - case ENOENT: - return bacl_exit_ok; - default: - Mmsg2(jcr->errmsg, - _("pathconf error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "pathconf error file=%s ERR=%s\n", + if (errno == ENOENT) { + return bacl_rtn_ok; + } else { + Mmsg2(jcr->errmsg, _("pathconf error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - return bacl_exit_error; + Dmsg1(100, "%s", jcr->errmsg); + return bacl_rtn_error; } } - default: - break; - } /* * Get ACL info: don't bother allocating space if there is only a trivial ACL. */ if (acl_get(jcr->last_fname, ACL_NO_TRIVIAL, &aclp) != 0) { berrno be; - - switch (errno) { - case ENOENT: - return bacl_exit_ok; - default: - Mmsg2(jcr->errmsg, - _("acl_get error on file \"%s\": ERR=%s\n"), - jcr->last_fname, acl_strerror(errno)); - Dmsg2(100, "acl_get error file=%s ERR=%s\n", + if (errno == ENOENT) { + return bacl_rtn_ok; + } else { + Mmsg2(jcr->errmsg, _("acl_get error on file \"%s\": ERR=%s\n"), jcr->last_fname, acl_strerror(errno)); - return bacl_exit_error; + Dmsg1(100, "%s", jcr->errmsg); + return bacl_rtn_error; } } @@ -1760,9 +1632,9 @@ static bacl_exit_code solaris_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) * The ACLs simply reflect the (already known) standard permissions * So we don't send an ACL stream to the SD. */ - pm_strcpy(jcr->acl_data->u.build->content, ""); - jcr->acl_data->u.build->content_length = 0; - return bacl_exit_ok; + pm_strcpy(jcr->acl_ctx->content, ""); + jcr->acl_ctx->content_length = 0; + return bacl_rtn_ok; } #if defined(ACL_SID_FMT) @@ -1775,8 +1647,8 @@ static bacl_exit_code solaris_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) #endif /* ACL_SID_FMT */ if ((acl_text = acl_totext(aclp, flags)) != NULL) { - jcr->acl_data->u.build->content_length = - pm_strcpy(jcr->acl_data->u.build->content, acl_text); + jcr->acl_ctx->content_length = + pm_strcpy(jcr->acl_ctx->content, acl_text); actuallyfree(acl_text); switch (acl_type(aclp)) { @@ -1795,149 +1667,133 @@ static bacl_exit_code solaris_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) return stream_status; } -static bacl_exit_code solaris_parse_acl_streams(JCR *jcr, - int stream, - char *content, - uint32_t content_length) +static bacl_rtn_code solaris_restore_acl_streams(JCR *jcr, int stream, char *content, + uint32_t content_length) { acl_t *aclp; int acl_enabled, error; + if (stream != STREAM_UNIX_ACCESS_ACL || stream != STREAM_ACL_SOLARIS_ACLENT || + stream != STREAM_ACL_SOLARIS_ACE) { + return bacl_rtn_error; + } + + /* + * First make sure the filesystem supports acls. + */ + acl_enabled = pathconf(jcr->last_fname, _PC_ACL_ENABLED); + if (acl_enabled == 0) { + /* + * If the filesystem reports it doesn't support ACLs we clear the + * BACL_FLAG_RESTORE_NATIVE flag so we skip ACL restores on all other files + * on the same filesystem. The BACL_FLAG_RESTORE_NATIVE flag gets set again + * when we change from one filesystem to an other. + */ + jcr->acl_ctx->flags &= ~BACL_FLAG_RESTORE_NATIVE; + Mmsg1(jcr->errmsg, + _("Trying to restore acl on file \"%s\" on filesystem without acl support\n"), + jcr->last_fname); + return bacl_rtn_error; + } else if (acl_enabled < 0) { + berrno be; + if (errno == ENOENT) { + return bacl_rtn_ok; + } else { + Mmsg2(jcr->errmsg, _("pathconf error on file \"%s\": ERR=%s\n"), + jcr->last_fname, be.bstrerror()); + Dmsg1(100, "%s", jcr->errmsg); + return bacl_rtn_error; + } + } + /* + * On a filesystem with ACL support make sure this particular ACL type can be restored. + */ switch (stream) { - case STREAM_UNIX_ACCESS_ACL: case STREAM_ACL_SOLARIS_ACLENT: - case STREAM_ACL_SOLARIS_ACE: /* - * First make sure the filesystem supports acls. + * An aclent can be restored on filesystems with _ACL_ACLENT_ENABLED or _ACL_ACE_ENABLED support. */ - acl_enabled = pathconf(jcr->last_fname, _PC_ACL_ENABLED); - switch (acl_enabled) { - case 0: - /* - * If the filesystem reports it doesn't support ACLs we clear the - * BACL_FLAG_RESTORE_NATIVE flag so we skip ACL restores on all other files - * on the same filesystem. The BACL_FLAG_RESTORE_NATIVE flag gets set again - * when we change from one filesystem to an other. - */ - jcr->acl_data->flags &= ~BACL_FLAG_RESTORE_NATIVE; + if ((acl_enabled & (_ACL_ACLENT_ENABLED | _ACL_ACE_ENABLED)) == 0) { Mmsg1(jcr->errmsg, - _("Trying to restore acl on file \"%s\" on filesystem without acl support\n"), + _("Trying to restore POSIX acl on file \"%s\" on filesystem without aclent acl support\n"), jcr->last_fname); - return bacl_exit_error; - case -1: { - berrno be; - - switch (errno) { - case ENOENT: - return bacl_exit_ok; - default: - Mmsg2(jcr->errmsg, - _("pathconf error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg3(100, "pathconf error acl=%s file=%s ERR=%s\n", - content, jcr->last_fname, be.bstrerror()); - return bacl_exit_error; - } + return bacl_rtn_error; } - default: - /* - * On a filesystem with ACL support make sure this particular ACL type can be restored. - */ - switch (stream) { - case STREAM_ACL_SOLARIS_ACLENT: - /* - * An aclent can be restored on filesystems with _ACL_ACLENT_ENABLED or _ACL_ACE_ENABLED support. - */ - if ((acl_enabled & (_ACL_ACLENT_ENABLED | _ACL_ACE_ENABLED)) == 0) { - Mmsg1(jcr->errmsg, - _("Trying to restore POSIX acl on file \"%s\" on filesystem without aclent acl support\n"), - jcr->last_fname); - return bacl_exit_error; - } - break; - case STREAM_ACL_SOLARIS_ACE: - /* - * An ace can only be restored on a filesystem with _ACL_ACE_ENABLED support. - */ - if ((acl_enabled & _ACL_ACE_ENABLED) == 0) { - Mmsg1(jcr->errmsg, - _("Trying to restore NFSv4 acl on file \"%s\" on filesystem without ace acl support\n"), - jcr->last_fname); - return bacl_exit_error; - } - break; - default: - /* - * Stream id which doesn't describe the type of acl which is encoded. - */ - break; - } - break; + break; + case STREAM_ACL_SOLARIS_ACE: + /* + * An ace can only be restored on a filesystem with _ACL_ACE_ENABLED support. + */ + if ((acl_enabled & _ACL_ACE_ENABLED) == 0) { + Mmsg1(jcr->errmsg, + _("Trying to restore NFSv4 acl on file \"%s\" on filesystem without ace acl support\n"), + jcr->last_fname); + return bacl_rtn_error; } + break; + default: + /* + * Stream id which doesn't describe the type of acl which is encoded. + */ + break; + } - if ((error = acl_fromtext(content, &aclp)) != 0) { - Mmsg2(jcr->errmsg, - _("acl_fromtext error on file \"%s\": ERR=%s\n"), - jcr->last_fname, acl_strerror(error)); - Dmsg3(100, "acl_fromtext error acl=%s file=%s ERR=%s\n", - content, jcr->last_fname, acl_strerror(error)); - return bacl_exit_error; - } + if ((error = acl_fromtext(content, &aclp)) != 0) { + Mmsg2(jcr->errmsg, + _("acl_fromtext error on file \"%s\": ERR=%s\n"), + jcr->last_fname, acl_strerror(error)); + Dmsg1(100, "%s", jcr->errmsg); + return bacl_rtn_error; + } + /* + * Validate that the conversion gave us the correct acl type. + */ + switch (stream) { + case STREAM_ACL_SOLARIS_ACLENT: + if (acl_type(aclp) != ACLENT_T) { + Mmsg1(jcr->errmsg, + _("wrong encoding of acl type in acl stream on file \"%s\"\n"), + jcr->last_fname); + return bacl_rtn_error; + } + break; + case STREAM_ACL_SOLARIS_ACE: + if (acl_type(aclp) != ACE_T) { + Mmsg1(jcr->errmsg, + _("wrong encoding of acl type in acl stream on file \"%s\"\n"), + jcr->last_fname); + return bacl_rtn_error; + } + break; + default: /* - * Validate that the conversion gave us the correct acl type. + * Stream id which doesn't describe the type of acl which is encoded. */ - switch (stream) { - case STREAM_ACL_SOLARIS_ACLENT: - if (acl_type(aclp) != ACLENT_T) { - Mmsg1(jcr->errmsg, - _("wrong encoding of acl type in acl stream on file \"%s\"\n"), - jcr->last_fname); - return bacl_exit_error; - } - break; - case STREAM_ACL_SOLARIS_ACE: - if (acl_type(aclp) != ACE_T) { - Mmsg1(jcr->errmsg, - _("wrong encoding of acl type in acl stream on file \"%s\"\n"), - jcr->last_fname); - return bacl_exit_error; - } - break; - default: - /* - * Stream id which doesn't describe the type of acl which is encoded. - */ - break; - } + break; + } - /** - * Restore the ACLs, but don't complain about links which really should - * not have attributes, and the file it is linked to may not yet be restored. - * This is only true for the old acl streams as in the new implementation we - * don't save acls of symlinks (which cannot have acls anyhow) - */ - if ((error = acl_set(jcr->last_fname, aclp)) == -1 && jcr->last_type != FT_LNK) { - switch (errno) { - case ENOENT: - acl_free(aclp); - return bacl_exit_ok; - default: - Mmsg2(jcr->errmsg, - _("acl_set error on file \"%s\": ERR=%s\n"), - jcr->last_fname, acl_strerror(error)); - Dmsg3(100, "acl_set error acl=%s file=%s ERR=%s\n", - content, jcr->last_fname, acl_strerror(error)); - acl_free(aclp); - return bacl_exit_error; - } + /* + * Restore the ACLs, but don't complain about links which really should + * not have attributes, and the file it is linked to may not yet be restored. + * This is only true for the old acl streams as in the new implementation we + * don't save acls of symlinks (which cannot have acls anyhow) + */ + if ((error = acl_set(jcr->last_fname, aclp)) == -1 && jcr->last_type != FT_LNK) { + if (errno == ENOENT) { + acl_free(aclp); + return bacl_rtn_ok; + } else { + Mmsg2(jcr->errmsg, _("acl_set error on file \"%s\": ERR=%s\n"), + jcr->last_fname, acl_strerror(error)); + Dmsg1(100, "%s", jcr->errmsg); + acl_free(aclp); + return bacl_rtn_error; } + } - acl_free(aclp); - return bacl_exit_ok; - default: - return bacl_exit_error; - } /* end switch (stream) */ + acl_free(aclp); + return bacl_rtn_ok; } #else /* HAVE_EXTENDED_ACL */ @@ -1976,7 +1832,7 @@ static bool acl_is_trivial(int count, aclent_t *entries) /* * OS specific functions for handling different types of acl streams. */ -static bacl_exit_code solaris_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) +static bacl_rtn_code solaris_backup_acl_streams(JCR *jcr, FF_PKT *ff_pkt) { int n; aclent_t *acls; @@ -1984,7 +1840,7 @@ static bacl_exit_code solaris_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) n = acl(jcr->last_fname, GETACLCNT, 0, NULL); if (n < MIN_ACL_ENTRIES) { - return bacl_exit_error; + return bacl_rtn_error; } acls = (aclent_t *)malloc(n * sizeof(aclent_t)); @@ -1995,34 +1851,30 @@ static bacl_exit_code solaris_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) * So we don't send an ACL stream to the SD. */ free(acls); - pm_strcpy(jcr->acl_data->u.build->content, ""); - jcr->acl_data->u.build->content_length = 0; - return bacl_exit_ok; + pm_strcpy(jcr->acl_ctx->content, ""); + jcr->acl_ctx->content_length = 0; + return bacl_rtn_ok; } if ((acl_text = acltotext(acls, n)) != NULL) { - jcr->acl_data->u.build->content_length = - pm_strcpy(jcr->acl_data->u.build->content, acl_text); + jcr->acl_ctx->content_length = + pm_strcpy(jcr->acl_ctx->content, acl_text); actuallyfree(acl_text); free(acls); return send_acl_stream(jcr, STREAM_ACL_SOLARIS_ACLENT); } berrno be; - Mmsg2(jcr->errmsg, - _("acltotext error on file \"%s\": ERR=%s\n"), + Mmsg2(jcr->errmsg, _("acltotext error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg3(100, "acltotext error acl=%s file=%s ERR=%s\n", - jcr->acl_data->u.build->content, jcr->last_fname, be.bstrerror()); + Dmsg1(100, "%s", jcr->errmsg); } free(acls); - return bacl_exit_error; + return bacl_rtn_error; } -static bacl_exit_code solaris_parse_acl_streams(JCR *jcr, - int stream, - char *content, +static bacl_rtn_code solaris_restore_acl_streams(JCR *jcr, int stream, char *content, uint32_t content_length) { int n; @@ -2032,12 +1884,10 @@ static bacl_exit_code solaris_parse_acl_streams(JCR *jcr, if (!acls) { berrno be; - Mmsg2(jcr->errmsg, - _("aclfromtext error on file \"%s\": ERR=%s\n"), + Mmsg2(jcr->errmsg, _("aclfromtext error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg3(100, "aclfromtext error acl=%s file=%s ERR=%s\n", - content, jcr->last_fname, be.bstrerror()); - return bacl_exit_error; + Dmsg1(100, "%s", jcr->errmsg); + return bacl_rtn_error; } /* @@ -2046,35 +1896,31 @@ static bacl_exit_code solaris_parse_acl_streams(JCR *jcr, */ if (acl(jcr->last_fname, SETACL, n, acls) == -1 && jcr->last_type != FT_LNK) { berrno be; - - switch (errno) { - case ENOENT: + if (errno == ENOENT) { actuallyfree(acls); - return bacl_exit_ok; - default: - Mmsg2(jcr->errmsg, - _("acl(SETACL) error on file \"%s\": ERR=%s\n"), + return bacl_rtn_ok; + } else { + Mmsg2(jcr->errmsg, _("acl(SETACL) error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg3(100, "acl(SETACL) error acl=%s file=%s ERR=%s\n", - content, jcr->last_fname, be.bstrerror()); + Dmsg1(100, "%s", jcr->errmsg); actuallyfree(acls); - return bacl_exit_error; + return bacl_rtn_error; } } actuallyfree(acls); - return bacl_exit_ok; + return bacl_rtn_ok; } #endif /* HAVE_EXTENDED_ACL */ /* * For this OS setup the build and parse function pointer to the OS specific functions. */ -static bacl_exit_code (*os_build_acl_streams) +static bacl_rtn_code (*os_backup_acl_streams) (JCR *jcr, FF_PKT *ff_pkt) = - solaris_build_acl_streams; -static bacl_exit_code (*os_parse_acl_streams) + solaris_backup_acl_streams; +static bacl_rtn_code (*os_restore_acl_streams) (JCR *jcr, int stream, char *content, uint32_t content_length) = - solaris_parse_acl_streams; + solaris_restore_acl_streams; #endif /* HAVE_SUN_OS */ #endif /* HAVE_ACL */ @@ -2088,14 +1934,14 @@ static bacl_exit_code (*os_parse_acl_streams) #error "configure failed to detect availability of afs/afsint.h and/or afs/venus.h" #endif -/** +/* * External references to functions in the libsys library function not in current include files. */ extern "C" { long pioctl(char *pathp, long opcode, struct ViceIoctl *blobp, int follow); } -static bacl_exit_code afs_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) +static bacl_rtn_code afs_backup_acl_streams(JCR *jcr, FF_PKT *ff_pkt) { int error; struct ViceIoctl vip; @@ -2106,7 +1952,7 @@ static bacl_exit_code afs_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) * request them for anything other then that. */ if (ff_pkt->type != FT_DIREND) { - return bacl_exit_ok; + return bacl_rtn_ok; } vip.in = NULL; @@ -2117,22 +1963,16 @@ static bacl_exit_code afs_build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) if ((error = pioctl(jcr->last_fname, VIOCGETAL, &vip, 0)) < 0) { berrno be; - - Mmsg2(jcr->errmsg, - _("pioctl VIOCGETAL error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "pioctl VIOCGETAL error file=%s ERR=%s\n", + Mmsg2(jcr->errmsg, _("pioctl VIOCGETAL error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - return bacl_exit_error; + Dmsg1(100, "%s", jcr->errmsg); + return bacl_rtn_error; } - jcr->acl_data->u.build->content_length = - pm_strcpy(jcr->acl_data->u.build->content, acl_text); + jcr->acl_ctx->content_length = pm_strcpy(jcr->acl_ctx->content, acl_text); return send_acl_stream(jcr, STREAM_ACL_AFS_TEXT); } -static bacl_exit_code afs_parse_acl_stream(JCR *jcr, - int stream, - char *content, +static bacl_rtn_code afs_restore_acl_stream(JCR *jcr, int stream, char *content, uint32_t content_length) { int error; @@ -2145,39 +1985,42 @@ static bacl_exit_code afs_parse_acl_stream(JCR *jcr, if ((error = pioctl(jcr->last_fname, VIOCSETAL, &vip, 0)) < 0) { berrno be; - - Mmsg2(jcr->errmsg, - _("pioctl VIOCSETAL error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "pioctl VIOCSETAL error file=%s ERR=%s\n", + Mmsg2(jcr->errmsg, _("pioctl VIOCSETAL error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - - return bacl_exit_error; + Dmsg1(100, "%s", jcr->errmsg); + return bacl_rtn_error; } - return bacl_exit_ok; + return bacl_rtn_ok; } #endif /* HAVE_AFS_ACL */ -/** +/* * Entry points when compiled with support for ACLs on a supported platform. */ -/** +/* * Read and send an ACL for the last encountered file. */ -bacl_exit_code build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) +bool backup_acl_streams(JCR *jcr, FF_PKT *ff_pkt) { + bacl_rtn_code rtn = bacl_rtn_error; + + if (!(ff_pkt->flags & FO_ACL && ff_pkt->type != FT_LNK && !ff_pkt->cmd_plugin)) { + return true; /* No acl request */ + } + jcr->errmsg[0] = 0; + /* * See if we are changing from one device to an other. * We save the current device we are scanning and compare * it with the current st_dev in the last stat performed on * the file we are currently storing. */ - if (jcr->acl_data->current_dev != ff_pkt->statp.st_dev) { + if (jcr->acl_ctx->current_dev != ff_pkt->statp.st_dev) { /* * Reset the acl save flags. */ - jcr->acl_data->flags = 0; + jcr->acl_ctx->flags = 0; #if defined(HAVE_AFS_ACL) /* @@ -2185,52 +2028,72 @@ bacl_exit_code build_acl_streams(JCR *jcr, FF_PKT *ff_pkt) * Set the BACL_FLAG_SAVE_AFS flag if it is. If not set the BACL_FLAG_SAVE_NATIVE flag. */ if (fstype_equals(jcr->last_fname, "afs")) { - jcr->acl_data->flags |= BACL_FLAG_SAVE_AFS; + jcr->acl_ctx->flags |= BACL_FLAG_SAVE_AFS; } else { - jcr->acl_data->flags |= BACL_FLAG_SAVE_NATIVE; + jcr->acl_ctx->flags |= BACL_FLAG_SAVE_NATIVE; } #else - jcr->acl_data->flags |= BACL_FLAG_SAVE_NATIVE; + jcr->acl_ctx->flags |= BACL_FLAG_SAVE_NATIVE; #endif /* * Save that we started scanning a new filesystem. */ - jcr->acl_data->current_dev = ff_pkt->statp.st_dev; + jcr->acl_ctx->current_dev = ff_pkt->statp.st_dev; } -#if defined(HAVE_AFS_ACL) +#ifdef HAVE_AFS_ACL /* * See if the BACL_FLAG_SAVE_AFS flag is set which lets us know if we should * save AFS ACLs. */ - if (jcr->acl_data->flags & BACL_FLAG_SAVE_AFS) { - return afs_build_acl_streams(jcr, ff_pkt); + if (jcr->acl_ctx->flags & BACL_FLAG_SAVE_AFS) { + rtn = afs_backup_acl_streams(jcr, ff_pkt); + goto get_out; } #endif -#if defined(HAVE_ACL) + +#ifdef HAVE_ACL /* * See if the BACL_FLAG_SAVE_NATIVE flag is set which lets us know if we should * save native ACLs. */ - if (jcr->acl_data->flags & BACL_FLAG_SAVE_NATIVE) { + if (jcr->acl_ctx->flags & BACL_FLAG_SAVE_NATIVE) { /* * Call the appropriate function. */ - if (os_build_acl_streams) { - return os_build_acl_streams(jcr, ff_pkt); + if (os_backup_acl_streams) { + rtn = os_backup_acl_streams(jcr, ff_pkt); + goto get_out; } } else { - return bacl_exit_ok; + return true; } #endif - return bacl_exit_error; + +get_out: + switch (rtn) { + case bacl_rtn_fatal: + return false; + case bacl_rtn_ok: + return true; + case bacl_rtn_error: + if (jcr->acl_ctx->nr_errors < ACL_MAX_ERROR_PRINT_PER_JOB) { + if (jcr->errmsg[0]) { + Jmsg(jcr, M_WARNING, 0, "Operating system ACLs not configured.\n"); + } else { + Jmsg(jcr, M_WARNING, 0, "%s", jcr->errmsg); + } + jcr->acl_ctx->nr_errors++; + } + return true; + } + /* Theoretically we cannot get here */ + return false; } -bacl_exit_code parse_acl_streams(JCR *jcr, - int stream, - char *content, - uint32_t content_length) +bacl_rtn_code restore_acl_streams(JCR *jcr, int stream, + char *content, uint32_t content_length) { int ret; struct stat st; @@ -2243,31 +2106,22 @@ bacl_exit_code parse_acl_streams(JCR *jcr, * the file we are currently restoring. */ ret = lstat(jcr->last_fname, &st); - switch (ret) { - case -1: { + if (ret < 0) { berrno be; - - switch (errno) { - case ENOENT: - return bacl_exit_ok; - default: - Mmsg2(jcr->errmsg, - _("Unable to stat file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "Unable to stat file \"%s\": ERR=%s\n", + if (errno == ENOENT) { + return bacl_rtn_ok; + } else { + Mmsg2(jcr->errmsg, _("Unable to stat file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - return bacl_exit_error; + Dmsg1(100, "%s", jcr->errmsg); + return bacl_rtn_error; } - break; } - case 0: - break; - } - if (jcr->acl_data->current_dev != st.st_dev) { + if (jcr->acl_ctx->current_dev != st.st_dev) { /* * Reset the acl save flags. */ - jcr->acl_data->flags = 0; + jcr->acl_ctx->flags = 0; #if defined(HAVE_AFS_ACL) /* @@ -2275,57 +2129,56 @@ bacl_exit_code parse_acl_streams(JCR *jcr, * Set the BACL_FLAG_RESTORE_AFS flag if it is. If not set the BACL_FLAG_RETORE_NATIVE flag. */ if (fstype_equals(jcr->last_fname, "afs")) { - jcr->acl_data->flags |= BACL_FLAG_RESTORE_AFS; + jcr->acl_ctx->flags |= BACL_FLAG_RESTORE_AFS; } else { - jcr->acl_data->flags |= BACL_FLAG_RESTORE_NATIVE; + jcr->acl_ctx->flags |= BACL_FLAG_RESTORE_NATIVE; } #else - jcr->acl_data->flags |= BACL_FLAG_RESTORE_NATIVE; + jcr->acl_ctx->flags |= BACL_FLAG_RESTORE_NATIVE; #endif - /* - * Save that we started restoring to a new filesystem. - */ - jcr->acl_data->current_dev = st.st_dev; + /* Save that we started restoring to a new filesystem. */ + jcr->acl_ctx->current_dev = st.st_dev; } switch (stream) { -#if defined(HAVE_AFS_ACL) +#ifdef HAVE_AFS_ACL case STREAM_ACL_AFS_TEXT: - if (jcr->acl_data->flags & BACL_FLAG_RESTORE_AFS) { - return afs_parse_acl_stream(jcr, stream, content, content_length); + if (jcr->acl_ctx->flags & BACL_FLAG_RESTORE_AFS) { + return afs_restore_acl_stream(jcr, stream, content, content_length); } else { /* * Increment error count but don't log an error again for the same filesystem. */ - jcr->acl_data->u.parse->nr_errors++; - return bacl_exit_ok; + jcr->acl_ctx->nr_errors++; + return bacl_rtn_ok; } #endif -#if defined(HAVE_ACL) + +#ifdef HAVE_ACL case STREAM_UNIX_ACCESS_ACL: case STREAM_UNIX_DEFAULT_ACL: /* * Handle legacy ACL streams. */ - if ((jcr->acl_data->flags & BACL_FLAG_RESTORE_NATIVE) && os_parse_acl_streams) { - return os_parse_acl_streams(jcr, stream, content, content_length); + if ((jcr->acl_ctx->flags & BACL_FLAG_RESTORE_NATIVE) && os_restore_acl_streams) { + return os_restore_acl_streams(jcr, stream, content, content_length); } else { /* * Increment error count but don't log an error again for the same filesystem. */ - jcr->acl_data->u.parse->nr_errors++; - return bacl_exit_ok; + jcr->acl_ctx->nr_errors++; + return bacl_rtn_ok; } break; default: - if ((jcr->acl_data->flags & BACL_FLAG_RESTORE_NATIVE) && os_parse_acl_streams) { + if ((jcr->acl_ctx->flags & BACL_FLAG_RESTORE_NATIVE) && os_restore_acl_streams) { /* * Walk the os_access_acl_streams array with the supported Access ACL streams for this OS. */ for (cnt = 0; cnt < sizeof(os_access_acl_streams) / sizeof(int); cnt++) { if (os_access_acl_streams[cnt] == stream) { - return os_parse_acl_streams(jcr, stream, content, content_length); + return os_restore_acl_streams(jcr, stream, content, content_length); } } /* @@ -2333,15 +2186,15 @@ bacl_exit_code parse_acl_streams(JCR *jcr, */ for (cnt = 0; cnt < sizeof(os_default_acl_streams) / sizeof(int); cnt++) { if (os_default_acl_streams[cnt] == stream) { - return os_parse_acl_streams(jcr, stream, content, content_length); + return os_restore_acl_streams(jcr, stream, content, content_length); } } } else { /* * Increment error count but don't log an error again for the same filesystem. */ - jcr->acl_data->u.parse->nr_errors++; - return bacl_exit_ok; + jcr->acl_ctx->nr_errors++; + return bacl_rtn_ok; } break; #else @@ -2349,9 +2202,8 @@ bacl_exit_code parse_acl_streams(JCR *jcr, break; #endif } - Qmsg2(jcr, M_WARNING, 0, - _("Can't restore ACLs of %s - incompatible acl stream encountered - %d\n"), - jcr->last_fname, stream); - return bacl_exit_error; + Qmsg2(jcr, M_WARNING, 0, _("Cannot restore ACLs of %s - incompatible acl stream encountered - %d\n"), + jcr->last_fname, stream); + return bacl_rtn_error; } #endif diff --git a/bacula/src/filed/acl.h b/bacula/src/filed/acl.h index bb63529411..716a7d5653 100644 --- a/bacula/src/filed/acl.h +++ b/bacula/src/filed/acl.h @@ -1,85 +1,66 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2004-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Properties we use for getting and setting ACLs. */ -#ifndef __ACL_H -#define __ACL_H - -/* For shorter ACL strings when possible, define BACL_WANT_SHORT_ACLS */ -/* #define BACL_WANT_SHORT_ACLS */ +#ifndef __BACL_H_ +#define __BACL_H_ -/* For numeric user/group ids when possible, define BACL_WANT_NUMERIC_IDS */ -/* #define BACL_WANT_NUMERIC_IDS */ +/* Global JCR data */ +struct acl_ctx_t { + uint32_t nr_errors; + uint32_t flags; /* See BACL_FLAG_* */ + uint32_t current_dev; + uint32_t content_length; + POOLMEM *content; +}; /* * We support the following types of ACLs */ typedef enum { - BACL_TYPE_NONE = 0, - BACL_TYPE_ACCESS = 1, - BACL_TYPE_DEFAULT = 2, + BACL_TYPE_NONE = 0, + BACL_TYPE_ACCESS = 1, + BACL_TYPE_DEFAULT = 2, BACL_TYPE_DEFAULT_DIR = 3, - BACL_TYPE_EXTENDED = 4, - BACL_TYPE_NFS4 = 5 + BACL_TYPE_EXTENDED = 4, + BACL_TYPE_NFS4 = 5 } bacl_type; +#define BACL_FLAG_SAVE_NATIVE 0x01 +#define BACL_FLAG_SAVE_AFS 0x02 +#define BACL_FLAG_RESTORE_NATIVE 0x04 +#define BACL_FLAG_RESTORE_AFS 0x08 + /* - * This value is used as ostype when we encounter an invalid acl type. - * The way the code is build this should never happen. + * Ensure we have none */ -#if !defined(ACL_TYPE_NONE) +#ifndef ACL_TYPE_NONE #define ACL_TYPE_NONE 0x0 #endif + +#ifdef HAVE_IRIX_OS +#define BACL_ENOTSUP ENOSYS +#else +#define BACL_ENOTSUP EOPNOTSUPP +#endif /* HAVE_IRIX_OS */ -#if defined(HAVE_FREEBSD_OS) || \ - defined(HAVE_DARWIN_OS) || \ - defined(HAVE_HPUX_OS) || \ - defined(HAVE_LINUX_OS) -#define BACL_ENOTSUP EOPNOTSUPP -#elif defined(HAVE_IRIX_OS) -#define BACL_ENOTSUP ENOSYS -#endif - -#define BACL_FLAG_SAVE_NATIVE 0x01 -#define BACL_FLAG_SAVE_AFS 0x02 -#define BACL_FLAG_RESTORE_NATIVE 0x04 -#define BACL_FLAG_RESTORE_AFS 0x08 - -struct acl_build_data_t { - uint32_t nr_errors; - uint32_t content_length; - POOLMEM *content; -}; - -struct acl_parse_data_t { - uint32_t nr_errors; -}; - -/* - * Internal tracking data. - */ -struct acl_data_t { - uint32_t flags; /* See BACL_FLAG_* */ - uint32_t current_dev; - union { - struct acl_build_data_t *build; - struct acl_parse_data_t *parse; - } u; -}; - -#endif +#endif /* __BACL_H_ */ diff --git a/bacula/src/filed/authenticate.c b/bacula/src/filed/authenticate.c index dfff775876..e432e0618a 100644 --- a/bacula/src/filed/authenticate.c +++ b/bacula/src/filed/authenticate.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Authenticate Director who is attempting to connect. @@ -27,70 +31,21 @@ extern CLIENT *me; /* my resource */ const int dbglvl = 50; -/* Version at end of Hello - * prior to 10Mar08 no version - * 1 10Mar08 - * 2 13Mar09 - added the ability to restore from multiple storages - * 3 03Sep10 - added the restore object command for vss plugin 4.0 - * 4 25Nov10 - added bandwidth command 5.1 - * 5 01Jan14 - added SD Calls Client and api version to status command - * - * Next version should be 1000 - */ -#define FD_VERSION 5 - -static char hello_sd[] = "Hello Bacula SD: Start Job %s %d\n"; - -static char hello_dir[] = "2000 OK Hello %d\n"; -static char Dir_sorry[] = "2999 Authentication failed.\n"; static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; -/********************************************************************* - * +/* + * Authenticated the Director */ -static bool authenticate(int rcode, BSOCK *bs, JCR* jcr) +bool authenticate_director(JCR *jcr) { - POOLMEM *dirname = get_pool_memory(PM_MESSAGE); - DIRRES *director = NULL; + DIRRES *director = jcr->director; int tls_local_need = BNET_TLS_NONE; int tls_remote_need = BNET_TLS_NONE; int compatible = true; /* Want md5 compatible DIR */ bool auth_success = false; alist *verify_list = NULL; btimer_t *tid = NULL; - int dir_version = 0; - - if (rcode != R_DIRECTOR) { - Dmsg1(dbglvl, "I only authenticate directors, not %d\n", rcode); - Jmsg1(jcr, M_FATAL, 0, _("I only authenticate directors, not %d\n"), rcode); - goto auth_fatal; - } - - dirname = check_pool_memory_size(dirname, bs->msglen); - - if (sscanf(bs->msg, "Hello Director %s calling %d", dirname, &dir_version) != 2 && - sscanf(bs->msg, "Hello Director %s calling", dirname) != 1) { - char addr[64]; - char *who = bs->get_peer(addr, sizeof(addr)) ? bs->who() : addr; - bs->msg[100] = 0; - Dmsg2(dbglvl, "Bad Hello command from Director at %s: %s\n", - bs->who(), bs->msg); - Jmsg2(jcr, M_FATAL, 0, _("Bad Hello command from Director at %s: %s\n"), - who, bs->msg); - goto auth_fatal; - } - unbash_spaces(dirname); - foreach_res(director, R_DIRECTOR) { - if (strcmp(director->hdr.name, dirname) == 0) - break; - } - if (!director) { - char addr[64]; - char *who = bs->get_peer(addr, sizeof(addr)) ? bs->who() : addr; - Jmsg2(jcr, M_FATAL, 0, _("Connection from unknown Director %s at %s rejected.\n"), - dirname, who); - goto auth_fatal; - } + BSOCK *dir = jcr->dir_bsock; if (have_tls) { /* TLS Requirement */ @@ -111,28 +66,28 @@ static bool authenticate(int rcode, BSOCK *bs, JCR* jcr) } } - tid = start_bsock_timer(bs, AUTH_TIMEOUT); + tid = start_bsock_timer(dir, AUTH_TIMEOUT); /* Challenge the director */ - auth_success = cram_md5_challenge(bs, director->password, tls_local_need, compatible); + auth_success = cram_md5_challenge(dir, director->password, tls_local_need, compatible); if (job_canceled(jcr)) { auth_success = false; goto auth_fatal; /* quick exit */ } if (auth_success) { - auth_success = cram_md5_respond(bs, director->password, &tls_remote_need, &compatible); + auth_success = cram_md5_respond(dir, director->password, &tls_remote_need, &compatible); if (!auth_success) { char addr[64]; - char *who = bs->get_peer(addr, sizeof(addr)) ? bs->who() : addr; + char *who = dir->get_peer(addr, sizeof(addr)) ? dir->who() : addr; Dmsg1(dbglvl, "cram_get_auth respond failed for Director: %s\n", who); } } else { char addr[64]; - char *who = bs->get_peer(addr, sizeof(addr)) ? bs->who() : addr; + char *who = dir->get_peer(addr, sizeof(addr)) ? dir->who() : addr; Dmsg1(dbglvl, "cram_auth challenge failed for Director %s\n", who); } if (!auth_success) { Emsg1(M_FATAL, 0, _("Incorrect password given by Director at %s.\n"), - bs->who()); + dir->who()); goto auth_fatal; } @@ -155,57 +110,39 @@ static bool authenticate(int rcode, BSOCK *bs, JCR* jcr) if (tls_local_need >= BNET_TLS_OK && tls_remote_need >= BNET_TLS_OK) { /* Engage TLS! Full Speed Ahead! */ - if (!bnet_tls_server(director->tls_ctx, bs, verify_list)) { + if (!bnet_tls_server(director->tls_ctx, dir, verify_list)) { Jmsg0(jcr, M_FATAL, 0, _("TLS negotiation failed.\n")); auth_success = false; goto auth_fatal; } if (director->tls_authenticate) { /* authentication only? */ - bs->free_tls(); /* shutodown tls */ + dir->free_tls(); /* shutodown tls */ } } + auth_success = true; auth_fatal: if (tid) { stop_bsock_timer(tid); tid = NULL; } - free_pool_memory(dirname); - jcr->director = director; - /* Single thread all failures to avoid DOS */ - if (!auth_success) { - P(mutex); - bmicrosleep(6, 0); - V(mutex); + if (auth_success) { + return send_hello_ok(dir); } - return auth_success; + send_sorry(dir); + /* Single thread all failures to avoid DOS */ + P(mutex); + bmicrosleep(6, 0); + V(mutex); + return false; } -/* - * Inititiate the communications with the Director. - * He has made a connection to our server. - * - * Basic tasks done here: - * We read Director's initial message and authorize him. - * - */ -int authenticate_director(JCR *jcr) -{ - BSOCK *dir = jcr->dir_bsock; - - if (!authenticate(R_DIRECTOR, dir, jcr)) { - dir->fsend("%s", Dir_sorry); - Emsg0(M_FATAL, 0, _("Unable to authenticate Director\n")); - return 0; - } - return dir->fsend(hello_dir, FD_VERSION); -} /* * First prove our identity to the Storage daemon, then * make him prove his identity. */ -int authenticate_storagedaemon(JCR *jcr) +bool authenticate_storagedaemon(JCR *jcr) { BSOCK *sd = jcr->store_bsock; int tls_local_need = BNET_TLS_NONE; @@ -234,10 +171,6 @@ int authenticate_storagedaemon(JCR *jcr) goto auth_fatal; } - - sd->fsend(hello_sd, jcr->Job, FD_VERSION); - Dmsg1(100, "Send to SD: %s\n", sd->msg); - /* Respond to SD challenge */ Dmsg0(050, "==== respond to SD challenge\n"); auth_success = cram_md5_respond(sd, jcr->sd_auth_key, &tls_remote_need, &compatible); @@ -258,7 +191,7 @@ int authenticate_storagedaemon(JCR *jcr) if (!auth_success) { Jmsg(jcr, M_FATAL, 0, _("Authorization key rejected by Storage daemon.\n" - "Please see " MANUAL_AUTH_URL " for help.\n")); + "For help, please see " MANUAL_AUTH_URL "\n")); goto auth_fatal; } else { Dmsg0(050, "Authorization with SD is OK\n"); @@ -297,7 +230,6 @@ int authenticate_storagedaemon(JCR *jcr) goto auth_fatal; } sscanf(sd->msg, "3000 OK Hello %d", &sd_version); - /* At this point, we have successfully connected */ auth_fatal: diff --git a/bacula/src/filed/backup.c b/bacula/src/filed/backup.c index 0489b520b0..31ed90a324 100644 --- a/bacula/src/filed/backup.c +++ b/bacula/src/filed/backup.c @@ -1,19 +1,23 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ -/** + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. + */ +/* * Bacula File Daemon backup.c send file attributes and data * to the Storage daemon. * @@ -23,34 +27,30 @@ #include "bacula.h" #include "filed.h" -#include "ch.h" - -#ifdef HAVE_DARWIN_OS -const bool have_darwin_os = true; -#else -const bool have_darwin_os = false; -#endif +#include "backup.h" -#if defined(HAVE_ACL) -const bool have_acl = true; +#ifdef HAVE_LZO +const bool have_lzo = true; #else -const bool have_acl = false; +const bool have_lzo = false; #endif -#if defined(HAVE_XATTR) -const bool have_xattr = true; +#ifdef HAVE_LIBZ +const bool have_libz = true; #else -const bool have_xattr = false; +const bool have_libz = false; #endif /* Forward referenced functions */ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level); -static int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, DIGEST *digest, DIGEST *signature_digest); -bool encode_and_send_attributes(JCR *jcr, FF_PKT *ff_pkt, int &data_stream); -static bool crypto_session_start(JCR *jcr); -static void crypto_session_end(JCR *jcr); -static bool crypto_session_send(JCR *jcr, BSOCK *sd); +static int send_data(bctx_t &bctx, int stream); static void close_vss_backup_session(JCR *jcr); +#ifdef HAVE_DARWIN_OS +static bool send_resource_fork(bctx_t &bctx); +#endif +static bool setup_compression(bctx_t &bctx); +static bool do_lzo_compression(bctx_t &bctx); +static bool do_libz_compression(bctx_t &bctx); /** * Find all the requested files and send them @@ -108,13 +108,13 @@ bool blast_data_to_storage_daemon(JCR *jcr, char *addr) * * For the same reason, lzo compression is initialized here. */ -#ifdef HAVE_LZO - jcr->compress_buf_size = MAX(jcr->buf_size + (jcr->buf_size / 16) + 67 + (int)sizeof(comp_stream_header), jcr->buf_size + ((jcr->buf_size+999) / 1000) + 30); - jcr->compress_buf = get_memory(jcr->compress_buf_size); -#else - jcr->compress_buf_size = jcr->buf_size + ((jcr->buf_size+999) / 1000) + 30; - jcr->compress_buf = get_memory(jcr->compress_buf_size); -#endif + if (have_lzo) { + jcr->compress_buf_size = MAX(jcr->buf_size + (jcr->buf_size / 16) + 67 + (int)sizeof(comp_stream_header), jcr->buf_size + ((jcr->buf_size+999) / 1000) + 30); + jcr->compress_buf = get_memory(jcr->compress_buf_size); + } else { + jcr->compress_buf_size = jcr->buf_size + ((jcr->buf_size+999) / 1000) + 30; + jcr->compress_buf = get_memory(jcr->compress_buf_size); + } #ifdef HAVE_LIBZ z_stream *pZlibStream = (z_stream*)malloc(sizeof(z_stream)); @@ -147,30 +147,26 @@ bool blast_data_to_storage_daemon(JCR *jcr, char *addr) return false; } - set_find_options((FF_PKT *)jcr->ff, jcr->incremental, jcr->mtime); + set_find_options(jcr->ff, jcr->incremental, jcr->mtime); + set_find_snapshot_function(jcr->ff, snapshot_convert_path); /** in accurate mode, we overload the find_one check function */ if (jcr->accurate) { set_find_changed_function((FF_PKT *)jcr->ff, accurate_check_file); } - start_heartbeat_monitor(jcr); - if (have_acl) { - jcr->acl_data = (acl_data_t *)malloc(sizeof(acl_data_t)); - memset(jcr->acl_data, 0, sizeof(acl_data_t)); - jcr->acl_data->u.build = (acl_build_data_t *)malloc(sizeof(acl_build_data_t)); - memset(jcr->acl_data->u.build, 0, sizeof(acl_build_data_t)); - jcr->acl_data->u.build->content = get_pool_memory(PM_MESSAGE); - } +#ifdef HAVE_ACL + jcr->acl_ctx = (acl_ctx_t *)malloc(sizeof(acl_ctx_t)); + memset(jcr->acl_ctx, 0, sizeof(acl_ctx_t)); + jcr->acl_ctx->content = get_pool_memory(PM_MESSAGE); +#endif +#ifdef HAVE_XATTR + jcr->xattr_ctx = (xattr_ctx_t *)malloc(sizeof(xattr_ctx_t)); + memset(jcr->xattr_ctx, 0, sizeof(xattr_ctx_t)); + jcr->xattr_ctx->content = get_pool_memory(PM_MESSAGE); +#endif - if (have_xattr) { - jcr->xattr_data = (xattr_data_t *)malloc(sizeof(xattr_data_t)); - memset(jcr->xattr_data, 0, sizeof(xattr_data_t)); - jcr->xattr_data->u.build = (xattr_build_data_t *)malloc(sizeof(xattr_build_data_t)); - memset(jcr->xattr_data->u.build, 0, sizeof(xattr_build_data_t)); - jcr->xattr_data->u.build->content = get_pool_memory(PM_MESSAGE); - } /** Subroutine save_file() is called for each file */ if (!find_files(jcr, (FF_PKT *)jcr->ff, save_file, plugin_save)) { @@ -178,15 +174,20 @@ bool blast_data_to_storage_daemon(JCR *jcr, char *addr) jcr->setJobStatus(JS_ErrorTerminated); } - if (have_acl && jcr->acl_data->u.build->nr_errors > 0) { - Jmsg(jcr, M_WARNING, 0, _("Encountered %ld acl errors while doing backup\n"), - jcr->acl_data->u.build->nr_errors); - } - if (have_xattr && jcr->xattr_data->u.build->nr_errors > 0) { - Jmsg(jcr, M_WARNING, 0, _("Encountered %ld xattr errors while doing backup\n"), - jcr->xattr_data->u.build->nr_errors); - } - +#ifdef HAVE_ACL + if (jcr->acl_ctx->nr_errors > 0) { + Jmsg(jcr, M_WARNING, 0, _("Had %ld acl errors while doing backup\n"), + jcr->acl_ctx->nr_errors); + } +#endif +#ifdef HAVE_XATTR + if (jcr->xattr_ctx->nr_errors > 0) { + Jmsg(jcr, M_WARNING, 0, _("Had %ld xattr errors while doing backup\n"), + jcr->xattr_ctx->nr_errors); + } +#endif + /* Delete or keep snapshots */ + close_snapshot_backup_session(jcr); close_vss_backup_session(jcr); accurate_finish(jcr); /* send deleted or base file list to SD */ @@ -195,37 +196,34 @@ bool blast_data_to_storage_daemon(JCR *jcr, char *addr) sd->signal(BNET_EOD); /* end of sending data */ - if (have_acl && jcr->acl_data) { - free_pool_memory(jcr->acl_data->u.build->content); - free(jcr->acl_data->u.build); - free(jcr->acl_data); - jcr->acl_data = NULL; - } - if (have_xattr && jcr->xattr_data) { - free_pool_memory(jcr->xattr_data->u.build->content); - free(jcr->xattr_data->u.build); - free(jcr->xattr_data); - jcr->xattr_data = NULL; - } + +#ifdef HAVE_ACL + if (jcr->acl_ctx) { + free_and_null_pool_memory(jcr->acl_ctx->content); + bfree_and_null(jcr->acl_ctx); + } +#endif +#ifdef HAVE_XATTR + if (jcr->xattr_ctx) { + free_and_null_pool_memory(jcr->xattr_ctx->content); + bfree_and_null(jcr->xattr_ctx); + } +#endif if (jcr->big_buf) { - free(jcr->big_buf); - jcr->big_buf = NULL; + bfree_and_null(jcr->big_buf); } if (jcr->compress_buf) { - free_pool_memory(jcr->compress_buf); - jcr->compress_buf = NULL; + free_and_null_pool_memory(jcr->compress_buf); } if (jcr->pZLIB_compress_workset) { /* Free the zlib stream */ #ifdef HAVE_LIBZ deflateEnd((z_stream *)jcr->pZLIB_compress_workset); #endif - free (jcr->pZLIB_compress_workset); - jcr->pZLIB_compress_workset = NULL; + bfree_and_null(jcr->pZLIB_compress_workset); } if (jcr->LZO_compress_workset) { - free (jcr->LZO_compress_workset); - jcr->LZO_compress_workset = NULL; + bfree_and_null(jcr->LZO_compress_workset); } crypto_session_end(jcr); @@ -235,84 +233,6 @@ bool blast_data_to_storage_daemon(JCR *jcr, char *addr) return ok; } -static bool crypto_session_start(JCR *jcr) -{ - crypto_cipher_t cipher = (crypto_cipher_t) me->pki_cipher; - - /** - * Create encryption session data and a cached, DER-encoded session data - * structure. We use a single session key for each backup, so we'll encode - * the session data only once. - */ - if (jcr->crypto.pki_encrypt) { - uint32_t size = 0; - - /** Create per-job session encryption context */ - jcr->crypto.pki_session = crypto_session_new(cipher, jcr->crypto.pki_recipients); - if (!jcr->crypto.pki_session) { - Jmsg(jcr, M_FATAL, 0, _("Unsupported cipher on this system.\n")); - return false; - } - - /** Get the session data size */ - if (!crypto_session_encode(jcr->crypto.pki_session, (uint8_t *)0, &size)) { - Jmsg(jcr, M_FATAL, 0, _("An error occurred while encrypting the stream.\n")); - return false; - } - - /** Allocate buffer */ - jcr->crypto.pki_session_encoded = get_memory(size); - - /** Encode session data */ - if (!crypto_session_encode(jcr->crypto.pki_session, (uint8_t *)jcr->crypto.pki_session_encoded, &size)) { - Jmsg(jcr, M_FATAL, 0, _("An error occurred while encrypting the stream.\n")); - return false; - } - - /** ... and store the encoded size */ - jcr->crypto.pki_session_encoded_size = size; - - /** Allocate the encryption/decryption buffer */ - jcr->crypto.crypto_buf = get_memory(CRYPTO_CIPHER_MAX_BLOCK_SIZE); - } - return true; -} - -static void crypto_session_end(JCR *jcr) -{ - if (jcr->crypto.crypto_buf) { - free_pool_memory(jcr->crypto.crypto_buf); - jcr->crypto.crypto_buf = NULL; - } - if (jcr->crypto.pki_session) { - crypto_session_free(jcr->crypto.pki_session); - } - if (jcr->crypto.pki_session_encoded) { - free_pool_memory(jcr->crypto.pki_session_encoded); - jcr->crypto.pki_session_encoded = NULL; - } -} - -static bool crypto_session_send(JCR *jcr, BSOCK *sd) -{ - POOLMEM *msgsave; - - /** Send our header */ - Dmsg2(100, "Send hdr fi=%ld stream=%d\n", jcr->JobFiles, STREAM_ENCRYPTED_SESSION_DATA); - sd->fsend("%ld %d %lld", jcr->JobFiles, STREAM_ENCRYPTED_SESSION_DATA, - (int64_t)jcr->ff->statp.st_size); - msgsave = sd->msg; - sd->msg = jcr->crypto.pki_session_encoded; - sd->msglen = jcr->crypto.pki_session_encoded_size; - jcr->JobBytes += sd->msglen; - - Dmsg1(100, "Send data len=%d\n", sd->msglen); - sd->send(); - sd->msg = msgsave; - sd->signal(BNET_EOD); - return true; -} - /** * Called here by find() for each file included. @@ -329,18 +249,19 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level) bool do_read = false; bool plugin_started = false; bool do_plugin_set = false; - int stat, data_stream; + int stat; int rtnstat = 0; - DIGEST *digest = NULL; - DIGEST *signing_digest = NULL; - int digest_stream = STREAM_NONE; - SIGNATURE *sig = NULL; bool has_file_data = false; - struct save_pkt sp; /* use by option plugin */ + struct save_pkt sp; /* used by option plugin */ + BSOCK *sd = jcr->store_bsock; + bctx_t bctx; /* backup context */ + + memset(&bctx, 0, sizeof(bctx)); + bctx.sd = sd; + bctx.ff_pkt = ff_pkt; + bctx.jcr = jcr; - crypto_digest_t signing_algorithm = (crypto_digest_t) me->pki_digest; - BSOCK *sd = jcr->store_bsock; time_t now = time(NULL); if (jcr->last_stat_time == 0) { jcr->last_stat_time = now; @@ -351,8 +272,8 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level) jcr->last_stat_time = now; } - if (jcr->is_canceled()) { - Dmsg0(100, "Job canceled by user.\n"); + if (jcr->is_canceled() || jcr->is_incomplete()) { + Dmsg0(100, "Job canceled by user or marked incomplete.\n"); return 0; } @@ -471,64 +392,8 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level) Dmsg1(130, "bfiled: sending %s to stored\n", ff_pkt->fname); /** Digests and encryption are only useful if there's file data */ - if (has_file_data) { - /** - * Setup for digest handling. If this fails, the digest will be set to NULL - * and not used. Note, the digest (file hash) can be any one of the four - * algorithms below. - * - * The signing digest is a single algorithm depending on - * whether or not we have SHA2. - * ****FIXME**** the signing algoritm should really be - * determined a different way!!!!!! What happens if - * sha2 was available during backup but not restore? - */ - if (ff_pkt->flags & FO_MD5) { - digest = crypto_digest_new(jcr, CRYPTO_DIGEST_MD5); - digest_stream = STREAM_MD5_DIGEST; - - } else if (ff_pkt->flags & FO_SHA1) { - digest = crypto_digest_new(jcr, CRYPTO_DIGEST_SHA1); - digest_stream = STREAM_SHA1_DIGEST; - - } else if (ff_pkt->flags & FO_SHA256) { - digest = crypto_digest_new(jcr, CRYPTO_DIGEST_SHA256); - digest_stream = STREAM_SHA256_DIGEST; - - } else if (ff_pkt->flags & FO_SHA512) { - digest = crypto_digest_new(jcr, CRYPTO_DIGEST_SHA512); - digest_stream = STREAM_SHA512_DIGEST; - } - - /** Did digest initialization fail? */ - if (digest_stream != STREAM_NONE && digest == NULL) { - Jmsg(jcr, M_WARNING, 0, _("%s digest initialization failed\n"), - stream_to_ascii(digest_stream)); - } - - /** - * Set up signature digest handling. If this fails, the signature digest - * will be set to NULL and not used. - */ - /* TODO landonf: We should really only calculate the digest once, for - * both verification and signing. - */ - if (jcr->crypto.pki_sign) { - signing_digest = crypto_digest_new(jcr, signing_algorithm); - - /** Full-stop if a failure occurred initializing the signature digest */ - if (signing_digest == NULL) { - Jmsg(jcr, M_NOTSAVED, 0, _("%s signature digest initialization failed\n"), - stream_to_ascii(signing_algorithm)); - jcr->JobErrors++; - goto good_rtn; - } - } - - /** Enable encryption */ - if (jcr->crypto.pki_encrypt) { - ff_pkt->flags |= FO_ENCRYPT; - } + if (has_file_data && !crypto_setup_digests(bctx)) { + goto good_rtn; } /** Initialize the file descriptor we use for data and other streams. */ @@ -571,7 +436,7 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level) } /** Send attributes -- must be done after binit() */ - if (!encode_and_send_attributes(jcr, ff_pkt, data_stream)) { + if (!encode_and_send_attributes(bctx)) { goto bail_out; } /** Meta data only for restore object */ @@ -623,6 +488,7 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level) int noatime = ff_pkt->flags & FO_NOATIME ? O_NOATIME : 0; ff_pkt->bfd.reparse_point = (ff_pkt->type == FT_REPARSE || ff_pkt->type == FT_JUNCTION); + set_fattrs(&ff_pkt->bfd, &ff_pkt->statp); if (bopen(&ff_pkt->bfd, ff_pkt->fname, O_RDONLY | O_BINARY | noatime, 0) < 0) { ff_pkt->ff_errno = errno; berrno be; @@ -640,7 +506,7 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level) tid = NULL; } - stat = send_data(jcr, data_stream, ff_pkt, digest, signing_digest); + stat = send_data(bctx, bctx.data_stream); if (ff_pkt->flags & FO_CHKCHANGES) { has_file_changed(jcr, ff_pkt); @@ -653,195 +519,42 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level) } } - if (have_darwin_os) { - /** Regular files can have resource forks and Finder Info */ - if (ff_pkt->type != FT_LNKSAVED && (S_ISREG(ff_pkt->statp.st_mode) && - ff_pkt->flags & FO_HFSPLUS)) { - if (ff_pkt->hfsinfo.rsrclength > 0) { - int flags; - int rsrc_stream; - if (bopen_rsrc(&ff_pkt->bfd, ff_pkt->fname, O_RDONLY | O_BINARY, 0) < 0) { - ff_pkt->ff_errno = errno; - berrno be; - Jmsg(jcr, M_NOTSAVED, -1, _(" Cannot open resource fork for \"%s\": ERR=%s.\n"), - ff_pkt->fname, be.bstrerror()); - jcr->JobErrors++; - if (is_bopen(&ff_pkt->bfd)) { - bclose(&ff_pkt->bfd); - } - goto good_rtn; - } - flags = ff_pkt->flags; - ff_pkt->flags &= ~(FO_COMPRESS|FO_SPARSE|FO_OFFSETS); - if (flags & FO_ENCRYPT) { - rsrc_stream = STREAM_ENCRYPTED_MACOS_FORK_DATA; - } else { - rsrc_stream = STREAM_MACOS_FORK_DATA; - } - stat = send_data(jcr, rsrc_stream, ff_pkt, digest, signing_digest); - ff_pkt->flags = flags; - bclose(&ff_pkt->bfd); - if (!stat) { - goto bail_out; - } - } - - Dmsg1(300, "Saving Finder Info for \"%s\"\n", ff_pkt->fname); - sd->fsend("%ld %d 0", jcr->JobFiles, STREAM_HFSPLUS_ATTRIBUTES); - Dmsg1(300, "bfiled>stored:header %s\n", sd->msg); - pm_memcpy(sd->msg, ff_pkt->hfsinfo.fndrinfo, 32); - sd->msglen = 32; - if (digest) { - crypto_digest_update(digest, (uint8_t *)sd->msg, sd->msglen); - } - if (signing_digest) { - crypto_digest_update(signing_digest, (uint8_t *)sd->msg, sd->msglen); - } - sd->send(); - sd->signal(BNET_EOD); - } +#ifdef HAVE_DARWIN_OS + if (!send_resource_fork(bctx)) { + goto bail_out; } +#endif - /** + /* * Save ACLs when requested and available for anything not being a symlink * and not being a plugin. */ - if (have_acl) { - if (ff_pkt->flags & FO_ACL && ff_pkt->type != FT_LNK && !ff_pkt->cmd_plugin) { - switch (build_acl_streams(jcr, ff_pkt)) { - case bacl_exit_fatal: - goto bail_out; - case bacl_exit_error: - /** - * Non-fatal errors, count them and when the number is under - * ACL_REPORT_ERR_MAX_PER_JOB print the error message set by the - * lower level routine in jcr->errmsg. - */ - if (jcr->acl_data->u.build->nr_errors < ACL_REPORT_ERR_MAX_PER_JOB) { - Jmsg(jcr, M_WARNING, 0, "%s", jcr->errmsg); - } - jcr->acl_data->u.build->nr_errors++; - break; - case bacl_exit_ok: - break; - } - } +#ifdef HAVE_ACL + if (!backup_acl_streams(jcr, ff_pkt)) { + goto bail_out; } +#endif - /** + /* * Save Extended Attributes when requested and available for all files not * being a plugin. */ - if (have_xattr) { - if (ff_pkt->flags & FO_XATTR && !ff_pkt->cmd_plugin) { - switch (build_xattr_streams(jcr, ff_pkt)) { - case bxattr_exit_fatal: - goto bail_out; - case bxattr_exit_error: - /** - * Non-fatal errors, count them and when the number is under - * XATTR_REPORT_ERR_MAX_PER_JOB print the error message set by the - * lower level routine in jcr->errmsg. - */ - if (jcr->xattr_data->u.build->nr_errors < XATTR_REPORT_ERR_MAX_PER_JOB) { - Jmsg(jcr, M_WARNING, 0, "%s", jcr->errmsg); - } - jcr->xattr_data->u.build->nr_errors++; - break; - case bxattr_exit_ok: - break; - } - } - } - - /** Terminate the signing digest and send it to the Storage daemon */ - if (signing_digest) { - uint32_t size = 0; - - if ((sig = crypto_sign_new(jcr)) == NULL) { - Jmsg(jcr, M_FATAL, 0, _("Failed to allocate memory for crypto signature.\n")); - goto bail_out; - } - - if (!crypto_sign_add_signer(sig, signing_digest, jcr->crypto.pki_keypair)) { - Jmsg(jcr, M_FATAL, 0, _("An error occurred while adding signer the stream.\n")); - goto bail_out; - } - - /** Get signature size */ - if (!crypto_sign_encode(sig, NULL, &size)) { - Jmsg(jcr, M_FATAL, 0, _("An error occurred while signing the stream.\n")); - goto bail_out; - } - - /** Grow the bsock buffer to fit our message if necessary */ - if (sizeof_pool_memory(sd->msg) < (int32_t)size) { - sd->msg = realloc_pool_memory(sd->msg, size); - } - - /** Send our header */ - sd->fsend("%ld %ld 0", jcr->JobFiles, STREAM_SIGNED_DIGEST); - Dmsg1(300, "bfiled>stored:header %s\n", sd->msg); - - /** Encode signature data */ - if (!crypto_sign_encode(sig, (uint8_t *)sd->msg, &size)) { - Jmsg(jcr, M_FATAL, 0, _("An error occurred while signing the stream.\n")); - goto bail_out; - } - - sd->msglen = size; - sd->send(); - sd->signal(BNET_EOD); /* end of checksum */ - } - - /** Terminate any digest and send it to Storage daemon */ - if (digest) { - uint32_t size; - - sd->fsend("%ld %d 0", jcr->JobFiles, digest_stream); - Dmsg1(300, "bfiled>stored:header %s\n", sd->msg); - - size = CRYPTO_DIGEST_MAX_SIZE; - - /** Grow the bsock buffer to fit our message if necessary */ - if (sizeof_pool_memory(sd->msg) < (int32_t)size) { - sd->msg = realloc_pool_memory(sd->msg, size); - } - - if (!crypto_digest_finalize(digest, (uint8_t *)sd->msg, &size)) { - Jmsg(jcr, M_FATAL, 0, _("An error occurred finalizing signing the stream.\n")); - goto bail_out; - } - - /* Keep the checksum if this file is a hardlink */ - if (ff_pkt->linked) { - ff_pkt_set_link_digest(ff_pkt, digest_stream, sd->msg, size); - } - - sd->msglen = size; - sd->send(); - sd->signal(BNET_EOD); /* end of checksum */ +#ifdef HAVE_XATTR + if (!backup_xattr_streams(jcr, ff_pkt)) { + goto bail_out; } +#endif - /* Check if original file has a digest, and send it */ - if (ff_pkt->type == FT_LNKSAVED && ff_pkt->digest) { - Dmsg2(300, "Link %s digest %d\n", ff_pkt->fname, ff_pkt->digest_len); - sd->fsend("%ld %d 0", jcr->JobFiles, ff_pkt->digest_stream); - - sd->msg = check_pool_memory_size(sd->msg, ff_pkt->digest_len); - memcpy(sd->msg, ff_pkt->digest, ff_pkt->digest_len); - sd->msglen = ff_pkt->digest_len; - sd->send(); - - sd->signal(BNET_EOD); /* end of hardlink record */ + if (!crypto_terminate_digests(bctx)) { + goto bail_out; } good_rtn: rtnstat = 1; bail_out: - if (jcr->is_canceled()) { - Dmsg0(100, "Job canceled by user.\n"); + if (jcr->is_incomplete() || jcr->is_canceled()) { + Dmsg0(100, "Job canceled by user or marked incomplete.\n"); rtnstat = 0; } if (plugin_started) { @@ -853,22 +566,14 @@ bail_out: jcr->plugin = NULL; jcr->opt_plugin = false; } - if (digest) { - crypto_digest_free(digest); - } - if (signing_digest) { - crypto_digest_free(signing_digest); - } - if (sig) { - crypto_sign_free(sig); - } + crypto_free(bctx); return rtnstat; } /** * Send data read from an already open file descriptor. * - * We return 1 on sucess and 0 on errors. + * We return 1 on success and 0 on errors. * * ***FIXME*** * We use ff_pkt->statp.st_size when FO_SPARSE to know when to stop @@ -876,118 +581,31 @@ bail_out: * Currently this is not a problem as the only other stream, resource forks, * are not handled as sparse files. */ -static int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, DIGEST *digest, - DIGEST *signing_digest) +static int send_data(bctx_t &bctx, int stream) { + JCR *jcr = bctx.jcr; BSOCK *sd = jcr->store_bsock; - uint64_t fileAddr = 0; /* file address */ - char *rbuf, *wbuf; - int32_t rsize = jcr->buf_size; /* read buffer size */ - POOLMEM *msgsave; - CIPHER_CONTEXT *cipher_ctx = NULL; /* Quell bogus uninitialized warnings */ - const uint8_t *cipher_input; - uint32_t cipher_input_len; - uint32_t cipher_block_size; - uint32_t encrypted_len; + #ifdef FD_NO_SEND_TEST return 1; #endif - msgsave = sd->msg; - rbuf = sd->msg; /* read buffer */ - wbuf = sd->msg; /* write buffer */ - cipher_input = (uint8_t *)rbuf; /* encrypt uncompressed data */ - - Dmsg1(300, "Saving data, type=%d\n", ff_pkt->type); - -#if defined(HAVE_LIBZ) || defined(HAVE_LZO) - uLong compress_len = 0; - uLong max_compress_len = 0; - const Bytef *cbuf = NULL; - #ifdef HAVE_LIBZ - int zstat; - - if ((ff_pkt->flags & FO_COMPRESS) && ff_pkt->Compress_algo == COMPRESS_GZIP) { - if ((ff_pkt->flags & FO_SPARSE) || (ff_pkt->flags & FO_OFFSETS)) { - cbuf = (Bytef *)jcr->compress_buf + OFFSET_FADDR_SIZE; - max_compress_len = jcr->compress_buf_size - OFFSET_FADDR_SIZE; - } else { - cbuf = (Bytef *)jcr->compress_buf; - max_compress_len = jcr->compress_buf_size; /* set max length */ - } - wbuf = jcr->compress_buf; /* compressed output here */ - cipher_input = (uint8_t *)jcr->compress_buf; /* encrypt compressed data */ - - /** - * Only change zlib parameters if there is no pending operation. - * This should never happen as deflatereset is called after each - * deflate. - */ - - if (((z_stream*)jcr->pZLIB_compress_workset)->total_in == 0) { - /** set gzip compression level - must be done per file */ - if ((zstat=deflateParams((z_stream*)jcr->pZLIB_compress_workset, - ff_pkt->Compress_level, Z_DEFAULT_STRATEGY)) != Z_OK) { - Jmsg(jcr, M_FATAL, 0, _("Compression deflateParams error: %d\n"), zstat); - jcr->setJobStatus(JS_ErrorTerminated); - goto err; - } - } - } - #endif - #ifdef HAVE_LZO - Bytef *cbuf2; - int lzores; - comp_stream_header ch; + bctx.rsize = jcr->buf_size; + bctx.fileAddr = 0; + bctx.cipher_ctx = NULL; + bctx.msgsave = sd->msg; + bctx.rbuf = sd->msg; /* read buffer */ + bctx.wbuf = sd->msg; /* write buffer */ + bctx.cipher_input = (uint8_t *)bctx.rbuf; /* encrypt uncompressed data */ - memset(&ch, 0, sizeof(comp_stream_header)); - cbuf2 = NULL; + Dmsg1(300, "Saving data, type=%d\n", bctx.ff_pkt->type); - if ((ff_pkt->flags & FO_COMPRESS) && ff_pkt->Compress_algo == COMPRESS_LZO1X) { - if ((ff_pkt->flags & FO_SPARSE) || (ff_pkt->flags & FO_OFFSETS)) { - cbuf = (Bytef *)jcr->compress_buf + OFFSET_FADDR_SIZE; - cbuf2 = (Bytef *)jcr->compress_buf + OFFSET_FADDR_SIZE + sizeof(comp_stream_header); - max_compress_len = jcr->compress_buf_size - OFFSET_FADDR_SIZE; - } else { - cbuf = (Bytef *)jcr->compress_buf; - cbuf2 = (Bytef *)jcr->compress_buf + sizeof(comp_stream_header); - max_compress_len = jcr->compress_buf_size; /* set max length */ - } - ch.magic = COMPRESS_LZO1X; - ch.version = COMP_HEAD_VERSION; - wbuf = jcr->compress_buf; /* compressed output here */ - cipher_input = (uint8_t *)jcr->compress_buf; /* encrypt compressed data */ + if (!setup_compression(bctx)) { + goto err; } - #endif -#else - const uint32_t max_compress_len = 0; -#endif - - if (ff_pkt->flags & FO_ENCRYPT) { - if ((ff_pkt->flags & FO_SPARSE) || (ff_pkt->flags & FO_OFFSETS)) { - Jmsg0(jcr, M_FATAL, 0, _("Encrypting sparse or offset data not supported.\n")); - goto err; - } - /** Allocate the cipher context */ - if ((cipher_ctx = crypto_cipher_new(jcr->crypto.pki_session, true, - &cipher_block_size)) == NULL) { - /* Shouldn't happen! */ - Jmsg0(jcr, M_FATAL, 0, _("Failed to initialize encryption context.\n")); - goto err; - } - - /** - * Grow the crypto buffer, if necessary. - * crypto_cipher_update() will buffer up to (cipher_block_size - 1). - * We grow crypto_buf to the maximum number of blocks that - * could be returned for the given read buffer size. - * (Using the larger of either rsize or max_compress_len) - */ - jcr->crypto.crypto_buf = check_pool_memory_size(jcr->crypto.crypto_buf, - (MAX(rsize + (int)sizeof(uint32_t), (int32_t)max_compress_len) + - cipher_block_size - 1) / cipher_block_size * cipher_block_size); - wbuf = jcr->crypto.crypto_buf; /* Encrypted, possibly compressed output here. */ + if (bctx.ff_pkt->flags & FO_ENCRYPT && !crypto_allocate_ctx(bctx)) { + return false; } /** @@ -995,7 +613,7 @@ static int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, DIGEST *digest, * */ if (!sd->fsend("%ld %d %lld", jcr->JobFiles, stream, - (int64_t)ff_pkt->statp.st_size)) { + (int64_t)bctx.ff_pkt->statp.st_size)) { if (!jcr->is_job_canceled()) { Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), sd->bstrerror()); @@ -1008,229 +626,74 @@ static int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, DIGEST *digest, * Make space at beginning of buffer for fileAddr because this * same buffer will be used for writing if compression is off. */ - if ((ff_pkt->flags & FO_SPARSE) || (ff_pkt->flags & FO_OFFSETS)) { - rbuf += OFFSET_FADDR_SIZE; - rsize -= OFFSET_FADDR_SIZE; + if ((bctx.ff_pkt->flags & FO_SPARSE) || (bctx.ff_pkt->flags & FO_OFFSETS)) { + bctx.rbuf += OFFSET_FADDR_SIZE; + bctx.rsize -= OFFSET_FADDR_SIZE; #ifdef HAVE_FREEBSD_OS /** * To read FreeBSD partitions, the read size must be * a multiple of 512. */ - rsize = (rsize/512) * 512; + bctx.rsize = (bctx.rsize/512) * 512; #endif } /** a RAW device read on win32 only works if the buffer is a multiple of 512 */ #ifdef HAVE_WIN32 - if (S_ISBLK(ff_pkt->statp.st_mode)) - rsize = (rsize/512) * 512; -#endif - - /** - * Read the file data - */ - while ((sd->msglen=(uint32_t)bread(&ff_pkt->bfd, rbuf, rsize)) > 0) { - - /** Check for sparse blocks */ - if (ff_pkt->flags & FO_SPARSE) { - ser_declare; - bool allZeros = false; - if ((sd->msglen == rsize && - fileAddr+sd->msglen < (uint64_t)ff_pkt->statp.st_size) || - ((ff_pkt->type == FT_RAW || ff_pkt->type == FT_FIFO) && - (uint64_t)ff_pkt->statp.st_size == 0)) { - allZeros = is_buf_zero(rbuf, rsize); - } - if (!allZeros) { - /** Put file address as first data in buffer */ - ser_begin(wbuf, OFFSET_FADDR_SIZE); - ser_uint64(fileAddr); /* store fileAddr in begin of buffer */ - } - fileAddr += sd->msglen; /* update file address */ - /** Skip block of all zeros */ - if (allZeros) { - continue; /* skip block of zeros */ - } - } else if (ff_pkt->flags & FO_OFFSETS) { - ser_declare; - ser_begin(wbuf, OFFSET_FADDR_SIZE); - ser_uint64(ff_pkt->bfd.offset); /* store offset in begin of buffer */ - } - - jcr->ReadBytes += sd->msglen; /* count bytes read */ - - /** Uncompressed cipher input length */ - cipher_input_len = sd->msglen; - - /** Update checksum if requested */ - if (digest) { - crypto_digest_update(digest, (uint8_t *)rbuf, sd->msglen); - } - - /** Update signing digest if requested */ - if (signing_digest) { - crypto_digest_update(signing_digest, (uint8_t *)rbuf, sd->msglen); - } - -#ifdef HAVE_LIBZ - /** Do compression if turned on */ - if (ff_pkt->flags & FO_COMPRESS && ff_pkt->Compress_algo == COMPRESS_GZIP && jcr->pZLIB_compress_workset) { - Dmsg3(400, "cbuf=0x%x rbuf=0x%x len=%u\n", cbuf, rbuf, sd->msglen); - - ((z_stream*)jcr->pZLIB_compress_workset)->next_in = (Bytef *)rbuf; - ((z_stream*)jcr->pZLIB_compress_workset)->avail_in = sd->msglen; - ((z_stream*)jcr->pZLIB_compress_workset)->next_out = (Bytef *)cbuf; - ((z_stream*)jcr->pZLIB_compress_workset)->avail_out = max_compress_len; - - if ((zstat=deflate((z_stream*)jcr->pZLIB_compress_workset, Z_FINISH)) != Z_STREAM_END) { - Jmsg(jcr, M_FATAL, 0, _("Compression deflate error: %d\n"), zstat); - jcr->setJobStatus(JS_ErrorTerminated); - goto err; - } - compress_len = ((z_stream*)jcr->pZLIB_compress_workset)->total_out; - /** reset zlib stream to be able to begin from scratch again */ - if ((zstat=deflateReset((z_stream*)jcr->pZLIB_compress_workset)) != Z_OK) { - Jmsg(jcr, M_FATAL, 0, _("Compression deflateReset error: %d\n"), zstat); - jcr->setJobStatus(JS_ErrorTerminated); - goto err; - } - - Dmsg2(400, "GZIP compressed len=%d uncompressed len=%d\n", compress_len, - sd->msglen); - - sd->msglen = compress_len; /* set compressed length */ - cipher_input_len = compress_len; + if (S_ISBLK(bctx.ff_pkt->statp.st_mode)) { + bctx.rsize = (bctx.rsize/512) * 512; + } + Dmsg1(200, "Fattrs=0X%x\n", bctx.ff_pkt->bfd.fattrs); + if (bctx.ff_pkt->bfd.fattrs & FILE_ATTRIBUTE_ENCRYPTED) { + if (!p_ReadEncryptedFileRaw) { + Jmsg0(bctx.jcr, M_FATAL, 0, _("Windows Encrypted data not supported on this OS.\n")); + goto err; } -#endif -#ifdef HAVE_LZO - /** Do compression if turned on */ - if (ff_pkt->flags & FO_COMPRESS && ff_pkt->Compress_algo == COMPRESS_LZO1X && jcr->LZO_compress_workset) { - lzo_uint len; /* TODO: See with the latest patch how to handle lzo_uint with 64bit */ - - ser_declare; - ser_begin(cbuf, sizeof(comp_stream_header)); - - Dmsg3(400, "cbuf=0x%x rbuf=0x%x len=%u\n", cbuf, rbuf, sd->msglen); - - lzores = lzo1x_1_compress((const unsigned char*)rbuf, sd->msglen, cbuf2, - &len, jcr->LZO_compress_workset); - compress_len = len; - if (lzores == LZO_E_OK && compress_len <= max_compress_len) { - /* complete header */ - ser_uint32(COMPRESS_LZO1X); - ser_uint32(compress_len); - ser_uint16(ch.level); - ser_uint16(ch.version); - } else { - /** this should NEVER happen */ - Jmsg(jcr, M_FATAL, 0, _("Compression LZO error: %d\n"), lzores); - jcr->setJobStatus(JS_ErrorTerminated); - goto err; - } - - Dmsg2(400, "LZO compressed len=%d uncompressed len=%d\n", compress_len, - sd->msglen); - - compress_len += sizeof(comp_stream_header); /* add size of header */ - sd->msglen = compress_len; /* set compressed length */ - cipher_input_len = compress_len; + /* This single call reads all EFS data delivers it to a callback */ + if (p_ReadEncryptedFileRaw((PFE_EXPORT_FUNC)read_efs_data_cb, &bctx, + bctx.ff_pkt->bfd.pvContext) != 0) { + goto err; } + /* All read, so skip to finish sending */ + goto finish_sending; + } + /* Fall through to standard bread() loop */ #endif - /** - * Note, here we prepend the current record length to the beginning - * of the encrypted data. This is because both sparse and compression - * restore handling want records returned to them with exactly the - * same number of bytes that were processed in the backup handling. - * That is, both are block filters rather than a stream. When doing - * compression, the compression routines may buffer data, so that for - * any one record compressed, when it is decompressed the same size - * will not be obtained. Of course, the buffered data eventually comes - * out in subsequent crypto_cipher_update() calls or at least - * when crypto_cipher_finalize() is called. Unfortunately, this - * "feature" of encryption enormously complicates the restore code. - */ - if (ff_pkt->flags & FO_ENCRYPT) { - uint32_t initial_len = 0; - ser_declare; - - if ((ff_pkt->flags & FO_SPARSE) || (ff_pkt->flags & FO_OFFSETS)) { - cipher_input_len += OFFSET_FADDR_SIZE; - } - - /** Encrypt the length of the input block */ - uint8_t packet_len[sizeof(uint32_t)]; - - ser_begin(packet_len, sizeof(uint32_t)); - ser_uint32(cipher_input_len); /* store data len in begin of buffer */ - Dmsg1(20, "Encrypt len=%d\n", cipher_input_len); - - if (!crypto_cipher_update(cipher_ctx, packet_len, sizeof(packet_len), - (uint8_t *)jcr->crypto.crypto_buf, &initial_len)) { - /** Encryption failed. Shouldn't happen. */ - Jmsg(jcr, M_FATAL, 0, _("Encryption error\n")); - goto err; - } - - /** Encrypt the input block */ - if (crypto_cipher_update(cipher_ctx, cipher_input, cipher_input_len, - (uint8_t *)&jcr->crypto.crypto_buf[initial_len], &encrypted_len)) { - if ((initial_len + encrypted_len) == 0) { - /** No full block of data available, read more data */ - continue; - } - Dmsg2(400, "encrypted len=%d unencrypted len=%d\n", encrypted_len, - sd->msglen); - sd->msglen = initial_len + encrypted_len; /* set encrypted length */ - } else { - /** Encryption failed. Shouldn't happen. */ - Jmsg(jcr, M_FATAL, 0, _("Encryption error\n")); - goto err; - } - } - - /* Send the buffer to the Storage daemon */ - if ((ff_pkt->flags & FO_SPARSE) || (ff_pkt->flags & FO_OFFSETS)) { - sd->msglen += OFFSET_FADDR_SIZE; /* include fileAddr in size */ - } - sd->msg = wbuf; /* set correct write buffer */ - if (!sd->send()) { - if (!jcr->is_job_canceled()) { - Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), - sd->bstrerror()); - } + /* + * Normal read the file data in a loop and send it to SD + */ + while ((sd->msglen=(uint32_t)bread(&bctx.ff_pkt->bfd, bctx.rbuf, bctx.rsize)) > 0) { + if (!process_and_send_data(bctx)) { goto err; } - Dmsg1(130, "Send data to SD len=%d\n", sd->msglen); - /* #endif */ - jcr->JobBytes += sd->msglen; /* count bytes saved possibly compressed/encrypted */ - sd->msg = msgsave; /* restore read buffer */ - } /* end while read file data */ + goto finish_sending; +finish_sending: if (sd->msglen < 0) { /* error */ berrno be; Jmsg(jcr, M_ERROR, 0, _("Read error on file %s. ERR=%s\n"), - ff_pkt->fname, be.bstrerror(ff_pkt->bfd.berrno)); + bctx.ff_pkt->fname, be.bstrerror(bctx.ff_pkt->bfd.berrno)); if (jcr->JobErrors++ > 1000) { /* insanity check */ Jmsg(jcr, M_FATAL, 0, _("Too many errors. JobErrors=%d.\n"), jcr->JobErrors); } - } else if (ff_pkt->flags & FO_ENCRYPT) { + } else if (bctx.ff_pkt->flags & FO_ENCRYPT) { /** * For encryption, we must call finalize to push out any * buffered data. */ - if (!crypto_cipher_finalize(cipher_ctx, (uint8_t *)jcr->crypto.crypto_buf, - &encrypted_len)) { + if (!crypto_cipher_finalize(bctx.cipher_ctx, (uint8_t *)jcr->crypto.crypto_buf, + &bctx.encrypted_len)) { /* Padding failed. Shouldn't happen. */ Jmsg(jcr, M_FATAL, 0, _("Encryption padding error\n")); goto err; } /** Note, on SSL pre-0.9.7, there is always some output */ - if (encrypted_len > 0) { - sd->msglen = encrypted_len; /* set encrypted length */ - sd->msg = jcr->crypto.crypto_buf; /* set correct write buffer */ + if (bctx.encrypted_len > 0) { + sd->msglen = bctx.encrypted_len; /* set encrypted length */ + sd->msg = jcr->crypto.crypto_buf; /* set correct write buffer */ if (!sd->send()) { if (!jcr->is_job_canceled()) { Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), @@ -1240,10 +703,11 @@ static int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, DIGEST *digest, } Dmsg1(130, "Send data to SD len=%d\n", sd->msglen); jcr->JobBytes += sd->msglen; /* count bytes saved possibly compressed/encrypted */ - sd->msg = msgsave; /* restore bnet buffer */ + sd->msg = bctx.msgsave; /* restore bnet buffer */ } } + if (!sd->signal(BNET_EOD)) { /* indicate end of file data */ if (!jcr->is_job_canceled()) { Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), @@ -1253,25 +717,160 @@ static int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, DIGEST *digest, } /** Free the cipher context */ - if (cipher_ctx) { - crypto_cipher_free(cipher_ctx); + if (bctx.cipher_ctx) { + crypto_cipher_free(bctx.cipher_ctx); } return 1; err: /** Free the cipher context */ - if (cipher_ctx) { - crypto_cipher_free(cipher_ctx); + if (bctx.cipher_ctx) { + crypto_cipher_free(bctx.cipher_ctx); } - sd->msg = msgsave; /* restore bnet buffer */ + sd->msg = bctx.msgsave; /* restore bnet buffer */ sd->msglen = 0; return 0; } -bool encode_and_send_attributes(JCR *jcr, FF_PKT *ff_pkt, int &data_stream) + +/* + * Apply processing (sparse, compression, encryption, and + * send to the SD. + */ +bool process_and_send_data(bctx_t &bctx) { - BSOCK *sd = jcr->store_bsock; + BSOCK *sd = bctx.sd; + JCR *jcr = bctx.jcr; + + /** Check for sparse blocks */ + if (bctx.ff_pkt->flags & FO_SPARSE) { + ser_declare; + bool allZeros = false; + if ((sd->msglen == bctx.rsize && + bctx.fileAddr+sd->msglen < (uint64_t)bctx.ff_pkt->statp.st_size) || + ((bctx.ff_pkt->type == FT_RAW || bctx.ff_pkt->type == FT_FIFO) && + (uint64_t)bctx.ff_pkt->statp.st_size == 0)) { + allZeros = is_buf_zero(bctx.rbuf, bctx.rsize); + } + if (!allZeros) { + /** Put file address as first data in buffer */ + ser_begin(bctx.wbuf, OFFSET_FADDR_SIZE); + ser_uint64(bctx.fileAddr); /* store fileAddr in begin of buffer */ + } + bctx.fileAddr += sd->msglen; /* update file address */ + /** Skip block of all zeros */ + if (allZeros) { + return true; /* skip block of zeros */ + } + } else if (bctx.ff_pkt->flags & FO_OFFSETS) { + ser_declare; + ser_begin(bctx.wbuf, OFFSET_FADDR_SIZE); + ser_uint64(bctx.ff_pkt->bfd.offset); /* store offset in begin of buffer */ + } + + jcr->ReadBytes += sd->msglen; /* count bytes read */ + + /** Uncompressed cipher input length */ + bctx.cipher_input_len = sd->msglen; + + /** Update checksum if requested */ + if (bctx.digest) { + crypto_digest_update(bctx.digest, (uint8_t *)bctx.rbuf, sd->msglen); + } + + /** Update signing digest if requested */ + if (bctx.signing_digest) { + crypto_digest_update(bctx.signing_digest, (uint8_t *)bctx.rbuf, sd->msglen); + } + + if (have_libz && !do_libz_compression(bctx)) { + goto err; + } + + if (have_lzo && !do_lzo_compression(bctx)) { + goto err; + } + + /** + * Note, here we prepend the current record length to the beginning + * of the encrypted data. This is because both sparse and compression + * restore handling want records returned to them with exactly the + * same number of bytes that were processed in the backup handling. + * That is, both are block filters rather than a stream. When doing + * compression, the compression routines may buffer data, so that for + * any one record compressed, when it is decompressed the same size + * will not be obtained. Of course, the buffered data eventually comes + * out in subsequent crypto_cipher_update() calls or at least + * when crypto_cipher_finalize() is called. Unfortunately, this + * "feature" of encryption enormously complicates the restore code. + */ + if (bctx.ff_pkt->flags & FO_ENCRYPT) { + uint32_t initial_len = 0; + ser_declare; + + if ((bctx.ff_pkt->flags & FO_SPARSE) || (bctx.ff_pkt->flags & FO_OFFSETS)) { + bctx.cipher_input_len += OFFSET_FADDR_SIZE; + } + + /** Encrypt the length of the input block */ + uint8_t packet_len[sizeof(uint32_t)]; + + ser_begin(packet_len, sizeof(uint32_t)); + ser_uint32(bctx.cipher_input_len); /* store data len in begin of buffer */ + Dmsg1(20, "Encrypt len=%d\n", bctx.cipher_input_len); + + if (!crypto_cipher_update(bctx.cipher_ctx, packet_len, sizeof(packet_len), + (uint8_t *)jcr->crypto.crypto_buf, &initial_len)) { + /** Encryption failed. Shouldn't happen. */ + Jmsg(jcr, M_FATAL, 0, _("Encryption error\n")); + goto err; + } + + /** Encrypt the input block */ + if (crypto_cipher_update(bctx.cipher_ctx, bctx.cipher_input, bctx.cipher_input_len, + (uint8_t *)&jcr->crypto.crypto_buf[initial_len], &bctx.encrypted_len)) { + if ((initial_len + bctx.encrypted_len) == 0) { + /** No full block of data available, read more data */ + return true; + } + Dmsg2(400, "encrypted len=%d unencrypted len=%d\n", bctx.encrypted_len, + sd->msglen); + sd->msglen = initial_len + bctx.encrypted_len; /* set encrypted length */ + } else { + /** Encryption failed. Shouldn't happen. */ + Jmsg(jcr, M_FATAL, 0, _("Encryption error\n")); + goto err; + } + } + + /* Send the buffer to the Storage daemon */ + if ((bctx.ff_pkt->flags & FO_SPARSE) || (bctx.ff_pkt->flags & FO_OFFSETS)) { + sd->msglen += OFFSET_FADDR_SIZE; /* include fileAddr in size */ + } + sd->msg = bctx.wbuf; /* set correct write buffer */ + if (!sd->send()) { + if (!jcr->is_job_canceled()) { + Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), + sd->bstrerror()); + } + goto err; + } + Dmsg1(130, "Send data to SD len=%d\n", sd->msglen); + /* #endif */ + jcr->JobBytes += sd->msglen; /* count bytes saved possibly compressed/encrypted */ + sd->msg = bctx.msgsave; /* restore read buffer */ + return true; + +err: + return false; +} + +bool encode_and_send_attributes(bctx_t &bctx) +{ + BSOCK *sd = bctx.jcr->store_bsock; + JCR *jcr = bctx.jcr; + FF_PKT *ff_pkt = bctx.ff_pkt; char attribs[MAXSTRING]; char attribsExBuf[MAXSTRING]; char *attribsEx = NULL; @@ -1279,18 +878,19 @@ bool encode_and_send_attributes(JCR *jcr, FF_PKT *ff_pkt, int &data_stream) int comp_len; bool stat; int hangup = get_hangup(); + int blowup = get_blowup(); #ifdef FD_NO_SEND_TEST return true; #endif Dmsg1(300, "encode_and_send_attrs fname=%s\n", ff_pkt->fname); /** Find what data stream we will use, then encode the attributes */ - if ((data_stream = select_data_stream(ff_pkt)) == STREAM_NONE) { + if ((bctx.data_stream = select_data_stream(ff_pkt)) == STREAM_NONE) { /* This should not happen */ Jmsg0(jcr, M_FATAL, 0, _("Invalid file flags, no supported data stream type.\n")); return false; } - encode_stat(attribs, &ff_pkt->statp, sizeof(ff_pkt->statp), ff_pkt->LinkFI, data_stream); + encode_stat(attribs, &ff_pkt->statp, sizeof(ff_pkt->statp), ff_pkt->LinkFI, bctx.data_stream); /** Now possibly extend the attributes */ if (IS_FT_OBJECT(ff_pkt->type)) { @@ -1309,20 +909,26 @@ bool encode_and_send_attributes(JCR *jcr, FF_PKT *ff_pkt, int &data_stream) jcr->unlock(); /* Debug code: check if we must hangup */ - if (hangup && (jcr->JobFiles > (uint32_t)hangup)) { + if (hangup > 0 && (jcr->JobFiles > (uint32_t)hangup)) { + jcr->setJobStatus(JS_Incomplete); Jmsg1(jcr, M_FATAL, 0, "Debug hangup requested after %d files.\n", hangup); set_hangup(0); return false; } + if (blowup > 0 && (jcr->JobFiles > (uint32_t)blowup)) { + Jmsg1(jcr, M_ABORT, 0, "Debug blowup requested after %d files.\n", blowup); + return false; + } + /** * Send Attributes header to Storage daemon * */ if (!sd->fsend("%ld %d 0", jcr->JobFiles, attr_stream)) { - if (!jcr->is_canceled()) { - Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), - sd->bstrerror()); + if (!jcr->is_canceled() && !jcr->is_incomplete()) { + Jmsg2(jcr, M_FATAL, 0, _("Network send error to SD. Data=%s ERR=%s\n"), + sd->msg, sd->bstrerror()); } return false; } @@ -1427,7 +1033,271 @@ bool encode_and_send_attributes(JCR *jcr, FF_PKT *ff_pkt, int &data_stream) return stat; } -/** +/* + * Setup bctx for doing compression + */ +static bool setup_compression(bctx_t &bctx) +{ + JCR *jcr = bctx.jcr; + +#if defined(HAVE_LIBZ) || defined(HAVE_LZO) + bctx.compress_len = 0; + bctx.max_compress_len = 0; + bctx.cbuf = NULL; + #ifdef HAVE_LIBZ + int zstat; + + if ((bctx.ff_pkt->flags & FO_COMPRESS) && bctx.ff_pkt->Compress_algo == COMPRESS_GZIP) { + if ((bctx.ff_pkt->flags & FO_SPARSE) || (bctx.ff_pkt->flags & FO_OFFSETS)) { + bctx.cbuf = (Bytef *)jcr->compress_buf + OFFSET_FADDR_SIZE; + bctx.max_compress_len = jcr->compress_buf_size - OFFSET_FADDR_SIZE; + } else { + bctx.cbuf = (Bytef *)jcr->compress_buf; + bctx.max_compress_len = jcr->compress_buf_size; /* set max length */ + } + bctx.wbuf = jcr->compress_buf; /* compressed output here */ + bctx.cipher_input = (uint8_t *)jcr->compress_buf; /* encrypt compressed data */ + + /** + * Only change zlib parameters if there is no pending operation. + * This should never happen as deflatereset is called after each + * deflate. + */ + + if (((z_stream*)jcr->pZLIB_compress_workset)->total_in == 0) { + /** set gzip compression level - must be done per file */ + if ((zstat=deflateParams((z_stream*)jcr->pZLIB_compress_workset, + bctx.ff_pkt->Compress_level, Z_DEFAULT_STRATEGY)) != Z_OK) { + Jmsg(jcr, M_FATAL, 0, _("Compression deflateParams error: %d\n"), zstat); + jcr->setJobStatus(JS_ErrorTerminated); + return false; + } + } + } + #endif + #ifdef HAVE_LZO + memset(&bctx.ch, 0, sizeof(comp_stream_header)); + bctx.cbuf2 = NULL; + + if ((bctx.ff_pkt->flags & FO_COMPRESS) && bctx.ff_pkt->Compress_algo == COMPRESS_LZO1X) { + if ((bctx.ff_pkt->flags & FO_SPARSE) || (bctx.ff_pkt->flags & FO_OFFSETS)) { + bctx.cbuf = (Bytef *)jcr->compress_buf + OFFSET_FADDR_SIZE; + bctx.cbuf2 = (Bytef *)jcr->compress_buf + OFFSET_FADDR_SIZE + sizeof(comp_stream_header); + bctx.max_compress_len = jcr->compress_buf_size - OFFSET_FADDR_SIZE; + } else { + bctx.cbuf = (Bytef *)jcr->compress_buf; + bctx.cbuf2 = (Bytef *)jcr->compress_buf + sizeof(comp_stream_header); + bctx.max_compress_len = jcr->compress_buf_size; /* set max length */ + } + bctx.ch.magic = COMPRESS_LZO1X; + bctx.ch.version = COMP_HEAD_VERSION; + bctx.wbuf = jcr->compress_buf; /* compressed output here */ + bctx.cipher_input = (uint8_t *)jcr->compress_buf; /* encrypt compressed data */ + } + #endif +#else + bctx.max_compress_len = 0; +#endif + return true; +} + +/* + * Send MacOS resource fork to SD + */ +#ifdef HAVE_DARWIN_OS +static bool send_resource_fork(bctx_t &bctx) +{ + FF_PKT *ff_pkt = bctx.ff_pkt; + JCR *jcr = bctx.jcr; + BSOCK *sd = bctx.sd; + int stat; + + /** Regular files can have resource forks and Finder Info */ + if (ff_pkt->type != FT_LNKSAVED && (S_ISREG(ff_pkt->statp.st_mode) && + ff_pkt->flags & FO_HFSPLUS)) { + if (ff_pkt->hfsinfo.rsrclength > 0) { + int flags; + int rsrc_stream; + if (bopen_rsrc(&ff_pkt->bfd, ff_pkt->fname, O_RDONLY | O_BINARY, 0) < 0) { + ff_pkt->ff_errno = errno; + berrno be; + Jmsg(jcr, M_NOTSAVED, -1, _(" Cannot open resource fork for \"%s\": ERR=%s.\n"), + ff_pkt->fname, be.bstrerror()); + jcr->JobErrors++; + if (is_bopen(&ff_pkt->bfd)) { + bclose(&ff_pkt->bfd); + } + return true; + } + flags = ff_pkt->flags; + ff_pkt->flags &= ~(FO_COMPRESS|FO_SPARSE|FO_OFFSETS); + if (flags & FO_ENCRYPT) { + rsrc_stream = STREAM_ENCRYPTED_MACOS_FORK_DATA; + } else { + rsrc_stream = STREAM_MACOS_FORK_DATA; + } + stat = send_data(bctx, rsrc_stream); + ff_pkt->flags = flags; + bclose(&ff_pkt->bfd); + if (!stat) { + return false; + } + } + + Dmsg1(300, "Saving Finder Info for \"%s\"\n", ff_pkt->fname); + sd->fsend("%ld %d 0", jcr->JobFiles, STREAM_HFSPLUS_ATTRIBUTES); + Dmsg1(300, "bfiled>stored:header %s\n", sd->msg); + pm_memcpy(sd->msg, ff_pkt->hfsinfo.fndrinfo, 32); + sd->msglen = 32; + if (bctx.digest) { + crypto_digest_update(bctx.digest, (uint8_t *)sd->msg, sd->msglen); + } + if (bctx.signing_digest) { + crypto_digest_update(bctx.signing_digest, (uint8_t *)sd->msg, sd->msglen); + } + sd->send(); + sd->signal(BNET_EOD); + } + return true; +} +#endif + +static bool do_libz_compression(bctx_t &bctx) +{ +#ifdef HAVE_LIBZ + JCR *jcr = bctx.jcr; + BSOCK *sd = bctx.sd; + int zstat; + + /** Do compression if turned on */ + if (bctx.ff_pkt->flags & FO_COMPRESS && bctx.ff_pkt->Compress_algo == COMPRESS_GZIP && jcr->pZLIB_compress_workset) { + Dmsg3(400, "cbuf=0x%x rbuf=0x%x len=%u\n", bctx.cbuf, bctx.rbuf, sd->msglen); + + ((z_stream*)jcr->pZLIB_compress_workset)->next_in = (Bytef *)bctx.rbuf; + ((z_stream*)jcr->pZLIB_compress_workset)->avail_in = sd->msglen; + ((z_stream*)jcr->pZLIB_compress_workset)->next_out = bctx.cbuf; + ((z_stream*)jcr->pZLIB_compress_workset)->avail_out = bctx.max_compress_len; + + if ((zstat=deflate((z_stream*)jcr->pZLIB_compress_workset, Z_FINISH)) != Z_STREAM_END) { + Jmsg(jcr, M_FATAL, 0, _("Compression deflate error: %d\n"), zstat); + jcr->setJobStatus(JS_ErrorTerminated); + return false; + } + bctx.compress_len = ((z_stream*)jcr->pZLIB_compress_workset)->total_out; + /** reset zlib stream to be able to begin from scratch again */ + if ((zstat=deflateReset((z_stream*)jcr->pZLIB_compress_workset)) != Z_OK) { + Jmsg(jcr, M_FATAL, 0, _("Compression deflateReset error: %d\n"), zstat); + jcr->setJobStatus(JS_ErrorTerminated); + return false; + } + + Dmsg2(400, "GZIP compressed len=%d uncompressed len=%d\n", bctx.compress_len, + sd->msglen); + + sd->msglen = bctx.compress_len; /* set compressed length */ + bctx.cipher_input_len = bctx.compress_len; + } +#endif + return true; +} + +static bool do_lzo_compression(bctx_t &bctx) +{ +#ifdef HAVE_LZO + JCR *jcr = bctx.jcr; + BSOCK *sd = bctx.sd; + int lzores; + + /** Do compression if turned on */ + if (bctx.ff_pkt->flags & FO_COMPRESS && bctx.ff_pkt->Compress_algo == COMPRESS_LZO1X && jcr->LZO_compress_workset) { + lzo_uint len; /* TODO: See with the latest patch how to handle lzo_uint with 64bit */ + + ser_declare; + ser_begin(bctx.cbuf, sizeof(comp_stream_header)); + + Dmsg3(400, "cbuf=0x%x rbuf=0x%x len=%u\n", bctx.cbuf, bctx.rbuf, sd->msglen); + + lzores = lzo1x_1_compress((const unsigned char*)bctx.rbuf, sd->msglen, bctx.cbuf2, + &len, jcr->LZO_compress_workset); + bctx.compress_len = len; + if (lzores == LZO_E_OK && bctx.compress_len <= bctx.max_compress_len) { + /* complete header */ + ser_uint32(COMPRESS_LZO1X); + ser_uint32(bctx.compress_len); + ser_uint16(bctx.ch.level); + ser_uint16(bctx.ch.version); + } else { + /** this should NEVER happen */ + Jmsg(jcr, M_FATAL, 0, _("Compression LZO error: %d\n"), lzores); + jcr->setJobStatus(JS_ErrorTerminated); + return false; + } + + Dmsg2(400, "LZO compressed len=%d uncompressed len=%d\n", bctx.compress_len, + sd->msglen); + + bctx.compress_len += sizeof(comp_stream_header); /* add size of header */ + sd->msglen = bctx.compress_len; /* set compressed length */ + bctx.cipher_input_len = bctx.compress_len; + } +#endif + return true; +} + +/* + * Do in place strip of path + */ +static bool do_snap_strip(FF_PKT *ff) +{ + /* if the string starts with the snapshot path name, we can replace + * by the volume name. The volume_path is smaller than the snapshot_path + * snapshot_path = volume_path + /.snapshots/job-xxxx + */ + ASSERT(strlen(ff->snapshot_path) > strlen(ff->volume_path)); + int sp_first = strlen(ff->snapshot_path); /* point after snapshot_path in fname */ + if (strncmp(ff->fname, ff->snapshot_path, sp_first) == 0) { + int last = pm_strcpy(ff->snap_fname, ff->volume_path); + last = MAX(last - 1, 0); + + if (ff->snap_fname[last] == '/') { + if (ff->fname[sp_first] == '/') { /* compare with the first character of the string (sp_first not sp_first-1) */ + ff->snap_fname[last] = 0; + } + } else { + if (ff->fname[sp_first] != '/') { + pm_strcat(ff->snap_fname, "/"); + } + } + + pm_strcat(ff->snap_fname, ff->fname + sp_first); + ASSERT(strlen(ff->fname) > strlen(ff->snap_fname)); + strcpy(ff->fname, ff->snap_fname); + Dmsg2(DT_SNAPSHOT|20, "%s -> %s\n", ff->fname_save, ff->fname); + } + if (strncmp(ff->link, ff->snapshot_path, sp_first) == 0) { + int last = pm_strcpy(ff->snap_fname, ff->volume_path); + last = MAX(last - 1, 0); + + if (ff->snap_fname[last] == '/') { + if (ff->link[sp_first] == '/') { /* compare with the first character of the string (sp_first not sp_first-1) */ + ff->snap_fname[last] = 0; + } + } else { + if (ff->link[sp_first] != '/') { + pm_strcat(ff->snap_fname, "/"); + } + } + + pm_strcat(ff->snap_fname, ff->link + sp_first); + ASSERT(strlen(ff->link) > strlen(ff->snap_fname)); + strcpy(ff->link, ff->snap_fname); + Dmsg2(DT_SNAPSHOT|20, "%s -> %s\n", ff->link_save, ff->link); + } + + return true; +} + +/* * Do in place strip of path */ static bool do_strip(int count, char *in) @@ -1472,16 +1342,23 @@ static bool do_strip(int count, char *in) * for dealing with snapshots, by removing the snapshot directory, or * in handling vendor migrations where files have been restored with * a vendor product into a subdirectory. + * + * When we are using snapshots, we might need to convert the path + * back to the original one using the strip_snap_path option. */ void strip_path(FF_PKT *ff_pkt) { - if (!(ff_pkt->flags & FO_STRIPPATH) || ff_pkt->strip_path <= 0) { + if (!ff_pkt->strip_snap_path && + (!(ff_pkt->flags & FO_STRIPPATH) || ff_pkt->strip_path <= 0)) + { Dmsg1(200, "No strip for %s\n", ff_pkt->fname); return; } + /* shared part between strip and snapshot */ if (!ff_pkt->fname_save) { ff_pkt->fname_save = get_pool_memory(PM_FNAME); ff_pkt->link_save = get_pool_memory(PM_FNAME); + *ff_pkt->link_save = 0; } pm_strcpy(ff_pkt->fname_save, ff_pkt->fname); if (ff_pkt->type != FT_LNK && ff_pkt->fname != ff_pkt->link) { @@ -1489,6 +1366,19 @@ void strip_path(FF_PKT *ff_pkt) Dmsg2(500, "strcpy link_save=%d link=%d\n", strlen(ff_pkt->link_save), strlen(ff_pkt->link)); Dsm_check(200); + } + + if (ff_pkt->strip_snap_path) { + if (!do_snap_strip(ff_pkt)) { + Dmsg1(0, "Something wrong with do_snap_strip(%s)\n", ff_pkt->fname); + unstrip_path(ff_pkt); + goto rtn; + } + } + + /* See if we want also to strip the path */ + if (!(ff_pkt->flags & FO_STRIPPATH) || ff_pkt->strip_path <= 0) { + goto rtn; } /** @@ -1511,21 +1401,24 @@ void strip_path(FF_PKT *ff_pkt) } rtn: - Dmsg3(100, "fname=%s stripped=%s link=%s\n", ff_pkt->fname_save, ff_pkt->fname, + Dmsg3(10, "fname=%s stripped=%s link=%s\n", ff_pkt->fname_save, ff_pkt->fname, ff_pkt->link); } void unstrip_path(FF_PKT *ff_pkt) { - if (!(ff_pkt->flags & FO_STRIPPATH) || ff_pkt->strip_path <= 0) { + if (!ff_pkt->strip_snap_path && + (!(ff_pkt->flags & FO_STRIPPATH) || ff_pkt->strip_path <= 0)) + { return; } + strcpy(ff_pkt->fname, ff_pkt->fname_save); if (ff_pkt->type != FT_LNK && ff_pkt->fname != ff_pkt->link) { - Dmsg2(500, "strcpy link=%s link_save=%s\n", ff_pkt->link, + Dmsg2(10, "strcpy link=%s link_save=%s\n", ff_pkt->link, ff_pkt->link_save); strcpy(ff_pkt->link, ff_pkt->link_save); - Dmsg2(500, "strcpy link=%d link_save=%d\n", strlen(ff_pkt->link), + Dmsg2(10, "strcpy link=%d link_save=%d\n", strlen(ff_pkt->link), strlen(ff_pkt->link_save)); Dsm_check(200); } @@ -1536,7 +1429,7 @@ static void close_vss_backup_session(JCR *jcr) #if defined(WIN32_VSS) /* STOP VSS ON WIN32 */ /* tell vss to close the backup session */ - if (jcr->VSS) { + if (jcr->Snapshot) { if (g_pVSSClient->CloseBackup()) { /* inform user about writer states */ for (int i=0; i<(int)g_pVSSClient->GetWriterCount(); i++) { diff --git a/bacula/src/filed/backup.h b/bacula/src/filed/backup.h new file mode 100644 index 0000000000..4ce8c1c039 --- /dev/null +++ b/bacula/src/filed/backup.h @@ -0,0 +1,80 @@ +/* + Bacula(R) - The Network Backup Solution + + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2014 Free Software Foundation Europe e.V. + + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. + + You may use this file and others of this release according to the + license defined in the LICENSE file, which includes the Affero General + Public License, v3.0 ("AGPLv3") and some additional permissions and + terms pursuant to its AGPLv3 Section 7. + + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + +#ifndef __BACKUP_H +#define __BACKUP_H + +#include "ch.h" + +/* + * Define a backup context + */ +struct bctx_t { + /* Global variables */ + JCR *jcr; + FF_PKT *ff_pkt; /* find file packet */ + int data_stream; + BSOCK *sd; + uint64_t fileAddr; + char *rbuf, *wbuf; + int32_t rsize; + POOLMEM *msgsave; + + /* Crypto variables */ + DIGEST *digest; + DIGEST *signing_digest; + int digest_stream; + SIGNATURE *sig; + CIPHER_CONTEXT *cipher_ctx; + const uint8_t *cipher_input; + uint32_t cipher_input_len; + uint32_t cipher_block_size; + uint32_t encrypted_len; + + /* Compression variables */ +#if defined(HAVE_LIBZ) || defined(HAVE_LZO) + uLong compress_len; + uLong max_compress_len; + Bytef *cbuf; + Bytef *cbuf2; +#endif +#ifdef HAVE_LZO + comp_stream_header ch; +#endif + +}; + +bool crypto_setup_digests(bctx_t &bctx); +bool crypto_terminate_digests(bctx_t &bctx); +bool crypto_session_start(JCR *jcr); +void crypto_session_end(JCR *jcr); +bool crypto_session_send(JCR *jcr, BSOCK *sd); +bool crypto_allocate_ctx(bctx_t &bctx); +void crypto_free(bctx_t &bctx); + +bool encode_and_send_attributes(bctx_t &bctx); + +bool process_and_send_data(bctx_t &bctx); + +#ifdef HAVE_WIN32 +DWORD WINAPI read_efs_data_cb(PBYTE pbData, PVOID pvCallbackContext, ULONG ulLength); +#endif + +#endif diff --git a/bacula/src/filed/bacula-fd.conf.in b/bacula/src/filed/bacula-fd.conf.in index 67171a9cd6..2c05dd9038 100644 --- a/bacula/src/filed/bacula-fd.conf.in +++ b/bacula/src/filed/bacula-fd.conf.in @@ -6,6 +6,10 @@ # There is not much to change here except perhaps the # File daemon Name to # +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # # List Directors who are permitted to contact this File daemon diff --git a/bacula/src/filed/crypto.c b/bacula/src/filed/crypto.c new file mode 100644 index 0000000000..f3eabd588a --- /dev/null +++ b/bacula/src/filed/crypto.c @@ -0,0 +1,322 @@ +/* + Bacula(R) - The Network Backup Solution + + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2014 Free Software Foundation Europe e.V. + + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. + + You may use this file and others of this release according to the + license defined in the LICENSE file, which includes the Affero General + Public License, v3.0 ("AGPLv3") and some additional permissions and + terms pursuant to its AGPLv3 Section 7. + + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. + */ +/* + * Crypto subroutines used in backup.c + * + * Split from backup.c August 2014 + * + * Kern Sibbald, August MMXIV + * + */ + +#include "bacula.h" +#include "filed.h" +#include "ch.h" +#include "backup.h" + + +bool crypto_allocate_ctx(bctx_t &bctx) +{ + JCR *jcr = bctx.jcr; + + if ((bctx.ff_pkt->flags & FO_SPARSE) || (bctx.ff_pkt->flags & FO_OFFSETS)) { + Jmsg0(jcr, M_FATAL, 0, _("Encrypting sparse or offset data not supported.\n")); + return false; + } + /** Allocate the cipher context */ + if ((bctx.cipher_ctx = crypto_cipher_new(jcr->crypto.pki_session, true, + &bctx.cipher_block_size)) == NULL) { + /* Shouldn't happen! */ + Jmsg0(jcr, M_FATAL, 0, _("Failed to initialize encryption context.\n")); + return false; + } + + /** + * Grow the crypto buffer, if necessary. + * crypto_cipher_update() will buffer up to (cipher_block_size - 1). + * We grow crypto_buf to the maximum number of blocks that + * could be returned for the given read buffer size. + * (Using the larger of either rsize or max_compress_len) + */ + jcr->crypto.crypto_buf = check_pool_memory_size(jcr->crypto.crypto_buf, + (MAX(bctx.rsize + (int)sizeof(uint32_t), (int32_t)bctx.max_compress_len) + + bctx.cipher_block_size - 1) / bctx.cipher_block_size * bctx.cipher_block_size); + + bctx.wbuf = jcr->crypto.crypto_buf; /* Encrypted, possibly compressed output here. */ + return true; +} + + +bool crypto_setup_digests(bctx_t &bctx) +{ + JCR *jcr = bctx.jcr; + FF_PKT *ff_pkt = bctx.ff_pkt; + + crypto_digest_t signing_algorithm = (crypto_digest_t)me->pki_digest; + + /** + * Setup for digest handling. If this fails, the digest will be set to NULL + * and not used. Note, the digest (file hash) can be any one of the four + * algorithms below. + * + * The signing digest is a single algorithm depending on + * whether or not we have SHA2. + * ****FIXME**** the signing algoritm should really be + * determined a different way!!!!!! What happens if + * sha2 was available during backup but not restore? + */ + if (ff_pkt->flags & FO_MD5) { + bctx.digest = crypto_digest_new(jcr, CRYPTO_DIGEST_MD5); + bctx.digest_stream = STREAM_MD5_DIGEST; + + } else if (ff_pkt->flags & FO_SHA1) { + bctx.digest = crypto_digest_new(jcr, CRYPTO_DIGEST_SHA1); + bctx.digest_stream = STREAM_SHA1_DIGEST; + + } else if (ff_pkt->flags & FO_SHA256) { + bctx.digest = crypto_digest_new(jcr, CRYPTO_DIGEST_SHA256); + bctx.digest_stream = STREAM_SHA256_DIGEST; + + } else if (ff_pkt->flags & FO_SHA512) { + bctx.digest = crypto_digest_new(jcr, CRYPTO_DIGEST_SHA512); + bctx.digest_stream = STREAM_SHA512_DIGEST; + } + + /** Did digest initialization fail? */ + if (bctx.digest_stream != STREAM_NONE && bctx.digest == NULL) { + Jmsg(jcr, M_WARNING, 0, _("%s digest initialization failed\n"), + stream_to_ascii(bctx.digest_stream)); + } + + /** + * Set up signature digest handling. If this fails, the signature digest + * will be set to NULL and not used. + */ + /* TODO landonf: We should really only calculate the digest once, for + * both verification and signing. + */ + if (jcr->crypto.pki_sign) { + bctx.signing_digest = crypto_digest_new(jcr, signing_algorithm); + + /** Full-stop if a failure occurred initializing the signature digest */ + if (bctx.signing_digest == NULL) { + Jmsg(jcr, M_NOTSAVED, 0, _("%s signature digest initialization failed\n"), + stream_to_ascii(signing_algorithm)); + jcr->JobErrors++; + return false; + } + } + + /** Enable encryption */ + if (jcr->crypto.pki_encrypt) { + ff_pkt->flags |= FO_ENCRYPT; + } + return true; +} + + +bool crypto_session_start(JCR *jcr) +{ + crypto_cipher_t cipher = (crypto_cipher_t) me->pki_cipher; + + /** + * Create encryption session data and a cached, DER-encoded session data + * structure. We use a single session key for each backup, so we'll encode + * the session data only once. + */ + if (jcr->crypto.pki_encrypt) { + uint32_t size = 0; + + /** Create per-job session encryption context */ + jcr->crypto.pki_session = crypto_session_new(cipher, jcr->crypto.pki_recipients); + if (!jcr->crypto.pki_session) { + Jmsg(jcr, M_FATAL, 0, _("Unsupported cipher on this system.\n")); + return false; + } + + /** Get the session data size */ + if (!crypto_session_encode(jcr->crypto.pki_session, (uint8_t *)0, &size)) { + Jmsg(jcr, M_FATAL, 0, _("An error occurred while encrypting the stream.\n")); + return false; + } + + /** Allocate buffer */ + jcr->crypto.pki_session_encoded = get_memory(size); + + /** Encode session data */ + if (!crypto_session_encode(jcr->crypto.pki_session, (uint8_t *)jcr->crypto.pki_session_encoded, &size)) { + Jmsg(jcr, M_FATAL, 0, _("An error occurred while encrypting the stream.\n")); + return false; + } + + /** ... and store the encoded size */ + jcr->crypto.pki_session_encoded_size = size; + + /** Allocate the encryption/decryption buffer */ + jcr->crypto.crypto_buf = get_memory(CRYPTO_CIPHER_MAX_BLOCK_SIZE); + } + return true; +} + +void crypto_session_end(JCR *jcr) +{ + if (jcr->crypto.crypto_buf) { + free_pool_memory(jcr->crypto.crypto_buf); + jcr->crypto.crypto_buf = NULL; + } + if (jcr->crypto.pki_session) { + crypto_session_free(jcr->crypto.pki_session); + } + if (jcr->crypto.pki_session_encoded) { + free_pool_memory(jcr->crypto.pki_session_encoded); + jcr->crypto.pki_session_encoded = NULL; + } +} + +bool crypto_session_send(JCR *jcr, BSOCK *sd) +{ + POOLMEM *msgsave; + + /** Send our header */ + Dmsg2(100, "Send hdr fi=%ld stream=%d\n", jcr->JobFiles, STREAM_ENCRYPTED_SESSION_DATA); + sd->fsend("%ld %d %lld", jcr->JobFiles, STREAM_ENCRYPTED_SESSION_DATA, + (int64_t)jcr->ff->statp.st_size); + msgsave = sd->msg; + sd->msg = jcr->crypto.pki_session_encoded; + sd->msglen = jcr->crypto.pki_session_encoded_size; + jcr->JobBytes += sd->msglen; + + Dmsg1(100, "Send data len=%d\n", sd->msglen); + sd->send(); + sd->msg = msgsave; + sd->signal(BNET_EOD); + return true; +} + +bool crypto_terminate_digests(bctx_t &bctx) +{ + JCR *jcr; + BSOCK *sd; + FF_PKT *ff_pkt; + + jcr = bctx.jcr; + sd = bctx.sd; + ff_pkt = bctx.ff_pkt; + + /** Terminate the signing digest and send it to the Storage daemon */ + if (bctx.signing_digest) { + uint32_t size = 0; + + if ((bctx.sig = crypto_sign_new(jcr)) == NULL) { + Jmsg(jcr, M_FATAL, 0, _("Failed to allocate memory for crypto signature.\n")); + return false; + } + + if (!crypto_sign_add_signer(bctx.sig, bctx.signing_digest, jcr->crypto.pki_keypair)) { + Jmsg(jcr, M_FATAL, 0, _("An error occurred while adding signer the stream.\n")); + return false; + } + + /** Get signature size */ + if (!crypto_sign_encode(bctx.sig, NULL, &size)) { + Jmsg(jcr, M_FATAL, 0, _("An error occurred while signing the stream.\n")); + return false; + } + + /** Grow the bsock buffer to fit our message if necessary */ + if (sizeof_pool_memory(sd->msg) < (int32_t)size) { + sd->msg = realloc_pool_memory(sd->msg, size); + } + + /** Send our header */ + sd->fsend("%ld %ld 0", jcr->JobFiles, STREAM_SIGNED_DIGEST); + Dmsg1(300, "bfiled>stored:header %s\n", sd->msg); + + /** Encode signature data */ + if (!crypto_sign_encode(bctx.sig, (uint8_t *)sd->msg, &size)) { + Jmsg(jcr, M_FATAL, 0, _("An error occurred while signing the stream.\n")); + return false; + } + + sd->msglen = size; + sd->send(); + sd->signal(BNET_EOD); /* end of checksum */ + } + + /** Terminate any digest and send it to Storage daemon */ + if (bctx.digest) { + uint32_t size; + + sd->fsend("%ld %d 0", jcr->JobFiles, bctx.digest_stream); + Dmsg1(300, "bfiled>stored:header %s\n", sd->msg); + + size = CRYPTO_DIGEST_MAX_SIZE; + + /** Grow the bsock buffer to fit our message if necessary */ + if (sizeof_pool_memory(sd->msg) < (int32_t)size) { + sd->msg = realloc_pool_memory(sd->msg, size); + } + + if (!crypto_digest_finalize(bctx.digest, (uint8_t *)sd->msg, &size)) { + Jmsg(jcr, M_FATAL, 0, _("An error occurred finalizing signing the stream.\n")); + return false; + } + + /* Keep the checksum if this file is a hardlink */ + if (ff_pkt->linked) { + ff_pkt_set_link_digest(ff_pkt, bctx.digest_stream, sd->msg, size); + } + + sd->msglen = size; + sd->send(); + sd->signal(BNET_EOD); /* end of checksum */ + } + + /* Check if original file has a digest, and send it */ + if (ff_pkt->type == FT_LNKSAVED && ff_pkt->digest) { + Dmsg2(300, "Link %s digest %d\n", ff_pkt->fname, ff_pkt->digest_len); + sd->fsend("%ld %d 0", jcr->JobFiles, ff_pkt->digest_stream); + + sd->msg = check_pool_memory_size(sd->msg, ff_pkt->digest_len); + memcpy(sd->msg, ff_pkt->digest, ff_pkt->digest_len); + sd->msglen = ff_pkt->digest_len; + sd->send(); + + sd->signal(BNET_EOD); /* end of hardlink record */ + } + + return true; +} + +void crypto_free(bctx_t &bctx) +{ + if (bctx.digest) { + crypto_digest_free(bctx.digest); + bctx.digest = NULL; + } + if (bctx.signing_digest) { + crypto_digest_free(bctx.signing_digest); + bctx.signing_digest = NULL; + } + if (bctx.sig) { + crypto_sign_free(bctx.sig); + bctx.sig = NULL; + } +} diff --git a/bacula/src/filed/estimate.c b/bacula/src/filed/estimate.c index 26fe43fde6..216b69d645 100644 --- a/bacula/src/filed/estimate.c +++ b/bacula/src/filed/estimate.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula File Daemon estimate.c diff --git a/bacula/src/filed/fd_plugins.c b/bacula/src/filed/fd_plugins.c index 84fba4b946..922d1e0ab3 100644 --- a/bacula/src/filed/fd_plugins.c +++ b/bacula/src/filed/fd_plugins.c @@ -1,23 +1,27 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /** * Main program to test loading and running Bacula plugins. * Destined to become Bacula pluginloader, ... * - * Written by Kern Sibbald, October 2007 + * Kern Sibbald, October 2007 */ #include "bacula.h" #include "filed.h" @@ -26,14 +30,9 @@ extern CLIENT *me; extern DLL_IMP_EXP char *exepath; extern DLL_IMP_EXP char *version; extern DLL_IMP_EXP char *dist_name; -extern DLL_IMP_EXP int beef; const int dbglvl = 150; -#ifdef HAVE_WIN32 -const char *plugin_type = "-fd.dll"; -#else const char *plugin_type = "-fd.so"; -#endif extern int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level); extern bool check_changes(JCR *jcr, FF_PKT *ff_pkt); @@ -180,7 +179,7 @@ void generate_plugin_event(JCR *jcr, bEventType eventType, void *value) restore_object_pkt *rop; Dsm_check(999); - if (!bplugin_list || !jcr || !jcr->plugin_ctx_list) { + if (!b_plugin_list || !jcr || !jcr->plugin_ctx_list) { return; /* Return if no plugins loaded */ } @@ -213,7 +212,7 @@ void generate_plugin_event(JCR *jcr, bEventType eventType, void *value) call_if_canceled = true; /* plugin *must* see this call */ break; case bEventStartRestoreJob: - foreach_alist_index(i, plugin, bplugin_list) { + foreach_alist_index(i, plugin, b_plugin_list) { plugin->restoreFileStarted = false; plugin->createFileCalled = false; } @@ -239,7 +238,7 @@ void generate_plugin_event(JCR *jcr, bEventType eventType, void *value) * Pass event to every plugin (except if name is set). If name * is set, we pass it only to the plugin with that name. */ - foreach_alist_index(i, plugin, bplugin_list) { + foreach_alist_index(i, plugin, b_plugin_list) { if (!for_this_plugin(plugin, name, len)) { Dmsg2(dbglvl, "Not for this plugin name=%s NULL=%d\n", name, name==NULL?1:0); @@ -280,7 +279,7 @@ bool plugin_check_file(JCR *jcr, char *fname) int i; Dsm_check(999); - if (!bplugin_list || !jcr || !jcr->plugin_ctx_list || jcr->is_job_canceled()) { + if (!b_plugin_list || !jcr || !jcr->plugin_ctx_list || jcr->is_job_canceled()) { return false; /* Return if no plugins loaded */ } @@ -289,7 +288,7 @@ bool plugin_check_file(JCR *jcr, char *fname) Dmsg2(dbglvl, "plugin_ctx=%p JobId=%d\n", jcr->plugin_ctx_list, jcr->JobId); /* Pass event to every plugin */ - foreach_alist_index(i, plugin, bplugin_list) { + foreach_alist_index(i, plugin, b_plugin_list) { jcr->plugin_ctx = &plugin_ctx_list[i]; jcr->plugin = plugin; if (is_plugin_disabled(jcr)) { @@ -408,7 +407,7 @@ bRC plugin_option_handle_file(JCR *jcr, FF_PKT *ff_pkt, struct save_pkt *sp) sp->delta_seq = ff_pkt->delta_seq; sp->accurate_found = ff_pkt->accurate_found; - if (!bplugin_list || !jcr->plugin_ctx_list || jcr->is_job_canceled()) { + if (!b_plugin_list || !jcr->plugin_ctx_list || jcr->is_job_canceled()) { Jmsg1(jcr, M_FATAL, 0, "Command plugin \"%s\" requested, but is not loaded.\n", cmd); goto bail_out; /* Return if no plugins loaded */ } @@ -418,7 +417,7 @@ bRC plugin_option_handle_file(JCR *jcr, FF_PKT *ff_pkt, struct save_pkt *sp) } /* Note, we stop the loop on the first plugin that matches the name */ - foreach_alist_index(i, plugin, bplugin_list) { + foreach_alist_index(i, plugin, b_plugin_list) { Dmsg4(dbglvl, "plugin=%s plen=%d cmd=%s len=%d\n", plugin->file, plugin->file_len, cmd, len); if (!for_this_plugin(plugin, cmd, len)) { continue; @@ -489,7 +488,7 @@ int plugin_save(JCR *jcr, FF_PKT *ff_pkt, bool top_level) POOL_MEM link(PM_FNAME); Dsm_check(999); - if (!bplugin_list || !jcr->plugin_ctx_list || jcr->is_job_canceled()) { + if (!b_plugin_list || !jcr->plugin_ctx_list || jcr->is_job_canceled()) { Jmsg1(jcr, M_FATAL, 0, "Command plugin \"%s\" requested, but is not loaded.\n", cmd); return 1; /* Return if no plugins loaded */ } @@ -503,7 +502,7 @@ int plugin_save(JCR *jcr, FF_PKT *ff_pkt, bool top_level) } /* Note, we stop the loop on the first plugin that matches the name */ - foreach_alist_index(i, plugin, bplugin_list) { + foreach_alist_index(i, plugin, b_plugin_list) { Dmsg4(dbglvl, "plugin=%s plen=%d cmd=%s len=%d\n", plugin->file, plugin->file_len, cmd, len); if (!for_this_plugin(plugin, cmd, len)) { continue; @@ -634,7 +633,7 @@ int plugin_estimate(JCR *jcr, FF_PKT *ff_pkt, bool top_level) ATTR attr; Dsm_check(999); - if (!bplugin_list || !jcr->plugin_ctx_list) { + if (!b_plugin_list || !jcr->plugin_ctx_list) { Jmsg1(jcr, M_FATAL, 0, "Command plugin \"%s\" requested, but is not loaded.\n", cmd); return 1; /* Return if no plugins loaded */ } @@ -648,7 +647,7 @@ int plugin_estimate(JCR *jcr, FF_PKT *ff_pkt, bool top_level) } /* Note, we stop the loop on the first plugin that matches the name */ - foreach_alist_index(i, plugin, bplugin_list) { + foreach_alist_index(i, plugin, b_plugin_list) { Dmsg4(dbglvl, "plugin=%s plen=%d cmd=%s len=%d\n", plugin->file, plugin->file_len, cmd, len); if (!for_this_plugin(plugin, cmd, len)) { continue; @@ -869,7 +868,7 @@ bool plugin_name_stream(JCR *jcr, char *name) * Search for correct plugin as specified on the command */ Dsm_check(999); - foreach_alist_index(i, plugin, bplugin_list) { + foreach_alist_index(i, plugin, b_plugin_list) { bEvent event; Dmsg3(dbglvl, "plugin=%s cmd=%s len=%d\n", plugin->file, cmd, len); if (!for_this_plugin(plugin, cmd, len)) { @@ -934,7 +933,7 @@ int plugin_create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace) int rc; Dsm_check(999); - if (!plugin || !plugin_ctx || !set_cmd_plugin(bfd, jcr) || jcr->is_job_canceled()) { + if (!plugin || !plugin_ctx || jcr->is_job_canceled()) { return CF_ERROR; } @@ -987,6 +986,9 @@ int plugin_create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace) return CF_CORE; /* Let Bacula core handle the file creation */ } + /* Use the bfile for plugin */ + set_cmd_plugin(bfd, jcr); + /* Created link or directory? */ if (rp.create_status == CF_CREATED) { return rp.create_status; /* yes, no need to bopen */ @@ -1096,14 +1098,14 @@ void load_fd_plugins(const char *plugin_dir) return; } - bplugin_list = New(alist(10, not_owned_by_alist)); + b_plugin_list = New(alist(10, not_owned_by_alist)); Dsm_check(999); if (!load_plugins((void *)&binfo, (void *)&bfuncs, plugin_dir, plugin_type, is_plugin_compatible)) { /* Either none found, or some error */ - if (bplugin_list->size() == 0) { - delete bplugin_list; - bplugin_list = NULL; + if (b_plugin_list->size() == 0) { + delete b_plugin_list; + b_plugin_list = NULL; Dmsg0(dbglvl, "No plugins loaded\n"); return; } @@ -1121,7 +1123,7 @@ void load_fd_plugins(const char *plugin_dir) * Verify that the plugin is acceptable, and print information * about it. */ - foreach_alist_index(i, plugin, bplugin_list) { + foreach_alist_index(i, plugin, b_plugin_list) { Jmsg(NULL, M_INFO, 0, _("Loaded plugin: %s\n"), plugin->file); Dmsg1(dbglvl, "Loaded plugin: %s\n", plugin->file); } @@ -1158,7 +1160,8 @@ static bool is_plugin_compatible(Plugin *plugin) return false; } if (strcmp(info->plugin_license, "Bacula AGPLv3") != 0 && - strcmp(info->plugin_license, "AGPLv3") != 0) { + strcmp(info->plugin_license, "AGPLv3") != 0 && + strcmp(info->plugin_license, "Bacula Systems(R) SA") != 0) { Jmsg(NULL, M_ERROR, 0, _("Plugin license incompatible. Plugin=%s license=%s\n"), plugin->file, info->plugin_license); Dmsg2(50, "Plugin license incompatible. Plugin=%s license=%s\n", @@ -1179,7 +1182,7 @@ static bool is_plugin_compatible(Plugin *plugin) /** * Create a new instance of each plugin for this Job - * Note, bplugin_list can exist but jcr->plugin_ctx_list can + * Note, b_plugin_list can exist but jcr->plugin_ctx_list can * be NULL if no plugins were loaded. */ void new_plugins(JCR *jcr) @@ -1188,7 +1191,7 @@ void new_plugins(JCR *jcr) int i; Dsm_check(999); - if (!bplugin_list) { + if (!b_plugin_list) { Dmsg0(dbglvl, "plugin list is NULL\n"); return; } @@ -1196,7 +1199,7 @@ void new_plugins(JCR *jcr) return; } - int num = bplugin_list->size(); + int num = b_plugin_list->size(); if (num == 0) { Dmsg0(dbglvl, "No plugins loaded\n"); @@ -1207,7 +1210,7 @@ void new_plugins(JCR *jcr) bpContext *plugin_ctx_list = (bpContext *)jcr->plugin_ctx_list; Dmsg2(dbglvl, "Instantiate plugin_ctx=%p JobId=%d\n", plugin_ctx_list, jcr->JobId); - foreach_alist_index(i, plugin, bplugin_list) { + foreach_alist_index(i, plugin, b_plugin_list) { Dsm_check(999); /* Start a new instance of each plugin */ bacula_ctx *b_ctx = (bacula_ctx *)malloc(sizeof(bacula_ctx)); @@ -1235,14 +1238,14 @@ void free_plugins(JCR *jcr) Plugin *plugin; int i; - if (!bplugin_list || !jcr->plugin_ctx_list) { + if (!b_plugin_list || !jcr->plugin_ctx_list) { return; /* no plugins, nothing to do */ } Dsm_check(999); bpContext *plugin_ctx_list = (bpContext *)jcr->plugin_ctx_list; Dmsg2(dbglvl, "Free instance plugin_ctx=%p JobId=%d\n", plugin_ctx_list, jcr->JobId); - foreach_alist_index(i, plugin, bplugin_list) { + foreach_alist_index(i, plugin, b_plugin_list) { /* Free the plugin instance */ plug_func(plugin)->freePlugin(&plugin_ctx_list[i]); free(plugin_ctx_list[i].bContext); /* free Bacula private context */ @@ -1445,13 +1448,12 @@ static bRC baculaGetValue(bpContext *ctx, bVariable var, void *value) case bVarDistName: *(char **)value = dist_name; break; - case bVarBEEF: - *((int *)value) = beef; - break; case bVarPrevJobName: break; case bVarPrefixLinks: break; + case bVarxxx: + break; default: break; } @@ -1502,23 +1504,14 @@ static bRC baculaGetValue(bpContext *ctx, bVariable var, void *value) *((int *)value) = (int)jcr->accurate; Dmsg1(dbglvl, "Bacula: return accurate=%d\n", (int)jcr->accurate); break; + case bVarInteractiveSession: + *(int *)value = (int)jcr->interactive_session; + break; case bVarFileSeen: break; /* a write only variable, ignore read request */ case bVarVssObject: -#ifdef HAVE_WIN32 - if (g_pVSSClient) { - *(void **)value = g_pVSSClient->GetVssObject(); - break; - } -#endif return bRC_Error; case bVarVssDllHandle: -#ifdef HAVE_WIN32 - if (g_pVSSClient) { - *(void **)value = g_pVSSClient->GetVssDllHandle(); - break; - } -#endif return bRC_Error; case bVarWhere: *(char **)value = jcr->where; @@ -1534,7 +1527,7 @@ static bRC baculaGetValue(bpContext *ctx, bVariable var, void *value) case bVarExePath: case bVarVersion: case bVarDistName: - case bVarBEEF: + case bVarxxx: break; } Dsm_check(999); @@ -1560,6 +1553,9 @@ static bRC baculaSetValue(bpContext *ctx, bVariable var, void *value) return bRC_Error; } break; + case bVarInteractiveSession: + jcr->interactive_session = (((intptr_t) value) == 1); + break; default: break; } diff --git a/bacula/src/filed/fd_plugins.h b/bacula/src/filed/fd_plugins.h index 855327e0b5..63af7d749e 100644 --- a/bacula/src/filed/fd_plugins.h +++ b/bacula/src/filed/fd_plugins.h @@ -1,22 +1,26 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Application Programming Interface (API) definition for Bacula Plugins * - * Written by Kern Sibbald, October 2007 + * Kern Sibbald, October 2007 * */ @@ -175,9 +179,10 @@ typedef enum { bVarExePath = 16, bVarVersion = 17, bVarDistName = 18, - bVarBEEF = 19, + bVarxxx = 19, bVarPrevJobName = 20, - bVarPrefixLinks = 21 + bVarPrefixLinks = 21, + bVarInteractiveSession = 22 } bVariable; /* Events that are passed to plugin */ @@ -290,7 +295,7 @@ typedef enum { # define FD_PLUGIN_MAGIC "*FDPluginData*" -#define FD_PLUGIN_INTERFACE_VERSION ( 12 ) +#define FD_PLUGIN_INTERFACE_VERSION ( 13 ) typedef struct s_pluginInfo { uint32_t size; diff --git a/bacula/src/filed/fd_snapshot.c b/bacula/src/filed/fd_snapshot.c new file mode 100644 index 0000000000..aac011621d --- /dev/null +++ b/bacula/src/filed/fd_snapshot.c @@ -0,0 +1,1901 @@ +/* + Bacula(R) - The Network Backup Solution + + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2014 Free Software Foundation Europe e.V. + + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. + + You may use this file and others of this release according to the + license defined in the LICENSE file, which includes the Affero General + Public License, v3.0 ("AGPLv3") and some additional permissions and + terms pursuant to its AGPLv3 Section 7. + + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. + + Written by Eric Bollengier, 2015 +*/ + +/* + Documentation about snapshot backend +---------------------------------------------------------------- + +The snapshot manager is using environment variables to communicate. + +Variables: + +SNAPSHOT_ACTION + Operation such as: + create, delete, list, mount, unmount, check, support, subvolume + +SNAPSHOT_VOLUME + Volume name + ex: /dev/vgroot/home_Test-2014-01-01_00_00 (lvm) + /home/.snapshots/Test-2014-01-01_00_00 (btrfs) + /.zfs/snapshot/Test-2014-01-01_00_00 (zfs) + + The volume name is generated by the create command + +SNAPSHOT_DEVICE + Device name + ex: /dev/vgroot/home (lvm) + /home (btrfs) + / (zfs) + + The device name can be found via getmntent() + +SNAPSHOT_NAME + Snapshot name, usually the Job name + +SNAPSHOT_FSTYPE + Device filesystem type, can be found via getmntent() + ex: btrfs, zfs, ext4 + +SNAPSHOT_TYPE + Snapshot backend type, generated by support command + ex: lvm, btrfs, zfs + +SNAPSHOT_MOUNTPOINT + Device mount point, found via getmntent() + +SNAPSHOT_SNAPMOUNTPOINT + Snapshot mount point is generated by the mount command + + + Protocol +---------------------------------------------------------------- + +OK: exit code 0 and status=1 in the output +ERR: exit code <> 0 and/or status=0 in the output + +status=1 keyword="value" keyword2="value2" + +status=0 error="Error message" + + + Workflow +---------------------------------------------------------------- + +1) List filesystems + get SNAPSHOT_DEVICE, SNAPSHOT_FSTYPE, SNAPSHOT_MOUNTPOINT + + volume="" name="" device="" createtime="" + +2) Test if a filesystem supports snapshot feature + SNAPSHOT_ACTION=support + SNAPSHOT_DEVICE=/home + SNAPSHOT_MOUNTPOINT=/home + SNAPSHOT_FSTYPE=btrfs + + => status=1 type=btrfs device=/home + => status=0 + +2a) Test if a filesystem contains subvolumes + SNAPSHOT_ACTION=subvolumes + SNAPSHOT_DEVICE=/home + SNAPSHOT_FSTYPE=btrfs + + => dev=10 mountpoint=/home/subvol fstype=btrfs + +3) Create a snapshot + SNAPSHOT_ACTION=create + SNAPSHOT_NAME=Test-2014-01-01_00_00 + SNAPSHOT_DEVICE=/home + SNAPSHOT_MOUNTPOINT=/home + SNAPSHOT_FSTYPE=btrfs + SNAPSHOT_TYPE=btrfs + + => status=1 volume="/home/.snapshots/Test-2014-01-01_00_00" createtdate=1418935776 type=btrfs + +4) Mount the snapshot + SNAPSHOT_ACTION=mount + SNAPSHOT_NAME=Test-2014-01-01_00_00 + SNAPSHOT_DEVICE=/home + SNAPSHOT_MOUNTPOINT=/home + SNAPSHOT_FSTYPE=btrfs + SNAPSHOT_TYPE=btrfs + + => status=1 volume="/home/.snapshots/Test-2014-01-01_00_00" createtdate=1418935776 type=btrfs + + +5) Unmount the snapshot + SNAPSHOT_ACTION=unmount + SNAPSHOT_SNAPMOUNTPOINT=/home/.snapshots/Test-2014-01-01_00_00 + + => status=1 + +6) Delete the snapshot + SNAPSHOT_ACTION=delete + SNAPSHOT_VOLUME=/home/.snapshot/Test-2014-01-01_00_00 + + => status=1 + + */ + +#include "bacula.h" +#include "filed.h" +#define USE_CMD_PARSER +#include "plugins/fd/fd_common.h" +#undef Jmsg +#include "fd_snapshot.h" +#define APPMANAGER_CMD "%eappmanager" +#define APP_DIR "/tmp/app.d" +#define SNAPSHOT_CMD "%ebsnapshot" + +/* Defined in messages.c */ +extern char *exepath; + +/* Catalog interface with the director */ +static char CreateSnap[] = "CatReq Job=%s new_snapshot name=%s volume=%s device=%s tdate=%d type=%s retention=%s"; +static char DelSnap[] = "CatReq Job=%s del_snapshot name=%s device=%s"; +static char GetSnap[] = "CatReq Job=%s get_snapshot name=%s volume=%s"; + +/* Command line interface with the director */ +static char LsCmd[] = "snapshot ls name=%127s volume=%s device=%s tdate=%d type=%127s path=%s"; +static char DelCmd[] = "snapshot del name=%127s volume=%s device=%s tdate=%d type=%127s"; +static char QueryCmd[] = "snapshot query name=%127s volume=%s device=%s tdate=%d type=%127s"; +static char PruneCmd[] = "snapshot prune volume=%s type=%127s"; +static char SyncCmd[] = "snapshot sync volume=%s type=%127%"; +static char ListCmd[] = "snapshot list"; +static char ConfCmd[] = "snapshot retention=%50s"; + +/* Small function to quickly tell us if we can do snapshot here */ +static bool is_snapshot_supported(JCR *jcr) +{ + bool ret; + struct stat sp; + POOLMEM *cmd = get_pool_memory(PM_FNAME); + const char *p; + const char *str; + char add[20]; + + /* We are not really interested by arguments, just + * the filename + */ + *cmd = 0; + for (p=me->snapshot_command; *p; p++) { + if (*p == '%') { + switch (*++p) { + case '%': + str = "%"; + break; + case 'e': + str = NPRTB(exepath); + break; + default: + add[0] = '%'; + add[1] = *p; + add[2] = 0; + str = add; + } + + } else if (*p == ' ') { + break; + + } else { + add[0] = *p; + add[1] = 0; + str = add; + } + pm_strcat(cmd, str); + } + + ret = stat(cmd, &sp) == 0; + free_pool_memory(cmd); + Dmsg1(10, "Snapshot = %d\n", ret); + return ret; +} + +/* Return the default snapshot handler, must be freed at the end */ +char *snapshot_get_command() +{ + return bstrdup(SNAPSHOT_CMD); +} + +/* Initialize the snapshot manager at the begining of the + * job and create snapshots + */ +bool open_snapshot_backup_session(JCR *jcr) +{ + if (!is_snapshot_supported(jcr)) { + Dmsg0(DT_SNAPSHOT, "Snapshot not supported\n"); + return false; + } + + jcr->snap_mgr = New(snapshot_manager(jcr)); + /* Get all volumes and subvolumes */ + if (!jcr->snap_mgr->scan_mtab()) { + berrno be; /* error probably in errno */ + Dmsg1(DT_SNAPSHOT, "Unable to scan mtab. ERR=%s\n", be.bstrerror()); + Jmsg(jcr, M_ERROR, 0, "Unable to scan mtab to determine devices to snapshot\n"); + return false; + } + /* Match the volume list with the fileset */ + if (!jcr->snap_mgr->scan_fileset()) { + Jmsg(jcr, M_ERROR,0, "Unable to scan fileset to determine devices to snapshot\n"); + return false; + } + /* Create fileset needed */ + if (!jcr->snap_mgr->create_snapshots()) { + /* Error message already displayed if needed */ + return false; + } + return true; /* We should have some snapshots */ +} + +/* Command that can be called from outside */ +bool list_all_snapshots(JCR *jcr, alist *lst) +{ + snapshot_manager snap_mgr(jcr); + + /* Get all volumes and subvolumes */ + if (!snap_mgr.scan_mtab()) { + return false; + } + /* list snapshots */ + if (snap_mgr.list_snapshots(lst)) { + return false; + } + return true; +} + +/* Cleanup the snapshot manager at the end of the job */ +void close_snapshot_backup_session(JCR *jcr) +{ + if (jcr->snap_mgr) { + jcr->snap_mgr->cleanup_snapshots(); + delete jcr->snap_mgr; + jcr->snap_mgr = NULL; + } +} + +/* Special cmd_parser subclass to not look after plugin + * names when decoding the line + */ +class arg_parser: public cmd_parser +{ +public: + arg_parser(): cmd_parser() { use_name = false; }; + virtual ~arg_parser() {}; +}; + +class snapshot; + +/* Device that exists on the system */ +class fs_device: public SMARTALLOC +{ +public: + rblink link; + + uint32_t dev; /* dev no */ + char *mountpoint; /* where it's mounted */ + char *fstype; /* ntfs, ext3, ext4... */ + char *device; /* /dev/mapper/xxx */ + + bool supportSnapshotTested; /* True if support() was called */ + bool isSuitableForSnapshot; /* Compatible with snapshots */ + bool inSnapshotSet; + bool inFileSet; + snapshot *snap; /* Associated snapshot */ + + dlist *include; /* Where the fs_device was found in the fileset */ + void *node; /* At which node */ + + + fs_device(): + dev(0), mountpoint(NULL), fstype(NULL), device(NULL), + supportSnapshotTested(false), isSuitableForSnapshot(false), snap(NULL) + { + }; + + fs_device(uint32_t adev, const char *adevice, const char *amountpoint, const char *aftype) { + dev = adev; + fstype = bstrdup(aftype); + device = bstrdup(adevice); + mountpoint = bstrdup(amountpoint); + supportSnapshotTested = false; + isSuitableForSnapshot = false; + inSnapshotSet = false; + inFileSet = false; + snap = NULL; + include = NULL; + node = NULL; + }; + + ~fs_device() { + destroy(); + }; + + /* Call support() and cache the result in supportSnapshotTested and isSuitableForSnapshot */ + bool can_do_snapshot(); + + void setInFileSet(dlist *inc, void *where) { + include = inc; /* where we need to include subvolumes */ + node = where; /* after which node */ + inFileSet = true; + inSnapshotSet = true; + }; + + void set_snap(snapshot *s) { + snap = s; + }; + + void destroy(); +}; + +/* The device list is stored in a rblist, using the + * dev no as key. The devno can be found in every stat() + * packet. + */ +static int compare_entries(void *item1, void *item2) +{ + fs_device *dev1 = (fs_device *) item1; + fs_device *dev2 = (fs_device *) item2; + if (dev1->dev > dev2->dev) { + return 1; + + } else if (dev1->dev < dev2->dev) { + return -1; + + } else { + return 0; + } +} + +static int search_entry(void *item1, void *item2) +{ + uint32_t dev1 = (intptr_t) item1; + fs_device* dev2 = (fs_device *) item2; + if (dev1 > dev2->dev) { + return 1; + + } else if (dev1 < dev2->dev) { + return -1; + + } else { + return 0; + } +} + +/* List of all fd_device that are on the system + * Some devices are excluded automatically from + * the list, such as proc, sysfs, etc... + */ +class mtab: public SMARTALLOC +{ +public: + rblist *entries; + int sCount; /* Snapshot count */ + int dCount; /* Device count */ + mtab() { + fs_device *elt = NULL; + entries = New(rblist(elt, &elt->link)); + dCount = sCount = 0; + }; + + ~mtab() { + fs_device *elt; + foreach_rblist(elt, entries) { + elt->destroy(); + } + delete entries; + }; + + /* Have we devices for snapshot in our list ? */ + bool empty() { + return sCount == 0; + }; + + /* Get a fs_device corresponding to a file */ + fs_device *search(char *file); + + /* Get subvolumes for a specific device */ + bool get_subvolumes(uint32_t dev, alist *items, FF_PKT *ff) { + fs_device *elt, *elt2; + elt = (fs_device *)entries->search((void*)(intptr_t)dev, search_entry); + if (!elt) { + return false; + } + + foreach_rblist(elt2, entries) { + if (elt2->dev == elt->dev) { + continue; + } + if (strncmp(elt2->mountpoint, elt->mountpoint, strlen(elt->mountpoint)) == 0) { + /* the mount point is included in the volume */ + + if (file_is_excluded(ff, elt2->mountpoint)) { + Dmsg1(DT_SNAPSHOT|50, "Looks to be excluded %s\n", elt2->mountpoint); + + } else { + items->append(elt2); + } + } + } + return items->size() > 0; + }; + + bool add_in_snapshot_set(char *file, dlist *inc, void *node) { + + fs_device *elt = search(file); + if (!elt) { + Dmsg1(DT_SNAPSHOT, "%s will not be added to snapshot set\n", file); + return sCount == dCount; /* not found in our list, skip it */ + } + return add_in_snapshot_set(elt, inc, node); + }; + + bool add_in_snapshot_set(fs_device *elt, dlist *inc, void *node) { + Dmsg4(DT_SNAPSHOT|10, "%s in=%d can=%d tested=%d\n", elt->mountpoint, elt->inSnapshotSet, + elt->isSuitableForSnapshot, elt->supportSnapshotTested); + if (!elt->inSnapshotSet && elt->can_do_snapshot()) { + Dmsg1(DT_SNAPSHOT, "Marking %s for snapshot\n", elt->mountpoint); + elt->setInFileSet(inc, node); + sCount++; + } + /* It will help to count when all devices are in the snapshot set */ + Dmsg2(DT_SNAPSHOT|10, "sCount %d = dCount %d\n", sCount, dCount); + return sCount == dCount; + }; + + bool add_entry(fs_device *vol) { + fs_device *ret = (fs_device *) entries->insert(vol, compare_entries); + if (ret == vol && vol->snap) { + dCount++; /* We skip directly FS such as /proc, /sys or /dev */ + } + return ret == vol; + }; +}; + +/* Snapshot descriptor, used to communicate with the snapshot + * backend on the system. + */ +class snapshot: public SMARTALLOC +{ +private: + JCR *jcr; + +public: + const char *action; /* current action */ + char Name[MAX_NAME_LENGTH]; /* Name of the snapshot */ + char Type[MAX_NAME_LENGTH]; /* lvm, btrfs, netapp */ + char FSType[MAX_NAME_LENGTH]; /* btrfs, zfs, ext3 */ + char CreateDate[MAX_TIME_LENGTH]; /* Creation date */ + time_t CreateTDate; /* Creation date in seconds */ + int64_t size; /* Size of the snapshot */ + int status; /* snapshot status */ + utime_t Retention; /* Snapshot retention, might come from Pool/FileSet */ + + POOLMEM *Volume; /* Path of the volume */ + POOLMEM *Device; /* Device path */ + POOLMEM *MountPoint; /* Device Mount point */ + POOLMEM *SnapMountPoint; /* Snapshot Mount point */ + POOLMEM *path; /* path used in ls query */ + POOLMEM *errmsg; /* Error message generated by commands */ + POOLMEM *SnapDirectory; /* Where snapshots are stored */ + + char **env; /* Variables used to call snapshot */ + bool mounted; /* True if mounted on SnapMountPoint */ + bool created; /* True if the snapshot is created */ + + snapshot(JCR *ajcr) { + jcr = ajcr; + env = NULL; + path = get_pool_memory(PM_FNAME); + errmsg = get_pool_memory(PM_MESSAGE); + Volume = get_pool_memory(PM_FNAME); + Device = get_pool_memory(PM_FNAME); + MountPoint = get_pool_memory(PM_FNAME); + SnapMountPoint = get_pool_memory(PM_FNAME); + SnapDirectory = get_pool_memory(PM_FNAME); + reset(); + }; + + ~snapshot() { + free_pool_memory(path); + free_pool_memory(errmsg); + free_pool_memory(Volume); + free_pool_memory(Device); + free_pool_memory(MountPoint); + free_pool_memory(SnapMountPoint); + free_pool_memory(SnapDirectory); + free_env(); + }; + + void reset() { + *SnapDirectory = *Type = *FSType = *SnapMountPoint = 0; + *MountPoint = *Volume = *Device = *path = *errmsg = 0; + action = NULL; + size = -1; + status = 0; + mounted = false; + created = false; + Retention = jcr->snapshot_retention; + }; + + /* Free the env[] structure */ + void free_env() { + if (env) { + for (int i=0; env[i] ; i++) { + free(env[i]); + } + free(env); + env = NULL; + } + }; + + void set_device(const char *d) { + pm_strcpy(Device, d); + }; + + void set_mountpoint(const char *d) { + pm_strcpy(MountPoint, d); + }; + + void set_name(const char *n) { + bstrncpy(Name, n, sizeof(Name)); + }; + + void set_fstype(const char *n) { + bstrncpy(FSType, n, sizeof(FSType)); + }; + + void set_action(const char *a) { + action = a; + }; + + /* Convert a real top path to a snapshot path + * and set proper variables inside ff_pkt + * to translate back all subfiles. + */ + bool convert_path(FF_PKT *ff) { + if (!*MountPoint || !*SnapMountPoint) { + Dmsg2(DT_SNAPSHOT, "MountPoint=%s SnapMountPoint=%s\n", + NPRT(MountPoint), NPRT(SnapMountPoint)); + return false; + } + if (!ff->snap_top_fname) { + ff->snap_top_fname = get_pool_memory(PM_FNAME); + } + ff->volume_path = MountPoint; /* /tmp */ + ff->snapshot_path = SnapMountPoint; /* /tmp/.snapshot/Job.20140502.01.01.01 */ + ff->top_fname_save = ff->top_fname; + + int mp_first = strlen(MountPoint); /* will point to after MountPoint in top_fname */ + int last = pm_strcpy(ff->snap_top_fname, SnapMountPoint); + last = MAX(last - 1, 0); + + /* We need to concat path and avoid double / and no / */ + if (ff->snap_top_fname[last] == '/') { + if (ff->top_fname[mp_first] == '/') { + ff->snap_top_fname[last] = 0; /* strip double / */ + } + } else { /* no / at all */ + if (ff->top_fname[mp_first] != '/') { + pm_strcat(ff->snap_top_fname, "/"); + } + } + + pm_strcat(ff->snap_top_fname, ff->top_fname + mp_first); + ff->top_fname = ff->snap_top_fname; + ff->strip_snap_path = true; + Dmsg1(DT_SNAPSHOT|50, "top_fname=%s\n", ff->top_fname); + return true; + }; + + /* Create a environment used in the child process */ + int edit_snapshot_env() { + int i = 0; + POOLMEM *tmp = get_pool_memory(PM_FNAME); + free_env(); + + /* Update "10" to add more variables */ + env = (char **) malloc(sizeof(char *) * 10); + + if (*Name) { + Mmsg(tmp, "SNAPSHOT_NAME=%s", Name); + env[i++] = bstrdup(tmp); + } + if (*Volume) { + Mmsg(tmp, "SNAPSHOT_VOLUME=%s", Volume); + env[i++] = bstrdup(tmp); + } + if (*Device) { + Mmsg(tmp, "SNAPSHOT_DEVICE=%s", Device); + env[i++] = bstrdup(tmp); + } + if (*Type) { + Mmsg(tmp, "SNAPSHOT_TYPE=%s", Type); + env[i++] = bstrdup(tmp); + } + if (*FSType) { + Mmsg(tmp, "SNAPSHOT_FSTYPE=%s", FSType); + env[i++] = bstrdup(tmp); + } + if (*MountPoint) { + Mmsg(tmp, "SNAPSHOT_MOUNTPOINT=%s", MountPoint); + env[i++] = bstrdup(tmp); + } + if (*SnapDirectory) { + Mmsg(tmp, "SNAPSHOT_SNAPDIRECTORY=%s", SnapDirectory); + env[i++] = bstrdup(tmp); + } + if (*SnapMountPoint) { + Mmsg(tmp, "SNAPSHOT_SNAPMOUNTPOINT=%s", SnapMountPoint); + env[i++] = bstrdup(tmp); + } + /* When adding new entries, do not forget to add more slots to env[] */ + + Mmsg(tmp, "SNAPSHOT_ACTION=%s", action); + env[i++] = bstrdup(tmp); + + env[i] = NULL; /* last record */ + + if (chk_dbglvl(DT_SNAPSHOT|100)) { + for (i = 0; env[i] ; i++) { + Dmsg1(0, "%s\n", env[i]); + } + } + + free_pool_memory(tmp); + return 1; + }; + + /* Edit the command line if needed */ + int edit_snapshot_codes(POOLMEM **omsg, const char *imsg) { + const char *p; + const char *str; + char add[20]; + + **omsg = 0; + for (p=imsg; *p; p++) { + if (*p == '%') { + switch (*++p) { + case '%': + str = "%"; + break; + case 'e': + str = NPRTB(exepath); + break; + case 'n': + str = Name; + break; + case 'v': + str = Volume; + break; + case 'd': + str = Device; + break; + case 'D': + str = SnapDirectory; + break; + case 'a': + str = NPRT(action); + break; + case 't': + str = Type; + break; + case 'f': + str = FSType; + break; + case 'p': + str = MountPoint; + break; + case 's': + str = SnapMountPoint; + break; + default: + add[0] = '%'; + add[1] = *p; + add[2] = 0; + str = add; + } + + } else { + add[0] = *p; + add[1] = 0; + str = add; + } + pm_strcat(omsg, str); + } + + if (chk_dbglvl(DT_SNAPSHOT|10)) { + POOL_MEM tmp; + Mmsg(tmp, " -d %d -o /tmp/bsnapshot.log ", debug_level); + pm_strcat(omsg, tmp.c_str()); + } + + Dmsg2(DT_SNAPSHOT|30, "edit_snapshot_codes: %s -> %s\n", imsg, *omsg); + return 1; + }; + + /* Call the snapshot backend to know if we can snapshot the current FS */ + int support_snapshot(fs_device *vol) { + arg_parser cmd; + status = 0; + + reset(); + set_device(vol->device); + set_mountpoint(vol->mountpoint); + set_fstype(vol->fstype); + + if (!do_command("support", &cmd)) { + goto bail_out; + } + scan_arg(&cmd); + + bail_out: + Dmsg2(DT_SNAPSHOT|50, "%s snapshot support status=%d\n", vol->mountpoint, status); + return status; + }; + + /* Scan sub volumes for a particular volume */ + int scan_subvolumes(fs_device *vol, alist *lst) { + int ret = 0; + arg_parser cmd; + uint32_t dev=0; + char *mp=NULL, *fstype=NULL, *device=Device; + + reset(); + set_device(vol->device); + set_mountpoint(vol->mountpoint); + set_fstype(vol->fstype); + + if (!do_command("subvolumes", &cmd)) { + goto bail_out; + } + + for (int i = 0; i < cmd.argc ; i++) { + if (strcasecmp(cmd.argk[i], "Dev") == 0 && cmd.argv[i]) { + dev = str_to_int64(cmd.argv[i]); + + } else if (strcasecmp(cmd.argk[i], "MountPoint") == 0 && cmd.argv[i]) { + mp = cmd.argv[i]; + + } else if (strcasecmp(cmd.argk[i], "Device") == 0 && cmd.argv[i]) { + device = cmd.argv[i]; + + } else if (strcasecmp(cmd.argk[i], "FSType") == 0 && cmd.argv[i]) { + fstype = cmd.argv[i]; + if (mp && fstype && dev) { + fs_device *elt = New(fs_device(dev, device, mp, fstype)); + lst->append(elt); + /* reset variables */ + } + dev = 0; + mp = fstype = NULL; + device = Device; + } + } + ret = 1; + + bail_out: + return ret; + }; + + /* Prune current snapshots + * - List snapshots available on the director, keep a list locally + * - get mtab, list snapshots for all devices, or devices that are in the director list + */ + int prune(BSOCK *bs) { + return 1; + }; + + /* List local snapshots, list director snapshots, and synchronize the two */ + int sync(BSOCK *bs) { + return 1; + }; + + /* List files from a snapshot + * Need to set the Volume and the Path + */ + int ls(BSOCK *bs) { + return 1; + }; + + /* Scan common arguments */ + int scan_arg(arg_parser *cmd) { + for (int i = 0; i < cmd->argc ; i++) { + if (strcasecmp(cmd->argk[i], "Volume") == 0 && cmd->argv[i]) { + pm_strcpy(Volume, cmd->argv[i]); + + } else if (strcasecmp(cmd->argk[i], "CreateDate") == 0 && cmd->argv[i]) { + bstrncpy(CreateDate, cmd->argv[i], sizeof(CreateDate)); + CreateTDate = str_to_utime(CreateDate); + + } else if (strcasecmp(cmd->argk[i], "CreateTDate") == 0 && cmd->argv[i]) { + CreateTDate = str_to_int64(cmd->argv[i]); + bstrftimes(CreateDate, sizeof(CreateDate), CreateTDate); + + } else if (strcasecmp(cmd->argk[i], "Type") == 0 && cmd->argv[i]) { + bstrncpy(Type, cmd->argv[i], sizeof(Type)); + + } else if (strcasecmp(cmd->argk[i], "SnapMountPoint") == 0 && cmd->argv[i]) { + pm_strcpy(SnapMountPoint, cmd->argv[i]); + + } else if (strcasecmp(cmd->argk[i], "SnapDirectory") == 0 && cmd->argv[i]) { + pm_strcpy(SnapDirectory, cmd->argv[i]); + + } else if (strcasecmp(cmd->argk[i], "status") == 0 && cmd->argv[i]) { + status = str_to_int64(cmd->argv[i]); + + } else if (strcasecmp(cmd->argk[i], "Device") == 0 && cmd->argv[i]) { + pm_strcpy(Device, cmd->argv[i]); + } + } + return 1; + }; + + /* Create a snapshot with already given attributes + * Need to set Name and Device at the minimum + */ + int create() { + int ret = 0; + arg_parser cmd; + + if (!*Name || !*Device) { + goto bail_out; + } + + Dmsg2(DT_SNAPSHOT, "Create Snapshot of %s %s\n", Device, Name); + + /* TODO: see if we handle multiple snapshots per call */ + if (!do_command("create", &cmd)) { + goto bail_out; + } + + scan_arg(&cmd); + created = 1; + + ret = 1; + + bail_out: + return ret; + }; + + int mount() { + arg_parser cmd; + status = 0; + + if (!*Name || !*Volume || !*Device || !*Type) { + goto bail_out; + } + + Dmsg1(DT_SNAPSHOT, "Doing mount of %s\n", Volume); + + if (!do_command("mount", &cmd)) { + goto bail_out; + } + + *SnapMountPoint = 0; + + scan_arg(&cmd); + + mounted = (status > 0 && *SnapMountPoint); + + bail_out: + return status; + }; + + int unmount() { + arg_parser cmd; + status = 0; + + if (!*Name || !*SnapMountPoint || !*Type || !mounted) { + goto bail_out; + } + + Dmsg1(DT_SNAPSHOT, "Doing unmount of a %s\n", SnapMountPoint); + + if (!do_command("unmount", &cmd)) { + goto bail_out; + } + + scan_arg(&cmd); + + mounted = 0; + + bail_out: + return status; + }; + + /* Delete a snapshot with the given device name */ + int del() { + int ret = 0; + arg_parser cmd; + if (!*Name || !*Volume || !created) { + goto bail_out; + } + ret = do_command("delete", &cmd); + bail_out: + return ret; + }; + + /* TODO: Need to read stdout as well */ + int do_command(const char *act, arg_parser *cmd) { + int ret = 0, rcode; + POOLMEM *command = get_pool_memory(PM_FNAME); + POOLMEM *out = get_pool_memory(PM_FNAME); + + set_action(act); + edit_snapshot_codes(&command, me->snapshot_command); + edit_snapshot_env(); + + Dmsg1(DT_SNAPSHOT|20, "Execute %s command\n", act); + + if (*command == 0) { + Mmsg(errmsg, _("Error while creating command string %s.\n"), act); + Dmsg1(DT_SNAPSHOT, "%s", errmsg); + goto bail_out; + } + + /* If the exit code is 1, we can expect to have a clear error + * message in the output + */ + if ((rcode = run_program_full_output(command, 600, out, env)) != 0) { + if ((rcode & ~b_errno_exit) == 1) { /* exit 1, look the output */ + if (cmd->parse_cmd(out) == bRC_OK) { + int i = cmd->find_arg_with_value("status"); + if (i >= 0) { + /* If we have a status, take it */ + status = str_to_int64(cmd->argv[i]); + } else { + status = 0; + } + i = cmd->find_arg_with_value("error"); + if (i >= 0) { + pm_strcpy(errmsg, cmd->argv[i]); + Dmsg1(DT_SNAPSHOT|20, "%s\n", errmsg); + goto bail_out; + } + } + } + berrno be; + Mmsg(errmsg, _("Error while executing \"%s\" %s. %s %s\n"), + act, command, out, be.bstrerror()); + Dmsg1(DT_SNAPSHOT, "%s", errmsg); + goto bail_out; + } + + /* Need to decode the output of the script + * TODO: some commands will have multiple lines + */ + if (cmd->parse_cmd(out) != bRC_OK) { + Dmsg2(DT_SNAPSHOT, "snapshot command %s output error: [%s]\n", act, out); + Mmsg(errmsg, _("Unable to parse snapshot command output\n")); + goto bail_out; + } + Dmsg1(DT_SNAPSHOT|50, "ret = %s\n", out); + ret = 1; + bail_out: + free_pool_memory(command); + free_pool_memory(out); + return ret; + }; + + int list(alist *lst) { + Dmsg0(DT_SNAPSHOT, "Doing list of a snapshots of a given device\n"); + snapshot *snap; + arg_parser cmd; + int i, ret=0, status=1; + char *volume=NULL, *name=NULL, *device=NULL, *createdate=NULL, *error=NULL; + utime_t createtdate = 0; + + /* TODO: Here we need to loop over a list */ + if (!do_command("list", &cmd)) { + goto bail_out; + } + ret = 1; + + /* should get + * volume=xxx device=zzzz name=yyy createtdate=12121212 size=xx status=xx error=xx type=lvm + */ + for (i = 0; i < cmd.argc ; i++) { + if (strcasecmp(cmd.argk[i], "Volume") == 0) { + volume = cmd.argv[i]; + + } else if (strcasecmp(cmd.argk[i], "Name") == 0) { + name = cmd.argv[i]; + + } else if (strcasecmp(cmd.argk[i], "Device") == 0) { + device = cmd.argv[i]; + + } else if (strcasecmp(cmd.argk[i], "Error") == 0) { + error = cmd.argv[i]; + + } else if (strcasecmp(cmd.argk[i], "Status") == 0) { + status = str_to_int64(cmd.argv[i]); + + } else if (strcasecmp(cmd.argk[i], "Type") == 0) { + snap = New(snapshot(jcr)); + pm_strcpy(snap->Volume, volume); + pm_strcpy(snap->Device, NPRTB(device)); + bstrncpy(snap->Name, NPRTB(name), sizeof(snap->Name)); + bstrncpy(snap->Type, cmd.argv[i], sizeof(snap->Type)); + bstrncpy(snap->CreateDate, createdate, sizeof(snap->CreateDate)); + pm_strcpy(snap->errmsg, NPRTB(error)); + snap->status = status; + snap->CreateTDate = createtdate; + error = createdate = device = name = volume = NULL; + status = 1; + createtdate = 0; + lst->append(snap); + + } else if (strcasecmp(cmd.argk[i], "CreateTDate") == 0) { + createtdate = str_to_int64(cmd.argv[i]); + + } else if (strcasecmp(cmd.argk[i], "CreateDate") == 0) { + createdate = cmd.argv[i]; + createtdate = str_to_utime(cmd.argv[i]); + } + } + bail_out: + return ret; + }; + + /* Query information about snapshot */ + int query() { + Dmsg0(0, "Doing query of a snapshot\n"); + arg_parser cmd; + int i, ret=0; + + if (!*Volume) { + goto bail_out; + } + + if (!do_command("query", &cmd)) { + goto bail_out; + } + + if ((i = cmd.find_arg_with_value("size")) >= 0) { + size = str_to_int64(cmd.argv[i]); + } + + if ((i = cmd.find_arg_with_value("status")) >= 0) { + status = str_to_int64(cmd.argv[i]); + } + + ret = 1; + + bail_out: + return ret; + }; + + /* Quickly unbash all attributes after a sscanf */ + void unbash_spaces() { + ::unbash_spaces(Volume); + ::unbash_spaces(Device); + ::unbash_spaces(path); + ::unbash_spaces(Name); + ::unbash_spaces(CreateDate); + ::unbash_spaces(errmsg); + }; + + void bash_spaces() { + ::bash_spaces(Volume); + ::bash_spaces(Device); + ::bash_spaces(path); + ::bash_spaces(Name); + ::bash_spaces(CreateDate); + ::bash_spaces(errmsg); + }; + + /* Quicky make sure we have enough space to handle the request */ + void check_buffer_size(int len) { + Volume = check_pool_memory_size(Volume, len); + Device = check_pool_memory_size(Device, len); + path = check_pool_memory_size(path, len); + }; + + /* Create Catalog entry for the current snapshot */ + int create_catalog_entry() { + int ret = 0; + char ed1[50]; + bash_spaces(); + jcr->dir_bsock->fsend(CreateSnap, + jcr->Job, Name, Volume, + Device, CreateTDate, Type, edit_uint64(Retention, ed1)); + if (jcr->dir_bsock->recv() < 0) { + Mmsg(errmsg, _("Unable to create snapshot record. ERR=%s\n"), + jcr->dir_bsock->bstrerror()); + + } else if (strncmp(jcr->dir_bsock->msg, "1000", 4) != 0) { + Mmsg(errmsg, _("Unable to create snapshot record, got %s\n"), + jcr->dir_bsock->msg); + + } else { + ret = 1; /* OK */ + } + unbash_spaces(); + return ret; + }; + + /* Delete Catalog entry of the current snapshot */ + int delete_catalog_entry() { + int ret = 0; + bash_spaces(); + jcr->dir_bsock->fsend(DelSnap, jcr->Job, Name, Device); + + if (jcr->dir_bsock->recv() < 0) { + Mmsg(errmsg, _("Unable to delete snapshot record. ERR=%s\n"), + jcr->dir_bsock->bstrerror()); + + } else if (strncmp(jcr->dir_bsock->msg, "1000", 4) != 0) { + Mmsg(errmsg, _("Unable to delete snapshot record, got %s\n"), + jcr->dir_bsock->msg); + + } else { + ret = 1; /* OK */ + } + + unbash_spaces(); + return ret; + }; + + /* Get Catalog entry of the current snapshot */ + int get_catalog_entry() { + int ret = 0; + arg_parser cmd; + + if (!*Name || !*Volume) { + return ret; + } + + bash_spaces(); + jcr->dir_bsock->fsend(GetSnap, jcr->Job, Name, Volume); + + if (jcr->dir_bsock->recv() < 0) { + Mmsg(errmsg, _("Unable to get snapshot record. ERR=%s\n"), + jcr->dir_bsock->bstrerror()); + + } else if (strncmp(jcr->dir_bsock->msg, "1000", 4) != 0) { + Mmsg(errmsg, _("Unable to get snapshot record, got %s\n"), + jcr->dir_bsock->msg); + + } else { + if (cmd.parse_cmd(jcr->dir_bsock->msg) != bRC_OK) { + Mmsg(errmsg, _("Unable to parse command output\n")); + scan_arg(&cmd); /* Fill all parameters from director */ + + } else { + ret = 1; /* OK */ + } + } + + unbash_spaces(); + return ret; + }; + +}; + +/* Should be after snapshot declaration */ +void fs_device::destroy() { + if (fstype) { + free(fstype); + fstype = NULL; + } + if (mountpoint) { + free(mountpoint); + mountpoint = NULL; + } + if (device) { + free(device); + device = NULL; + } + if (snap) { + delete snap; + snap = NULL; + } +} + +bool fs_device::can_do_snapshot() { + if (snap && !supportSnapshotTested) { + if (snap->support_snapshot(this)) { + Dmsg2(DT_SNAPSHOT, "%s suitable for snapshot, type %s\n", + mountpoint, snap->Type); + isSuitableForSnapshot = true; + + } else { + Dmsg2(DT_SNAPSHOT, "%s is not suitable for snapshot, type %s\n", + mountpoint, snap->Type); + } + supportSnapshotTested = true; + } + return isSuitableForSnapshot; +} + +/* Should be after the snapshot declaration */ +fs_device *mtab::search(char *file) { + struct stat statp; + if (lstat(file, &statp) != 0) { + Dmsg1(DT_SNAPSHOT, "%s not found\n", file); + return NULL; /* not found */ + } + + fs_device *elt = (fs_device *)entries->search((void *)((intptr_t)(statp.st_dev)), + search_entry); + if (!elt) { + Dmsg2(DT_SNAPSHOT, "Device %d for file %s not found in our mount list\n", + statp.st_dev, file); + return NULL; /* not found in our list, skip it */ + } + + if (!elt->can_do_snapshot()) { + Dmsg2(DT_SNAPSHOT, "Device %d for file %s not snapshotable\n", + statp.st_dev, file); + return NULL; + } + Dmsg2(DT_SNAPSHOT, "Found device %d for file %s\n", elt->dev, file); + return elt; +} + +/* Application to quiesce/un-quiesce */ +struct app { + BPIPE *fd; /* Communication channel */ + char *name; /* Pointer to the script name */ + char cmd[1]; /* Command line */ +}; + +/* In the application manager, we want to run a set + * of scripts and see if applications are running or + * not on our partitions. + * + * We can specify application in the fileset, or just + * try all application that are installed. + * + */ +class app_manager: public SMARTALLOC +{ +private: + JCR *jcr; + char *appdir; /* Where to find application scripts */ + alist *applst; /* Application list (script list to call) */ + int apptimeout; /* Timeout when trying to quiesce application */ + mtab *mount_list; /* snapshot set */ + +public: + app_manager(JCR *ajcr, mtab *m, char *dir): + jcr(ajcr), + appdir(dir), + applst(New(alist(10, owned_by_alist))), + apptimeout(300), + mount_list(m) {}; + + ~app_manager() { + delete applst; + }; + + /* Put in a file the list of all devices that + * are in the snapshot set + */ + bool dump_snapshotset() { + return true; + }; + + /* Scan application */ + bool scan() { + POOLMEM *results; + bool ret=false; + char *end, *start; + struct stat sp; + struct app *elt = NULL; + + if (!appdir || !*appdir || stat(appdir, &sp) == -1) { + Dmsg0(DT_SNAPSHOT, "app not configured\n"); + return true; + } + + /* Create a file with the list of all devices that are suitable + * for snapshot + */ + dump_snapshotset(); + + results = get_pool_memory(PM_FNAME); + if (run_program_full_output((char*)APPMANAGER_CMD, apptimeout, results) != 0) { + berrno be; + Dmsg2(DT_SNAPSHOT, "app scan error results=%s ERR=%s\n", results, be.bstrerror()); + goto bail_out; + } + + ret = true; + start = results; + + /* Put each line of the output in our list */ + for (start = results; start && *start;) { + end = strchr(start, '\n'); + if (end) { + *end = 0; + elt = (struct app *) malloc(sizeof(struct app) + strlen(start) + 1); + + elt->fd = NULL; + strcpy(elt->cmd, start); + elt->name = (char *)last_path_separator(elt->cmd); + if (elt->name) { + elt->name++; + + } else { + elt->name = elt->cmd; + } + + applst->append(elt); + Dmsg2(10, "+ %s (%s)\n", elt->name, elt->cmd); + *end = '\n'; + end++; + } + start = end; + } + bail_out: + free_pool_memory(results); + return ret; + }; + + bool unquiesce() { + if (applst->size() == 0) { + return true; + } + + Jmsg(jcr, M_INFO, 0, _("Un-Quiescing applications\n")); + return true; + }; + + /* Quiesce applications */ + bool quiesce() { + bool ret = true; + + if (applst->size() == 0) { + return true; + } + + Jmsg(jcr, M_INFO, 0, _("Quiescing applications\n")); + + for (int i = 0 ; i < applst->size() ; i++) { + struct app *elt = (struct app *) applst->get(i); + elt->fd = open_bpipe(elt->cmd, 0, "rw"); + if (!elt->fd) { + /* Unable to execute the program */ + continue; + } + /* Send some commands here */ + } + return ret; + }; +}; + +snapshot_manager::snapshot_manager(JCR *ajcr): + jcr(ajcr), mount_list(New(mtab())) { +} + +snapshot_manager::~snapshot_manager() { + delete mount_list; +} + +bool snapshot_manager::cleanup_snapshots() +{ + fs_device *elt; + foreach_rblist(elt, mount_list->entries) { + if (elt->can_do_snapshot() && elt->inSnapshotSet) { + snapshot *s = elt->snap; + if (!s->created) { + continue; + } + if (s->unmount()) { + /* TODO: Display an error? Can check mounted status */ + } + /* When no retention is set, we delete the snapshot + * just after the backup + */ + if (s->Retention == 0) { + if (s->del()) { + Jmsg(jcr, M_INFO, 0, _(" Delete Snapshot for %s\n"), elt->mountpoint); + + } else { + Jmsg(jcr, M_ERROR, 0, _(" Unable to delete snapshot of %s ERR=%s\n"), + elt->mountpoint, s->errmsg); + } + } + } + } + return true; +} + +bool snapshot_manager::create_snapshots() +{ + /* No snapshot, no quiescing */ + if (mount_list->empty()) { + Dmsg0(DT_SNAPSHOT, "The mount list is empty, no snapshot to take\n"); + return false; + } + + /* First thing to do is to quiesce application */ + app_manager apps(jcr, mount_list, (char *)APP_DIR); + + /* TODO: Let see if we really need to abort + * the snapshot part if application + */ + if (!apps.scan()) { + return false; + } + + if (!apps.quiesce()) { + return false; + } + + fs_device *elt; + foreach_rblist(elt, mount_list->entries) { + if (elt->can_do_snapshot() && elt->inSnapshotSet) { + snapshot *s = elt->snap; + if (s->create()) { + Jmsg(jcr, M_INFO, 0, _(" Create Snapshot for %s\n"), elt->mountpoint); + + if (s->Retention > 0) {/* Create snapshot catalog entry if we need to keep them */ + s->create_catalog_entry(); + } + + } else if (s->status == 2) { /* Use Error message */ + elt->isSuitableForSnapshot = false; /* Disable snapshot for this device */ + Jmsg(jcr, M_ERROR, 0, _(" Unable to create snapshot of %s ERR=%s\n"), + elt->mountpoint, s->errmsg); + + } else { /* By default, an error in the creation should be fatal */ + Jmsg(jcr, M_FATAL, 0, _(" Unable to create snapshot of %s ERR=%s\n"), + elt->mountpoint, s->errmsg); + apps.unquiesce(); + return false; + } + + } else { + Dmsg3(DT_SNAPSHOT|20, "No Snapshot for %s suitable=%d inset=%d\n", + elt->mountpoint, elt->isSuitableForSnapshot, elt->inSnapshotSet); + } + } + + /* Snapshots are ok, we need to release applications */ + if (!apps.unquiesce()) { + return false; + } + + /* Save the include context */ + POOL_MEM t; + findINCEXE *old = get_incexe(jcr); + findINCEXE *exclude = NULL; + foreach_rblist(elt, mount_list->entries) { + if (elt->can_do_snapshot() && elt->inSnapshotSet) { + snapshot *s = elt->snap; + + if (!s->mount()) { + Jmsg(jcr, M_ERROR, 0, " Unable to mount snapshot %s ERR=%s\n", + elt->mountpoint, s->errmsg); + + } else if (*s->SnapDirectory) { + if (!exclude) { + exclude = new_exclude(jcr); + /* Set the Exclude context */ + set_incexe(jcr, exclude); + } + Mmsg(t, "%s/.snapshots", elt->snap->SnapMountPoint); + Dmsg1(DT_SNAPSHOT|10, "Excluding %s\n", t.c_str()); + add_file_to_fileset(jcr, t.c_str(), true); + } + } + } + + /* Restore the current context */ + if (exclude) { + set_incexe(jcr, old); + } + return true; +} + +/* TODO: We might want to use some filters here */ +bool snapshot_manager::list_snapshots(alist *lst) +{ + fs_device *elt; + + /* No device, no snapshot */ + if (mount_list->dCount == 0) { + Dmsg0(DT_SNAPSHOT, "mount list is empty, no snapshot\n"); + return false; + } + + foreach_rblist(elt, mount_list->entries) { + if (elt->can_do_snapshot()) { + elt->snap->list(lst); + } + } + return true; +} + +void snapshot_manager::add_mount_point(uint32_t dev, const char *device, + const char *mountpoint, const char *fstype) +{ + bool check=true; + alist list(10, not_owned_by_alist); + fs_device *vol = New(fs_device(dev, device, mountpoint, fstype)); + + /* These FS are not supposed to use snapshot */ + const char *specialmp[] = { + "/proc/", + "/sys/", + NULL + }; + /* These FS are not supposed to use snapshot */ + const char *specialfs[] = { + "autofs", + "binfmt_misc", + "cgroup", + "configfs", + "debugfs", + "dev", + "devpts", + "devtmpfs", + "ecryptfs", + "fuse.gvfsd-fuse", + "fusectl", + "fd", + "hugetlbfs", + "mqueue", + "proc", + "pstore", + "rpc_pipefs", + "securityfs", + "selinuxfs", + "sysfs", + "systemd-1", + "tmpfs", + NULL + }; + + /* We skip directly /proc, /sys */ + for (int i=0; specialmp[i] ; i++) { + if (strncasecmp(specialmp[i], mountpoint, strlen(specialmp[i])) == 0) { + check = false; + break; + } + } + + if (check) { + for (int i=0; specialfs[i] ; i++) { + if (strcasecmp(specialfs[i], fstype) == 0) { + check = false; + break; + } + } + } + + if (check) { + snapshot *snap = New(snapshot(jcr)); + snap->set_name(jcr->Job); + vol->snap = snap; + + if (snap->scan_subvolumes(vol, &list)) { + for (int i = list.size() - 1 ; i >= 0 ; i--) { + fs_device *d = (fs_device *)list.remove(i); + add_mount_point(d->dev, d->device, d->mountpoint, d->fstype); + delete d; + } + } + } + + Dmsg4(DT_SNAPSHOT|20, "Adding %s dev=%d snap?=%d to the mount list (%d)\n", + mountpoint, dev, check, mount_list->dCount); + + if (!mount_list->add_entry(vol)) { + Dmsg1(DT_SNAPSHOT, "%s Already exists in mount list\n", vol->mountpoint); + delete vol; + } +} + +/* In this handler, we need to fill a mtab structure */ +static void add_handler(void *user_ctx, + struct stat *st, + const char *fstype, + const char *mountpoint, + const char *mntopts, + const char *device) +{ + Dmsg5(DT_SNAPSHOT|50, "dev=%ld device=%s mountpoint=%s fstype=%s mntopts=%s\n", + st->st_dev, device, mountpoint, fstype, mntopts); + + /* TODO: If the fstype is btrfs or zfs, the fs might contains subvolumes, + * and these subvolumes may not be reported in the mntent list. In this + * case, we need to call proper btrfs/zfs commands to list them. + * # btrfs subvolume list /mnt + * ID 256 gen 17 top level 5 path test + * ID 259 gen 18 top level 5 path test/titi + */ + snapshot_manager *snapmgr = (snapshot_manager *)user_ctx; + snapmgr->add_mount_point(st->st_dev, device, mountpoint, fstype); +} + +bool snapshot_manager::scan_mtab() +{ + return read_mtab(add_handler, this); +} + + +/* Scan the fileset to select partitions to snapshot */ +bool snapshot_manager::scan_fileset() +{ + if (!jcr->ff || !jcr->ff->fileset) { + Dmsg0(DT_SNAPSHOT, "No fileset associated with JCR\n"); + return false; + } + + findFILESET *fileset = jcr->ff->fileset; + dlistString *node; + int64_t flags = 0; + + for (int i=0; iinclude_list.size(); i++) { + + findFOPTS *fo; + findINCEXE *incexe = (findINCEXE *)fileset->include_list.get(i); + + /* look through all files */ + foreach_dlist(node, &incexe->name_list) { + char *fname = node->c_str(); + if (mount_list->add_in_snapshot_set(fname, &incexe->name_list, node)) { + /* When all volumes are selected, we can stop */ + Dmsg0(DT_SNAPSHOT, "All Volumes are marked, stopping the loop here\n"); + goto all_included; + } + } + + foreach_alist(fo, &incexe->opts_list) { + flags |= fo->flags; /* We are looking for FO_MULTIFS and recurse */ + } + } + +all_included: + /* If we allow recursion and multifs, we need to include sub volumes by hand + * in the backup list + */ + if (flags & FO_MULTIFS) { + fs_device *elt, *elt2; + + foreach_rblist(elt, mount_list->entries) { + if (!elt->inFileSet) { + continue; + } + alist *lst = New(alist(10, not_owned_by_alist)); + mount_list->get_subvolumes(elt->dev, lst, jcr->ff); + foreach_alist(elt2, lst) { + if (elt2->inFileSet) { + continue; + } + + /* TODO: See how to avoid having two entries for the same directory */ + /* Add the directory explicitely in the fileset */ + elt->include->insert_after(new_dlistString(elt2->mountpoint), elt->node); + + if (mount_list->add_in_snapshot_set(elt2, elt->include, elt->node)) { + /* When all volumes are selected, we can stop */ + Dmsg0(DT_SNAPSHOT, "All Volumes are marked, stopping the loop here\n"); + delete lst; + return true; + } + } + delete lst; + } + } + return true; +} + +int snapshot_cmd(JCR *jcr) +{ + BSOCK *dir = jcr->dir_bsock; + int n, ret = 1; + char ed1[50]; + snapshot snap(jcr); + snap.check_buffer_size(dir->msglen); + + n = sscanf(dir->msg, QueryCmd, snap.Name, snap.Volume, snap.Device, &snap.CreateTDate, snap.Type); + if (n == 5) { + snap.unbash_spaces(); + Dmsg0(DT_SNAPSHOT|10, "Doing query of a snapshot\n"); + n = snap.query(); + bash_spaces(snap.errmsg); + dir->fsend("%d Snapshot status=%d size=%lld ERR=%s\n", n?2000:2999, snap.status, snap.size, snap.errmsg); + goto bail_out; + } + + n = sscanf(dir->msg, LsCmd, snap.Name, snap.Volume, snap.Device, &snap.CreateTDate, snap.Type, snap.path); + if (n == 6) { + snap.unbash_spaces(); + Dmsg0(DT_SNAPSHOT|10, "Doing ls of a snapshot\n"); + n = snap.ls(dir); + dir->signal(BNET_EOD); + goto bail_out; + } + + n = sscanf(dir->msg, DelCmd, snap.Name, snap.Volume, snap.Device, &snap.CreateTDate, snap.Type); + if (n == 5) { + Dmsg0(DT_SNAPSHOT|10, "Doing del of a snapshot\n"); + snap.unbash_spaces(); + n = snap.del(); + bash_spaces(snap.errmsg); + dir->fsend("%d Snapshot deleted ERR=%s\n", n?2000:2999, snap.errmsg); + goto bail_out; + } + + n = sscanf(dir->msg, PruneCmd, snap.Volume, snap.Type); + if (n == 2) { + snap.unbash_spaces(); + n = snap.prune(dir); + bash_spaces(snap.errmsg); + dir->fsend("%d Snapshot pruned ERR=%s\n", n?2000:2999, snap.errmsg); + Dmsg0(DT_SNAPSHOT|10, "Doing pruning of snapshots\n"); + goto bail_out; + } + + n = sscanf(dir->msg, SyncCmd, snap.Volume, snap.Type); + if (n == 2) { + snap.unbash_spaces(); + n = snap.sync(dir); + bash_spaces(snap.errmsg); + dir->fsend("%d Snapshot synced ERR=%s\n", n?2000:2999, snap.errmsg); + Dmsg0(DT_SNAPSHOT|10, "Doing sync of snapshots\n"); + goto bail_out; + } + + /* TODO: Include a path name or a device name */ + if (strncmp(dir->msg, ListCmd, strlen(ListCmd)) == 0) { + snapshot *elt; + char ed1[50]; + alist *lst = New(alist(10, not_owned_by_alist)); + list_all_snapshots(jcr, lst); + foreach_alist(elt, lst) { + elt->bash_spaces(); + dir->fsend("volume=\"%s\" createtdate=\"%s\" name=\"%s\" device=\"%s\" status=%d error=\"%s\" type=\"%s\"\n", + elt->Volume, edit_uint64(elt->CreateTDate, ed1), + elt->Name, elt->Device, elt->status, elt->errmsg, elt->Type); + delete elt; + } + delete lst; + dir->signal(BNET_EOD); + goto bail_out; + } + + n = sscanf(dir->msg, ConfCmd, ed1); + if (n == 1) { + jcr->snapshot_retention = str_to_uint64(ed1); + dir->fsend("2000 Snapshot retention\n"); + goto bail_out; + } + + dir->fsend("2999 Snapshot command not found\n"); + dir->signal(BNET_EOD); + ret = 0; + +bail_out: + return ret; +} + +bool snapshot_convert_path(JCR *jcr, FF_PKT *ff, dlist *filelist, dlistString *node) +{ + Dmsg1(DT_SNAPSHOT, "snapshot_convert_path(%s)\n", ff->top_fname); + snapshot_manager *snapmgr = jcr->snap_mgr; + ff->strip_snap_path = false; + + if (!snapmgr) { + return true; + } + + fs_device *elt = snapmgr->mount_list->search(ff->top_fname); + if (!elt) { + return true; /* not found */ + } + + if (!ff->snap_fname) { + ff->snap_fname = get_pool_memory(PM_FNAME); + } + + /* Convert the filename to the original path */ + if (!elt->snap->convert_path(ff)) { + Dmsg2(DT_SNAPSHOT, "Device %d for file %s not snapshotable\n", + elt->dev, ff->top_fname); + return true; + } + return true; +} + +/* ListSnap[] = "CatReq Job=%s list_snapshot name=%s volume=%s device=%s tdate=%d type=%s before=%s after=%s expired=%d"; */ + +/* List Catalog entry of the current client */ +int snapshot_list_catalog(JCR *jcr, + const char *query, + alist *lst) +{ + int ret = 0, i; + arg_parser cmd; + POOL_MEM q, tmp; + if (cmd.parse_cmd(query) != bRC_OK) { + Dmsg1(DT_SNAPSHOT, "Unable to decode query %s\n", query); + return 0; + } + Mmsg(q, "CatReq Job=%s list_snapshot name=", jcr->Job); + if ((i = cmd.find_arg_with_value("name")) >= 0) { + bash_spaces(cmd.argv[i]); + pm_strcat(q, cmd.argv[i]); + } + + pm_strcat(q, " volume="); + if ((i = cmd.find_arg_with_value("volume")) >= 0) { + bash_spaces(cmd.argv[i]); + pm_strcat(q, cmd.argv[i]); + } + + pm_strcat(q, " device="); + if ((i = cmd.find_arg_with_value("device")) >= 0) { + bash_spaces(cmd.argv[i]); + pm_strcat(q, cmd.argv[i]); + } + + pm_strcat(q, " tdate="); + if ((i = cmd.find_arg_with_value("tdate")) >= 0) { + bash_spaces(cmd.argv[i]); + pm_strcat(q, cmd.argv[i]); + } + + pm_strcat(q, " type="); + if ((i = cmd.find_arg_with_value("type")) >= 0) { + bash_spaces(cmd.argv[i]); + pm_strcat(q, cmd.argv[i]); + } + + pm_strcat(q, " before="); + if ((i = cmd.find_arg_with_value("before")) >= 0) { + bash_spaces(cmd.argv[i]); + pm_strcat(q, cmd.argv[i]); + } + + pm_strcat(q, " after="); + if ((i = cmd.find_arg_with_value("after")) >= 0) { + bash_spaces(cmd.argv[i]); + pm_strcat(q, cmd.argv[i]); + } + + pm_strcat(q, " expired="); + if ((i = cmd.find_arg_with_value("expired")) >= 0) { + bash_spaces(cmd.argv[i]); + pm_strcat(q, cmd.argv[i]); + } + + jcr->dir_bsock->fsend("%s\n", q.c_str()); + + while (jcr->dir_bsock->recv() > 0) { + if (cmd.parse_cmd(jcr->dir_bsock->msg) != bRC_OK) { + Dmsg1(DT_SNAPSHOT, "Unable to decode director output %s\n", jcr->dir_bsock->msg); + + } else { + ret = 1; /* OK */ + snapshot *s = New(snapshot(jcr)); + s->scan_arg(&cmd); + lst->append(s); + } + } + return ret; +} diff --git a/bacula/src/filed/fd_snapshot.h b/bacula/src/filed/fd_snapshot.h new file mode 100644 index 0000000000..5d670deb50 --- /dev/null +++ b/bacula/src/filed/fd_snapshot.h @@ -0,0 +1,68 @@ +/* + Bacula(R) - The Network Backup Solution + + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2014 Free Software Foundation Europe e.V. + + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. + + You may use this file and others of this release according to the + license defined in the LICENSE file, which includes the Affero General + Public License, v3.0 ("AGPLv3") and some additional permissions and + terms pursuant to its AGPLv3 Section 7. + + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. + + Written by Eric Bollengier 2015 +*/ + +#ifndef FD_SNAPSHOT_H +#define FD_SNAPSHOT_H + +/* default snapshot handler */ +char *snapshot_get_command(); + +/* Internal objects */ +class mtab; /* device list */ +class fs_device; + +class snapshot_manager: public SMARTALLOC +{ +private: + JCR *jcr; +public: + mtab *mount_list; + + snapshot_manager(JCR *ajcr); + virtual ~snapshot_manager(); + + /* Quiesce application and take snapshot */ + bool create_snapshots(); + + /* Cleanup snapshots */ + bool cleanup_snapshots(); + + /* List snapshots */ + bool list_snapshots(alist *ret); + + /* Scan the fileset for devices and application */ + bool scan_fileset(); + + /* Scan the mtab */ + bool scan_mtab(); + + /* Add a mount point to the mtab list */ + void add_mount_point(uint32_t dev, const char *device, + const char *mountpoint, const char *fstype); +}; + +void close_snapshot_backup_session(JCR *jcr); +bool open_snapshot_backup_session(JCR *jcr); + +bool snapshot_convert_path(JCR *jcr, FF_PKT *ff, dlist *filelist, dlistString *node); + +#endif /* FD_SNAPSHOT_H */ diff --git a/bacula/src/filed/filed.c b/bacula/src/filed/filed.c index d4e51f8027..8e273bfe04 100644 --- a/bacula/src/filed/filed.c +++ b/bacula/src/filed/filed.c @@ -1,28 +1,31 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula File Daemon * - * Written by Kern Sibbald, March MM + * Kern Sibbald, March MM * */ #include "bacula.h" #include "filed.h" -#include "lib/mntent_cache.h" /* Imported Functions */ extern void *handle_connection_request(void *dir_sock); @@ -37,7 +40,10 @@ bool no_signals = false; void *start_heap; extern struct s_cmds cmds[]; -#define CONFIG_FILE "bacula-fd.conf" /* default config file */ +#ifndef CONFIG_FILE /* Might be overwritten */ + #define CONFIG_FILE "bacula-fd.conf" /* default config file */ + #define PROG_NAME "bacula-fd" +#endif char *configfile = NULL; static bool foreground = false; @@ -48,23 +54,23 @@ static CONFIG *config; static void usage() { fprintf(stderr, _( -PROG_COPYRIGHT -"\n%sVersion: %s (%s)\n\n" -"Usage: bacula-fd [-f -s] [-c config_file] [-d debug_level]\n" -" -c use as configuration file\n" -" -d [,] set debug level to , debug tags to \n" -" -dt print a timestamp in debug output\n" -" -f run in foreground (for debugging)\n" -" -g groupid\n" -" -k keep readall capabilities\n" -" -m print kaboom output (for debugging)\n" -" -s no signals (for debugging)\n" -" -t test configuration file and exit\n" -" -T set trace on\n" -" -u userid\n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n"), 2000, "", VERSION, BDATE); + PROG_COPYRIGHT + "\nVersion: %s (%s)\n\n" + "Usage: bacula-fd [-f -s] [-c config_file] [-d debug_level]\n" + " -c use as configuration file\n" + " -d [,] set debug level to , debug tags to \n" + " -dt print a timestamp in debug output\n" + " -f run in foreground (for debugging)\n" + " -g groupid\n" + " -k keep readall capabilities\n" + " -m print kaboom output (for debugging)\n" + " -s no signals (for debugging)\n" + " -t test configuration file and exit\n" + " -T set trace on\n" + " -u userid\n" + " -v verbose user messages\n" + " -? print this message.\n" + "\n"), 2000, VERSION, BDATE); exit(1); } @@ -75,9 +81,6 @@ PROG_COPYRIGHT * Main Bacula Unix Client Program * */ -#if defined(HAVE_WIN32) -#define main BaculaMain -#endif int main (int argc, char *argv[]) { @@ -93,7 +96,7 @@ int main (int argc, char *argv[]) textdomain("bacula"); init_stack_dump(); - my_name_is(argc, argv, "bacula-fd"); + my_name_is(argc, argv, PROG_NAME); init_msg(NULL, NULL); daemon_start_time = time(NULL); @@ -120,7 +123,7 @@ int main (int argc, char *argv[]) debug_level = 1; } if (p) { - debug_parse_tags(p+1, &debug_level); + debug_parse_tags(p+1, &debug_level_tags); } } break; @@ -225,9 +228,9 @@ int main (int argc, char *argv[]) lmgr_init_thread(); /* initialize the lockmanager stack */ /* Maximum 1 daemon at a time */ - create_pid_file(me->pid_directory, "bacula-fd", + create_pid_file(me->pid_directory, PROG_NAME, get_first_port_host_order(me->FDaddrs)); - read_state_file(me->working_directory, "bacula-fd", + read_state_file(me->working_directory, PROG_NAME, get_first_port_host_order(me->FDaddrs)); load_fd_plugins(me->plugin_directory); @@ -238,6 +241,11 @@ int main (int argc, char *argv[]) me += 1000000; #endif + /* Setup default value for the the snapshot handler */ + if (!me->snapshot_command) { + me->snapshot_command = snapshot_get_command(); + } + if (!no_signals) { start_watchdog(); /* start watchdog thread */ init_jcr_subsystem(); /* start JCR watchdogs etc. */ @@ -271,7 +279,6 @@ void terminate_filed(int sig) bnet_stop_thread_server(server_tid); generate_daemon_event(NULL, "Exit"); unload_plugins(); - flush_mntent_cache(); write_state_file(me->working_directory, "bacula-fd", get_first_port_host_order(me->FDaddrs)); delete_pid_file(me->pid_directory, "bacula-fd", get_first_port_host_order(me->FDaddrs)); @@ -282,6 +289,7 @@ void terminate_filed(int sig) if (debug_level > 0) { print_memory_pool_stats(); } + if (config) { config->free_resources(); free(config); diff --git a/bacula/src/filed/filed.h b/bacula/src/filed/filed.h index 308fb197fe..9eaf2ebb4a 100644 --- a/bacula/src/filed/filed.h +++ b/bacula/src/filed/filed.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula File Daemon specific configuration and defines @@ -20,45 +24,45 @@ * */ -/* - * Number of acl errors to report per job. - */ -#define ACL_REPORT_ERR_MAX_PER_JOB 25 +//#define TEST_WORKER +#ifdef TEST_WORKER +#define ERROR_BUFFER_OVERFLOW 1 +#define ERROR_SUCCESS 0 +#endif -/* - * Number of xattr errors to report per job. - */ -#define XATTR_REPORT_ERR_MAX_PER_JOB 25 -/* - * Return codes from acl subroutines. - */ -typedef enum { - bacl_exit_fatal = -1, - bacl_exit_error = 0, - bacl_exit_ok = 1 -} bacl_exit_code; - -/* - * Return codes from xattr subroutines. - */ -typedef enum { - bxattr_exit_fatal = -1, - bxattr_exit_error = 0, - bxattr_exit_ok = 1 -} bxattr_exit_code; +/* acl errors to report per job. */ +#define ACL_MAX_ERROR_PRINT_PER_JOB 25 + +/* xattr errors to report per job. */ +#define XATTR_MAX_ERROR_PRINT_PER_JOB 25 + +/* Return values from acl subroutines. */ +enum bacl_rtn_code { + bacl_rtn_fatal = -1, + bacl_rtn_error = 0, + bacl_rtn_ok = 1 +}; + +/* Return values from xattr subroutines. */ +enum bxattr_rtn_code { + bxattr_rtn_fatal = -1, + bxattr_rtn_error = 0, + bxattr_rtn_ok = 1 +}; #define FILE_DAEMON 1 -#include "lib/htable.h" -#include "filed_conf.h" -#include "fd_plugins.h" -#include "findlib/find.h" -#include "acl.h" -#include "xattr.h" -#include "jcr.h" -#include "protos.h" /* file daemon prototypes */ -#include "lib/runscript.h" -#include "lib/breg.h" +#include "lib/htable.h" +#include "filed_conf.h" +#include "fd_plugins.h" +#include "fd_snapshot.h" +#include "findlib/find.h" +#include "acl.h" +#include "xattr.h" +#include "jcr.h" +#include "protos.h" /* file daemon prototypes */ +#include "lib/runscript.h" +#include "lib/breg.h" #ifdef HAVE_LIBZ #include /* compression headers */ #else diff --git a/bacula/src/filed/filed_conf.c b/bacula/src/filed/filed_conf.c index a2df826ef5..164786be4b 100644 --- a/bacula/src/filed/filed_conf.c +++ b/bacula/src/filed/filed_conf.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Main configuration file parser for Bacula File Daemon (Client) @@ -32,7 +36,7 @@ * definitions as well as any specific store routines * for the resource records. * - * Written by Kern Sibbald, September MM + * Kern Sibbald, September MM * */ @@ -77,64 +81,65 @@ static void store_digest_type(LEX *lc, RES_ITEM *item, int index, int pass); /* Client or File daemon "Global" resources */ static RES_ITEM cli_items[] = { - {"name", store_name, ITEM(res_client.hdr.name), 0, ITEM_REQUIRED, 0}, - {"description", store_str, ITEM(res_client.hdr.desc), 0, 0, 0}, - {"fdport", store_addresses_port, ITEM(res_client.FDaddrs), 0, ITEM_DEFAULT, 9102}, - {"fdaddress", store_addresses_address, ITEM(res_client.FDaddrs), 0, ITEM_DEFAULT, 9102}, - {"fdaddresses", store_addresses, ITEM(res_client.FDaddrs), 0, ITEM_DEFAULT, 9102}, - {"fdsourceaddress", store_addresses_address, ITEM(res_client.FDsrc_addr), 0, ITEM_DEFAULT, 0}, - - {"workingdirectory", store_dir, ITEM(res_client.working_directory), 0, ITEM_REQUIRED, 0}, - {"piddirectory", store_dir, ITEM(res_client.pid_directory), 0, ITEM_REQUIRED, 0}, - {"subsysdirectory", store_dir, ITEM(res_client.subsys_directory), 0, 0, 0}, - {"plugindirectory", store_dir, ITEM(res_client.plugin_directory), 0, 0, 0}, - {"scriptsdirectory", store_dir, ITEM(res_client.scripts_directory), 0, 0, 0}, - {"maximumconcurrentjobs", store_pint32, ITEM(res_client.MaxConcurrentJobs), 0, ITEM_DEFAULT, 20}, - {"messages", store_res, ITEM(res_client.messages), R_MSGS, 0, 0}, - {"sdconnecttimeout", store_time,ITEM(res_client.SDConnectTimeout), 0, ITEM_DEFAULT, 60 * 30}, - {"heartbeatinterval", store_time, ITEM(res_client.heartbeat_interval), 0, ITEM_DEFAULT, 5 * 60}, - {"maximumnetworkbuffersize", store_pint32, ITEM(res_client.max_network_buffer_size), 0, 0, 0}, + {"Name", store_name, ITEM(res_client.hdr.name), 0, ITEM_REQUIRED, 0}, + {"Description", store_str, ITEM(res_client.hdr.desc), 0, 0, 0}, + {"FdPort", store_addresses_port, ITEM(res_client.FDaddrs), 0, ITEM_DEFAULT, 9102}, + {"FdAddress", store_addresses_address, ITEM(res_client.FDaddrs), 0, ITEM_DEFAULT, 9102}, + {"FdAddresses", store_addresses, ITEM(res_client.FDaddrs), 0, ITEM_DEFAULT, 9102}, + {"FdSourceAddress", store_addresses_address, ITEM(res_client.FDsrc_addr), 0, ITEM_DEFAULT, 0}, + + {"WorkingDirectory", store_dir, ITEM(res_client.working_directory), 0, ITEM_REQUIRED, 0}, + {"PidDirectory", store_dir, ITEM(res_client.pid_directory), 0, ITEM_REQUIRED, 0}, + {"SubsysDirectory", store_dir, ITEM(res_client.subsys_directory), 0, 0, 0}, + {"PluginDirectory", store_dir, ITEM(res_client.plugin_directory), 0, 0, 0}, + {"SnapshotCommand", store_str, ITEM(res_client.snapshot_command), 0, 0, 0}, + {"ScriptsDirectory", store_dir, ITEM(res_client.scripts_directory), 0, 0, 0}, + {"MaximumConcurrentJobs", store_pint32, ITEM(res_client.MaxConcurrentJobs), 0, ITEM_DEFAULT, 20}, + {"Messages", store_res, ITEM(res_client.messages), R_MSGS, 0, 0}, + {"SdConnectTimeout", store_time,ITEM(res_client.SDConnectTimeout), 0, ITEM_DEFAULT, 60 * 30}, + {"HeartbeatInterval", store_time, ITEM(res_client.heartbeat_interval), 0, ITEM_DEFAULT, 5 * 60}, + {"MaximumNetWorkBufferSize", store_pint32, ITEM(res_client.max_network_buffer_size), 0, 0, 0}, #ifdef DATA_ENCRYPTION - {"pkisignatures", store_bool, ITEM(res_client.pki_sign), 0, ITEM_DEFAULT, 0}, - {"pkiencryption", store_bool, ITEM(res_client.pki_encrypt), 0, ITEM_DEFAULT, 0}, - {"pkikeypair", store_dir, ITEM(res_client.pki_keypair_file), 0, 0, 0}, - {"pkisigner", store_alist_str, ITEM(res_client.pki_signing_key_files), 0, 0, 0}, - {"pkimasterkey", store_alist_str, ITEM(res_client.pki_master_key_files), 0, 0, 0}, - {"pkicipher", store_cipher_type, ITEM(res_client.pki_cipher), 0, 0, 0}, - {"pkipigest", store_digest_type, ITEM(res_client.pki_digest), 0, 0, 0}, + {"PkiSignatures", store_bool, ITEM(res_client.pki_sign), 0, ITEM_DEFAULT, 0}, + {"PkiEncryption", store_bool, ITEM(res_client.pki_encrypt), 0, ITEM_DEFAULT, 0}, + {"PkiKeyPair", store_dir, ITEM(res_client.pki_keypair_file), 0, 0, 0}, + {"PkiSigner", store_alist_str, ITEM(res_client.pki_signing_key_files), 0, 0, 0}, + {"PkiMasterKey", store_alist_str, ITEM(res_client.pki_master_key_files), 0, 0, 0}, + {"PkiCipher", store_cipher_type, ITEM(res_client.pki_cipher), 0, 0, 0}, + {"PkiDigest", store_digest_type, ITEM(res_client.pki_digest), 0, 0, 0}, #endif - {"tlsauthenticate", store_bool, ITEM(res_client.tls_authenticate), 0, 0, 0}, - {"tlsenable", store_bool, ITEM(res_client.tls_enable), 0, 0, 0}, - {"tlsrequire", store_bool, ITEM(res_client.tls_require), 0, 0, 0}, - {"tlscacertificatefile", store_dir, ITEM(res_client.tls_ca_certfile), 0, 0, 0}, - {"tlscacertificatedir", store_dir, ITEM(res_client.tls_ca_certdir), 0, 0, 0}, - {"tlscertificate", store_dir, ITEM(res_client.tls_certfile), 0, 0, 0}, - {"tlskey", store_dir, ITEM(res_client.tls_keyfile), 0, 0, 0}, - {"verid", store_str, ITEM(res_client.verid), 0, 0, 0}, - {"maximumbandwidthperjob",store_speed, ITEM(res_client.max_bandwidth_per_job), 0, 0, 0}, - {"disablecommand", store_alist_str, ITEM(res_client.disable_cmds), 0, 0, 0}, + {"TlsAuthenticate", store_bool, ITEM(res_client.tls_authenticate), 0, 0, 0}, + {"TlsEnable", store_bool, ITEM(res_client.tls_enable), 0, 0, 0}, + {"TlsRequire", store_bool, ITEM(res_client.tls_require), 0, 0, 0}, + {"TlsCaCertificateFile", store_dir, ITEM(res_client.tls_ca_certfile), 0, 0, 0}, + {"TlsCaCertificateDir", store_dir, ITEM(res_client.tls_ca_certdir), 0, 0, 0}, + {"TlsCertificate", store_dir, ITEM(res_client.tls_certfile), 0, 0, 0}, + {"TlsKey", store_dir, ITEM(res_client.tls_keyfile), 0, 0, 0}, + {"VerId", store_str, ITEM(res_client.verid), 0, 0, 0}, + {"MaximumBandwidthPerJob",store_speed, ITEM(res_client.max_bandwidth_per_job), 0, 0, 0}, + {"DisableCommand", store_alist_str, ITEM(res_client.disable_cmds), 0, 0, 0}, {NULL, NULL, {0}, 0, 0, 0} }; /* Directors that can use our services */ static RES_ITEM dir_items[] = { - {"name", store_name, ITEM(res_dir.hdr.name), 0, ITEM_REQUIRED, 0}, - {"description", store_str, ITEM(res_dir.hdr.desc), 0, 0, 0}, - {"password", store_password, ITEM(res_dir.password), 0, ITEM_REQUIRED, 0}, - {"address", store_str, ITEM(res_dir.address), 0, 0, 0}, - {"monitor", store_bool, ITEM(res_dir.monitor), 0, ITEM_DEFAULT, 0}, - {"tlsauthenticate", store_bool, ITEM(res_dir.tls_authenticate), 0, 0, 0}, - {"tlsenable", store_bool, ITEM(res_dir.tls_enable), 0, 0, 0}, - {"tlsrequire", store_bool, ITEM(res_dir.tls_require), 0, 0, 0}, - {"tlsverifypeer", store_bool, ITEM(res_dir.tls_verify_peer), 0, ITEM_DEFAULT, 1}, - {"tlscacertificatefile", store_dir, ITEM(res_dir.tls_ca_certfile), 0, 0, 0}, - {"tlscacertificatedir", store_dir, ITEM(res_dir.tls_ca_certdir), 0, 0, 0}, - {"tlscertificate", store_dir, ITEM(res_dir.tls_certfile), 0, 0, 0}, - {"tlskey", store_dir, ITEM(res_dir.tls_keyfile), 0, 0, 0}, - {"tlsdhfile", store_dir, ITEM(res_dir.tls_dhfile), 0, 0, 0}, - {"tlsallowedcn", store_alist_str, ITEM(res_dir.tls_allowed_cns), 0, 0, 0}, - {"maximumbandwidthperjob", store_speed, ITEM(res_dir.max_bandwidth_per_job), 0, 0, 0}, - {"disablecommand", store_alist_str, ITEM(res_dir.disable_cmds), 0, 0, 0}, + {"Name", store_name, ITEM(res_dir.hdr.name), 0, ITEM_REQUIRED, 0}, + {"Description", store_str, ITEM(res_dir.hdr.desc), 0, 0, 0}, + {"Password", store_password, ITEM(res_dir.password), 0, ITEM_REQUIRED, 0}, + {"Address", store_str, ITEM(res_dir.address), 0, 0, 0}, + {"Monitor", store_bool, ITEM(res_dir.monitor), 0, ITEM_DEFAULT, 0}, + {"TlsAuthenticate", store_bool, ITEM(res_dir.tls_authenticate), 0, 0, 0}, + {"TlsEnable", store_bool, ITEM(res_dir.tls_enable), 0, 0, 0}, + {"TlsRequire", store_bool, ITEM(res_dir.tls_require), 0, 0, 0}, + {"TlsVerifyPeer", store_bool, ITEM(res_dir.tls_verify_peer), 0, ITEM_DEFAULT, 1}, + {"TlsCaCertificateFile", store_dir, ITEM(res_dir.tls_ca_certfile), 0, 0, 0}, + {"TlsCaCertificateDir", store_dir, ITEM(res_dir.tls_ca_certdir), 0, 0, 0}, + {"TlsCertificate", store_dir, ITEM(res_dir.tls_certfile), 0, 0, 0}, + {"TlsKey", store_dir, ITEM(res_dir.tls_keyfile), 0, 0, 0}, + {"TlsDhFile", store_dir, ITEM(res_dir.tls_dhfile), 0, 0, 0}, + {"TlsAllowedCn", store_alist_str, ITEM(res_dir.tls_allowed_cns), 0, 0, 0}, + {"MaximumBandwidthPerJob", store_speed, ITEM(res_dir.max_bandwidth_per_job), 0, 0, 0}, + {"DisableCommand", store_alist_str, ITEM(res_dir.disable_cmds), 0, 0, 0}, {NULL, NULL, {0}, 0, 0, 0} }; @@ -146,10 +151,10 @@ extern RES_ITEM msgs_items[]; * It must have one item for each of the resources. */ RES_TABLE resources[] = { - {"director", dir_items, R_DIRECTOR}, - {"filedaemon", cli_items, R_CLIENT}, - {"client", cli_items, R_CLIENT}, /* alias for filedaemon */ - {"messages", msgs_items, R_MSGS}, + {"Director", dir_items, R_DIRECTOR}, + {"FileDaemon", cli_items, R_CLIENT}, + {"Messages", msgs_items, R_MSGS}, + {"Client", cli_items, R_CLIENT}, /* alias for filedaemon */ {NULL, NULL, 0} }; @@ -224,9 +229,9 @@ static void store_digest_type(LEX *lc, RES_ITEM *item, int index, int pass) } /* Dump contents of resource */ -void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fmt, ...), void *sock) +void dump_resource(int type, RES *ares, void sendit(void *sock, const char *fmt, ...), void *sock) { - URES *res = (URES *)reshdr; + URES *res = (URES *)ares; int recurse = 1; if (res == NULL) { @@ -239,11 +244,11 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fm } switch (type) { case R_DIRECTOR: - sendit(sock, "Director: name=%s password=%s\n", reshdr->name, + sendit(sock, "Director: name=%s password=%s\n", ares->name, res->res_dir.password); break; case R_CLIENT: - sendit(sock, "Client: name=%s FDport=%d\n", reshdr->name, + sendit(sock, "Client: name=%s FDport=%d\n", ares->name, get_first_port_host_order(res->res_client.FDaddrs)); break; case R_MSGS: @@ -256,11 +261,13 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fm default: sendit(sock, "Unknown resource type %d\n", type); } + ares = GetNextRes(type, ares); if (recurse && res->res_dir.hdr.next) { dump_resource(type, res->res_dir.hdr.next, sendit, sock); } } + /* * Free memory of resource. * NB, we don't need to worry about freeing any references @@ -343,7 +350,9 @@ void free_resource(RES *sres, int type) if (res->res_client.FDsrc_addr) { free_addresses(res->res_client.FDsrc_addr); } - + if (res->res_client.snapshot_command) { + free(res->res_client.snapshot_command); + } if (res->res_client.pki_keypair_file) { free(res->res_client.pki_keypair_file); } @@ -400,10 +409,12 @@ void free_resource(RES *sres, int type) } break; case R_MSGS: - if (res->res_msgs.mail_cmd) + if (res->res_msgs.mail_cmd) { free(res->res_msgs.mail_cmd); - if (res->res_msgs.operator_cmd) + } + if (res->res_msgs.operator_cmd) { free(res->res_msgs.operator_cmd); + } free_msgs_res((MSGS *)res); /* free message resource */ res = NULL; break; @@ -436,7 +447,7 @@ void save_resource(int type, RES_ITEM *items, int pass) for (i=0; items[i].name; i++) { if (items[i].flags & ITEM_REQUIRED) { if (!bit_is_set(i, res_all.res_dir.hdr.item_present)) { - Emsg2(M_ABORT, 0, _("%s item is required in %s resource, but not found.\n"), + Emsg2(M_ERROR_TERM, 0, _("%s item is required in %s resource, but not found.\n"), items[i].name, resources[rindex]); } } @@ -459,6 +470,7 @@ void save_resource(int type, RES_ITEM *items, int pass) Emsg1(M_ABORT, 0, _("Cannot find Director resource %s\n"), res_all.res_dir.hdr.name); } res->res_dir.tls_allowed_cns = res_all.res_dir.tls_allowed_cns; + res->res_dir.disable_cmds = res_all.res_dir.disable_cmds; break; case R_CLIENT: if ((res = (URES *)GetResWithName(R_CLIENT, res_all.res_dir.hdr.name)) == NULL) { @@ -471,6 +483,7 @@ void save_resource(int type, RES_ITEM *items, int pass) res->res_client.pki_recipients = res_all.res_client.pki_recipients; res->res_client.messages = res_all.res_client.messages; + res->res_client.disable_cmds = res_all.res_client.disable_cmds; break; default: Emsg1(M_ERROR, 0, _("Unknown resource type %d\n"), type); diff --git a/bacula/src/filed/filed_conf.h b/bacula/src/filed/filed_conf.h index 003c76b886..7ab4b65de9 100644 --- a/bacula/src/filed/filed_conf.h +++ b/bacula/src/filed/filed_conf.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula File Daemon specific configuration @@ -70,6 +74,7 @@ struct CLIENT { char *subsys_directory; char *plugin_directory; /* Plugin directory */ char *scripts_directory; + char *snapshot_command; MSGS *messages; /* daemon message handler */ uint32_t MaxConcurrentJobs; utime_t SDConnectTimeout; /* timeout in seconds */ diff --git a/bacula/src/filed/heartbeat.c b/bacula/src/filed/heartbeat.c index 9795049eab..783bfb24be 100644 --- a/bacula/src/filed/heartbeat.c +++ b/bacula/src/filed/heartbeat.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2003-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula File Daemon heartbeat routines diff --git a/bacula/src/filed/hello.c b/bacula/src/filed/hello.c new file mode 100644 index 0000000000..2ec9105736 --- /dev/null +++ b/bacula/src/filed/hello.c @@ -0,0 +1,214 @@ +/* + Bacula(R) - The Network Backup Solution + + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2014 Free Software Foundation Europe e.V. + + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. + + You may use this file and others of this release according to the + license defined in the LICENSE file, which includes the Affero General + Public License, v3.0 ("AGPLv3") and some additional permissions and + terms pursuant to its AGPLv3 Section 7. + + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. +*/ +/* + * Authenticate Director who is attempting to connect. + * + * Kern Sibbald, October 2000 + * + */ + +#include "bacula.h" +#include "filed.h" + +extern CLIENT *me; /* my resource */ + +const int dbglvl = 50; + +/* FD_VERSION history + * None prior to 10Mar08 + * 1 10Mar08 + * 2 13Mar09 - added the ability to restore from multiple storages + * 3 03Sep10 - added the restore object command + * 4 25Nov10 - added bandwidth command 5.1 + * 5 24Nov11 - added new restore object command format (pluginname) + * 6 15Feb12 - added Component selection information list + * 7 19Feb12 - added Expected files to restore + * 8 22Mar13 - added restore options + version for SD + * 9 06Aug13 - skipped + * 10 01Jan14 - added SD Calls Client + * 11 O4May14 - skipped + * 12 22Jun14 - skipped + * 213 04Feb15 - added snapshot protocol with the DIR + */ + +#define FD_VERSION 213 /* FD version */ + +static char hello_sd[] = "Hello Bacula SD: Start Job %s %d\n"; +static char hello_dir[] = "2000 OK Hello %d\n"; +static char sorry_dir[] = "2999 Authentication failed.\n"; + +static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; + +/********************************************************************* + * + * Validate hello from the Director + * + * Returns: true if Hello is good. + * false if Hello is bad. + */ +bool validate_dir_hello(JCR *jcr) +{ + POOLMEM *dirname; + DIRRES *director = NULL; + int dir_version = 0; + BSOCK *dir = jcr->dir_bsock; + bool auth_success = false; + + if (dir->msglen < 25 || dir->msglen > 500) { + Dmsg2(dbglvl, "Bad Hello command from Director at %s. Len=%d.\n", + dir->who(), dir->msglen); + Jmsg2(jcr, M_FATAL, 0, _("Bad Hello command from Director at %s. Len=%d.\n"), + dir->who(), dir->msglen); + return false; + } + dirname = get_pool_memory(PM_MESSAGE); + dirname = check_pool_memory_size(dirname, dir->msglen); + + if (sscanf(dir->msg, "Hello Director %127s calling %d", dirname, &dir_version) != 2 && + sscanf(dir->msg, "Hello Director %127s calling", dirname) != 1) { + char addr[64]; + char *who = dir->get_peer(addr, sizeof(addr)) ? dir->who() : addr; + dir->msg[100] = 0; + Dmsg2(dbglvl, "Bad Hello command from Director at %s: %s\n", + dir->who(), dir->msg); + Jmsg2(jcr, M_FATAL, 0, _("Bad Hello command from Director at %s: %s\n"), + who, dir->msg); + goto auth_fatal; + } + unbash_spaces(dirname); + foreach_res(director, R_DIRECTOR) { + if (strcmp(director->hdr.name, dirname) == 0) + break; + } + if (!director) { + char addr[64]; + char *who = dir->get_peer(addr, sizeof(addr)) ? dir->who() : addr; + Jmsg2(jcr, M_FATAL, 0, _("Connection from unknown Director %s at %s rejected.\n"), + dirname, who); + goto auth_fatal; + } + auth_success = true; + +auth_fatal: + free_pool_memory(dirname); + jcr->director = director; + /* Single thread all failures to avoid DOS */ + if (!auth_success) { + P(mutex); + bmicrosleep(6, 0); + V(mutex); + } + return auth_success; +} + +/* + * Note, we handle the initial connection request here. + * We only get the jobname and the SD version, then we + * return, authentication will be done when the Director + * sends the storage command -- as is usually the case. + * This should be called only once by the SD. + */ +void *handle_storage_connection(BSOCK *sd) +{ + char job_name[500]; + char tbuf[150]; + int sd_version = 0; + JCR *jcr; + + if (sscanf(sd->msg, "Hello FD: Bacula Storage calling Start Job %127s %d", + job_name, &sd_version) != 2) { + Jmsg(NULL, M_FATAL, 0, _("SD connect failed: Bad Hello command\n")); + return NULL; + } + Dmsg1(110, "Got a SD connection at %s\n", bstrftimes(tbuf, sizeof(tbuf), + (utime_t)time(NULL))); + Dmsg1(50, "%s", sd->msg); + + if (!(jcr=get_jcr_by_full_name(job_name))) { + Jmsg1(NULL, M_FATAL, 0, _("SD connect failed: Job name not found: %s\n"), job_name); + Dmsg1(3, "**** Job \"%s\" not found.\n", job_name); + sd->destroy(); + return NULL; + } + set_jcr_in_tsd(jcr); + Dmsg1(150, "Found Job %s\n", job_name); + + jcr->lock_auth(); + /* We already have a socket connected, just discard it */ + if (jcr->sd_calls_client_bsock) { + Qmsg1(jcr, M_WARNING, 0, _("SD \"%s\" tried to connect two times.\n"), sd->who()); + free_bsock(sd); + /* will exit just after the unlock() */ + + } else { + /* If we have a previous socket in store_bsock, we are in multi restore mode */ + jcr->sd_calls_client_bsock = sd; + sd->set_jcr(jcr); + } + jcr->unlock_auth(); + + if (!sd) { /* freed by free_bsock(), connection already done */ + free_jcr(jcr); + return NULL; + } + + if (!jcr->max_bandwidth) { + if (jcr->director->max_bandwidth_per_job) { + jcr->max_bandwidth = jcr->director->max_bandwidth_per_job; + + } else if (me->max_bandwidth_per_job) { + jcr->max_bandwidth = me->max_bandwidth_per_job; + } + } + sd->set_bwlimit(jcr->max_bandwidth); + + pthread_cond_signal(&jcr->job_start_wait); /* wake waiting job */ + free_jcr(jcr); + return NULL; +} + + +/* + * Send Hello OK to DIR + */ +bool send_hello_ok(BSOCK *bs) +{ + return bs->fsend(hello_dir, FD_VERSION); +} + +bool send_sorry(BSOCK *bs) +{ + return bs->fsend(sorry_dir); +} + +/* + * Send Hello to SD + */ +bool send_hello_sd(JCR *jcr, char *Job) +{ + bool rtn; + BSOCK *sd = jcr->store_bsock; + + bash_spaces(Job); + rtn = sd->fsend(hello_sd, Job, FD_VERSION); + unbash_spaces(Job); + Dmsg1(100, "Send to SD: %s\n", sd->msg); + return rtn; +} diff --git a/bacula/src/filed/job.c b/bacula/src/filed/job.c index de3c7989f6..1da24a655b 100644 --- a/bacula/src/filed/job.c +++ b/bacula/src/filed/job.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula File Daemon Job processing @@ -23,33 +27,29 @@ #include "bacula.h" #include "filed.h" #include "ch.h" -#ifdef WIN32_VSS -#include "vss.h" -static pthread_mutex_t vss_mutex = PTHREAD_MUTEX_INITIALIZER; -#endif /* Globals */ bool win32decomp = false; bool no_win32_write_errors = false; -static int enable_vss = 0; + +/* Static variables */ static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; -/* - * As Windows saves ACLs as part of the standard backup stream - * we just pretend here that is has implicit acl support. - */ -#if defined(HAVE_ACL) || defined(HAVE_WIN32) -const bool have_acl = true; -#else -const bool have_acl = false; -#endif -#if defined(HAVE_XATTR) -const bool have_xattr = true; -#else -const bool have_xattr = false; -#endif +const bool have_win32 = false; + +#ifdef HAVE_ACL +const bool have_acl = true; +#else +const bool have_acl = false; +#endif +#if HAVE_XATTR +const bool have_xattr = true; +#else +const bool have_xattr = false; +#endif + extern CLIENT *me; /* our client resource */ /* Imported functions */ @@ -59,6 +59,7 @@ extern int accurate_cmd(JCR *jcr); /* Forward referenced functions */ static int backup_cmd(JCR *jcr); +static int component_cmd(JCR *jcr); static int cancel_cmd(JCR *jcr); static int setdebug_cmd(JCR *jcr); static int setbandwidth_cmd(JCR *jcr); @@ -98,6 +99,7 @@ struct s_cmds cmds[] = { {"cancel", cancel_cmd, 0}, {"setdebug=", setdebug_cmd, 0}, {"setbandwidth=",setbandwidth_cmd, 0}, + {"snapshot", snapshot_cmd, 0}, {"estimate", estimate_cmd, 0}, {"Hello", hello_cmd, 1}, {"fileset", fileset_cmd, 0}, @@ -110,6 +112,7 @@ struct s_cmds cmds[] = { {".status", qstatus_cmd, 1}, {"storage ", storage_cmd, 0}, {"verify", verify_cmd, 0}, + {"component", component_cmd, 0}, {"RunBeforeNow", runbeforenow_cmd, 0}, {"RunBeforeJob", runbefore_cmd, 0}, {"RunAfterJob", runafter_cmd, 0}, @@ -117,6 +120,7 @@ struct s_cmds cmds[] = { {"accurate", accurate_cmd, 0}, {"restoreobject", restore_object_cmd, 0}, {"sm_dump", sm_dump_cmd, 0}, + {"stop", cancel_cmd, 0}, #ifdef DEVELOPER {"exit", exit_cmd, 0}, #endif @@ -168,16 +172,19 @@ static char OKsession[] = "2000 OK session\n"; static char OKstore[] = "2000 OK storage\n"; static char OKstoreend[] = "2000 OK storage end\n"; static char OKjob[] = "2000 OK Job %s (%s) %s,%s,%s"; -static char OKsetdebug[] = "2000 OK setdebug=%ld trace=%ld hangup=%ld options=%s tags=%s\n"; +static char OKsetdebug[] = "2000 OK setdebug=%ld trace=%ld hangup=%ld" + " blowup=%ld options=%s tags=%s\n"; static char BADjob[] = "2901 Bad Job\n"; static char EndJob[] = "2800 End Job TermCode=%d JobFiles=%d ReadBytes=%lld" - " JobBytes=%lld Errors=%d VSS=%d Encrypt=%d\n"; + " JobBytes=%lld Errors=%d VSS=%d Encrypt=%d" + " CommBytes=0 CompressCommBytes=0\n"; static char OKRunBefore[] = "2000 OK RunBefore\n"; static char OKRunBeforeNow[] = "2000 OK RunBeforeNow\n"; static char OKRunAfter[] = "2000 OK RunAfter\n"; static char OKRunScript[] = "2000 OK RunScript\n"; static char BADcmd[] = "2902 Bad %s\n"; static char OKRestoreObject[] = "2000 OK ObjectRestored\n"; +static char OKComponentInfo[] = "2000 OK ComponentInfo\n"; /* Responses received from Storage Daemon */ @@ -196,6 +203,7 @@ static char append_close[] = "append close session %d\n"; static char read_open[] = "read open session = %s %ld %ld %ld %ld %ld %ld\n"; static char read_data[] = "read data %d\n"; static char read_close[] = "read close session %d\n"; +static char read_ctrl[] = "read control %d\n"; /* * Accept requests from a Director @@ -225,8 +233,8 @@ static char read_close[] = "read close session %d\n"; * 4. FD connects to SD * 5. FD gets/runs ClientRunBeforeJob and sends ClientRunAfterJob * 6. Dir sends include/exclude - * 7. FD sends data to SD - * 8. SD/FD disconnects while SD despools data and attributes (optional) + * 7. FD sends the file data to SD + * 8. SD/FD disconnects while the SD despools data and attributes (optional) * 9. FD runs ClientRunAfterJob */ @@ -238,7 +246,9 @@ static void *handle_director_request(BSOCK *dir) JCR *jcr; const char jobname[12] = "*Director*"; + prevent_os_suspensions(); /* do not suspend during backup/restore */ jcr = new_jcr(sizeof(JCR), filed_free_jcr); /* create JCR */ + jcr->sd_calls_client_bsock = NULL; jcr->sd_calls_client = false; jcr->dir_bsock = dir; jcr->ff = init_find_files(); @@ -254,6 +264,7 @@ static void *handle_director_request(BSOCK *dir) jcr->crypto.pki_keypair = me->pki_keypair; jcr->crypto.pki_signers = me->pki_signers; jcr->crypto.pki_recipients = me->pki_recipients; + dir->set_jcr(jcr); /* Initialize SD start condition variable */ int errstat = pthread_cond_init(&jcr->job_start_wait, NULL); @@ -262,7 +273,6 @@ static void *handle_director_request(BSOCK *dir) Jmsg1(jcr, M_FATAL, 0, _("Unable to init job cond variable: ERR=%s\n"), be.bstrerror(errstat)); goto bail_out; } - enable_backup_privileges(NULL, 1 /* ignore_errors */); for (quit=false; !quit;) { @@ -325,11 +335,12 @@ static void *handle_director_request(BSOCK *dir) if (jcr->JobId) { /* send EndJob if running a job */ uint32_t vss, encrypt; + /* Send termination status back to Dir */ encrypt = jcr->crypto.pki_encrypt; - vss = jcr->VSS; + vss = jcr->Snapshot; dir->fsend(EndJob, jcr->JobStatus, jcr->JobFiles, jcr->ReadBytes, jcr->JobBytes, jcr->JobErrors, vss, - encrypt); + encrypt, 0, 0); //Dmsg0(0/*110*/, dir->msg); } @@ -414,6 +425,7 @@ bail_out: free(fileset); } ff->fileset = NULL; + ff->mount_points.destroy(); Dmsg0(100, "Calling term_find_files\n"); term_find_files(jcr->ff); jcr->ff = NULL; @@ -421,59 +433,12 @@ bail_out: pthread_cond_destroy(&jcr->job_start_wait); free_jcr(jcr); /* destroy JCR record */ Dmsg0(100, "Done with free_jcr\n"); + allow_os_suspensions(); /* FD can now be suspended */ Dsm_check(100); garbage_collect_memory_pool(); return NULL; } -/* - * Note, we handle the initial connection request here. - * We only get the jobname and the SD version, then we - * return, authentication will be done when the Director - * sends the storage command -- as is usually the case. - * This should be called only once by the SD. - */ -static void *handle_storage_request(BSOCK *sd) -{ - char job_name[500]; - char tbuf[150]; - int sd_version; - JCR *jcr; - - if (sscanf(sd->msg, "Hello FD: Bacula Storage calling Start Job %127s %d\n", - job_name, &sd_version) != 2) { - Jmsg(NULL, M_FATAL, 0, _("SD connect failed: Bad Hello command\n")); - return NULL; - } - Dmsg1(110, "Got a SD connection at %s\n", bstrftimes(tbuf, sizeof(tbuf), - (utime_t)time(NULL))); - Dmsg1(50, "%s", sd->msg); - - if (!(jcr=get_jcr_by_full_name(job_name))) { - Jmsg1(NULL, M_FATAL, 0, _("SD connect failed: Job name not found: %s\n"), job_name); - Dmsg1(3, "**** Job \"%s\" not found.\n", job_name); - sd->destroy(); - return NULL; - } - - Dmsg1(150, "Found Job %s\n", job_name); - - jcr->store_bsock = sd; - jcr->store_bsock->set_jcr(jcr); - - if (!jcr->max_bandwidth) { - if (jcr->director->max_bandwidth_per_job) { - jcr->max_bandwidth = jcr->director->max_bandwidth_per_job; - - } else if (me->max_bandwidth_per_job) { - jcr->max_bandwidth = me->max_bandwidth_per_job; - } - } - sd->set_bwlimit(jcr->max_bandwidth); - pthread_cond_signal(&jcr->job_start_wait); /* wake waiting job */ - free_jcr(jcr); - return NULL; -} /* * Accept requests from a Director or a Storage daemon @@ -496,7 +461,7 @@ void *handle_connection_request(void *caller) return handle_director_request(bs); } if (strncmp(bs->msg, "Hello FD: Bacula Storage", 20) ==0) { - return handle_storage_request(bs); + return handle_storage_connection(bs); } } bail_out: @@ -533,6 +498,9 @@ static int exit_cmd(JCR *jcr) static int hello_cmd(JCR *jcr) { Dmsg0(120, "Calling Authenticate\n"); + if (!validate_dir_hello(jcr)) { + return 0; + } if (!authenticate_director(jcr)) { return 0; } @@ -556,6 +524,9 @@ static int cancel_cmd(JCR *jcr) if (sscanf(dir->msg, "cancel Job=%127s", Job) == 1) { status = JS_Canceled; reason = "canceled"; + } else if (sscanf(dir->msg, "stop Job=%127s", Job) == 1) { + status = JS_Incomplete; + reason = "stopped"; } else { dir->fsend(_("2902 Error scanning cancel command.\n")); goto bail_out; @@ -630,17 +601,20 @@ static int setbandwidth_cmd(JCR *jcr) static int setdebug_cmd(JCR *jcr) { BSOCK *dir = jcr->dir_bsock; - int32_t trace, hangup, lvl; - int64_t level; + int32_t trace, lvl; + int32_t hangup = -1; + int32_t blowup = -1; + int64_t level, level_tags = 0; int scan; char options[60]; char tags[512]; Dmsg1(50, "setdebug_cmd: %s", dir->msg); tags[0] = options[0] = 0; - scan = sscanf(dir->msg, "setdebug=%ld trace=%ld hangup=%ld options=%55s tags=%511s", - &lvl, &trace, &hangup, options, tags); - if (scan != 5) { + scan = sscanf(dir->msg, "setdebug=%ld trace=%ld hangup=%ld blowup=%ld" + " options=%55s tags=%511s", + &lvl, &trace, &hangup, &blowup, options, tags); + if (scan != 6) { scan = sscanf(dir->msg, "setdebug=%ld trace=%ld hangup=%ld", &lvl, &trace, &hangup); if (scan != 3) { @@ -657,19 +631,22 @@ static int setdebug_cmd(JCR *jcr) level = lvl; set_trace(trace); set_hangup(hangup); - if (!debug_parse_tags(tags, &level)) { + set_blowup(blowup); + if (!debug_parse_tags(tags, &level_tags)) { *tags = 0; } if (level >= 0) { debug_level = level; } + debug_level_tags = level_tags; /* handle other options */ set_debug_flags(options); - Dmsg5(150, "level=%ld trace=%ld hangup=%ld options=%s tags=%s\n", - lvl, get_trace(), get_hangup(), options, tags); - return dir->fsend(OKsetdebug, lvl, get_trace(), get_hangup(), options, tags); + Dmsg6(150, "level=%ld trace=%ld hangup=%ld blowup=%d options=%s tags=%s\n", + lvl, get_trace(), get_hangup(), get_blowup(), options, tags); + return dir->fsend(OKsetdebug, lvl, get_trace(), get_hangup(), + get_blowup(), options, tags); } @@ -708,6 +685,7 @@ static int job_cmd(JCR *jcr) dir->fsend(BADjob); return 0; } + set_jcr_in_tsd(jcr); set_storage_auth_key(jcr, sd_auth_key.c_str()); Dmsg2(120, "JobId=%d Auth=%s\n", jcr->JobId, jcr->sd_auth_key); Mmsg(jcr->errmsg, "JobId=%d Job=%s", jcr->JobId, jcr->Job); @@ -974,6 +952,7 @@ static bool init_fileset(JCR *jcr) return true; } + static void append_file(JCR *jcr, findINCEXE *incexe, const char *buf, bool is_file) { @@ -991,7 +970,7 @@ static void append_file(JCR *jcr, findINCEXE *incexe, } } -/* +/** * Add fname to include/exclude fileset list. First check for * | and < and if necessary perform command. */ @@ -1466,6 +1445,8 @@ static int set_options(findFOPTS *fo, const char *opts) const char *p; char strip[100]; +// Commented out as it is not backward compatible - KES + for (p=opts; *p; p++) { switch (*p) { case 'a': /* alway replace */ @@ -1633,11 +1614,8 @@ static int fileset_cmd(JCR *jcr) POOL_MEM buf(PM_MESSAGE); BSOCK *dir = jcr->dir_bsock; int rtnstat; - int vss = 0; - - sscanf(dir->msg, "fileset vss=%d", &vss); - enable_vss = vss; + jcr->Snapshot = (strstr(dir->msg, "snap=1") != NULL); if (!init_fileset(jcr)) { return 0; } @@ -1656,6 +1634,21 @@ static int fileset_cmd(JCR *jcr) } +/* + * The Director sends us the component info file, which + * we will in turn pass to the VSS plugin. + */ +static int component_cmd(JCR *jcr) +{ + BSOCK *dir = jcr->dir_bsock; + + while (dir->recv() >= 0) { + Dmsg1(200, "filedmsg); + generate_plugin_event(jcr, bEventComponentInfo, (void *)dir->msg); + } + return dir->fsend(OKComponentInfo); +} + /** * Get backup level from Director @@ -1705,7 +1698,7 @@ static int level_cmd(JCR *jcr) } else if (strcasecmp(level, "since_utime") == 0) { buf = get_memory(dir->msglen+1); utime_t since_time, adj; - btime_t his_time, bt_start, rt=0, bt_adj=0; + btime_t his_time, bt_start, rt=0, bt_adj=0, his_time_prev=0, n=0; if (jcr->getJobLevel() == L_NONE) { jcr->setJobLevel(L_SINCE); /* if no other job level set, do it now */ } @@ -1732,21 +1725,28 @@ static int level_cmd(JCR *jcr) if (sscanf(dir->msg, "btime %s", buf) != 1) { goto bail_out; } - if (i < 2) { /* toss first two results */ - continue; - } his_time = str_to_uint64(buf); rt = get_current_btime() - bt_start; /* compute round trip time */ + /* skip first two results and check for leap second */ + /* if any of the FD or DIR went back in time, skip this iteration */ + if (i < 2 || (his_time_prev > 0 && his_time < his_time_prev) || rt<0) { + his_time_prev = his_time; + continue; + } + his_time_prev = his_time; + n++; Dmsg2(100, "Dirtime=%s FDtime=%s\n", edit_uint64(his_time, ed1), edit_uint64(bt_start, ed2)); bt_adj += bt_start - his_time - rt/2; Dmsg2(100, "rt=%s adj=%s\n", edit_uint64(rt, ed1), edit_uint64(bt_adj, ed2)); } - - bt_adj = bt_adj / 8; /* compute average time */ - Dmsg2(100, "rt=%s adj=%s\n", edit_uint64(rt, ed1), edit_uint64(bt_adj, ed2)); - adj = btime_to_utime(bt_adj); - since_time += adj; /* adjust for clock difference */ + adj = 0; + if (n > 0) { /* Should be 1 in the worst case */ + bt_adj = bt_adj / n; /* compute average time */ + Dmsg2(100, "rt=%s adj=%s\n", edit_uint64(rt, ed1), edit_uint64(bt_adj, ed2)); + adj = btime_to_utime(bt_adj); + since_time += adj; /* adjust for clock difference */ + } /* Don't notify if time within 3 seconds */ if (adj > 3 || adj < -3) { int type; @@ -1817,10 +1817,7 @@ static void set_storage_auth_key(JCR *jcr, char *key) * We can be contacting multiple storage daemons. * So, make sure that any old jcr->store_bsock is cleaned up. */ - if (jcr->store_bsock) { - jcr->store_bsock->destroy(); - jcr->store_bsock = NULL; - } + free_bsock(jcr->store_bsock); /** * We can be contacting multiple storage daemons. @@ -1877,10 +1874,10 @@ static int storage_cmd(JCR *jcr) } } - if (stored_port != 0) { - jcr->sd_calls_client = false; /* We are doing the connecting */ + if (stored_port != 0) { /* We are doing the connecting */ Dmsg3(110, "Connect to storage: %s:%d ssl=%d\n", jcr->stored_addr, stored_port, enable_ssl); + jcr->sd_calls_client = false; sd = new_bsock(); /* Open command communications with Storage daemon */ /* Try to connect for 1 hour at 10 second intervals */ @@ -1904,7 +1901,9 @@ static int storage_cmd(JCR *jcr) struct timespec timeout; int errstat; + free_bsock(jcr->store_bsock); jcr->sd_calls_client = true; + /* * Wait for the Storage daemon to contact us to start the Job, * when he does, we will be released, unless the 30 minutes @@ -1914,7 +1913,7 @@ static int storage_cmd(JCR *jcr) timeout.tv_nsec = tv.tv_usec * 1000; timeout.tv_sec = tv.tv_sec + 30 * 60; /* wait 30 minutes */ P(mutex); - while (jcr->store_bsock == NULL && !jcr->is_job_canceled()) { + while (jcr->sd_calls_client_bsock == NULL && !jcr->is_job_canceled()) { errstat = pthread_cond_timedwait(&jcr->job_start_wait, &mutex, &timeout); if (errstat == ETIMEDOUT || errstat == EINVAL || errstat == EPERM) { break; @@ -1925,7 +1924,7 @@ static int storage_cmd(JCR *jcr) Dmsg2(800, "Auth fail or cancel for jid=%d %p\n", jcr->JobId, jcr); /* We should already have a storage connection! */ - if (jcr->store_bsock == NULL) { + if (jcr->sd_calls_client_bsock == NULL) { Pmsg0(000, "Failed connect from Storage daemon. SD bsock=NULL.\n"); Pmsg1(000, "Storagecmd: %s", dir->msg); Jmsg0(jcr, M_FATAL, 0, _("Failed connect from Storage daemon. SD bsock=NULL.\n")); @@ -1934,9 +1933,18 @@ static int storage_cmd(JCR *jcr) if (jcr->is_job_canceled()) { goto bail_out; } + /* Assign the new socket to the main one */ + jcr->lock_auth(); + jcr->store_bsock = jcr->sd_calls_client_bsock; + jcr->sd_calls_client_bsock = NULL; + jcr->unlock_auth(); } jcr->store_bsock->set_bwlimit(jcr->max_bandwidth); + if (!send_hello_sd(jcr, jcr->Job)) { + goto bail_out; + } + if (!authenticate_storagedaemon(jcr)) { goto bail_out; } @@ -1969,22 +1977,20 @@ static int backup_cmd(JCR *jcr) } /* - * Validate some options given to the backup make sense for the compiled in - * options of this filed. - */ - if (jcr->ff->flags & FO_ACL && !have_acl) { - Jmsg(jcr, M_FATAL, 0, _("ACL support not configured for your machine.\n")); - goto cleanup; - } - if (jcr->ff->flags & FO_XATTR && !have_xattr) { - Jmsg(jcr, M_FATAL, 0, _("XATTR support not configured for your machine.\n")); - goto cleanup; - } - + * If explicitly requesting FO_ACL or FO_XATTR, fail job if it + * is not available on Client machine + */ + if (jcr->ff->flags & FO_ACL && !(have_acl||have_win32)) { + Jmsg(jcr, M_FATAL, 0, _("ACL support not configured for Client.\n")); + goto cleanup; + } + if (jcr->ff->flags & FO_XATTR && !have_xattr) { + Jmsg(jcr, M_FATAL, 0, _("XATTR support not configured for Client.\n")); + goto cleanup; + } jcr->setJobStatus(JS_Blocked); jcr->setJobType(JT_BACKUP); Dmsg1(100, "begin backup ff=%p\n", jcr->ff); - if (sd == NULL) { Jmsg(jcr, M_FATAL, 0, _("Cannot contact Storage daemon\n")); dir->fsend(BADcmd, "backup"); @@ -2031,7 +2037,16 @@ static int backup_cmd(JCR *jcr) generate_daemon_event(jcr, "JobStart"); generate_plugin_event(jcr, bEventStartBackupJob); - /* + if (jcr->Snapshot) { + Dmsg0(10, "Open a snapshot session\n"); + /* TODO: See if we abort the job */ + jcr->Snapshot = open_snapshot_backup_session(jcr); + } + /* Call RunScript just after the Snapshot creation, usually, we restart services */ + run_scripts(jcr, jcr->RunScripts, "ClientAfterVSS"); + + + /** * Send Files to Storage daemon */ Dmsg1(110, "begin blast ff=%p\n", (FF_PKT *)jcr->ff); @@ -2068,23 +2083,29 @@ static int backup_cmd(JCR *jcr) * Send Append Close to Storage daemon */ sd->fsend(append_close, jcr->Ticket); + sd->msg[0] = 0; while (bget_msg(sd) >= 0) { /* stop on signal or error */ if (sscanf(sd->msg, OK_close, &SDJobStatus) == 1) { ok = 1; Dmsg2(200, "SDJobStatus = %d %c\n", SDJobStatus, (char)SDJobStatus); + } else { + Dmsg1(100, "append_close: scan fail from %s\n", sd->msg); } } if (!ok) { Jmsg(jcr, M_FATAL, 0, _("Append Close with SD failed.\n")); + Dmsg1(100, "append_close: scan fail from %s\n", sd->msg); goto cleanup; } - if (!(SDJobStatus == JS_Terminated || SDJobStatus == JS_Warnings)) { + if (!(SDJobStatus == JS_Terminated || SDJobStatus == JS_Warnings || + SDJobStatus == JS_Incomplete)) { Jmsg(jcr, M_FATAL, 0, _("Bad status %d %c returned from Storage Daemon.\n"), SDJobStatus, (char)SDJobStatus); } } cleanup: + generate_plugin_event(jcr, bEventEndBackupJob); return 0; /* return and stop command loop */ } @@ -2304,7 +2325,6 @@ static int restore_cmd(JCR *jcr) /* Inform Storage daemon that we are done */ sd->signal(BNET_TERMINATE); - bail_out: bfree_and_null(jcr->where); @@ -2379,6 +2399,14 @@ static int open_sd_read_session(JCR *jcr) return 0; } + /* + * Use interactive session for the current restore + */ + if (jcr->interactive_session) { + sd->fsend(read_ctrl, jcr->Ticket); + Dmsg1(110, ">stored: %s", sd->msg); + } + /* * Start read of data with Storage daemon */ @@ -2400,8 +2428,18 @@ static int open_sd_read_session(JCR *jcr) */ static void filed_free_jcr(JCR *jcr) { - free_bsock(jcr->dir_bsock); - free_bsock(jcr->store_bsock); + if (jcr->dir_bsock) { + free_bsock(jcr->dir_bsock); + jcr->dir_bsock = NULL; + } + if (jcr->sd_calls_client_bsock) { + free_bsock(jcr->sd_calls_client_bsock); + jcr->sd_calls_client_bsock = NULL; + } + if (jcr->store_bsock) { + free_bsock(jcr->store_bsock); + jcr->store_bsock = NULL; + } if (jcr->last_fname) { free_pool_memory(jcr->last_fname); } @@ -2440,8 +2478,9 @@ int response(JCR *jcr, BSOCK *sd, char *resp, const char *cmd) Jmsg2(jcr, M_FATAL, 0, _("Comm error with SD. bad response to %s. ERR=%s\n"), cmd, sd->bstrerror()); } else { - Jmsg3(jcr, M_FATAL, 0, _("Bad response from SD to %s command. Wanted %s, got %s\n"), - cmd, resp, sd->msg); + char buf[256]; + Jmsg4(jcr, M_FATAL, 0, _("Bad response from SD to %s command. Wanted %s, got len=%ld msg=\"%s\"\n"), + cmd, resp, sd->msglen, smartdump(sd->msg, sd->msglen, buf, sizeof(buf))); } return 0; } diff --git a/bacula/src/filed/protos.h b/bacula/src/filed/protos.h index ac9863a9d6..96a836c95a 100644 --- a/bacula/src/filed/protos.h +++ b/bacula/src/filed/protos.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Written by Kern Sibbald, MM @@ -21,10 +25,21 @@ extern bool blast_data_to_storage_daemon(JCR *jcr, char *addr); extern void do_verify_volume(JCR *jcr); extern void do_restore(JCR *jcr); -extern int authenticate_director(JCR *jcr); -extern int authenticate_storagedaemon(JCR *jcr); extern int make_estimate(JCR *jcr); +/* From authenticate.c */ +bool authenticate_director(JCR *jcr); +bool authenticate_storagedaemon(JCR *jcr); + +/* From hello.c */ +bool validate_dir_hello(JCR *jcr); +bool send_hello_ok(BSOCK *bs); +bool send_sorry(BSOCK *bs); +bool send_hello_sd(JCR *jcr, char *Job); +void *handle_storage_connection(BSOCK *sd); +bool send_fdcaps(JCR *jcr); +bool recv_sdcaps(JCR *jcr); + /* From verify.c */ int digest_file(JCR *jcr, FF_PKT *ff_pkt, DIGEST *digest); void do_verify(JCR *jcr); @@ -36,8 +51,9 @@ void start_dir_heartbeat(JCR *jcr); void stop_dir_heartbeat(JCR *jcr); /* From acl.c */ -bacl_exit_code build_acl_streams(JCR *jcr, FF_PKT *ff_pkt); -bacl_exit_code parse_acl_streams(JCR *jcr, int stream, char *content, uint32_t content_length); +bool backup_acl_streams(JCR *jcr, FF_PKT *ff_pkt); +bacl_rtn_code restore_acl_streams(JCR *jcr, int stream, char *content, + uint32_t content_length); /* from accurate.c */ bool accurate_finish(JCR *jcr); @@ -46,13 +62,13 @@ bool accurate_mark_file_as_seen(JCR *jcr, char *fname); void accurate_free(JCR *jcr); /* from backup.c */ -bool encode_and_send_attributes(JCR *jcr, FF_PKT *ff_pkt, int &data_stream); void strip_path(FF_PKT *ff_pkt); void unstrip_path(FF_PKT *ff_pkt); /* from xattr.c */ -bxattr_exit_code build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt); -bxattr_exit_code parse_xattr_streams(JCR *jcr, int stream, char *content, uint32_t content_length); +bool backup_xattr_streams(JCR *jcr, FF_PKT *ff_pkt); +bxattr_rtn_code restore_xattr_streams(JCR *jcr, int stream, + char *content, uint32_t content_length); /* from job.c */ findINCEXE *new_exclude(JCR *jcr); @@ -65,3 +81,6 @@ int add_options_to_fileset(JCR *jcr, const char *item); int add_wild_to_fileset(JCR *jcr, const char *item, int type); int add_regex_to_fileset(JCR *jcr, const char *item, int type); findINCEXE *new_include(JCR *jcr); + +/* from snapshot.c */ +int snapshot_cmd(JCR *jcr); diff --git a/bacula/src/filed/restore.c b/bacula/src/filed/restore.c index 4aa4898638..24580bd88a 100644 --- a/bacula/src/filed/restore.c +++ b/bacula/src/filed/restore.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula File Daemon restore.c Restorefiles. @@ -56,14 +60,10 @@ const bool have_xattr = true; const bool have_xattr = false; #endif -/* - * Data received from Storage Daemon - */ +/* Data received from Storage Daemon */ static char rec_header[] = "rechdr %ld %ld %ld %ld %ld"; -/* - * Forward referenced functions - */ +/* Forward referenced functions */ #if defined(HAVE_LIBZ) static const char *zlib_strerror(int stat); const bool have_libz = true; @@ -78,26 +78,26 @@ const bool have_lzo = false; static void deallocate_cipher(r_ctx &rctx); static void deallocate_fork_cipher(r_ctx &rctx); +static bool verify_signature(r_ctx &rctx); static void free_signature(r_ctx &rctx); static void free_session(r_ctx &rctx); -static bool close_previous_stream(JCR *jcr, r_ctx &rctx); -static bool verify_signature(JCR *jcr, r_ctx &rctx); -int32_t extract_data(JCR *jcr, BFILE *bfd, POOLMEM *buf, int32_t buflen, - uint64_t *addr, int flags, int32_t stream, RESTORE_CIPHER_CTX *cipher_ctx); -bool flush_cipher(JCR *jcr, BFILE *bfd, uint64_t *addr, int flags, int32_t stream, +static bool close_previous_stream(r_ctx &rctx); +static int32_t extract_data(r_ctx &rctx, POOLMEM *buf, int32_t buflen); +static bool flush_cipher(r_ctx &rctx, BFILE *bfd, uint64_t *addr, int flags, int32_t stream, RESTORE_CIPHER_CTX *cipher_ctx); /* * Close a bfd check that we are at the expected file offset. * Makes use of some code from set_attributes(). */ -static int bclose_chksize(JCR *jcr, BFILE *bfd, boffset_t osize) +static int bclose_chksize(r_ctx &rctx, BFILE *bfd, boffset_t osize) { char ec1[50], ec2[50]; boffset_t fsize; + JCR *jcr = rctx.jcr; fsize = blseek(bfd, 0, SEEK_CUR); - bclose(bfd); + bclose(bfd); /* first close file */ if (fsize > 0 && fsize != osize) { Qmsg3(jcr, M_WARNING, 0, _("Size of data or stream of %s not correct. Original %s, restored %s.\n"), jcr->last_fname, edit_uint64(osize, ec1), @@ -119,65 +119,76 @@ static bool restore_finderinfo(JCR *jcr, POOLMEM *buf, int32_t buflen) Dmsg0(130, "Restoring Finder Info\n"); jcr->ff->flags |= FO_HFSPLUS; if (buflen != 32) { - Jmsg(jcr, M_WARNING, 0, _("Invalid length of Finder Info (got %d, not 32)\n"), buflen); + Jmsg(jcr, M_WARNING, 0, _("Invalid length of Finder Info (got %d, wanted 32)\n"), buflen); return false; } if (setattrlist(jcr->last_fname, &attrList, buf, buflen, 0) != 0) { - Jmsg(jcr, M_WARNING, 0, _("Could not set Finder Info on %s\n"), jcr->last_fname); + Jmsg(jcr, M_WARNING, 0, _("Error setting Finder Info on \"%s\"\n"), jcr->last_fname); return false; } return true; } #else + static bool restore_finderinfo(JCR *jcr, POOLMEM *buf, int32_t buflen) { return true; } + #endif /* - * Cleanup of delayed restore stack with streams for later - * processing. - */ -static inline void drop_delayed_restore_streams(r_ctx &rctx, bool reuse) + * Cleanup of delayed restore stack with streams for later processing. + */ +static void drop_delayed_restore_streams(r_ctx &rctx, bool reuse) { RESTORE_DATA_STREAM *rds; - if (!rctx.delayed_streams || - rctx.delayed_streams->empty()) { + if (!rctx.delayed_streams) { + if (reuse) { + rctx.delayed_streams = New(alist(10, owned_by_alist)); + } + return; + } + if (rctx.delayed_streams->empty()) { return; } foreach_alist(rds, rctx.delayed_streams) { - free(rds->content); + if (rds->content) { + free(rds->content); + rds->content = NULL; + } } - rctx.delayed_streams->destroy(); if (reuse) { rctx.delayed_streams->init(10, owned_by_alist); } } + /* * Push a data stream onto the delayed restore stack for * later processing. */ -static inline void push_delayed_restore_stream(r_ctx &rctx, BSOCK *sd) +static inline void push_delayed_restore_stream(r_ctx &rctx, char *msg, int msglen) { RESTORE_DATA_STREAM *rds; + if (msglen <= 0) { + return; + } if (!rctx.delayed_streams) { rctx.delayed_streams = New(alist(10, owned_by_alist)); } rds = (RESTORE_DATA_STREAM *)malloc(sizeof(RESTORE_DATA_STREAM)); rds->stream = rctx.stream; - rds->content = (char *)malloc(sd->msglen); - memcpy(rds->content, sd->msg, sd->msglen); - rds->content_length = sd->msglen; - + rds->content = (char *)malloc(msglen); + memcpy(rds->content, msg, msglen); + rds->content_length = msglen; rctx.delayed_streams->append(rds); } @@ -185,26 +196,23 @@ static inline void push_delayed_restore_stream(r_ctx &rctx, BSOCK *sd) * Perform a restore of an ACL using the stream received. * This can either be a delayed restore or direct restore. */ -static inline bool do_restore_acl(JCR *jcr, - int stream, - char *content, - uint32_t content_length) - +static inline bool do_restore_acl(JCR *jcr, int stream, char *content, + uint32_t content_length) { - switch (parse_acl_streams(jcr, stream, content, content_length)) { - case bacl_exit_fatal: + switch (restore_acl_streams(jcr, stream, content, content_length)) { + case bacl_rtn_fatal: return false; - case bacl_exit_error: + case bacl_rtn_error: /* - * Non-fatal errors, count them and when the number is under ACL_REPORT_ERR_MAX_PER_JOB + * Non-fatal errors, count them and when the number is under ACL_MAX_ERROR_PRINT_PER_JOB * print the error message set by the lower level routine in jcr->errmsg. */ - if (jcr->acl_data->u.parse->nr_errors < ACL_REPORT_ERR_MAX_PER_JOB) { + if (jcr->acl_ctx->nr_errors < ACL_MAX_ERROR_PRINT_PER_JOB) { Jmsg(jcr, M_WARNING, 0, "%s", jcr->errmsg); } - jcr->acl_data->u.parse->nr_errors++; + jcr->acl_ctx->nr_errors++; break; - case bacl_exit_ok: + case bacl_rtn_ok: break; } return true; @@ -214,25 +222,23 @@ static inline bool do_restore_acl(JCR *jcr, * Perform a restore of an XATTR using the stream received. * This can either be a delayed restore or direct restore. */ -static inline bool do_restore_xattr(JCR *jcr, - int stream, - char *content, - uint32_t content_length) +static inline bool do_restore_xattr(JCR *jcr, int stream, char *content, + uint32_t content_length) { - switch (parse_xattr_streams(jcr, stream, content, content_length)) { - case bxattr_exit_fatal: + switch (restore_xattr_streams(jcr, stream, content, content_length)) { + case bxattr_rtn_fatal: return false; - case bxattr_exit_error: + case bxattr_rtn_error: /* - * Non-fatal errors, count them and when the number is under XATTR_REPORT_ERR_MAX_PER_JOB + * Non-fatal errors, count them and when the number is under XATTR_MAX_ERROR_PRINT_PER_JOB * print the error message set by the lower level routine in jcr->errmsg. */ - if (jcr->xattr_data->u.parse->nr_errors < XATTR_REPORT_ERR_MAX_PER_JOB) { + if (jcr->xattr_ctx->nr_errors < XATTR_MAX_ERROR_PRINT_PER_JOB) { Jmsg(jcr, M_WARNING, 0, "%s", jcr->errmsg); } - jcr->xattr_data->u.parse->nr_errors++; + jcr->xattr_ctx->nr_errors++; break; - case bxattr_exit_ok: + case bxattr_rtn_ok: break; } return true; @@ -245,9 +251,10 @@ static inline bool do_restore_xattr(JCR *jcr, * attributes otherwise we might clear some security flags * by setting the attributes. */ -static inline bool pop_delayed_data_streams(JCR *jcr, r_ctx &rctx) +static inline bool pop_delayed_data_streams(r_ctx &rctx) { RESTORE_DATA_STREAM *rds; + JCR *jcr = rctx.jcr; /* * See if there is anything todo. @@ -273,29 +280,28 @@ static inline bool pop_delayed_data_streams(JCR *jcr, r_ctx &rctx) case STREAM_UNIX_ACCESS_ACL: case STREAM_UNIX_DEFAULT_ACL: case STREAM_ACL_AIX_TEXT: - case STREAM_ACL_DARWIN_ACCESS_ACL: - case STREAM_ACL_FREEBSD_DEFAULT_ACL: - case STREAM_ACL_FREEBSD_ACCESS_ACL: + case STREAM_ACL_DARWIN_ACCESS: + case STREAM_ACL_FREEBSD_DEFAULT: + case STREAM_ACL_FREEBSD_ACCESS: case STREAM_ACL_HPUX_ACL_ENTRY: - case STREAM_ACL_IRIX_DEFAULT_ACL: - case STREAM_ACL_IRIX_ACCESS_ACL: - case STREAM_ACL_LINUX_DEFAULT_ACL: - case STREAM_ACL_LINUX_ACCESS_ACL: - case STREAM_ACL_TRU64_DEFAULT_ACL: - case STREAM_ACL_TRU64_DEFAULT_DIR_ACL: - case STREAM_ACL_TRU64_ACCESS_ACL: - case STREAM_ACL_SOLARIS_ACLENT: - case STREAM_ACL_SOLARIS_ACE: + case STREAM_ACL_IRIX_DEFAULT: + case STREAM_ACL_IRIX_ACCESS: + case STREAM_ACL_LINUX_DEFAULT: + case STREAM_ACL_LINUX_ACCESS: + case STREAM_ACL_TRU64_DEFAULT: + case STREAM_ACL_TRU64_DEFAULT_DIR: + case STREAM_ACL_TRU64_ACCESS: + case STREAM_ACL_SOLARIS_POSIX: + case STREAM_ACL_SOLARIS_NFS4: case STREAM_ACL_AFS_TEXT: case STREAM_ACL_AIX_AIXC: case STREAM_ACL_AIX_NFS4: - case STREAM_ACL_FREEBSD_NFS4_ACL: - case STREAM_ACL_HURD_DEFAULT_ACL: - case STREAM_ACL_HURD_ACCESS_ACL: + case STREAM_ACL_FREEBSD_NFS4: + case STREAM_ACL_HURD_DEFAULT: + case STREAM_ACL_HURD_ACCESS: if (!do_restore_acl(jcr, rds->stream, rds->content, rds->content_length)) { - goto bail_out; + goto get_out; } - free(rds->content); break; case STREAM_XATTR_HURD: case STREAM_XATTR_IRIX: @@ -308,39 +314,29 @@ static inline bool pop_delayed_data_streams(JCR *jcr, r_ctx &rctx) case STREAM_XATTR_LINUX: case STREAM_XATTR_NETBSD: if (!do_restore_xattr(jcr, rds->stream, rds->content, rds->content_length)) { - goto bail_out; + goto get_out; } - free(rds->content); break; default: Jmsg(jcr, M_WARNING, 0, _("Unknown stream=%d ignored. This shouldn't happen!\n"), rds->stream); break; } + if (rds->content) { + free(rds->content); + rds->content = NULL; + } } - - /* - * We processed the stack so we can destroy it. - */ - rctx.delayed_streams->destroy(); - - /* - * (Re)Initialize the stack for a new use. - */ - rctx.delayed_streams->init(10, owned_by_alist); - + + drop_delayed_restore_streams(rctx, true); return true; -bail_out: - - /* - * Destroy the content of the stack and (re)initialize it for a new use. - */ +get_out: drop_delayed_restore_streams(rctx, true); - return false; } + /* * Restore the requested files. */ @@ -349,10 +345,10 @@ void do_restore(JCR *jcr) BSOCK *sd; uint32_t VolSessionId, VolSessionTime; int32_t file_index; - char ec1[50]; /* Buffer printing huge values */ - uint32_t buf_size; /* client buffer size */ + char ec1[50]; /* Buffer printing huge values */ + uint32_t buf_size; /* client buffer size */ int stat; - int64_t rsrc_len = 0; /* Original length of resource fork */ + int64_t rsrc_len = 0; /* Original length of resource fork */ r_ctx rctx; ATTR *attr; /* ***FIXME*** make configurable */ @@ -361,17 +357,15 @@ void do_restore(JCR *jcr) memset(&rctx, 0, sizeof(rctx)); rctx.jcr = jcr; - /* - * The following variables keep track of "known unknowns" - */ - int non_support_data = 0; - int non_support_attr = 0; - int non_support_rsrc = 0; - int non_support_finfo = 0; - int non_support_acl = 0; - int non_support_progname = 0; - int non_support_crypto = 0; - int non_support_xattr = 0; + /* The following variables keep track of "known unknowns" */ + int non_suppored_data = 0; + int non_suppored_attr = 0; + int non_suppored_rsrc = 0; + int non_suppored_finfo = 0; + int non_suppored_acl = 0; + int non_suppored_progname = 0; + int non_suppored_crypto = 0; + int non_suppored_xattr = 0; sd = jcr->store_bsock; jcr->setJobStatus(JS_Running); @@ -390,10 +384,6 @@ void do_restore(JCR *jcr) } jcr->buf_size = sd->msglen; - /* - * St Bernard code goes here if implemented -- see end of file - */ - /* use the same buffer size to decompress both gzip and lzo */ if (have_libz || have_lzo) { uint32_t compress_buf_size = jcr->buf_size + 12 + ((jcr->buf_size+999) / 1000) + 100; @@ -401,10 +391,17 @@ void do_restore(JCR *jcr) jcr->compress_buf_size = compress_buf_size; } + + GetMsg *fdmsg; + fdmsg = New(GetMsg(jcr, sd, rec_header, GETMSG_MAX_MSG_SIZE)); + + fdmsg->start_read_sock(); + bmessage *bmsg = fdmsg->new_msg(); /* get a message, to exchange with fdmsg */ + #ifdef HAVE_LZO if (lzo_init() != LZO_E_OK) { Jmsg(jcr, M_FATAL, 0, _("LZO init failed\n")); - goto bail_out; + goto get_out; } #endif @@ -420,7 +417,7 @@ void do_restore(JCR *jcr) * receive records in the following order: * 1. Stream record header * 2. Stream data (one or more of the following in the order given) - * a. Attributes (Unix or Win32) + * a. Attributes (Unix or Windows) * b. Possibly stream encryption session data (e.g., symmetric session key) * c. File data for the file * d. Alternate data stream (e.g. Resource Fork) @@ -448,80 +445,62 @@ void do_restore(JCR *jcr) binit(&rctx.forkbfd); attr = rctx.attr = new_attr(jcr); if (have_acl) { - jcr->acl_data = (acl_data_t *)malloc(sizeof(acl_data_t)); - memset(jcr->acl_data, 0, sizeof(acl_data_t)); - jcr->acl_data->u.parse = (acl_parse_data_t *)malloc(sizeof(acl_parse_data_t)); - memset(jcr->acl_data->u.parse, 0, sizeof(acl_parse_data_t)); + jcr->acl_ctx = (acl_ctx_t *)malloc(sizeof(acl_ctx_t)); + memset(jcr->acl_ctx, 0, sizeof(acl_ctx_t)); } if (have_xattr) { - jcr->xattr_data = (xattr_data_t *)malloc(sizeof(xattr_data_t)); - memset(jcr->xattr_data, 0, sizeof(xattr_data_t)); - jcr->xattr_data->u.parse = (xattr_parse_data_t *)malloc(sizeof(xattr_parse_data_t)); - memset(jcr->xattr_data->u.parse, 0, sizeof(xattr_parse_data_t)); + jcr->xattr_ctx = (xattr_ctx_t *)malloc(sizeof(xattr_ctx_t)); + memset(jcr->xattr_ctx, 0, sizeof(xattr_ctx_t)); } - while (bget_msg(sd) >= 0 && !job_canceled(jcr)) { - /* - * Remember previous stream type - */ + Dsm_check(200); + while (fdmsg->bget_msg(&bmsg) >= 0 && !job_canceled(jcr)) { + /* Remember previous stream type */ rctx.prev_stream = rctx.stream; - /* - * First we expect a Stream Record Header - */ - if (sscanf(sd->msg, rec_header, &VolSessionId, &VolSessionTime, &file_index, + /* First we expect a Stream Record Header */ + Dsm_check(200); + if (sscanf(bmsg->rbuf, rec_header, &VolSessionId, &VolSessionTime, &file_index, &rctx.full_stream, &rctx.size) != 5) { - Jmsg1(jcr, M_FATAL, 0, _("Record header scan error: %s\n"), sd->msg); - goto bail_out; + Jmsg1(jcr, M_FATAL, 0, _("Record header scan error: %s\n"), bmsg->rbuf); + goto get_out; } /* Strip off new stream high bits */ rctx.stream = rctx.full_stream & STREAMMASK_TYPE; - Dmsg5(150, "Got hdr: Files=%d FilInx=%d size=%d Stream=%d, %s.\n", - jcr->JobFiles, file_index, rctx.size, rctx.stream, stream_to_ascii(rctx.stream)); - /* - * Now we expect the Stream Data - */ - if (bget_msg(sd) < 0) { + /* Now we expect the Stream Data */ + if (fdmsg->bget_msg(&bmsg) < 0) { Jmsg1(jcr, M_FATAL, 0, _("Data record error. ERR=%s\n"), sd->bstrerror()); - goto bail_out; + goto get_out; } - if (rctx.size != (uint32_t)sd->msglen) { + if (rctx.size != (uint32_t)bmsg->origlen) { Jmsg2(jcr, M_FATAL, 0, _("Actual data size %d not same as header %d\n"), - sd->msglen, rctx.size); + bmsg->origlen, rctx.size); Dmsg2(50, "Actual data size %d not same as header %d\n", - sd->msglen, rctx.size); - goto bail_out; + bmsg->origlen, rctx.size); + goto get_out; } - Dmsg3(130, "Got stream: %s len=%d extract=%d\n", stream_to_ascii(rctx.stream), - sd->msglen, rctx.extract); + Dmsg3(620, "Got stream: %s len=%d extract=%d\n", stream_to_ascii(rctx.stream), + bmsg->msglen, rctx.extract); - /* - * If we change streams, close and reset alternate data streams - */ + /* If we change streams, close and reset alternate data streams */ if (rctx.prev_stream != rctx.stream) { if (is_bopen(&rctx.forkbfd)) { deallocate_fork_cipher(rctx); - bclose_chksize(jcr, &rctx.forkbfd, rctx.fork_size); + bclose_chksize(rctx, &rctx.forkbfd, rctx.fork_size); } - /* - * Use an impossible value and set a proper one below - */ + /* Use an impossible value and set a proper one below */ rctx.fork_size = -1; rctx.fork_addr = 0; } - /* - * File Attributes stream - */ + /* File Attributes stream */ switch (rctx.stream) { case STREAM_UNIX_ATTRIBUTES: case STREAM_UNIX_ATTRIBUTES_EX: - /* - * if any previous stream open, close it - */ - if (!close_previous_stream(jcr, rctx)) { - goto bail_out; + /* if any previous stream open, close it */ + if (!close_previous_stream(rctx)) { + goto get_out; } /* @@ -541,8 +520,8 @@ void do_restore(JCR *jcr) /* * Unpack attributes and do sanity check them */ - if (!unpack_attributes_record(jcr, rctx.stream, sd->msg, sd->msglen, attr)) { - goto bail_out; + if (!unpack_attributes_record(jcr, rctx.stream, bmsg->rbuf, bmsg->rbuflen, attr)) { + goto get_out; } attr->data_stream = decode_stat(attr->attr, &attr->statp, sizeof(attr->statp), &attr->LinkFI); @@ -550,13 +529,13 @@ void do_restore(JCR *jcr) Dmsg5(100, "Stream %d: %s, File %s\nattrib=%s\nattribsEx=%s\n", attr->data_stream, stream_to_ascii(attr->data_stream), attr->fname, attr->attr, attr->attrEx); - Dmsg3(100, "=== msglen=%d attrExlen=%d msg=%s\n", sd->msglen, - strlen(attr->attrEx), sd->msg); + Dmsg3(100, "=== msglen=%d attrExlen=%d msg=%s\n", bmsg->rbuflen, + strlen(attr->attrEx), bmsg->rbuf); if (!is_restore_stream_supported(attr->data_stream)) { Dmsg2(15, "Non-supported data stream %d: %s\n", attr->data_stream, stream_to_ascii(attr->data_stream)); - if (!non_support_data++) { + if (!non_suppored_data++) { Jmsg(jcr, M_WARNING, 0, _("%s stream not supported on this Client.\n"), stream_to_ascii(attr->data_stream)); } @@ -567,7 +546,7 @@ void do_restore(JCR *jcr) /* * Try to actually create the file, which returns a status telling - * us if we need to extract or not. + * us if we need to extract or not. */ jcr->num_files_examined++; rctx.extract = false; @@ -590,25 +569,16 @@ void do_restore(JCR *jcr) case CF_SKIP: jcr->JobFiles++; break; - case CF_EXTRACT: - /* - * File created and we expect file data - */ + case CF_EXTRACT: /* File created and we expect file data */ rctx.extract = true; - /* - * FALLTHROUGH - */ - case CF_CREATED: - /* - * File created, but there is no content - */ + /* FALLTHROUGH WANTED */ + case CF_CREATED: /* File created, but there is no content */ + /* File created, but there is no content */ rctx.fileAddr = 0; print_ls_output(jcr, attr); if (have_darwin_os) { - /* - * Only restore the resource fork for regular files - */ + /* Only restore the resource fork for regular files */ from_base64(&rsrc_len, attr->attrEx); if (attr->type == FT_REG && rsrc_len > 0) { rctx.extract = true; @@ -625,9 +595,7 @@ void do_restore(JCR *jcr) } if (!rctx.extract) { - /* - * set attributes now because file will not be extracted - */ + /* set attributes now because file will not be extracted */ if (jcr->plugin) { plugin_set_attributes(jcr, attr, &rctx.bfd); } else { @@ -638,15 +606,16 @@ void do_restore(JCR *jcr) } break; - /* - * Data stream - */ + /* Data stream */ case STREAM_ENCRYPTED_SESSION_DATA: crypto_error_t cryptoerr; - /* - * Is this an unexpected session data entry? - */ + /* The current file will not be extracted, do not create a crypto session */ + if (!rctx.extract) { + break; + } + + /* Is this an unexpected session data entry? */ if (rctx.cs) { Jmsg0(jcr, M_ERROR, 0, _("Unexpected cryptographic session data stream.\n")); rctx.extract = false; @@ -654,9 +623,7 @@ void do_restore(JCR *jcr) continue; } - /* - * Do we have any keys at all? - */ + /* Do we have any keys at all? */ if (!jcr->crypto.pki_recipients) { Jmsg(jcr, M_ERROR, 0, _("No private decryption keys have been defined to decrypt encrypted backup data.\n")); rctx.extract = false; @@ -675,16 +642,12 @@ void do_restore(JCR *jcr) break; } - /* - * Decode and save session keys. - */ - cryptoerr = crypto_session_decode((uint8_t *)sd->msg, (uint32_t)sd->msglen, + /* Decode and save session keys. */ + cryptoerr = crypto_session_decode((uint8_t *)bmsg->rbuf, (uint32_t)bmsg->rbuflen, jcr->crypto.pki_recipients, &rctx.cs); switch (cryptoerr) { case CRYPTO_ERROR_NONE: - /* - * Success - */ + /* Success */ break; case CRYPTO_ERROR_NORECIPIENT: Jmsg(jcr, M_ERROR, 0, _("Missing private key required to decrypt encrypted backup data.\n")); @@ -731,9 +694,7 @@ void do_restore(JCR *jcr) case STREAM_ENCRYPTED_WIN32_GZIP_DATA: case STREAM_ENCRYPTED_FILE_COMPRESSED_DATA: case STREAM_ENCRYPTED_WIN32_COMPRESSED_DATA: - /* - * Force an expected, consistent stream type here - */ + /* Force an expected, consistent stream type here */ if (rctx.extract && (rctx.prev_stream == rctx.stream || rctx.prev_stream == STREAM_UNIX_ATTRIBUTES || rctx.prev_stream == STREAM_UNIX_ATTRIBUTES_EX @@ -766,9 +727,7 @@ void do_restore(JCR *jcr) || rctx.stream == STREAM_ENCRYPTED_FILE_COMPRESSED_DATA || rctx.stream == STREAM_ENCRYPTED_WIN32_COMPRESSED_DATA || rctx.stream == STREAM_ENCRYPTED_WIN32_GZIP_DATA) { - /* - * Set up a decryption context - */ + /* Set up a decryption context */ if (!rctx.cipher_ctx.cipher) { if (!rctx.cs) { Jmsg1(jcr, M_ERROR, 0, _("Missing encryption session data stream for %s\n"), jcr->last_fname); @@ -792,14 +751,10 @@ void do_restore(JCR *jcr) if (is_win32_stream(rctx.stream) && (win32decomp || !have_win32_api())) { set_portable_backup(&rctx.bfd); - /* - * "decompose" BackupWrite data - */ - rctx.flags |= FO_WIN32DECOMP; + rctx.flags |= FO_WIN32DECOMP; /* "decompose" BackupWrite data */ } - if (extract_data(jcr, &rctx.bfd, sd->msg, sd->msglen, &rctx.fileAddr, - rctx.flags, rctx.stream, &rctx.cipher_ctx) < 0) { + if (extract_data(rctx, bmsg->rbuf, bmsg->rbuflen) < 0) { rctx.extract = false; bclose(&rctx.bfd); continue; @@ -820,9 +775,7 @@ void do_restore(JCR *jcr) if (rctx.stream == STREAM_ENCRYPTED_MACOS_FORK_DATA) { rctx.fork_flags |= FO_ENCRYPT; - /* - * Set up a decryption context - */ + /* Set up a decryption context */ if (rctx.extract && !rctx.fork_cipher_ctx.cipher) { if (!rctx.cs) { Jmsg1(jcr, M_ERROR, 0, _("Missing encryption session data stream for %s\n"), jcr->last_fname); @@ -853,50 +806,49 @@ void do_restore(JCR *jcr) Dmsg0(130, "Restoring resource fork\n"); } - if (extract_data(jcr, &rctx.forkbfd, sd->msg, sd->msglen, &rctx.fork_addr, rctx.fork_flags, - rctx.stream, &rctx.fork_cipher_ctx) < 0) { + if (extract_data(rctx, bmsg->rbuf, bmsg->rbuflen) < 0) { rctx.extract = false; bclose(&rctx.forkbfd); continue; } } } else { - non_support_rsrc++; + non_suppored_rsrc++; } break; case STREAM_HFSPLUS_ATTRIBUTES: if (have_darwin_os) { - if (!restore_finderinfo(jcr, sd->msg, sd->msglen)) { + if (!restore_finderinfo(jcr, bmsg->rbuf, bmsg->rbuflen)) { continue; } } else { - non_support_finfo++; + non_suppored_finfo++; } break; case STREAM_UNIX_ACCESS_ACL: case STREAM_UNIX_DEFAULT_ACL: case STREAM_ACL_AIX_TEXT: - case STREAM_ACL_DARWIN_ACCESS_ACL: - case STREAM_ACL_FREEBSD_DEFAULT_ACL: - case STREAM_ACL_FREEBSD_ACCESS_ACL: + case STREAM_ACL_DARWIN_ACCESS: + case STREAM_ACL_FREEBSD_DEFAULT: + case STREAM_ACL_FREEBSD_ACCESS: case STREAM_ACL_HPUX_ACL_ENTRY: - case STREAM_ACL_IRIX_DEFAULT_ACL: - case STREAM_ACL_IRIX_ACCESS_ACL: - case STREAM_ACL_LINUX_DEFAULT_ACL: - case STREAM_ACL_LINUX_ACCESS_ACL: - case STREAM_ACL_TRU64_DEFAULT_ACL: - case STREAM_ACL_TRU64_DEFAULT_DIR_ACL: - case STREAM_ACL_TRU64_ACCESS_ACL: - case STREAM_ACL_SOLARIS_ACLENT: - case STREAM_ACL_SOLARIS_ACE: + case STREAM_ACL_IRIX_DEFAULT: + case STREAM_ACL_IRIX_ACCESS: + case STREAM_ACL_LINUX_DEFAULT: + case STREAM_ACL_LINUX_ACCESS: + case STREAM_ACL_TRU64_DEFAULT: + case STREAM_ACL_TRU64_DEFAULT_DIR: + case STREAM_ACL_TRU64_ACCESS: + case STREAM_ACL_SOLARIS_POSIX: + case STREAM_ACL_SOLARIS_NFS4: case STREAM_ACL_AFS_TEXT: case STREAM_ACL_AIX_AIXC: case STREAM_ACL_AIX_NFS4: - case STREAM_ACL_FREEBSD_NFS4_ACL: - case STREAM_ACL_HURD_DEFAULT_ACL: - case STREAM_ACL_HURD_ACCESS_ACL: + case STREAM_ACL_FREEBSD_NFS4: + case STREAM_ACL_HURD_DEFAULT: + case STREAM_ACL_HURD_ACCESS: /* * Do not restore ACLs when * a) The current file is not extracted @@ -914,14 +866,14 @@ void do_restore(JCR *jcr) * the restore of acls till a later stage. */ if (jcr->last_type != FT_DIREND) { - push_delayed_restore_stream(rctx, sd); + push_delayed_restore_stream(rctx, bmsg->rbuf, bmsg->rbuflen); } else { - if (!do_restore_acl(jcr, rctx.stream, sd->msg, sd->msglen)) { - goto bail_out; + if (!do_restore_acl(jcr, rctx.stream, bmsg->rbuf, bmsg->rbuflen)) { + goto get_out; } } } else { - non_support_acl++; + non_suppored_acl++; } break; @@ -952,14 +904,14 @@ void do_restore(JCR *jcr) * the restore of xattr till a later stage. */ if (jcr->last_type != FT_DIREND) { - push_delayed_restore_stream(rctx, sd); + push_delayed_restore_stream(rctx, bmsg->rbuf, bmsg->rbuflen); } else { - if (!do_restore_xattr(jcr, rctx.stream, sd->msg, sd->msglen)) { - goto bail_out; + if (!do_restore_xattr(jcr, rctx.stream, bmsg->rbuf, bmsg->rbuflen)) { + goto get_out; } } } else { - non_support_xattr++; + non_suppored_xattr++; } break; @@ -976,27 +928,23 @@ void do_restore(JCR *jcr) break; } if (have_xattr) { - if (!do_restore_xattr(jcr, rctx.stream, sd->msg, sd->msglen)) { - goto bail_out; + if (!do_restore_xattr(jcr, rctx.stream, bmsg->rbuf, bmsg->rbuflen)) { + goto get_out; } } else { - non_support_xattr++; + non_suppored_xattr++; } break; case STREAM_SIGNED_DIGEST: - /* - * Is this an unexpected signature? - */ + /* Is this an unexpected signature? */ if (rctx.sig) { Jmsg0(jcr, M_ERROR, 0, _("Unexpected cryptographic signature data stream.\n")); free_signature(rctx); continue; } - /* - * Save signature. - */ - if (rctx.extract && (rctx.sig = crypto_sign_decode(jcr, (uint8_t *)sd->msg, (uint32_t)sd->msglen)) == NULL) { + /* Save signature. */ + if (rctx.extract && (rctx.sig = crypto_sign_decode(jcr, (uint8_t *)bmsg->rbuf, (uint32_t)bmsg->rbuflen)) == NULL) { Jmsg1(jcr, M_ERROR, 0, _("Failed to decode message signature for %s\n"), jcr->last_fname); } break; @@ -1009,32 +957,33 @@ void do_restore(JCR *jcr) case STREAM_PROGRAM_NAMES: case STREAM_PROGRAM_DATA: - if (!non_support_progname) { + if (!non_suppored_progname) { Pmsg0(000, "Got Program Name or Data Stream. Ignored.\n"); - non_support_progname++; + non_suppored_progname++; } break; case STREAM_PLUGIN_NAME: - if (!close_previous_stream(jcr, rctx)) { - goto bail_out; + if (!close_previous_stream(rctx)) { + goto get_out; } - Dmsg1(150, "restore stream_plugin_name=%s\n", sd->msg); - plugin_name_stream(jcr, sd->msg); + Dmsg1(150, "restore stream_plugin_name=%s\n", bmsg->rbuf); + plugin_name_stream(jcr, bmsg->rbuf); break; case STREAM_RESTORE_OBJECT: break; /* these are sent by Director */ default: - if (!close_previous_stream(jcr, rctx)) { - goto bail_out; + if (!close_previous_stream(rctx)) { + goto get_out; } Jmsg(jcr, M_WARNING, 0, _("Unknown stream=%d ignored. This shouldn't happen!\n"), rctx.stream); - Dmsg2(0, "Unknown stream=%d data=%s\n", rctx.stream, sd->msg); + Dmsg2(0, "Unknown stream=%d data=%s\n", rctx.stream, bmsg->rbuf); break; } /* end switch(stream) */ + Dsm_check(200); } /* end while get_msg() */ /* @@ -1042,55 +991,58 @@ void do_restore(JCR *jcr) * archive since we just hit an end of file, so close the file. */ if (is_bopen(&rctx.forkbfd)) { - bclose_chksize(jcr, &rctx.forkbfd, rctx.fork_size); + bclose_chksize(rctx, &rctx.forkbfd, rctx.fork_size); } - if (!close_previous_stream(jcr, rctx)) { - goto bail_out; + if (!close_previous_stream(rctx)) { + goto get_out; } jcr->setJobStatus(JS_Terminated); goto ok_out; -bail_out: +get_out: jcr->setJobStatus(JS_ErrorTerminated); ok_out: + Dsm_check(200); + fdmsg->wait_read_sock(); + delete bmsg; + free_GetMsg(fdmsg); + Dsm_check(200); /* * First output the statistics. */ Dmsg2(10, "End Do Restore. Files=%d Bytes=%s\n", jcr->JobFiles, edit_uint64(jcr->JobBytes, ec1)); - if (have_acl && jcr->acl_data->u.parse->nr_errors > 0) { + if (have_acl && jcr->acl_ctx->nr_errors > 0) { Jmsg(jcr, M_WARNING, 0, _("Encountered %ld acl errors while doing restore\n"), - jcr->acl_data->u.parse->nr_errors); + jcr->acl_ctx->nr_errors); } - if (have_xattr && jcr->xattr_data->u.parse->nr_errors > 0) { + if (have_xattr && jcr->xattr_ctx->nr_errors > 0) { Jmsg(jcr, M_WARNING, 0, _("Encountered %ld xattr errors while doing restore\n"), - jcr->xattr_data->u.parse->nr_errors); + jcr->xattr_ctx->nr_errors); } - if (non_support_data > 1 || non_support_attr > 1) { + if (non_suppored_data > 1 || non_suppored_attr > 1) { Jmsg(jcr, M_WARNING, 0, _("%d non-supported data streams and %d non-supported attrib streams ignored.\n"), - non_support_data, non_support_attr); - } - if (non_support_rsrc) { - Jmsg(jcr, M_INFO, 0, _("%d non-supported resource fork streams ignored.\n"), non_support_rsrc); - } - if (non_support_finfo) { - Jmsg(jcr, M_INFO, 0, _("%d non-supported Finder Info streams ignored.\n"), non_support_finfo); - } - if (non_support_acl) { - Jmsg(jcr, M_INFO, 0, _("%d non-supported acl streams ignored.\n"), non_support_acl); - } - if (non_support_crypto) { - Jmsg(jcr, M_INFO, 0, _("%d non-supported crypto streams ignored.\n"), non_support_acl); - } - if (non_support_xattr) { - Jmsg(jcr, M_INFO, 0, _("%d non-supported xattr streams ignored.\n"), non_support_xattr); - } - - /* - * Free Signature & Crypto Data - */ + non_suppored_data, non_suppored_attr); + } + if (non_suppored_rsrc) { + Jmsg(jcr, M_INFO, 0, _("%d non-supported resource fork streams ignored.\n"), non_suppored_rsrc); + } + if (non_suppored_finfo) { + Jmsg(jcr, M_INFO, 0, _("%d non-supported Finder Info streams ignored.\n"), non_suppored_finfo); + } + if (non_suppored_acl) { + Jmsg(jcr, M_INFO, 0, _("%d non-supported acl streams ignored.\n"), non_suppored_acl); + } + if (non_suppored_crypto) { + Jmsg(jcr, M_INFO, 0, _("%d non-supported crypto streams ignored.\n"), non_suppored_acl); + } + if (non_suppored_xattr) { + Jmsg(jcr, M_INFO, 0, _("%d non-supported xattr streams ignored.\n"), non_suppored_xattr); + } + + /* Free Signature & Crypto Data */ free_signature(rctx); free_session(rctx); if (jcr->crypto.digest) { @@ -1098,22 +1050,18 @@ ok_out: jcr->crypto.digest = NULL; } - /* - * Free file cipher restore context - */ + /* Free file cipher restore context */ if (rctx.cipher_ctx.cipher) { crypto_cipher_free(rctx.cipher_ctx.cipher); rctx.cipher_ctx.cipher = NULL; } - + if (rctx.cipher_ctx.buf) { free_pool_memory(rctx.cipher_ctx.buf); rctx.cipher_ctx.buf = NULL; } - /* - * Free alternate stream cipher restore context - */ + /* Free alternate stream cipher restore context */ if (rctx.fork_cipher_ctx.cipher) { crypto_cipher_free(rctx.fork_cipher_ctx.cipher); rctx.fork_cipher_ctx.cipher = NULL; @@ -1128,27 +1076,30 @@ ok_out: jcr->compress_buf = NULL; jcr->compress_buf_size = 0; } + + if (have_acl && jcr->acl_ctx) { + if (jcr->acl_ctx->content) { + free(jcr->acl_ctx->content); + } + free(jcr->acl_ctx); + jcr->acl_ctx = NULL; + } + + if (have_xattr && jcr->xattr_ctx) { + if (jcr->xattr_ctx->content) { + free(jcr->xattr_ctx->content); + } + free(jcr->xattr_ctx); + jcr->xattr_ctx = NULL; + } - if (have_acl && jcr->acl_data) { - free(jcr->acl_data->u.parse); - free(jcr->acl_data); - jcr->acl_data = NULL; - } - - if (have_xattr && jcr->xattr_data) { - free(jcr->xattr_data->u.parse); - free(jcr->xattr_data); - jcr->xattr_data = NULL; - } - - /* - * Free the delayed stream stack list. - */ + /* Free the delayed stream stack list. */ if (rctx.delayed_streams) { drop_delayed_restore_streams(rctx, false); delete rctx.delayed_streams; } + Dsm_check(200); bclose(&rctx.forkbfd); bclose(&rctx.bfd); free_attr(rctx.attr); @@ -1188,165 +1139,32 @@ static int do_file_digest(JCR *jcr, FF_PKT *ff_pkt, bool top_level) return (digest_file(jcr, ff_pkt, jcr->crypto.digest)); } -/* - * Verify the signature for the last restored file - * Return value is either true (signature correct) - * or false (signature could not be verified). - * TODO landonf: Implement without using find_one_file and - * without re-reading the file. - */ -static bool verify_signature(JCR *jcr, r_ctx &rctx) -{ - X509_KEYPAIR *keypair; - DIGEST *digest = NULL; - crypto_error_t err; - uint64_t saved_bytes; - crypto_digest_t signing_algorithm = have_sha2 ? - CRYPTO_DIGEST_SHA256 : CRYPTO_DIGEST_SHA1; - crypto_digest_t algorithm; - SIGNATURE *sig = rctx.sig; - - - if (!jcr->crypto.pki_sign) { - /* - * no signature OK - */ - return true; - } - if (!sig) { - if (rctx.type == FT_REGE || rctx.type == FT_REG || rctx.type == FT_RAW) { - Jmsg1(jcr, M_ERROR, 0, _("Missing cryptographic signature for %s\n"), - jcr->last_fname); - goto bail_out; - } - return true; - } - - /* - * Iterate through the trusted signers - */ - foreach_alist(keypair, jcr->crypto.pki_signers) { - err = crypto_sign_get_digest(sig, jcr->crypto.pki_keypair, algorithm, &digest); - switch (err) { - case CRYPTO_ERROR_NONE: - Dmsg0(50, "== Got digest\n"); - /* - * We computed jcr->crypto.digest using signing_algorithm while writing - * the file. If it is not the same as the algorithm used for - * this file, punt by releasing the computed algorithm and - * computing by re-reading the file. - */ - if (algorithm != signing_algorithm) { - if (jcr->crypto.digest) { - crypto_digest_free(jcr->crypto.digest); - jcr->crypto.digest = NULL; - } - } - if (jcr->crypto.digest) { - /* - * Use digest computed while writing the file to verify the signature - */ - if ((err = crypto_sign_verify(sig, keypair, jcr->crypto.digest)) != CRYPTO_ERROR_NONE) { - Dmsg1(50, "Bad signature on %s\n", jcr->last_fname); - Jmsg2(jcr, M_ERROR, 0, _("Signature validation failed for file %s: ERR=%s\n"), - jcr->last_fname, crypto_strerror(err)); - goto bail_out; - } - } else { - /* - * Signature found, digest allocated. Old method, - * re-read the file and compute the digest - */ - jcr->crypto.digest = digest; - - /* - * Checksum the entire file - * Make sure we don't modify JobBytes by saving and restoring it - */ - saved_bytes = jcr->JobBytes; - if (find_one_file(jcr, jcr->ff, do_file_digest, jcr->last_fname, (dev_t)-1, 1) != 0) { - Jmsg(jcr, M_ERROR, 0, _("Digest one file failed for file: %s\n"), - jcr->last_fname); - jcr->JobBytes = saved_bytes; - goto bail_out; - } - jcr->JobBytes = saved_bytes; - - /* - * Verify the signature - */ - if ((err = crypto_sign_verify(sig, keypair, digest)) != CRYPTO_ERROR_NONE) { - Dmsg1(50, "Bad signature on %s\n", jcr->last_fname); - Jmsg2(jcr, M_ERROR, 0, _("Signature validation failed for file %s: ERR=%s\n"), - jcr->last_fname, crypto_strerror(err)); - goto bail_out; - } - jcr->crypto.digest = NULL; - } - - /* - * Valid signature - */ - Dmsg1(50, "Signature good on %s\n", jcr->last_fname); - crypto_digest_free(digest); - return true; - - case CRYPTO_ERROR_NOSIGNER: - /* - * Signature not found, try again - */ - if (digest) { - crypto_digest_free(digest); - digest = NULL; - } - continue; - default: - /* - * Something strange happened (that shouldn't happen!)... - */ - Qmsg2(jcr, M_ERROR, 0, _("Signature validation failed for %s: %s\n"), jcr->last_fname, crypto_strerror(err)); - goto bail_out; - } - } - - /* - * No signer - */ - Dmsg1(50, "Could not find a valid public key for signature on %s\n", jcr->last_fname); - -bail_out: - if (digest) { - crypto_digest_free(digest); - } - return false; -} - bool sparse_data(JCR *jcr, BFILE *bfd, uint64_t *addr, char **data, uint32_t *length) { - unser_declare; - uint64_t faddr; - char ec1[50]; - unser_begin(*data, OFFSET_FADDR_SIZE); - unser_uint64(faddr); - if (*addr != faddr) { - *addr = faddr; - if (blseek(bfd, (boffset_t)*addr, SEEK_SET) < 0) { - berrno be; - Jmsg3(jcr, M_ERROR, 0, _("Seek to %s error on %s: ERR=%s\n"), - edit_uint64(*addr, ec1), jcr->last_fname, - be.bstrerror(bfd->berrno)); - return false; - } + unser_declare; + uint64_t faddr; + char ec1[50]; + unser_begin(*data, OFFSET_FADDR_SIZE); + unser_uint64(faddr); + if (*addr != faddr) { + *addr = faddr; + if (blseek(bfd, (boffset_t)*addr, SEEK_SET) < 0) { + berrno be; + Jmsg3(jcr, M_ERROR, 0, _("Seek to %s error on %s: ERR=%s\n"), + edit_uint64(*addr, ec1), jcr->last_fname, + be.bstrerror(bfd->berrno)); + return false; } - *data += OFFSET_FADDR_SIZE; - *length -= OFFSET_FADDR_SIZE; - return true; + } + *data += OFFSET_FADDR_SIZE; + *length -= OFFSET_FADDR_SIZE; + return true; } bool decompress_data(JCR *jcr, int32_t stream, char **data, uint32_t *length) { #if defined(HAVE_LZO) || defined(HAVE_LIBZ) - char ec1[50]; /* Buffer printing huge values */ + char ec1[50]; /* Buffer printing huge values */ #endif Dmsg1(200, "Stream found in decompress_data(): %d\n", stream); @@ -1373,7 +1191,7 @@ bool decompress_data(JCR *jcr, int32_t stream, char **data, uint32_t *length) /* version check */ if (comp_version != COMP_HEAD_VERSION) { - Qmsg(jcr, M_ERROR, 0, _("Compressed header version error. version=0x%x\n"), comp_version); + Qmsg(jcr, M_ERROR, 0, _("Compressed header version error. Got=0x%x want=0x%x\n"), comp_version, COMP_HEAD_VERSION); return false; } /* size check */ @@ -1421,17 +1239,15 @@ bool decompress_data(JCR *jcr, int32_t stream, char **data, uint32_t *length) /* * NOTE! We only use uLong and Byte because they are - * needed by the zlib routines, they should not otherwise - * be used in Bacula. - */ + * needed by the zlib routines, they should not otherwise + * be used in Bacula. + */ compress_len = jcr->compress_buf_size; Dmsg2(200, "Comp_len=%d msglen=%d\n", compress_len, *length); while ((stat=uncompress((Byte *)jcr->compress_buf, &compress_len, (const Byte *)*data, (uLong)*length)) == Z_BUF_ERROR) { - /* - * The buffer size is too small, try with a bigger one - */ + /* The buffer size is too small, try with a bigger one. */ compress_len = jcr->compress_buf_size = jcr->compress_buf_size + (jcr->compress_buf_size >> 1); Dmsg2(200, "Comp_len=%d msglen=%d\n", compress_len, *length); jcr->compress_buf = check_pool_memory_size(jcr->compress_buf, @@ -1463,8 +1279,10 @@ static void unser_crypto_packet_len(RESTORE_CIPHER_CTX *ctx) } } -bool store_data(JCR *jcr, BFILE *bfd, char *data, const int32_t length, bool win32_decomp) +static bool store_data(r_ctx &rctx, char *data, const int32_t length, bool win32_decomp) { + JCR *jcr = rctx.jcr; + BFILE *bfd = &rctx.bfd; ssize_t wstat; if (jcr->crypto.digest) { @@ -1477,7 +1295,9 @@ bool store_data(JCR *jcr, BFILE *bfd, char *data, const int32_t length, bool win jcr->last_fname, be.bstrerror(bfd->berrno)); return false; } - } else if ((wstat=bwrite(bfd, data, length)) != (ssize_t)length) { + } + + if ((wstat=bwrite(bfd, data, length)) != (ssize_t)length) { berrno be; int type = M_ERROR; int len = strlen(jcr->last_fname); @@ -1498,11 +1318,11 @@ bool store_data(JCR *jcr, BFILE *bfd, char *data, const int32_t length, bool win if (type != 0) { if (wstat >= 0) { /* Insufficient bytes written */ - Jmsg4(jcr, type, 0, _("Wrong write size error at %lld block=%d wanted=%d wrote=%d\n"), + Jmsg4(jcr, type, 0, _("Wrong write size error at byte=%lld block=%d wanted=%d wrote=%d\n"), bfd->total_bytes, bfd->block, length, wstat); } else { /* Error */ - Jmsg6(jcr, type, 0, _("Write write error at %lld block=%d write_len=%d lerror=%d on %s: ERR=%s\n"), + Jmsg6(jcr, type, 0, _("Write error at byte=%lld block=%d write_len=%d lerror=%d on %s: ERR=%s\n"), bfd->total_bytes, bfd->block, length, bfd->lerror, jcr->last_fname, be.bstrerror(bfd->berrno)); } @@ -1523,14 +1343,18 @@ bool store_data(JCR *jcr, BFILE *bfd, char *data, const int32_t length, bool win * The flags specify whether to use sparse files or compression. * Return value is the number of bytes written, or -1 on errors. */ -int32_t extract_data(JCR *jcr, BFILE *bfd, POOLMEM *buf, int32_t buflen, - uint64_t *addr, int flags, int32_t stream, RESTORE_CIPHER_CTX *cipher_ctx) +int32_t extract_data(r_ctx &rctx, POOLMEM *buf, int32_t buflen) { - char *wbuf; /* write buffer */ - uint32_t wsize; /* write size */ - uint32_t rsize; /* read size */ - uint32_t decrypted_len = 0; /* Decryption output length */ - char ec1[50]; /* Buffer printing huge values */ + JCR *jcr = rctx.jcr; + BFILE *bfd = &rctx.bfd; + int flags = rctx.flags; + int32_t stream = rctx.stream; + RESTORE_CIPHER_CTX *cipher_ctx = &rctx.cipher_ctx; + char *wbuf; /* write buffer */ + uint32_t wsize; /* write size */ + uint32_t rsize; /* read size */ + uint32_t decrypted_len = 0; /* Decryption output length */ + char ec1[50]; /* Buffer printing huge values */ rsize = buflen; jcr->ReadBytes += rsize; @@ -1541,9 +1365,6 @@ int32_t extract_data(JCR *jcr, BFILE *bfd, POOLMEM *buf, int32_t buflen, ASSERT(cipher_ctx->cipher); /* - * NOTE: We must implement block preserving semantics for the - * non-streaming compression and sparse code. - * * Grow the crypto buffer, if necessary. * crypto_cipher_update() will process only whole blocks, * buffering the remaining input. @@ -1551,25 +1372,19 @@ int32_t extract_data(JCR *jcr, BFILE *bfd, POOLMEM *buf, int32_t buflen, cipher_ctx->buf = check_pool_memory_size(cipher_ctx->buf, cipher_ctx->buf_len + wsize + cipher_ctx->block_size); - /* - * Decrypt the input block - */ + /* Decrypt the input block */ if (!crypto_cipher_update(cipher_ctx->cipher, (const u_int8_t *)wbuf, wsize, (u_int8_t *)&cipher_ctx->buf[cipher_ctx->buf_len], &decrypted_len)) { - /* - * Decryption failed. Shouldn't happen. - */ + /* Decryption failed. Shouldn't happen. */ Jmsg(jcr, M_FATAL, 0, _("Decryption error\n")); - goto bail_out; + goto get_out; } if (decrypted_len == 0) { - /* - * No full block of encrypted data available, write more data - */ + /* No full block of encrypted data available, write more data */ return 0; } @@ -1578,25 +1393,20 @@ int32_t extract_data(JCR *jcr, BFILE *bfd, POOLMEM *buf, int32_t buflen, cipher_ctx->buf_len += decrypted_len; wbuf = cipher_ctx->buf; - /* - * If one full preserved block is available, write it to disk, - * and then buffer any remaining data. This should be effecient - * as long as Bacula's block size is not significantly smaller than the - * encryption block size (extremely unlikely!) - */ + /* If one full preserved block is available, write it to disk, + * and then buffer any remaining data. This should be effecient + * as long as Bacula's block size is not significantly smaller than the + * encryption block size (extremely unlikely!) + */ unser_crypto_packet_len(cipher_ctx); Dmsg1(500, "Crypto unser block size=%d\n", cipher_ctx->packet_len - CRYPTO_LEN_SIZE); if (cipher_ctx->packet_len == 0 || cipher_ctx->buf_len < cipher_ctx->packet_len) { - /* - * No full preserved block is available. - */ + /* No full preserved block is available. */ return 0; } - /* - * We have one full block, set up the filter input buffers - */ + /* We have one full block, set up the filter input buffers */ wsize = cipher_ctx->packet_len - CRYPTO_LEN_SIZE; wbuf = &wbuf[CRYPTO_LEN_SIZE]; /* Skip the block length header */ cipher_ctx->buf_len -= cipher_ctx->packet_len; @@ -1604,27 +1414,25 @@ int32_t extract_data(JCR *jcr, BFILE *bfd, POOLMEM *buf, int32_t buflen, } if ((flags & FO_SPARSE) || (flags & FO_OFFSETS)) { - if (!sparse_data(jcr, bfd, addr, &wbuf, &wsize)) { - goto bail_out; + if (!sparse_data(jcr, bfd, &rctx.fileAddr, &wbuf, &wsize)) { + goto get_out; } } if (flags & FO_COMPRESS) { if (!decompress_data(jcr, stream, &wbuf, &wsize)) { - goto bail_out; + goto get_out; } } - if (!store_data(jcr, bfd, wbuf, wsize, (flags & FO_WIN32DECOMP) != 0)) { - goto bail_out; + if (!store_data(rctx, wbuf, wsize, (flags & FO_WIN32DECOMP) != 0)) { + goto get_out; } jcr->JobBytes += wsize; - *addr += wsize; + rctx.fileAddr += wsize; Dmsg2(130, "Write %u bytes, JobBytes=%s\n", wsize, edit_uint64(jcr->JobBytes, ec1)); - /* - * Clean up crypto buffers - */ + /* Clean up crypto buffers */ if (flags & FO_ENCRYPT) { /* Move any remaining data to start of buffer */ if (cipher_ctx->buf_len > 0) { @@ -1632,23 +1440,23 @@ int32_t extract_data(JCR *jcr, BFILE *bfd, POOLMEM *buf, int32_t buflen, memmove(cipher_ctx->buf, &cipher_ctx->buf[cipher_ctx->packet_len], cipher_ctx->buf_len); } - /* - * The packet was successfully written, reset the length so that the next - * packet length may be re-read by unser_crypto_packet_len() - */ + /* The packet was successfully written, reset the length so that + * the next packet length may be re-read by unser_crypto_packet_len() */ cipher_ctx->packet_len = 0; } return wsize; -bail_out: +get_out: return -1; } /* * If extracting, close any previous stream */ -static bool close_previous_stream(JCR *jcr, r_ctx &rctx) +static bool close_previous_stream(r_ctx &rctx) { + bool rtn = true; + /* * If extracting, it was from previous stream, so * close the output file and validate the signature. @@ -1656,7 +1464,7 @@ static bool close_previous_stream(JCR *jcr, r_ctx &rctx) if (rctx.extract) { if (rctx.size > 0 && !is_bopen(&rctx.bfd)) { Jmsg0(rctx.jcr, M_ERROR, 0, _("Logic error: output file should be open\n")); - Dmsg2(000, "=== logic error size=%d bopen=%d\n", rctx.size, + Pmsg2(000, "=== logic error size=%d bopen=%d\n", rctx.size, is_bopen(&rctx.bfd)); } @@ -1672,43 +1480,36 @@ static bool close_previous_stream(JCR *jcr, r_ctx &rctx) } rctx.extract = false; - /* - * Now perform the delayed restore of some specific data streams. - */ - if (!pop_delayed_data_streams(jcr, rctx)) { - return false; - } - - /* - * Verify the cryptographic signature, if any - */ + /* Now perform the delayed restore of some specific data streams. */ + rtn = pop_delayed_data_streams(rctx); + + /* Verify the cryptographic signature, if any */ rctx.type = rctx.attr->type; - verify_signature(rctx.jcr, rctx); + verify_signature(rctx); - /* - * Free Signature - */ + /* Free Signature */ free_signature(rctx); free_session(rctx); rctx.jcr->ff->flags = 0; Dmsg0(130, "Stop extracting.\n"); } else if (is_bopen(&rctx.bfd)) { Jmsg0(rctx.jcr, M_ERROR, 0, _("Logic error: output file should not be open\n")); - Dmsg0(000, "=== logic error !open\n"); + Pmsg0(000, "=== logic error !open\n"); bclose(&rctx.bfd); } - return true; -} + return rtn; +} /* * In the context of jcr, flush any remaining data from the cipher context, * writing it to bfd. * Return value is true on success, false on failure. */ -bool flush_cipher(JCR *jcr, BFILE *bfd, uint64_t *addr, int flags, int32_t stream, +bool flush_cipher(r_ctx &rctx, BFILE *bfd, uint64_t *addr, int flags, int32_t stream, RESTORE_CIPHER_CTX *cipher_ctx) { + JCR *jcr = rctx.jcr; uint32_t decrypted_len = 0; char *wbuf; /* write buffer */ uint32_t wsize; /* write size */ @@ -1716,25 +1517,19 @@ bool flush_cipher(JCR *jcr, BFILE *bfd, uint64_t *addr, int flags, int32_t strea bool second_pass = false; again: - /* - * Write out the remaining block and free the cipher context - */ - cipher_ctx->buf = check_pool_memory_size(cipher_ctx->buf, cipher_ctx->buf_len + - cipher_ctx->block_size); + /* Write out the remaining block and free the cipher context */ + cipher_ctx->buf = check_pool_memory_size(cipher_ctx->buf, + cipher_ctx->buf_len + cipher_ctx->block_size); if (!crypto_cipher_finalize(cipher_ctx->cipher, (uint8_t *)&cipher_ctx->buf[cipher_ctx->buf_len], &decrypted_len)) { - /* - * Writing out the final, buffered block failed. Shouldn't happen. - */ + /* Writing out the final, buffered block failed. Shouldn't happen. */ Jmsg3(jcr, M_ERROR, 0, _("Decryption error. buf_len=%d decrypt_len=%d on file %s\n"), cipher_ctx->buf_len, decrypted_len, jcr->last_fname); } Dmsg2(130, "Flush decrypt len=%d buf_len=%d\n", decrypted_len, cipher_ctx->buf_len); - /* - * If nothing new was decrypted, and our output buffer is empty, return - */ + /* If nothing new was decrypted, and our output buffer is empty, return */ if (decrypted_len == 0 && cipher_ctx->buf_len == 0) { return true; } @@ -1744,10 +1539,8 @@ again: unser_crypto_packet_len(cipher_ctx); Dmsg1(500, "Crypto unser block size=%d\n", cipher_ctx->packet_len - CRYPTO_LEN_SIZE); wsize = cipher_ctx->packet_len - CRYPTO_LEN_SIZE; - /* - * Decrypted, possibly decompressed output here. - */ - wbuf = &cipher_ctx->buf[CRYPTO_LEN_SIZE]; + /* Decrypted, possibly decompressed output here. */ + wbuf = &cipher_ctx->buf[CRYPTO_LEN_SIZE]; /* Skip the block length header */ cipher_ctx->buf_len -= cipher_ctx->packet_len; Dmsg2(130, "Encryption writing full block, %u bytes, remaining %u bytes in buffer\n", wsize, cipher_ctx->buf_len); @@ -1764,24 +1557,20 @@ again: } Dmsg0(130, "Call store_data\n"); - if (!store_data(jcr, bfd, wbuf, wsize, (flags & FO_WIN32DECOMP) != 0)) { + if (!store_data(rctx, wbuf, wsize, (flags & FO_WIN32DECOMP) != 0)) { return false; } jcr->JobBytes += wsize; Dmsg2(130, "Flush write %u bytes, JobBytes=%s\n", wsize, edit_uint64(jcr->JobBytes, ec1)); - /* - * Move any remaining data to start of buffer - */ + /* Move any remaining data to start of buffer. */ if (cipher_ctx->buf_len > 0) { Dmsg1(130, "Moving %u buffered bytes to start of buffer\n", cipher_ctx->buf_len); memmove(cipher_ctx->buf, &cipher_ctx->buf[cipher_ctx->packet_len], cipher_ctx->buf_len); } - /* - * The packet was successfully written, reset the length so that the next - * packet length may be re-read by unser_crypto_packet_len() - */ + /* The packet was successfully written, reset the length so that the next + * packet length may be re-read by unser_crypto_packet_len() */ cipher_ctx->packet_len = 0; if (cipher_ctx->buf_len >0 && !second_pass) { @@ -1789,9 +1578,7 @@ again: goto again; } - /* - * Stop decryption - */ + /* Stop decryption */ cipher_ctx->buf_len = 0; cipher_ctx->packet_len = 0; @@ -1800,11 +1587,9 @@ again: static void deallocate_cipher(r_ctx &rctx) { - /* - * Flush and deallocate previous stream's cipher context - */ + /* Flush and deallocate previous stream's cipher context */ if (rctx.cipher_ctx.cipher) { - flush_cipher(rctx.jcr, &rctx.bfd, &rctx.fileAddr, rctx.flags, rctx.comp_stream, &rctx.cipher_ctx); + flush_cipher(rctx, &rctx.bfd, &rctx.fileAddr, rctx.flags, rctx.comp_stream, &rctx.cipher_ctx); crypto_cipher_free(rctx.cipher_ctx.cipher); rctx.cipher_ctx.cipher = NULL; } @@ -1813,11 +1598,9 @@ static void deallocate_cipher(r_ctx &rctx) static void deallocate_fork_cipher(r_ctx &rctx) { - /* - * Flush and deallocate previous stream's fork cipher context - */ + /* Flush and deallocate previous stream's fork cipher context */ if (rctx.fork_cipher_ctx.cipher) { - flush_cipher(rctx.jcr, &rctx.forkbfd, &rctx.fork_addr, rctx.fork_flags, rctx.comp_stream, &rctx.fork_cipher_ctx); + flush_cipher(rctx, &rctx.forkbfd, &rctx.fork_addr, rctx.fork_flags, rctx.comp_stream, &rctx.fork_cipher_ctx); crypto_cipher_free(rctx.fork_cipher_ctx.cipher); rctx.fork_cipher_ctx.cipher = NULL; } @@ -1839,30 +1622,118 @@ static void free_session(r_ctx &rctx) } } - /* - * This code if implemented goes above + * Verify the signature for the last restored file + * Return value is either true (signature correct) + * or false (signature could not be verified). + * TODO landonf: Implement without using find_one_file and + * without re-reading the file. */ -#ifdef stbernard_implemented -/ #if defined(HAVE_WIN32) - bool bResumeOfmOnExit = FALSE; - if (isOpenFileManagerRunning()) { - if ( pauseOpenFileManager() ) { - Jmsg(jcr, M_INFO, 0, _("Open File Manager paused\n") ); - bResumeOfmOnExit = TRUE; - } - else { - Jmsg(jcr, M_ERROR, 0, _("FAILED to pause Open File Manager\n") ); - } +static bool verify_signature(r_ctx &rctx) +{ + JCR *jcr = rctx.jcr; + X509_KEYPAIR *keypair; + DIGEST *digest = NULL; + crypto_error_t err; + uint64_t saved_bytes; + crypto_digest_t signing_algorithm = have_sha2 ? + CRYPTO_DIGEST_SHA256 : CRYPTO_DIGEST_SHA1; + crypto_digest_t algorithm; + SIGNATURE *sig = rctx.sig; + + + if (!jcr->crypto.pki_sign) { + /* no signature OK */ + return true; } - { - char username[UNLEN+1]; - DWORD usize = sizeof(username); - int privs = enable_backup_privileges(NULL, 1); - if (GetUserName(username, &usize)) { - Jmsg2(jcr, M_INFO, 0, _("Running as '%s'. Privmask=%#08x\n"), username, - } else { - Jmsg(jcr, M_WARNING, 0, _("Failed to retrieve current UserName\n")); - } + if (!sig) { + if (rctx.type == FT_REGE || rctx.type == FT_REG || rctx.type == FT_RAW) { + Jmsg1(jcr, M_ERROR, 0, _("Missing cryptographic signature for %s\n"), + jcr->last_fname); + goto get_out; + } + return true; } -#endif + + /* Iterate through the trusted signers */ + foreach_alist(keypair, jcr->crypto.pki_signers) { + err = crypto_sign_get_digest(sig, jcr->crypto.pki_keypair, algorithm, &digest); + switch (err) { + case CRYPTO_ERROR_NONE: + Dmsg0(50, "== Got digest\n"); + /* + * We computed jcr->crypto.digest using signing_algorithm while writing + * the file. If it is not the same as the algorithm used for + * this file, punt by releasing the computed algorithm and + * computing by re-reading the file. + */ + if (algorithm != signing_algorithm) { + if (jcr->crypto.digest) { + crypto_digest_free(jcr->crypto.digest); + jcr->crypto.digest = NULL; + } + } + if (jcr->crypto.digest) { + /* Use digest computed while writing the file to verify + * the signature */ + if ((err = crypto_sign_verify(sig, keypair, jcr->crypto.digest)) != CRYPTO_ERROR_NONE) { + Dmsg1(50, "Bad signature on %s\n", jcr->last_fname); + Jmsg2(jcr, M_ERROR, 0, _("Signature validation failed for file %s: ERR=%s\n"), + jcr->last_fname, crypto_strerror(err)); + goto get_out; + } + } else { + /* Signature found, digest allocated. Old method, + * re-read the file and compute the digest */ + jcr->crypto.digest = digest; + + /* Checksum the entire file + * Make sure we don't modify JobBytes by saving and + * restoring it */ + saved_bytes = jcr->JobBytes; + if (find_one_file(jcr, jcr->ff, do_file_digest, jcr->last_fname, (dev_t)-1, 1) != 0) { + Jmsg(jcr, M_ERROR, 0, _("Digest one file failed for file: %s\n"), + jcr->last_fname); + jcr->JobBytes = saved_bytes; + goto get_out; + } + jcr->JobBytes = saved_bytes; + + /* Verify the signature */ + if ((err = crypto_sign_verify(sig, keypair, digest)) != CRYPTO_ERROR_NONE) { + Dmsg1(50, "Bad signature on %s\n", jcr->last_fname); + Jmsg2(jcr, M_ERROR, 0, _("Signature validation failed for file %s: ERR=%s\n"), + jcr->last_fname, crypto_strerror(err)); + goto get_out; + } + jcr->crypto.digest = NULL; + } + + /* Valid signature */ + Dmsg1(50, "Signature good on %s\n", jcr->last_fname); + crypto_digest_free(digest); + return true; + + case CRYPTO_ERROR_NOSIGNER: + /* Signature not found, try again */ + if (digest) { + crypto_digest_free(digest); + digest = NULL; + } + continue; + default: + /* Something strange happened (that shouldn't happen!)... */ + Qmsg2(jcr, M_ERROR, 0, _("Signature validation failed for %s: %s\n"), jcr->last_fname, crypto_strerror(err)); + goto get_out; + } + } + + /* No signer */ + Dmsg1(50, "Could not find a valid public key for signature on %s\n", jcr->last_fname); + +get_out: + if (digest) { + crypto_digest_free(digest); + } + return false; +} diff --git a/bacula/src/filed/restore.h b/bacula/src/filed/restore.h index 779e49b02d..e04ecd3632 100644 --- a/bacula/src/filed/restore.h +++ b/bacula/src/filed/restore.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 2009 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2009-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ #ifndef __RESTORE_H @@ -50,6 +54,7 @@ struct r_ctx { ATTR *attr; /* Pointer to attributes */ bool extract; /* set when extracting */ alist *delayed_streams; /* streams that should be restored as last */ + int32_t count; /* Debug count */ SIGNATURE *sig; /* Cryptographic signature (if any) for file */ CRYPTO_SESSION *cs; /* Cryptographic session data (if any) for file */ diff --git a/bacula/src/filed/status.c b/bacula/src/filed/status.c index 5747057a74..e65cdc0468 100644 --- a/bacula/src/filed/status.c +++ b/bacula/src/filed/status.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula File Daemon Status routines @@ -40,16 +44,7 @@ static char qstatus2[] = ".status %127s api=%d api_opts=%127s"; static char OKqstatus[] = "2000 OK .status\n"; static char DotStatusJob[] = "JobId=%d JobStatus=%c JobErrors=%d\n"; -#if defined(HAVE_WIN32) -static int privs = 0; -#endif -#ifdef WIN32_VSS -#include "vss.h" -#define VSS " VSS" -extern VSSClient *g_pVSSClient; -#else #define VSS "" -#endif /* * General status generator @@ -67,6 +62,7 @@ static const bool have_lzo = true; static const bool have_lzo = false; #endif + static void list_status_header(STATUS_PKT *sp) { POOL_MEM msg(PM_MESSAGE); @@ -74,65 +70,14 @@ static void list_status_header(STATUS_PKT *sp) int len; char dt[MAX_TIME_LENGTH]; - len = Mmsg(msg, _("%s Version: %s (%s) %s %s %s %s\n"), - my_name, VERSION, BDATE, VSS, HOST_OS, + len = Mmsg(msg, _("%s %sVersion: %s (%s) %s %s %s %s\n"), + my_name, "", VERSION, BDATE, VSS, HOST_OS, DISTNAME, DISTVER); sendit(msg.c_str(), len, sp); bstrftime_nc(dt, sizeof(dt), daemon_start_time); len = Mmsg(msg, _("Daemon started %s. Jobs: run=%d running=%d.\n"), dt, num_jobs_run, job_count()); sendit(msg.c_str(), len, sp); -#if defined(HAVE_WIN32) - char buf[300]; - if (GetWindowsVersionString(buf, sizeof(buf))) { - len = Mmsg(msg, "%s\n", buf); - sendit(msg.c_str(), len, sp); - } - if (debug_level > 0) { - if (!privs) { - privs = enable_backup_privileges(NULL, 1); - } - len = Mmsg(msg, "VSS %s, Priv 0x%x\n", g_pVSSClient?"enabled":"disabled", privs); - sendit(msg.c_str(), len, sp); - len = Mmsg(msg, "APIs=%sOPT,%sATP,%sLPV,%sCFA,%sCFW,\n", - p_OpenProcessToken?"":"!", - p_AdjustTokenPrivileges?"":"!", - p_LookupPrivilegeValue?"":"!", - p_CreateFileA?"":"!", - p_CreateFileW?"":"!"); - sendit(msg.c_str(), len, sp); - len = Mmsg(msg, " %sWUL,%sWMKD,%sGFAA,%sGFAW,%sGFAEA,%sGFAEW,%sSFAA,%sSFAW,%sBR,%sBW,%sSPSP,\n", - p_wunlink?"":"!", - p_wmkdir?"":"!", - p_GetFileAttributesA?"":"!", - p_GetFileAttributesW?"":"!", - p_GetFileAttributesExA?"":"!", - p_GetFileAttributesExW?"":"!", - p_SetFileAttributesA?"":"!", - p_SetFileAttributesW?"":"!", - p_BackupRead?"":"!", - p_BackupWrite?"":"!", - p_SetProcessShutdownParameters?"":"!"); - sendit(msg.c_str(), len, sp); - len = Mmsg(msg, " %sWC2MB,%sMB2WC,%sFFFA,%sFFFW,%sFNFA,%sFNFW,%sSCDA,%sSCDW,\n", - p_WideCharToMultiByte?"":"!", - p_MultiByteToWideChar?"":"!", - p_FindFirstFileA?"":"!", - p_FindFirstFileW?"":"!", - p_FindNextFileA?"":"!", - p_FindNextFileW?"":"!", - p_SetCurrentDirectoryA?"":"!", - p_SetCurrentDirectoryW?"":"!"); - sendit(msg.c_str(), len, sp); - len = Mmsg(msg, " %sGCDA,%sGCDW,%sGVPNW,%sGVNFVMPW,%sLZO\n", - p_GetCurrentDirectoryA?"":"!", - p_GetCurrentDirectoryW?"":"!", - p_GetVolumePathNameW?"":"!", - p_GetVolumeNameForVolumeMountPointW?"":"!", - have_lzo?"":"!"); - sendit(msg.c_str(), len, sp); - } -#endif len = Mmsg(msg, _(" Heap: heap=%s smbytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"), edit_uint64_with_commas((char *)sbrk(0)-(char *)start_heap, b1), edit_uint64_with_commas(sm_bytes, b2), @@ -141,16 +86,16 @@ static void list_status_header(STATUS_PKT *sp) edit_uint64_with_commas(sm_max_buffers, b5)); sendit(msg.c_str(), len, sp); len = Mmsg(msg, _(" Sizes: boffset_t=%d size_t=%d debug=%s trace=%d " - "mode=%d,%d bwlimit=%skB/s\n"), + "mode=%d bwlimit=%skB/s\n"), sizeof(boffset_t), sizeof(size_t), - edit_uint64(debug_level, b2), get_trace(), (int)DEVELOPER_MODE, (int)BEEF, + edit_uint64(debug_level, b2), get_trace(), (int)DEVELOPER_MODE, edit_uint64_with_commas(me->max_bandwidth_per_job/1024, b1)); sendit(msg.c_str(), len, sp); - if (bplugin_list->size() > 0) { + if (b_plugin_list->size() > 0) { Plugin *plugin; int len; pm_strcpy(msg, " Plugin: "); - foreach_alist(plugin, bplugin_list) { + foreach_alist(plugin, b_plugin_list) { len = pm_strcat(msg, plugin->file); /* Print plugin version when debug activated */ if (debug_level > 0 && plugin->pinfo) { @@ -175,9 +120,10 @@ static void list_status_header(STATUS_PKT *sp) */ static void list_running_jobs_plain(STATUS_PKT *sp) { - int total_sec, inst_sec, total_bps, inst_bps; + int total_sec, inst_sec; + uint64_t total_bps, inst_bps; POOL_MEM msg(PM_MESSAGE); - char b1[50], b2[50], b3[50], b4[50], b5[50]; + char b1[50], b2[50], b3[50], b4[50], b5[50], b6[50]; int len; bool found = false; JCR *njcr; @@ -188,15 +134,12 @@ static void list_running_jobs_plain(STATUS_PKT *sp) len = Mmsg(msg, _("\nRunning Jobs:\n")); sendit(msg.c_str(), len, sp); const char *vss = ""; -#ifdef WIN32_VSS - if (g_pVSSClient && g_pVSSClient->IsInitialized()) { - vss = "VSS "; - } -#endif foreach_jcr(njcr) { bstrftime_nc(dt, sizeof(dt), njcr->start_time); if (njcr->JobId == 0) { - len = Mmsg(msg, _("Director connected at: %s\n"), dt); + len = Mmsg(msg, _("Director connected %sat: %s\n"), + (njcr->dir_bsock && njcr->dir_bsock->tls)?_("using TLS "):"", + dt); } else { len = Mmsg(msg, _("JobId %d Job %s is running.\n"), njcr->JobId, njcr->Job); @@ -230,12 +173,13 @@ static void list_running_jobs_plain(STATUS_PKT *sp) /* total bps (AveBytes/sec) since start of job */ total_bps = njcr->JobBytes / total_sec; len = Mmsg(msg, _(" Files=%s Bytes=%s AveBytes/sec=%s LastBytes/sec=%s Errors=%d\n" - " Bwlimit=%s\n"), + " Bwlimit=%s ReadBytes=%s\n"), edit_uint64_with_commas(njcr->JobFiles, b1), edit_uint64_with_commas(njcr->JobBytes, b2), edit_uint64_with_commas(total_bps, b3), edit_uint64_with_commas(inst_bps, b4), - njcr->JobErrors, edit_uint64_with_commas(njcr->max_bandwidth, b5)); + njcr->JobErrors, edit_uint64_with_commas(njcr->max_bandwidth, b5), + edit_uint64_with_commas(njcr->ReadBytes, b6)); sendit(msg.c_str(), len, sp); if (njcr->is_JobType(JT_RESTORE) && njcr->ExpectedFiles > 0) { @@ -264,8 +208,9 @@ static void list_running_jobs_plain(STATUS_PKT *sp) found = true; if (njcr->store_bsock) { - len = Mmsg(msg, " SDReadSeqNo=%" lld " fd=%d\n", - njcr->store_bsock->read_seqno, njcr->store_bsock->m_fd); + len = Mmsg(msg, " SDReadSeqNo=%" lld " fd=%d SDtls=%d\n", + njcr->store_bsock->read_seqno, njcr->store_bsock->m_fd, + (njcr->store_bsock->tls)?1:0); sendit(msg.c_str(), len, sp); } else { len = Mmsg(msg, _(" SDSocket closed.\n")); @@ -281,79 +226,9 @@ static void list_running_jobs_plain(STATUS_PKT *sp) sendit(_("====\n"), 5, sp); } -static void list_running_jobs_api(STATUS_PKT *sp) -{ - int sec, bps; - POOL_MEM msg(PM_MESSAGE); - char b1[32], b2[32], b3[32]; - int len; - JCR *njcr; - char dt[MAX_TIME_LENGTH]; - /* - * List running jobs for Bat/Bweb (simple to parse) - */ - int vss = 0; -#ifdef WIN32_VSS - if (g_pVSSClient && g_pVSSClient->IsInitialized()) { - vss = 1; - } -#endif - foreach_jcr(njcr) { - bstrutime(dt, sizeof(dt), njcr->start_time); - if (njcr->JobId == 0) { - len = Mmsg(msg, "DirectorConnected=%s\n", dt); - } else { - len = Mmsg(msg, "JobId=%d\n Job=%s\n", - njcr->JobId, njcr->Job); - sendit(msg.c_str(), len, sp); - len = Mmsg(msg," VSS=%d\n Level=%c\n JobType=%c\n JobStarted=%s\n", - vss, njcr->getJobLevel(), - njcr->getJobType(), dt); - } - sendit(msg.c_str(), len, sp); - if (njcr->JobId == 0) { - continue; - } - sec = time(NULL) - njcr->start_time; - if (sec <= 0) { - sec = 1; - } - bps = (int)(njcr->JobBytes / sec); - len = Mmsg(msg, " Files=%s\n Bytes=%s\n Bytes/sec=%s\n Errors=%d\n", - edit_uint64(njcr->JobFiles, b1), - edit_uint64(njcr->JobBytes, b2), - edit_uint64(bps, b3), - njcr->JobErrors); - sendit(msg.c_str(), len, sp); - len = Mmsg(msg, " Files Examined=%s\n", - edit_uint64(njcr->num_files_examined, b1)); - sendit(msg.c_str(), len, sp); - if (njcr->JobFiles > 0) { - njcr->lock(); - len = Mmsg(msg, " Processing file=%s\n", njcr->last_fname); - njcr->unlock(); - sendit(msg.c_str(), len, sp); - } - - if (njcr->store_bsock) { - len = Mmsg(msg, " SDReadSeqNo=%" lld "\n fd=%d\n", - njcr->store_bsock->read_seqno, njcr->store_bsock->m_fd); - sendit(msg.c_str(), len, sp); - } else { - len = Mmsg(msg, _(" SDSocket=closed\n")); - sendit(msg.c_str(), len, sp); - } - } - endeach_jcr(njcr); -} - static void list_running_jobs(STATUS_PKT *sp) { - if (sp->api) { - list_running_jobs_api(sp); - } else { - list_running_jobs_plain(sp); - } + list_running_jobs_plain(sp); } /* diff --git a/bacula/src/filed/verify.c b/bacula/src/filed/verify.c index d4350f0930..1f0717b2cb 100644 --- a/bacula/src/filed/verify.c +++ b/bacula/src/filed/verify.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula File Daemon verify.c Verify files. @@ -23,12 +27,6 @@ #include "bacula.h" #include "filed.h" -#ifdef HAVE_DARWIN_OS -const bool have_darwin_os = true; -#else -const bool have_darwin_os = false; -#endif - static int verify_file(JCR *jcr, FF_PKT *ff_pkt, bool); static int read_digest(BFILE *bfd, DIGEST *digest, JCR *jcr); @@ -285,9 +283,8 @@ int digest_file(JCR *jcr, FF_PKT *ff_pkt, DIGEST *digest) Dmsg0(50, "=== digest_file\n"); binit(&bfd); - if (ff_pkt->statp.st_size > 0 || - ff_pkt->type == FT_RAW || - ff_pkt->type == FT_FIFO) { + if (ff_pkt->statp.st_size > 0 || ff_pkt->type == FT_RAW + || ff_pkt->type == FT_FIFO) { int noatime = ff_pkt->flags & FO_NOATIME ? O_NOATIME : 0; if ((bopen(&bfd, ff_pkt->fname, O_RDONLY | O_BINARY | noatime, 0)) < 0) { ff_pkt->ff_errno = errno; @@ -302,27 +299,26 @@ int digest_file(JCR *jcr, FF_PKT *ff_pkt, DIGEST *digest) bclose(&bfd); } - if (have_darwin_os) { - /* Open resource fork if necessary */ - if (ff_pkt->flags & FO_HFSPLUS && ff_pkt->hfsinfo.rsrclength > 0) { - if (bopen_rsrc(&bfd, ff_pkt->fname, O_RDONLY | O_BINARY, 0) < 0) { - ff_pkt->ff_errno = errno; - berrno be; - Jmsg(jcr, M_ERROR, -1, _(" Cannot open resource fork for %s: ERR=%s.\n"), - ff_pkt->fname, be.bstrerror()); - if (is_bopen(&ff_pkt->bfd)) { - bclose(&ff_pkt->bfd); - } - return 1; +#ifdef HAVE_DARWIN_OS + /* Open resource fork if necessary */ + if (ff_pkt->flags & FO_HFSPLUS && ff_pkt->hfsinfo.rsrclength > 0) { + if (bopen_rsrc(&bfd, ff_pkt->fname, O_RDONLY | O_BINARY, 0) < 0) { + ff_pkt->ff_errno = errno; + berrno be; + Jmsg(jcr, M_ERROR, -1, _(" Cannot open resource fork for %s: ERR=%s.\n"), + ff_pkt->fname, be.bstrerror()); + if (is_bopen(&ff_pkt->bfd)) { + bclose(&ff_pkt->bfd); } - read_digest(&bfd, digest, jcr); - bclose(&bfd); - } - - if (digest && ff_pkt->flags & FO_HFSPLUS) { - crypto_digest_update(digest, (uint8_t *)ff_pkt->hfsinfo.fndrinfo, 32); - } - } + return 1; + } + read_digest(&bfd, digest, jcr); + bclose(&bfd); + } + if (digest && ff_pkt->flags & FO_HFSPLUS) { + crypto_digest_update(digest, (uint8_t *)ff_pkt->hfsinfo.fndrinfo, 32); + } +#endif return 0; } diff --git a/bacula/src/filed/verify_vol.c b/bacula/src/filed/verify_vol.c index aba6650500..e29a7dcfa5 100644 --- a/bacula/src/filed/verify_vol.c +++ b/bacula/src/filed/verify_vol.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula File Daemon verify-vol.c Verify files on a Volume @@ -39,7 +43,7 @@ void do_verify_volume(JCR *jcr) BSOCK *sd, *dir; POOLMEM *fname; /* original file name */ POOLMEM *lname; /* link name */ - int32_t stream; + int32_t stream, full_stream; uint32_t size; uint32_t VolSessionId, VolSessionTime, file_index; uint32_t record_file_index; @@ -73,32 +77,37 @@ void do_verify_volume(JCR *jcr) fname = get_pool_memory(PM_FNAME); lname = get_pool_memory(PM_FNAME); + GetMsg *fdmsg = New(GetMsg(jcr, sd, rec_header, GETMSG_MAX_MSG_SIZE)); + fdmsg->start_read_sock(); + bmessage *bmsg = New(bmessage(GETMSG_MAX_MSG_SIZE)); + /* * Get a record from the Storage daemon */ - while (bget_msg(sd) >= 0 && !job_canceled(jcr)) { + while (fdmsg->bget_msg(&bmsg) >= 0 && !job_canceled(jcr)) { /* * First we expect a Stream Record Header */ - if (sscanf(sd->msg, rec_header, &VolSessionId, &VolSessionTime, &file_index, - &stream, &size) != 5) { - Jmsg1(jcr, M_FATAL, 0, _("Record header scan error: %s\n"), sd->msg); + if (sscanf(bmsg->rbuf, rec_header, &VolSessionId, &VolSessionTime, &file_index, + &full_stream, &size) != 5) { + Jmsg1(jcr, M_FATAL, 0, _("Record header scan error: %s\n"), bmsg->rbuf); goto bail_out; } - Dmsg3(30, "Got hdr: FilInx=%d Stream=%d size=%d.\n", file_index, stream, size); + stream = full_stream & STREAMMASK_TYPE; + Dmsg4(30, "Got hdr: FilInx=%d FullStream=%d Stream=%d size=%d.\n", file_index, full_stream, stream, size); /* * Now we expect the Stream Data */ - if (bget_msg(sd) < 0) { + if (fdmsg->bget_msg(&bmsg) < 0) { Jmsg1(jcr, M_FATAL, 0, _("Data record error. ERR=%s\n"), sd->bstrerror()); goto bail_out; } - if (size != ((uint32_t)sd->msglen)) { - Jmsg2(jcr, M_FATAL, 0, _("Actual data size %d not same as header %d\n"), sd->msglen, size); + if (size != ((uint32_t)bmsg->origlen)) { + Jmsg2(jcr, M_FATAL, 0, _("Actual data size %d not same as header %d\n"), bmsg->origlen, size); goto bail_out; } - Dmsg2(30, "Got stream data %s, len=%d\n", stream_to_ascii(stream), sd->msglen); + Dmsg2(30, "Got stream data %s, len=%d\n", stream_to_ascii(stream), bmsg->rbuflen); /* File Attributes stream */ switch (stream) { @@ -108,12 +117,12 @@ void do_verify_volume(JCR *jcr) Dmsg0(400, "Stream=Unix Attributes.\n"); - if ((int)sizeof_pool_memory(fname) < sd->msglen) { - fname = realloc_pool_memory(fname, sd->msglen + 1); + if ((int)sizeof_pool_memory(fname) < bmsg->rbuflen) { + fname = realloc_pool_memory(fname, bmsg->rbuflen + 1); } - if ((int)sizeof_pool_memory(lname) < sd->msglen) { - lname = realloc_pool_memory(lname, sd->msglen + 1); + if ((int)sizeof_pool_memory(lname) < bmsg->rbuflen) { + lname = realloc_pool_memory(lname, bmsg->rbuflen + 1); } *fname = 0; *lname = 0; @@ -127,13 +136,13 @@ void do_verify_volume(JCR *jcr) * Link name (if file linked i.e. FT_LNK) * Extended Attributes (if Win32) */ - if (sscanf(sd->msg, "%d %d", &record_file_index, &type) != 2) { - Jmsg(jcr, M_FATAL, 0, _("Error scanning record header: %s\n"), sd->msg); + if (sscanf(bmsg->rbuf, "%d %d", &record_file_index, &type) != 2) { + Jmsg(jcr, M_FATAL, 0, _("Error scanning record header: %s\n"), bmsg->rbuf); Dmsg0(0, "\nError scanning header\n"); goto bail_out; } Dmsg2(30, "Got Attr: FilInx=%d type=%d\n", record_file_index, type); - ap = sd->msg; + ap = bmsg->rbuf; while (*ap++ != ' ') /* skip record file index */ ; while (*ap++ != ' ') /* skip type */ @@ -197,7 +206,7 @@ void do_verify_volume(JCR *jcr) break; case STREAM_MD5_DIGEST: - bin_to_base64(digest, sizeof(digest), (char *)sd->msg, CRYPTO_DIGEST_MD5_SIZE, true); + bin_to_base64(digest, sizeof(digest), (char *)bmsg->rbuf, CRYPTO_DIGEST_MD5_SIZE, true); Dmsg2(400, "send inx=%d MD5=%s\n", jcr->JobFiles, digest); dir->fsend("%d %d %s *MD5-%d*", jcr->JobFiles, STREAM_MD5_DIGEST, digest, jcr->JobFiles); @@ -205,7 +214,7 @@ void do_verify_volume(JCR *jcr) break; case STREAM_SHA1_DIGEST: - bin_to_base64(digest, sizeof(digest), (char *)sd->msg, CRYPTO_DIGEST_SHA1_SIZE, true); + bin_to_base64(digest, sizeof(digest), (char *)bmsg->rbuf, CRYPTO_DIGEST_SHA1_SIZE, true); Dmsg2(400, "send inx=%d SHA1=%s\n", jcr->JobFiles, digest); dir->fsend("%d %d %s *SHA1-%d*", jcr->JobFiles, STREAM_SHA1_DIGEST, digest, jcr->JobFiles); @@ -213,7 +222,7 @@ void do_verify_volume(JCR *jcr) break; case STREAM_SHA256_DIGEST: - bin_to_base64(digest, sizeof(digest), (char *)sd->msg, CRYPTO_DIGEST_SHA256_SIZE, true); + bin_to_base64(digest, sizeof(digest), (char *)bmsg->rbuf, CRYPTO_DIGEST_SHA256_SIZE, true); Dmsg2(400, "send inx=%d SHA256=%s\n", jcr->JobFiles, digest); dir->fsend("%d %d %s *SHA256-%d*", jcr->JobFiles, STREAM_SHA256_DIGEST, digest, jcr->JobFiles); @@ -221,7 +230,7 @@ void do_verify_volume(JCR *jcr) break; case STREAM_SHA512_DIGEST: - bin_to_base64(digest, sizeof(digest), (char *)sd->msg, CRYPTO_DIGEST_SHA512_SIZE, true); + bin_to_base64(digest, sizeof(digest), (char *)bmsg->rbuf, CRYPTO_DIGEST_SHA512_SIZE, true); Dmsg2(400, "send inx=%d SHA512=%s\n", jcr->JobFiles, digest); dir->fsend("%d %d %s *SHA512-%d*", jcr->JobFiles, STREAM_SHA512_DIGEST, digest, jcr->JobFiles); @@ -251,6 +260,11 @@ bail_out: jcr->setJobStatus(JS_ErrorTerminated); ok_out: + Dmsg0(215, "wait BufferedMsg\n"); + fdmsg->wait_read_sock(); + delete bmsg; + free_GetMsg(fdmsg); + if (jcr->compress_buf) { free(jcr->compress_buf); jcr->compress_buf = NULL; diff --git a/bacula/src/filed/xattr.c b/bacula/src/filed/xattr.c index 64d3f9c7ff..9240544654 100644 --- a/bacula/src/filed/xattr.c +++ b/bacula/src/filed/xattr.c @@ -1,188 +1,186 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2008-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ -/** - * Functions to handle Extended Attributes for bacula. - * - * Extended Attributes are so OS specific we only restore Extended Attributes if - * they were saved using a filed on the same platform. - * - * Currently we support the following OSes: - * - AIX (Extended Attributes) - * - Darwin (Extended Attributes) - * - FreeBSD (Extended Attributes) - * - GNU HURD (Extended Attributes) - * - IRIX (Extended Attributes) - * - Linux (Extended Attributes) - * - NetBSD (Extended Attributes) - * - OpenBSD (Extended Attributes) - * (As it seems either they never implemented xattr or they are removed - * the support as it stated it was in version 3.1 but the current syscall - * tabled shows the extattr_ functions are not implemented. So as such we - * might eventually support xattr on OpenBSD when they implemented them using - * the same interface as FreeBSD and NetBSD. - * - Solaris (Extended Attributes and Extensible Attributes) - * - Tru64 (Extended Attributes) +/* + * Functions to handle Extended Attributes for bacula. + * + * Extended Attributes are so OS specific we only restore Extended Attributes if + * they were saved using a filed on the same platform. + * + * Currently we support the following OSes: + * - AIX (Extended Attributes) + * - Darwin (Extended Attributes) + * - FreeBSD (Extended Attributes) + * - GNU HURD (Extended Attributes) + * - IRIX (Extended Attributes) + * - Linux (Extended Attributes) + * - NetBSD (Extended Attributes) + * - OpenBSD (Extended Attributes) + * (As it seems either they never implemented xattr or they are removed + * the support as it stated it was in version 3.1 but the current syscall + * tabled shows the extattr_ functions are not implemented. So as such we + * might eventually support xattr on OpenBSD when they implemented them using + * the same interface as FreeBSD and NetBSD. + * - Solaris (Extended Attributes and Extensible Attributes) + * - Tru64 (Extended Attributes) * - * Written by Marco van Wieringen, November 2008 - * Major overhaul January 2012 + June 2012 - */ - -#include "bacula.h" -#include "filed.h" - -#if !defined(HAVE_XATTR) -/** - * Entry points when compiled without support for XATTRs or on an unsupported platform. - */ -bxattr_exit_code build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) + * Written by Marco van Wieringen, November 2008 + * Major overhaul January 2012 + June 2012 + * Simplfied by Kern Sibbald, June 2015 + */ + +#include "bacula.h" +#include "filed.h" + +#ifndef HAVE_XATTR +/* + * Entry points when compiled without support for XATTRs or on an unsupported platform. + */ +bool backup_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) { - return bxattr_exit_fatal; + Jmsg(jcr, M_FATAL, 0, "XATTR backup requested but not configured in Bacula.\n"); + return false; } -bxattr_exit_code parse_xattr_streams(JCR *jcr, - int stream, - char *content, - uint32_t content_length) +bxattr_rtn_code restore_xattr_streams(JCR *jcr, int stream, char *content, + uint32_t content_length) { - return bxattr_exit_fatal; + return bxattr_rtn_fatal; } -#else -/** +#else +/* * Send a XATTR stream to the SD. - */ -static bxattr_exit_code send_xattr_stream(JCR *jcr, int stream) -{ + */ +static bxattr_rtn_code send_xattr_stream(JCR *jcr, int stream) +{ BSOCK *sd = jcr->store_bsock; POOLMEM *msgsave; -#ifdef FD_NO_SEND_TEST - return bxattr_exit_ok; -#endif - /* - * Sanity check - */ - if (jcr->xattr_data->u.build->content_length <= 0) { - return bxattr_exit_ok; - } +#ifdef FD_NO_SEND_TEST + return bxattr_rtn_ok; +#endif - /* - * Send header - */ + /* + * Sanity check + */ + if (jcr->xattr_ctx->content_length <= 0) { + return bxattr_rtn_ok; + } + + /* + * Send header + */ if (!sd->fsend("%ld %d 0", jcr->JobFiles, stream)) { Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), sd->bstrerror()); - return bxattr_exit_fatal; - } - - /* - * Send the buffer to the storage deamon - */ - Dmsg1(400, "Backing up XATTR <%s>\n", jcr->xattr_data->u.build->content); + return bxattr_rtn_fatal; + } + + /* + * Send the buffer to the storage deamon + */ + Dmsg1(400, "Backing up XATTR <%s>\n", jcr->xattr_ctx->content); msgsave = sd->msg; - sd->msg = jcr->xattr_data->u.build->content; - sd->msglen = jcr->xattr_data->u.build->content_length; + sd->msg = jcr->xattr_ctx->content; + sd->msglen = jcr->xattr_ctx->content_length; if (!sd->send()) { sd->msg = msgsave; sd->msglen = 0; Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), sd->bstrerror()); - return bxattr_exit_fatal; - } - + return bxattr_rtn_fatal; + } + jcr->JobBytes += sd->msglen; sd->msg = msgsave; if (!sd->signal(BNET_EOD)) { Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), sd->bstrerror()); - return bxattr_exit_fatal; - } + return bxattr_rtn_fatal; + } Dmsg1(200, "XATTR of file: %s successfully backed up!\n", jcr->last_fname); - return bxattr_exit_ok; -} - -/** - * First some generic functions for OSes that use the same xattr encoding scheme. - * Currently for all OSes except for Solaris. - */ -#if !defined(HAVE_SUN_OS) + return bxattr_rtn_ok; +} + +/* + * First some generic functions for OSes that use the same xattr encoding scheme. + * Currently for all OSes except for Solaris. + */ +#ifndef HAVE_SUN_OS static void xattr_drop_internal_table(alist *xattr_value_list) { xattr_t *current_xattr; - - /* - * Walk the list of xattrs and free allocated memory on traversing. - */ + + if (!xattr_value_list) { + return; + } + /* Walk the list of xattrs and free allocated memory. */ foreach_alist(current_xattr, xattr_value_list) { - /* - * See if we can shortcut. - */ - if (current_xattr == NULL || current_xattr->magic != XATTR_MAGIC) - break; - - free(current_xattr->name); - - if (current_xattr->value_length > 0) + if (current_xattr->magic != XATTR_MAGIC) { + continue; + } + if (current_xattr->name) { + free(current_xattr->name); + } + if (current_xattr->value && current_xattr->value_length > 0) { free(current_xattr->value); - + } free(current_xattr); } - delete xattr_value_list; } -/** - * The xattr stream for OSX, FreeBSD, Linux and NetBSD is a serialized stream of bytes - * which encodes one or more xattr_t structures. - * - * The Serialized stream consists of the following elements: - * magic - A magic string which makes it easy to detect any binary incompatabilites - * name_length - The length of the following xattr name - * name - The name of the extended attribute - * value_length - The length of the following xattr data - * value - The actual content of the extended attribute - * - * This is repeated 1 or more times. - * - */ -static uint32_t serialize_xattr_stream(JCR *jcr, - uint32_t expected_serialize_len, +/* + * The xattr stream for OSX, FreeBSD, Linux and NetBSD is a serialized stream of bytes + * which encodes one or more xattr_t structures. + * + * The Serialized stream consists of the following elements: + * magic - A magic string which makes it easy to detect any binary incompatabilites + * name_length - The length of the following xattr name + * name - The name of the extended attribute + * value_length - The length of the following xattr data + * value - The actual content of the extended attribute + * + * This is repeated 1 or more times. + * + */ +static uint32_t serialize_xattr_stream(JCR *jcr, uint32_t expected_serialize_len, alist *xattr_value_list) -{ +{ xattr_t *current_xattr; ser_declare; - - /* - * Make sure the serialized stream fits in the poolmem buffer. - * We allocate some more to be sure the stream is gonna fit. - */ - jcr->xattr_data->u.build->content = - check_pool_memory_size(jcr->xattr_data->u.build->content, - expected_serialize_len + 10); - ser_begin(jcr->xattr_data->u.build->content, - expected_serialize_len + 10); - - /* - * Walk the list of xattrs and serialize the data. - */ + + /* + * Make sure the serialized stream fits in the poolmem buffer. + * We allocate some more to be sure the stream is gonna fit. + */ + jcr->xattr_ctx->content = + check_pool_memory_size(jcr->xattr_ctx->content, expected_serialize_len + 10); + ser_begin(jcr->xattr_ctx->content, expected_serialize_len + 10); + + /* + * Walk the list of xattrs and serialize the data. + */ foreach_alist(current_xattr, xattr_value_list) { - /* - * See if we can shortcut. - */ - if (current_xattr == NULL || current_xattr->magic != XATTR_MAGIC) - break; + if (current_xattr->magic != XATTR_MAGIC) { + continue; /* Don't write invalid xattr */ + } ser_uint32(current_xattr->magic); ser_uint32(current_xattr->name_length); @@ -191,7 +189,6 @@ static uint32_t serialize_xattr_stream(JCR *jcr, ser_uint32(current_xattr->value_length); if (current_xattr->value_length > 0 && current_xattr->value) { ser_bytes(current_xattr->value, current_xattr->value_length); - Dmsg3(100, "Backup xattr named %s, value %*s\n", current_xattr->name, current_xattr->value, current_xattr->value); } else { @@ -199,14 +196,12 @@ static uint32_t serialize_xattr_stream(JCR *jcr, } } - ser_end(jcr->xattr_data->u.build->content, expected_serialize_len + 10); - jcr->xattr_data->u.build->content_length = - ser_length(jcr->xattr_data->u.build->content); - - return jcr->xattr_data->u.build->content_length; + ser_end(jcr->xattr_ctx->content, expected_serialize_len + 10); + jcr->xattr_ctx->content_length = ser_length(jcr->xattr_ctx->content); + return jcr->xattr_ctx->content_length; } -static bxattr_exit_code unserialize_xattr_stream(JCR *jcr, +static bxattr_rtn_code unserialize_xattr_stream(JCR *jcr, char *content, uint32_t content_length, alist *xattr_value_list) @@ -214,67 +209,63 @@ static bxattr_exit_code unserialize_xattr_stream(JCR *jcr, unser_declare; xattr_t *current_xattr; - /** - * Parse the stream and call restore_xattr_on_file for each extended attribute. + /* + * Restore the stream and call restore_xattr_on_file for each extended attribute. * * Start unserializing the data. We keep on looping while we have not * unserialized all bytes in the stream. */ unser_begin(content, content_length); while (unser_length(content) < content_length) { - /* - * First make sure the magic is present. This way we can easily catch corruption. - * Any missing MAGIC is fatal we do NOT try to continue. - */ + /* + * First make sure the magic is present. This way we can easily catch corruption. + * Any missing MAGIC is fatal we do NOT try to continue. + */ current_xattr = (xattr_t *)malloc(sizeof(xattr_t)); unser_uint32(current_xattr->magic); if (current_xattr->magic != XATTR_MAGIC) { - Mmsg1(jcr->errmsg, - _("Illegal xattr stream, no XATTR_MAGIC on file \"%s\"\n"), - jcr->last_fname); - Dmsg1(100, "Illegal xattr stream, no XATTR_MAGIC on file \"%s\"\n", + Mmsg1(jcr->errmsg, _("Invalid xattr stream, no XATTR_MAGIC on file \"%s\"\n"), jcr->last_fname); + Dmsg1(100, "%s", jcr->errmsg); free(current_xattr); - return bxattr_exit_error; + return bxattr_rtn_error; } - - /* - * Decode the valuepair. First decode the length of the name. - */ + + /* + * Decode the valuepair. First decode the length of the name. + */ unser_uint32(current_xattr->name_length); if (current_xattr->name_length == 0) { - Mmsg1(jcr->errmsg, - _("Illegal xattr stream, xattr name length <= 0 on file \"%s\"\n"), - jcr->last_fname); - Dmsg1(100, "Illegal xattr stream, xattr name length <= 0 on file \"%s\"\n", + Mmsg1(jcr->errmsg, _("Invalid xattr stream, xattr name length <= 0 on file \"%s\"\n"), jcr->last_fname); + Dmsg1(100, "%s", jcr->errmsg); free(current_xattr); - return bxattr_exit_error; + return bxattr_rtn_error; } - - /* - * Allocate room for the name and decode its content. - */ + + /* + * Allocate room for the name and decode its content. + */ current_xattr->name = (char *)malloc(current_xattr->name_length + 1); unser_bytes(current_xattr->name, current_xattr->name_length); - - /* - * The xattr_name needs to be null terminated. - */ + + /* + * The xattr_name needs to be null terminated. + */ current_xattr->name[current_xattr->name_length] = '\0'; - - /* - * Decode the value length. - */ + + /* + * Decode the value length. + */ unser_uint32(current_xattr->value_length); - + if (current_xattr->value_length > 0) { - /* - * Allocate room for the value and decode its content. - */ + /* + * Allocate room for the value and decode its content. + */ current_xattr->value = (char *)malloc(current_xattr->value_length); unser_bytes(current_xattr->value, current_xattr->value_length); - + Dmsg3(100, "Restoring xattr named %s, value %*s\n", current_xattr->name, current_xattr->value, current_xattr->value); } else { @@ -286,15 +277,15 @@ static bxattr_exit_code unserialize_xattr_stream(JCR *jcr, } unser_end(content, content_length); - return bxattr_exit_ok; + return bxattr_rtn_ok; } #endif -/* +/* * This is a supported OS, See what kind of interface we should use. - */ + */ #if defined(HAVE_AIX_OS) - + #if (!defined(HAVE_LISTEA) && !defined(HAVE_LLISTEA)) || \ (!defined(HAVE_GETEA) && !defined(HAVE_LGETEA)) || \ (!defined(HAVE_SETEA) && !defined(HAVE_LSETEA)) @@ -327,58 +318,45 @@ static int os_default_xattr_streams[1] = { #define llistea listea #endif -static bxattr_exit_code aix_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) +static bxattr_rtn_code aix_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) { char *bp; bool skip_xattr; char *xattr_list = NULL; int cnt, xattr_count = 0; uint32_t name_length; - int32_t xattr_list_len, - xattr_value_len; + int32_t xattr_list_len, xattr_value_len; uint32_t expected_serialize_len = 0; xattr_t *current_xattr; alist *xattr_value_list = NULL; - bxattr_exit_code retval = bxattr_exit_error; + bxattr_rtn_code retval = bxattr_rtn_error; /* * First get the length of the available list with extended attributes. */ xattr_list_len = llistea(jcr->last_fname, NULL, 0); - switch (xattr_list_len) { - case -1: { + if (xattr_list_len < 0) { berrno be; - - switch (errno) { - case ENOENT: - case EFORMAT: - retval = bxattr_exit_ok; - goto bail_out; - case ENOTSUP: + if (errno == ENOENT || errno == EFORMAT) { + retval = bxattr_rtn_ok; + } else if (errno == ENOTSUP) { /* * If the filesystem reports it doesn't support XATTRs we clear the * BXATTR_FLAG_SAVE_NATIVE flag so we skip XATTR saves on all other files * on the same filesystem. The BXATTR_FLAG_SAVE_NATIVE flags gets sets again * when we change from one filesystem to an other. */ - jcr->xattr_data->flags &= ~BXATTR_FLAG_SAVE_NATIVE; - retval = bxattr_exit_ok; - goto bail_out; - default: - Mmsg2(jcr->errmsg, - _("llistea error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "llistea error file=%s ERR=%s\n", + jcr->xattr_ctx->flags &= ~BXATTR_FLAG_SAVE_NATIVE; + retval = bxattr_rtn_ok; + } else { + Mmsg2(jcr->errmsg, _("XATTR llistea error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); } - break; - } - case 0: - retval = bxattr_exit_ok; - goto bail_out; - default: - break; + goto get_out; + } else if (xattr_list_len == 0) { + retval = bxattr_rtn_ok; + goto get_out; } /* @@ -391,27 +369,16 @@ static bxattr_exit_code aix_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) * Get the actual list of extended attributes names for a file. */ xattr_list_len = llistea(jcr->last_fname, xattr_list, xattr_list_len); - switch (xattr_list_len) { - case -1: { + if (xattr_list_len < 0) { berrno be; - - switch (errno) { - case ENOENT: - case EFORMAT: - retval = bxattr_exit_ok; - goto bail_out; - default: - Mmsg2(jcr->errmsg, - _("llistea error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "llistea error file=%s ERR=%s\n", + if (errno == ENOENT || errno == EFORMAT) { + retval = bxattr_rtn_ok; + } else { + Mmsg2(jcr->errmsg, _("XATTR llistea error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); } - break; - } - default: - break; + goto get_out; } xattr_list[xattr_list_len] = '\0'; @@ -419,8 +386,7 @@ static bxattr_exit_code aix_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) * Walk the list of extended attributes names and retrieve the data. * We already count the bytes needed for serializing the stream later on. */ - for (bp = xattr_list; - (bp - xattr_list) + 1 < xattr_list_len; + for (bp = xattr_list; (bp - xattr_list) + 1 < xattr_list_len; bp = strchr(bp, '\0') + 1) { skip_xattr = false; @@ -441,31 +407,20 @@ static bxattr_exit_code aix_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) * First see how long the value is for the extended attribute. */ xattr_value_len = lgetea(jcr->last_fname, bp, NULL, 0); - switch (xattr_value_len) { - case -1: { + if (xattr_value_len < 0) { berrno be; - - switch (errno) { - case ENOENT: - case EFORMAT: - retval = bxattr_exit_ok; - goto bail_out; - default: - Mmsg2(jcr->errmsg, - _("lgetea error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "lgetea error file=%s ERR=%s\n", + if (errno == ENOENT || errno == EFORMAT) { + retval = bxattr_rtn_ok; + } else { + Mmsg2(jcr->errmsg, _("XATTR lgetea error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); } - break; - } - default: - break; + goto get_out; } /* - * Each xattr valuepair starts with a magic so we can parse it easier. + * Each xattr valuepair starts with a magic so we can restore it easier. */ current_xattr = (xattr_t *)malloc(sizeof(xattr_t)); memset(current_xattr, 0, sizeof(xattr_t)); @@ -482,13 +437,11 @@ static bxattr_exit_code aix_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) expected_serialize_len += sizeof(current_xattr->name_length) + current_xattr->name_length; - switch (xattr_value_len) { - case 0: + if (xattr_value_len == 0) { current_xattr->value = NULL; current_xattr->value_length = 0; expected_serialize_len += sizeof(current_xattr->value_length); - break; - default: + } else { /* * Allocate space for storing the value. */ @@ -498,19 +451,12 @@ static bxattr_exit_code aix_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) xattr_value_len = lgetea(jcr->last_fname, bp, current_xattr->value, xattr_value_len); if (xattr_value_len < 0) { berrno be; - - switch (errno) { - case ENOENT: - case EFORMAT: - retval = bxattr_exit_ok; - break; - default: - Mmsg2(jcr->errmsg, - _("lgetea error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "lgetea error file=%s ERR=%s\n", + if (errno == ENOENT || errno == EFORMAT) { + retval = bxattr_rtn_ok; + } else { + Mmsg2(jcr->errmsg, _("XATTR lgetea error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - break; + Dmsg1(100, "%s", jcr->errmsg); } /* @@ -519,7 +465,7 @@ static bxattr_exit_code aix_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) free(current_xattr->value); free(current_xattr->name); free(current_xattr); - goto bail_out; + goto get_out; } /* * Store the actual length of the value. @@ -527,7 +473,6 @@ static bxattr_exit_code aix_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) current_xattr->value_length = xattr_value_len; expected_serialize_len += sizeof(current_xattr->value_length) + current_xattr->value_length; - break; } if (xattr_value_list == NULL) { @@ -540,11 +485,11 @@ static bxattr_exit_code aix_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) /* * Protect ourself against things getting out of hand. */ - if (expected_serialize_len >= MAX_XATTR_STREAM) { + if (expected_serialize_len >= MAX_XATTR_LENGTH) { Mmsg2(jcr->errmsg, _("Xattr stream on file \"%s\" exceeds maximum size of %d bytes\n"), - jcr->last_fname, MAX_XATTR_STREAM); - goto bail_out; + jcr->last_fname, MAX_XATTR_LENGTH); + goto get_out; } } @@ -555,18 +500,13 @@ static bxattr_exit_code aix_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) * If we found any xattr send them to the SD. */ if (xattr_count > 0) { - /* - * Serialize the datastream. - */ - if (serialize_xattr_stream(jcr, - expected_serialize_len, + /* Serialize the datastream. */ + if (serialize_xattr_stream(jcr, expected_serialize_len, xattr_value_list) < expected_serialize_len) { - Mmsg1(jcr->errmsg, - _("Failed to serialize extended attributes on file \"%s\"\n"), - jcr->last_fname); - Dmsg1(100, "Failed to serialize extended attributes on file \"%s\"\n", + Mmsg1(jcr->errmsg, _("Failed to serialize extended attributes on file \"%s\"\n"), jcr->last_fname); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } /* @@ -574,10 +514,10 @@ static bxattr_exit_code aix_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) */ retval = send_xattr_stream(jcr, os_default_xattr_streams[0]); } else { - retval = bxattr_exit_ok; + retval = bxattr_rtn_ok; } -bail_out: +get_out: if (xattr_list != NULL) { free(xattr_list); } @@ -588,35 +528,28 @@ bail_out: return retval; } -static bxattr_exit_code aix_parse_xattr_streams(JCR *jcr, - int stream, - char *content, - uint32_t content_length) +static bxattr_rtn_code aix_restore_xattr_streams(JCR *jcr, int stream, char *content, + uint32_t content_length) { xattr_t *current_xattr; alist *xattr_value_list; - bxattr_exit_code retval = bxattr_exit_error; + bxattr_rtn_code retval = bxattr_rtn_error; xattr_value_list = New(alist(10, not_owned_by_alist)); - if (unserialize_xattr_stream(jcr, - content, - content_length, - xattr_value_list) != bxattr_exit_ok) { - goto bail_out; + if (unserialize_xattr_stream(jcr, content, content_length, + xattr_value_list) != bxattr_rtn_ok) { + goto get_out; } foreach_alist(current_xattr, xattr_value_list) { - if (lsetea(jcr->last_fname, - current_xattr->name, - current_xattr->value, + if (lsetea(jcr->last_fname, current_xattr->name, current_xattr->value, current_xattr->value_length, 0) != 0) { berrno be; - switch (errno) { case ENOENT: case EFORMAT: - goto bail_out; + break; case ENOTSUP: /* * If the filesystem reports it doesn't support XATTRs we clear @@ -625,36 +558,34 @@ static bxattr_exit_code aix_parse_xattr_streams(JCR *jcr, * BXATTR_FLAG_RESTORE_NATIVE flags gets sets again when we * change from one filesystem to an other. */ - jcr->xattr_data->flags &= ~BXATTR_FLAG_RESTORE_NATIVE; - goto bail_out; + jcr->xattr_ctx->flags &= ~BXATTR_FLAG_RESTORE_NATIVE; + break; default: - Mmsg2(jcr->errmsg, - _("lsetea error on file \"%s\": ERR=%s\n"), + Mmsg2(jcr->errmsg, _("XATTR lsetea error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg2(100, "lsetea error file=%s ERR=%s\n", - jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + break; } + goto get_out; } } + retval = bxattr_rtn_ok; - retval = bxattr_exit_ok; - -bail_out: +get_out: xattr_drop_internal_table(xattr_value_list); return retval; } /* - * Function pointers to the build and parse function to use for these xattrs. + * Function pointers to the build and restore function to use for these xattrs. */ -static bxattr_exit_code (*os_build_xattr_streams) +static bxattr_rtn_code (*os_backup_xattr_streams) (JCR *jcr, FF_PKT *ff_pkt) = aix_xattr_build_streams; -static bxattr_exit_code (*os_parse_xattr_streams) +static bxattr_rtn_code (*os_restore_xattr_streams) (JCR *jcr, int stream, char *content, uint32_t content_length) = - aix_parse_xattr_streams; + aix_restore_xattr_streams; #elif defined(HAVE_IRIX_OS) @@ -691,7 +622,7 @@ static xattr_naming_space xattr_naming_spaces[] = { } }; -static bxattr_exit_code irix_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) +static bxattr_rtn_code irix_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) { char dummy[32]; int cnt, length, xattr_count = 0; @@ -701,27 +632,24 @@ static bxattr_exit_code irix_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) xattr_t *current_xattr; alist *xattr_value_list = NULL; uint32_t expected_serialize_len = 0; - bxattr_exit_code retval = bxattr_exit_error; + bxattr_rtn_code retval = bxattr_rtn_error; POOLMEM *xattrbuf = get_memory(ATTR_MAX_VALUELEN); for (cnt = 0; xattr_naming_spaces[cnt].name != NULL; cnt++) { memset(&cursor, 0, sizeof(attrlist_cursor_t)); - while (1) { + for ( ;; } { if (attr_list(jcr->last_fname, xattrbuf, ATTR_MAX_VALUELEN, xattr_naming_spaces[cnt].flags, &cursor) != 0) { berrno be; - switch (errno) { case ENOENT: - retval = bxattr_exit_ok; - goto bail_out; + retval = bxattr_rtn_ok; + goto get_out; default: - Mmsg2(jcr->errmsg, - _("attr_list error on file \"%s\": ERR=%s\n"), + Mmsg2(jcr->errmsg, _("XATTR attr_list error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg2(100, "attr_list error file=%s ERR=%s\n", - jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } } @@ -740,12 +668,11 @@ static bxattr_exit_code irix_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) if (attr_get(jcr->last_fname, attrlist_ent->a_name, dummy, &length, xattr_naming_spaces[cnt].flags) != 0) { berrno be; - switch (errno) { case ENOENT: case ENOATTR: - retval = bxattr_exit_ok; - goto bail_out; + retval = bxattr_rtn_ok; + goto get_out; case E2BIG: /* * Size of the xattr is bigger then the 32 bytes dummy which is @@ -754,17 +681,15 @@ static bxattr_exit_code irix_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) */ break; default: - Mmsg2(jcr->errmsg, - _("attr_list error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "attr_list error file=%s ERR=%s\n", + Mmsg2(jcr->errmsg, _("XATTR attr_list error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } } /* - * Each xattr valuepair starts with a magic so we can parse it easier. + * Each xattr valuepair starts with a magic so we can restore it easier. */ current_xattr = (xattr_t *)malloc(sizeof(xattr_t)); memset(current_xattr, 0, sizeof(xattr_t)); @@ -797,7 +722,7 @@ static bxattr_exit_code irix_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) switch (errno) { case ENOENT: case ENOATTR: - retval = bxattr_exit_ok; + retval = bxattr_rtn_ok; break; case E2BIG: /* @@ -815,7 +740,7 @@ static bxattr_exit_code irix_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) switch (errno) { case ENOENT: case ENOATTR: - retval = bxattr_exit_ok; + retval = bxattr_rtn_ok; break; default: Mmsg2(jcr->errmsg, @@ -830,11 +755,9 @@ static bxattr_exit_code irix_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) } break; default: - Mmsg2(jcr->errmsg, - _("attr_list error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "attr_list error file=%s ERR=%s\n", + Mmsg2(jcr->errmsg, _("XATTR attr_list error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); + Dmsg1(100, "%s", jcr->errmsg); break; } @@ -844,7 +767,7 @@ static bxattr_exit_code irix_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) free(current_xattr->value); free(current_xattr->name); free(current_xattr); - goto bail_out; + goto get_out; } ok_continue: @@ -862,11 +785,11 @@ ok_continue: /* * Protect ourself against things getting out of hand. */ - if (expected_serialize_len >= MAX_XATTR_STREAM) { + if (expected_serialize_len >= MAX_XATTR_LENGTH) { Mmsg2(jcr->errmsg, - _("Xattr stream on file \"%s\" exceeds maximum size of %d bytes\n"), - jcr->last_fname, MAX_XATTR_STREAM); - goto bail_out; + _("XATTR stream on file \"%s\" exceeds maximum size of %d bytes\n"), + jcr->last_fname, MAX_XATTR_LENGTH); + goto get_out; } } @@ -883,29 +806,22 @@ ok_continue: * If we found any xattr send them to the SD. */ if (xattr_count > 0) { - /* - * Serialize the datastream. - */ - if (serialize_xattr_stream(jcr, - expected_serialize_len, + /* Serialize the XATTR */ + if (serialize_xattr_stream(jcr, expected_serialize_len, xattr_value_list) < expected_serialize_len) { - Mmsg1(jcr->errmsg, - _("Failed to serialize extended attributes on file \"%s\"\n"), + Mmsg1(jcr->errmsg, _("Failed to serialize extended attributes on file \"%s\"\n"), jcr->last_fname); - Dmsg1(100, "Failed to serialize extended attributes on file \"%s\"\n", - jcr->last_fname); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } - /* - * Send the datastream to the SD. - */ + /* Send the XATTR to the SD. */ retval = send_xattr_stream(jcr, os_default_xattr_streams[0]); } else { - retval = bxattr_exit_ok; + retval = bxattr_rtn_ok; } -bail_out: +get_out: free_pool_memory(xattrbuf); if (xattr_value_list != NULL) { @@ -915,7 +831,7 @@ bail_out: return retval; } -static bxattr_exit_code irix_parse_xattr_streams(JCR *jcr, +static bxattr_rtn_code irix_restore_xattr_streams(JCR *jcr, int stream, char *content, uint32_t content_length) @@ -924,15 +840,15 @@ static bxattr_exit_code irix_parse_xattr_streams(JCR *jcr, int cnt, cmp_size, name_space_index, flags; xattr_t *current_xattr; alist *xattr_value_list; - bxattr_exit_code retval = bxattr_exit_error; + bxattr_rtn_code retval = bxattr_rtn_error; xattr_value_list = New(alist(10, not_owned_by_alist)); if (unserialize_xattr_stream(jcr, content, content_length, - xattr_value_list) != bxattr_exit_ok) { - goto bail_out; + xattr_value_list) != bxattr_rtn_ok) { + goto get_out; } foreach_alist(current_xattr, xattr_value_list) { @@ -955,11 +871,10 @@ static bxattr_exit_code irix_parse_xattr_streams(JCR *jcr, */ if (name_space_index == 0) { Mmsg2(jcr->errmsg, - _("Received illegal xattr named %s on file \"%s\"\n"), - current_xattr->name, jcr->last_fname); - Dmsg2(100, "Received illegal xattr named %s on file \"%s\"\n", + _("Received invalid xattr named %s on file \"%s\"\n"), current_xattr->name, jcr->last_fname); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } /* @@ -973,8 +888,8 @@ static bxattr_exit_code irix_parse_xattr_streams(JCR *jcr, switch (errno) { case ENOENT: - retval = bxattr_exit_ok; - goto bail_out; + retval = bxattr_rtn_ok; + goto get_out; case EEXIST: /* * The xattr already exists we need to replace it. @@ -984,46 +899,42 @@ static bxattr_exit_code irix_parse_xattr_streams(JCR *jcr, current_xattr->value_length, flags) != 0) { switch (errno) { case ENOENT: - retval = bxattr_exit_ok; - goto bail_out; + retval = bxattr_rtn_ok; + goto get_out; default: - Mmsg2(jcr->errmsg, - _("attr_set error on file \"%s\": ERR=%s\n"), + Mmsg2(jcr->errmsg, _("attr_set error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror(errno)); - Dmsg2(100, "attr_set error file=%s ERR=%s\n", - jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } } break; default: - Mmsg2(jcr->errmsg, - _("attr_set error on file \"%s\": ERR=%s\n"), + Mmsg2(jcr->errmsg, _("attr_set error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg2(100, "attr_set error file=%s ERR=%s\n", - jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } } } - retval = bxattr_exit_ok; + retval = bxattr_rtn_ok; -bail_out: +get_out: xattr_drop_internal_table(xattr_value_list); return retval; } /* - * Function pointers to the build and parse function to use for these xattrs. + * Function pointers to the build and restore function to use for these xattrs. */ -static bxattr_exit_code (*os_build_xattr_streams) +static bxattr_rtn_code (*os_backup_xattr_streams) (JCR *jcr, FF_PKT *ff_pkt) = irix_xattr_build_streams; -static bxattr_exit_code (*os_parse_xattr_streams) +static bxattr_rtn_code (*os_restore_xattr_streams) (JCR *jcr, int stream, char *content, uint32_t content_length) = - irix_parse_xattr_streams; + irix_restore_xattr_streams; #elif defined(HAVE_DARWIN_OS) || \ defined(HAVE_LINUX_OS) || \ @@ -1109,7 +1020,7 @@ static const char *xattr_skiplist[1] = { #endif #endif -static bxattr_exit_code generic_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) +static bxattr_rtn_code generic_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) { char *bp; bool skip_xattr; @@ -1121,7 +1032,7 @@ static bxattr_exit_code generic_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) uint32_t expected_serialize_len = 0; xattr_t *current_xattr; alist *xattr_value_list = NULL; - bxattr_exit_code retval = bxattr_exit_error; + bxattr_rtn_code retval = bxattr_rtn_error; /* * First get the length of the available list with extended attributes. @@ -1133,8 +1044,8 @@ static bxattr_exit_code generic_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) switch (errno) { case ENOENT: - retval = bxattr_exit_ok; - goto bail_out; + retval = bxattr_rtn_ok; + goto get_out; case BXATTR_ENOTSUP: /* * If the filesystem reports it doesn't support XATTRs we clear @@ -1143,22 +1054,20 @@ static bxattr_exit_code generic_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) * BXATTR_FLAG_RESTORE_NATIVE flags gets sets again when we * change from one filesystem to an other. */ - jcr->xattr_data->flags &= ~BXATTR_FLAG_SAVE_NATIVE; - retval = bxattr_exit_ok; - goto bail_out; + jcr->xattr_ctx->flags &= ~BXATTR_FLAG_SAVE_NATIVE; + retval = bxattr_rtn_ok; + goto get_out; default: - Mmsg2(jcr->errmsg, - _("llistxattr error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "llistxattr error file=%s ERR=%s\n", + Mmsg2(jcr->errmsg, _("llistxattr error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } break; } case 0: - retval = bxattr_exit_ok; - goto bail_out; + retval = bxattr_rtn_ok; + goto get_out; default: break; } @@ -1173,26 +1082,16 @@ static bxattr_exit_code generic_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) * Get the actual list of extended attributes names for a file. */ xattr_list_len = llistxattr(jcr->last_fname, xattr_list, xattr_list_len); - switch (xattr_list_len) { - case -1: { + if (xattr_list_len < 0) { berrno be; - - switch (errno) { - case ENOENT: - retval = bxattr_exit_ok; - goto bail_out; - default: - Mmsg2(jcr->errmsg, - _("llistxattr error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "llistxattr error file=%s ERR=%s\n", + if (errno == ENOENT) { + retval = bxattr_rtn_ok; + } else { + Mmsg2(jcr->errmsg, _("llistxattr error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); } - break; - } - default: - break; + goto get_out; } xattr_list[xattr_list_len] = '\0'; @@ -1241,30 +1140,20 @@ static bxattr_exit_code generic_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) * First see how long the value is for the extended attribute. */ xattr_value_len = lgetxattr(jcr->last_fname, bp, NULL, 0); - switch (xattr_value_len) { - case -1: { + if (xattr_value_len < 0) { berrno be; - - switch (errno) { - case ENOENT: - retval = bxattr_exit_ok; - goto bail_out; - default: - Mmsg2(jcr->errmsg, - _("lgetxattr error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "lgetxattr error file=%s ERR=%s\n", + if (errno == ENOENT) { + retval = bxattr_rtn_ok; + } else { + Mmsg2(jcr->errmsg, _("lgetxattr error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); } - break; - } - default: - break; + goto get_out; } /* - * Each xattr valuepair starts with a magic so we can parse it easier. + * Each xattr valuepair starts with a magic so we can restore it easier. */ current_xattr = (xattr_t *)malloc(sizeof(xattr_t)); current_xattr->magic = XATTR_MAGIC; @@ -1299,14 +1188,12 @@ static bxattr_exit_code generic_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) switch (errno) { case ENOENT: - retval = bxattr_exit_ok; + retval = bxattr_rtn_ok; break; default: - Mmsg2(jcr->errmsg, - _("lgetxattr error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "lgetxattr error file=%s ERR=%s\n", + Mmsg2(jcr->errmsg, _("lgetxattr error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); + Dmsg1(100, "%s", jcr->errmsg); break; } @@ -1316,7 +1203,7 @@ static bxattr_exit_code generic_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) free(current_xattr->value); free(current_xattr->name); free(current_xattr); - goto bail_out; + goto get_out; } /* @@ -1337,11 +1224,11 @@ static bxattr_exit_code generic_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) /* * Protect ourself against things getting out of hand. */ - if (expected_serialize_len >= MAX_XATTR_STREAM) { + if (expected_serialize_len >= MAX_XATTR_LENGTH) { Mmsg2(jcr->errmsg, _("Xattr stream on file \"%s\" exceeds maximum size of %d bytes\n"), - jcr->last_fname, MAX_XATTR_STREAM); - goto bail_out; + jcr->last_fname, MAX_XATTR_LENGTH); + goto get_out; } } @@ -1355,15 +1242,12 @@ static bxattr_exit_code generic_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) /* * Serialize the datastream. */ - if (serialize_xattr_stream(jcr, - expected_serialize_len, + if (serialize_xattr_stream(jcr, expected_serialize_len, xattr_value_list) < expected_serialize_len) { - Mmsg1(jcr->errmsg, - _("Failed to serialize extended attributes on file \"%s\"\n"), + Mmsg1(jcr->errmsg, _("Failed to serialize extended attributes on file \"%s\"\n"), jcr->last_fname); - Dmsg1(100, "Failed to serialize extended attributes on file \"%s\"\n", - jcr->last_fname); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } /* @@ -1371,10 +1255,10 @@ static bxattr_exit_code generic_xattr_build_streams(JCR *jcr, FF_PKT *ff_pkt) */ retval = send_xattr_stream(jcr, os_default_xattr_streams[0]); } else { - retval = bxattr_exit_ok; + retval = bxattr_rtn_ok; } -bail_out: +get_out: if (xattr_list != NULL) { free(xattr_list); } @@ -1385,32 +1269,27 @@ bail_out: return retval; } -static bxattr_exit_code generic_parse_xattr_streams(JCR *jcr, - int stream, +static bxattr_rtn_code generic_restore_xattr_streams(JCR *jcr, int stream, char *content, uint32_t content_length) { xattr_t *current_xattr; alist *xattr_value_list; - bxattr_exit_code retval = bxattr_exit_error; + bxattr_rtn_code retval = bxattr_rtn_error; xattr_value_list = New(alist(10, not_owned_by_alist)); - if (unserialize_xattr_stream(jcr, - content, - content_length, - xattr_value_list) != bxattr_exit_ok) { - goto bail_out; + if (unserialize_xattr_stream(jcr, content, content_length, + xattr_value_list) != bxattr_rtn_ok) { + goto get_out; } foreach_alist(current_xattr, xattr_value_list) { if (lsetxattr(jcr->last_fname, current_xattr->name, current_xattr->value, current_xattr->value_length, 0) != 0) { berrno be; - - switch (errno) { - case ENOENT: - goto bail_out; - case BXATTR_ENOTSUP: + if (errno == ENOENT) { + goto get_out; + } else if (errno == BXATTR_ENOTSUP) { /* * If the filesystem reports it doesn't support XATTRs we clear * the BXATTR_FLAG_RESTORE_NATIVE flag so we skip XATTR restores @@ -1418,36 +1297,32 @@ static bxattr_exit_code generic_parse_xattr_streams(JCR *jcr, * BXATTR_FLAG_RESTORE_NATIVE flags gets sets again when we * change from one filesystem to an other. */ - jcr->xattr_data->flags &= ~BXATTR_FLAG_RESTORE_NATIVE; - goto bail_out; - default: - Mmsg2(jcr->errmsg, - _("lsetxattr error on file \"%s\": ERR=%s\n"), + jcr->xattr_ctx->flags &= ~BXATTR_FLAG_RESTORE_NATIVE; + } else { + Mmsg2(jcr->errmsg, _("lsetxattr error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg2(100, "lsetxattr error file=%s ERR=%s\n", - jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); } + goto get_out; } } - retval = bxattr_exit_ok; + retval = bxattr_rtn_ok; -bail_out: +get_out: xattr_drop_internal_table(xattr_value_list); - return retval; } /* - * Function pointers to the build and parse function to use for these xattrs. + * Function pointers to the build and restore functions to use for these xattrs. */ -static bxattr_exit_code (*os_build_xattr_streams) +static bxattr_rtn_code (*os_backup_xattr_streams) (JCR *jcr, FF_PKT *ff_pkt) = generic_xattr_build_streams; -static bxattr_exit_code (*os_parse_xattr_streams) +static bxattr_rtn_code (*os_restore_xattr_streams) (JCR *jcr, int stream, char *content, uint32_t content_length) = - generic_parse_xattr_streams; + generic_restore_xattr_streams; #elif defined(HAVE_FREEBSD_OS) || \ defined(HAVE_NETBSD_OS) || \ @@ -1528,7 +1403,7 @@ static const char *xattr_skiplist[1] = { }; #endif -static bxattr_exit_code bsd_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) +static bxattr_rtn_code bsd_backup_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) { bool skip_xattr; char *xattr_list = NULL; @@ -1542,7 +1417,7 @@ static bxattr_exit_code bsd_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) char current_attrname[XATTR_BUFSIZ], current_attrtuple[XATTR_BUFSIZ]; xattr_t *current_xattr; alist *xattr_value_list = NULL; - bxattr_exit_code retval = bxattr_exit_error; + bxattr_rtn_code retval = bxattr_rtn_error; /* * Loop over all available xattr namespaces. @@ -1566,8 +1441,8 @@ static bxattr_exit_code bsd_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) switch (errno) { case ENOENT: - retval = bxattr_exit_ok; - goto bail_out; + retval = bxattr_rtn_ok; + goto get_out; #if defined(EOPNOTSUPP) case EOPNOTSUPP: #endif @@ -1579,12 +1454,10 @@ static bxattr_exit_code bsd_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) * FALLTHROUGH */ default: - Mmsg2(jcr->errmsg, - _("extattr_list_link error on file \"%s\": ERR=%s\n"), + Mmsg2(jcr->errmsg, _("extattr_list_link error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg2(100, "extattr_list_link error file=%s ERR=%s\n", - jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } break; } @@ -1605,26 +1478,16 @@ static bxattr_exit_code bsd_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) */ xattr_list_len = extattr_list_link(jcr->last_fname, attrnamespace, xattr_list, xattr_list_len); - switch (xattr_list_len) { - case -1: { + if (xattr_list_len < 0) { berrno be; - - switch (errno) { - case ENOENT: - retval = bxattr_exit_ok; - goto bail_out; - default: - Mmsg2(jcr->errmsg, - _("extattr_list_link error on file \"%s\": ERR=%s\n"), + if (errno == ENOENT) { + retval = bxattr_rtn_ok; + } else { + Mmsg2(jcr->errmsg, _("extattr_list_link error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg2(100, "extattr_list_link error file=%s ERR=%s\n", - jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); } - break; - } - default: - break; + goto get_out; } xattr_list[xattr_list_len] = '\0'; @@ -1634,12 +1497,10 @@ static bxattr_exit_code bsd_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) * returns a strdupped string which we need to free. */ if (extattr_namespace_to_string(attrnamespace, ¤t_attrnamespace) != 0) { - Mmsg2(jcr->errmsg, - _("Failed to convert %d into namespace on file \"%s\"\n"), - attrnamespace, jcr->last_fname); - Dmsg2(100, "Failed to convert %d into namespace on file \"%s\"\n", + Mmsg2(jcr->errmsg, _("Failed to convert %d into namespace on file \"%s\"\n"), attrnamespace, jcr->last_fname); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } /* @@ -1711,15 +1572,13 @@ static bxattr_exit_code bsd_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) switch (errno) { case ENOENT: - retval = bxattr_exit_ok; - goto bail_out; + retval = bxattr_rtn_ok; + goto get_out; default: - Mmsg2(jcr->errmsg, - _("extattr_get_link error on file \"%s\": ERR=%s\n"), + Mmsg2(jcr->errmsg, _("extattr_get_link error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg2(100, "extattr_get_link error file=%s ERR=%s\n", - jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } break; } @@ -1728,7 +1587,7 @@ static bxattr_exit_code bsd_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) } /* - * Each xattr valuepair starts with a magic so we can parse it easier. + * Each xattr valuepair starts with a magic so we can restore it easier. */ current_xattr = (xattr_t *)malloc(sizeof(xattr_t)); memset(current_xattr, 0, sizeof(xattr_t)); @@ -1766,14 +1625,12 @@ static bxattr_exit_code bsd_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) switch (errno) { case ENOENT: - retval = bxattr_exit_ok; + retval = bxattr_rtn_ok; break; default: - Mmsg2(jcr->errmsg, - _("extattr_get_link error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "extattr_get_link error file=%s ERR=%s\n", + Mmsg2(jcr->errmsg, _("extattr_get_link error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); + Dmsg1(100, "%s", jcr->errmsg); break; } @@ -1783,7 +1640,7 @@ static bxattr_exit_code bsd_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) free(current_xattr->value); free(current_xattr->name); free(current_xattr); - goto bail_out; + goto get_out; } /* @@ -1805,11 +1662,11 @@ static bxattr_exit_code bsd_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) /* * Protect ourself against things getting out of hand. */ - if (expected_serialize_len >= MAX_XATTR_STREAM) { - Mmsg2(jcr->errmsg, - _("Xattr stream on file \"%s\" exceeds maximum size of %d bytes\n"), - jcr->last_fname, MAX_XATTR_STREAM); - goto bail_out; + if (expected_serialize_len >= MAX_XATTR_LENGTH) { + Mmsg2(jcr->errmsg, _("Xattr stream on file \"%s\" exceeds maximum size of %d bytes\n"), + jcr->last_fname, MAX_XATTR_LENGTH); + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } } @@ -1836,12 +1693,10 @@ static bxattr_exit_code bsd_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) if (serialize_xattr_stream(jcr, expected_serialize_len, xattr_value_list) < expected_serialize_len) { - Mmsg1(jcr->errmsg, - _("Failed to serialize extended attributes on file \"%s\"\n"), - jcr->last_fname); - Dmsg1(100, "Failed to serialize extended attributes on file \"%s\"\n", + Mmsg1(jcr->errmsg, _("Failed to serialize extended attributes on file \"%s\"\n"), jcr->last_fname); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } /* @@ -1849,10 +1704,10 @@ static bxattr_exit_code bsd_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) */ retval = send_xattr_stream(jcr, os_default_xattr_streams[0]); } else { - retval = bxattr_exit_ok; + retval = bxattr_rtn_ok; } -bail_out: +get_out: if (current_attrnamespace != NULL) { actuallyfree(current_attrnamespace); } @@ -1866,7 +1721,7 @@ bail_out: return retval; } -static bxattr_exit_code bsd_parse_xattr_streams(JCR *jcr, +static bxattr_rtn_code bsd_restore_xattr_streams(JCR *jcr, int stream, char *content, uint32_t content_length) @@ -1875,15 +1730,15 @@ static bxattr_exit_code bsd_parse_xattr_streams(JCR *jcr, alist *xattr_value_list; int current_attrnamespace, cnt; char *attrnamespace, *attrname; - bxattr_exit_code retval = bxattr_exit_error; + bxattr_rtn_code retval = bxattr_rtn_error; xattr_value_list = New(alist(10, not_owned_by_alist)); if (unserialize_xattr_stream(jcr, content, content_length, - xattr_value_list) != bxattr_exit_ok) { - goto bail_out; + xattr_value_list) != bxattr_rtn_ok) { + goto get_out; } foreach_alist(current_xattr, xattr_value_list) { @@ -1893,12 +1748,10 @@ static bxattr_exit_code bsd_parse_xattr_streams(JCR *jcr, */ attrnamespace = current_xattr->name; if ((attrname = strchr(attrnamespace, '.')) == (char *)NULL) { - Mmsg2(jcr->errmsg, - _("Failed to split %s into namespace and name part on file \"%s\"\n"), - current_xattr->name, jcr->last_fname); - Dmsg2(100, "Failed to split %s into namespace and name part on file \"%s\"\n", + Mmsg2(jcr->errmsg, _("Failed to split %s into namespace and name part on file \"%s\"\n"), current_xattr->name, jcr->last_fname); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } *attrname++ = '\0'; @@ -1906,12 +1759,10 @@ static bxattr_exit_code bsd_parse_xattr_streams(JCR *jcr, * Make sure the attrnamespace makes sense. */ if (extattr_string_to_namespace(attrnamespace, ¤t_attrnamespace) != 0) { - Mmsg2(jcr->errmsg, - _("Failed to convert %s into namespace on file \"%s\"\n"), - attrnamespace, jcr->last_fname); - Dmsg2(100, "Failed to convert %s into namespace on file \"%s\"\n", + Mmsg2(jcr->errmsg, _("Failed to convert %s into namespace on file \"%s\"\n"), attrnamespace, jcr->last_fname); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } /* @@ -1921,40 +1772,33 @@ static bxattr_exit_code bsd_parse_xattr_streams(JCR *jcr, attrname, current_xattr->value, current_xattr->value_length); if (cnt < 0 || cnt != (int)current_xattr->value_length) { berrno be; - - switch (errno) { - case ENOENT: - goto bail_out; - break; - default: - Mmsg2(jcr->errmsg, - _("extattr_set_link error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "extattr_set_link error file=%s ERR=%s\n", + if (errno == ENOENT) { + goto get_out; + } else { + Mmsg2(jcr->errmsg, _("extattr_set_link error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - goto bail_out; - break; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } } } - retval = bxattr_exit_ok; + retval = bxattr_rtn_ok; -bail_out: +get_out: xattr_drop_internal_table(xattr_value_list); - return retval; } /* - * Function pointers to the build and parse function to use for these xattrs. + * Function pointers to the build and restore function to use for these xattrs. */ -static bxattr_exit_code (*os_build_xattr_streams) +static bxattr_rtn_code (*os_backup_xattr_streams) (JCR *jcr, FF_PKT *ff_pkt) = - bsd_build_xattr_streams; -static bxattr_exit_code (*os_parse_xattr_streams) + bsd_backup_xattr_streams; +static bxattr_rtn_code (*os_restore_xattr_streams) (JCR *jcr, int stream, char *content, uint32_t content_length) = - bsd_parse_xattr_streams; + bsd_restore_xattr_streams; #elif defined(HAVE_OSF1_OS) @@ -1985,7 +1829,7 @@ static const char *xattr_skiplist[1] = { NULL }; -static bxattr_exit_code tru64_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) +static bxattr_rtn_code tru64_backup_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) { int cnt; char *bp, @@ -2002,7 +1846,7 @@ static bxattr_exit_code tru64_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) xattr_t *current_xattr; alist *xattr_value_list = NULL; struct proplistname_args prop_args; - bxattr_exit_code retval = bxattr_exit_error; + bxattr_rtn_code retval = bxattr_rtn_error; POOLMEM *xattrbuf = get_pool_memory(PM_MESSAGE); xattrbuf_size = sizeof_pool_memory(xattrbuf); @@ -2026,16 +1870,14 @@ static bxattr_exit_code tru64_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) * BXATTR_FLAG_RESTORE_NATIVE flags gets sets again when we * change from one filesystem to an other. */ - jcr->xattr_data->flags &= ~BXATTR_FLAG_SAVE_NATIVE; - retval = bxattr_exit_ok; - goto bail_out; + jcr->xattr_ctx->flags &= ~BXATTR_FLAG_SAVE_NATIVE; + retval = bxattr_rtn_ok; + goto get_out; default: - Mmsg2(jcr->errmsg, - _("getproplist error on file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "getproplist error file=%s ERR=%s\n", + Mmsg2(jcr->errmsg, _("getproplist error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } break; } @@ -2055,12 +1897,10 @@ static bxattr_exit_code tru64_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) switch (errno) { default: - Mmsg2(jcr->errmsg, - _("getproplist error on file \"%s\": ERR=%s\n"), + Mmsg2(jcr->errmsg, _("getproplist error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg2(100, "getproplist error file=%s ERR=%s\n", - jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } break; } @@ -2071,8 +1911,8 @@ static bxattr_exit_code tru64_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) * we are better of forgetting this xattr as it seems its list is changing at this * exact moment so we can never make a good backup copy of it. */ - retval = bxattr_exit_ok; - goto bail_out; + retval = bxattr_rtn_ok; + goto get_out; default: break; } @@ -2080,8 +1920,8 @@ static bxattr_exit_code tru64_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) /* * No xattr on file. */ - retval = bxattr_exit_ok; - goto bail_out; + retval = bxattr_rtn_ok; + goto get_out; } break; default: @@ -2132,7 +1972,7 @@ static bxattr_exit_code tru64_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) } /* - * Each xattr valuepair starts with a magic so we can parse it easier. + * Each xattr valuepair starts with a magic so we can restore it easier. */ current_xattr = (xattr_t *)malloc(sizeof(xattr_t)); memset(current_xattr, 0, sizeof(xattr_t)); @@ -2162,11 +2002,11 @@ static bxattr_exit_code tru64_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) /* * Protect ourself against things getting out of hand. */ - if (expected_serialize_len >= MAX_XATTR_STREAM) { + if (expected_serialize_len >= MAX_XATTR_LENGTH) { Mmsg2(jcr->errmsg, _("Xattr stream on file \"%s\" exceeds maximum size of %d bytes\n"), - jcr->last_fname, MAX_XATTR_STREAM); - goto bail_out; + jcr->last_fname, MAX_XATTR_LENGTH); + goto get_out; } } @@ -2180,12 +2020,10 @@ static bxattr_exit_code tru64_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) if (serialize_xattr_stream(jcr, expected_serialize_len, xattr_value_list) < expected_serialize_len) { - Mmsg1(jcr->errmsg, - _("Failed to serialize extended attributes on file \"%s\"\n"), - jcr->last_fname); - Dmsg1(100, "Failed to serialize extended attributes on file \"%s\"\n", + Mmsg1(jcr->errmsg, _("Failed to serialize extended attributes on file \"%s\"\n"), jcr->last_fname); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } /* @@ -2193,10 +2031,10 @@ static bxattr_exit_code tru64_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) */ retval = send_xattr_stream(jcr, os_default_xattr_streams[0]); } else { - retval = bxattr_exit_ok; + retval = bxattr_rtn_ok; } -bail_out: +get_out: if (xattr_value_list != NULL) { xattr_drop_internal_table(xattr_value_list); } @@ -2205,7 +2043,7 @@ bail_out: return retval; } -static bxattr_exit_code tru64_parse_xattr_streams(JCR *jcr, +static bxattr_rtn_code tru64_restore_xattr_streams(JCR *jcr, int stream, char *content, uint32_t content_length) @@ -2214,15 +2052,15 @@ static bxattr_exit_code tru64_parse_xattr_streams(JCR *jcr, int32_t xattrbuf_size, cnt; xattr_t *current_xattr; alist *xattr_value_list; - bxattr_exit_code retval = bxattr_exit_error; + bxattr_rtn_code retval = bxattr_rtn_error; xattr_value_list = New(alist(10, not_owned_by_alist)); if (unserialize_xattr_stream(jcr, content, content_length, - xattr_value_list) != bxattr_exit_ok) { - goto bail_out; + xattr_value_list) != bxattr_rtn_ok) { + goto get_out; } /* @@ -2249,12 +2087,10 @@ static bxattr_exit_code tru64_parse_xattr_streams(JCR *jcr, * Sanity check. */ if (cnt != xattrbuf_size) { - Mmsg1(jcr->errmsg, - _("Unable create proper proplist to restore xattrs on file \"%s\"\n"), - jcr->last_fname); - Dmsg1(100, "Unable create proper proplist to restore xattrs on file \"%s\"\n", + Mmsg1(jcr->errmsg, _("Unable create proper proplist to restore xattrs on file \"%s\"\n"), jcr->last_fname); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } /* @@ -2274,16 +2110,14 @@ static bxattr_exit_code tru64_parse_xattr_streams(JCR *jcr, * BXATTR_FLAG_RESTORE_NATIVE flags gets sets again when we * change from one filesystem to an other. */ - jcr->xattr_data->flags &= ~BXATTR_FLAG_RESTORE_NATIVE; - retval = bxattr_exit_ok; - goto bail_out; + jcr->xattr_ctx->flags &= ~BXATTR_FLAG_RESTORE_NATIVE; + retval = bxattr_rtn_ok; + goto get_out; default: - Mmsg2(jcr->errmsg, - _("setproplist error on file \"%s\": ERR=%s\n"), + Mmsg2(jcr->errmsg, _("setproplist error on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg2(100, "setproplist error file=%s ERR=%s\n", - jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } break; } @@ -2291,9 +2125,9 @@ static bxattr_exit_code tru64_parse_xattr_streams(JCR *jcr, break; } - retval = bxattr_exit_ok; + retval = bxattr_rtn_ok; -bail_out: +get_out: if (xattrbuf) { free(xattrbuf); } @@ -2303,14 +2137,14 @@ bail_out: } /* - * Function pointers to the build and parse function to use for these xattrs. + * Function pointers to the build and restore function to use for these xattrs. */ -static bxattr_exit_code (*os_build_xattr_streams) +static bxattr_rtn_code (*os_backup_xattr_streams) (JCR *jcr, FF_PKT *ff_pkt) = - tru64_build_xattr_streams; -static bxattr_exit_code (*os_parse_xattr_streams) + tru64_backup_xattr_streams; +static bxattr_rtn_code (*os_restore_xattr_streams) (JCR *jcr, int stream, char *content, uint32_t content_length) = - tru64_parse_xattr_streams; + tru64_restore_xattr_streams; #elif defined(HAVE_SUN_OS) /* @@ -2437,7 +2271,7 @@ static inline xattr_link_cache_entry_t *find_xattr_link_cache_entry(JCR *jcr, in { xattr_link_cache_entry_t *ptr; - foreach_alist(ptr, jcr->xattr_data->u.build->link_cache) { + foreach_alist(ptr, jcr->xattr_ctx->link_cache) { if (ptr && ptr->inum == inum) { return ptr; } @@ -2454,10 +2288,10 @@ static inline void add_xattr_link_cache_entry(JCR *jcr, ino_t inum, char *target ptr->inum = inum; ptr->target = bstrdup(target); - if (!jcr->xattr_data->u.build->link_cache) { - jcr->xattr_data->u.build->link_cache = New(alist(10, not_owned_by_alist)); + if (!jcr->xattr_ctx->link_cache) { + jcr->xattr_ctx->link_cache = New(alist(10, not_owned_by_alist)); } - jcr->xattr_data->u.build->link_cache->append(ptr); + jcr->xattr_ctx->link_cache->append(ptr); } static inline void drop_xattr_link_cache(JCR *jcr) @@ -2467,13 +2301,13 @@ static inline void drop_xattr_link_cache(JCR *jcr) /* * Walk the list of xattr link cache entries and free allocated memory on traversing. */ - foreach_alist(ptr, jcr->xattr_data->u.build->link_cache) { + foreach_alist(ptr, jcr->xattr_ctx->link_cache) { free(ptr->target); free(ptr); } - delete jcr->xattr_data->u.build->link_cache; - jcr->xattr_data->u.build->link_cache = NULL; + delete jcr->xattr_ctx->link_cache; + jcr->xattr_ctx->link_cache = NULL; } #if defined(HAVE_SYS_NVPAIR_H) && defined(_PC_SATTR_ENABLED) @@ -2513,7 +2347,7 @@ static bool solaris_has_non_transient_extensible_attributes(int fd) fattr = name_to_attr(name); } else { retval = true; - goto bail_out; + goto get_out; } type = nvpair_type(pair); @@ -2525,23 +2359,23 @@ static bool solaris_has_non_transient_extensible_attributes(int fd) if (value && fattr != F_ARCHIVE && fattr != F_AV_MODIFIED) { retval = true; - goto bail_out; + goto get_out; } break; case DATA_TYPE_UINT64_ARRAY: if (fattr != F_CRTIME) { retval = true; - goto bail_out; + goto get_out; } break; case DATA_TYPE_NVLIST: default: retval = true; - goto bail_out; + goto get_out; } } -bail_out: +get_out: if (response != NULL) { nvlist_free(response); } @@ -2571,9 +2405,9 @@ static bool acl_is_trivial(int count, aclent_t *entries) } #endif /* HAVE_ACL && !HAVE_EXTENDED_ACL */ -static bxattr_exit_code solaris_save_xattr_acl(JCR *jcr, int fd, const char *attrname, char **acl_text) +static bxattr_rtn_code solaris_save_xattr_acl(JCR *jcr, int fd, const char *attrname, char **acl_text) { - bxattr_exit_code retval = bxattr_exit_error; + bxattr_rtn_code retval = bxattr_rtn_error; #ifdef HAVE_ACL #ifdef HAVE_EXTENDED_ACL int flags; @@ -2593,15 +2427,13 @@ static bxattr_exit_code solaris_save_xattr_acl(JCR *jcr, int fd, const char *att switch (errno) { case ENOENT: - retval = bxattr_exit_ok; - goto bail_out; + retval = bxattr_rtn_ok; + goto get_out; default: - Mmsg3(jcr->errmsg, - _("Unable to get acl on xattr %s on file \"%s\": ERR=%s\n"), - attrname, jcr->last_fname, be.bstrerror()); - Dmsg3(100, "facl_get/acl_get of xattr %s on \"%s\" failed: ERR=%s\n", + Mmsg3(jcr->errmsg, _("Unable to get acl on xattr %s on file \"%s\": ERR=%s\n"), attrname, jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } } @@ -2623,7 +2455,7 @@ static bxattr_exit_code solaris_save_xattr_acl(JCR *jcr, int fd, const char *att } else { *acl_text = NULL; } - retval = bxattr_exit_ok; + retval = bxattr_rtn_ok; #else /* HAVE_EXTENDED_ACL */ int n; aclent_t *acls = NULL; @@ -2646,16 +2478,14 @@ static bxattr_exit_code solaris_save_xattr_acl(JCR *jcr, int fd, const char *att switch (errno) { case ENOENT: free(acls); - retval = bxattr_exit_ok; - goto bail_out; + retval = bxattr_rtn_ok; + goto get_out; default: - Mmsg3(jcr->errmsg, - _("Unable to get acl on xattr %s on file \"%s\": ERR=%s\n"), - attrname, jcr->last_fname, be.bstrerror()); - Dmsg3(100, "facl/acl of xattr %s on \"%s\" failed: ERR=%s\n", + Mmsg3(jcr->errmsg, _("Unable to get acl on xattr %s on file \"%s\": ERR=%s\n"), attrname, jcr->last_fname, be.bstrerror()); + Dmsg1(100, "%s", jcr->errmsg); free(acls); - goto bail_out; + goto get_out; } } @@ -2666,13 +2496,11 @@ static bxattr_exit_code solaris_save_xattr_acl(JCR *jcr, int fd, const char *att if ((*acl_text = acltotext(acls, n)) == NULL) { berrno be; - Mmsg3(jcr->errmsg, - _("Unable to get acl text on xattr %s on file \"%s\": ERR=%s\n"), - attrname, jcr->last_fname, be.bstrerror()); - Dmsg3(100, "acltotext of xattr %s on \"%s\" failed: ERR=%s\n", + Mmsg3(jcr->errmsg, _("Unable to get acl text on xattr %s on file \"%s\": ERR=%s\n"), attrname, jcr->last_fname, be.bstrerror()); + Dmsg1(100, "%s", jcr->errmsg); free(acls); - goto bail_out; + goto get_out; } } else { *acl_text = NULL; @@ -2682,27 +2510,27 @@ static bxattr_exit_code solaris_save_xattr_acl(JCR *jcr, int fd, const char *att } else { *acl_text = NULL; } - retval = bxattr_exit_ok; + retval = bxattr_rtn_ok; #endif /* HAVE_EXTENDED_ACL */ #else /* HAVE_ACL */ - retval = bxattr_exit_ok; + retval = bxattr_rtn_ok; #endif /* HAVE_ACL */ -bail_out: +get_out: return retval; } /* * Forward declaration for recursive function call. */ -static bxattr_exit_code solaris_save_xattrs(JCR *jcr, const char *xattr_namespace, const char *attr_parent); +static bxattr_rtn_code solaris_save_xattrs(JCR *jcr, const char *xattr_namespace, const char *attr_parent); /* * Save an extended or extensible attribute. * This is stored as an opaque stream of bytes with the following encoding: * - * \0\0\0 + * \0\0\0 * * or for a hardlinked or symlinked attribute * @@ -2711,9 +2539,9 @@ static bxattr_exit_code solaris_save_xattrs(JCR *jcr, const char *xattr_namespac * xattr_name can be a subpath relative to the file the xattr is on. * stat_buffer is the string representation of the stat struct. * acl_string is an acl text when a non trivial acl is set on the xattr. - * actual_xattr_data is the content of the xattr file. + * actual_xattr_ctx is the content of the xattr file. */ -static bxattr_exit_code solaris_save_xattr(JCR *jcr, int fd, const char *xattr_namespace, +static bxattr_rtn_code solaris_save_xattr(JCR *jcr, int fd, const char *xattr_namespace, const char *attrname, bool toplevel_hidden_dir, int stream) { int cnt; @@ -2725,7 +2553,7 @@ static bxattr_exit_code solaris_save_xattr(JCR *jcr, int fd, const char *xattr_n char *acl_text = NULL; char attribs[MAXSTRING]; char buffer[XATTR_BUFSIZ]; - bxattr_exit_code retval = bxattr_exit_error; + bxattr_rtn_code retval = bxattr_rtn_error; bsnprintf(target_attrname, sizeof(target_attrname), "%s%s", xattr_namespace, attrname); @@ -2737,15 +2565,13 @@ static bxattr_exit_code solaris_save_xattr(JCR *jcr, int fd, const char *xattr_n switch (errno) { case ENOENT: - retval = bxattr_exit_ok; - goto bail_out; + retval = bxattr_rtn_ok; + goto get_out; default: - Mmsg3(jcr->errmsg, - _("Unable to get status on xattr %s on file \"%s\": ERR=%s\n"), - target_attrname, jcr->last_fname, be.bstrerror()); - Dmsg3(100, "fstatat of xattr %s on \"%s\" failed: ERR=%s\n", + Mmsg3(jcr->errmsg, _("Unable to get status on xattr %s on file \"%s\": ERR=%s\n"), target_attrname, jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } } @@ -2761,8 +2587,8 @@ static bxattr_exit_code solaris_save_xattr(JCR *jcr, int fd, const char *xattr_n /* * Get any acl on the xattr. */ - if (solaris_save_xattr_acl(jcr, attrfd, attrname, &acl_text) != bxattr_exit_ok) - goto bail_out; + if (solaris_save_xattr_acl(jcr, attrfd, attrname, &acl_text) != bxattr_rtn_ok) + goto get_out; /* * The current implementation of xattr on Solaris doesn't support this, @@ -2778,8 +2604,8 @@ static bxattr_exit_code solaris_save_xattr(JCR *jcr, int fd, const char *xattr_n /* * Get any acl on the xattr. */ - if (solaris_save_xattr_acl(jcr, attrfd, attrname, &acl_text) != bxattr_exit_ok) - goto bail_out; + if (solaris_save_xattr_acl(jcr, attrfd, attrname, &acl_text) != bxattr_rtn_ok) + goto get_out; /* * See if this is the toplevel_hidden_dir being saved. @@ -2787,7 +2613,7 @@ static bxattr_exit_code solaris_save_xattr(JCR *jcr, int fd, const char *xattr_n if (toplevel_hidden_dir) { /* * Save the data for later storage when we encounter a real xattr. - * We store the data in the jcr->xattr_data->u.build->content buffer + * We store the data in the jcr->xattr_ctx->content buffer * and flush that just before sending out the first real xattr. * Encode the stat struct into an ASCII representation and jump * out of the function. @@ -2797,9 +2623,9 @@ static bxattr_exit_code solaris_save_xattr(JCR *jcr, int fd, const char *xattr_n "%s%c%s%c%s%c", target_attrname, 0, attribs, 0, (acl_text) ? acl_text : "", 0); - pm_memcpy(jcr->xattr_data->u.build->content, buffer, cnt); - jcr->xattr_data->u.build->content_length = cnt; - goto bail_out; + pm_memcpy(jcr->xattr_ctx->content, buffer, cnt); + jcr->xattr_ctx->content_length = cnt; + goto get_out; } else { /* * The current implementation of xattr on Solaris doesn't support this, @@ -2829,15 +2655,15 @@ static bxattr_exit_code solaris_save_xattr(JCR *jcr, int fd, const char *xattr_n cnt = bsnprintf(buffer, sizeof(buffer), "%s%c%s%c%s%c", target_attrname, 0, attribs, 0, xlce->target, 0); - pm_memcpy(jcr->xattr_data->u.build->content, buffer, cnt); - jcr->xattr_data->u.build->content_length = cnt; + pm_memcpy(jcr->xattr_ctx->content, buffer, cnt); + jcr->xattr_ctx->content_length = cnt; retval = send_xattr_stream(jcr, stream); /* * For a hard linked file we are ready now, no need to recursively * save the attributes. */ - goto bail_out; + goto get_out; } /* @@ -2850,8 +2676,8 @@ static bxattr_exit_code solaris_save_xattr(JCR *jcr, int fd, const char *xattr_n /* * Get any acl on the xattr. */ - if (solaris_save_xattr_acl(jcr, attrfd, attrname, &acl_text) != bxattr_exit_ok) { - goto bail_out; + if (solaris_save_xattr_acl(jcr, attrfd, attrname, &acl_text) != bxattr_rtn_ok) { + goto get_out; } /* @@ -2870,15 +2696,13 @@ static bxattr_exit_code solaris_save_xattr(JCR *jcr, int fd, const char *xattr_n switch (errno) { case ENOENT: - retval = bxattr_exit_ok; - goto bail_out; + retval = bxattr_rtn_ok; + goto get_out; default: - Mmsg3(jcr->errmsg, - _("Unable to open xattr %s on \"%s\": ERR=%s\n"), + Mmsg3(jcr->errmsg, _("Unable to open xattr %s on \"%s\": ERR=%s\n"), target_attrname, jcr->last_fname, be.bstrerror()); - Dmsg3(100, "openat of xattr %s on \"%s\" failed: ERR=%s\n", - target_attrname, jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } } break; @@ -2893,15 +2717,13 @@ static bxattr_exit_code solaris_save_xattr(JCR *jcr, int fd, const char *xattr_n switch (errno) { case ENOENT: - retval = bxattr_exit_ok; - goto bail_out; + retval = bxattr_rtn_ok; + goto get_out; default: - Mmsg3(jcr->errmsg, - _("Unable to read symlin %s on \"%s\": ERR=%s\n"), - target_attrname, jcr->last_fname, be.bstrerror()); - Dmsg3(100, "readlink of xattr %s on \"%s\" failed: ERR=%s\n", + Mmsg3(jcr->errmsg, _("Unable to read symlin %s on \"%s\": ERR=%s\n"), target_attrname, jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } } @@ -2912,38 +2734,38 @@ static bxattr_exit_code solaris_save_xattr(JCR *jcr, int fd, const char *xattr_n cnt = bsnprintf(buffer, sizeof(buffer), "%s%c%s%c%s%c", target_attrname, 0, attribs, 0, link_source, 0); - pm_memcpy(jcr->xattr_data->u.build->content, buffer, cnt); - jcr->xattr_data->u.build->content_length = cnt; + pm_memcpy(jcr->xattr_ctx->content, buffer, cnt); + jcr->xattr_ctx->content_length = cnt; retval = send_xattr_stream(jcr, stream); - if (retval == bxattr_exit_ok) { - jcr->xattr_data->u.build->nr_saved++; + if (retval == bxattr_rtn_ok) { + jcr->xattr_ctx->nr_saved++; } /* * For a soft linked file we are ready now, no need to recursively save the attributes. */ - goto bail_out; + goto get_out; default: - goto bail_out; + goto get_out; } /* * See if this is the first real xattr being saved. * If it is save the toplevel_hidden_dir attributes first. * This is easy as its stored already in the - * jcr->xattr_data->u.build->content buffer. + * jcr->xattr_ctx->content buffer. */ - if (jcr->xattr_data->u.build->nr_saved == 0) { + if (jcr->xattr_ctx->nr_saved == 0) { retval = send_xattr_stream(jcr, STREAM_XATTR_SOLARIS); - if (retval != bxattr_exit_ok) { - goto bail_out; + if (retval != bxattr_rtn_ok) { + goto get_out; } - jcr->xattr_data->u.build->nr_saved++; + jcr->xattr_ctx->nr_saved++; } - pm_memcpy(jcr->xattr_data->u.build->content, buffer, cnt); - jcr->xattr_data->u.build->content_length = cnt; + pm_memcpy(jcr->xattr_ctx->content, buffer, cnt); + jcr->xattr_ctx->content_length = cnt; /* * Only dump the content of regular files. @@ -2954,29 +2776,27 @@ static bxattr_exit_code solaris_save_xattr(JCR *jcr, int fd, const char *xattr_n /* * Protect ourself against things getting out of hand. */ - if (st.st_size >= MAX_XATTR_STREAM) { + if (st.st_size >= MAX_XATTR_LENGTH) { Mmsg2(jcr->errmsg, _("Xattr stream on file \"%s\" exceeds maximum size of %d bytes\n"), - jcr->last_fname, MAX_XATTR_STREAM); - goto bail_out; + jcr->last_fname, MAX_XATTR_LENGTH); + goto get_out; } while ((cnt = read(attrfd, buffer, sizeof(buffer))) > 0) { - jcr->xattr_data->u.build->content = - check_pool_memory_size(jcr->xattr_data->u.build->content, - jcr->xattr_data->u.build->content_length + cnt); - memcpy(jcr->xattr_data->u.build->content + - jcr->xattr_data->u.build->content_length, buffer, cnt); - jcr->xattr_data->u.build->content_length += cnt; + jcr->xattr_ctx->content = + check_pool_memory_size(jcr->xattr_ctx->content, + jcr->xattr_ctx->content_length + cnt); + memcpy(jcr->xattr_ctx->content + + jcr->xattr_ctx->content_length, buffer, cnt); + jcr->xattr_ctx->content_length += cnt; } if (cnt < 0) { - Mmsg2(jcr->errmsg, - _("Unable to read content of xattr %s on file \"%s\"\n"), + Mmsg2(jcr->errmsg, _("Unable to read content of xattr %s on file \"%s\"\n"), target_attrname, jcr->last_fname); - Dmsg2(100, "read of data from xattr %s on \"%s\" failed\n", - target_attrname, jcr->last_fname); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } } break; @@ -2989,10 +2809,10 @@ static bxattr_exit_code solaris_save_xattr(JCR *jcr, int fd, const char *xattr_n * We build a new xattr stream send it to the SD. */ retval = send_xattr_stream(jcr, stream); - if (retval != bxattr_exit_ok) { - goto bail_out; + if (retval != bxattr_rtn_ok) { + goto get_out; } - jcr->xattr_data->u.build->nr_saved++; + jcr->xattr_ctx->nr_saved++; /* * Recursivly call solaris_save_extended_attributes for archiving the attributes @@ -3008,19 +2828,17 @@ static bxattr_exit_code solaris_save_xattr(JCR *jcr, int fd, const char *xattr_n switch (errno) { case ENOENT: - retval = bxattr_exit_ok; - goto bail_out; + retval = bxattr_rtn_ok; + goto get_out; default: - Mmsg2(jcr->errmsg, - _("Unable to chdir to xattr space of file \"%s\": ERR=%s\n"), + Mmsg2(jcr->errmsg, _("Unable to chdir to xattr space of file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg3(100, "Unable to fchdir to xattr space of file \"%s\" using fd %d: ERR=%s\n", - jcr->last_fname, fd, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } } -bail_out: +get_out: if (acl_text != NULL) { free(acl_text); } @@ -3030,14 +2848,14 @@ bail_out: return retval; } -static bxattr_exit_code solaris_save_xattrs(JCR *jcr, const char *xattr_namespace, const char *attr_parent) +static bxattr_rtn_code solaris_save_xattrs(JCR *jcr, const char *xattr_namespace, const char *attr_parent) { const char *name; int fd, filefd = -1, attrdirfd = -1; DIR *dirp; struct dirent *dp; char current_xattr_namespace[PATH_MAX]; - bxattr_exit_code retval = bxattr_exit_error; + bxattr_rtn_code retval = bxattr_rtn_error; /* * Determine what argument to use. Use attr_parent when set @@ -3065,15 +2883,13 @@ static bxattr_exit_code solaris_save_xattrs(JCR *jcr, const char *xattr_namespac switch (errno) { case ENOENT: - retval = bxattr_exit_ok; - goto bail_out; + retval = bxattr_rtn_ok; + goto get_out; default: - Mmsg2(jcr->errmsg, - _("Unable to open file \"%s\": ERR=%s\n"), + Mmsg2(jcr->errmsg, _("Unable to open file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg2(100, "Unable to open file \"%s\": ERR=%s\n", - jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } } @@ -3090,18 +2906,16 @@ static bxattr_exit_code solaris_save_xattrs(JCR *jcr, const char *xattr_namespac * Which is not problem we just forget about this this xattr. * But as this is not an error we return a positive return value. */ - retval = bxattr_exit_ok; - goto bail_out; + retval = bxattr_rtn_ok; + goto get_out; case ENOENT: - retval = bxattr_exit_ok; - goto bail_out; + retval = bxattr_rtn_ok; + goto get_out; default: - Mmsg3(jcr->errmsg, - _("Unable to open xattr space %s on file \"%s\": ERR=%s\n"), - name, jcr->last_fname, be.bstrerror()); - Dmsg3(100, "Unable to open xattr space %s on file \"%s\": ERR=%s\n", + Mmsg3(jcr->errmsg, _("Unable to open xattr space %s on file \"%s\": ERR=%s\n"), name, jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } } @@ -3112,12 +2926,10 @@ static bxattr_exit_code solaris_save_xattrs(JCR *jcr, const char *xattr_namespac if (fchdir(attrdirfd) < 0) { berrno be; - Mmsg2(jcr->errmsg, - _("Unable to chdir to xattr space on file \"%s\": ERR=%s\n"), + Mmsg2(jcr->errmsg, _("Unable to chdir to xattr space on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg3(100, "Unable to fchdir to xattr space on file \"%s\" using fd %d: ERR=%s\n", - jcr->last_fname, attrdirfd, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } /* @@ -3133,13 +2945,11 @@ static bxattr_exit_code solaris_save_xattrs(JCR *jcr, const char *xattr_namespac (dirp = fdopendir(fd)) == (DIR *)NULL) { berrno be; - Mmsg2(jcr->errmsg, - _("Unable to list the xattr space on file \"%s\": ERR=%s\n"), + Mmsg2(jcr->errmsg, _("Unable to list the xattr space on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg3(100, "Unable to fdopendir xattr space on file \"%s\" using fd %d: ERR=%s\n", - jcr->last_fname, fd, be.bstrerror()); + Dmsg1(100, "%s", jcr->errmsg); - goto bail_out; + goto get_out; } /* @@ -3204,9 +3014,9 @@ static bxattr_exit_code solaris_save_xattrs(JCR *jcr, const char *xattr_namespac } closedir(dirp); - retval = bxattr_exit_ok; + retval = bxattr_rtn_ok; -bail_out: +get_out: if (attrdirfd != -1) close(attrdirfd); if (filefd != -1) @@ -3215,7 +3025,7 @@ bail_out: } #ifdef HAVE_ACL -static bxattr_exit_code solaris_restore_xattr_acl(JCR *jcr, +static bxattr_rtn_code solaris_restore_xattr_acl(JCR *jcr, int fd, const char *attrname, char *acl_text) @@ -3228,25 +3038,23 @@ static bxattr_exit_code solaris_restore_xattr_acl(JCR *jcr, Mmsg1(jcr->errmsg, _("Unable to convert acl from text on file \"%s\"\n"), jcr->last_fname); - return bxattr_exit_error; + return bxattr_rtn_error; } if ((fd != -1 && facl_set(fd, aclp) != 0) || acl_set(attrname, aclp) != 0) { berrno be; - Mmsg3(jcr->errmsg, - _("Unable to restore acl of xattr %s on file \"%s\": ERR=%s\n"), + Mmsg3(jcr->errmsg, _("Unable to restore acl of xattr %s on file \"%s\": ERR=%s\n"), attrname, jcr->last_fname, be.bstrerror()); - Dmsg3(100, "Unable to restore acl of xattr %s on file \"%s\": ERR=%s\n", - attrname, jcr->last_fname, be.bstrerror()); - return bxattr_exit_error; + Dmsg1(100, "%s", jcr->errmsg); + return bxattr_rtn_error; } if (aclp) { acl_free(aclp); } - return bxattr_exit_ok; + return bxattr_rtn_ok; #else /* HAVE_EXTENDED_ACL */ int n; @@ -3258,26 +3066,24 @@ static bxattr_exit_code solaris_restore_xattr_acl(JCR *jcr, acl(attrname, SETACL, n, acls) != 0) { berrno be; - Mmsg3(jcr->errmsg, - _("Unable to restore acl of xattr %s on file \"%s\": ERR=%s\n"), - attrname, jcr->last_fname, be.bstrerror()); - Dmsg3(100, "Unable to restore acl of xattr %s on file \"%s\": ERR=%s\n", + Mmsg3(jcr->errmsg, _("Unable to restore acl of xattr %s on file \"%s\": ERR=%s\n"), attrname, jcr->last_fname, be.bstrerror()); - return bxattr_exit_error; + Dmsg1(100, "%s", jcr->errmsg); + return bxattr_rtn_error; } } if (acls) { free(acls); } - return bxattr_exit_ok; + return bxattr_rtn_ok; #endif /* HAVE_EXTENDED_ACL */ } #endif /* HAVE_ACL */ -static bxattr_exit_code solaris_restore_xattrs(JCR *jcr, +static bxattr_rtn_code solaris_restore_xattrs(JCR *jcr, bool is_extensible, char *content, uint32_t content_length) @@ -3292,10 +3098,10 @@ static bxattr_exit_code solaris_restore_xattrs(JCR *jcr, int32_t inum; struct stat st; struct timeval times[2]; - bxattr_exit_code retval = bxattr_exit_error; + bxattr_rtn_code retval = bxattr_rtn_error; /* - * Parse the xattr stream. First the part that is the same for all xattrs. + * Restore the xattr stream. First the part that is the same for all xattrs. */ used_bytes = 0; @@ -3307,7 +3113,7 @@ static bxattr_exit_code solaris_restore_xattrs(JCR *jcr, target_attrname = content + 1; if ((bp = strchr(target_attrname, '\0')) == (char *)NULL || (used_bytes = (bp - content)) >= (int32_t)(content_length - 1)) { - goto parse_error; + goto restore_error; } attribs = ++bp; @@ -3317,12 +3123,10 @@ static bxattr_exit_code solaris_restore_xattrs(JCR *jcr, if ((filefd = open(jcr->last_fname, O_RDONLY | O_NONBLOCK)) < 0) { berrno be; - Mmsg2(jcr->errmsg, - _("Unable to open file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "Unable to open file \"%s\": ERR=%s\n", + Mmsg2(jcr->errmsg, _("Unable to open file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } /* @@ -3331,23 +3135,19 @@ static bxattr_exit_code solaris_restore_xattrs(JCR *jcr, if ((attrdirfd = openat(filefd, ".", O_RDONLY | O_XATTR)) < 0) { berrno be; - Mmsg2(jcr->errmsg, - _("Unable to open xattr space on file \"%s\": ERR=%s\n"), + Mmsg2(jcr->errmsg, _("Unable to open xattr space on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg2(100, "Unable to open xattr space on file \"%s\": ERR=%s\n", - jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } if (fchdir(attrdirfd) < 0) { berrno be; - Mmsg2(jcr->errmsg, - _("Unable to chdir to xattr space on file \"%s\": ERR=%s\n"), + Mmsg2(jcr->errmsg, _("Unable to chdir to xattr space on file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - Dmsg3(100, "Unable to fchdir to xattr space on file \"%s\" using fd %d: ERR=%s\n", - jcr->last_fname, attrdirfd, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } /* @@ -3361,12 +3161,10 @@ static bxattr_exit_code solaris_restore_xattrs(JCR *jcr, if ((fd = open(target_attrname, O_RDONLY | O_NONBLOCK)) < 0) { berrno be; - Mmsg3(jcr->errmsg, - _("Unable to open xattr %s on file \"%s\": ERR=%s\n"), - target_attrname, jcr->last_fname, be.bstrerror()); - Dmsg3(100, "Unable to open xattr %s on file \"%s\": ERR=%s\n", + Mmsg3(jcr->errmsg, _("Unable to open xattr %s on file \"%s\": ERR=%s\n"), target_attrname, jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } close(filefd); @@ -3378,12 +3176,10 @@ static bxattr_exit_code solaris_restore_xattrs(JCR *jcr, if ((fd = openat(filefd, ".", O_RDONLY | O_XATTR)) < 0) { berrno be; - Mmsg3(jcr->errmsg, - _("Unable to open xattr space %s on file \"%s\": ERR=%s\n"), + Mmsg3(jcr->errmsg, _("Unable to open xattr space %s on file \"%s\": ERR=%s\n"), target_attrname, jcr->last_fname, be.bstrerror()); - Dmsg3(100, "Unable to open xattr space %s on file \"%s\": ERR=%s\n", - target_attrname, jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } close(attrdirfd); @@ -3395,12 +3191,10 @@ static bxattr_exit_code solaris_restore_xattrs(JCR *jcr, if (fchdir(attrdirfd) < 0) { berrno be; - Mmsg3(jcr->errmsg, - _("Unable to chdir to xattr space %s on file \"%s\": ERR=%s\n"), + Mmsg3(jcr->errmsg, _("Unable to chdir to xattr space %s on file \"%s\": ERR=%s\n"), target_attrname, jcr->last_fname, be.bstrerror()); - Dmsg4(100, "Unable to fchdir to xattr space %s on file \"%s\" using fd %d: ERR=%s\n", - target_attrname, jcr->last_fname, attrdirfd, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } target_attrname = ++bp; @@ -3416,7 +3210,7 @@ static bxattr_exit_code solaris_restore_xattrs(JCR *jcr, */ if ((bp = strchr(attribs, '\0')) == (char *)NULL || (used_bytes = (bp - content)) >= (int32_t)(content_length - 1)) { - goto parse_error; + goto restore_error; } acl_text = ++bp; @@ -3435,12 +3229,10 @@ static bxattr_exit_code solaris_restore_xattrs(JCR *jcr, if (mkfifo(target_attrname, st.st_mode) < 0) { berrno be; - Mmsg3(jcr->errmsg, - _("Unable to mkfifo xattr %s on file \"%s\": ERR=%s\n"), + Mmsg3(jcr->errmsg, _("Unable to mkfifo xattr %s on file \"%s\": ERR=%s\n"), target_attrname, jcr->last_fname, be.bstrerror()); - Dmsg3(100, "Unable to mkfifo xattr %s on file \"%s\": ERR=%s\n", - target_attrname, jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } break; case S_IFCHR: @@ -3453,12 +3245,10 @@ static bxattr_exit_code solaris_restore_xattrs(JCR *jcr, if (mknod(target_attrname, st.st_mode, st.st_rdev) < 0) { berrno be; - Mmsg3(jcr->errmsg, - _("Unable to mknod xattr %s on file \"%s\": ERR=%s\n"), + Mmsg3(jcr->errmsg, _("Unable to mknod xattr %s on file \"%s\": ERR=%s\n"), target_attrname, jcr->last_fname, be.bstrerror()); - Dmsg3(100, "Unable to mknod xattr %s on file \"%s\": ERR=%s\n", - target_attrname, jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } break; case S_IFDIR: @@ -3472,11 +3262,12 @@ static bxattr_exit_code solaris_restore_xattrs(JCR *jcr, if (mkdir(target_attrname, st.st_mode) < 0) { berrno be; + /* *** FIXME *** why not Mmsg? */ Jmsg3(jcr, M_WARNING, 0, _("Unable to mkdir xattr %s on file \"%s\": ERR=%s\n"), target_attrname, jcr->last_fname, be.bstrerror()); Dmsg3(100, "Unable to mkdir xattr %s on file \"%s\": ERR=%s\n", target_attrname, jcr->last_fname, be.bstrerror()); - goto bail_out; + goto get_out; } } break; @@ -3491,23 +3282,21 @@ static bxattr_exit_code solaris_restore_xattrs(JCR *jcr, if (link(linked_target, target_attrname) < 0) { berrno be; - Mmsg4(jcr->errmsg, - _("Unable to link xattr %s to %s on file \"%s\": ERR=%s\n"), + Mmsg4(jcr->errmsg, _("Unable to link xattr %s to %s on file \"%s\": ERR=%s\n"), target_attrname, linked_target, jcr->last_fname, be.bstrerror()); - Dmsg4(100, "Unable to link xattr %s to %s on file \"%s\": ERR=%s\n", - target_attrname, linked_target, jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } /* * Successfully restored xattr. */ - retval = bxattr_exit_ok; - goto bail_out; + retval = bxattr_rtn_ok; + goto get_out; } else { if ((bp = strchr(acl_text, '\0')) == (char *)NULL || (used_bytes = (bp - content)) >= (int32_t)content_length) { - goto parse_error; + goto restore_error; } if (used_bytes < (int32_t)(content_length - 1)) @@ -3523,12 +3312,10 @@ static bxattr_exit_code solaris_restore_xattrs(JCR *jcr, if ((attrfd = openat(attrdirfd, target_attrname, O_RDWR | O_CREAT | O_TRUNC, st.st_mode)) < 0) { berrno be; - Mmsg3(jcr->errmsg, - _("Unable to open xattr %s on file \"%s\": ERR=%s\n"), - target_attrname, jcr->last_fname, be.bstrerror()); - Dmsg3(100, "Unable to open xattr %s on file \"%s\": ERR=%s\n", + Mmsg3(jcr->errmsg, _("Unable to open xattr %s on file \"%s\": ERR=%s\n"), target_attrname, jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } } @@ -3544,12 +3331,10 @@ static bxattr_exit_code solaris_restore_xattrs(JCR *jcr, * we have available as data of the stream. */ if (cnt != st.st_size) { - Mmsg2(jcr->errmsg, - _("Unable to restore data of xattr %s on file \"%s\": Not all data available in xattr stream\n"), - target_attrname, jcr->last_fname); - Dmsg2(100, "Unable to restore data of xattr %s on file \"%s\": Not all data available in xattr stream\n", + Mmsg2(jcr->errmsg, _("Unable to restore data of xattr %s on file \"%s\": Not all data available in xattr stream\n"), target_attrname, jcr->last_fname); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } while (cnt > 0) { @@ -3557,12 +3342,10 @@ static bxattr_exit_code solaris_restore_xattrs(JCR *jcr, if (cnt < 0) { berrno be; - Mmsg3(jcr->errmsg, - _("Unable to restore data of xattr %s on file \"%s\": ERR=%s\n"), - target_attrname, jcr->last_fname, be.bstrerror()); - Dmsg3(100, "Unable to restore data of xattr %s on file \"%s\": ERR=%s\n", + Mmsg3(jcr->errmsg, _("Unable to restore data of xattr %s on file \"%s\": ERR=%s\n"), target_attrname, jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } used_bytes += cnt; @@ -3580,21 +3363,19 @@ static bxattr_exit_code solaris_restore_xattrs(JCR *jcr, if (symlink(linked_target, target_attrname) < 0) { berrno be; - Mmsg4(jcr->errmsg, - _("Unable to symlink xattr %s to %s on file \"%s\": ERR=%s\n"), + Mmsg4(jcr->errmsg, _("Unable to symlink xattr %s to %s on file \"%s\": ERR=%s\n"), target_attrname, linked_target, jcr->last_fname, be.bstrerror()); - Dmsg4(100, "Unable to symlink xattr %s to %s on file \"%s\": ERR=%s\n", - target_attrname, linked_target, jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } /* * Successfully restored xattr. */ - retval = bxattr_exit_ok; - goto bail_out; + retval = bxattr_rtn_ok; + goto get_out; default: - goto bail_out; + goto get_out; } /* @@ -3603,33 +3384,22 @@ static bxattr_exit_code solaris_restore_xattrs(JCR *jcr, if (!is_extensible) { if (fchownat(attrdirfd, target_attrname, st.st_uid, st.st_gid, AT_SYMLINK_NOFOLLOW) < 0) { berrno be; - - switch (errno) { - case EINVAL: - /* - * Gentile way of the system saying this type of xattr layering is not supported. - * But as this is not an error we return a positive return value. - */ - retval = bxattr_exit_ok; - break; - case ENOENT: - retval = bxattr_exit_ok; - break; - default: - Mmsg3(jcr->errmsg, - _("Unable to restore owner of xattr %s on file \"%s\": ERR=%s\n"), - target_attrname, jcr->last_fname, be.bstrerror()); - Dmsg3(100, "Unable to restore owner of xattr %s on file \"%s\": ERR=%s\n", + /* EINVAL means is not supported, no fail */ + if (errno == EINVAL || errno == ENOENT) { + retval = bxattr_rtn_ok; + } else { + Mmsg3(jcr->errmsg, _("Unable to restore owner of xattr %s on file \"%s\": ERR=%s\n"), target_attrname, jcr->last_fname, be.bstrerror()); + Dmsg1(100, "%s", jcr->errmsg); } - goto bail_out; + goto get_out; } } #ifdef HAVE_ACL if (acl_text && *acl_text) - if (solaris_restore_xattr_acl(jcr, attrfd, target_attrname, acl_text) != bxattr_exit_ok) - goto bail_out; + if (solaris_restore_xattr_acl(jcr, attrfd, target_attrname, acl_text) != bxattr_rtn_ok) + goto get_out; #endif /* HAVE_ACL */ /* @@ -3643,30 +3413,25 @@ static bxattr_exit_code solaris_restore_xattrs(JCR *jcr, if (futimesat(attrdirfd, target_attrname, times) < 0) { berrno be; - - Mmsg3(jcr->errmsg, - _("Unable to restore filetimes of xattr %s on file \"%s\": ERR=%s\n"), + Mmsg3(jcr->errmsg, _("Unable to restore filetimes of xattr %s on file \"%s\": ERR=%s\n"), target_attrname, jcr->last_fname, be.bstrerror()); - Dmsg3(100, "Unable to restore filetimes of xattr %s on file \"%s\": ERR=%s\n", - target_attrname, jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } } /* * Successfully restored xattr. */ - retval = bxattr_exit_ok; - goto bail_out; + retval = bxattr_rtn_ok; + goto get_out; -parse_error: - Mmsg1(jcr->errmsg, - _("Illegal xattr stream, failed to parse xattr stream on file \"%s\"\n"), - jcr->last_fname); - Dmsg1(100, "Illegal xattr stream, failed to parse xattr stream on file \"%s\"\n", +restore_error: + Mmsg1(jcr->errmsg, _("Invalid xattr stream, failed to restore xattr stream on file \"%s\"\n"), jcr->last_fname); + Dmsg1(100, "%s", jcr->errmsg); -bail_out: +get_out: if (attrfd != -1) { close(attrfd); } @@ -3679,17 +3444,17 @@ bail_out: return retval; } -static bxattr_exit_code solaris_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) +static bxattr_rtn_code solaris_backup_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) { char cwd[PATH_MAX]; - bxattr_exit_code retval = bxattr_exit_ok; + bxattr_rtn_code retval = bxattr_rtn_ok; /* * First see if extended attributes or extensible attributes are present. * If not just pretend things went ok. */ if (pathconf(jcr->last_fname, _PC_XATTR_EXISTS) > 0) { - jcr->xattr_data->u.build->nr_saved = 0; + jcr->xattr_ctx->nr_saved = 0; /* * As we change the cwd in the save function save the current cwd @@ -3698,21 +3463,21 @@ static bxattr_exit_code solaris_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) getcwd(cwd, sizeof(cwd)); retval = solaris_save_xattrs(jcr, NULL, NULL); chdir(cwd); - if (jcr->xattr_data->u.build->link_cache) { + if (jcr->xattr_ctx->link_cache) { drop_xattr_link_cache(jcr); } } return retval; } -static bxattr_exit_code solaris_parse_xattr_streams(JCR *jcr, +static bxattr_rtn_code solaris_restore_xattr_streams(JCR *jcr, int stream, char *content, uint32_t content_length) { char cwd[PATH_MAX]; bool is_extensible = false; - bxattr_exit_code retval = bxattr_exit_error; + bxattr_rtn_code retval = bxattr_rtn_error; /* * First make sure we can restore xattr on the filesystem. @@ -3721,12 +3486,10 @@ static bxattr_exit_code solaris_parse_xattr_streams(JCR *jcr, #if defined(HAVE_SYS_NVPAIR_H) && defined(_PC_SATTR_ENABLED) case STREAM_XATTR_SOLARIS_SYS: if (pathconf(jcr->last_fname, _PC_SATTR_ENABLED) <= 0) { - Mmsg1(jcr->errmsg, - _("Failed to restore extensible attributes on file \"%s\"\n"), - jcr->last_fname); - Dmsg1(100, "Unable to restore extensible attributes on file \"%s\", filesystem doesn't support this\n", - jcr->last_fname); - goto bail_out; + Mmsg1(jcr->errmsg, _("Failed to restore extensible attributes on file \"%s\"\n"), + jcr->last_fname); + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } is_extensible = true; @@ -3734,16 +3497,14 @@ static bxattr_exit_code solaris_parse_xattr_streams(JCR *jcr, #endif case STREAM_XATTR_SOLARIS: if (pathconf(jcr->last_fname, _PC_XATTR_ENABLED) <= 0) { - Mmsg1(jcr->errmsg, - _("Failed to restore extended attributes on file \"%s\"\n"), + Mmsg1(jcr->errmsg, _("Failed to restore extended attributes on file \"%s\"\n"), jcr->last_fname); - Dmsg1(100, "Unable to restore extended attributes on file \"%s\", filesystem doesn't support this\n", - jcr->last_fname); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); + goto get_out; } break; default: - goto bail_out; + goto get_out; } /* @@ -3754,55 +3515,80 @@ static bxattr_exit_code solaris_parse_xattr_streams(JCR *jcr, retval = solaris_restore_xattrs(jcr, is_extensible, content, content_length); chdir(cwd); -bail_out: +get_out: return retval; } /* - * Function pointers to the build and parse function to use for these xattrs. + * Function pointers to the build and restore function to use for these xattrs. */ -static bxattr_exit_code (*os_build_xattr_streams) +static bxattr_rtn_code (*os_backup_xattr_streams) (JCR *jcr, FF_PKT *ff_pkt) = - solaris_build_xattr_streams; -static bxattr_exit_code (*os_parse_xattr_streams) + solaris_backup_xattr_streams; +static bxattr_rtn_code (*os_restore_xattr_streams) (JCR *jcr, int stream, char *content, uint32_t content_length) = - solaris_parse_xattr_streams; + solaris_restore_xattr_streams; #endif /* defined(HAVE_SUN_OS) */ /* * Entry points when compiled with support for XATTRs on a supported platform. */ -bxattr_exit_code build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) +bool backup_xattr_streams(JCR *jcr, FF_PKT *ff_pkt) { + bxattr_rtn_code rtn = bxattr_rtn_ok; + + if (!(ff_pkt->flags & FO_XATTR && !ff_pkt->cmd_plugin)) { + return true; + } + + jcr->errmsg[0] = 0; + /* * See if we are changing from one device to an other. * We save the current device we are scanning and compare * it with the current st_dev in the last stat performed on * the file we are currently storing. */ - if (jcr->xattr_data->current_dev != ff_pkt->statp.st_dev) { + if (jcr->xattr_ctx->current_dev != ff_pkt->statp.st_dev) { /* * Reset the acl save flags. */ - jcr->xattr_data->flags = 0; - jcr->xattr_data->flags |= BXATTR_FLAG_SAVE_NATIVE; + jcr->xattr_ctx->flags = 0; + jcr->xattr_ctx->flags |= BXATTR_FLAG_SAVE_NATIVE; /* * Save that we started scanning a new filesystem. */ - jcr->xattr_data->current_dev = ff_pkt->statp.st_dev; + jcr->xattr_ctx->current_dev = ff_pkt->statp.st_dev; } - if ((jcr->xattr_data->flags & BXATTR_FLAG_SAVE_NATIVE) && os_parse_xattr_streams) { - return os_build_xattr_streams(jcr, ff_pkt); - } else { - return bxattr_exit_ok; + if ((jcr->xattr_ctx->flags & BXATTR_FLAG_SAVE_NATIVE) && os_restore_xattr_streams) { + rtn = os_backup_xattr_streams(jcr, ff_pkt); } + switch (rtn) { + case bxattr_rtn_fatal: + return false; + case bxattr_rtn_ok: + return true; + case bxattr_rtn_error: + if (jcr->xattr_ctx->nr_errors < XATTR_MAX_ERROR_PRINT_PER_JOB) { + if (jcr->errmsg[0]) { + Jmsg(jcr, M_WARNING, 0, "Operating system XATTRs not configured.\n"); + } else { + Jmsg(jcr, M_WARNING, 0, "%s", jcr->errmsg); + } + jcr->xattr_ctx->nr_errors++; + } + return true; + } + /* Theoretically we cannot get here */ + return false; + } -bxattr_exit_code parse_xattr_streams(JCR *jcr, +bxattr_rtn_code restore_xattr_streams(JCR *jcr, int stream, char *content, uint32_t content_length) @@ -3810,7 +3596,7 @@ bxattr_exit_code parse_xattr_streams(JCR *jcr, int ret; struct stat st; unsigned int cnt; - bxattr_exit_code retval = bxattr_exit_error; + bxattr_rtn_code retval = bxattr_rtn_error; /* * See if we are changing from one device to an other. @@ -3819,70 +3605,60 @@ bxattr_exit_code parse_xattr_streams(JCR *jcr, * the file we are currently restoring. */ ret = lstat(jcr->last_fname, &st); - switch (ret) { - case -1: { + if (ret < 0) { berrno be; - - switch (errno) { - case ENOENT: - retval = bxattr_exit_ok; - goto bail_out; - default: - Mmsg2(jcr->errmsg, - _("Unable to stat file \"%s\": ERR=%s\n"), - jcr->last_fname, be.bstrerror()); - Dmsg2(100, "Unable to stat file \"%s\": ERR=%s\n", + if (errno == ENOENT) { + retval = bxattr_rtn_ok; + } else { + Mmsg2(jcr->errmsg, _("Unable to stat file \"%s\": ERR=%s\n"), jcr->last_fname, be.bstrerror()); - goto bail_out; + Dmsg1(100, "%s", jcr->errmsg); } - break; - } - case 0: - break; + goto get_out; } - if (jcr->xattr_data->current_dev != st.st_dev) { + if (jcr->xattr_ctx->current_dev != st.st_dev) { /* * Reset the acl save flags. */ - jcr->xattr_data->flags = 0; - jcr->xattr_data->flags |= BXATTR_FLAG_RESTORE_NATIVE; + jcr->xattr_ctx->flags = 0; + jcr->xattr_ctx->flags |= BXATTR_FLAG_RESTORE_NATIVE; /* * Save that we started restoring to a new filesystem. */ - jcr->xattr_data->current_dev = st.st_dev; + jcr->xattr_ctx->current_dev = st.st_dev; } /* * See if we are still restoring native xattr to this filesystem. */ - if ((jcr->xattr_data->flags & BXATTR_FLAG_RESTORE_NATIVE) && os_parse_xattr_streams) { + if ((jcr->xattr_ctx->flags & BXATTR_FLAG_RESTORE_NATIVE) && os_restore_xattr_streams) { /* - * See if we can parse this stream, and ifso give it a try. + * See if we can restore this stream, and ifso give it a try. */ for (cnt = 0; cnt < sizeof(os_default_xattr_streams) / sizeof(int); cnt++) { if (os_default_xattr_streams[cnt] == stream) { - retval = os_parse_xattr_streams(jcr, stream, content, content_length); - goto bail_out; + retval = os_restore_xattr_streams(jcr, stream, content, content_length); + goto get_out; } } } else { /* * Increment error count but don't log an error again for the same filesystem. */ - jcr->xattr_data->u.parse->nr_errors++; - retval = bxattr_exit_ok; - goto bail_out; + jcr->xattr_ctx->nr_errors++; + retval = bxattr_rtn_ok; + goto get_out; } /* * Issue a warning and discard the message. But pretend the restore was ok. */ Jmsg2(jcr, M_WARNING, 0, - _("Can't restore Extended Attributes of %s - incompatible xattr stream encountered - %d\n"), + _("Cannot restore Extended Attributes of %s - incompatible xattr stream encountered - %d\n"), jcr->last_fname, stream); -bail_out: +get_out: return retval; } #endif diff --git a/bacula/src/filed/xattr.h b/bacula/src/filed/xattr.h index 131e6c6c5f..b2bbe23b3f 100644 --- a/bacula/src/filed/xattr.h +++ b/bacula/src/filed/xattr.h @@ -1,21 +1,25 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2004-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ -#ifndef __XATTR_H -#define __XATTR_H +#ifndef __BXATTR_H_ +#define __BXATTR_H_ #if defined(HAVE_LINUX_OS) #define BXATTR_ENOTSUP EOPNOTSUPP @@ -53,38 +57,21 @@ struct xattr_link_cache_entry_t { #define BXATTR_FLAG_SAVE_NATIVE 0x01 #define BXATTR_FLAG_RESTORE_NATIVE 0x02 -struct xattr_build_data_t { - uint32_t nr_errors; - uint32_t nr_saved; - POOLMEM *content; - uint32_t content_length; - alist *link_cache; -}; - -struct xattr_parse_data_t { - uint32_t nr_errors; -}; - /* * Internal tracking data. */ -struct xattr_data_t { +struct xattr_ctx_t { uint32_t flags; /* See BXATTR_FLAG_* */ uint32_t current_dev; - union { - struct xattr_build_data_t *build; - struct xattr_parse_data_t *parse; - } u; + uint32_t nr_errors; + uint32_t nr_saved; + POOLMEM *content; + uint32_t content_length; + alist *link_cache; }; -/* - * Maximum size of the XATTR stream this prevents us from blowing up the filed. - */ -#define MAX_XATTR_STREAM (1 * 1024 * 1024) /* 1 Mb */ +#define MAX_XATTR_LENGTH (1 * 1024 * 1024) /* 1 Mb */ -/* - * Upperlimit on a xattr internal buffer - */ -#define XATTR_BUFSIZ 1024 +#define XATTR_BUFSIZ 1024 -#endif +#endif /* __BXATTR_H_ */ diff --git a/bacula/src/fileopts.h b/bacula/src/fileopts.h index 5b3e87bf2f..0dee79272f 100644 --- a/bacula/src/fileopts.h +++ b/bacula/src/fileopts.h @@ -1,20 +1,24 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * File types + * File types * * Kern Sibbald MMI * @@ -25,7 +29,7 @@ #ifndef __BFILEOPTS_H #define __BFILEOPTS_H -/* +/* * Options saved int "options" of the include/exclude lists. * They are directly jammed ito "flag" of ff packet */ diff --git a/bacula/src/filetypes.h b/bacula/src/filetypes.h index 9d505869ca..96ef11ed37 100644 --- a/bacula/src/filetypes.h +++ b/bacula/src/filetypes.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /** * Stream definitions. Split from baconfig.h Nov 2010 @@ -51,7 +55,7 @@ #define FT_NOOPEN 15 /* Could not open directory */ #define FT_RAW 16 /* Raw block device */ #define FT_FIFO 17 /* Raw fifo device */ -/** +/** * The DIRBEGIN packet is sent to the FD file processing routine so * that it can filter packets, but otherwise, it is not used * or saved */ diff --git a/bacula/src/findlib/Makefile.in b/bacula/src/findlib/Makefile.in index f886085113..7370881b39 100644 --- a/bacula/src/findlib/Makefile.in +++ b/bacula/src/findlib/Makefile.in @@ -1,6 +1,6 @@ # -# Author: Kern Sibbald -# License: LGPLv3 +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # Find files library Makefile # @@ -25,11 +25,12 @@ dummy: # # include files installed when using libtool # -INCLUDE_FILES = bfile.h find.h protos.h +INCLUDE_FILES = bfile.h find.h protos.h # -LIBBACFIND_SRCS = find.c match.c find_one.c file_attrs.c file_create.c \ - bfile.c drivetype.c priv.c fstype.c makepath.c +LIBBACFIND_SRCS = find.c match.c find_one.c attribs.c create_file.c \ + bfile.c drivetype.c enable_priv.c fstype.c mkpath.c \ + savecwd.c LIBBACFIND_OBJS = $(LIBBACFIND_SRCS:.c=.o) LIBBACFIND_LOBJS = $(LIBBACFIND_SRCS:.c=.lo) @@ -52,12 +53,12 @@ all: Makefile libbacfind$(DEFAULT_ARCHIVE_TYPE) ../lib/libbac$(DEFAULT_ARCHIVE_T @echo "==== Make of findlib is good ====" @echo " " -libbacfind.a: $(LIBBACFIND_OBJS) +libbacfind.a: $(LIBBACFIND_OBJS) @echo "Making $@ ..." $(AR) rc $@ $(LIBBACFIND_OBJS) $(RANLIB) $@ -libbacfind.la: Makefile $(LIBBACFIND_LOBJS) +libbacfind.la: Makefile $(LIBBACFIND_LOBJS) @echo "Making $@ ..." $(LIBTOOL_LINK) $(CXX) $(DEFS) $(DEBUG) $(LDFLAGS) -o $@ $(LIBBACFIND_LOBJS) -export-dynamic -rpath $(libdir) -release $(LIBBACFIND_LT_RELEASE) diff --git a/bacula/src/findlib/attribs.c b/bacula/src/findlib/attribs.c new file mode 100644 index 0000000000..5c8f518c7c --- /dev/null +++ b/bacula/src/findlib/attribs.c @@ -0,0 +1,660 @@ +/* + Bacula(R) - The Network Backup Solution + + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2002-2014 Free Software Foundation Europe e.V. + + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. + + You may use this file and others of this release according to the + license defined in the LICENSE file, which includes the Affero General + Public License, v3.0 ("AGPLv3") and some additional permissions and + terms pursuant to its AGPLv3 Section 7. + + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. +*/ +/* + * Encode and decode standard Unix attributes and + * Extended attributes for Win32 and + * other non-Unix systems, or Unix systems with ACLs, ... + * + * Kern Sibbald, October MMII + * + */ + +//#define _POSIX_C_SOURCE 200809L +//#define _BSD_SOURCE 1 + +#include "bacula.h" +#include "find.h" +#include "ch.h" + +static uid_t my_uid = 1; +static gid_t my_gid = 1; +static bool uid_set = false; + +/* + * For old systems that don't have lchown() or lchmod() + */ +#ifndef HAVE_LCHOWN +#define lchown chown +#endif +#ifndef HAVE_LCHMOD +#define lchmod chmod +#endif + +/*=============================================================*/ +/* */ +/* *** A l l S y s t e m s *** */ +/* */ +/*=============================================================*/ + +/* + * To turn off use of fchown(), fchmod(), or futimes(), + * uncomment one or more of the following. + */ +//#undef HAVE_FCHOWN +//#undef HAVE_FCHMOD +//#undef HAVE_FUTIMES + +/* + * Print errors only if debug level defined or we are root. + * root should not get errors. Errors for users causes + * too much output. + */ +#define print_error (chk_dbglvl(100) || my_uid == 0) + +bool set_mod_own_time(JCR *jcr, BFILE *ofd, ATTR *attr) +{ + bool ok = true; + struct utimbuf ut; + + /* Do not try to set rights with f functions when using a plugin */ + if (is_bopen(ofd) && !ofd->cmd_plugin) { /* TODO: Look with opt_plugin */ + /* + * The #ifdefing is a bit ugly, but it is the only + * way we can ensure this works on older systems. + */ +#ifdef HAVE_FCHOWN + if (fchown(ofd->fid, attr->statp.st_uid, attr->statp.st_gid) < 0 && print_error) { +#else + if (lchown(attr->ofname, attr->statp.st_uid, attr->statp.st_gid) < 0 && print_error) { +#endif + berrno be; + Jmsg2(jcr, M_ERROR, 0, _("Unable to set file owner %s: ERR=%s\n"), + attr->ofname, be.bstrerror()); + ok = false; + } + +#ifdef HAVE_FCHMOD + if (fchmod(ofd->fid, attr->statp.st_mode) < 0 && print_error) { +#else + if (lchmod(attr->ofname, attr->statp.st_mode) < 0 && print_error) { +#endif + berrno be; + Jmsg2(jcr, M_ERROR, 0, _("Unable to set file modes %s: ERR=%s\n"), + attr->ofname, be.bstrerror()); + ok = false; + } + +#ifdef HAVE_FUTIMES + struct timeval times[2]; + times[0].tv_sec = attr->statp.st_atime; + times[0].tv_usec = 0; + times[1].tv_sec = attr->statp.st_mtime; + times[1].tv_usec = 0; + if (futimes(ofd->fid, times) < 0 && print_error) { +#else + ut.actime = attr->statp.st_atime; + ut.modtime = attr->statp.st_mtime; + //bclose(ofd); + if (utime(attr->ofname, &ut) < 0 && print_error) { +#endif + berrno be; + Jmsg2(jcr, M_ERROR, 0, _("Unable to set file times %s: ERR=%s\n"), + attr->ofname, be.bstrerror()); + ok = false; + } + } else { + if (lchown(attr->ofname, attr->statp.st_uid, attr->statp.st_gid) < 0 && print_error) { + berrno be; + Jmsg2(jcr, M_ERROR, 0, _("Unable to set file owner %s: ERR=%s\n"), + attr->ofname, be.bstrerror()); + ok = false; + } + if (lchmod(attr->ofname, attr->statp.st_mode) < 0 && print_error) { + berrno be; + Jmsg2(jcr, M_ERROR, 0, _("Unable to set file modes %s: ERR=%s\n"), + attr->ofname, be.bstrerror()); + ok = false; + } + /* + * Reset file times. + */ + ut.actime = attr->statp.st_atime; + ut.modtime = attr->statp.st_mtime; + + if (utime(attr->ofname, &ut) < 0 && print_error) { + berrno be; + Jmsg2(jcr, M_ERROR, 0, _("Unable to set file times %s: ERR=%s\n"), + attr->ofname, be.bstrerror()); + ok = false; + } + } + return ok; +} + +/* + * Return the data stream that will be used + */ +int select_data_stream(FF_PKT *ff_pkt) +{ + int stream; + + /* This is a plugin special restore object */ + if (ff_pkt->type == FT_RESTORE_FIRST) { + ff_pkt->flags = 0; + return STREAM_FILE_DATA; + } + + /* + * Fix all incompatible options + */ + /* No sparse option for encrypted data */ + if (ff_pkt->flags & FO_ENCRYPT) { + ff_pkt->flags &= ~FO_SPARSE; + } + + /* Note, no sparse option for win32_data */ + if (!is_portable_backup(&ff_pkt->bfd)) { + stream = STREAM_WIN32_DATA; + ff_pkt->flags &= ~FO_SPARSE; + } else if (ff_pkt->flags & FO_SPARSE) { + stream = STREAM_SPARSE_DATA; + } else { + stream = STREAM_FILE_DATA; + } + if (ff_pkt->flags & FO_OFFSETS) { + stream = STREAM_SPARSE_DATA; + } + + /* Encryption is only supported for file data */ + if (stream != STREAM_FILE_DATA && stream != STREAM_WIN32_DATA && + stream != STREAM_MACOS_FORK_DATA) { + ff_pkt->flags &= ~FO_ENCRYPT; + } + + /* Compression is not supported for Mac fork data */ + if (stream == STREAM_MACOS_FORK_DATA) { + ff_pkt->flags &= ~FO_COMPRESS; + } + + /* + * Handle compression and encryption options + */ +#if defined(HAVE_LIBZ) || defined(HAVE_LZO) + if (ff_pkt->flags & FO_COMPRESS) { + #ifdef HAVE_LIBZ + if(ff_pkt->Compress_algo == COMPRESS_GZIP) { + switch (stream) { + case STREAM_WIN32_DATA: + stream = STREAM_WIN32_GZIP_DATA; + break; + case STREAM_SPARSE_DATA: + stream = STREAM_SPARSE_GZIP_DATA; + break; + case STREAM_FILE_DATA: + stream = STREAM_GZIP_DATA; + break; + default: + /* + * All stream types that do not support compression should clear out + * FO_COMPRESS above, and this code block should be unreachable. + */ + ASSERT(!(ff_pkt->flags & FO_COMPRESS)); + return STREAM_NONE; + } + } + #endif + #ifdef HAVE_LZO + if(ff_pkt->Compress_algo == COMPRESS_LZO1X) { + switch (stream) { + case STREAM_WIN32_DATA: + stream = STREAM_WIN32_COMPRESSED_DATA; + break; + case STREAM_SPARSE_DATA: + stream = STREAM_SPARSE_COMPRESSED_DATA; + break; + case STREAM_FILE_DATA: + stream = STREAM_COMPRESSED_DATA; + break; + default: + /* + * All stream types that do not support compression should clear out + * FO_COMPRESS above, and this code block should be unreachable. + */ + ASSERT(!(ff_pkt->flags & FO_COMPRESS)); + return STREAM_NONE; + } + } + #endif + } +#endif +#ifdef HAVE_CRYPTO + if (ff_pkt->flags & FO_ENCRYPT) { + switch (stream) { + case STREAM_WIN32_DATA: + stream = STREAM_ENCRYPTED_WIN32_DATA; + break; + case STREAM_WIN32_GZIP_DATA: + stream = STREAM_ENCRYPTED_WIN32_GZIP_DATA; + break; + case STREAM_WIN32_COMPRESSED_DATA: + stream = STREAM_ENCRYPTED_WIN32_COMPRESSED_DATA; + break; + case STREAM_FILE_DATA: + stream = STREAM_ENCRYPTED_FILE_DATA; + break; + case STREAM_GZIP_DATA: + stream = STREAM_ENCRYPTED_FILE_GZIP_DATA; + break; + case STREAM_COMPRESSED_DATA: + stream = STREAM_ENCRYPTED_FILE_COMPRESSED_DATA; + break; + default: + /* All stream types that do not support encryption should clear out + * FO_ENCRYPT above, and this code block should be unreachable. */ + ASSERT(!(ff_pkt->flags & FO_ENCRYPT)); + return STREAM_NONE; + } + } +#endif + + return stream; +} + + +/* + * Encode a stat structure into a base64 character string + * All systems must create such a structure. + * In addition, we tack on the LinkFI, which is non-zero in + * the case of a hard linked file that has no data. This + * is a File Index pointing to the link that does have the + * data (always the first one encountered in a save). + * You may piggyback attributes on this packet by encoding + * them in the encode_attribsEx() subroutine, but this is + * not recommended. + */ +void encode_stat(char *buf, struct stat *statp, int stat_size, int32_t LinkFI, int data_stream) +{ + char *p = buf; + /* + * We read the stat packet so make sure the caller's conception + * is the same as ours. They can be different if LARGEFILE is not + * the same when compiling this library and the calling program. + */ + ASSERT(stat_size == (int)sizeof(struct stat)); + + /* + * Encode a stat packet. I should have done this more intelligently + * with a length so that it could be easily expanded. + */ + p += to_base64((int64_t)statp->st_dev, p); + *p++ = ' '; /* separate fields with a space */ + p += to_base64((int64_t)statp->st_ino, p); + *p++ = ' '; + p += to_base64((int64_t)statp->st_mode, p); + *p++ = ' '; + p += to_base64((int64_t)statp->st_nlink, p); + *p++ = ' '; + p += to_base64((int64_t)statp->st_uid, p); + *p++ = ' '; + p += to_base64((int64_t)statp->st_gid, p); + *p++ = ' '; + p += to_base64((int64_t)statp->st_rdev, p); + *p++ = ' '; + p += to_base64((int64_t)statp->st_size, p); + *p++ = ' '; +#ifndef HAVE_MINGW + p += to_base64((int64_t)statp->st_blksize, p); + *p++ = ' '; + p += to_base64((int64_t)statp->st_blocks, p); + *p++ = ' '; +#else + p += to_base64((int64_t)0, p); /* output place holder */ + *p++ = ' '; + p += to_base64((int64_t)0, p); /* output place holder */ + *p++ = ' '; +#endif + p += to_base64((int64_t)statp->st_atime, p); + *p++ = ' '; + p += to_base64((int64_t)statp->st_mtime, p); + *p++ = ' '; + p += to_base64((int64_t)statp->st_ctime, p); + *p++ = ' '; + p += to_base64((int64_t)LinkFI, p); + *p++ = ' '; + +#ifdef HAVE_CHFLAGS + /* FreeBSD function */ + p += to_base64((int64_t)statp->st_flags, p); /* output st_flags */ +#else + p += to_base64((int64_t)0, p); /* output place holder */ +#endif + *p++ = ' '; + p += to_base64((int64_t)data_stream, p); +#ifdef HAVE_MINGW + *p++ = ' '; + p += to_base64((int64_t)statp->st_fattrs, p); +#endif + *p = 0; + return; +} + + +/* Do casting according to unknown type to keep compiler happy */ +#ifdef HAVE_TYPEOF + #define plug(st, val) st = (typeof st)val +#else + #if !HAVE_GCC & HAVE_SUN_OS + /* Sun compiler does not handle templates correctly */ + #define plug(st, val) st = val + #elif __sgi + #define plug(st, val) st = val + #else + /* Use templates to do the casting */ + template void plug(T &st, uint64_t val) + { st = static_cast(val); } + #endif +#endif + + +/* + * Decode a stat packet from base64 characters + * returns: data_stream + */ +int decode_stat(char *buf, struct stat *statp, int stat_size, int32_t *LinkFI) +{ + char *p = buf; + int64_t val; + int data_stream; + + /* + * We store into the stat packet so make sure the caller's conception + * is the same as ours. They can be different if LARGEFILE is not + * the same when compiling this library and the calling program. + */ + ASSERT(stat_size == (int)sizeof(struct stat)); + + p += from_base64(&val, p); + plug(statp->st_dev, val); + p++; + p += from_base64(&val, p); + plug(statp->st_ino, val); + p++; + p += from_base64(&val, p); + plug(statp->st_mode, val); + p++; + p += from_base64(&val, p); + plug(statp->st_nlink, val); + p++; + p += from_base64(&val, p); + plug(statp->st_uid, val); + p++; + p += from_base64(&val, p); + plug(statp->st_gid, val); + p++; + p += from_base64(&val, p); + plug(statp->st_rdev, val); + p++; + p += from_base64(&val, p); + plug(statp->st_size, val); + p++; +#ifndef HAVE_MINGW + p += from_base64(&val, p); + plug(statp->st_blksize, val); + p++; + p += from_base64(&val, p); + plug(statp->st_blocks, val); + p++; +#else + p += from_base64(&val, p); +// plug(statp->st_blksize, val); + p++; + p += from_base64(&val, p); +// plug(statp->st_blocks, val); + p++; +#endif + p += from_base64(&val, p); + plug(statp->st_atime, val); + p++; + p += from_base64(&val, p); + plug(statp->st_mtime, val); + p++; + p += from_base64(&val, p); + plug(statp->st_ctime, val); + + /* Optional FileIndex of hard linked file data */ + if (*p == ' ' || (*p != 0 && *(p+1) == ' ')) { + p++; + p += from_base64(&val, p); + *LinkFI = (uint32_t)val; + } else { + *LinkFI = 0; + return 0; + } + + /* FreeBSD user flags */ + if (*p == ' ' || (*p != 0 && *(p+1) == ' ')) { + p++; + p += from_base64(&val, p); +#ifdef HAVE_CHFLAGS + plug(statp->st_flags, val); + } else { + statp->st_flags = 0; +#endif + } + + /* Look for data stream id */ + if (*p == ' ' || (*p != 0 && *(p+1) == ' ')) { + p++; + p += from_base64(&val, p); + } else { + val = 0; + } + data_stream = val; +#ifdef HAVE_MINGW + if (*p == ' ' || (*p != 0 && *(p+1) == ' ')) { + p++; + p += from_base64(&val, p); + plug(statp->st_fattrs, val); + } else { + statp->st_fattrs = 0; + val = 0; + } +#endif + return data_stream; +} + +/* Decode a LinkFI field of encoded stat packet */ +int32_t decode_LinkFI(char *buf, struct stat *statp, int stat_size) +{ + char *p = buf; + int64_t val; + /* + * We store into the stat packet so make sure the caller's conception + * is the same as ours. They can be different if LARGEFILE is not + * the same when compiling this library and the calling program. + */ + ASSERT(stat_size == (int)sizeof(struct stat)); + + skip_nonspaces(&p); /* st_dev */ + p++; /* skip space */ + skip_nonspaces(&p); /* st_ino */ + p++; + p += from_base64(&val, p); + plug(statp->st_mode, val); /* st_mode */ + p++; + skip_nonspaces(&p); /* st_nlink */ + p++; + skip_nonspaces(&p); /* st_uid */ + p++; + skip_nonspaces(&p); /* st_gid */ + p++; + skip_nonspaces(&p); /* st_rdev */ + p++; + skip_nonspaces(&p); /* st_size */ + p++; + skip_nonspaces(&p); /* st_blksize */ + p++; + skip_nonspaces(&p); /* st_blocks */ + p++; + skip_nonspaces(&p); /* st_atime */ + p++; + skip_nonspaces(&p); /* st_mtime */ + p++; + skip_nonspaces(&p); /* st_ctime */ + + /* Optional FileIndex of hard linked file data */ + if (*p == ' ' || (*p != 0 && *(p+1) == ' ')) { + p++; + p += from_base64(&val, p); + return (int32_t)val; + } + return 0; +} + +/* + * Set file modes, permissions and times + * + * fname is the original filename + * ofile is the output filename (may be in a different directory) + * + * Returns: true on success + * false on failure + */ +bool set_attributes(JCR *jcr, ATTR *attr, BFILE *ofd) +{ + mode_t old_mask; + bool ok = true; + boffset_t fsize; + + if (uid_set) { + my_uid = getuid(); + my_gid = getgid(); + uid_set = true; + } + + old_mask = umask(0); + if (is_bopen(ofd)) { + char ec1[50], ec2[50]; + fsize = blseek(ofd, 0, SEEK_END); + if (attr->type == FT_REG && fsize > 0 && attr->statp.st_size > 0 && + fsize != (boffset_t)attr->statp.st_size) { + Jmsg3(jcr, M_ERROR, 0, _("File size of restored file %s not correct. Original %s, restored %s.\n"), + attr->ofname, edit_uint64(attr->statp.st_size, ec1), + edit_uint64(fsize, ec2)); + } + } + + /* + * We do not restore sockets, so skip trying to restore their + * attributes. + */ + if (attr->type == FT_SPEC && S_ISSOCK(attr->statp.st_mode)) { + goto bail_out; + } + + /* ***FIXME**** optimize -- don't do if already correct */ + /* + * For link, change owner of link using lchown, but don't + * try to do a chmod as that will update the file behind it. + */ + if (attr->type == FT_LNK) { + /* Change owner of link, not of real file */ + if (lchown(attr->ofname, attr->statp.st_uid, attr->statp.st_gid) < 0 && print_error) { + berrno be; + Jmsg2(jcr, M_ERROR, 0, _("Unable to set file owner %s: ERR=%s\n"), + attr->ofname, be.bstrerror()); + ok = false; + } + } else { + /* + * At this point, we have a file that is not a LINK + */ + ok = set_mod_own_time(jcr, ofd, attr); + +#ifdef HAVE_CHFLAGS + /* + * FreeBSD user flags + * + * Note, this should really be done before the utime() above, + * but if the immutable bit is set, it will make the utimes() + * fail. + */ + if (chflags(attr->ofname, attr->statp.st_flags) < 0 && print_error) { + berrno be; + Jmsg2(jcr, M_ERROR, 0, _("Unable to set file flags %s: ERR=%s\n"), + attr->ofname, be.bstrerror()); + ok = false; + } +#endif + } + +bail_out: + if (is_bopen(ofd)) { + bclose(ofd); + } + pm_strcpy(attr->ofname, "*none*"); + umask(old_mask); + return ok; +} + + +/*=============================================================*/ +/* */ +/* * * * U n i x * * * * */ +/* */ +/*=============================================================*/ + +#ifndef HAVE_WIN32 + +/* + * It is possible to piggyback additional data e.g. ACLs on + * the encode_stat() data by returning the extended attributes + * here. They must be "self-contained" (i.e. you keep track + * of your own length), and they must be in ASCII string + * format. Using this feature is not recommended. + * The code below shows how to return nothing. See the Win32 + * code below for returning something in the attributes. + */ +int encode_attribsEx(JCR *jcr, char *attribsEx, FF_PKT *ff_pkt) +{ +#ifdef HAVE_DARWIN_OS + /* + * We save the Mac resource fork length so that on a + * restore, we can be sure we put back the whole resource. + */ + char *p; + + *attribsEx = 0; /* no extended attributes (yet) */ + if (jcr->cmd_plugin || ff_pkt->type == FT_DELETED) { + return STREAM_UNIX_ATTRIBUTES; + } + p = attribsEx; + if (ff_pkt->flags & FO_HFSPLUS) { + p += to_base64((uint64_t)(ff_pkt->hfsinfo.rsrclength), p); + } + *p = 0; +#else + *attribsEx = 0; /* no extended attributes */ +#endif + return STREAM_UNIX_ATTRIBUTES; +} + +#endif + diff --git a/bacula/src/findlib/bfile.c b/bacula/src/findlib/bfile.c index 09254edc7e..92d6286145 100644 --- a/bacula/src/findlib/bfile.c +++ b/bacula/src/findlib/bfile.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2003-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula low level File I/O routines. This routine simulates @@ -53,78 +57,6 @@ void pause_msg(const char *file, const char *func, int line, const char *msg) } MessageBox(NULL, buf, "Pause", MB_OK); } - -/* - * The following code was contributed by Graham Keeling from his - * burp project. August 2014 - */ -static int encrypt_bopen(BFILE *bfd, const char *fname, uint64_t flags, mode_t mode) -{ - ULONG ulFlags = 0; - POOLMEM *win32_fname; - POOLMEM *win32_fname_wchar; - - bfd->mode = BF_CLOSED; - bfd->fid = -1; - - if (!(p_OpenEncryptedFileRawA || p_OpenEncryptedFileRawW)) { - Dmsg0(50, "No OpenEncryptedFileRawA and no OpenEncryptedFileRawW APIs!!!\n"); - return -1; - } - - /* Convert to Windows path format */ - win32_fname = get_pool_memory(PM_FNAME); - win32_fname_wchar = get_pool_memory(PM_FNAME); - - unix_name_to_win32(&win32_fname, (char *)fname); - - if (p_CreateFileW && p_MultiByteToWideChar) { - make_win32_path_UTF8_2_wchar(&win32_fname_wchar, fname); - } - - if ((flags & O_CREAT) || (flags & O_WRONLY)) { - ulFlags = CREATE_FOR_IMPORT | OVERWRITE_HIDDEN; - if (bfd->fattrs & FILE_ATTRIBUTE_DIRECTORY) { - mkdir(fname, 0777); - ulFlags |= CREATE_FOR_DIR; - } - bfd->mode = BF_WRITE; - } else { - /* Open existing for read */ - ulFlags = CREATE_FOR_EXPORT; - bfd->mode = BF_READ; - } - - if (p_OpenEncryptedFileRawW && p_MultiByteToWideChar) { - /* unicode open */ - if (p_OpenEncryptedFileRawW((LPCWSTR)win32_fname_wchar, - ulFlags, &(bfd->pvContext))) { - bfd->mode = BF_CLOSED; - } - } else { - /* ascii open */ - if (p_OpenEncryptedFileRawA(win32_fname, ulFlags, &(bfd->pvContext))) { - bfd->mode = BF_CLOSED; - } - } - free_pool_memory(win32_fname_wchar); - free_pool_memory(win32_fname); - bfd->fid = (bfd->mode == BF_CLOSED) ? -1 : 0; - return bfd->mode==BF_CLOSED ? -1: 1; -} - -static int encrypt_bclose(BFILE *bfd) -{ - if (p_CloseEncryptedFileRaw) { - p_CloseEncryptedFileRaw(bfd->pvContext); - } - bfd->pvContext = NULL; - bfd->mode = BF_CLOSED; - bfd->fattrs = 0; - bfd->fid = -1; - return 0; -} - #endif /* =============================================================== @@ -153,136 +85,136 @@ const char *stream_to_ascii(int stream) static char buf[20]; switch (stream & STREAMMASK_TYPE) { - case STREAM_UNIX_ATTRIBUTES: - return _("Unix attributes"); - case STREAM_FILE_DATA: - return _("File data"); - case STREAM_MD5_DIGEST: - return _("MD5 digest"); - case STREAM_GZIP_DATA: - return _("GZIP data"); - case STREAM_COMPRESSED_DATA: - return _("Compressed data"); - case STREAM_UNIX_ATTRIBUTES_EX: - return _("Extended attributes"); - case STREAM_SPARSE_DATA: - return _("Sparse data"); - case STREAM_SPARSE_GZIP_DATA: - return _("GZIP sparse data"); - case STREAM_SPARSE_COMPRESSED_DATA: - return _("Compressed sparse data"); - case STREAM_PROGRAM_NAMES: - return _("Program names"); - case STREAM_PROGRAM_DATA: - return _("Program data"); - case STREAM_SHA1_DIGEST: - return _("SHA1 digest"); - case STREAM_WIN32_DATA: - return _("Win32 data"); - case STREAM_WIN32_GZIP_DATA: - return _("Win32 GZIP data"); - case STREAM_WIN32_COMPRESSED_DATA: - return _("Win32 compressed data"); - case STREAM_MACOS_FORK_DATA: - return _("MacOS Fork data"); - case STREAM_HFSPLUS_ATTRIBUTES: - return _("HFS+ attribs"); - case STREAM_UNIX_ACCESS_ACL: - return _("Standard Unix ACL attribs"); - case STREAM_UNIX_DEFAULT_ACL: - return _("Default Unix ACL attribs"); - case STREAM_SHA256_DIGEST: - return _("SHA256 digest"); - case STREAM_SHA512_DIGEST: - return _("SHA512 digest"); - case STREAM_SIGNED_DIGEST: - return _("Signed digest"); - case STREAM_ENCRYPTED_FILE_DATA: - return _("Encrypted File data"); - case STREAM_ENCRYPTED_WIN32_DATA: - return _("Encrypted Win32 data"); - case STREAM_ENCRYPTED_SESSION_DATA: - return _("Encrypted session data"); - case STREAM_ENCRYPTED_FILE_GZIP_DATA: - return _("Encrypted GZIP data"); - case STREAM_ENCRYPTED_FILE_COMPRESSED_DATA: - return _("Encrypted compressed data"); - case STREAM_ENCRYPTED_WIN32_GZIP_DATA: - return _("Encrypted Win32 GZIP data"); - case STREAM_ENCRYPTED_WIN32_COMPRESSED_DATA: - return _("Encrypted Win32 Compressed data"); - case STREAM_ENCRYPTED_MACOS_FORK_DATA: - return _("Encrypted MacOS fork data"); - case STREAM_PLUGIN_NAME: - return _("Plugin Name"); - case STREAM_PLUGIN_DATA: - return _("Plugin Data"); - case STREAM_RESTORE_OBJECT: - return _("Restore Object"); - case STREAM_ACL_AIX_TEXT: - return _("AIX Specific ACL attribs"); - case STREAM_ACL_DARWIN_ACCESS_ACL: - return _("Darwin Specific ACL attribs"); - case STREAM_ACL_FREEBSD_DEFAULT_ACL: - return _("FreeBSD Specific Default ACL attribs"); - case STREAM_ACL_FREEBSD_ACCESS_ACL: - return _("FreeBSD Specific Access ACL attribs"); - case STREAM_ACL_HPUX_ACL_ENTRY: - return _("HPUX Specific ACL attribs"); - case STREAM_ACL_IRIX_DEFAULT_ACL: - return _("Irix Specific Default ACL attribs"); - case STREAM_ACL_IRIX_ACCESS_ACL: - return _("Irix Specific Access ACL attribs"); - case STREAM_ACL_LINUX_DEFAULT_ACL: - return _("Linux Specific Default ACL attribs"); - case STREAM_ACL_LINUX_ACCESS_ACL: - return _("Linux Specific Access ACL attribs"); - case STREAM_ACL_TRU64_DEFAULT_ACL: - return _("TRU64 Specific Default ACL attribs"); - case STREAM_ACL_TRU64_ACCESS_ACL: - return _("TRU64 Specific Access ACL attribs"); - case STREAM_ACL_SOLARIS_ACLENT: - return _("Solaris Specific POSIX ACL attribs"); - case STREAM_ACL_SOLARIS_ACE: - return _("Solaris Specific NFSv4/ZFS ACL attribs"); - case STREAM_ACL_AFS_TEXT: - return _("AFS Specific ACL attribs"); - case STREAM_ACL_AIX_AIXC: - return _("AIX Specific POSIX ACL attribs"); - case STREAM_ACL_AIX_NFS4: - return _("AIX Specific NFSv4 ACL attribs"); - case STREAM_ACL_FREEBSD_NFS4_ACL: - return _("FreeBSD Specific NFSv4/ZFS ACL attribs"); - case STREAM_ACL_HURD_DEFAULT_ACL: - return _("GNU Hurd Specific Default ACL attribs"); - case STREAM_ACL_HURD_ACCESS_ACL: - return _("GNU Hurd Specific Access ACL attribs"); - case STREAM_XATTR_HURD: - return _("GNU Hurd Specific Extended attribs"); - case STREAM_XATTR_IRIX: - return _("IRIX Specific Extended attribs"); - case STREAM_XATTR_TRU64: - return _("TRU64 Specific Extended attribs"); - case STREAM_XATTR_AIX: - return _("AIX Specific Extended attribs"); - case STREAM_XATTR_OPENBSD: - return _("OpenBSD Specific Extended attribs"); - case STREAM_XATTR_SOLARIS_SYS: - return _("Solaris Specific Extensible attribs or System Extended attribs"); - case STREAM_XATTR_SOLARIS: - return _("Solaris Specific Extended attribs"); - case STREAM_XATTR_DARWIN: - return _("Darwin Specific Extended attribs"); - case STREAM_XATTR_FREEBSD: - return _("FreeBSD Specific Extended attribs"); - case STREAM_XATTR_LINUX: - return _("Linux Specific Extended attribs"); - case STREAM_XATTR_NETBSD: - return _("NetBSD Specific Extended attribs"); - default: - sprintf(buf, "%d", stream); - return (const char *)buf; - } + case STREAM_UNIX_ATTRIBUTES: + return _("Unix attributes"); + case STREAM_FILE_DATA: + return _("File data"); + case STREAM_MD5_DIGEST: + return _("MD5 digest"); + case STREAM_GZIP_DATA: + return _("GZIP data"); + case STREAM_COMPRESSED_DATA: + return _("Compressed data"); + case STREAM_UNIX_ATTRIBUTES_EX: + return _("Extended attributes"); + case STREAM_SPARSE_DATA: + return _("Sparse data"); + case STREAM_SPARSE_GZIP_DATA: + return _("GZIP sparse data"); + case STREAM_SPARSE_COMPRESSED_DATA: + return _("Compressed sparse data"); + case STREAM_PROGRAM_NAMES: + return _("Program names"); + case STREAM_PROGRAM_DATA: + return _("Program data"); + case STREAM_SHA1_DIGEST: + return _("SHA1 digest"); + case STREAM_WIN32_DATA: + return _("Win32 data"); + case STREAM_WIN32_GZIP_DATA: + return _("Win32 GZIP data"); + case STREAM_WIN32_COMPRESSED_DATA: + return _("Win32 compressed data"); + case STREAM_MACOS_FORK_DATA: + return _("MacOS Fork data"); + case STREAM_HFSPLUS_ATTRIBUTES: + return _("HFS+ attribs"); + case STREAM_UNIX_ACCESS_ACL: + return _("Standard Unix ACL attribs"); + case STREAM_UNIX_DEFAULT_ACL: + return _("Default Unix ACL attribs"); + case STREAM_SHA256_DIGEST: + return _("SHA256 digest"); + case STREAM_SHA512_DIGEST: + return _("SHA512 digest"); + case STREAM_SIGNED_DIGEST: + return _("Signed digest"); + case STREAM_ENCRYPTED_FILE_DATA: + return _("Encrypted File data"); + case STREAM_ENCRYPTED_WIN32_DATA: + return _("Encrypted Win32 data"); + case STREAM_ENCRYPTED_SESSION_DATA: + return _("Encrypted session data"); + case STREAM_ENCRYPTED_FILE_GZIP_DATA: + return _("Encrypted GZIP data"); + case STREAM_ENCRYPTED_FILE_COMPRESSED_DATA: + return _("Encrypted compressed data"); + case STREAM_ENCRYPTED_WIN32_GZIP_DATA: + return _("Encrypted Win32 GZIP data"); + case STREAM_ENCRYPTED_WIN32_COMPRESSED_DATA: + return _("Encrypted Win32 Compressed data"); + case STREAM_ENCRYPTED_MACOS_FORK_DATA: + return _("Encrypted MacOS fork data"); + case STREAM_PLUGIN_NAME: + return _("Plugin Name"); + case STREAM_PLUGIN_DATA: + return _("Plugin Data"); + case STREAM_RESTORE_OBJECT: + return _("Restore Object"); + case STREAM_ACL_AIX_TEXT: + return _("AIX ACL attribs"); + case STREAM_ACL_DARWIN_ACCESS: + return _("Darwin ACL attribs"); + case STREAM_ACL_FREEBSD_DEFAULT: + return _("FreeBSD Default ACL attribs"); + case STREAM_ACL_FREEBSD_ACCESS: + return _("FreeBSD Access ACL attribs"); + case STREAM_ACL_HPUX_ACL_ENTRY: + return _("HPUX ACL attribs"); + case STREAM_ACL_IRIX_DEFAULT: + return _("Irix Default ACL attribs"); + case STREAM_ACL_IRIX_ACCESS: + return _("Irix Access ACL attribs"); + case STREAM_ACL_LINUX_DEFAULT: + return _("Linux Default ACL attribs"); + case STREAM_ACL_LINUX_ACCESS: + return _("Linux Access ACL attribs"); + case STREAM_ACL_TRU64_DEFAULT: + return _("TRU64 Default ACL attribs"); + case STREAM_ACL_TRU64_ACCESS: + return _("TRU64 Access ACL attribs"); + case STREAM_ACL_SOLARIS_POSIX: + return _("Solaris POSIX ACL attribs"); + case STREAM_ACL_SOLARIS_NFS4: + return _("Solaris NFSv4/ZFS ACL attribs"); + case STREAM_ACL_AFS_TEXT: + return _("AFS ACL attribs"); + case STREAM_ACL_AIX_AIXC: + return _("AIX POSIX ACL attribs"); + case STREAM_ACL_AIX_NFS4: + return _("AIX NFSv4 ACL attribs"); + case STREAM_ACL_FREEBSD_NFS4: + return _("FreeBSD NFSv4/ZFS ACL attribs"); + case STREAM_ACL_HURD_DEFAULT: + return _("GNU Hurd Default ACL attribs"); + case STREAM_ACL_HURD_ACCESS: + return _("GNU Hurd Access ACL attribs"); + case STREAM_XATTR_HURD: + return _("GNU Hurd Extended attribs"); + case STREAM_XATTR_IRIX: + return _("IRIX Extended attribs"); + case STREAM_XATTR_TRU64: + return _("TRU64 Extended attribs"); + case STREAM_XATTR_AIX: + return _("AIX Extended attribs"); + case STREAM_XATTR_OPENBSD: + return _("OpenBSD Extended attribs"); + case STREAM_XATTR_SOLARIS_SYS: + return _("Solaris Extensible attribs or System Extended attribs"); + case STREAM_XATTR_SOLARIS: + return _("Solaris Extended attribs"); + case STREAM_XATTR_DARWIN: + return _("Darwin Extended attribs"); + case STREAM_XATTR_FREEBSD: + return _("FreeBSD Extended attribs"); + case STREAM_XATTR_LINUX: + return _("Linux Extended attribs"); + case STREAM_XATTR_NETBSD: + return _("NetBSD Extended attribs"); + default: + sprintf(buf, "%d", stream); + return (const char *)buf; + } } /** @@ -326,7 +258,7 @@ void int32_LE2BE(int32_t* pBE, const int32_t v) } -/* +/** * Read a BackupRead block and pull out the file data */ bool processWin32BackupAPIBlock (BFILE *bfd, void *pBuffer, ssize_t dwSize) @@ -627,12 +559,12 @@ int bopen_rsrc(BFILE *bfd, const char *fname, uint64_t flags, mode_t mode) free_pool_memory(rsrc_fname); return bfd->fid; } -#else +#else /* Unix */ + /* Unix */ int bopen_rsrc(BFILE *bfd, const char *fname, uint64_t flags, mode_t mode) -{ - return -1; -} + { return -1; } + #endif @@ -641,7 +573,7 @@ int bclose(BFILE *bfd) { int stat; - Dmsg1(400, "Close file %d\n", bfd->fid); + Dmsg2(400, "Close bfd=%p file %d\n", bfd, bfd->fid); if (bfd->fid == -1) { return 0; @@ -721,3 +653,4 @@ boffset_t blseek(BFILE *bfd, boffset_t offset, int whence) bfd->berrno = errno; return pos; } + diff --git a/bacula/src/findlib/bfile.h b/bacula/src/findlib/bfile.h index e1b543a63f..d0797ae7e5 100644 --- a/bacula/src/findlib/bfile.h +++ b/bacula/src/findlib/bfile.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2003-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula low level File I/O routines. This routine simulates @@ -52,7 +56,7 @@ typedef struct _PROCESS_WIN32_BACKUPAPIBLOCK_CONTEXT { * * ======================================================= */ -#if defined(HAVE_WIN32) +#ifdef HAVE_WIN32 enum { BF_CLOSED, @@ -63,7 +67,8 @@ enum { /* In bfile.c */ /* Basic Win32 low level I/O file packet */ -struct BFILE { +class BFILE { +public: bool use_backup_api; /* set if using BackupRead/Write */ int mode; /* set if file is open */ HANDLE fh; /* Win32 file handle */ @@ -72,6 +77,7 @@ struct BFILE { POOLMEM *errmsg; /* error message buffer */ DWORD rw_bytes; /* Bytes read or written */ DWORD lerror; /* Last error code */ + DWORD fattrs; /* Windows file attributes */ int berrno; /* errno */ int block; /* Count of read/writes */ uint64_t total_bytes; /* bytes written */ @@ -81,10 +87,16 @@ struct BFILE { int use_backup_decomp; /* set if using BackupRead Stream Decomposition */ bool reparse_point; /* set if reparse point */ bool cmd_plugin; /* set if we have a command plugin */ + bool const is_encrypted() const; }; +/* Windows encrypted file system */ +inline const bool BFILE::is_encrypted() const + { return (fattrs & FILE_ATTRIBUTE_ENCRYPTED) != 0; }; + HANDLE bget_handle(BFILE *bfd); + #else /* Linux/Unix systems */ /* ======================================================= @@ -114,6 +126,11 @@ struct BFILE { void binit(BFILE *bfd); bool is_bopen(BFILE *bfd); +#ifdef HAVE_WIN32 +void set_fattrs(BFILE *bfd, struct stat *statp); +#else +#define set_fattrs(bfd, fattrs) +#endif bool set_win32_backup(BFILE *bfd); bool set_portable_backup(BFILE *bfd); bool set_cmd_plugin(BFILE *bfd, JCR *jcr); diff --git a/bacula/src/findlib/create_file.c b/bacula/src/findlib/create_file.c new file mode 100644 index 0000000000..0641b69408 --- /dev/null +++ b/bacula/src/findlib/create_file.c @@ -0,0 +1,480 @@ +/* + Bacula(R) - The Network Backup Solution + + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2014 Free Software Foundation Europe e.V. + + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. + + You may use this file and others of this release according to the + license defined in the LICENSE file, which includes the Affero General + Public License, v3.0 ("AGPLv3") and some additional permissions and + terms pursuant to its AGPLv3 Section 7. + + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. +*/ +/* + * Create a file, and reset the modes + * + * Kern Sibbald, November MM + * + */ + +#include "bacula.h" +#include "find.h" + +#ifndef S_IRWXUGO +#define S_IRWXUGO (S_IRWXU | S_IRWXG | S_IRWXO) +#endif + +#ifndef IS_CTG +#define IS_CTG(x) 0 +#define O_CTG 0 +#endif + +#ifndef O_EXCL +#define O_EXCL 0 +#endif +#ifndef O_NOFOLLOW +#define O_NOFOLLOW 0 +#endif + +static int separate_path_and_file(JCR *jcr, char *fname, char *ofile); +static int path_already_seen(JCR *jcr, char *path, int pnl); + + +/* + * Create the file, or the directory + * + * fname is the original filename + * ofile is the output filename (may be in a different directory) + * + * Returns: CF_SKIP if file should be skipped + * CF_ERROR on error + * CF_EXTRACT file created and data to restore + * CF_CREATED file created no data to restore + * + * Note, we create the file here, except for special files, + * we do not set the attributes because we want to first + * write the file, then when the writing is done, set the + * attributes. + * So, we return with the file descriptor open for normal + * files. + * + */ +int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace) +{ + mode_t new_mode, parent_mode; + int flags; + uid_t uid; + gid_t gid; + int pnl; + bool exists = false; + struct stat mstatp; + + bfd->reparse_point = false; + if (is_win32_stream(attr->data_stream)) { + set_win32_backup(bfd); + } else { + set_portable_backup(bfd); + } + + new_mode = attr->statp.st_mode; + Dmsg3(200, "type=%d newmode=%x file=%s\n", attr->type, new_mode, attr->ofname); + parent_mode = S_IWUSR | S_IXUSR | new_mode; + gid = attr->statp.st_gid; + uid = attr->statp.st_uid; + +#ifdef HAVE_WIN32 + if (!bfd->use_backup_api) { + // eliminate invalid windows filename characters from foreign filenames + char *ch = (char *)attr->ofname; + if (ch[0] != 0 && ch[1] != 0) { + ch += 2; + while (*ch) { + switch (*ch) { + case ':': + case '<': + case '>': + case '*': + case '?': + case '|': + *ch = '_'; + break; + } + ch++; + } + } + } +#endif + + Dmsg2(400, "Replace=%c %d\n", (char)replace, replace); + if (lstat(attr->ofname, &mstatp) == 0) { + exists = true; + switch (replace) { + case REPLACE_IFNEWER: + if (attr->statp.st_mtime <= mstatp.st_mtime) { + Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Not newer: %s\n"), attr->ofname); + return CF_SKIP; + } + break; + + case REPLACE_IFOLDER: + if (attr->statp.st_mtime >= mstatp.st_mtime) { + Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Not older: %s\n"), attr->ofname); + return CF_SKIP; + } + break; + + case REPLACE_NEVER: + /* Set attributes if we created this directory */ + if (attr->type == FT_DIREND && path_list_lookup(jcr, attr->ofname)) { + break; + } + Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Already exists: %s\n"), attr->ofname); + return CF_SKIP; + + case REPLACE_ALWAYS: + break; + } + } + switch (attr->type) { + case FT_RAW: /* raw device to be written */ + case FT_FIFO: /* FIFO to be written to */ + case FT_LNKSAVED: /* Hard linked, file already saved */ + case FT_LNK: + case FT_SPEC: /* fifo, ... to be backed up */ + case FT_REGE: /* empty file */ + case FT_REG: /* regular file */ + /* + * Note, we do not delete FT_RAW because these are device files + * or FIFOs that should already exist. If we blow it away, + * we may blow away a FIFO that is being used to read the + * restore data, or we may blow away a partition definition. + */ + if (exists && attr->type != FT_RAW && attr->type != FT_FIFO) { + /* Get rid of old copy */ + Dmsg1(400, "unlink %s\n", attr->ofname); + if (unlink(attr->ofname) == -1) { + berrno be; + Qmsg(jcr, M_ERROR, 0, _("File %s already exists and could not be replaced. ERR=%s.\n"), + attr->ofname, be.bstrerror()); + return CF_ERROR; + } + } + /* + * Here we do some preliminary work for all the above + * types to create the path to the file if it does + * not already exist. Below, we will split to + * do the file type specific work + */ + pnl = separate_path_and_file(jcr, attr->fname, attr->ofname); + if (pnl < 0) { + return CF_ERROR; + } + + /* + * If path length is <= 0 we are making a file in the root + * directory. Assume that the directory already exists. + */ + if (pnl > 0) { + char savechr; + savechr = attr->ofname[pnl]; + attr->ofname[pnl] = 0; /* terminate path */ + + if (!path_already_seen(jcr, attr->ofname, pnl)) { + Dmsg1(400, "Make path %s\n", attr->ofname); + /* + * If we need to make the directory, ensure that it is with + * execute bit set (i.e. parent_mode), and preserve what already + * exists. Normally, this should do nothing. + */ + if (!makepath(attr, attr->ofname, parent_mode, parent_mode, uid, gid, 1)) { + Dmsg1(10, "Could not make path. %s\n", attr->ofname); + attr->ofname[pnl] = savechr; /* restore full name */ + return CF_ERROR; + } + } + attr->ofname[pnl] = savechr; /* restore full name */ + } + + /* Now we do the specific work for each file type */ + switch(attr->type) { + case FT_REGE: + case FT_REG: + Dmsg1(100, "Create=%s\n", attr->ofname); + flags = O_WRONLY | O_CREAT | O_BINARY | O_EXCL; + if (IS_CTG(attr->statp.st_mode)) { + flags |= O_CTG; /* set contiguous bit if needed */ + } + if (is_bopen(bfd)) { + Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid); + bclose(bfd); + } + + set_fattrs(bfd, &attr->statp); + if ((bopen(bfd, attr->ofname, flags, S_IRUSR | S_IWUSR)) < 0) { + berrno be; + be.set_errno(bfd->berrno); + Qmsg2(jcr, M_ERROR, 0, _("Could not create %s: ERR=%s\n"), + attr->ofname, be.bstrerror()); + Dmsg2(100,"Could not create %s: ERR=%s\n", attr->ofname, be.bstrerror()); + return CF_ERROR; + } + return CF_EXTRACT; + +#ifndef HAVE_WIN32 // none of these exist in MS Windows + case FT_RAW: /* Bacula raw device e.g. /dev/sda1 */ + case FT_FIFO: /* Bacula fifo to save data */ + case FT_SPEC: + if (S_ISFIFO(attr->statp.st_mode)) { + Dmsg1(400, "Restore fifo: %s\n", attr->ofname); + if (mkfifo(attr->ofname, attr->statp.st_mode) != 0 && errno != EEXIST) { + berrno be; + Qmsg2(jcr, M_ERROR, 0, _("Cannot make fifo %s: ERR=%s\n"), + attr->ofname, be.bstrerror()); + return CF_ERROR; + } + } else if (S_ISSOCK(attr->statp.st_mode)) { + Dmsg1(200, "Skipping restore of socket: %s\n", attr->ofname); +#ifdef S_IFDOOR // Solaris high speed RPC mechanism + } else if (S_ISDOOR(attr->statp.st_mode)) { + Dmsg1(200, "Skipping restore of door file: %s\n", attr->ofname); +#endif +#ifdef S_IFPORT // Solaris event port for handling AIO + } else if (S_ISPORT(attr->statp.st_mode)) { + Dmsg1(200, "Skipping restore of event port file: %s\n", attr->ofname); +#endif + } else { + Dmsg1(400, "Restore node: %s\n", attr->ofname); + if (mknod(attr->ofname, attr->statp.st_mode, attr->statp.st_rdev) != 0 && errno != EEXIST) { + berrno be; + Qmsg2(jcr, M_ERROR, 0, _("Cannot make node %s: ERR=%s\n"), + attr->ofname, be.bstrerror()); + return CF_ERROR; + } + } + /* + * Here we are going to attempt to restore to a FIFO, which + * means that the FIFO must already exist, AND there must + * be some process already attempting to read from the + * FIFO, so we open it write-only. + */ + if (attr->type == FT_RAW || attr->type == FT_FIFO) { + btimer_t *tid; + Dmsg1(400, "FT_RAW|FT_FIFO %s\n", attr->ofname); + flags = O_WRONLY | O_BINARY; + /* Timeout open() in 60 seconds */ + if (attr->type == FT_FIFO) { + Dmsg0(400, "Set FIFO timer\n"); + tid = start_thread_timer(jcr, pthread_self(), 60); + } else { + tid = NULL; + } + if (is_bopen(bfd)) { + Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid); + } + Dmsg2(400, "open %s flags=0x%x\n", attr->ofname, flags); + set_fattrs(bfd, &attr->statp); + if ((bopen(bfd, attr->ofname, flags, 0)) < 0) { + berrno be; + be.set_errno(bfd->berrno); + Qmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"), + attr->ofname, be.bstrerror()); + Dmsg2(400, "Could not open %s: ERR=%s\n", attr->ofname, be.bstrerror()); + stop_thread_timer(tid); + return CF_ERROR; + } + stop_thread_timer(tid); + return CF_EXTRACT; + } + Dmsg1(400, "FT_SPEC %s\n", attr->ofname); + return CF_CREATED; + + case FT_LNK: + Dmsg2(130, "FT_LNK should restore: %s -> %s\n", attr->ofname, attr->olname); + if (symlink(attr->olname, attr->ofname) != 0 && errno != EEXIST) { + berrno be; + Qmsg3(jcr, M_ERROR, 0, _("Could not symlink %s -> %s: ERR=%s\n"), + attr->ofname, attr->olname, be.bstrerror()); + return CF_ERROR; + } + return CF_CREATED; + + case FT_LNKSAVED: /* Hard linked, file already saved */ + Dmsg2(130, "Hard link %s => %s\n", attr->ofname, attr->olname); + if (link(attr->olname, attr->ofname) != 0) { + berrno be; +#ifdef HAVE_CHFLAGS + struct stat s; + /* + * If using BSD user flags, maybe has a file flag + * preventing this. So attempt to disable, retry link, + * and reset flags. + * Note that BSD securelevel may prevent disabling flag. + */ + if (stat(attr->olname, &s) == 0 && s.st_flags != 0) { + if (chflags(attr->olname, 0) == 0) { + if (link(attr->olname, attr->ofname) != 0) { + /* restore original file flags even when linking failed */ + if (chflags(attr->olname, s.st_flags) < 0) { + Qmsg2(jcr, M_ERROR, 0, _("Could not restore file flags for file %s: ERR=%s\n"), + attr->olname, be.bstrerror()); + } +#endif /* HAVE_CHFLAGS */ + Qmsg3(jcr, M_ERROR, 0, _("Could not hard link %s -> %s: ERR=%s\n"), + attr->ofname, attr->olname, be.bstrerror()); + Dmsg3(200, "Could not hard link %s -> %s: ERR=%s\n", + attr->ofname, attr->olname, be.bstrerror()); + return CF_ERROR; +#ifdef HAVE_CHFLAGS + } + /* finally restore original file flags */ + if (chflags(attr->olname, s.st_flags) < 0) { + Qmsg2(jcr, M_ERROR, 0, _("Could not restore file flags for file %s: ERR=%s\n"), + attr->olname, be.bstrerror()); + } + } else { + Qmsg2(jcr, M_ERROR, 0, _("Could not reset file flags for file %s: ERR=%s\n"), + attr->olname, be.bstrerror()); + } + } else { + Qmsg3(jcr, M_ERROR, 0, _("Could not hard link %s -> %s: ERR=%s\n"), + attr->ofname, attr->olname, be.bstrerror()); + return CF_ERROR; + } +#endif /* HAVE_CHFLAGS */ + + } + return CF_CREATED; +#endif + } /* End inner switch */ + + case FT_REPARSE: + case FT_JUNCTION: + bfd->reparse_point = true; + /* Fall through wanted */ + case FT_DIRBEGIN: + case FT_DIREND: + Dmsg2(200, "Make dir mode=%o dir=%s\n", new_mode, attr->ofname); + if (!makepath(attr, attr->ofname, new_mode, parent_mode, uid, gid, 0)) { + return CF_ERROR; + } + /* + * If we are using the Win32 Backup API, we open the + * directory so that the security info will be read + * and saved. + */ + if (!is_portable_backup(bfd)) { + if (is_bopen(bfd)) { + Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid); + } + set_fattrs(bfd, &attr->statp); + if ((bopen(bfd, attr->ofname, O_WRONLY|O_BINARY, 0)) < 0) { + berrno be; + be.set_errno(bfd->berrno); +#ifdef HAVE_WIN32 + /* Check for trying to create a drive, if so, skip */ + if (attr->ofname[1] == ':' && + IsPathSeparator(attr->ofname[2]) && + attr->ofname[3] == '\0') { + return CF_SKIP; + } +#endif + Qmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"), + attr->ofname, be.bstrerror()); + return CF_ERROR; + } + return CF_EXTRACT; + } else { + return CF_CREATED; + } + + case FT_DELETED: + Qmsg2(jcr, M_INFO, 0, _("Original file %s have been deleted: type=%d\n"), attr->fname, attr->type); + break; + /* The following should not occur */ + case FT_NOACCESS: + case FT_NOFOLLOW: + case FT_NOSTAT: + case FT_DIRNOCHG: + case FT_NOCHG: + case FT_ISARCH: + case FT_NORECURSE: + case FT_NOFSCHG: + case FT_NOOPEN: + Qmsg2(jcr, M_ERROR, 0, _("Original file %s not saved: type=%d\n"), attr->fname, attr->type); + break; + default: + Qmsg2(jcr, M_ERROR, 0, _("Unknown file type %d; not restored: %s\n"), attr->type, attr->fname); + Pmsg2(000, "Unknown file type %d; not restored: %s\n", attr->type, attr->fname); + break; + } + return CF_ERROR; +} + +/* + * Returns: > 0 index into path where last path char is. + * 0 no path + * -1 filename is zero length + */ +static int separate_path_and_file(JCR *jcr, char *fname, char *ofile) +{ + char *f, *p, *q; + int fnl, pnl; + + /* Separate pathname and filename */ + for (q=p=f=ofile; *p; p++) { +#ifdef HAVE_WIN32 + if (IsPathSeparator(*p)) { + f = q; + if (IsPathSeparator(p[1])) { + p++; + } + } + *q++ = *p; /* copy data */ +#else + if (IsPathSeparator(*p)) { + f = q; /* possible filename */ + } + q++; +#endif + } + + if (IsPathSeparator(*f)) { + f++; + } + *q = 0; /* terminate string */ + + fnl = q - f; + if (fnl == 0) { + /* The filename length must not be zero here because we + * are dealing with a file (i.e. FT_REGE or FT_REG). + */ + Jmsg1(jcr, M_ERROR, 0, _("Zero length filename: %s\n"), fname); + return -1; + } + pnl = f - ofile - 1; + return pnl; +} + +/* + * Primitive caching of path to prevent recreating a pathname + * each time as long as we remain in the same directory. + */ +static int path_already_seen(JCR *jcr, char *path, int pnl) +{ + if (!jcr->cached_path) { + jcr->cached_path = get_pool_memory(PM_FNAME); + } + if (jcr->cached_pnl == pnl && strcmp(path, jcr->cached_path) == 0) { + return 1; + } + pm_strcpy(jcr->cached_path, path); + jcr->cached_pnl = pnl; + return 0; +} diff --git a/bacula/src/findlib/drivetype.c b/bacula/src/findlib/drivetype.c index 24c0802324..1f68fa0f40 100644 --- a/bacula/src/findlib/drivetype.c +++ b/bacula/src/findlib/drivetype.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2006-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Implement routines to determine drive type (Windows specific). diff --git a/bacula/src/findlib/enable_priv.c b/bacula/src/findlib/enable_priv.c new file mode 100644 index 0000000000..884ed41df8 --- /dev/null +++ b/bacula/src/findlib/enable_priv.c @@ -0,0 +1,44 @@ +/* + Bacula(R) - The Network Backup Solution + + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2003-2014 Free Software Foundation Europe e.V. + + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. + + You may use this file and others of this release according to the + license defined in the LICENSE file, which includes the Affero General + Public License, v3.0 ("AGPLv3") and some additional permissions and + terms pursuant to its AGPLv3 Section 7. + + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. +*/ +/* + * Enable backup privileges for Win32 systems. + * + * Kern Sibbald, May MMIII + * + */ + +#include "bacula.h" +#include "find.h" +#include "jcr.h" + + +/*=============================================================*/ +/* */ +/* * * * U n i x * * * * */ +/* */ +/*=============================================================*/ + +#if !defined(HAVE_WIN32) + +int enable_backup_privileges(JCR *jcr, int ignore_errors) + { return 0; } + + +#endif diff --git a/bacula/src/findlib/file_attrs.c b/bacula/src/findlib/file_attrs.c deleted file mode 100644 index 9268ce18ac..0000000000 --- a/bacula/src/findlib/file_attrs.c +++ /dev/null @@ -1,667 +0,0 @@ -/* - Bacula® - The Network Backup Solution - - Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - - The main author of Bacula is Kern Sibbald, with contributions from - many others, a complete list can be found in the file AUTHORS. - This program is Free Software; you can redistribute it and/or - modify it under the terms of version three of the GNU Affero General Public - License as published by the Free Software Foundation and included - in the file LICENSE. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. - - Bacula® is a registered trademark of Kern Sibbald. - The licensor of Bacula is the Free Software Foundation Europe - (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, - Switzerland, email:ftf@fsfeurope.org. -*/ -/** - * Encode and decode standard Unix attributes and - * Extended attributes for Win32 and - * other non-Unix systems, or Unix systems with ACLs, ... - * - * Kern Sibbald, October MMII - * - */ - -//#define _POSIX_C_SOURCE 200809L -//#define _BSD_SOURCE 1 - -#include "bacula.h" -#include "find.h" -#include "ch.h" - -static uid_t my_uid = 1; -static gid_t my_gid = 1; -static bool uid_set = false; - -/* - * For old systems that don't have lchown() or lchmod() - */ -#ifndef HAVE_LCHOWN -#define lchown chown -#endif -#ifndef HAVE_LCHMOD -#define lchmod chmod -#endif - -/*=============================================================*/ -/* */ -/* *** A l l S y s t e m s *** */ -/* */ -/*=============================================================*/ - -/* - * To turn off use of fchown(), fchmod(), or futimes(), - * uncomment one or more of the following. - */ -//#undef HAVE_FCHOWN -//#undef HAVE_FCHMOD -//#undef HAVE_FUTIMES - -/* - * Print errors only if debug level defined or we are root. - * root should not get errors. Errors for users causes - * too much output. - */ -#define print_error (chk_dbglvl(100) || my_uid == 0) - -bool set_mod_own_time(JCR *jcr, BFILE *ofd, ATTR *attr) -{ - bool ok = true; - struct utimbuf ut; - - /* Do not try to set rights with f functions when using a plugin */ - if (is_bopen(ofd) && !ofd->cmd_plugin) { /* TODO: Look with opt_plugin */ - /* - * The #ifdefing is a bit ugly, but it is the only - * way we can ensure this works on older systems. - */ -#ifdef HAVE_FCHOWN - if (fchown(ofd->fid, attr->statp.st_uid, attr->statp.st_gid) < 0 && print_error) { -#else - if (lchown(attr->ofname, attr->statp.st_uid, attr->statp.st_gid) < 0 && print_error) { -#endif - berrno be; - Jmsg2(jcr, M_ERROR, 0, _("Unable to set file owner %s: ERR=%s\n"), - attr->ofname, be.bstrerror()); - ok = false; - } -#ifdef HAVE_FCHMOD - if (fchmod(ofd->fid, attr->statp.st_mode) < 0 && print_error) { -#else - if (lchmod(attr->ofname, attr->statp.st_mode) < 0 && print_error) { -#endif - berrno be; - Jmsg2(jcr, M_ERROR, 0, _("Unable to set file modes %s: ERR=%s\n"), - attr->ofname, be.bstrerror()); - ok = false; - } - -#ifdef HAVE_FUTIMES - struct timeval times[2]; - times[0].tv_sec = attr->statp.st_atime; - times[0].tv_usec = 0; - times[1].tv_sec = attr->statp.st_mtime; - times[1].tv_usec = 0; - if (futimes(ofd->fid, times) < 0 && print_error) { -#else - ut.actime = attr->statp.st_atime; - ut.modtime = attr->statp.st_mtime; - //bclose(ofd); - if (utime(attr->ofname, &ut) < 0 && print_error) { -#endif - berrno be; - Jmsg2(jcr, M_ERROR, 0, _("Unable to set file times %s: ERR=%s\n"), - attr->ofname, be.bstrerror()); - ok = false; - } - } else { - if (lchown(attr->ofname, attr->statp.st_uid, attr->statp.st_gid) < 0 && print_error) { - berrno be; - Jmsg2(jcr, M_ERROR, 0, _("Unable to set file owner %s: ERR=%s\n"), - attr->ofname, be.bstrerror()); - ok = false; - } - if (lchmod(attr->ofname, attr->statp.st_mode) < 0 && print_error) { - berrno be; - Jmsg2(jcr, M_ERROR, 0, _("Unable to set file modes %s: ERR=%s\n"), - attr->ofname, be.bstrerror()); - ok = false; - } - /* - * Reset file times. - */ - ut.actime = attr->statp.st_atime; - ut.modtime = attr->statp.st_mtime; - - if (utime(attr->ofname, &ut) < 0 && print_error) { - berrno be; - Jmsg2(jcr, M_ERROR, 0, _("Unable to set file times %s: ERR=%s\n"), - attr->ofname, be.bstrerror()); - ok = false; - } - } - return ok; -} - -/* - * Return the data stream that will be used - */ -int select_data_stream(FF_PKT *ff_pkt) -{ - int stream; - - /* This is a plugin special restore object */ - if (ff_pkt->type == FT_RESTORE_FIRST) { - ff_pkt->flags = 0; - return STREAM_FILE_DATA; - } - - /** - * Fix all incompatible options - */ - /** No sparse option for encrypted data */ - if (ff_pkt->flags & FO_ENCRYPT) { - ff_pkt->flags &= ~FO_SPARSE; - } - - /** Note, no sparse option for win32_data */ - if (!is_portable_backup(&ff_pkt->bfd)) { - stream = STREAM_WIN32_DATA; - ff_pkt->flags &= ~FO_SPARSE; - } else if (ff_pkt->flags & FO_SPARSE) { - stream = STREAM_SPARSE_DATA; - } else { - stream = STREAM_FILE_DATA; - } - if (ff_pkt->flags & FO_OFFSETS) { - stream = STREAM_SPARSE_DATA; - } - - /** Encryption is only supported for file data */ - if (stream != STREAM_FILE_DATA && stream != STREAM_WIN32_DATA && - stream != STREAM_MACOS_FORK_DATA) { - ff_pkt->flags &= ~FO_ENCRYPT; - } - - /** Compression is not supported for Mac fork data */ - if (stream == STREAM_MACOS_FORK_DATA) { - ff_pkt->flags &= ~FO_COMPRESS; - } - - /** - * Handle compression and encryption options - */ -#if defined(HAVE_LIBZ) || defined(HAVE_LZO) - if (ff_pkt->flags & FO_COMPRESS) { - #ifdef HAVE_LIBZ - if(ff_pkt->Compress_algo == COMPRESS_GZIP) { - switch (stream) { - case STREAM_WIN32_DATA: - stream = STREAM_WIN32_GZIP_DATA; - break; - case STREAM_SPARSE_DATA: - stream = STREAM_SPARSE_GZIP_DATA; - break; - case STREAM_FILE_DATA: - stream = STREAM_GZIP_DATA; - break; - default: - /** - * All stream types that do not support compression should clear out - * FO_COMPRESS above, and this code block should be unreachable. - */ - ASSERT(!(ff_pkt->flags & FO_COMPRESS)); - return STREAM_NONE; - } - } - #endif - #ifdef HAVE_LZO - if(ff_pkt->Compress_algo == COMPRESS_LZO1X) { - switch (stream) { - case STREAM_WIN32_DATA: - stream = STREAM_WIN32_COMPRESSED_DATA; - break; - case STREAM_SPARSE_DATA: - stream = STREAM_SPARSE_COMPRESSED_DATA; - break; - case STREAM_FILE_DATA: - stream = STREAM_COMPRESSED_DATA; - break; - default: - /** - * All stream types that do not support compression should clear out - * FO_COMPRESS above, and this code block should be unreachable. - */ - ASSERT(!(ff_pkt->flags & FO_COMPRESS)); - return STREAM_NONE; - } - } - #endif - } -#endif -#ifdef HAVE_CRYPTO - if (ff_pkt->flags & FO_ENCRYPT) { - switch (stream) { - case STREAM_WIN32_DATA: - stream = STREAM_ENCRYPTED_WIN32_DATA; - break; - case STREAM_WIN32_GZIP_DATA: - stream = STREAM_ENCRYPTED_WIN32_GZIP_DATA; - break; - case STREAM_WIN32_COMPRESSED_DATA: - stream = STREAM_ENCRYPTED_WIN32_COMPRESSED_DATA; - break; - case STREAM_FILE_DATA: - stream = STREAM_ENCRYPTED_FILE_DATA; - break; - case STREAM_GZIP_DATA: - stream = STREAM_ENCRYPTED_FILE_GZIP_DATA; - break; - case STREAM_COMPRESSED_DATA: - stream = STREAM_ENCRYPTED_FILE_COMPRESSED_DATA; - break; - default: - /* All stream types that do not support encryption should clear out - * FO_ENCRYPT above, and this code block should be unreachable. */ - ASSERT(!(ff_pkt->flags & FO_ENCRYPT)); - return STREAM_NONE; - } - } -#endif - - return stream; -} - - -/** - * Encode a stat structure into a base64 character string - * All systems must create such a structure. - * In addition, we tack on the LinkFI, which is non-zero in - * the case of a hard linked file that has no data. This - * is a File Index pointing to the link that does have the - * data (always the first one encountered in a save). - * You may piggyback attributes on this packet by encoding - * them in the encode_attribsEx() subroutine, but this is - * not recommended. - */ -void encode_stat(char *buf, struct stat *statp, int stat_size, int32_t LinkFI, int data_stream) -{ - char *p = buf; - - /* - * We read the stat packet so make sure the caller's conception - * is the same as ours. They can be different if LARGEFILE is not - * the same when compiling this library and the calling program. - */ - ASSERT(stat_size == (int)sizeof(struct stat)); - - /** - * Encode a stat packet. I should have done this more intelligently - * with a length so that it could be easily expanded. - */ - p += to_base64((int64_t)statp->st_dev, p); - *p++ = ' '; /* separate fields with a space */ - p += to_base64((int64_t)statp->st_ino, p); - *p++ = ' '; - p += to_base64((int64_t)statp->st_mode, p); - *p++ = ' '; - p += to_base64((int64_t)statp->st_nlink, p); - *p++ = ' '; - p += to_base64((int64_t)statp->st_uid, p); - *p++ = ' '; - p += to_base64((int64_t)statp->st_gid, p); - *p++ = ' '; - p += to_base64((int64_t)statp->st_rdev, p); - *p++ = ' '; - p += to_base64((int64_t)statp->st_size, p); - *p++ = ' '; -#ifndef HAVE_MINGW - p += to_base64((int64_t)statp->st_blksize, p); - *p++ = ' '; - p += to_base64((int64_t)statp->st_blocks, p); - *p++ = ' '; -#else - p += to_base64((int64_t)0, p); /* output place holder */ - *p++ = ' '; - p += to_base64((int64_t)0, p); /* output place holder */ - *p++ = ' '; -#endif - p += to_base64((int64_t)statp->st_atime, p); - *p++ = ' '; - p += to_base64((int64_t)statp->st_mtime, p); - *p++ = ' '; - p += to_base64((int64_t)statp->st_ctime, p); - *p++ = ' '; - p += to_base64((int64_t)LinkFI, p); - *p++ = ' '; - -#ifdef HAVE_CHFLAGS - /* FreeBSD function */ - p += to_base64((int64_t)statp->st_flags, p); /* output st_flags */ -#else - p += to_base64((int64_t)0, p); /* output place holder */ -#endif - *p++ = ' '; - p += to_base64((int64_t)data_stream, p); -#ifdef HAVE_MINGW - *p++ = ' '; - p += to_base64((int64_t)statp->st_fattrs, p); -#endif - *p = 0; - return; -} - - -/* Do casting according to unknown type to keep compiler happy */ -#ifdef HAVE_TYPEOF - #define plug(st, val) st = (typeof st)val -#else - #if !HAVE_GCC & HAVE_SUN_OS - /* Sun compiler does not handle templates correctly */ - #define plug(st, val) st = val - #elif __sgi - #define plug(st, val) st = val - #else - /* Use templates to do the casting */ - template void plug(T &st, uint64_t val) - { st = static_cast(val); } - #endif -#endif - - -/* - * Decode a stat packet from base64 characters - * returns: data_stream - */ -int decode_stat(char *buf, struct stat *statp, int stat_size, int32_t *LinkFI) -{ - char *p = buf; - int64_t val; - int data_stream; - - /* - * We store into the stat packet so make sure the caller's conception - * is the same as ours. They can be different if LARGEFILE is not - * the same when compiling this library and the calling program. - */ - ASSERT(stat_size == (int)sizeof(struct stat)); - - p += from_base64(&val, p); - plug(statp->st_dev, val); - p++; - p += from_base64(&val, p); - plug(statp->st_ino, val); - p++; - p += from_base64(&val, p); - plug(statp->st_mode, val); - p++; - p += from_base64(&val, p); - plug(statp->st_nlink, val); - p++; - p += from_base64(&val, p); - plug(statp->st_uid, val); - p++; - p += from_base64(&val, p); - plug(statp->st_gid, val); - p++; - p += from_base64(&val, p); - plug(statp->st_rdev, val); - p++; - p += from_base64(&val, p); - plug(statp->st_size, val); - p++; -#ifndef HAVE_MINGW - p += from_base64(&val, p); - plug(statp->st_blksize, val); - p++; - p += from_base64(&val, p); - plug(statp->st_blocks, val); - p++; -#else - p += from_base64(&val, p); -// plug(statp->st_blksize, val); - p++; - p += from_base64(&val, p); -// plug(statp->st_blocks, val); - p++; -#endif - p += from_base64(&val, p); - plug(statp->st_atime, val); - p++; - p += from_base64(&val, p); - plug(statp->st_mtime, val); - p++; - p += from_base64(&val, p); - plug(statp->st_ctime, val); - - /* Optional FileIndex of hard linked file data */ - if (*p == ' ' || (*p != 0 && *(p+1) == ' ')) { - p++; - p += from_base64(&val, p); - *LinkFI = (uint32_t)val; - } else { - *LinkFI = 0; - return 0; - } - - /* FreeBSD user flags */ - if (*p == ' ' || (*p != 0 && *(p+1) == ' ')) { - p++; - p += from_base64(&val, p); -#ifdef HAVE_CHFLAGS - plug(statp->st_flags, val); - } else { - statp->st_flags = 0; -#endif - } - - /* Look for data stream id */ - if (*p == ' ' || (*p != 0 && *(p+1) == ' ')) { - p++; - p += from_base64(&val, p); - } else { - val = 0; - } - data_stream = val; -#ifdef HAVE_MINGW - if (*p == ' ' || (*p != 0 && *(p+1) == ' ')) { - p++; - p += from_base64(&val, p); - plug(statp->st_fattrs, val); - } else { - statp->st_fattrs = 0; - val = 0; - } -#endif - return data_stream; -} - -/** Decode a LinkFI field of encoded stat packet */ -int32_t decode_LinkFI(char *buf, struct stat *statp, int stat_size) -{ - char *p = buf; - int64_t val; - /* - * We store into the stat packet so make sure the caller's conception - * is the same as ours. They can be different if LARGEFILE is not - * the same when compiling this library and the calling program. - */ - ASSERT(stat_size == (int)sizeof(struct stat)); - - skip_nonspaces(&p); /* st_dev */ - p++; /* skip space */ - skip_nonspaces(&p); /* st_ino */ - p++; - p += from_base64(&val, p); - plug(statp->st_mode, val); /* st_mode */ - p++; - skip_nonspaces(&p); /* st_nlink */ - p++; - skip_nonspaces(&p); /* st_uid */ - p++; - skip_nonspaces(&p); /* st_gid */ - p++; - skip_nonspaces(&p); /* st_rdev */ - p++; - skip_nonspaces(&p); /* st_size */ - p++; - skip_nonspaces(&p); /* st_blksize */ - p++; - skip_nonspaces(&p); /* st_blocks */ - p++; - skip_nonspaces(&p); /* st_atime */ - p++; - skip_nonspaces(&p); /* st_mtime */ - p++; - skip_nonspaces(&p); /* st_ctime */ - - /* Optional FileIndex of hard linked file data */ - if (*p == ' ' || (*p != 0 && *(p+1) == ' ')) { - p++; - p += from_base64(&val, p); - return (int32_t)val; - } - return 0; -} - -/** - * Set file modes, permissions and times - * - * fname is the original filename - * ofile is the output filename (may be in a different directory) - * - * Returns: true on success - * false on failure - */ -bool set_attributes(JCR *jcr, ATTR *attr, BFILE *ofd) -{ - mode_t old_mask; - bool ok = true; - boffset_t fsize; - - if (uid_set) { - my_uid = getuid(); - my_gid = getgid(); - uid_set = true; - } - - old_mask = umask(0); - if (is_bopen(ofd)) { - char ec1[50], ec2[50]; - fsize = blseek(ofd, 0, SEEK_END); - if (attr->type == FT_REG && fsize > 0 && attr->statp.st_size > 0 && - fsize != (boffset_t)attr->statp.st_size) { - Jmsg3(jcr, M_ERROR, 0, _("File size of restored file %s not correct. Original %s, restored %s.\n"), - attr->ofname, edit_uint64(attr->statp.st_size, ec1), - edit_uint64(fsize, ec2)); - } - } - - /* - * We do not restore sockets, so skip trying to restore their - * attributes. - */ - if (attr->type == FT_SPEC && S_ISSOCK(attr->statp.st_mode)) { - goto bail_out; - } - - /* ***FIXME**** optimize -- don't do if already correct */ - /* - * For link, change owner of link using lchown, but don't - * try to do a chmod as that will update the file behind it. - */ - if (attr->type == FT_LNK) { - /** Change owner of link, not of real file */ - if (lchown(attr->ofname, attr->statp.st_uid, attr->statp.st_gid) < 0 && print_error) { - berrno be; - Jmsg2(jcr, M_ERROR, 0, _("Unable to set file owner %s: ERR=%s\n"), - attr->ofname, be.bstrerror()); - ok = false; - } - } else { - /* - * At this point, we have a file that is not a LINK - */ - ok = set_mod_own_time(jcr, ofd, attr); - -#ifdef HAVE_CHFLAGS - /** - * FreeBSD user flags - * - * Note, this should really be done before the utime() above, - * but if the immutable bit is set, it will make the utimes() - * fail. - */ - if (chflags(attr->ofname, attr->statp.st_flags) < 0 && print_error) { - berrno be; - Jmsg2(jcr, M_ERROR, 0, _("Unable to set file flags %s: ERR=%s\n"), - attr->ofname, be.bstrerror()); - ok = false; - } -#endif - } - -bail_out: - if (is_bopen(ofd)) { - bclose(ofd); - } - pm_strcpy(attr->ofname, "*none*"); - umask(old_mask); - return ok; -} - - -/*=============================================================*/ -/* */ -/* * * * U n i x * * * * */ -/* */ -/*=============================================================*/ - -#if !defined(HAVE_WIN32) - -/** - * It is possible to piggyback additional data e.g. ACLs on - * the encode_stat() data by returning the extended attributes - * here. They must be "self-contained" (i.e. you keep track - * of your own length), and they must be in ASCII string - * format. Using this feature is not recommended. - * The code below shows how to return nothing. See the Win32 - * code below for returning something in the attributes. - */ -int encode_attribsEx(JCR *jcr, char *attribsEx, FF_PKT *ff_pkt) -{ -#ifdef HAVE_DARWIN_OS - /** - * We save the Mac resource fork length so that on a - * restore, we can be sure we put back the whole resource. - */ - char *p; - - *attribsEx = 0; /* no extended attributes (yet) */ - if (jcr->cmd_plugin || ff_pkt->type == FT_DELETED) { - return STREAM_UNIX_ATTRIBUTES; - } - p = attribsEx; - if (ff_pkt->flags & FO_HFSPLUS) { - p += to_base64((uint64_t)(ff_pkt->hfsinfo.rsrclength), p); - } - *p = 0; -#else - *attribsEx = 0; /* no extended attributes */ -#endif - return STREAM_UNIX_ATTRIBUTES; -} - -#endif diff --git a/bacula/src/findlib/file_create.c b/bacula/src/findlib/file_create.c deleted file mode 100644 index 0abb200718..0000000000 --- a/bacula/src/findlib/file_create.c +++ /dev/null @@ -1,439 +0,0 @@ -/* - Bacula® - The Network Backup Solution - - Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - - The main author of Bacula is Kern Sibbald, with contributions from - many others, a complete list can be found in the file AUTHORS. - This program is Free Software; you can redistribute it and/or - modify it under the terms of version three of the GNU Affero General Public - License as published by the Free Software Foundation and included - in the file LICENSE. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. - - Bacula® is a registered trademark of Kern Sibbald. - The licensor of Bacula is the Free Software Foundation Europe - (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, - Switzerland, email:ftf@fsfeurope.org. -*/ -/* - * Create a file, and reset the modes - * - * Kern Sibbald, November MM - * - */ - -#include "bacula.h" -#include "find.h" - -#ifndef S_IRWXUGO -#define S_IRWXUGO (S_IRWXU | S_IRWXG | S_IRWXO) -#endif - -#ifndef IS_CTG -#define IS_CTG(x) 0 -#define O_CTG 0 -#endif - -#ifndef O_EXCL -#define O_EXCL 0 -#endif -#ifndef O_NOFOLLOW -#define O_NOFOLLOW 0 -#endif - -static int separate_path_and_file(JCR *jcr, char *fname, char *ofile); -static int path_already_seen(JCR *jcr, char *path, int pnl); - - -/* - * Create the file, or the directory - * - * fname is the original filename - * ofile is the output filename (may be in a different directory) - * - * Returns: CF_SKIP if file should be skipped - * CF_ERROR on error - * CF_EXTRACT file created and data to restore - * CF_CREATED file created no data to restore - * - * Note, we create the file here, except for special files, - * we do not set the attributes because we want to first - * write the file, then when the writing is done, set the - * attributes. - * So, we return with the file descriptor open for normal - * files. - * - */ -int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace) -{ - mode_t new_mode, parent_mode; - int flags; - uid_t uid; - gid_t gid; - int pnl; - bool exists = false; - struct stat mstatp; - - bfd->reparse_point = false; - set_portable_backup(bfd); - - new_mode = attr->statp.st_mode; - Dmsg3(200, "type=%d newmode=%x file=%s\n", attr->type, new_mode, attr->ofname); - parent_mode = S_IWUSR | S_IXUSR | new_mode; - gid = attr->statp.st_gid; - uid = attr->statp.st_uid; - - Dmsg2(400, "Replace=%c %d\n", (char)replace, replace); - if (lstat(attr->ofname, &mstatp) == 0) { - exists = true; - switch (replace) { - case REPLACE_IFNEWER: - if (attr->statp.st_mtime <= mstatp.st_mtime) { - Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Not newer: %s\n"), attr->ofname); - return CF_SKIP; - } - break; - - case REPLACE_IFOLDER: - if (attr->statp.st_mtime >= mstatp.st_mtime) { - Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Not older: %s\n"), attr->ofname); - return CF_SKIP; - } - break; - - case REPLACE_NEVER: - /* Set attributes if we created this directory */ - if (attr->type == FT_DIREND && path_list_lookup(jcr, attr->ofname)) { - break; - } - Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Already exists: %s\n"), attr->ofname); - return CF_SKIP; - - case REPLACE_ALWAYS: - break; - } - } - switch (attr->type) { - case FT_RAW: /* raw device to be written */ - case FT_FIFO: /* FIFO to be written to */ - case FT_LNKSAVED: /* Hard linked, file already saved */ - case FT_LNK: - case FT_SPEC: /* fifo, ... to be backed up */ - case FT_REGE: /* empty file */ - case FT_REG: /* regular file */ - /* - * Note, we do not delete FT_RAW because these are device files - * or FIFOs that should already exist. If we blow it away, - * we may blow away a FIFO that is being used to read the - * restore data, or we may blow away a partition definition. - */ - if (exists && attr->type != FT_RAW && attr->type != FT_FIFO) { - /* Get rid of old copy */ - Dmsg1(400, "unlink %s\n", attr->ofname); - if (unlink(attr->ofname) == -1) { - berrno be; - Qmsg(jcr, M_ERROR, 0, _("File %s already exists and could not be replaced. ERR=%s.\n"), - attr->ofname, be.bstrerror()); - return CF_ERROR; - } - } - /* - * Here we do some preliminary work for all the above - * types to create the path to the file if it does - * not already exist. Below, we will split to - * do the file type specific work - */ - pnl = separate_path_and_file(jcr, attr->fname, attr->ofname); - if (pnl < 0) { - return CF_ERROR; - } - - /* - * If path length is <= 0 we are making a file in the root - * directory. Assume that the directory already exists. - */ - if (pnl > 0) { - char savechr; - savechr = attr->ofname[pnl]; - attr->ofname[pnl] = 0; /* terminate path */ - - if (!path_already_seen(jcr, attr->ofname, pnl)) { - Dmsg1(400, "Make path %s\n", attr->ofname); - /* - * If we need to make the directory, ensure that it is with - * execute bit set (i.e. parent_mode), and preserve what already - * exists. Normally, this should do nothing. - */ - if (!makepath(attr, attr->ofname, parent_mode, parent_mode, uid, gid, 1)) { - Dmsg1(10, "Could not make path. %s\n", attr->ofname); - attr->ofname[pnl] = savechr; /* restore full name */ - return CF_ERROR; - } - } - attr->ofname[pnl] = savechr; /* restore full name */ - } - - /* Now we do the specific work for each file type */ - switch(attr->type) { - case FT_REGE: - case FT_REG: - Dmsg1(100, "Create=%s\n", attr->ofname); - flags = O_WRONLY | O_CREAT | O_BINARY | O_EXCL; - if (IS_CTG(attr->statp.st_mode)) { - flags |= O_CTG; /* set contiguous bit if needed */ - } - if (is_bopen(bfd)) { - Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid); - bclose(bfd); - } - - - if ((bopen(bfd, attr->ofname, flags, S_IRUSR | S_IWUSR)) < 0) { - berrno be; - be.set_errno(bfd->berrno); - Qmsg2(jcr, M_ERROR, 0, _("Could not create %s: ERR=%s\n"), - attr->ofname, be.bstrerror()); - Dmsg2(100,"Could not create %s: ERR=%s\n", attr->ofname, be.bstrerror()); - return CF_ERROR; - } - return CF_EXTRACT; - - case FT_RAW: /* Bacula raw device e.g. /dev/sda1 */ - case FT_FIFO: /* Bacula fifo to save data */ - case FT_SPEC: - if (S_ISFIFO(attr->statp.st_mode)) { - Dmsg1(400, "Restore fifo: %s\n", attr->ofname); - if (mkfifo(attr->ofname, attr->statp.st_mode) != 0 && errno != EEXIST) { - berrno be; - Qmsg2(jcr, M_ERROR, 0, _("Cannot make fifo %s: ERR=%s\n"), - attr->ofname, be.bstrerror()); - return CF_ERROR; - } - } else if (S_ISSOCK(attr->statp.st_mode)) { - Dmsg1(200, "Skipping restore of socket: %s\n", attr->ofname); -#ifdef S_IFDOOR // Solaris high speed RPC mechanism - } else if (S_ISDOOR(attr->statp.st_mode)) { - Dmsg1(200, "Skipping restore of door file: %s\n", attr->ofname); -#endif -#ifdef S_IFPORT // Solaris event port for handling AIO - } else if (S_ISPORT(attr->statp.st_mode)) { - Dmsg1(200, "Skipping restore of event port file: %s\n", attr->ofname); -#endif - } else { - Dmsg1(400, "Restore node: %s\n", attr->ofname); - if (mknod(attr->ofname, attr->statp.st_mode, attr->statp.st_rdev) != 0 && errno != EEXIST) { - berrno be; - Qmsg2(jcr, M_ERROR, 0, _("Cannot make node %s: ERR=%s\n"), - attr->ofname, be.bstrerror()); - return CF_ERROR; - } - } - /* - * Here we are going to attempt to restore to a FIFO, which - * means that the FIFO must already exist, AND there must - * be some process already attempting to read from the - * FIFO, so we open it write-only. - */ - if (attr->type == FT_RAW || attr->type == FT_FIFO) { - btimer_t *tid; - Dmsg1(400, "FT_RAW|FT_FIFO %s\n", attr->ofname); - flags = O_WRONLY | O_BINARY; - /* Timeout open() in 60 seconds */ - if (attr->type == FT_FIFO) { - Dmsg0(400, "Set FIFO timer\n"); - tid = start_thread_timer(jcr, pthread_self(), 60); - } else { - tid = NULL; - } - if (is_bopen(bfd)) { - Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid); - } - Dmsg2(400, "open %s flags=0x%x\n", attr->ofname, flags); - if ((bopen(bfd, attr->ofname, flags, 0)) < 0) { - berrno be; - be.set_errno(bfd->berrno); - Qmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"), - attr->ofname, be.bstrerror()); - Dmsg2(400, "Could not open %s: ERR=%s\n", attr->ofname, be.bstrerror()); - stop_thread_timer(tid); - return CF_ERROR; - } - stop_thread_timer(tid); - return CF_EXTRACT; - } - Dmsg1(400, "FT_SPEC %s\n", attr->ofname); - return CF_CREATED; - - case FT_LNK: - Dmsg2(130, "FT_LNK should restore: %s -> %s\n", attr->ofname, attr->olname); - if (symlink(attr->olname, attr->ofname) != 0 && errno != EEXIST) { - berrno be; - Qmsg3(jcr, M_ERROR, 0, _("Could not symlink %s -> %s: ERR=%s\n"), - attr->ofname, attr->olname, be.bstrerror()); - return CF_ERROR; - } - return CF_CREATED; - - case FT_LNKSAVED: /* Hard linked, file already saved */ - Dmsg2(130, "Hard link %s => %s\n", attr->ofname, attr->olname); - if (link(attr->olname, attr->ofname) != 0) { - berrno be; -#ifdef HAVE_CHFLAGS - struct stat s; - /* - * If using BSD user flags, maybe has a file flag - * preventing this. So attempt to disable, retry link, - * and reset flags. - * Note that BSD securelevel may prevent disabling flag. - */ - if (stat(attr->olname, &s) == 0 && s.st_flags != 0) { - if (chflags(attr->olname, 0) == 0) { - if (link(attr->olname, attr->ofname) != 0) { - /* restore original file flags even when linking failed */ - if (chflags(attr->olname, s.st_flags) < 0) { - Qmsg2(jcr, M_ERROR, 0, _("Could not restore file flags for file %s: ERR=%s\n"), - attr->olname, be.bstrerror()); - } -#endif /* HAVE_CHFLAGS */ - Qmsg3(jcr, M_ERROR, 0, _("Could not hard link %s -> %s: ERR=%s\n"), - attr->ofname, attr->olname, be.bstrerror()); - Dmsg3(200, "Could not hard link %s -> %s: ERR=%s\n", - attr->ofname, attr->olname, be.bstrerror()); - return CF_ERROR; -#ifdef HAVE_CHFLAGS - } - /* finally restore original file flags */ - if (chflags(attr->olname, s.st_flags) < 0) { - Qmsg2(jcr, M_ERROR, 0, _("Could not restore file flags for file %s: ERR=%s\n"), - attr->olname, be.bstrerror()); - } - } else { - Qmsg2(jcr, M_ERROR, 0, _("Could not reset file flags for file %s: ERR=%s\n"), - attr->olname, be.bstrerror()); - } - } else { - Qmsg3(jcr, M_ERROR, 0, _("Could not hard link %s -> %s: ERR=%s\n"), - attr->ofname, attr->olname, be.bstrerror()); - return CF_ERROR; - } -#endif /* HAVE_CHFLAGS */ - - } - return CF_CREATED; - } /* End inner switch */ - - case FT_REPARSE: - case FT_JUNCTION: - bfd->reparse_point = true; - /* Fall through wanted */ - case FT_DIRBEGIN: - case FT_DIREND: - Dmsg2(200, "Make dir mode=%o dir=%s\n", new_mode, attr->ofname); - if (!makepath(attr, attr->ofname, new_mode, parent_mode, uid, gid, 0)) { - return CF_ERROR; - } - /* - * If we are using the Win32 Backup API, we open the - * directory so that the security info will be read - * and saved. - */ - if (!is_portable_backup(bfd)) { - if (is_bopen(bfd)) { - Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid); - } - if ((bopen(bfd, attr->ofname, O_WRONLY|O_BINARY, 0)) < 0) { - berrno be; - be.set_errno(bfd->berrno); - Qmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"), - attr->ofname, be.bstrerror()); - return CF_ERROR; - } - return CF_EXTRACT; - } else { - return CF_CREATED; - } - - case FT_DELETED: - Qmsg2(jcr, M_INFO, 0, _("Original file %s have been deleted: type=%d\n"), attr->fname, attr->type); - break; - /* The following should not occur */ - case FT_NOACCESS: - case FT_NOFOLLOW: - case FT_NOSTAT: - case FT_DIRNOCHG: - case FT_NOCHG: - case FT_ISARCH: - case FT_NORECURSE: - case FT_NOFSCHG: - case FT_NOOPEN: - Qmsg2(jcr, M_ERROR, 0, _("Original file %s not saved: type=%d\n"), attr->fname, attr->type); - break; - default: - Qmsg2(jcr, M_ERROR, 0, _("Unknown file type %d; not restored: %s\n"), attr->type, attr->fname); - Pmsg2(000, "Unknown file type %d; not restored: %s\n", attr->type, attr->fname); - break; - } - return CF_ERROR; -} - -/* - * Returns: > 0 index into path where last path char is. - * 0 no path - * -1 filename is zero length - */ -static int separate_path_and_file(JCR *jcr, char *fname, char *ofile) -{ - char *f, *p, *q; - int fnl, pnl; - - /* Separate pathname and filename */ - for (q=p=f=ofile; *p; p++) { - if (IsPathSeparator(*p)) { - f = q; /* possible filename */ - } - q++; - } - - if (IsPathSeparator(*f)) { - f++; - } - *q = 0; /* terminate string */ - - fnl = q - f; - if (fnl == 0) { - /* The filename length must not be zero here because we - * are dealing with a file (i.e. FT_REGE or FT_REG). - */ - Jmsg1(jcr, M_ERROR, 0, _("Zero length filename: %s\n"), fname); - return -1; - } - pnl = f - ofile - 1; - return pnl; -} - -/* - * Primitive caching of path to prevent recreating a pathname - * each time as long as we remain in the same directory. - */ -static int path_already_seen(JCR *jcr, char *path, int pnl) -{ - if (!jcr->cached_path) { - jcr->cached_path = get_pool_memory(PM_FNAME); - } - if (jcr->cached_pnl == pnl && strcmp(path, jcr->cached_path) == 0) { - return 1; - } - pm_strcpy(jcr->cached_path, path); - jcr->cached_pnl = pnl; - return 0; -} diff --git a/bacula/src/findlib/find.c b/bacula/src/findlib/find.c index 606b4f0081..a9f2d6e773 100644 --- a/bacula/src/findlib/find.c +++ b/bacula/src/findlib/find.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Main routine for finding files on a file system. @@ -91,21 +95,11 @@ set_find_changed_function(FF_PKT *ff, bool check_fct(JCR *jcr, FF_PKT *ff)) ff->check_fct = check_fct; } -/* - * For VSS we need to know which windows drives - * are used, because we create a snapshot of all used - * drives before operation - * - * the function returns the number of used drives and - * fills "drives" with up to 26 (A..Z) drive names - * - * szDrives must be at least 27 bytes long - */ -int -get_win32_driveletters(FF_PKT *ff, char* szDrives) +void +set_find_snapshot_function(FF_PKT *ff, + bool convert_path(JCR *jcr, FF_PKT *ff, dlist *filelist, dlistString *node)) { - int nCount = 0; - return nCount; + ff->snapshot_convert_fct = convert_path; } /* @@ -172,10 +166,17 @@ find_files(JCR *jcr, FF_PKT *ff, int file_save(JCR *jcr, FF_PKT *ff_pkt, bool to foreach_dlist(node, &incexe->name_list) { char *fname = node->c_str(); Dmsg1(dbglvl, "F %s\n", fname); + ff->top_fname = fname; + /* Convert the filename if needed */ + if (ff->snapshot_convert_fct) { + ff->snapshot_convert_fct(jcr, ff, &incexe->name_list, node); + } + if (find_one_file(jcr, ff, our_callback, ff->top_fname, (dev_t)-1, true) == 0) { return 0; /* error return */ } + if (job_canceled(jcr)) { return 0; } @@ -465,6 +466,15 @@ term_find_files(FF_PKT *ff) if (ff->ignoredir_fname) { free_pool_memory(ff->ignoredir_fname); } + if (ff->snap_fname) { + free_pool_memory(ff->snap_fname); + } + if (ff->snap_top_fname) { + free_pool_memory(ff->snap_top_fname); + } + if (ff->mtab_list) { + delete ff->mtab_list; + } hard_links = term_find_one(ff); free(ff); return hard_links; diff --git a/bacula/src/findlib/find.h b/bacula/src/findlib/find.h index 188245ee3c..a12bf036e4 100644 --- a/bacula/src/findlib/find.h +++ b/bacula/src/findlib/find.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * File types as returned by find_files() @@ -64,9 +68,9 @@ int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result); struct s_included_file { struct s_included_file *next; - uint32_t options; /* backup options */ + uint64_t options; /* backup options */ uint32_t algo; /* compression algorithm. 4 letters stored as an interger */ - int level; /* compression level */ + int Compress_level; /* compression level */ int len; /* length of fname */ int pattern; /* set if wild card pattern */ char VerifyOpts[20]; /* Options for verify */ @@ -96,7 +100,7 @@ enum { /* File options structure */ struct findFOPTS { - uint32_t flags; /* options in bits */ + uint64_t flags; /* options in bits */ uint32_t Compress_algo; /* compression algorithm. 4 letters stored as an interger */ int Compress_level; /* compression level */ int strip_path; /* strip path count */ @@ -154,6 +158,16 @@ struct FF_PKT { char *object_name; /* Object name */ char *object; /* restore object */ char *plugin; /* Current Options{Plugin=} name */ + + /* Specific snapshot part */ + char *volume_path; /* volume path */ + char *snapshot_path; /* snapshot path */ + char *top_fname_save; + POOLMEM *snap_fname; /* buffer used when stripping path */ + POOLMEM *snap_top_fname; + bool strip_snap_path; /* convert snapshot path or not */ + bool (*snapshot_convert_fct)(JCR *jcr, FF_PKT *ff, dlist *filelist, dlistString *node); + POOLMEM *sys_fname; /* system filename */ POOLMEM *fname_save; /* save when stripping path */ POOLMEM *link_save; /* save when stripping path */ @@ -190,14 +204,18 @@ struct FF_PKT { bool (*check_fct)(JCR *, FF_PKT *); /* optionnal user fct to check file changes */ /* Values set by accept_file while processing Options */ - uint32_t flags; /* backup options */ + uint64_t flags; /* backup options */ uint32_t Compress_algo; /* compression algorithm. 4 letters stored as an interger */ int Compress_level; /* compression level */ int strip_path; /* strip path count */ bool cmd_plugin; /* set if we have a command plugin */ bool opt_plugin; /* set if we have an option plugin */ + rblist *mtab_list; /* List of mtab entries */ + uint64_t last_fstype; /* cache last file system type */ + char *last_fstypename; /* cache last file system type name */ alist fstypes; /* allowed file system types */ alist drivetypes; /* allowed drive types */ + alist mount_points; /* Possible mount points to be snapshotted */ /* List of all hard linked files found */ struct f_link **linkhash; /* hard linked files */ @@ -209,6 +227,10 @@ struct FF_PKT { struct HFSPLUS_INFO hfsinfo; /* Finder Info and resource fork size */ }; +typedef void (mtab_handler_t)(void *user_ctx, struct stat *st, + const char *fstype, const char *mountpoint, + const char *mntopts, const char *fsname); +bool read_mtab(mtab_handler_t *mtab_handler, void *user_ctx); #include "protos.h" diff --git a/bacula/src/findlib/find_one.c b/bacula/src/findlib/find_one.c index b87a57108f..d0c1fbf848 100644 --- a/bacula/src/findlib/find_one.c +++ b/bacula/src/findlib/find_one.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* @@ -85,12 +89,22 @@ static FF_PKT *new_dir_ff_pkt(FF_PKT *ff_pkt) dir_ff_pkt->fname = bstrdup(ff_pkt->fname); dir_ff_pkt->link = bstrdup(ff_pkt->link); dir_ff_pkt->sys_fname = get_pool_memory(PM_FNAME); + + if (ff_pkt->strip_snap_path) { + dir_ff_pkt->fname_save = get_pool_memory(PM_FNAME); + dir_ff_pkt->link_save = get_pool_memory(PM_FNAME); + pm_strcpy(dir_ff_pkt->fname_save, ff_pkt->fname_save); + pm_strcpy(dir_ff_pkt->link_save, ff_pkt->link_save); + + } else { + dir_ff_pkt->fname_save = NULL; + dir_ff_pkt->link_save = NULL; + } + dir_ff_pkt->included_files_list = NULL; dir_ff_pkt->excluded_files_list = NULL; dir_ff_pkt->excluded_paths_list = NULL; dir_ff_pkt->linkhash = NULL; - dir_ff_pkt->fname_save = NULL; - dir_ff_pkt->link_save = NULL; dir_ff_pkt->ignoredir_fname = NULL; return dir_ff_pkt; } @@ -109,9 +123,6 @@ static void free_dir_ff_pkt(FF_PKT *dir_ff_pkt) if (dir_ff_pkt->link_save) { free_pool_memory(dir_ff_pkt->link_save); } - if (dir_ff_pkt->ignoredir_fname) { - free_pool_memory(dir_ff_pkt->ignoredir_fname); - } free(dir_ff_pkt); } @@ -126,7 +137,7 @@ static int accept_fstype(FF_PKT *ff, void *dummy) { if (ff->fstypes.size()) { accept = false; - if (!fstype(ff->fname, fs, sizeof(fs))) { + if (!fstype(ff, fs, sizeof(fs))) { Dmsg1(50, "Cannot determine file system type for \"%s\"\n", ff->fname); } else { for (i = 0; i < ff->fstypes.size(); ++i) { @@ -376,7 +387,7 @@ find_one_file(JCR *jcr, FF_PKT *ff_pkt, char fs[100]; - if (!fstype(ff_pkt->fname, fs, sizeof(fs))) { + if (!fstype(ff_pkt, fs, sizeof(fs))) { bstrncpy(fs, "unknown", sizeof(fs)); } @@ -634,10 +645,12 @@ find_one_file(JCR *jcr, FF_PKT *ff_pkt, * to cross, or we may be restricted by a list of permitted * file systems. */ + bool is_win32_mount_point = false; if (!top_level && ff_pkt->flags & FO_NO_RECURSION) { ff_pkt->type = FT_NORECURSE; recurse = false; - } else if (!top_level && (parent_device != ff_pkt->statp.st_dev)) { + } else if (!top_level && (parent_device != ff_pkt->statp.st_dev || + is_win32_mount_point)) { if(!(ff_pkt->flags & FO_MULTIFS)) { ff_pkt->type = FT_NOFSCHG; recurse = false; diff --git a/bacula/src/findlib/fstype.c b/bacula/src/findlib/fstype.c index 82d2b91dde..3ed575d088 100644 --- a/bacula/src/findlib/fstype.c +++ b/bacula/src/findlib/fstype.c @@ -1,24 +1,27 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2004-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Implement routines to determine file system types. * * Written by Preben 'Peppe' Guldberg, December MMIV - * - * Version $Id$ + * Updated by Kern Sibbald, April MMXV */ @@ -26,57 +29,86 @@ #include "bacula.h" #include "find.h" +#include +#include #else /* Set up for testing a stand alone program */ #include #include #include -#define SUPPORTEDOSES \ - "HAVE_DARWIN_OS\n" \ - "HAVE_FREEBSD_OS\n" \ - "HAVE_HPUX_OS\n" \ - "HAVE_IRIX_OS\n" \ - "HAVE_LINUX_OS\n" \ - "HAVE_NETBSD_OS\n" \ - "HAVE_OPENBSD_OS\n" \ - "HAVE_SUN_OS\n" \ - "HAVE_OSF1_OS\n" \ - "HAVE_WIN32\n" -#define false 0 -#define true 1 #define bstrncpy strncpy -#define bstrcmp(s1, s2) !strcmp(s1, s2) #define Dmsg0(n,s) fprintf(stderr, s) #define Dmsg1(n,s,a1) fprintf(stderr, s, a1) #define Dmsg2(n,s,a1,a2) fprintf(stderr, s, a1, a2) #endif +#define is_rootfs(x) bstrcmp("rootfs", x) + +#if defined(HAVE_GETMNTINFO) || defined(HAVE_GETMNTENT) +static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; +#endif + +struct mtab_item { + rblink link; + uint64_t dev; + char fstype[1]; +}; + +/* Compare two device types */ +static int compare_mtab_items(void *item1, void *item2) +{ + mtab_item *mtab1, *mtab2; + mtab1 = (mtab_item *)item1; + mtab2 = (mtab_item *)item2; + if (mtab1->dev < mtab2->dev) return -1; + if (mtab1->dev > mtab2->dev) return 1; + return 0; +} + +void add_mtab_item(void *user_ctx, struct stat *st, const char *fstype, + const char *mountpoint, const char *mntopts, + const char *fsname) +{ + rblist *mtab_list = (rblist *)user_ctx; + mtab_item *item, *ritem; + int len = strlen(fstype) + 1; + + item = (mtab_item *)malloc(sizeof(mtab_item) + len); + item->dev = (uint64_t)st->st_dev; + bstrncpy(item->fstype, fstype, len); + ritem = (mtab_item *)mtab_list->insert((void *)item, compare_mtab_items); + if (ritem != item) { + /* Item already inserted, so we discard this one */ + free(item); + } +} + + /* * These functions should be implemented for each OS * - * bool fstype(const char *fname, char *fs, int fslen); + * bool fstype(FF_PKT *ff_pkt, char *fs, int fslen); */ -#if defined(HAVE_DARWIN_OS) || \ - defined(HAVE_FREEBSD_OS) || \ - defined(HAVE_OPENBSD_OS) +#if defined(HAVE_DARWIN_OS) \ + || defined(HAVE_FREEBSD_OS ) \ + || defined(HAVE_OPENBSD_OS) #include #include -bool fstype(const char *fname, char *fs, int fslen) +bool fstype(FF_PKT *ff_pkt, char *fs, int fslen) { + char *fname = ff_pkt->fname; struct statfs st; - + if (statfs(fname, &st) == 0) { bstrncpy(fs, st.f_fstypename, fslen); return true; } - Dmsg1(50, "statfs() failed for \"%s\"\n", fname); return false; } - #elif defined(HAVE_NETBSD_OS) #include #include @@ -86,58 +118,161 @@ bool fstype(const char *fname, char *fs, int fslen) #define statvfs statfs #endif -bool fstype(const char *fname, char *fs, int fslen) +bool fstype(FF_PKT *ff_pkt, char *fs, int fslen) { + char *fname = ff_pkt->fname; struct statvfs st; - if (statvfs(fname, &st) == 0) { bstrncpy(fs, st.f_fstypename, fslen); return true; } - Dmsg1(50, "statfs() failed for \"%s\"\n", fname); return false; } - -#elif defined(HAVE_HPUX_OS) || \ - defined(HAVE_IRIX_OS) +#elif defined(HAVE_HPUX_OS) \ + || defined(HAVE_IRIX_OS) #include #include -bool fstype(const char *fname, char *fs, int fslen) +bool fstype(FF_PKT *ff_pkt, char *fs, int fslen) { + char *fname = ff_pkt->fname; struct statvfs st; - if (statvfs(fname, &st) == 0) { bstrncpy(fs, st.f_basetype, fslen); return true; } - Dmsg1(50, "statfs() failed for \"%s\"\n", fname); return false; } -#elif defined(HAVE_LINUX_OS) || \ - defined(HAVE_OSF1_OS) +#elif defined(HAVE_LINUX_OS) -#include -#include "lib/mntent_cache.h" +#include +#include -bool fstype(const char *fname, char *fs, int fslen) +/* + * Linux statfs() does not return the filesystem name type. It + * only returns a binary fstype, so we must look up the type name + * in mtab. + */ +bool fstype(FF_PKT *ff_pkt, char *fs, int fslen) { - struct stat st; - mntent_cache_entry_t *mce; + char *fname = ff_pkt->fname; + struct statfs st; + const char *fstype; - if (lstat(fname, &st) == 0) { - if ((mce = find_mntent_mapping(st.st_dev)) != NULL) { - bstrncpy(fs, mce->fstype, fslen); + if (statfs(fname, &st) == 0) { + mtab_item *item, search_item; + if (ff_pkt->last_fstypename && ff_pkt->last_fstype == (uint64_t)st.f_type) { + bstrncpy(fs, ff_pkt->last_fstypename, fslen); + return true; + } + if (!ff_pkt->mtab_list) { + ff_pkt->mtab_list = New(rblist()); + read_mtab(add_mtab_item, ff_pkt->mtab_list); + } + search_item.dev = st.f_type; + item = (mtab_item *)ff_pkt->mtab_list->search((void *)&search_item, compare_mtab_items); + if (item) { + ff_pkt->last_fstype = st.f_type; + bstrncpy(ff_pkt->last_fstypename, item->fstype, sizeof(ff_pkt->last_fstype)); + bstrncpy(fs, ff_pkt->last_fstypename, fslen); return true; } - return false; - } + /* + * Values obtained from statfs(2), testing and + * + * $ grep -r SUPER_MAGIC /usr/include/linux + */ + switch (st.f_type) { + /* Known good values */ + /* ext2, ext3, and ext4 have the same code */ + case 0xef53: fstype = "ext2"; break; /* EXT2_SUPER_MAGIC */ + case 0x3153464a: fstype = "jfs"; break; /* JFS_SUPER_MAGIC */ + case 0x5346544e: fstype = "ntfs"; break; /* NTFS_SB_MAGIC */ + case 0x9fa0: fstype = "proc"; break; /* PROC_SUPER_MAGIC */ + case 0x52654973: fstype = "reiserfs"; break; /* REISERFS_SUPER_MAGIC */ + case 0x58465342: fstype = "xfs"; break; /* XFS_SB_MAGIC */ + case 0x9fa2: fstype = "usbdevfs"; break; /* USBDEVICE_SUPER_MAGIC */ + case 0x62656572: fstype = "sysfs"; break; /* SYSFS_MAGIC */ + case 0x517B: fstype = "smbfs"; break; /* SMB_SUPER_MAGIC */ + case 0x9660: fstype = "iso9660"; break; /* ISOFS_SUPER_MAGIC */ + case 0xadf5: fstype = "adfs"; break; /* ADFS_SUPER_MAGIC */ + case 0xadff: fstype = "affs"; break; /* AFFS_SUPER_MAGIC */ + case 0x42465331: fstype = "befs"; break; /* BEFS_SUPER_MAGIC */ + case 0xFF534D42: fstype = "cifs"; break; /* CIFS_MAGIC_NUMBER */ + case 0x73757245: fstype = "coda"; break; /* CODA_SUPER_MAGIC */ + case 0x012ff7b7: fstype = "coherent"; break; /* COH_SUPER_MAGIC */ + case 0x28cd3d45: fstype = "cramfs"; break; /* CRAMFS_MAGIC */ + case 0x1373: fstype = "devfs"; break; /* DEVFS_SUPER_MAGIC */ + case 0x414A53: fstype = "efs"; break; /* EFS_SUPER_MAGIC */ + case 0x137d: fstype = "ext"; break; /* EXT_SUPER_MAGIC */ + case 0xef51: fstype = "oldext2"; break; /* EXT2_OLD_SUPER_MAGIC */ + case 0x4244: fstype = "hfs"; break; /* EXT2_OLD_SUPER_MAGIC */ + case 0xf995e849: fstype = "hpfs"; break; /* HPFS_SUPER_MAGIC */ + case 0x958458f6: fstype = "hugetlbfs"; break; /* HUGETLBFS_MAGIC */ + case 0x72b6: fstype = "jffs2"; break; /* JFFS2_SUPER_MAGIC */ + case 0x2468: fstype = "minix"; break; /* MINIX2_SUPER_MAGIC */ + case 0x2478: fstype = "minix"; break; /* MINIX2_SUPER_MAGIC2 */ + case 0x137f: fstype = "minix"; break; /* MINIX_SUPER_MAGIC */ + case 0x138f: fstype = "minix"; break; /* MINIX_SUPER_MAGIC2 */ + case 0x4d44: fstype = "msdos"; break; /* MSDOS_SUPER_MAGIC */ + case 0x564c: fstype = "ncpfs"; break; /* NCP_SUPER_MAGIC */ + case 0x6969: fstype = "nfs"; break; /* NFS_SUPER_MAGIC */ + case 0x9fa1: fstype = "openpromfs"; break; /* OPENPROM_SUPER_MAGIC */ + case 0x002f: fstype = "qnx4"; break; /* QNX4_SUPER_MAGIC */ + case 0x7275: fstype = "romfs"; break; /* QNX4_SUPER_MAGIC */ + case 0x012ff7b6: fstype = "sysv2"; break; + case 0x012ff7b5: fstype = "sysv4"; break; + case 0x01021994: fstype = "tempfs"; break; + case 0x15013346: fstype = "udf"; break; + case 0x00011954: fstype = "ufs"; break; + case 0xa501FCF5: fstype = "vxfs"; break; + case 0x012FF7B4: fstype = "xenix"; break; + case 0x012FD16D: fstype = "xiafs"; break; + + +#if 0 /* These need confirmation */ + case 0x6B414653: fstype = "afs"; break; /* AFS_FS_MAGIC */ + case 0x0187: fstype = "autofs"; break; /* AUTOFS_SUPER_MAGIC */ + case 0x62646576: fstype = "bdev"; break; /* ??? */ + case 0x1BADFACE: fstype = "bfs"; break; /* BFS_MAGIC */ + case 0x42494e4d: fstype = "binfmt_misc"; break; /* ??? */ + case (('C'<<8)|'N'): fstype = "capifs"; break; /* CAPIFS_SUPER_MAGIC */ + case 0x1cd1: fstype = "devpts"; break; /* ??? */ + case 0x03111965: fstype = "eventpollfs"; break; /* EVENTPOLLFS_MAGIC */ + case 0xBAD1DEA: fstype = "futexfs"; break; /* ??? */ + case 0xaee71ee7: fstype = "gadgetfs"; break; /* GADGETFS_MAGIC */ + case 0x00c0ffee: fstype = "hostfs"; break; /* HOSTFS_SUPER_MAGIC */ + case 0xb00000ee: fstype = "hppfs"; break; /* HPPFS_SUPER_MAGIC */ + case 0x12061983: fstype = "hwgfs"; break; /* HWGFS_MAGIC */ + case 0x66726f67: fstype = "ibmasmfs"; break; /* IBMASMFS_MAGIC */ + case 0x19800202: fstype = "mqueue"; break; /* MQUEUE_MAGIC */ + case 0x6f70726f: fstype = "oprofilefs"; break; /* OPROFILEFS_MAGIC */ + case 0xa0b4d889: fstype = "pfmfs"; break; /* PFMFS_MAGIC */ + case 0x50495045: fstype = "pipfs"; break; /* PIPEFS_MAGIC */ + case 0x858458f6: fstype = "ramfs"; break; /* RAMFS_MAGIC */ + case 0x7275: fstype = "romfs"; break; /* ROMFS_MAGIC */ + case 0x858458f6: fstype = "rootfs"; break; /* RAMFS_MAGIC */ + case 0x67596969: fstype = "rpc_pipefs"; break; /* RPCAUTH_GSSMAGIC */ + case 0x534F434B: fstype = "sockfs"; break; /* SOCKFS_MAGIC */ + case 0x858458f6: fstype = "tmpfs"; break; /* RAMFS_MAGIC */ + case 0x01021994: fstype = "tmpfs"; break; /* TMPFS_MAGIC */ +#endif - Dmsg1(50, "lstat() failed for \"%s\"\n", fname); + default: + Dmsg2(10, "Unknown file system type \"0x%x\" for \"%s\".\n", st.f_type, + fname); + return false; + } + ff_pkt->last_fstype = st.f_type; + bstrncpy(ff_pkt->last_fstypename, fstype, sizeof(ff_pkt->last_fstypename)); + bstrncpy(fs, fstype, fslen); + return true; + } + Dmsg1(50, "statfs() failed for \"%s\"\n", fname); return false; } @@ -146,82 +281,138 @@ bool fstype(const char *fname, char *fs, int fslen) #include #include -bool fstype(const char *fname, char *fs, int fslen) +bool fstype(FF_PKT *ff_pkt, char *fs, int fslen) { - struct stat st; + /* Solaris has the filesystem type name in the lstat packet */ + bstrncpy(fs, ff_pkt->statp.st_fstype, fslen); + return true; +} + +#elif defined (__digital__) && defined (__unix__) /* Tru64 */ +/* Tru64 */ +#include +#include - if (lstat(fname, &st) == 0) { - bstrncpy(fs, st.st_fstype, fslen); - return true; +bool fstype(FF_PKT *ff_pkt, char *fs, int fslen) +{ + char *fname = ff_pkt->fname; + struct statfs st; + if (statfs((char *)fname, &st) == 0) { + switch (st.f_type) { + /* Known good values */ + case 0xa: bstrncpy(fs, "advfs", fslen); return true; /* Tru64 AdvFS */ + case 0xe: bstrncpy(fs, "nfs", fslen); return true; /* Tru64 NFS */ + default: + Dmsg2(10, "Unknown file system type \"0x%x\" for \"%s\".\n", st.f_type, + fname); + return false; + } } - - Dmsg1(50, "lstat() failed for \"%s\"\n", fname); + Dmsg1(50, "statfs() failed for \"%s\"\n", fname); return false; } +/* Tru64 */ -#elif defined (HAVE_WIN32) -/* Windows */ +#else /* No recognised OS */ -bool fstype(const char *fname, char *fs, int fslen) +bool fstype(FF_PKT *ff_pkt, char *fs, int fslen) { - DWORD componentlength; - DWORD fsflags; - CHAR rootpath[4]; - UINT oldmode; - BOOL result; - - /* Copy Drive Letter, colon, and backslash to rootpath */ - bstrncpy(rootpath, fname, sizeof(rootpath)); + char *fname = ff_pkt->fname; + Dmsg0(10, "!!! fstype() not implemented for this OS. !!!\n"); + return false; +} +#endif - /* We don't want any popups if there isn't any media in the drive */ - oldmode = SetErrorMode(SEM_FAILCRITICALERRORS); +/* Read mtab entries */ +bool read_mtab(mtab_handler_t *mtab_handler, void *user_ctx) +{ +#ifdef HAVE_GETMNTENT + FILE *mntfp; + struct stat st; + +#ifdef HAVE_LINUX_OS + struct mntent *mnt; + P(mutex); + if ((mntfp = setmntent("/proc/mounts", "r")) == NULL) { + if ((mntfp = setmntent(_PATH_MOUNTED, "r")) == NULL) { + V(mutex); + return false; + } + } + while ((mnt = getmntent(mntfp)) != NULL) { + if (is_rootfs(mnt->mnt_type)) { + continue; + } - result = GetVolumeInformation(rootpath, NULL, 0, NULL, &componentlength, &fsflags, fs, fslen); + if (stat(mnt->mnt_dir, &st) < 0) { + continue; + } + mtab_handler(user_ctx, &st, mnt->mnt_type, mnt->mnt_dir, + mnt->mnt_opts, mnt->mnt_fsname); + } + endmntent(mntfp); + V(mutex); +#endif - SetErrorMode(oldmode); +#ifdef HAVE_SUN_OS + struct mnttab mnt; - if (result) { - /* Windows returns NTFS, FAT, etc. Make it lowercase to be consistent with other OSes */ - lcase(fs); - } else { - Dmsg2(10, "GetVolumeInformation() failed for \"%s\", Error = %d.\n", rootpath, GetLastError()); + P(mutex); + if ((mntfp = fopen(MNTTAB, "r")) == NULL) { + V(mutex); + return false; } - return result != 0; -} - -/* Windows */ + while (getmntent(mntfp, &mnt) == 0) { + if (is_rootfs(mnt.mnt_fstype)) { + continue; + } + if (stat(mnt.mnt_mountp, &st) < 0) { + continue; + } + mtab_handler(user_ctx, &st, mnt.mnt_fstype, mnt.mnt_mountp, + mnt.mnt_mntopts, mnt.mnt_special); + } + fclose(fp); + V(mutex); +#endif -#else /* No recognised OS */ +#endif /* HAVE_GETMNTENT */ -bool fstype(const char *fname, char *fs, int fslen) -{ - Dmsg0(10, "!!! fstype() not implemented for this OS. !!!\n"); -#ifdef TEST_PROGRAM - Dmsg1(10, "Please define one of the following when compiling:\n\n%s\n", - SUPPORTEDOSES); - exit(EXIT_FAILURE); +#ifdef HAVE_GETMNTINFO + struct stat st; +#if defined(ST_NOWAIT) + int flags = ST_NOWAIT; +#elif defined(MNT_NOWAIT) + int flags = MNT_NOWAIT; +#else + int flags = 0; #endif - - return false; -} +#if defined(HAVE_NETBSD_OS) + struct statvfs *mntinfo; +#else + struct statfs *mntinfo; #endif - -/* - * Compare function build on top of fstype, OS independent. - * - * bool fstype_equals(const char *fname, const char *fstypename); - */ -bool fstype_equals(const char *fname, const char *fstypename) -{ - char fs_typename[128]; - - if (fstype(fname, fs_typename, sizeof(fs_typename))) { - return bstrcmp(fs_typename, fstypename); + int nument; + + P(mutex); + if ((nument = getmntinfo(&mntinfo, flags)) > 0) { + while (nument-- > 0) { + if (is_rootfs(mntinfo->f_fstypename)) { + continue; + } + if (stat(mntinfo->f_mntonname, &st) < 0) { + continue; + } + mtab_handler(user_ctx, &st, mntinfo->f_mntfromname, + mntinfo->f_mntonname, mntinfo->f_fstypename, NULL); + mntinfo++; + } } - - return false; -} + V(mutex); +#endif /* HAVE_GETMNTINFO */ + return true; +} #ifdef TEST_PROGRAM int main(int argc, char **argv) diff --git a/bacula/src/findlib/makepath.c b/bacula/src/findlib/makepath.c deleted file mode 100644 index 511c62848a..0000000000 --- a/bacula/src/findlib/makepath.c +++ /dev/null @@ -1,344 +0,0 @@ -/* - Bacula® - The Network Backup Solution - - Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - - The main author of Bacula is Kern Sibbald, with contributions from - many others, a complete list can be found in the file AUTHORS. - This program is Free Software; you can redistribute it and/or - modify it under the terms of version three of the GNU Affero General Public - License as published by the Free Software Foundation and included - in the file LICENSE. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. - - Bacula® is a registered trademark of Kern Sibbald. - The licensor of Bacula is the Free Software Foundation Europe - (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, - Switzerland, email:ftf@fsfeurope.org. -*/ - -/* - * Kern Sibbald, September MMVII - * - * This is tricky code, especially when writing from scratch. Fortunately, - * a non-copyrighted version of mkdir was available to consult. - */ -#include "bacula.h" -#include "jcr.h" - -#define dbglvl 50 - -/* - * For old systems that don't have lchown() or lchmod() - */ -#ifndef HAVE_LCHOWN -#define lchown chown -#endif -#ifndef HAVE_LCHMOD -#define lchmod chmod -#endif - - -typedef struct PrivateCurDir { - hlink link; - char fname[1]; -} CurDir; - -/* Initialize the path hash table */ -static bool path_list_init(JCR *jcr) -{ - CurDir *elt = NULL; - jcr->path_list = (htable *)malloc(sizeof(htable)); - - /* Hard to know in advance how many directories will - * be stored in this hash - */ - jcr->path_list->init(elt, &elt->link, 10000); - return true; -} - -/* Add a path to the hash when we create a directory - * with the replace=NEVER option - */ -bool path_list_add(JCR *jcr, uint32_t len, char *fname) -{ - bool ret = true; - CurDir *item; - - if (!jcr->path_list) { - path_list_init(jcr); - } - - /* we store CurDir, fname in the same chunk */ - item = (CurDir *)jcr->path_list->hash_malloc(sizeof(CurDir)+len+1); - - memset(item, 0, sizeof(CurDir)); - memcpy(item->fname, fname, len+1); - - jcr->path_list->insert(item->fname, item); - - Dmsg1(dbglvl, "add fname=<%s>\n", fname); - return ret; -} - -void free_path_list(JCR *jcr) -{ - if (jcr->path_list) { - jcr->path_list->destroy(); - free(jcr->path_list); - jcr->path_list = NULL; - } -} - -bool path_list_lookup(JCR *jcr, char *fname) -{ - bool found=false; - char bkp; - - if (!jcr->path_list) { - return false; - } - - /* Strip trailing / */ - int len = strlen(fname); - if (len == 0) { - return false; - } - len--; - bkp = fname[len]; - if (fname[len] == '/') { /* strip any trailing slash */ - fname[len] = 0; - } - - CurDir *temp = (CurDir *)jcr->path_list->lookup(fname); - if (temp) { - found=true; - } - - Dmsg2(dbglvl, "lookup <%s> %s\n", fname, found?"ok":"not ok"); - - fname[len] = bkp; /* restore last / */ - return found; -} - -static bool makedir(JCR *jcr, char *path, mode_t mode, int *created) -{ - struct stat statp; - - if (mkdir(path, mode) != 0) { - berrno be; - *created = false; - if (lstat(path, &statp) != 0) { - Jmsg2(jcr, M_ERROR, 0, _("Cannot create directory %s: ERR=%s\n"), - path, be.bstrerror()); - return false; - } else if (!S_ISDIR(statp.st_mode)) { - Jmsg1(jcr, M_ERROR, 0, _("%s exists but is not a directory.\n"), path); - return false; - } - return true; /* directory exists */ - } - if (S_ISLNK(statp.st_mode)) { - /* - * Note, we created a directory, not a link, so if we find a - * link, there is a security problem here. - */ - Jmsg1(jcr, M_FATAL, 0, _("Security problem!! We created directory %s, but it is a link.\n"), - path); - return false; - } - - if (jcr->keep_path_list) { - /* When replace=NEVER, we keep track of all directories newly created */ - path_list_add(jcr, strlen(path), path); - } - - *created = true; - return true; -} - -/* - * Restore the owner and permissions (mode) of a Directory. - * See attribs.c for the equivalent for files. - */ -static void set_own_mod(ATTR *attr, char *path, uid_t owner, gid_t group, mode_t mode) -{ - if (lchown(path, owner, group) != 0 && attr->uid == 0 -#ifdef AFS - && errno != EPERM -#endif - ) { - berrno be; - Jmsg2(attr->jcr, M_WARNING, 0, _("Cannot change owner and/or group of %s: ERR=%s\n"), - path, be.bstrerror()); - } - if (lchmod(path, mode) != 0 && attr->uid == 0) { - berrno be; - Jmsg2(attr->jcr, M_WARNING, 0, _("Cannot change permissions of %s: ERR=%s\n"), - path, be.bstrerror()); - } -} - -/* - * mode is the mode bits to use in creating a new directory - * - * parent_mode are the parent's modes if we need to create parent - * directories. - * - * owner and group are to set on any created dirs - * - * keep_dir_modes if set means don't change mode bits if dir exists - */ -bool makepath(ATTR *attr, const char *apath, mode_t mode, mode_t parent_mode, - uid_t owner, gid_t group, int keep_dir_modes) -{ - struct stat statp; - mode_t omask, tmode; - char *path = (char *)apath; - char *p; - int len; - bool ok = false; - int created; - char new_dir[5000]; - int ndir = 0; - int i = 0; - int max_dirs = (int)sizeof(new_dir); - JCR *jcr = attr->jcr; - - if (stat(path, &statp) == 0) { /* Does dir exist? */ - if (!S_ISDIR(statp.st_mode)) { - Jmsg1(jcr, M_ERROR, 0, _("%s exists but is not a directory.\n"), path); - return false; - } - /* Full path exists */ - if (keep_dir_modes) { - return true; - } - set_own_mod(attr, path, owner, group, mode); - return true; - } - omask = umask(0); - umask(omask); - len = strlen(apath); - path = (char *)alloca(len+1); - bstrncpy(path, apath, len+1); - strip_trailing_slashes(path); - /* - * Now for one of the complexities. If we are not running as root, - * then if the parent_mode does not have wx user perms, or we are - * setting the userid or group, and the parent_mode has setuid, setgid, - * or sticky bits, we must create the dir with open permissions, then - * go back and patch all the dirs up with the correct perms. - * Solution, set everything to 0777, then go back and reset them at the - * end. - */ - tmode = 0777; - -#if defined(HAVE_WIN32) - /* Validate drive letter */ - if (path[1] == ':') { - char drive[4] = "X:\\"; - - drive[0] = path[0]; - - UINT drive_type = GetDriveType(drive); - - if (drive_type == DRIVE_UNKNOWN || drive_type == DRIVE_NO_ROOT_DIR) { - Jmsg1(jcr, M_ERROR, 0, _("%c: is not a valid drive.\n"), path[0]); - goto bail_out; - } - - if (path[2] == '\0') { /* attempt to create a drive */ - ok = true; - goto bail_out; /* OK, it is already there */ - } - - p = &path[3]; - } else { - p = path; - } -#else - p = path; -#endif - - /* Skip leading slash(es) */ - while (IsPathSeparator(*p)) { - p++; - } - while ((p = first_path_separator(p))) { - char save_p; - save_p = *p; - *p = 0; - if (!makedir(jcr, path, tmode, &created)) { - goto bail_out; - } - if (ndir < max_dirs) { - new_dir[ndir++] = created; - } - *p = save_p; - while (IsPathSeparator(*p)) { - p++; - } - } - /* Create final component */ - if (!makedir(jcr, path, tmode, &created)) { - goto bail_out; - } - if (ndir < max_dirs) { - new_dir[ndir++] = created; - } - if (ndir >= max_dirs) { - Jmsg0(jcr, M_WARNING, 0, _("Too many subdirectories. Some permissions not reset.\n")); - } - - /* Now set the proper owner and modes */ -#if defined(HAVE_WIN32) - - /* Don't propagate the hidden or encrypted attributes to parent directories */ - parent_mode &= ~S_ISVTX; - parent_mode &= ~S_ISGID; - - if (path[1] == ':') { - p = &path[3]; - } else { - p = path; - } -#else - p = path; -#endif - /* Skip leading slash(es) */ - while (IsPathSeparator(*p)) { - p++; - } - while ((p = first_path_separator(p))) { - char save_p; - save_p = *p; - *p = 0; - if (i < ndir && new_dir[i++] && !keep_dir_modes) { - set_own_mod(attr, path, owner, group, parent_mode); - } - *p = save_p; - while (IsPathSeparator(*p)) { - p++; - } - } - - /* Set for final component */ - if (i < ndir && new_dir[i++]) { - set_own_mod(attr, path, owner, group, mode); - } - - ok = true; -bail_out: - umask(omask); - return ok; -} diff --git a/bacula/src/findlib/match.c b/bacula/src/findlib/match.c index ba85de6fc8..69a19a8a86 100644 --- a/bacula/src/findlib/match.c +++ b/bacula/src/findlib/match.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Old style @@ -39,11 +43,7 @@ #endif /* Fold case in fnmatch() on Win32 */ -#ifdef HAVE_WIN32 -static const int fnmode = FNM_CASEFOLD; -#else static const int fnmode = 0; -#endif #undef bmalloc @@ -179,14 +179,14 @@ void add_fname_to_include_list(FF_PKT *ff, int prefixed, const char *fname) if (*rp >= '0' && *rp <= '9') { inc->options |= FO_COMPRESS; inc->algo = COMPRESS_GZIP; - inc->level = *rp - '0'; + inc->Compress_level = *rp - '0'; } - else if (*rp == 'o') { + else if (*rp == 'o') { inc->options |= FO_COMPRESS; inc->algo = COMPRESS_LZO1X; - inc->level = 1; /* not used with LZO */ + inc->Compress_level = 1; /* not used with LZO */ } - Dmsg2(200, "Compression alg=%d level=%d\n", inc->algo, inc->level); + Dmsg2(200, "Compression alg=%d level=%d\n", inc->algo, inc->Compress_level); break; case 'K': inc->options |= FO_NOATIME; @@ -285,7 +285,7 @@ struct s_included_file *get_next_included_file(FF_PKT *ff, struct s_included_fil if (inc) { ff->flags = inc->options; ff->Compress_algo = inc->algo; - ff->Compress_level = inc->level; + ff->Compress_level = inc->Compress_level; } return inc; } diff --git a/bacula/src/findlib/mkpath.c b/bacula/src/findlib/mkpath.c new file mode 100644 index 0000000000..f1c4feea44 --- /dev/null +++ b/bacula/src/findlib/mkpath.c @@ -0,0 +1,307 @@ +/* + Bacula(R) - The Network Backup Solution + + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2007-2014 Free Software Foundation Europe e.V. + + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. + + You may use this file and others of this release according to the + license defined in the LICENSE file, which includes the Affero General + Public License, v3.0 ("AGPLv3") and some additional permissions and + terms pursuant to its AGPLv3 Section 7. + + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + +/* + * Kern Sibbald, September MMVII + * + * This is tricky code, especially when writing from scratch. Fortunately, + * a non-copyrighted version of mkdir was available to consult. + * + * ***FIXME*** the mkpath code could be significantly optimized by + * walking up the path chain from the bottom until it either gets + * to the top or finds an existing directory then walk back down + * creating the path components. Currently, it always starts at + * the top, which can be rather inefficient for long path names. + * + */ +#include "bacula.h" +#include "jcr.h" + +#define dbglvl 50 + +/* + * For old systems that don't have lchown() or lchmod() + */ +#ifndef HAVE_LCHOWN +#define lchown chown +#endif +#ifndef HAVE_LCHMOD +#define lchmod chmod +#endif + + +typedef struct PrivateCurDir { + hlink link; + char fname[1]; +} CurDir; + +/* Initialize the path hash table */ +static bool path_list_init(JCR *jcr) +{ + CurDir *elt = NULL; + jcr->path_list = (htable *)malloc(sizeof(htable)); + + /* Hard to know in advance how many directories will + * be stored in this hash + */ + jcr->path_list->init(elt, &elt->link, 10000); + return true; +} + +/* Add a path to the hash when we create a directory + * with the replace=NEVER option + */ +bool path_list_add(JCR *jcr, uint32_t len, char *fname) +{ + bool ret = true; + CurDir *item; + + if (!jcr->path_list) { + path_list_init(jcr); + } + + /* we store CurDir, fname in the same chunk */ + item = (CurDir *)jcr->path_list->hash_malloc(sizeof(CurDir)+len+1); + + memset(item, 0, sizeof(CurDir)); + memcpy(item->fname, fname, len+1); + + jcr->path_list->insert(item->fname, item); + + Dmsg1(dbglvl, "add fname=<%s>\n", fname); + return ret; +} + +void free_path_list(JCR *jcr) +{ + if (jcr->path_list) { + jcr->path_list->destroy(); + free(jcr->path_list); + jcr->path_list = NULL; + } +} + +bool path_list_lookup(JCR *jcr, char *fname) +{ + bool found=false; + char bkp; + + if (!jcr->path_list) { + return false; + } + + /* Strip trailing / */ + int len = strlen(fname); + if (len == 0) { + return false; + } + len--; + bkp = fname[len]; + if (fname[len] == '/') { /* strip any trailing slash */ + fname[len] = 0; + } + + CurDir *temp = (CurDir *)jcr->path_list->lookup(fname); + if (temp) { + found=true; + } + + Dmsg2(dbglvl, "lookup <%s> %s\n", fname, found?"ok":"not ok"); + + fname[len] = bkp; /* restore last / */ + return found; +} + +static bool makedir(JCR *jcr, char *path, mode_t mode, int *created) +{ + struct stat statp; + + if (mkdir(path, mode) != 0) { + berrno be; + *created = false; + if (lstat(path, &statp) != 0) { + Jmsg2(jcr, M_ERROR, 0, _("Cannot create directory %s: ERR=%s\n"), + path, be.bstrerror()); + return false; + } else if (!S_ISDIR(statp.st_mode)) { + Jmsg1(jcr, M_ERROR, 0, _("%s exists but is not a directory.\n"), path); + return false; + } + return true; /* directory exists */ + } +#if 0 + /* TODO: This code rely on statp that is not initialized, we need to do a stat() */ + if (S_ISLNK(statp.st_mode)) { + /* + * Note, we created a directory, not a link, so if we find a + * link, there is a security problem here. + */ + Jmsg1(jcr, M_FATAL, 0, _("Security problem!! We created directory %s, but it is a link.\n"), + path); + return false; + } +#endif + if (jcr->keep_path_list) { + /* When replace=NEVER, we keep track of all directories newly created */ + path_list_add(jcr, strlen(path), path); + } + + *created = true; + return true; +} + +/* + * Restore the owner and permissions (mode) of a Directory. + * See attribs.c for the equivalent for files. + */ +static void set_own_mod(ATTR *attr, char *path, uid_t owner, gid_t group, mode_t mode) +{ + if (lchown(path, owner, group) != 0 && attr->uid == 0 +#ifdef AFS + && errno != EPERM +#endif + ) { + berrno be; + Jmsg2(attr->jcr, M_WARNING, 0, _("Cannot change owner and/or group of %s: ERR=%s\n"), + path, be.bstrerror()); + } + if (lchmod(path, mode) != 0 && attr->uid == 0) { + berrno be; + Jmsg2(attr->jcr, M_WARNING, 0, _("Cannot change permissions of %s: ERR=%s\n"), + path, be.bstrerror()); + } +} + +/* + * mode is the mode bits to use in creating a new directory + * + * parent_mode are the parent's modes if we need to create parent + * directories. + * + * owner and group are to set on any created dirs + * + * keep_dir_modes if set means don't change mode bits if dir exists + */ +bool makepath(ATTR *attr, const char *apath, mode_t mode, mode_t parent_mode, + uid_t owner, gid_t group, int keep_dir_modes) +{ + struct stat statp; + mode_t omask, tmode; + char *path = (char *)apath; + char *p; + int len; + bool ok = false; + int created; + char new_dir[5000]; + int ndir = 0; + int i = 0; + int max_dirs = (int)sizeof(new_dir); + JCR *jcr = attr->jcr; + + if (stat(path, &statp) == 0) { /* Does dir exist? */ + if (!S_ISDIR(statp.st_mode)) { + Jmsg1(jcr, M_ERROR, 0, _("%s exists but is not a directory.\n"), path); + return false; + } + /* Full path exists */ + if (keep_dir_modes) { + return true; + } + set_own_mod(attr, path, owner, group, mode); + return true; + } + omask = umask(0); + umask(omask); + len = strlen(apath); + path = (char *)alloca(len+1); + bstrncpy(path, apath, len+1); + strip_trailing_slashes(path); + /* + * Now for one of the complexities. If we are not running as root, + * then if the parent_mode does not have wx user perms, or we are + * setting the userid or group, and the parent_mode has setuid, setgid, + * or sticky bits, we must create the dir with open permissions, then + * go back and patch all the dirs up with the correct perms. + * Solution, set everything to 0777, then go back and reset them at the + * end. + */ + tmode = 0777; + + p = path; + + /* Skip leading slash(es) */ + while (IsPathSeparator(*p)) { + p++; + } + while ((p = first_path_separator(p))) { + char save_p; + save_p = *p; + *p = 0; + if (!makedir(jcr, path, tmode, &created)) { + goto bail_out; + } + if (ndir < max_dirs) { + new_dir[ndir++] = created; + } + *p = save_p; + while (IsPathSeparator(*p)) { + p++; + } + } + /* Create final component */ + if (!makedir(jcr, path, tmode, &created)) { + goto bail_out; + } + if (ndir < max_dirs) { + new_dir[ndir++] = created; + } + if (ndir >= max_dirs) { + Jmsg0(jcr, M_WARNING, 0, _("Too many subdirectories. Some permissions not reset.\n")); + } + + /* Now set the proper owner and modes */ + p = path; + /* Skip leading slash(es) */ + while (IsPathSeparator(*p)) { + p++; + } + while ((p = first_path_separator(p))) { + char save_p; + save_p = *p; + *p = 0; + if (i < ndir && new_dir[i++] && !keep_dir_modes) { + set_own_mod(attr, path, owner, group, parent_mode); + } + *p = save_p; + while (IsPathSeparator(*p)) { + p++; + } + } + + /* Set for final component */ + if (i < ndir && new_dir[i++]) { + set_own_mod(attr, path, owner, group, mode); + } + + ok = true; +bail_out: + umask(omask); + return ok; +} diff --git a/bacula/src/findlib/priv.c b/bacula/src/findlib/priv.c deleted file mode 100644 index 0bd0495aa4..0000000000 --- a/bacula/src/findlib/priv.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - Bacula® - The Network Backup Solution - - Copyright (C) 2003-2014 Free Software Foundation Europe e.V. - - The main author of Bacula is Kern Sibbald, with contributions from - many others, a complete list can be found in the file AUTHORS. - This program is Free Software; you can redistribute it and/or - modify it under the terms of version three of the GNU Affero General Public - License as published by the Free Software Foundation and included - in the file LICENSE. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. - - Bacula® is a registered trademark of Kern Sibbald. - The licensor of Bacula is the Free Software Foundation Europe - (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, - Switzerland, email:ftf@fsfeurope.org. -*/ -/* - * Enable backup privileges for Win32 systems. - * - * Kern Sibbald, May MMIII - * - */ - -#include "bacula.h" -#include "jcr.h" - - -/*=============================================================*/ -/* */ -/* * * * U n i x * * * * */ -/* */ -/*=============================================================*/ - -int enable_backup_privileges(JCR *jcr, int ignore_errors) - { return 0; } - diff --git a/bacula/src/findlib/protos.h b/bacula/src/findlib/protos.h index caf331c5b9..7291ee82d8 100644 --- a/bacula/src/findlib/protos.h +++ b/bacula/src/findlib/protos.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Prototypes for finlib directory of Bacula @@ -31,13 +35,14 @@ int create_file (JCR *jcr, ATTR *attr, BFILE *ofd, int replace); /* From find.c */ FF_PKT *init_find_files(); +void set_find_snapshot_function(FF_PKT *ff, + bool convert_path(JCR *jcr, FF_PKT *ff, dlist *filelist, dlistString *node)); void set_find_options(FF_PKT *ff, int incremental, time_t mtime); void set_find_changed_function(FF_PKT *ff, bool check_fct(JCR *jcr, FF_PKT *ff)); int find_files(JCR *jcr, FF_PKT *ff, int file_sub(JCR *, FF_PKT *ff_pkt, bool), int plugin_sub(JCR *, FF_PKT *ff_pkt, bool)); int match_files(JCR *jcr, FF_PKT *ff, int sub(JCR *, FF_PKT *ff_pkt, bool)); int term_find_files(FF_PKT *ff); -int get_win32_driveletters(FF_PKT *ff, char* szDrives); bool is_in_fileset(FF_PKT *ff); bool accept_file(FF_PKT *ff); @@ -75,10 +80,11 @@ bool path_list_add(JCR *jcr, uint32_t len, char *fname); /* from fstype.c */ -bool fstype(const char *fname, char *fs, int fslen); -bool fstype_equals(const char *fname, const char *fstypename); +bool fstype(FF_PKT *ff_pkt, char *fs, int fslen); +bool fstype_equals(const char *fname, const char *fstype_name); /* from drivetype.c */ bool drivetype(const char *fname, char *fs, int fslen); /* from bfile.c -- see bfile.h */ +/* from namedpipe.c -- see namedpipe.h */ diff --git a/bacula/src/findlib/savecwd.c b/bacula/src/findlib/savecwd.c new file mode 100644 index 0000000000..2c64cc7086 --- /dev/null +++ b/bacula/src/findlib/savecwd.c @@ -0,0 +1,121 @@ +/* + Bacula(R) - The Network Backup Solution + + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2007-2014 Free Software Foundation Europe e.V. + + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. + + You may use this file and others of this release according to the + license defined in the LICENSE file, which includes the Affero General + Public License, v3.0 ("AGPLv3") and some additional permissions and + terms pursuant to its AGPLv3 Section 7. + + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + +/* + * Kern Sibbald, August MMVII + * + */ + +#include "bacula.h" +#include "savecwd.h" + +/* + * Attempt to save the current working directory by various means so that + * we can optimize code by doing a cwd and then restore the cwd. + */ + +#ifdef HAVE_FCHDIR +static bool fchdir_failed = false; /* set if we get a fchdir failure */ +#else +static bool fchdir_failed = true; /* set if we get a fchdir failure */ +#endif + +/* + * Save current working directory. + * Returns: true if OK + * false if failed + */ +bool saveCWD::save(JCR *jcr) +{ + release(); /* clean up */ + if (!fchdir_failed) { + m_fd = open(".", O_RDONLY); + if (m_fd < 0) { + berrno be; + Jmsg1(jcr, M_ERROR, 0, _("Cannot open current directory: ERR=%s\n"), be.bstrerror()); + m_saved = false; + return false; + } + } + + if (fchdir_failed) { + POOLMEM *buf = get_memory(5000); + m_cwd = (POOLMEM *)getcwd(buf, sizeof_pool_memory(buf)); + if (m_cwd == NULL) { + berrno be; + Jmsg1(jcr, M_ERROR, 0, _("Cannot get current directory: ERR=%s\n"), be.bstrerror()); + free_pool_memory(buf); + m_saved = false; + return false; + } + } + m_saved = true; + return true; +} + +/* + * Restore previous working directory. + * Returns: true if OK + * false if failed + */ +bool saveCWD::restore(JCR *jcr) +{ + if (!m_saved) { + return true; + } + m_saved = false; + if (m_fd >= 0) { + if (fchdir(m_fd) != 0) { + berrno be; + Jmsg1(jcr, M_ERROR, 0, _("Cannot reset current directory: ERR=%s\n"), be.bstrerror()); + close(m_fd); + m_fd = -1; + fchdir_failed = true; + chdir("/"); /* punt */ + return false; + } + return true; + } + if (chdir(m_cwd) < 0) { + berrno be; + Jmsg1(jcr, M_ERROR, 0, _("Cannot reset current directory: ERR=%s\n"), be.bstrerror()); + chdir("/"); + free_pool_memory(m_cwd); + m_cwd = NULL; + return false; + } + return true; +} + +void saveCWD::release() +{ + if (!m_saved) { + return; + } + m_saved = false; + if (m_fd >= 0) { + close(m_fd); + m_fd = -1; + } + if (m_cwd) { + free_pool_memory(m_cwd); + m_cwd = NULL; + } +} diff --git a/bacula/src/findlib/savecwd.h b/bacula/src/findlib/savecwd.h new file mode 100644 index 0000000000..d88eeacf51 --- /dev/null +++ b/bacula/src/findlib/savecwd.h @@ -0,0 +1,43 @@ +/* + Bacula(R) - The Network Backup Solution + + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2007-2014 Free Software Foundation Europe e.V. + + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. + + You may use this file and others of this release according to the + license defined in the LICENSE file, which includes the Affero General + Public License, v3.0 ("AGPLv3") and some additional permissions and + terms pursuant to its AGPLv3 Section 7. + + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + +/* + * Kern Sibbald, August MMVII + * + */ + +#ifndef _SAVECWD_H +#define _SAVECWD_H 1 + +class saveCWD { + bool m_saved; /* set if we should do chdir i.e. save_cwd worked */ + int m_fd; /* fd of current dir before chdir */ + char *m_cwd; /* cwd before chdir if fd fchdir() works */ + +public: + saveCWD() { m_saved=false; m_fd=-1; m_cwd=NULL; }; + ~saveCWD() { release(); }; + bool save(JCR *jcr); + bool restore(JCR *jcr); + void release(); + bool is_saved() { return m_saved; }; +}; + +#endif /* _SAVECWD_H */ diff --git a/bacula/src/host.h.in b/bacula/src/host.h.in index 801e945c3d..821c7d128e 100644 --- a/bacula/src/host.h.in +++ b/bacula/src/host.h.in @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 2000-2010 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Define Host machine diff --git a/bacula/src/jcr.h b/bacula/src/jcr.h index ef56593014..e9fc3715b0 100644 --- a/bacula/src/jcr.h +++ b/bacula/src/jcr.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula JCR Structure definition for Daemons and the Library @@ -62,6 +66,7 @@ #define JS_Differences 'D' /* Verify differences */ #define JS_ErrorTerminated 'E' /* Job terminated in error */ #define JS_WaitFD 'F' /* waiting on File daemon */ +#define JS_Incomplete 'I' /* Incomplete Job */ #define JS_DataCommitting 'L' /* Committing data (last despool) */ #define JS_WaitMount 'M' /* waiting for Mount */ #define JS_Running 'R' /* running */ @@ -133,17 +138,18 @@ enum { class JCR; class BSOCK; struct FF_PKT; -class B_DB; +class BDB; struct ATTR_DBR; class Plugin; struct save_pkt; struct bpContext; -struct xattr_private_data_t; + #ifdef FILE_DAEMON class htable; -struct acl_data_t; -struct xattr_data_t; +struct acl_ctx_t; +struct xattr_ctx_t; +class snapshot_manager; struct CRYPTO_CTX { bool pki_sign; /* Enable PKI Signatures? */ @@ -165,6 +171,7 @@ typedef void (JCR_free_HANDLER)(JCR *jcr); class JCR { private: pthread_mutex_t mutex; /* jcr mutex */ + pthread_mutex_t mutex_auth; /* used during authentication */ volatile int32_t _use_count; /* use count */ int32_t m_JobType; /* backup, restore, verify ... */ int32_t m_JobLevel; /* Job level */ @@ -172,13 +179,22 @@ private: public: void lock() {P(mutex); }; void unlock() {V(mutex); }; + void lock_auth() {P(mutex_auth);}; + void unlock_auth() {V(mutex_auth);}; void inc_use_count(void) {lock(); _use_count++; unlock(); }; void dec_use_count(void) {lock(); _use_count--; unlock(); }; int32_t use_count() const { return _use_count; }; - void init_mutex(void) {pthread_mutex_init(&mutex, NULL); }; - void destroy_mutex(void) {pthread_mutex_destroy(&mutex); }; + void init_mutex(void) { + pthread_mutex_init(&mutex, NULL); + pthread_mutex_init(&mutex_auth, NULL); + }; + void destroy_mutex(void) { + pthread_mutex_destroy(&mutex_auth); + pthread_mutex_destroy(&mutex); + }; bool is_job_canceled() {return job_canceled(this); }; bool is_canceled() {return job_canceled(this); }; + bool is_incomplete() { return JobStatus == JS_Incomplete; }; bool is_JobLevel(int32_t JobLevel) { return JobLevel == m_JobLevel; }; bool is_JobType(int32_t JobType) { return JobType == m_JobType; }; bool is_JobStatus(int32_t aJobStatus) { return aJobStatus == JobStatus; }; @@ -194,9 +210,9 @@ public: }; const char *get_OperationName(); /* in lib/jcr.c */ const char *get_ActionName(bool past); /* in lib/jcr.c */ - void setJobStatus(int newJobStatus); /* in lib/jcr.c */ + void setJobStatus(int JobStatus); /* in lib/jcr.c */ bool sendJobStatus(); /* in lib/jcr.c */ - bool sendJobStatus(int newJobStatus); /* in lib/jcr.c */ + bool sendJobStatus(int JobStatus); /* in lib/jcr.c */ bool JobReads(); /* in lib/jcr.c */ void my_thread_send_signal(int sig); /* in lib/jcr.c */ void set_killable(bool killable); /* in lib/jcr.c */ @@ -224,11 +240,14 @@ public: uint32_t VolSessionTime; uint32_t JobFiles; /* Number of files written, this job */ uint32_t JobErrors; /* Number of non-fatal errors this job */ + uint32_t SDErrors; /* Number of non-fatal SD errors */ uint32_t JobWarnings; /* Number of warning messages */ uint32_t LastRate; /* Last sample bytes/sec */ uint64_t JobBytes; /* Number of bytes processed this job */ uint64_t LastJobBytes; /* Last sample number bytes */ - uint64_t ReadBytes; /* Bytes read */ + uint64_t ReadBytes; /* Bytes read -- before compression */ + uint64_t CommBytes; /* FD comm line bytes sent to SD */ + uint64_t CommCompressedBytes; /* FD comm line compressed bytes sent to SD */ FileId_t FileId; /* Last FileId used */ volatile int32_t JobStatus; /* ready, running, blocked, terminated */ int32_t JobPriority; /* Job priority */ @@ -266,12 +285,13 @@ public: bool rerunning; /* rerunning an incomplete job */ bool job_started; /* Set when the job is actually started */ bool sd_calls_client; /* Set for SD to call client (FD/SD) */ + bool exiting; /* Set when exiting */ void *Python_job; /* Python Job Object */ void *Python_events; /* Python Events Object */ POOLMEM *attr; /* Attribute string from SD */ - B_DB *db; /* database pointer */ - B_DB *db_batch; /* database pointer for batch and accurate */ + BDB *db; /* database pointer */ + BDB *db_batch; /* database pointer for batch and accurate */ uint64_t nb_base_files; /* Number of base files */ uint64_t nb_base_files_used; /* Number of useful files in base */ @@ -287,11 +307,14 @@ public: int64_t max_bandwidth; /* Bandwidth limit for this Job */ htable *path_list; /* Directory list (used by findlib) */ + uint32_t getErrors() { return JobErrors + SDErrors; }; /* Get error count */ + /* Daemon specific part of JCR */ /* This should be empty in the library */ #ifdef DIRECTOR_DAEMON /* Director Daemon specific data part of JCR */ + bool SD_msg_chan_started; /* True if the msg thread is started */ pthread_t SD_msg_chan; /* Message channel thread id */ pthread_cond_t term_wait; /* Wait for job termination */ workq_ele_t *work_item; /* Work queue item if scheduled */ @@ -315,7 +338,6 @@ public: MSGS *messages; /* Default message handler */ uint32_t SDJobFiles; /* Number of files written, this job */ uint64_t SDJobBytes; /* Number of bytes processed this job */ - uint32_t SDErrors; /* Number of non-fatal errors */ volatile int32_t SDJobStatus; /* Storage Job Status */ volatile int32_t FDJobStatus; /* File daemon Job Status */ uint32_t ExpectedFiles; /* Expected restore files */ @@ -323,7 +345,9 @@ public: uint32_t FileIndex; /* Last FileIndex processed */ utime_t MaxRunSchedTime; /* max run time in seconds from Initial Scheduled time */ POOLMEM *fname; /* name to put into catalog */ + POOLMEM *component_fname; /* Component info file name */ POOLMEM *media_type; /* Set if user supplied Storage */ + FILE *component_fd; /* Component info file desc */ JOB_DBR jr; /* Job DB record for current job */ JOB_DBR previous_jr; /* previous job database record */ JOB *previous_job; /* Job resource of migration previous job */ @@ -348,8 +372,8 @@ public: int32_t FDVersion; /* File daemon version number */ int32_t SDVersion; /* Storage daemon version number */ int64_t spool_size; /* Spool size for this job */ + utime_t snapshot_retention; /* Snapshot retention (from Client/Job resource) */ volatile bool sd_msg_thread_done; /* Set when Storage message thread done */ - bool SD_msg_chan_started; /* Set if message thread started */ bool wasVirtualFull; /* set if job was VirtualFull */ bool IgnoreDuplicateJobChecking; /* set in migration jobs */ bool spool_data; /* Spool data in SD */ @@ -360,13 +384,14 @@ public: bool needs_sd; /* set if SD needed by Job */ bool cloned; /* set if cloned */ bool unlink_bsr; /* Unlink bsr file created */ - bool VSS; /* VSS used by FD */ + bool Snapshot; /* Snapshot used by FD (VSS on Windows) */ bool Encrypt; /* Encryption used by FD */ bool stats_enabled; /* Keep all job records in a table for long term statistics */ bool no_maxtime; /* Don't check Max*Time for this JCR */ bool keep_sd_auth_key; /* Clear or not the SD auth key after connection*/ bool use_accurate_chksum; /* Use or not checksum option in accurate code */ bool run_pool_override; + bool cmdline_next_pool_override; /* Next pool is overridden */ bool run_next_pool_override; /* Next pool is overridden */ bool run_full_pool_override; bool run_inc_pool_override; @@ -380,12 +405,13 @@ public: #ifdef FILE_DAEMON /* File Daemon specific part of JCR */ + BSOCK *sd_calls_client_bsock; /* Socket used by SDCallsClient feature */ uint32_t num_files_examined; /* files examined this job */ POOLMEM *last_fname; /* last file saved/verified */ POOLMEM *job_metadata; /* VSS job metadata */ pthread_cond_t job_start_wait; /* Wait for SD to start Job */ - acl_data_t *acl_data; /* ACLs for backup/restore */ - xattr_data_t *xattr_data; /* Extended Attributes for backup/restore */ + acl_ctx_t *acl_ctx; /* ACLs for backup/restore */ + xattr_ctx_t *xattr_ctx; /* Extended Attributes for backup/restore */ int32_t last_type; /* type of last file saved/verified */ int incremental; /* set if incremental for SINCE */ time_t last_stat_time; /* Last time stats sent to Dir */ @@ -415,11 +441,14 @@ public: alist *RunScripts; /* Commands to run before and after job */ CRYPTO_CTX crypto; /* Crypto ctx */ DIRRES* director; /* Director resource */ - bool VSS; /* VSS used by FD */ + bool Snapshot; /* Snapshot used by FD (or VSS) */ bool got_metadata; /* set when found job_metatdata */ bool multi_restore; /* Dir can do multiple storage restore */ + bool interactive_session; /* Use interactive session with the SD */ htable *file_list; /* Previous file list (accurate mode) */ uint64_t base_size; /* compute space saved with base job */ + utime_t snapshot_retention; /* Snapshot retention (from director) */ + snapshot_manager *snap_mgr; /* Snapshot manager */ #endif /* FILE_DAEMON */ @@ -427,6 +456,7 @@ public: /* Storage Daemon specific part of JCR */ JCR *next_dev; /* next JCR attached to device */ JCR *prev_dev; /* previous JCR attached to device */ + dlist *jobmedia_queue; /* JobMedia queue */ char *dir_auth_key; /* Dir auth key */ pthread_cond_t job_start_wait; /* Wait for FD to start Job */ int32_t type; @@ -438,7 +468,7 @@ public: POOLMEM *fileset_md5; /* MD5 for FileSet */ char stored_addr[MAX_NAME_LENGTH]; /* storage daemon address */ char client_addr[MAX_NAME_LENGTH]; /* client daemon address */ - VOL_LIST *VolList; /* list to read */ + VOL_LIST *VolList; /* list to read, freed at the end of the job */ int32_t NumWriteVolumes; /* number of volumes written */ int32_t NumReadVolumes; /* total number of volumes to read */ int32_t CurReadVolume; /* current read volume number */ @@ -447,6 +477,8 @@ public: int32_t FDVersion; /* File daemon version number */ int32_t SDVersion; /* Storage daemon version number */ bool session_opened; + bool interactive_session; /* Interactive session with the FD */ + bool is_ok_data_sent; /* the "3000 OK data" has been sent */ long Ticket; /* ticket for this job */ bool ignore_label_errors; /* ignore Volume label errors */ bool spool_attributes; /* set if spooling attributes */ diff --git a/bacula/src/lib/Makefile.in b/bacula/src/lib/Makefile.in index 660b0aebb7..4726e7734e 100644 --- a/bacula/src/lib/Makefile.in +++ b/bacula/src/lib/Makefile.in @@ -1,6 +1,6 @@ # -# Author: Kern Sibbald -# License: LGPLv3 +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # @MCOMMON@ @@ -9,7 +9,6 @@ LIBBAC_LT_RELEASE = @LIBBAC_LT_RELEASE@ LIBBACCFG_LT_RELEASE = @LIBBACCFG_LT_RELEASE@ # - srcdir = . VPATH = . .PATH: . @@ -37,7 +36,7 @@ INCLUDE_FILES = ../baconfig.h ../bacula.h ../bc_types.h \ berrno.h bits.h bpipe.h breg.h bregex.h \ bsock.h btime.h btimers.h crypto.h dlist.h \ fnmatch.h guid_to_name.h htable.h lex.h \ - lib.h md5.h mem_pool.h message.h mntent_cache.h \ + lib.h md5.h mem_pool.h message.h \ openssl.h plugins.h protos.h queue.h rblist.h \ runscript.h rwlock.h serial.h sellist.h sha1.h \ smartall.h status.h tls.h tree.h var.h \ @@ -49,13 +48,13 @@ INCLUDE_FILES = ../baconfig.h ../bacula.h ../bc_types.h \ # libbac # LIBBAC_SRCS = attr.c base64.c berrno.c bsys.c binflate.c bget_msg.c \ - bnet.c bnet_server.c runscript.c \ - bsock.c bpipe.c bsnprintf.c btime.c \ - cram-md5.c crc32.c crypto.c daemon.c edit.c fnmatch.c \ + crc32.c \ + bnet.c bnet_server.c bsock.c bpipe.c bsnprintf.c btime.c \ + cram-md5.c crypto.c daemon.c edit.c fnmatch.c \ guid_to_name.c hmac.c jcr.c lex.c alist.c dlist.c \ - md5.c message.c mem_pool.c mntent_cache.c openssl.c \ + md5.c message.c mem_pool.c openssl.c \ plugins.c priv.c queue.c bregex.c \ - rwlock.c scan.c sellist.c serial.c sha1.c \ + runscript.c rwlock.c scan.c sellist.c serial.c sha1.c \ signal.c smartall.c rblist.c tls.c tree.c \ util.c var.c watchdog.c workq.c btimers.c \ address_conf.c breg.c htable.c lockmgr.c devlock.c @@ -70,7 +69,6 @@ LIBBACCFG_SRCS = ini.c parse_conf.c res.c LIBBACCFG_OBJS = $(LIBBACCFG_SRCS:.c=.o) LIBBACCFG_LOBJS = $(LIBBACCFG_SRCS:.c=.lo) - .SUFFIXES: .c .cc .o .lo .ch .dvi .pdf .tex .view .w .1 .PHONY: .DONTCARE: @@ -94,9 +92,8 @@ LIBBACCFG_LOBJS = $(LIBBACCFG_SRCS:.c=.lo) # specific build rules - #------------------------------------------------------------------------- -all: Makefile libbac$(DEFAULT_ARCHIVE_TYPE) libbaccfg$(DEFAULT_ARCHIVE_TYPE) +all: Makefile libbac$(DEFAULT_ARCHIVE_TYPE) libbaccfg$(DEFAULT_ARCHIVE_TYPE) @echo "==== Make of lib is good ====" @echo " " @@ -109,12 +106,12 @@ libbac.la: Makefile $(LIBBAC_LOBJS) @echo "Making $@ ..." $(LIBTOOL_LINK) $(CXX) $(DEFS) $(DEBUG) $(LDFLAGS) -o $@ $(LIBBAC_LOBJS) -export-dynamic -rpath $(libdir) -release $(LIBBAC_LT_RELEASE) $(WRAPLIBS) $(CAP_LIBS) $(ZLIBS) $(OPENSSL_LIBS) $(LIBS) $(DLLIBS) -libbaccfg.a: $(LIBBACCFG_OBJS) +libbaccfg.a: $(LIBBACCFG_OBJS) @echo "Making $@ ..." $(AR) rc $@ $(LIBBACCFG_OBJS) $(RANLIB) $@ -libbaccfg.la: Makefile $(LIBBACCFG_LOBJS) +libbaccfg.la: Makefile $(LIBBACCFG_LOBJS) @echo "Making $@ ..." $(LIBTOOL_LINK) $(CXX) $(DEFS) $(DEBUG) $(LDFLAGS) -o $@ $(LIBBACCFG_LOBJS) -export-dynamic -rpath $(libdir) -release $(LIBBACCFG_LT_RELEASE) $(OPENSSL_LIBS) $(LIBS) @@ -122,21 +119,21 @@ Makefile: $(srcdir)/Makefile.in $(topdir)/config.status cd $(topdir) \ && CONFIG_FILES=$(thisdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status -lockmgr_test: Makefile +lockmgr_test: Makefile lockmgr.c $(RMF) lockmgr.o $(CXX) -D _TEST_IT $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) lockmgr.c $(LIBTOOL_LINK) $(CXX) $(LDFLAGS) -L. -o $@ lockmgr.o $(DLIB) -lbac -lm $(LIBS) $(OPENSSL_LIBS) rm -f lockmgr.o $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) lockmgr.c -base64_test: Makefile +base64_test: Makefile base64.c $(RMF) base64.o $(CXX) -DBIN_TEST $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) base64.c $(LIBTOOL_LINK) $(CXX) $(LDFLAGS) -L. -o $@ base64.o $(DLIB) -lbac -lm $(LIBS) $(OPENSSL_LIBS) rm -f base64.o $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) base64.c -rwlock_test: Makefile +rwlock_test: Makefile rwlock.c $(RMF) rwlock.o $(CXX) -DTEST_RWLOCK $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) rwlock.c $(LIBTOOL_LINK) $(CXX) $(LDFLAGS) -L. -o $@ rwlock.o $(DLIB) -lbac -lm $(LIBS) $(OPENSSL_LIBS) @@ -157,14 +154,22 @@ htable_test: Makefile $(RMF) htable.o $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) htable.c -crc32sum: Makefile crc32.o - $(RMF) crc32.o - $(CXX) -DCRC32_SUM $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) crc32.c - $(LIBTOOL_LINK) $(CXX) $(LDFLAGS) -L. -o $@ crc32.o $(DLIB) -lbac -lm $(LIBS) $(OPENSSL_LIBS) - $(RMF) crc32.o - $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) crc32.c +sellist_test: Makefile sellist.c + $(RMF) sellist.o + $(CXX) -DTEST_PROGRAM $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) sellist.c + $(LIBTOOL_LINK) $(CXX) $(LDFLAGS) -L. -o $@ sellist.o $(DLIB) -lbac -lm $(LIBS) $(OPENSSL_LIBS) + $(RMF) sellist.o + $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) sellist.c + + +xml_test: Makefile xml.o + $(RMF) xml.o + $(CXX) -DTEST_PROG $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) xml.c + $(LIBTOOL_LINK) $(CXX) $(LDFLAGS) -L. -o $@ xml.o $(DLIB) -lbac -lm $(LIBS) $(OPENSSL_LIBS) + $(RMF) xml.o + $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) xml.c -md5sum: Makefile md5.o +md5sum: Makefile md5.o $(RMF) md5.o $(CXX) -DMD5_SUM $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) md5.c $(LIBTOOL_LINK) $(CXX) $(LDFLAGS) -L. -o $@ md5.o $(DLIB) -lbac -lm $(LIBS) $(OPENSSL_LIBS) diff --git a/bacula/src/lib/address_conf.c b/bacula/src/lib/address_conf.c index 0d5fb07830..59dbd0f31c 100644 --- a/bacula/src/lib/address_conf.c +++ b/bacula/src/lib/address_conf.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2004-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Configuration file parser for IP-Addresse ipv4 and ipv6 @@ -65,7 +69,7 @@ IPADDR::IPADDR(int af) : type(R_EMPTY) saddr4->sin_port = 0xffff; } #ifdef HAVE_IPV6 - else if (af == AF_INET6) { + else { saddr6->sin6_port = 0xffff; } #endif @@ -96,11 +100,11 @@ unsigned short IPADDR::get_port_net_order() const port = saddr4->sin_port; } #ifdef HAVE_IPV6 - else if (saddr->sa_family == AF_INET6) { + else { port = saddr6->sin6_port; } #endif - return port; + return port; } void IPADDR::set_port_net(unsigned short port) @@ -109,7 +113,7 @@ void IPADDR::set_port_net(unsigned short port) saddr4->sin_port = port; } #ifdef HAVE_IPV6 - else if (saddr->sa_family == AF_INET6) { + else { saddr6->sin6_port = port; } #endif @@ -151,6 +155,14 @@ void IPADDR::copy_addr(IPADDR *src) #endif } +#ifdef NEED_IN6ADDR_ANY +/* The header shall declare the following external variable + * On Oses such as Solaris, it requires to define also XPG4_2 and EXTENSIONS + * and we have no real idea on what it will change. + */ +extern const struct in6_addr in6addr_any; +#endif + void IPADDR::set_addr_any() { if (saddr->sa_family == AF_INET) { @@ -201,11 +213,10 @@ const char *IPADDR::get_address(char *outputbuf, int outlen) const char *IPADDR::build_address_str(char *buf, int blen) { char tmp[1024]; - *buf = 0; if (get_family() == AF_INET) { bsnprintf(buf, blen, "%s:%hu ", get_address(tmp, sizeof(tmp) - 1), get_port_host_order()); - } else if (get_family() == AF_INET6) { + } else { bsnprintf(buf, blen, "[%s]:%hu ", get_address(tmp, sizeof(tmp) - 1), get_port_host_order()); } @@ -575,7 +586,7 @@ int sockaddr_get_port_net_order(const struct sockaddr *client_addr) return ((struct sockaddr_in *)client_addr)->sin_port; } #ifdef HAVE_IPV6 - else if (client_addr->sa_family == AF_INET6) { + else { return ((struct sockaddr_in6 *)client_addr)->sin6_port; } #endif @@ -588,7 +599,7 @@ int sockaddr_get_port(const struct sockaddr *client_addr) return ntohs(((struct sockaddr_in *)client_addr)->sin_port); } #ifdef HAVE_IPV6 - else if (client_addr->sa_family == AF_INET6) { + else { return ntohs(((struct sockaddr_in6 *)client_addr)->sin6_port); } #endif diff --git a/bacula/src/lib/address_conf.h b/bacula/src/lib/address_conf.h index 1035946cdd..e745b36bf2 100644 --- a/bacula/src/lib/address_conf.h +++ b/bacula/src/lib/address_conf.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2004-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * diff --git a/bacula/src/lib/alist.c b/bacula/src/lib/alist.c index c569a04497..38a197f76f 100644 --- a/bacula/src/lib/alist.c +++ b/bacula/src/lib/alist.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2003-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula array list routines diff --git a/bacula/src/lib/alist.h b/bacula/src/lib/alist.h index 0f89ed350e..09641497ab 100644 --- a/bacula/src/lib/alist.h +++ b/bacula/src/lib/alist.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2003-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Kern Sibbald, June MMIII diff --git a/bacula/src/lib/attr.c b/bacula/src/lib/attr.c index b6df46b8e2..595cebd57f 100644 --- a/bacula/src/lib/attr.c +++ b/bacula/src/lib/attr.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2003-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * attr.c Unpack an Attribute record returned from the tape @@ -87,7 +91,7 @@ int unpack_attributes_record(JCR *jcr, int32_t stream, char *rec, int32_t reclen while (*p++ != ' ') /* skip type */ { } - attr->fname = p; /* set filname position */ + attr->fname = p; /* set filename position */ while (*p++ != 0) /* skip filename */ { } attr->attr = p; /* set attributes position */ diff --git a/bacula/src/lib/attr.h b/bacula/src/lib/attr.h index 495c1784f1..d8d7a3171d 100644 --- a/bacula/src/lib/attr.h +++ b/bacula/src/lib/attr.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2003-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * attr.h Definition of attributes packet for unpacking from tape diff --git a/bacula/src/lib/base64.c b/bacula/src/lib/base64.c index ebba4c28cb..deb2caeba1 100644 --- a/bacula/src/lib/base64.c +++ b/bacula/src/lib/base64.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Generic base 64 input and output routines diff --git a/bacula/src/lib/base64.h b/bacula/src/lib/base64.h index a6fc1a5102..63134828c2 100644 --- a/bacula/src/lib/base64.h +++ b/bacula/src/lib/base64.h @@ -1,25 +1,27 @@ /* - * Generic base 64 input and output routines - * - * Written by Kern E. Sibbald, March MM. - * - * Version $Id$ - */ -/* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ +/* + * Generic base 64 input and output routines + * + * Written by Kern E. Sibbald, March MM. + */ /* Maximum size of len bytes after base64 encoding */ #define BASE64_SIZE(len) ((4 * len + 2) / 3 + 1) diff --git a/bacula/src/lib/berrno.c b/bacula/src/lib/berrno.c index 8f3968b68e..382683cd04 100644 --- a/bacula/src/lib/berrno.c +++ b/bacula/src/lib/berrno.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2004-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula errno handler @@ -21,7 +25,7 @@ * * See berrno.h for how to use berrno. * - * Written by Kern Sibbald, July MMIV + * Kern Sibbald, July MMIV * * */ @@ -38,7 +42,7 @@ const char *berrno::bstrerror() { *m_buf = 0; #ifdef HAVE_WIN32 - if (m_berrno & (b_errno_win32)) { + if (m_berrno & (b_errno_win32 | b_errno_WSA)) { format_win32_message(); return (const char *)m_buf; } @@ -84,7 +88,7 @@ void berrno::format_win32_message() FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, - GetLastError(), + m_berrno & b_errno_WSA ? WSAGetLastError() : GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&msg, 0, diff --git a/bacula/src/lib/berrno.h b/bacula/src/lib/berrno.h index f524c285b2..e6b099b2d2 100644 --- a/bacula/src/lib/berrno.h +++ b/bacula/src/lib/berrno.h @@ -1,21 +1,25 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2004-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * - * Written by Kern Sibbald, July MMIV + * Kern Sibbald, July MMIV * */ @@ -24,6 +28,7 @@ */ #ifdef HAVE_WIN32 #define b_errno_win32 (1<<29) /* user reserved bit */ +#define b_errno_WSA (1<<26) #else #define b_errno_win32 0 /* On Unix/Linix system */ #endif diff --git a/bacula/src/lib/bget_msg.c b/bacula/src/lib/bget_msg.c index 2a8a6a6cb9..ff9b0e4a8f 100644 --- a/bacula/src/lib/bget_msg.c +++ b/bacula/src/lib/bget_msg.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Subroutines to receive network data and handle @@ -21,7 +25,8 @@ * */ -#include "bacula.h" /* pull in global headers */ +#include "bacula.h" +#include "jcr.h" static char OK_msg[] = "2000 OK\n"; static char TERM_msg[] = "2999 Terminate\n"; @@ -38,6 +43,7 @@ static char TERM_msg[] = "2999 Terminate\n"; * Returns -1 on signal (BNET_SIGNAL) * Returns -2 on hard end of file (BNET_HARDEOF) * Returns -3 on error (BNET_ERROR) + * Returns -4 on Command (BNET_COMMAND) */ int bget_msg(BSOCK *sock) { @@ -91,3 +97,69 @@ int bget_msg(BSOCK *sock) } } } + +bmessage::bmessage(int bufsize) +{ + msg = get_pool_memory(PM_BSOCK); + msg = realloc_pool_memory(msg, bufsize); + status = bmessage::bm_busy; + jobbytes = 0; +} + +bmessage::~bmessage() +{ + free_pool_memory(msg); +} + +void bmessage::swap(BSOCK *sock) +{ + POOLMEM *swap = sock->msg; + sock->msg = msg; + msg = swap; +} + +GetMsg::GetMsg(JCR *a_jcr, BSOCK *a_bsock, const char *a_rec_header, int32_t a_bufsize): + jcr(a_jcr), + bsock(a_bsock), + rec_header(a_rec_header), + bufsize(a_bufsize), + m_is_stop(false), + m_is_done(false), + m_is_error(false), + m_use_count(1) +{ + jcr->inc_use_count(); /* We own a copy of the JCR */ + bmsg_aux = New(bmessage(bufsize)); + bmsg = bmsg_aux; + pthread_mutex_init(&mutex, 0); + pthread_cond_init(&cond, NULL); +}; + +GetMsg::~GetMsg() +{ + free_jcr(jcr); /* Release our copy of the JCR */ + delete bmsg_aux; + pthread_mutex_destroy(&mutex); + pthread_cond_destroy(&cond); +}; + +int GetMsg::bget_msg(bmessage **pbmsg) +{ + // Get our own local copy of the socket + + if (pbmsg == NULL) { + pbmsg = &bmsg_aux; + } + bmessage *bmsg = *pbmsg; + bmsg->ret = ::bget_msg(bsock); + bmsg->status = bmessage::bm_ready; + bmsg->rbuflen = bmsg->msglen = bmsg->origlen = bsock->msglen; +/* bmsg->is_header = !bmsg->is_header; ALAIN SAYS: I think this line is useless */ + /* swap msg instead of copying */ + bmsg->swap(bsock); + bmsg->rbuf = bmsg->msg; + + msglen = bmsg->msglen; + msg = bmsg->msg; + return bmsg->ret; +} diff --git a/bacula/src/lib/bget_msg.h b/bacula/src/lib/bget_msg.h new file mode 100644 index 0000000000..fa8f0111d3 --- /dev/null +++ b/bacula/src/lib/bget_msg.h @@ -0,0 +1,111 @@ +/* + Bacula(R) - The Network Backup Solution + + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2013-2014 Free Software Foundation Europe e.V. + + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. + + You may use this file and others of this release according to the + license defined in the LICENSE file, which includes the Affero General + Public License, v3.0 ("AGPLv3") and some additional permissions and + terms pursuant to its AGPLv3 Section 7. + + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + +#ifndef __BGET_MSG_H_ +#define __BGET_MSG_H_ + +#include "bacula.h" + +typedef uint64_t blockaddr; +typedef int64_t blockidx; + +#ifdef COMMUNITY +#define BLOCK_HEAD_SIZE 4 // only one int +#define GETMSG_MAX_BLOCK_SIZE (65*1024-BLOCK_HEAD_SIZE) +#define GETMSG_MAX_HASH_SIZE 64 /* SHA512 */ +#define GETMSG_MAX_MSG_SIZE (GETMSG_MAX_BLOCK_SIZE+GETMSG_MAX_HASH_SIZE+sizeof(uint32_t)+OFFSET_FADDR_SIZE+100) +#endif + + +class bmessage: public SMARTALLOC +{ +public: + enum { bm_none, bm_ready, bm_busy, bm_ref }; + + POOLMEM *msg; // exchanged with BSOCK + int32_t msglen; // length from BSOCK + int32_t origlen; // length before rehydration, to be compared with length in header + char *rbuf; // adjusted to point to data inside *msg + int32_t rbuflen; // adjusted from msglen + int status; + int ret; // return value from bget_msg() + int jobbytes; // must be added to jcr->JobBytes if block is downloaded + + bmessage(int bufsize); + virtual ~bmessage(); + void swap(BSOCK *sock); +}; + +class GetMsg: public SMARTALLOC +{ +public: + JCR *jcr; + BSOCK *bsock; + const char *rec_header; /* Format of a header */ + int32_t bufsize; /* "ideal" bufsize from JCR */ + + bool m_is_stop; /* set by the read thread when bsock->is_stop() */ + bool m_is_done; /* set when the read thread finish (no more record will be pushed) */ + bool m_is_error; /* set when the read thread get an error */ + + int32_t m_use_count; + + pthread_mutex_t mutex; + pthread_cond_t cond; + bmessage *bmsg_aux; + bmessage *bmsg; // local bmsg used by bget_msg(NULL) + int32_t msglen; // used to mimic BSOCK, updated by bget_msg() + POOLMEM *msg; // used to mimic BSOCK, updated by bget_msg() + + void inc_use_count(void) {P(mutex); m_use_count++; V(mutex); }; + void dec_use_count(void) {P(mutex); m_use_count--; V(mutex); }; + int32_t use_count() { int32_t v; P(mutex); v = m_use_count; V(mutex); return v;}; + + + GetMsg(JCR *a_jcr, BSOCK *a_bsock, const char *a_rec_header, int32_t a_bufsize); + virtual ~GetMsg(); + + virtual int bget_msg(bmessage **pbmsg=NULL); + inline virtual void *do_read_sock_thread(void) { return NULL; }; + inline virtual int start_read_sock() { return 0; }; + inline virtual void *wait_read_sock() { return NULL;}; + + virtual bool is_stop() { return (m_is_stop!=false); }; + virtual bool is_done() { return (m_is_done!=false); }; + virtual bool is_error(){ return (m_is_error!=false); }; + + bmessage *new_msg() { return New(bmessage(bufsize)); }; + +}; + +/* Call this function to release the memory associated with the message queue + * The reading thread is using the BufferedMsgBase to work, so we need to free + * the memory only when the main thread and the reading thread agree + */ +inline void free_GetMsg(GetMsg *b) +{ + b->dec_use_count(); + ASSERT2(b->use_count() >= 0, "GetMsg use_count too low"); + if (b->use_count() == 0) { + delete b; + } +} + +#endif diff --git a/bacula/src/lib/binflate.c b/bacula/src/lib/binflate.c index 3e4cb2e91e..9cd73f2f74 100644 --- a/bacula/src/lib/binflate.c +++ b/bacula/src/lib/binflate.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 2000-2014 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2010-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula zlib compression wrappers diff --git a/bacula/src/lib/bits.h b/bacula/src/lib/bits.h index d961203b38..497470003f 100644 --- a/bacula/src/lib/bits.h +++ b/bacula/src/lib/bits.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* Some elementary bit manipulations * diff --git a/bacula/src/lib/bnet.c b/bacula/src/lib/bnet.c index f61929f4ea..52c8e05e73 100644 --- a/bacula/src/lib/bnet.c +++ b/bacula/src/lib/bnet.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Network Utility Routines @@ -33,6 +37,8 @@ #endif #ifdef HAVE_WIN32 +#undef inet_pton +#define inet_pton binet_pton #define socketRead(fd, buf, len) recv(fd, buf, len, 0) #define socketWrite(fd, buf, len) send(fd, buf, len, 0) #define socketClose(fd) closesocket(fd) @@ -73,7 +79,7 @@ int32_t read_nbytes(BSOCK * bsock, char *ptr, int32_t nbytes) #ifdef HAVE_WIN32 /* - * For Windows, we must simulate Unix errno on a socket + * We simulate errno on Windows for a socket * error in order to handle errors correctly. */ if (nread == SOCKET_ERROR) { @@ -151,7 +157,7 @@ int32_t write_nbytes(BSOCK * bsock, char *ptr, int32_t nbytes) #ifdef HAVE_WIN32 /* - * For Windows, we must simulate Unix errno on a socket + * We simulate errno on Windows for a socket * error in order to handle errors correctly. */ if (nwritten == SOCKET_ERROR) { @@ -322,65 +328,61 @@ bool bnet_tls_client(TLS_CONTEXT *ctx, BSOCK * bsock, alist *verify_list) #define NO_DATA 4 /* Valid name, no data record of requested type. */ #endif -#if HAVE_GETADDRINFO -const char *resolv_host(int family, const char *host, dlist *addr_list) -{ - int res; - struct addrinfo hints; - struct addrinfo *ai, *rp; - IPADDR *addr; - - memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_family = family; - hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = IPPROTO_TCP; - hints.ai_flags = 0; - - res = getaddrinfo(host, NULL, &hints, &ai); - if (res != 0) { - return gai_strerror(res); - } - - for (rp = ai; rp != NULL; rp = rp->ai_next) { - switch (rp->ai_addr->sa_family) { - case AF_INET: - addr = New(IPADDR(rp->ai_addr->sa_family)); - addr->set_type(IPADDR::R_MULTIPLE); - /* - * Some serious casting to get the struct in_addr * - * rp->ai_addr == struct sockaddr - * as this is AF_INET family we can cast that - * to struct_sockaddr_in. Of that we need the - * address of the sin_addr member which contains a - * struct in_addr - */ - addr->set_addr4(&(((struct sockaddr_in *)rp->ai_addr)->sin_addr)); - break; -#ifdef HAVE_IPV6 - case AF_INET6: - addr = New(IPADDR(rp->ai_addr->sa_family)); - addr->set_type(IPADDR::R_MULTIPLE); - /* - * Some serious casting to get the struct in6_addr * - * rp->ai_addr == struct sockaddr - * as this is AF_INET6 family we can cast that - * to struct_sockaddr_in6. Of that we need the - * address of the sin6_addr member which contains a - * struct in6_addr - */ - addr->set_addr6(&(((struct sockaddr_in6 *)rp->ai_addr)->sin6_addr)); - break; -#endif - default: - continue; - } - addr_list->append(addr); - } - freeaddrinfo(ai); - return NULL; -} - -#else +#if defined(HAVE_GETADDRINFO) +/* + * getaddrinfo.c - Simple example of using getaddrinfo(3) function. + * + * Michal Ludvig (c) 2002, 2003 + * http://www.logix.cz/michal/devel/ + * + * License: public domain. + */ +const char *resolv_host(int family, const char *host, dlist *addr_list) +{ + IPADDR *ipaddr; + struct addrinfo hints, *res, *rp; + int errcode; + //char addrstr[100]; + void *ptr; + + memset (&hints, 0, sizeof(hints)); + hints.ai_family = family; + hints.ai_socktype = SOCK_STREAM; + //hints.ai_flags |= AI_CANONNAME; + + errcode = getaddrinfo (host, NULL, &hints, &res); + if (errcode != 0) return gai_strerror(errcode); + + for (rp=res; res; res=res->ai_next) { + //inet_ntop (res->ai_family, res->ai_addr->sa_data, addrstr, 100); + switch (res->ai_family) { + case AF_INET: + ipaddr = New(IPADDR(rp->ai_addr->sa_family)); + ipaddr->set_type(IPADDR::R_MULTIPLE); + ptr = &((struct sockaddr_in *) res->ai_addr)->sin_addr; + ipaddr->set_addr4((in_addr *)ptr); + break; +#if defined(HAVE_IPV6) + case AF_INET6: + ipaddr = New(IPADDR(rp->ai_addr->sa_family)); + ipaddr->set_type(IPADDR::R_MULTIPLE); + ptr = &((struct sockaddr_in6 *) res->ai_addr)->sin6_addr; + ipaddr->set_addr6((in6_addr *)ptr); + break; +#endif + default: + continue; + } + //inet_ntop (res->ai_family, ptr, addrstr, 100); + //Pmsg3(000, "IPv%d address: %s (%s)\n", res->ai_family == PF_INET6 ? 6 : 4, + // addrstr, res->ai_canonname); + addr_list->append(ipaddr); + } + freeaddrinfo(rp); + return NULL; +} + +#else /* * Get human readable error for gethostbyname() @@ -439,15 +441,14 @@ static const char *resolv_host(int family, const char *host, dlist * addr_list) IPADDR *addr = New(IPADDR(hp->h_addrtype)); addr->set_type(IPADDR::R_MULTIPLE); if (addr->get_family() == AF_INET) { - addr->set_addr4((struct in_addr*)*p); - addr_list->append(addr); + addr->set_addr4((struct in_addr*)*p); } #ifdef HAVE_IPV6 - else if (addr->get_family() == AF_INET6) { - addr->set_addr6((struct in6_addr*)*p); - addr_list->append(addr); + else { + addr->set_addr6((struct in6_addr*)*p); } #endif + addr_list->append(addr); } V(ip_mutex); } @@ -464,7 +465,7 @@ static IPADDR *add_any(int family) } /* - * i host = 0 mean INADDR_ANY only ipv4 + * i host = 0 means INADDR_ANY only for IPv4 */ dlist *bnet_host2ipaddrs(const char *host, int family, const char **errstr) { @@ -491,13 +492,13 @@ dlist *bnet_host2ipaddrs(const char *host, int family, const char **errstr) addr->set_addr4(&inaddr); addr_list->append(addr); #ifdef HAVE_IPV6 - } else if (inet_pton(AF_INET6, host, &inaddr6) == 1) { + } else if (inet_pton(AF_INET6, host, &inaddr6) == 1) { addr = New(IPADDR(AF_INET6)); addr->set_type(IPADDR::R_MULTIPLE); addr->set_addr6(&inaddr6); addr_list->append(addr); #endif - } else { + } else { if (family != 0) { errmsg = resolv_host(family, host, addr_list); if (errmsg) { @@ -529,10 +530,10 @@ dlist *bnet_host2ipaddrs(const char *host, int family, const char **errstr) * Convert a network "signal" code into * human readable ASCII. */ -const char *bnet_sig_to_ascii(BSOCK * bs) +const char *bnet_sig_to_ascii(int32_t msglen) { static char buf[30]; - switch (bs->msglen) { + switch (msglen) { case BNET_EOD: return "BNET_EOD"; /* end of data stream */ case BNET_EOD_POLL: @@ -552,7 +553,7 @@ const char *bnet_sig_to_ascii(BSOCK * bs) case BNET_TEXT_INPUT: return "BNET_TEXT_INPUT"; default: - sprintf(buf, _("Unknown sig %d"), (int)bs->msglen); + bsnprintf(buf, sizeof(buf), _("Unknown sig %d"), (int)msglen); return buf; } } @@ -570,6 +571,7 @@ BSOCK *init_bsock(JCR * jcr, int sockfd, const char *who, const char *host, int bsock->tls = NULL; bsock->errors = 0; bsock->m_blocking = 1; + bsock->pout_msg_no = &bsock->out_msg_no; bsock->msg = get_pool_memory(PM_BSOCK); bsock->errmsg = get_pool_memory(PM_MESSAGE); bsock->set_who(bstrdup(who)); @@ -585,6 +587,7 @@ BSOCK *init_bsock(JCR * jcr, int sockfd, const char *who, const char *host, int BSOCK *dup_bsock(BSOCK *osock) { BSOCK *bsock = (BSOCK *)malloc(sizeof(BSOCK)); + osock->set_locking(); memcpy(bsock, osock, sizeof(BSOCK)); bsock->msg = get_pool_memory(PM_BSOCK); bsock->errmsg = get_pool_memory(PM_MESSAGE); diff --git a/bacula/src/lib/bnet_server.c b/bacula/src/lib/bnet_server.c index f00e8daabd..354320dd5d 100644 --- a/bacula/src/lib/bnet_server.c +++ b/bacula/src/lib/bnet_server.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Originally written by Kern Sibbald for inclusion in apcupsd, @@ -51,17 +55,15 @@ void bnet_stop_thread_server(pthread_t tid) } } -/* - * Become Threaded Network Server - * - * This function is able to handle multiple server ips in - * ipv4 and ipv6 style. The Addresses are given in a comma - * seperated string in bind_addr - * - * At the moment it is inpossible to bind different ports. - */ -void bnet_thread_server(dlist *addr_list, int max_clients, workq_t *client_wq, - void *handle_client_request(void *bsock)) + /* + Become Threaded Network Server + This function is able to handle multiple server ips in + ipv4 and ipv6 style. The Addresse are give in a comma + seperated string in bind_addr + In the moment it is inpossible to bind different ports. + */ +void bnet_thread_server(dlist *addrs, int max_clients, + workq_t *client_wq, void *handle_client_request(void *bsock)) { int newsockfd, stat; socklen_t clilen; @@ -71,7 +73,7 @@ void bnet_thread_server(dlist *addr_list, int max_clients, workq_t *client_wq, #ifdef HAVE_LIBWRAP struct request_info request; #endif - IPADDR *ipaddr; + IPADDR *addr; struct s_sockfd { dlink link; /* this MUST be the first item */ int fd; @@ -81,29 +83,26 @@ void bnet_thread_server(dlist *addr_list, int max_clients, workq_t *client_wq, dlist sockfds; char allbuf[256 * 10]; - - remove_duplicate_addresses(addr_list); - - Dmsg1(20, "Addresses %s\n", build_addresses_str(addr_list, allbuf, sizeof(allbuf))); - + remove_duplicate_addresses(addrs); + Dmsg1(20, "Addresses %s\n", build_addresses_str(addrs, allbuf, sizeof(allbuf))); /* * Listen on each address provided. */ - foreach_dlist(ipaddr, addr_list) { + foreach_dlist(addr, addrs) { /* Allocate on stack from -- no need to free */ fd_ptr = (s_sockfd *)alloca(sizeof(s_sockfd)); - fd_ptr->port = ipaddr->get_port_net_order(); + fd_ptr->port = addr->get_port_net_order(); /* * Open a TCP socket */ - for (tlog= 60; (fd_ptr->fd=socket(ipaddr->get_family(), SOCK_STREAM, 0)) < 0; tlog -= 10) { + for (tlog= 60; (fd_ptr->fd=socket(addr->get_family(), SOCK_STREAM, 0)) < 0; tlog -= 10) { if (tlog <= 0) { berrno be; char curbuf[256]; Emsg3(M_ABORT, 0, _("Cannot open stream socket. ERR=%s. Current %s All %s\n"), be.bstrerror(), - ipaddr->build_address_str(curbuf, sizeof(curbuf)), - build_addresses_str(addr_list, allbuf, sizeof(allbuf))); + addr->build_address_str(curbuf, sizeof(curbuf)), + build_addresses_str(addrs, allbuf, sizeof(allbuf))); } bmicrosleep(10, 0); } @@ -118,7 +117,7 @@ void bnet_thread_server(dlist *addr_list, int max_clients, workq_t *client_wq, } int tmax = 1 * (60 / 5); /* wait 1 minute max */ - for (tlog = 0; bind(fd_ptr->fd, ipaddr->get_sockaddr(), ipaddr->get_sockaddr_len()) == SOCKET_ERROR; tlog -= 5) { + for (tlog = 0; bind(fd_ptr->fd, addr->get_sockaddr(), addr->get_sockaddr_len()) == SOCKET_ERROR; tlog -= 5) { berrno be; if (tlog <= 0) { tlog = 1 * 60; /* Complain every 1 minute */ diff --git a/bacula/src/lib/bpipe.c b/bacula/src/lib/bpipe.c index 44c516439e..81d673fd69 100644 --- a/bacula/src/lib/bpipe.c +++ b/bacula/src/lib/bpipe.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * bpipe.c bi-directional pipe @@ -60,7 +64,7 @@ void build_sh_argc_argv(char *cmd, int *bargc, char *bargv[], int max_arg) * a bi-directional pipe so that the user can read from and * write to the program. */ -BPIPE *open_bpipe(char *prog, int wait, const char *mode) +BPIPE *open_bpipe(char *prog, int wait, const char *mode, char *envp[]) { char *bargv[MAX_ARGV]; int bargc, i; @@ -143,6 +147,13 @@ BPIPE *open_bpipe(char *prog, int wait, const char *mode) for (i=3; i<=32; i++) { /* close any open file descriptors */ close(i); } + + /* Setup the environment if requested, we do not use execvpe() + * because it's not wildly available + * TODO: Implement envp to windows version of bpipe + */ + setup_env(envp); + execvp(bargv[0], bargv); /* call the program */ /* Convert errno into an exit code for later analysis */ for (i=0; i< num_execvp_errors; i++) { @@ -388,7 +399,7 @@ int run_program(char *prog, int wait, POOLMEM *&results) * non-zero on error == berrno status * */ -int run_program_full_output(char *prog, int wait, POOLMEM *&results) +int run_program_full_output(char *prog, int wait, POOLMEM *&results, char *env[]) { BPIPE *bpipe; int stat1, stat2; @@ -405,7 +416,7 @@ int run_program_full_output(char *prog, int wait, POOLMEM *&results) results[0] = 0; mode = (char *)"r"; - bpipe = open_bpipe(prog, wait, mode); + bpipe = open_bpipe(prog, wait, mode, env); if (!bpipe) { stat1 = ENOENT; goto bail_out; diff --git a/bacula/src/lib/bpipe.h b/bacula/src/lib/bpipe.h index d49f3a97ac..038be35179 100644 --- a/bacula/src/lib/bpipe.h +++ b/bacula/src/lib/bpipe.h @@ -1,22 +1,24 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bi-directional pipe structure - * - * Version $Id$ */ class BPIPE { diff --git a/bacula/src/lib/breg.c b/bacula/src/lib/breg.c index 893e8bae3d..6358796200 100644 --- a/bacula/src/lib/breg.c +++ b/bacula/src/lib/breg.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 2006-2014 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Manipulation routines for BREGEXP list @@ -243,19 +247,19 @@ char *BREGEXP::return_fname(const char *fname, int len) return result; } -int BREGEXP::compute_dest_len(const char *fname, regmatch_t pmatch[]) +int BREGEXP::compute_dest_len(const char *fname, regmatch_t breg[]) { int len=0; char *p; char *psubst = subst; int no; - if (!fname || !pmatch) { + if (!fname || !breg) { return 0; } /* match failed ? */ - if (pmatch[0].rm_so < 0) { + if (breg[0].rm_so < 0) { return 0; } @@ -267,8 +271,8 @@ int BREGEXP::compute_dest_len(const char *fname, regmatch_t pmatch[]) /* we check if the back reference exists */ /* references can not match if we are using (..)? */ - if (pmatch[no].rm_so >= 0 && pmatch[no].rm_eo >= 0) { - len += pmatch[no].rm_eo - pmatch[no].rm_so; + if (breg[no].rm_so >= 0 && breg[no].rm_eo >= 0) { + len += breg[no].rm_eo - breg[no].rm_so; } } else { @@ -277,13 +281,13 @@ int BREGEXP::compute_dest_len(const char *fname, regmatch_t pmatch[]) } /* $0 is replaced by subst */ - len -= pmatch[0].rm_eo - pmatch[0].rm_so; + len -= breg[0].rm_eo - breg[0].rm_so; len += strlen(fname) + 1; return len; } -char *BREGEXP::edit_subst(const char *fname, regmatch_t pmatch[]) +char *BREGEXP::edit_subst(const char *fname, regmatch_t breg[]) { int i; char *p; @@ -292,10 +296,10 @@ char *BREGEXP::edit_subst(const char *fname, regmatch_t pmatch[]) int len; /* il faut recopier fname dans dest - * on recopie le debut fname -> pmatch->start[0] + * on recopie le debut fname -> breg->start[0] */ - for (i = 0; i < pmatch[0].rm_so ; i++) { + for (i = 0; i < breg[0].rm_so ; i++) { result[i] = fname[i]; } @@ -307,9 +311,9 @@ char *BREGEXP::edit_subst(const char *fname, regmatch_t pmatch[]) no = *psubst++ - '0'; /* have a back reference ? */ - if (pmatch[no].rm_so >= 0 && pmatch[no].rm_eo >= 0) { - len = pmatch[no].rm_eo - pmatch[no].rm_so; - bstrncpy(result + i, fname + pmatch[no].rm_so, len + 1); + if (breg[no].rm_so >= 0 && breg[no].rm_eo >= 0) { + len = breg[no].rm_eo - breg[no].rm_so; + bstrncpy(result + i, fname + breg[no].rm_so, len + 1); i += len ; } @@ -319,7 +323,7 @@ char *BREGEXP::edit_subst(const char *fname, regmatch_t pmatch[]) } /* we copy what is out of the match */ - strcpy(result + i, fname + pmatch[0].rm_eo); + strcpy(result + i, fname + breg[0].rm_eo); return result; } diff --git a/bacula/src/lib/breg.h b/bacula/src/lib/breg.h index cfb19d9ebc..e364860d3b 100644 --- a/bacula/src/lib/breg.h +++ b/bacula/src/lib/breg.h @@ -1,23 +1,26 @@ /* - * Bacula BREGEXP Structure definition for FileDaemon - * Eric Bollengier March 2007 - * Version $Id$ - */ -/* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2006-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ +/* + * Bacula BREGEXP Structure definition for FileDaemon + * Eric Bollengier March 2007 + */ #ifndef __BREG_H_ @@ -63,8 +66,8 @@ public: char *eor; /* end of regexp in expr */ char *return_fname(const char *fname, int len); /* return fname as result */ - char *edit_subst(const char *fname, regmatch_t pmatch[]); - int compute_dest_len(const char *fname, regmatch_t pmatch[]); + char *edit_subst(const char *fname, regmatch_t breg[]); + int compute_dest_len(const char *fname, regmatch_t breg[]); bool extract_regexp(const char *motif); }; diff --git a/bacula/src/lib/bregex.c b/bacula/src/lib/bregex.c index b6ef5d6f36..5ac6e6dfe5 100644 --- a/bacula/src/lib/bregex.c +++ b/bacula/src/lib/bregex.c @@ -33,19 +33,23 @@ * Eric Bollengier April 2007 */ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2006-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ @@ -1488,7 +1492,7 @@ int regexec(regex_t * preg, const char *string, size_t nmatch, int len = strlen(string); struct re_registers regs; stat = re_search(preg, (unsigned char *)string, len, 0, len, ®s); - if (stat >= 0) { + if (stat >= 0 && nmatch > 0) { re_registers_to_regmatch(®s, pmatch, nmatch); } /* stat is the start position in the string base 0 where diff --git a/bacula/src/lib/bregex.h b/bacula/src/lib/bregex.h index d115ef89e5..1a40e19800 100644 --- a/bacula/src/lib/bregex.h +++ b/bacula/src/lib/bregex.h @@ -25,19 +25,23 @@ extern "C" { * Kern Sibbald April, 2006 */ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2006-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ #ifndef REGEXPR_H diff --git a/bacula/src/lib/bsnprintf.c b/bacula/src/lib/bsnprintf.c index a1f21a6613..f669f52751 100644 --- a/bacula/src/lib/bsnprintf.c +++ b/bacula/src/lib/bsnprintf.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2005-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Copyright Patrick Powell 1995 diff --git a/bacula/src/lib/bsock.c b/bacula/src/lib/bsock.c index d947ba0748..6daef479b4 100644 --- a/bacula/src/lib/bsock.c +++ b/bacula/src/lib/bsock.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Network Utility Routines @@ -25,26 +29,17 @@ #include #include -#ifndef ENODATA /* not defined on BSD systems */ -#define ENODATA EPIPE -#endif - -#ifndef SOL_TCP -#define SOL_TCP IPPROTO_TCP -#endif - -#ifdef HAVE_WIN32 -#include -#define socketRead(fd, buf, len) ::recv(fd, buf, len, 0) -#define socketWrite(fd, buf, len) ::send(fd, buf, len, 0) -#define socketClose(fd) ::closesocket(fd) -static void win_close_wait(int fd); -#else +#if !defined(ENODATA) /* not defined on BSD systems */ +#define ENODATA EPIPE +#endif + +#if !defined(SOL_TCP) /* Not defined on some systems */ +#define SOL_TCP IPPROTO_TCP +#endif + #define socketRead(fd, buf, len) ::read(fd, buf, len) #define socketWrite(fd, buf, len) ::write(fd, buf, len) #define socketClose(fd) ::close(fd) -#endif - /* * This is a non-class BSOCK "constructor" because we want to @@ -63,6 +58,7 @@ void BSOCK::init() set_closed(); set_terminated(); m_blocking = 1; + pout_msg_no = &out_msg_no; msg = get_pool_memory(PM_BSOCK); errmsg = get_pool_memory(PM_MESSAGE); timeout = BSOCK_TIMEOUT; @@ -223,7 +219,7 @@ bool BSOCK::open(JCR *jcr, const char *name, char *host, char *service, *fatal = 1; Qmsg3(jcr, M_ERROR, 0, _("Socket open error. proto=%d port=%d. ERR=%s\n"), ipaddr->get_family(), ipaddr->get_port_host_order(), be.bstrerror()); - Pmsg3(000, _("Socket open error. proto=%d port=%d. ERR=%s\n"), + Pmsg3(300, _("Socket open error. proto=%d port=%d. ERR=%s\n"), ipaddr->get_family(), ipaddr->get_port_host_order(), be.bstrerror()); break; } @@ -321,9 +317,17 @@ bool BSOCK::set_locking() if (m_use_locking) { return true; /* already set */ } - if ((stat = pthread_mutex_init(&m_mutex, NULL)) != 0) { + pm_rmutex = &m_rmutex; + pm_wmutex = &m_wmutex; + if ((stat = pthread_mutex_init(pm_rmutex, NULL)) != 0) { berrno be; - Qmsg(m_jcr, M_FATAL, 0, _("Could not init bsock mutex. ERR=%s\n"), + Qmsg(m_jcr, M_FATAL, 0, _("Could not init bsock read mutex. ERR=%s\n"), + be.bstrerror(stat)); + return false; + } + if ((stat = pthread_mutex_init(pm_wmutex, NULL)) != 0) { + berrno be; + Qmsg(m_jcr, M_FATAL, 0, _("Could not init bsock write mutex. ERR=%s\n"), be.bstrerror(stat)); return false; } @@ -333,30 +337,32 @@ bool BSOCK::set_locking() void BSOCK::clear_locking() { - if (!m_use_locking) { + if (!m_use_locking || m_duped) { return; } m_use_locking = false; - pthread_mutex_destroy(&m_mutex); + pthread_mutex_destroy(pm_rmutex); + pthread_mutex_destroy(pm_wmutex); + pm_rmutex = NULL; + pm_wmutex = NULL; return; } /* - * Send a message over the network. The send consists of - * two network packets. The first is sends a 32 bit integer containing - * the length of the data packet which follows. * * Returns: false on failure * true on success */ -bool BSOCK::send() +bool BSOCK::send(int aflags) { int32_t rc; int32_t pktsiz; - int32_t *hdr; + int32_t *hdrptr; + int hdrsiz; bool ok = true; int32_t save_msglen; POOLMEM *save_msg; + bool locked = false; if (is_closed()) { if (!m_suppress_error_msgs) { @@ -378,6 +384,7 @@ bool BSOCK::send() } return false; } + if (msglen > 4000000) { if (!m_suppress_error_msgs) { Qmsg4(m_jcr, M_ERROR, 0, @@ -387,30 +394,45 @@ bool BSOCK::send() return false; } - if (m_use_locking) P(m_mutex); + if (m_use_locking) { + pP(pm_wmutex); + locked = true; + } save_msglen = msglen; save_msg = msg; + m_flags = aflags; + /* Compute total packet length */ if (msglen <= 0) { - pktsiz = sizeof(pktsiz); /* signal, no data */ + hdrsiz = sizeof(pktsiz); + pktsiz = hdrsiz; /* signal, no data */ + } else if (m_flags) { + hdrsiz = 2 * sizeof(pktsiz); /* have 64 bit header */ + pktsiz = msglen + hdrsiz; } else { - pktsiz = msglen + sizeof(pktsiz); /* data */ + hdrsiz = sizeof(pktsiz); /* have 32 bit header */ + pktsiz = msglen + hdrsiz; } + /* * Store packet length at head of message -- note, we * have reserved an int32_t just before msg, so we can * store there */ - hdr = (int32_t *)(msg - (int)sizeof(pktsiz)); - *hdr = htonl(msglen); /* store signal/length */ + hdrptr = (int32_t *)(msg - hdrsiz); + *hdrptr = htonl(msglen); /* store signal/length */ + if (m_flags) { + *(hdrptr+1) = htonl(m_flags); /* store flags */ + } - out_msg_no++; /* increment message number */ + (*pout_msg_no)++; /* increment message number */ /* send data packet */ timer_start = watchdog_time; /* start timer */ clear_timed_out(); /* Full I/O done in one write */ - rc = write_nbytes(this, (char *)hdr, pktsiz); + rc = write_nbytes(this, (char *)hdrptr, pktsiz); +// if (chk_dbglvl(DT_NETWORK|1900)) dump_bsock_msg(m_fd, *pout_msg_no, "SEND", rc, msglen, m_flags, save_msg, save_msglen); timer_start = 0; /* clear timer */ if (rc != pktsiz) { errors++; @@ -435,7 +457,7 @@ bool BSOCK::send() } msglen = save_msglen; msg = save_msg; - if (m_use_locking) V(m_mutex); + if (locked) pV(pm_wmutex); return ok; } @@ -478,7 +500,7 @@ bool BSOCK::fsend(const char *fmt, ...) * Returns -1 on signal (BNET_SIGNAL) * Returns -2 on hard end of file (BNET_HARDEOF) * Returns -3 on error (BNET_ERROR) - * + * Returns -4 on COMMAND (BNET_COMMAND) * Unfortunately, it is a bit complicated because we have these * four return types: * 1. Normal data @@ -495,14 +517,15 @@ int32_t BSOCK::recv() msg[0] = 0; msglen = 0; + m_flags = 0; if (errors || is_terminated() || is_closed()) { return BNET_HARDEOF; } - if (m_use_locking) { - P(m_mutex); + pP(pm_rmutex); locked = true; } + read_seqno++; /* bump sequence number */ timer_start = watchdog_time; /* set start wait time */ clear_timed_out(); @@ -602,7 +625,9 @@ int32_t BSOCK::recv() Dsm_check(300); get_out: - if (locked) V(m_mutex); +// if ((chk_dbglvl(DT_NETWORK|1900))) dump_bsock_msg(m_fd, read_seqno, "RECV", nbytes, o_pktsiz, m_flags, msg, msglen); + + if (locked) pV(pm_rmutex); return nbytes; /* return actual length of message */ } @@ -647,8 +672,8 @@ bool BSOCK::despool(void update_attr_spool_size(ssize_t size), ssize_t tsize) if (nbytes != (size_t)msglen) { berrno be; Dmsg2(400, "nbytes=%d msglen=%d\n", nbytes, msglen); - Qmsg3(get_jcr(), M_FATAL, 0, _("fread attr spool error. Wanted=%d got=%d bytes. ERR=%s\n"), - msglen, nbytes, be.bstrerror()); + Qmsg2(get_jcr(), M_FATAL, 0, _("fread attr spool error. Wanted=%d got=%d bytes.\n"), + msglen, nbytes); update_attr_spool_size(tsize - last); return false; } @@ -681,13 +706,16 @@ const char *BSOCK::bstrerror() if (errmsg == NULL) { errmsg = get_pool_memory(PM_MESSAGE); } - pm_strcpy(errmsg, be.bstrerror(b_errno)); + if (b_errno == 0) { + pm_strcpy(errmsg, "I/O Error"); + } else { + pm_strcpy(errmsg, be.bstrerror(b_errno)); + } return errmsg; } int BSOCK::get_peer(char *buf, socklen_t buflen) { -#if !defined(HAVE_WIN32) if (peer_addr.sin_family == 0) { socklen_t salen = sizeof(peer_addr); int rval = (getpeername)(m_fd, (struct sockaddr *)&peer_addr, &salen); @@ -697,9 +725,6 @@ int BSOCK::get_peer(char *buf, socklen_t buflen) return -1; return 0; -#else - return -1; -#endif } /* @@ -783,7 +808,6 @@ bool BSOCK::set_buffer_size(uint32_t size, int rw) */ int BSOCK::set_nonblocking() { -#ifndef HAVE_WIN32 int oflags; /* Get current flags */ @@ -800,16 +824,6 @@ int BSOCK::set_nonblocking() m_blocking = 0; return oflags; -#else - int flags; - u_long ioctlArg = 1; - - flags = m_blocking; - ioctlsocket(m_fd, FIONBIO, &ioctlArg); - m_blocking = 0; - - return flags; -#endif } /* @@ -818,7 +832,6 @@ int BSOCK::set_nonblocking() */ int BSOCK::set_blocking() { -#ifndef HAVE_WIN32 int oflags; /* Get current flags */ if ((oflags = fcntl(m_fd, F_GETFL, 0)) < 0) { @@ -834,16 +847,6 @@ int BSOCK::set_blocking() m_blocking = 1; return oflags; -#else - int flags; - u_long ioctlArg = 0; - - flags = m_blocking; - ioctlsocket(m_fd, FIONBIO, &ioctlArg); - m_blocking = 1; - - return flags; -#endif } void BSOCK::set_killable(bool killable) @@ -858,19 +861,12 @@ void BSOCK::set_killable(bool killable) */ void BSOCK::restore_blocking (int flags) { -#ifndef HAVE_WIN32 if ((fcntl(m_fd, F_SETFL, flags)) < 0) { berrno be; Qmsg1(get_jcr(), M_ABORT, 0, _("fcntl F_SETFL error. ERR=%s\n"), be.bstrerror()); } m_blocking = (flags & O_NONBLOCK) ? true : false; -#else - u_long ioctlArg = flags; - - ioctlsocket(m_fd, FIONBIO, &ioctlArg); - m_blocking = 1; -#endif } /* @@ -903,6 +899,11 @@ int BSOCK::wait_data(int sec, int usec) return -1; /* error return */ default: b_errno = 0; +#ifdef HAVE_TLS + if (this->tls && !tls_bsock_probe(this)) { + continue; /* false alarm, maybe a session key negotiation in progress on the socket */ + } +#endif return 1; } } @@ -932,6 +933,12 @@ int BSOCK::wait_data_intr(int sec, int usec) return -1; /* error return */ default: b_errno = 0; +#ifdef HAVE_TLS + if (this->tls && !tls_bsock_probe(this)) { + /* maybe a session key negotiation waked up the socket */ + return 0; + } +#endif break; } return 1; @@ -974,15 +981,9 @@ void BSOCK::close() bsock->tls = NULL; } -#ifdef HAVE_WIN32 - if (!bsock->is_timed_out()) { - win_close_wait(bsock->m_fd); /* Ensure that data is not discarded */ - } -#else if (bsock->is_timed_out()) { shutdown(bsock->m_fd, SHUT_RDWR); /* discard any pending I/O */ } -#endif /* On Windows this discards data if we did not do a close_wait() */ socketClose(bsock->m_fd); /* normal close */ } @@ -1120,7 +1121,7 @@ bail_out: bsnprintf(errmsg, errmsg_len, _("Authorization error with Director at \"%s:%d\"\n" "Most likely the passwords do not agree.\n" "If you are using TLS, there may have been a certificate validation error during the TLS handshake.\n" - "Please see " MANUAL_AUTH_URL " for help.\n"), + "For help, please see: " MANUAL_AUTH_URL "\n"), dir->host(), dir->port()); return false; } @@ -1139,14 +1140,14 @@ void BSOCK::control_bwlimit(int bytes) m_nb_bytes += bytes; - /* Less than 0.1ms since the last call, see the next time */ - if (temp < 100) { + if (temp < 0 || temp > 10000000) { /* Take care of clock problems (>10s) or back in time */ + m_nb_bytes = bytes; + m_last_tick = now; return; } - if (temp > 10000000) { /* Take care of clock problems (>10s) */ - m_nb_bytes = bytes; - m_last_tick = now; + /* Less than 0.1ms since the last call, see the next time */ + if (temp < 100) { return; } @@ -1167,25 +1168,3 @@ void BSOCK::control_bwlimit(int bytes) m_last_tick = now; } } - -#ifdef HAVE_WIN32 -/* - * closesocket is supposed to do a graceful disconnect under Window - * but it doesn't. Comments on http://msdn.microsoft.com/en-us/li - * confirm this behaviour. DisconnectEx is required instead, but - * that function needs to be retrieved via WS IOCTL - */ -static void -win_close_wait(int fd) -{ - int ret; - GUID disconnectex_guid = WSAID_DISCONNECTEX; - DWORD bytes_returned; - LPFN_DISCONNECTEX DisconnectEx; - ret = WSAIoctl(fd, SIO_GET_EXTENSION_FUNCTION_POINTER, &disconnectex_guid, sizeof(disconnectex_guid), &DisconnectEx, sizeof(DisconnectEx), &bytes_returned, NULL, NULL); - Dmsg1(100, "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, WSAID_DISCONNECTEX) ret = %d\n", ret); - if (!ret) { - DisconnectEx(fd, NULL, 0, 0); - } -} -#endif diff --git a/bacula/src/lib/bsock.h b/bacula/src/lib/bsock.h index 7c82db1c87..22482122be 100644 --- a/bacula/src/lib/bsock.h +++ b/bacula/src/lib/bsock.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula Sock Class definition @@ -54,6 +58,7 @@ public: IPADDR *src_addr; /* IP address to source connections from */ uint32_t in_msg_no; /* input message number */ uint32_t out_msg_no; /* output message number */ + uint32_t *pout_msg_no; /* pointer to the above */ int32_t msglen; /* message length */ volatile time_t timer_start; /* time started read/write */ volatile time_t timeout; /* timeout BSOCK after this interval */ @@ -67,9 +72,12 @@ public: struct sockaddr_in peer_addr; /* peer's IP address */ private: - BSOCK *m_next; /* next BSOCK if duped */ + BSOCK *m_next; /* next BSOCK if duped (not actually used) */ JCR *m_jcr; /* jcr or NULL for error msgs */ - pthread_mutex_t m_mutex; /* for locking if use_locking set */ + pthread_mutex_t m_rmutex; /* for read locking if use_locking set */ + pthread_mutex_t m_wmutex; /* for write locking if use_locking set */ + pthread_mutex_t *pm_rmutex; /* Pointer to the read mutex */ + pthread_mutex_t *pm_wmutex; /* Pointer to the write mutex */ char *m_who; /* Name of daemon to which we are talking */ char *m_host; /* Host name/IP */ int m_port; /* desired port */ @@ -78,6 +86,7 @@ private: boffset_t m_last_data_end; /* offset of last valid data written */ int32_t m_FileIndex; /* attr spool FI */ int32_t m_lastFileIndex; /* last valid attr spool FI */ + uint32_t m_flags; /* Special flags */ volatile bool m_timed_out: 1; /* timed out in read/write */ volatile bool m_terminated: 1; /* set when BNET_TERMINATE arrives */ bool m_closed: 1; /* set when socket is closed */ @@ -102,7 +111,8 @@ public: utime_t heart_beat, const char *name, char *host, char *service, int port, int verbose); int32_t recv(); - bool send(); + bool send() { return send(0); }; + bool send(int flags); bool fsend(const char*, ...); bool signal(int signal); void close(); /* close connection and destroy packet */ @@ -118,7 +128,7 @@ public: int wait_data(int sec, int usec=0); int wait_data_intr(int sec, int usec=0); bool authenticate_director(const char *name, const char *password, - TLS_CONTEXT *tls_ctx, char *response, int response_len); + TLS_CONTEXT *tls_ctx, char *response, int response_len); bool set_locking(); /* in bsock.c */ void clear_locking(); /* in bsock.c */ void set_source_address(dlist *src_addr_list); @@ -165,6 +175,7 @@ public: void start_timer(int sec) { m_tid = start_bsock_timer(this, sec); }; void stop_timer() { stop_bsock_timer(m_tid); }; void swap_msgs(); + }; /* diff --git a/bacula/src/lib/bsys.c b/bacula/src/lib/bsys.c index 40e048e425..4226e01cdb 100644 --- a/bacula/src/lib/bsys.c +++ b/bacula/src/lib/bsys.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Miscellaneous Bacula memory and thread safe routines @@ -56,6 +60,14 @@ POOLMEM *quote_string(POOLMEM *snew, const char *old) *n++ = '\\'; *n++ = '\\'; break; + case '\r': + *n++ = '\\'; + *n++ = 'r'; + break; + case '\n': + *n++ = '\\'; + *n++ = 'n'; + break; default: *n++ = old[i]; break; @@ -515,21 +527,40 @@ void b_memset(const char *file, int line, void *mem, int val, size_t num) #if !defined(HAVE_WIN32) static int del_pid_file_ok = FALSE; +static int pid_fd = -1; #endif -/* - * Create a standard "Unix" pid file. +#ifdef HAVE_FCNTL_LOCK +/* a convenient function [un]lock file using fnctl() + * code must be in F_UNLCK, F_RDLCK, F_WRLCK + * return -1 for error and errno is set */ -void create_pid_file(char *dir, const char *progname, int port) +int fcntl_lock(int fd, int code) { + struct flock l; + l.l_type = code; + l.l_whence = l.l_start = l.l_len = 0; + l.l_len = 1; + return fcntl(fd, F_SETLK, &l); +} +#endif + +/* Create a disk pid "lock" file + * returns + * 0: Error with the error message in errmsg + * 1: Succcess + * 2: Successs, but a previous file was found + */ +#if !defined(HAVE_FCNTL_LOCK) || defined(HAVE_WIN32) +int create_lock_file(char *fname, const char *progname, const char *filetype, POOLMEM **errmsg) +{ + int ret = 1; #if !defined(HAVE_WIN32) int pidfd, len; int oldpid; char pidbuf[20]; - POOLMEM *fname = get_pool_memory(PM_FNAME); struct stat statp; - Mmsg(&fname, "%s/%s.%d.pid", dir, progname, port); if (stat(fname, &statp) == 0) { /* File exists, see what we have */ *pidbuf = 0; @@ -537,8 +568,10 @@ void create_pid_file(char *dir, const char *progname, int port) read(pidfd, &pidbuf, sizeof(pidbuf)) < 0 || sscanf(pidbuf, "%d", &oldpid) != 1) { berrno be; - Emsg2(M_ERROR_TERM, 0, _("Cannot open pid file. %s ERR=%s\n"), fname, - be.bstrerror()); + Mmsg(errmsg, _("Cannot open %s file. %s ERR=%s\n"), filetype, fname, + be.bstrerror()); + close(pidfd); /* if it was successfully opened */ + return 0; } /* Some OSes (IRIX) don't bother to clean out the old pid files after a crash, and * since they use a deterministic algorithm for assigning PIDs, we can have @@ -552,27 +585,84 @@ void create_pid_file(char *dir, const char *progname, int port) * For more details see bug #797. */ if ((oldpid != (int)getpid()) && (kill(oldpid, 0) != -1 || errno != ESRCH)) { - Emsg3(M_ERROR_TERM, 0, _("%s is already running. pid=%d\nCheck file %s\n"), + Mmsg(errmsg, _("%s is already running. pid=%d\nCheck file %s\n"), progname, oldpid, fname); + return 0; } /* He is not alive, so take over file ownership */ unlink(fname); /* remove stale pid file */ + ret = 2; } /* Create new pid file */ if ((pidfd = open(fname, O_CREAT|O_TRUNC|O_WRONLY|O_BINARY, 0640)) >= 0) { len = sprintf(pidbuf, "%d\n", (int)getpid()); write(pidfd, pidbuf, len); close(pidfd); - del_pid_file_ok = TRUE; /* we created it so we can delete it */ + /* ret is already 1 */ } else { berrno be; - Emsg2(M_ERROR_TERM, 0, _("Could not open pid file. %s ERR=%s\n"), fname, - be.bstrerror()); + Mmsg(errmsg, _("Could not open %s file. %s ERR=%s\n"), filetype, fname, be.bstrerror()); + return 0; } - free_pool_memory(fname); #endif + return ret; } +#else /* defined(HAVE_FCNTL_LOCK) */ +int create_lock_file(char *fname, const char *progname, const char *filetype, POOLMEM **errmsg) +{ + int len; + int oldpid; + char pidbuf[20]; + /* Open the pidfile for writing */ + if ((pid_fd = open(fname, O_CREAT|O_RDWR, 0640)) >= 0) { + if (fcntl_lock(pid_fd, F_WRLCK) == -1) { + berrno be; + /* already locked by someone else, try to read the pid */ + if (read(pid_fd, &pidbuf, sizeof(pidbuf)) > 0 && + sscanf(pidbuf, "%d", &oldpid) == 1) { + Mmsg(errmsg, _("%s is already running. pid=%d\nCheck file %s\n"), + progname, oldpid, fname); + } else { + Mmsg(errmsg, _("Cannot lock %s file. %s ERR=%s\n"), filetype, fname, be.bstrerror()); + } + close(pid_fd); + pid_fd=-1; + return 0; + } + /* write the pid */ + len = sprintf(pidbuf, "%d\n", (int)getpid()); + write(pid_fd, pidbuf, len); + /* KEEP THE FILE OPEN TO KEEP THE LOCK !!! */ + return 1; + } else { + berrno be; + Mmsg(errmsg, _("Cannot not open %s file. %s ERR=%s\n"), filetype, fname, be.bstrerror()); + return 0; + } +} +#endif + +/* + * Create a standard "Unix" pid file. + */ +void create_pid_file(char *dir, const char *progname, int port) +{ + POOLMEM *errmsg = get_pool_memory(PM_MESSAGE); + POOLMEM *fname = get_pool_memory(PM_FNAME); + + Mmsg(fname, "%s/%s.%d.pid", dir, progname, port); + if (create_lock_file(fname, progname, "pid", &errmsg) == 0) { + Emsg1(M_ERROR_TERM, 0, "%s", errmsg); + /* never return */ + } +#if !defined(HAVE_WIN32) + del_pid_file_ok = TRUE; /* we created it so we can delete it */ +#endif + + free_pool_memory(fname); + free_pool_memory(errmsg); +} /* * Delete the pid file if we created it @@ -581,7 +671,9 @@ int delete_pid_file(char *dir, const char *progname, int port) { #if !defined(HAVE_WIN32) POOLMEM *fname = get_pool_memory(PM_FNAME); - + if (pid_fd!=-1) { + close(pid_fd); + } if (!del_pid_file_ok) { free_pool_memory(fname); return 0; @@ -913,3 +1005,102 @@ void stack_trace() #else /* HAVE_BACKTRACE && HAVE_GCC */ void stack_trace() {} #endif /* HAVE_BACKTRACE && HAVE_GCC */ + +#ifdef HAVE_SYS_STATVFS_H +#include +#else +#define statvfs statfs +#endif +/* statvfs.h defines ST_APPEND, which is also used by Bacula */ +#undef ST_APPEND + + +int fs_get_free_space(const char *path, int64_t *freeval, int64_t *totalval) +{ +#ifndef HAVE_WIN32 + struct statvfs st; + + if (statvfs(path, &st) == 0) { + *freeval = (uint64_t)st.f_bsize * (uint64_t)st.f_bavail; + *totalval = (uint64_t)st.f_blocks * (uint64_t)st.f_frsize; + return 0; + } +#endif + *totalval = *freeval = 0; + return -1; +} + +void setup_env(char *envp[]) +{ + if (envp) { +#if defined(HAVE_SETENV) + char *p; + POOLMEM *tmp = get_pool_memory(PM_FNAME); + for (int i=0; envp[i] ; i++) { + pm_strcpy(tmp, envp[i]); + p = strchr(tmp, '='); /* HOME=/tmp */ + if (p) { + *p=0; /* HOME\0tmp\0 */ + setenv(tmp, p+1, true); + } + } + free_pool_memory(tmp); +#elif defined(HAVE_PUTENV) + for (int i=0; envp[i] ; i++) { + putenv(envp[i]); + } +#else +#error "putenv() and setenv() are not available on this system" +#endif + } +} + +/* Small function to copy a file somewhere else, + * for debug purpose. + */ +int copyfile(const char *src, const char *dst) +{ + int fd_src=-1, fd_dst=-1; + ssize_t len, lenw; + char buf[4096]; + berrno be; + fd_src = open(src, O_RDONLY); + if (fd_src < 0) { + Dmsg2(0, "Unable to open %s ERR=%s\n", src, be.bstrerror(errno)); + goto bail_out; + } + fd_dst = open(dst, O_WRONLY | O_CREAT | O_EXCL, 0600); + if (fd_dst < 0) { + Dmsg2(0, "Unable to open %s ERR=%s\n", dst, be.bstrerror(errno)); + goto bail_out; + } + + while ((len = read(fd_src, buf, sizeof(buf))) > 0) + { + char *out_ptr = buf; + do { + lenw = write(fd_dst, out_ptr, len); + if (lenw >= 0) { + len -= lenw; + out_ptr += lenw; + } else if (errno != EINTR) { + Dmsg3(0, "Unable to write %d bytes in %s. ERR=%s\n", len, dst, be.bstrerror(errno)); + goto bail_out; + } + } while (len > 0); + } + + if (len == 0) { + close(fd_src); + if (close(fd_dst) < 0) { + Dmsg2(0, "Unable to close %s properly. ERR=%s\n", dst, be.bstrerror(errno)); + return -1; + } + /* Success! */ + return 0; + } +bail_out: + close(fd_src); + close(fd_dst); + return -1; +} diff --git a/bacula/src/lib/btime.c b/bacula/src/lib/btime.c index 3a1a151bb5..0748a10731 100644 --- a/bacula/src/lib/btime.c +++ b/bacula/src/lib/btime.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula floating point time and date routines -- John Walker diff --git a/bacula/src/lib/btime.h b/bacula/src/lib/btime.h index 8da4f4d1dc..c4632e8aff 100644 --- a/bacula/src/lib/btime.h +++ b/bacula/src/lib/btime.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* diff --git a/bacula/src/lib/btimers.c b/bacula/src/lib/btimers.c index d73b3c872d..543c0f0bc5 100644 --- a/bacula/src/lib/btimers.c +++ b/bacula/src/lib/btimers.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2004-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Process and thread timer routines, built on top of watchdogs. diff --git a/bacula/src/lib/btimers.h b/bacula/src/lib/btimers.h index a638aa5815..c43690d313 100644 --- a/bacula/src/lib/btimers.h +++ b/bacula/src/lib/btimers.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2003-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Process and thread timer routines, built on top of watchdogs. diff --git a/bacula/src/lib/cram-md5.c b/bacula/src/lib/cram-md5.c index b1a9443b98..5583be49f4 100644 --- a/bacula/src/lib/cram-md5.c +++ b/bacula/src/lib/cram-md5.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Challenge Response Authentication Method using MD5 (CRAM-MD5) @@ -26,6 +30,7 @@ const int dbglvl = 50; + /* Authorize other end * Codes that tls_local_need and tls_remote_need can take: * BNET_TLS_NONE I cannot do tls @@ -117,6 +122,10 @@ bool cram_md5_respond(BSOCK *bs, const char *password, int *tls_remote_need, int return false; } Dmsg1(100, "cram-get received: %s", bs->msg); + /* + * Note that the next call is only to keep compatibility with very + * old versions of Bacula that used a non-compatible base64 algorithm. + */ if (sscanf(bs->msg, "auth cram-md5c %s ssl=%d", chal, tls_remote_need) == 2) { *compatible = true; } else if (sscanf(bs->msg, "auth cram-md5 %s ssl=%d", chal, tls_remote_need) != 2) { diff --git a/bacula/src/lib/crc32.c b/bacula/src/lib/crc32.c index a5e4f0b4d0..74ee4b0b74 100644 --- a/bacula/src/lib/crc32.c +++ b/bacula/src/lib/crc32.c @@ -470,4 +470,3 @@ int main(int argc, char *argv[]) fclose(fd); } #endif - diff --git a/bacula/src/lib/crypto.c b/bacula/src/lib/crypto.c index f62e97ab7e..bf4a182e96 100644 --- a/bacula/src/lib/crypto.c +++ b/bacula/src/lib/crypto.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2005-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * crypto.c Encryption support functions @@ -128,9 +132,6 @@ #ifdef HAVE_CRYPTO /* Is encryption enabled? */ #ifdef HAVE_OPENSSL /* How about OpenSSL? */ -/* Are we initialized? */ -static int crypto_initialized = false; - /* ASN.1 Declarations */ #define BACULA_ASN1_VERSION 0 @@ -1364,77 +1365,6 @@ void crypto_cipher_free (CIPHER_CONTEXT *cipher_ctx) } -/* - * Perform global initialization of OpenSSL - * This function is not thread safe. - * Returns: 0 on success - * errno on failure - */ -int init_crypto (void) -{ - int stat; - - if ((stat = openssl_init_threads()) != 0) { - berrno be; - Jmsg1(NULL, M_ABORT, 0, - _("Unable to init OpenSSL threading: ERR=%s\n"), be.bstrerror(stat)); - } - - /* Load libssl and libcrypto human-readable error strings */ - SSL_load_error_strings(); - - /* Initialize OpenSSL SSL library */ - SSL_library_init(); - - /* Register OpenSSL ciphers and digests */ - OpenSSL_add_all_algorithms(); - - if (!openssl_seed_prng()) { - Jmsg0(NULL, M_ERROR_TERM, 0, _("Failed to seed OpenSSL PRNG\n")); - } - - crypto_initialized = true; - - return stat; -} - -/* - * Perform global cleanup of OpenSSL - * All cryptographic operations must be completed before calling this function. - * This function is not thread safe. - * Returns: 0 on success - * errno on failure - */ -int cleanup_crypto (void) -{ - /* - * Ensure that we've actually been initialized; Doing this here decreases the - * complexity of client's termination/cleanup code. - */ - if (!crypto_initialized) { - return 0; - } - - if (!openssl_save_prng()) { - Jmsg0(NULL, M_ERROR, 0, _("Failed to save OpenSSL PRNG\n")); - } - - openssl_cleanup_threads(); - - /* Free libssl and libcrypto error strings */ - ERR_free_strings(); - - /* Free all ciphers and digests */ - EVP_cleanup(); - - /* Free memory used by PRNG */ - RAND_cleanup(); - - crypto_initialized = false; - - return 0; -} - #else /* HAVE_OPENSSL */ # error No encryption library available @@ -1540,10 +1470,6 @@ void crypto_digest_free(DIGEST *digest) free(digest); } -/* Dummy routines */ -int init_crypto (void) { return 0; } -int cleanup_crypto (void) { return 0; } - SIGNATURE *crypto_sign_new(JCR *jcr) { return NULL; } crypto_error_t crypto_sign_get_digest (SIGNATURE *sig, X509_KEYPAIR *keypair, diff --git a/bacula/src/lib/crypto.h b/bacula/src/lib/crypto.h index 2a75302330..9b4728f419 100644 --- a/bacula/src/lib/crypto.h +++ b/bacula/src/lib/crypto.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2005-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * crypto.h Encryption support functions diff --git a/bacula/src/lib/daemon.c b/bacula/src/lib/daemon.c index deb030fbe5..31e4a2519b 100644 --- a/bacula/src/lib/daemon.c +++ b/bacula/src/lib/daemon.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * daemon.c by Kern Sibbald 2000 @@ -32,20 +36,18 @@ void daemon_start() { -#if !defined(HAVE_WIN32) - int i; - int fd; +#ifndef HAVE_WIN32 + int i, fd, next_fd; pid_t cpid; mode_t oldmask; #ifdef DEVELOPER - int low_fd = 2; + next_fd = 3; #else - int low_fd = -1; + next_fd = 0; #endif /* * Become a daemon. */ - Dmsg0(900, "Enter daemon_start\n"); if ( (cpid = fork() ) < 0) { berrno be; @@ -53,35 +55,23 @@ daemon_start() } else if (cpid > 0) { exit(0); /* parent exits */ } - /* Child continues */ + /* Child continues */ setsid(); /* In the PRODUCTION system, we close ALL * file descriptors except stdin, stdout, and stderr. */ if (debug_level > 0) { - low_fd = 2; /* don't close debug output */ + next_fd = 3; /* don't close debug output */ } #if defined(HAVE_FCNTL_F_CLOSEM) - /* - * fcntl(fd, F_CLOSEM) needs the minimum filedescriptor - * to close. the current code sets the last one to keep - * open. So increment it with 1 and use that as argument. - */ - low_fd++; - fcntl(low_fd, F_CLOSEM); + fcntl(next_fd, F_CLOSEM); #elif defined(HAVE_CLOSEFROM) - /* - * closefrom needs the minimum filedescriptor to close. - * the current code sets the last one to keep open. - * So increment it with 1 and use that as argument. - */ - low_fd++; - closefrom(low_fd); + closefrom(next_fd); #else - for (i=sysconf(_SC_OPEN_MAX)-1; i > low_fd; i--) { + for (i=sysconf(_SC_OPEN_MAX); i >= next_fd; i--) { close(i); } #endif diff --git a/bacula/src/lib/devlock.c b/bacula/src/lib/devlock.c index e716670929..ca8dcb69e1 100644 --- a/bacula/src/lib/devlock.c +++ b/bacula/src/lib/devlock.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula Thread Read/Write locking code. It permits @@ -26,7 +30,7 @@ * */ -#define _LOCKMGR_COMPLIANT +#define LOCKMGR_COMPLIANT #include "bacula.h" #include "devlock.h" @@ -501,14 +505,12 @@ int main (int argc, char *argv[]) int thread_writes = 0; int data_writes = 0; -#ifdef USE_THR_SETCONCURRENCY /* - * On Solaris 2.5,2.6,7 and 8 threads are not timesliced. To ensure - * that our threads can run concurrently, we need to - * increase the concurrency level to THREADS. + * For Solaris 2.5,2.6,7 and 8 threads are not timesliced. + * To ensure our threads can run concurrently, we specifically + * set the concurrency level to THREADS. */ - thr_setconcurrency (THREADS); -#endif + thr_setconcurrency(THREADS); /* Turned on only for Solaris */ /* * Initialize the shared data. @@ -584,7 +586,7 @@ int main (int argc, char *argv[]) * * Demonstrate use of non-blocking read-write locks. * - * Special notes: On older Solaris system, call thr_setconcurrency() + * On older Solaris system, call thr_setconcurrency() * to allow interleaved thread execution, since threads are not * timesliced. */ @@ -674,15 +676,13 @@ int main (int argc, char *argv[]) int thread_updates = 0, data_updates = 0; int status; -#ifdef USE_THR_SETCONCURRENCY /* - * On Solaris 2.5,2.6,7 and 8 threads are not timesliced. To ensure - * that our threads can run concurrently, we need to - * increase the concurrency level to THREADS. + * For Solaris 2.5,2.6,7 and 8 threads are not timesliced. + * To ensure our threads can run concurrently, we specifically + * set the concurrency level to THREADS. */ DPRINTF (("Setting concurrency level to %d\n", THREADS)); - thr_setconcurrency (THREADS); -#endif + thr_setconcurrency(THREADS); /* Turned on only for Solaris */ /* * Initialize the shared data. diff --git a/bacula/src/lib/devlock.h b/bacula/src/lib/devlock.h index 2f3b6a3ab0..7c3812cd55 100644 --- a/bacula/src/lib/devlock.h +++ b/bacula/src/lib/devlock.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula Thread Read/Write locking code. It permits diff --git a/bacula/src/lib/dlist.c b/bacula/src/lib/dlist.c index 1566265931..6ac67d7b02 100644 --- a/bacula/src/lib/dlist.c +++ b/bacula/src/lib/dlist.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2003-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula doubly linked list routines. diff --git a/bacula/src/lib/dlist.h b/bacula/src/lib/dlist.h index 1f7f2bdae6..b5d7e0696f 100644 --- a/bacula/src/lib/dlist.h +++ b/bacula/src/lib/dlist.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2004-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Written by Kern Sibbald MMIV diff --git a/bacula/src/lib/edit.c b/bacula/src/lib/edit.c index b5d0d5c1f5..6e3cd09541 100644 --- a/bacula/src/lib/edit.c +++ b/bacula/src/lib/edit.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * edit.c edit string to ascii, and ascii to internal @@ -38,9 +42,23 @@ uint64_t str_to_uint64(char *str) if (*p == '+') { p++; } - while (B_ISDIGIT(*p)) { - value = B_TIMES10(value) + *p - '0'; - p++; + if (*p == '0' && *(p+1) == 'x') { + p = p + 2; /* skip 0x */ + + while (B_ISXDIGIT(*p)) { + if (B_ISDIGIT(*p)) { + value = (value<<4) + (*p - '0'); + + } else { + value = (value<<4) + (tolower(*p) - 'a' + 10); + } + p++; + } + } else { + while (B_ISDIGIT(*p)) { + value = B_TIMES10(value) + *p - '0'; + p++; + } } return value; } diff --git a/bacula/src/lib/guid_to_name.c b/bacula/src/lib/guid_to_name.c index 7b98174916..3db8e8a327 100644 --- a/bacula/src/lib/guid_to_name.c +++ b/bacula/src/lib/guid_to_name.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Written by Kern Sibbald, July 2007 to replace idcache.c diff --git a/bacula/src/lib/guid_to_name.h b/bacula/src/lib/guid_to_name.h index 55515c850c..bfbecfeb6e 100644 --- a/bacula/src/lib/guid_to_name.h +++ b/bacula/src/lib/guid_to_name.h @@ -1,24 +1,27 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Written by Kern Sibbald, July 2007 to replace idcache.c * * Program to convert uid and gid into names, and cache the results * for preformance reasons. - * */ class guid_list { diff --git a/bacula/src/lib/hmac.c b/bacula/src/lib/hmac.c index 92b9402516..a4e132f51b 100644 --- a/bacula/src/lib/hmac.c +++ b/bacula/src/lib/hmac.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* @@ -20,9 +24,7 @@ * hmac_md5 was based on sample code in RFC2104 (thanks guys). * * Adapted to Bacula by Kern E. Sibbald, February MMI. - * */ - #include "bacula.h" #define PAD_LEN 64 /* PAD length */ diff --git a/bacula/src/lib/htable.c b/bacula/src/lib/htable.c index 0e85f92099..2c60147748 100644 --- a/bacula/src/lib/htable.c +++ b/bacula/src/lib/htable.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2003-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula hash table routines @@ -37,20 +41,16 @@ */ #include "bacula.h" +#include "htable.h" -#define B_PAGE_SIZE 4096 -#define MIN_PAGES 32 -#define MAX_PAGES 2400 -#define MIN_BUF_SIZE (MIN_PAGES * B_PAGE_SIZE) /* 128 Kb */ -#define MAX_BUF_SIZE (MAX_PAGES * B_PAGE_SIZE) /* approx 10MB */ - -#define dbglvl 500 -#define dbglvl_mem DT_MEMORY|100 +#define lli long long int +static const int dbglvl = 500; /* =================================================================== * htable */ +#ifdef BIG_MALLOC /* * This subroutine gets a big buffer. */ @@ -65,7 +65,7 @@ void htable::malloc_big_buf(int size) mem_block = hmem; hmem->mem = mem_block->first; hmem->rem = (char *)hmem + size - hmem->mem; - Dmsg3(dbglvl_mem, "malloc buf=%p size=%d rem=%d\n", hmem, size, hmem->rem); + Dmsg3(100, "malloc buf=%p size=%d rem=%d\n", hmem, size, hmem->rem); } /* This routine frees the whole tree */ @@ -76,36 +76,46 @@ void htable::hash_big_free() for (hmem=mem_block; hmem; ) { rel = hmem; hmem = hmem->next; - Dmsg1(dbglvl_mem, "free malloc buf=%p\n", rel); + Dmsg1(100, "free malloc buf=%p\n", rel); free(rel); } } +#endif + /* - * Normal hash malloc routine that gets a + * Normal hash malloc routine that gets a * "small" buffer from the big buffer */ char *htable::hash_malloc(int size) { - int mb_size; +#ifdef BIG_MALLOC char *buf; int asize = BALIGN(size); if (mem_block->rem < asize) { - if (total_size >= (extend_length / 2)) { - mb_size = extend_length; + uint32_t mb_size; + if (total_size >= 1000000) { + mb_size = 1000000; } else { - mb_size = extend_length / 2; + mb_size = 100000; } malloc_big_buf(mb_size); - Dmsg1(dbglvl_mem, "Created new big buffer of %ld bytes\n", mb_size); } mem_block->rem -= asize; buf = mem_block->mem; mem_block->mem += asize; return buf; +#else + total_size += size; + blocks++; + return (char *)malloc(size); +#endif } + + + /* * Create hash of key, stored in hash then * create and return the pseudo random bucket index @@ -117,39 +127,29 @@ void htable::hash_index(char *key) hash += ((hash << 5) | (hash >> (sizeof(hash)*8-5))) + (uint32_t)*p; } /* Multiply by large prime number, take top bits, mask for remainder */ - index = ((hash * 1103515249) >> rshift) & mask; - Dmsg2(dbglvl, "Leave hash_index hash=0x%llx index=%d\n", hash, index); -} - -void htable::hash_index(uint32_t key) -{ - hash = key; - /* Multiply by large prime number, take top bits, mask for remainder */ - index = ((hash * 1103515249) >> rshift) & mask; - Dmsg2(dbglvl, "Leave hash_index hash=0x%llx index=%d\n", hash, index); -} - -void htable::hash_index(uint64_t key) -{ - hash = key; - /* Multiply by large prime number, take top bits, mask for remainder */ - index = ((hash * 1103515249) >> rshift) & mask; - Dmsg2(dbglvl, "Leave hash_index hash=0x%llx index=%d\n", hash, index); -} - + index = ((hash * 1103515249LL) >> rshift) & mask; + Dmsg2(dbglvl, "Leave hash_index hash=0x%x index=%d\n", hash, index); +} + +void htable::hash_index(uint64_t ikey) +{ + hash = ikey; /* already have starting binary hash */ + /* Same algorithm as for char * */ + index = ((hash * 1103515249LL) >> rshift) & mask; + Dmsg2(dbglvl, "Leave hash_index hash=0x%x index=%d\n", hash, index); +} + /* * tsize is the estimated number of entries in the hash table */ -htable::htable(void *item, void *link, int tsize, int nr_pages) +htable::htable(void *item, void *link, int tsize) { - init(item, link, tsize, nr_pages); + init(item, link, tsize); } -void htable::init(void *item, void *link, int tsize, int nr_pages) +void htable::init(void *item, void *link, int tsize) { int pwr; - int pagesize; - int buffer_size; memset(this, 0, sizeof(htable)); if (tsize < 31) { @@ -160,31 +160,15 @@ void htable::init(void *item, void *link, int tsize, int nr_pages) tsize >>= 1; } loffset = (char *)link - (char *)item; - mask = ~((~0) << pwr); /* 3 bits => table size = 8 */ + mask = ~((~0)< table size = 8 */ rshift = 30 - pwr; /* start using bits 28, 29, 30 */ - buckets = 1 << pwr; /* hash table size -- power of two */ + buckets = 1< MAX_BUF_SIZE) { - buffer_size = MAX_BUF_SIZE; - } else if (buffer_size < MIN_BUF_SIZE) { - buffer_size = MIN_BUF_SIZE; - } - } - malloc_big_buf(buffer_size); - extend_length = buffer_size; - Dmsg1(dbglvl_mem, "Allocated big buffer of %ld bytes\n", buffer_size); +#ifdef BIG_MALLOC + malloc_big_buf(1000000); /* ***FIXME*** need variable or some estimate */ +#endif /* BIG_MALLOC */ } uint32_t htable::size() @@ -194,7 +178,7 @@ uint32_t htable::size() /* * Take each hash link and walk down the chain of items - * that hash there counting them (i.e. the hits), + * that hash there counting them (i.e. the hits), * then report that number. * Obiously, the more hits in a chain, the more time * it takes to reference them. Empty chains are not so @@ -231,20 +215,17 @@ void htable::stats() } printf("buckets=%d num_items=%d max_items=%d\n", buckets, num_items, max_items); printf("max hits in a bucket = %d\n", max); - printf("total bytes malloced = %lld\n", (long long int)total_size); - printf("total bytes malloced = %lld\n", (long long int)total_size); +#ifdef BIG_MALLOC + printf("total bytes malloced = %lld\n", (lli)total_size); printf("total blocks malloced = %d\n", blocks); +#endif } void htable::grow_table() { - htable *big; - hlink *cur; - void *ni; - Dmsg1(100, "Grow called old size = %d\n", buckets); /* Setup a bigger table */ - big = (htable *)malloc(sizeof(htable)); + htable *big = (htable *)malloc(sizeof(htable)); memcpy(big, this, sizeof(htable)); /* start with original class data */ big->loffset = loffset; big->mask = mask<<1 | 1; @@ -267,22 +248,15 @@ void htable::grow_table() * to the next bucket. */ for (void *item=first(); item; ) { - cur = (hlink *)((char *)item+loffset); - ni = cur->next; /* save link overwritten by insert */ - switch (cur->key_type) { - case KEY_TYPE_CHAR: - Dmsg1(100, "Grow insert: %s\n", cur->key.char_key); - big->insert(cur->key.char_key, item); - break; - case KEY_TYPE_UINT32: - Dmsg1(100, "Grow insert: %ld\n", cur->key.uint32_key); - big->insert(cur->key.uint32_key, item); - break; - case KEY_TYPE_UINT64: - Dmsg1(100, "Grow insert: %ld\n", cur->key.uint64_key); - big->insert(cur->key.uint64_key, item); - break; - } + void *ni = ((hlink *)((char *)item+loffset))->next; /* save link overwritten by insert */ + hlink *hp = (hlink *)((char *)item+loffset); + if (hp->is_ikey) { + Dmsg1(100, "Grow insert: %lld\n", hp->key.ikey); + big->insert(hp->key.ikey, item); + } else { + Dmsg1(100, "Grow insert: %s\n", hp->key.key); + big->insert(hp->key.key, item); + } if (ni) { item = (void *)((char *)ni-loffset); } else { @@ -303,7 +277,6 @@ void htable::grow_table() bool htable::insert(char *key, void *item) { hlink *hp; - if (lookup(key)) { return false; /* already exists */ } @@ -314,11 +287,11 @@ bool htable::insert(char *key, void *item) index, item, loffset); hp->next = table[index]; hp->hash = hash; - hp->key_type = KEY_TYPE_CHAR; - hp->key.char_key = key; + hp->key.key = key; + hp->is_ikey = false; table[index] = hp; - Dmsg3(dbglvl, "Insert hp->next=%p hp->hash=0x%llx hp->key=%s\n", - hp->next, hp->hash, hp->key.char_key); + Dmsg3(dbglvl, "Insert hp->next=%p hp->hash=0x%x hp->key=%s\n", + hp->next, hp->hash, hp->key.key); if (++num_items >= max_items) { Dmsg2(dbglvl, "num_items=%d max_items=%d\n", num_items, max_items); @@ -328,102 +301,60 @@ bool htable::insert(char *key, void *item) return true; } -bool htable::insert(uint32_t key, void *item) -{ - hlink *hp; - - if (lookup(key)) { - return false; /* already exists */ - } - ASSERT(index < buckets); - Dmsg2(dbglvl, "Insert: hash=%p index=%d\n", hash, index); - hp = (hlink *)(((char *)item)+loffset); - Dmsg4(dbglvl, "Insert hp=%p index=%d item=%p offset=%u\n", hp, - index, item, loffset); - hp->next = table[index]; - hp->hash = hash; - hp->key_type = KEY_TYPE_UINT32; - hp->key.uint32_key = key; - table[index] = hp; - Dmsg3(dbglvl, "Insert hp->next=%p hp->hash=0x%llx hp->key=%d\n", - hp->next, hp->hash, hp->key.uint32_key); - - if (++num_items >= max_items) { - Dmsg2(dbglvl, "num_items=%d max_items=%d\n", num_items, max_items); - grow_table(); - } - Dmsg3(dbglvl, "Leave insert index=%d num_items=%d key=%d\n", index, num_items, key); - return true; -} - -bool htable::insert(uint64_t key, void *item) -{ - hlink *hp; - - if (lookup(key)) { - return false; /* already exists */ - } - ASSERT(index < buckets); - Dmsg2(dbglvl, "Insert: hash=%p index=%d\n", hash, index); - hp = (hlink *)(((char *)item)+loffset); - Dmsg4(dbglvl, "Insert hp=%p index=%d item=%p offset=%u\n", hp, - index, item, loffset); - hp->next = table[index]; - hp->hash = hash; - hp->key_type = KEY_TYPE_UINT64; - hp->key.uint64_key = key; - table[index] = hp; - Dmsg3(dbglvl, "Insert hp->next=%p hp->hash=0x%llx hp->key=%ld\n", - hp->next, hp->hash, hp->key.uint64_key); - - if (++num_items >= max_items) { - Dmsg2(dbglvl, "num_items=%d max_items=%d\n", num_items, max_items); - grow_table(); - } - Dmsg3(dbglvl, "Leave insert index=%d num_items=%d key=%lld\n", index, num_items, key); - return true; -} - void *htable::lookup(char *key) -{ - hash_index(key); - for (hlink *hp=table[index]; hp; hp=(hlink *)hp->next) { - ASSERT(hp->key_type == KEY_TYPE_CHAR); -// Dmsg2(100, "hp=%p key=%s\n", hp, hp->key.char_key); - if (hash == hp->hash && strcmp(key, hp->key.char_key) == 0) { - Dmsg1(dbglvl, "lookup return %p\n", ((char *)hp)-loffset); - return ((char *)hp)-loffset; - } - } - return NULL; -} - -void *htable::lookup(uint32_t key) -{ - hash_index(key); - for (hlink *hp=table[index]; hp; hp=(hlink *)hp->next) { - ASSERT(hp->key_type == KEY_TYPE_UINT32); - if (hash == hp->hash && key == hp->key.uint32_key) { - Dmsg1(dbglvl, "lookup return %p\n", ((char *)hp)-loffset); - return ((char *)hp)-loffset; - } - } - return NULL; -} - -void *htable::lookup(uint64_t key) -{ - hash_index(key); - for (hlink *hp=table[index]; hp; hp=(hlink *)hp->next) { - ASSERT(hp->key_type == KEY_TYPE_UINT64); - if (hash == hp->hash && key == hp->key.uint64_key) { - Dmsg1(dbglvl, "lookup return %p\n", ((char *)hp)-loffset); - return ((char *)hp)-loffset; - } - } - return NULL; -} - +{ + hash_index(key); + for (hlink *hp=table[index]; hp; hp=(hlink *)hp->next) { +// Dmsg2(100, "hp=%p key=%s\n", hp, hp->key.key); + if (hash == hp->hash && strcmp(key, hp->key.key) == 0) { + Dmsg1(dbglvl, "lookup return %p\n", ((char *)hp)-loffset); + return ((char *)hp)-loffset; + } + } + return NULL; +} + +bool htable::insert(uint64_t ikey, void *item) +{ + hlink *hp; + if (lookup(ikey)) { + return false; /* already exists */ + } + ASSERT(index < buckets); + Dmsg2(dbglvl, "Insert: hash=%p index=%d\n", hash, index); + hp = (hlink *)(((char *)item)+loffset); + Dmsg4(dbglvl, "Insert hp=%p index=%d item=%p offset=%u\n", hp, index, + item, loffset); + hp->next = table[index]; + hp->hash = hash; + hp->key.ikey = ikey; + hp->is_ikey = true; + table[index] = hp; + Dmsg3(dbglvl, "Insert hp->next=%p hp->hash=0x%x hp->ikey=%lld\n", hp->next, + hp->hash, hp->key.ikey); + + if (++num_items >= max_items) { + Dmsg2(dbglvl, "num_items=%d max_items=%d\n", num_items, max_items); + grow_table(); + } + Dmsg3(dbglvl, "Leave insert index=%d num_items=%d key=%lld\n", + index, num_items, ikey); + return true; +} + +void *htable::lookup(uint64_t ikey) +{ + hash_index(ikey); + for (hlink *hp=table[index]; hp; hp=(hlink *)hp->next) { +// Dmsg2(100, "hp=%p key=%lld\n", hp, hp->key.ikey); + if (hash == hp->hash && ikey == hp->key.ikey) { + Dmsg1(dbglvl, "lookup return %p\n", ((char *)hp)-loffset); + return ((char *)hp)-loffset; + } + } + return NULL; +} + void *htable::next() { Dmsg1(dbglvl, "Enter next: walkptr=%p\n", walkptr); @@ -469,11 +400,21 @@ void *htable::first() /* Destroy the table and its contents */ void htable::destroy() { +#ifdef BIG_MALLOC hash_big_free(); +#else + void *ni; + void *li = first(); + + while (li) { + ni = next(); + free(li); + li=ni; + } +#endif free(table); table = NULL; - garbage_collect_memory(); Dmsg0(100, "Done destroy.\n"); } @@ -482,19 +423,11 @@ void htable::destroy() #ifdef TEST_PROGRAM struct MYJCR { -#ifndef TEST_NON_CHAR char *key; -#else - uint32_t key; -#endif hlink link; }; -#ifndef TEST_SMALL_HTABLE #define NITEMS 5000000 -#else -#define NITEMS 5000 -#endif int main() { @@ -505,25 +438,16 @@ int main() int count = 0; jcrtbl = (htable *)malloc(sizeof(htable)); + jcrtbl->init(jcr, &jcr->link, NITEMS); -#ifndef TEST_SMALL_HTABLE - jcrtbl->init(jcr, &jcr->link, NITEMS); -#else - jcrtbl->init(jcr, &jcr->link, NITEMS, 128); -#endif Dmsg1(000, "Inserting %d items\n", NITEMS); for (int i=0; ihash_malloc(sizeof(MYJCR)); jcr->key = (char *)jcrtbl->hash_malloc(len); memcpy(jcr->key, mkey, len); -#else - jcr = (MYJCR *)jcrtbl->hash_malloc(sizeof(MYJCR)); - jcr->key = i; -#endif Dmsg2(100, "link=%p jcr=%p\n", jcr->link, jcr); jcrtbl->insert(jcr->key, jcr); @@ -534,21 +458,15 @@ int main() if (!(item = (MYJCR *)jcrtbl->lookup(save_jcr->key))) { printf("Bad news: %s not found.\n", save_jcr->key); } else { -#ifndef TEST_NON_CHAR printf("Item 10's key is: %s\n", item->key); -#else - printf("Item 10's key is: %ld\n", item->key); -#endif } jcrtbl->stats(); printf("Walk the hash table:\n"); foreach_htable (jcr, jcrtbl) { -#ifndef TEST_NON_CHAR // printf("htable item = %s\n", jcr->key); #ifndef BIG_MALLOC free(jcr->key); -#endif #endif count++; } diff --git a/bacula/src/lib/htable.h b/bacula/src/lib/htable.h index 816fc793cf..73c6eb6d96 100644 --- a/bacula/src/lib/htable.h +++ b/bacula/src/lib/htable.h @@ -1,24 +1,34 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2004-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Written by Kern Sibbald, MMIV */ -#ifndef HTABLE_H -#define HTABLE_H +#ifndef _HTABLE_H_ +#define _HTABLE_H_ + +/* + * + * Written by Kern Sibbald, MMIV + * + */ /* ======================================================================== * @@ -26,6 +36,11 @@ * */ +/* + * BIG_MALLOC is to provide a large malloc service to htable + */ +#define BIG_MALLOC + /* * Loop var through each member of table */ @@ -41,71 +56,64 @@ (*((void **)&(var))=(void *)((tbl)->next()))) #endif -typedef enum { - KEY_TYPE_CHAR = 1, - KEY_TYPE_UINT32 = 2, - KEY_TYPE_UINT64 = 3 -} key_type_t; - -union hlink_key { - char *char_key; - uint32_t uint32_key; - uint64_t uint64_key; -}; +union key_val { + char *key; /* char key */ + uint64_t ikey; /* integer key */ +}; struct hlink { void *next; /* next hash item */ - key_type_t key_type; /* type of key used to hash */ - union hlink_key key; /* key for this item */ - uint64_t hash; /* hash for this key */ + uint64_t hash; /* 64 bit hash for this key */ + union key_val key; /* key value this key */ + bool is_ikey; /* set if integer key */ }; struct h_mem { struct h_mem *next; /* next buffer */ - int32_t rem; /* remaining bytes in big_buffer */ char *mem; /* memory pointer */ + int32_t rem; /* remaining bytes in big_buffer */ char first[1]; /* first byte */ }; class htable : public SMARTALLOC { hlink **table; /* hash table */ - int loffset; /* link offset in item */ - hlink *walkptr; /* table walk pointer */ uint64_t hash; /* temp storage */ uint64_t total_size; /* total bytes malloced */ - uint32_t extend_length; /* number of bytes to allocate when extending buffer */ - uint32_t walk_index; /* table walk index */ + int loffset; /* link offset in item */ uint32_t num_items; /* current number of items */ uint32_t max_items; /* maximum items before growing */ uint32_t buckets; /* size of hash table */ uint32_t index; /* temp storage */ uint32_t mask; /* "remainder" mask */ uint32_t rshift; /* amount to shift down */ + hlink *walkptr; /* table walk pointer */ + uint32_t walk_index; /* table walk index */ uint32_t blocks; /* blocks malloced */ +#ifdef BIG_MALLOC struct h_mem *mem_block; /* malloc'ed memory block chain */ void malloc_big_buf(int size); /* Get a big buffer */ +#endif void hash_index(char *key); /* produce hash key,index */ - void hash_index(uint32_t key); /* produce hash key,index */ - void hash_index(uint64_t key); /* produce hash key,index */ + void hash_index(uint64_t ikey); /* produce hash key,index */ void grow_table(); /* grow the table */ public: - htable(void *item, void *link, int tsize = 31, int nr_pages = 0); + htable(void *item, void *link, int tsize = 31); ~htable() { destroy(); } - void init(void *item, void *link, int tsize = 31, int nr_pages = 0); - bool insert(char *key, void *item); - bool insert(uint32_t key, void *item); - bool insert(uint64_t key, void *item); - void *lookup(char *key); - void *lookup(uint32_t key); - void *lookup(uint64_t key); + void init(void *item, void *link, int tsize = 31); + bool insert(char *key, void *item); /* char key */ + bool insert(uint64_t ikey, void *item); /* 64 bit key */ + void *lookup(char *key); /* char key */ + void *lookup(uint64_t ikey); /* 64 bit key */ void *first(); /* get first item in table */ void *next(); /* get next item in table */ - void destroy(); - void stats(); /* print stats about the table */ + void destroy(); + void stats(); /* print stats about the table */ uint32_t size(); /* return size of table */ char *hash_malloc(int size); /* malloc bytes for a hash entry */ +#ifdef BIG_MALLOC void hash_big_free(); /* free all hash allocated big buffers */ +#endif }; -#endif /* HTABLE_H */ +#endif diff --git a/bacula/src/lib/ini.c b/bacula/src/lib/ini.c index 7be5a8618d..b585b1b497 100644 --- a/bacula/src/lib/ini.c +++ b/bacula/src/lib/ini.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 2011-2014 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2010-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Handle simple configuration file such as "ini" files. @@ -42,6 +46,8 @@ static struct ini_store funcs[] = { {"@STR@", "String", ini_store_str}, {"@BOOL@", "on/off", ini_store_bool}, {"@ALIST@", "String list", ini_store_alist_str}, + {"@DATE@", "Date", ini_store_date}, +/* TODO: Add protocol for the FD @ASKFD@ */ {NULL, NULL, NULL} }; @@ -140,6 +146,8 @@ void ConfigFile::free_items() bfree_and_null_const(items[i].comment); bfree_and_null_const(items[i].default_value); } + } + if (items) { free(items); } items = NULL; @@ -219,7 +227,7 @@ bool ConfigFile::serialize(const char *fname) int ConfigFile::serialize(POOLMEM **buf) { int len; - POOLMEM *tmp; + POOLMEM *tmp, *tmp2; if (!items) { **buf = 0; return 0; @@ -228,14 +236,16 @@ int ConfigFile::serialize(POOLMEM **buf) len = Mmsg(buf, "# Plugin configuration file\n# Version %d\n", version); tmp = get_pool_memory(PM_MESSAGE); + tmp2 = get_pool_memory(PM_MESSAGE); for (int i=0; items[i].name ; i++) { if (items[i].comment) { - Mmsg(tmp, "OptPrompt=\"%s\"\n", items[i].comment); + Mmsg(tmp, "OptPrompt=%s\n", quote_string(tmp2, items[i].comment)); pm_strcat(buf, tmp); } if (items[i].default_value) { - Mmsg(tmp, "OptDefault=\"%s\"\n", items[i].default_value); + Mmsg(tmp, "OptDefault=%s\n", + quote_string(tmp2, items[i].default_value)); pm_strcat(buf, tmp); } if (items[i].required) { @@ -243,12 +253,14 @@ int ConfigFile::serialize(POOLMEM **buf) pm_strcat(buf, tmp); } - /* variable = @INT64@ */ Mmsg(tmp, "%s=%s\n\n", items[i].name, ini_get_store_code(items[i].handler)); + + /* variable = @INT64@ */ len = pm_strcat(buf, tmp); } free_pool_memory(tmp); + free_pool_memory(tmp2); return len ; } @@ -257,7 +269,7 @@ int ConfigFile::serialize(POOLMEM **buf) int ConfigFile::dump_results(POOLMEM **buf) { int len; - POOLMEM *tmp; + POOLMEM *tmp, *tmp2; if (!items) { **buf = 0; return 0; @@ -265,6 +277,7 @@ int ConfigFile::dump_results(POOLMEM **buf) len = Mmsg(buf, "# Plugin configuration file\n# Version %d\n", version); tmp = get_pool_memory(PM_MESSAGE); + tmp2 = get_pool_memory(PM_MESSAGE); for (int i=0; items[i].name ; i++) { if (items[i].found) { @@ -273,63 +286,67 @@ int ConfigFile::dump_results(POOLMEM **buf) Mmsg(tmp, "# %s\n", items[i].comment); pm_strcat(buf, tmp); } - Mmsg(tmp, "%s=%s\n\n", items[i].name, this->edit); + if (items[i].handler == ini_store_str || + items[i].handler == ini_store_name || + items[i].handler == ini_store_date) + { + Mmsg(tmp, "%s=%s\n\n", + items[i].name, + quote_string(tmp2, this->edit)); + + } else { + Mmsg(tmp, "%s=%s\n\n", items[i].name, this->edit); + } len = pm_strcat(buf, tmp); } } free_pool_memory(tmp); + free_pool_memory(tmp2); return len ; } -/* Parse a config file used by Plugin/Director */ -bool ConfigFile::parse(const char *fname) +bool ConfigFile::parse() { int token, i; - bool ret=false; - - if (!items) { - return false; - } + bool ret = false; + bool found; - if ((lc = lex_open_file(lc, fname, s_err)) == NULL) { - berrno be; - Emsg2(M_ERROR, 0, _("Cannot open config file %s: %s\n"), - fname, be.bstrerror()); - return false; - } lc->options |= LOPT_NO_EXTERN; lc->caller_ctx = (void *)this; while ((token=lex_get_token(lc, T_ALL)) != T_EOF) { - Dmsg1(dbglevel, "parse got token=%s\n", lex_tok_to_str(token)); if (token == T_EOL) { continue; } + found = false; for (i=0; items[i].name; i++) { if (strcasecmp(items[i].name, lc->str) == 0) { if ((token = lex_get_token(lc, T_EQUALS)) == T_ERROR) { - Dmsg1(dbglevel, "in T_IDENT got token=%s\n", - lex_tok_to_str(token)); + Dmsg2(dbglevel, "in T_IDENT got token=%s str=%s\n", lex_tok_to_str(token), lc->str); break; } - + Dmsg2(dbglevel, "parse got token=%s str=%s\n", lex_tok_to_str(token), lc->str); Dmsg1(dbglevel, "calling handler for %s\n", items[i].name); /* Call item handler */ ret = items[i].found = items[i].handler(lc, this, &items[i]); - i = -1; + found = true; break; } } - if (i >= 0) { - Dmsg1(dbglevel, "Keyword = %s\n", lc->str); + if (!found) { + Dmsg1(dbglevel, "Unfound keyword=%s\n", lc->str); scan_err1(lc, "Keyword %s not found", lc->str); /* We can raise an error here */ break; + } else { + Dmsg1(dbglevel, "Found keyword=%s\n", items[i].name); } if (!ret) { + Dmsg1(dbglevel, "Error getting value for keyword=%s\n", items[i].name); break; } + Dmsg0(dbglevel, "Continue with while(token) loop\n"); } for (i=0; items[i].name; i++) { @@ -340,10 +357,40 @@ bool ConfigFile::parse(const char *fname) } lc = lex_close_file(lc); - return ret; } +/* Parse a config file used by Plugin/Director */ +bool ConfigFile::parse(const char *fname) +{ + if (!items) { + return false; + } + + if ((lc = lex_open_file(lc, fname, s_err)) == NULL) { + berrno be; + Emsg2(M_ERROR, 0, _("Cannot open config file %s: %s\n"), + fname, be.bstrerror()); + return false; + } + return parse(); /* Parse file */ +} + +/* Parse a config buffer used by Plugin/Director */ +bool ConfigFile::parse_buf(const char *buffer) +{ + if (!items) { + return false; + } + + if ((lc = lex_open_buf(lc, buffer, s_err)) == NULL) { + Emsg0(M_ERROR, 0, _("Cannot open lex\n")); + return false; + } + return parse(); /* Parse memory buffer */ +} + + /* Analyse the content of a ini file to build the item list * It uses special syntax for datatype. Used by Director on Restore object * @@ -475,8 +522,10 @@ bool ini_store_name(LEX *lc, ConfigFile *inifile, ini_items *item) return true; } if (lex_get_token(lc, T_NAME) == T_ERROR) { + Dmsg0(dbglevel, "Want token=T_NAME got T_ERROR\n"); return false; } + Dmsg1(dbglevel, "ini_store_name: %s\n", lc->str); strncpy(item->val.nameval, lc->str, sizeof(item->val.nameval)); scan_to_eol(lc); return true; @@ -575,19 +624,38 @@ bool ini_store_bool(LEX *lc, ConfigFile *inifile, ini_items *item) } if (strcasecmp(lc->str, "yes") == 0 || strcasecmp(lc->str, "true") == 0 || - strcasecmp(lc->str, "on") == 0) + strcasecmp(lc->str, "on") == 0 || + strcasecmp(lc->str, "1") == 0) { item->val.boolval = true; } else if (strcasecmp(lc->str, "no") == 0 || strcasecmp(lc->str, "false") == 0 || - strcasecmp(lc->str, "off") == 0) + strcasecmp(lc->str, "off") == 0 || + strcasecmp(lc->str, "0") == 0) { item->val.boolval = false; } else { /* YES and NO must not be translated */ - scan_err2(lc, _("Expect %s, got: %s"), "YES, NO, ON, OFF, TRUE, or FALSE", lc->str); + scan_err2(lc, _("Expect %s, got: %s"), "YES, NO, ON, OFF, 0, 1, TRUE, or FALSE", lc->str); + return false; + } + scan_to_eol(lc); + return true; +} + +bool ini_store_date(LEX *lc, ConfigFile *inifile, ini_items *item) +{ + if (!lc) { + bstrutime(inifile->edit,sizeof_pool_memory(inifile->edit),item->val.btimeval); + return true; + } + if (lex_get_token(lc, T_STRING) == T_ERROR) { + return false; + } + item->val.btimeval = str_to_utime(lc->str); + if (item->val.btimeval == 0) { return false; } scan_to_eol(lc); @@ -637,6 +705,15 @@ int report() return err>0; } +struct ini_items membuf_items[] = { + /* name handler comment req */ + {"client", ini_store_name, "Client name", 0}, + {"serial", ini_store_int32, "Serial number", 1}, + {"max_clients", ini_store_int32, "Max Clients", 0}, + {NULL, NULL, NULL, 0} +}; + + struct ini_items test_items[] = { /* name handler comment req */ {"datastore", ini_store_name, "Target Datastore", 0}, @@ -647,16 +724,62 @@ struct ini_items test_items[] = { {"pint64", ini_store_pint64, "pint", 0}, {"int32", ini_store_int32, "int 32bit", 0}, {"plugin.test", ini_store_str, "test with .", 0}, + {"adate", ini_store_date, "test with date", 0}, {NULL, NULL, NULL, 0} }; +/* In order to link with libbaccfg */ +int32_t r_last; +int32_t r_first; +RES_HEAD **res_head; +void save_resource(int type, RES_ITEM *items, int pass){} +void dump_resource(int type, RES *ares, void sendit(void *sock, const char *fmt, ...), void *sock){} +void free_resource(RES *rres, int type){} +union URES { +}; +RES_TABLE resources[] = {}; +URES res_all; + int main() { FILE *fp; - int pos; + int pos, size; ConfigFile *ini = new ConfigFile(); POOLMEM *buf = get_pool_memory(PM_BSOCK); + char buffer[2000]; + + //debug_level=500; + printf("Begin Memory buffer Test\n"); + ok(ini->register_items(membuf_items, sizeof(struct ini_items)), "Check sizeof ini_items"); + if ((fp = fopen("test.cfg", "w")) == NULL) { + exit (1); + } + fprintf(fp, "client=JohnDoe\n"); + fprintf(fp, "serial=2\n"); + fprintf(fp, "max_clients=3\n"); + fflush(fp); + fseek(fp, 0, SEEK_END); + size = ftell(fp); + fclose(fp); + + if ((fp = fopen("test.cfg", "rb")) == NULL) { + printf("Could not open file test.cfg\n"); + exit (1); + } + + size = fread(buffer, 1, size, fp); + buffer[size] = 0; + //printf("size of read buffer is: %d\n", size); + //printf("====buf=%s\n", buffer); + + ok(ini->parse_buf(buffer), "Test memory read with all members"); + + ini->clear_items(); + fclose(fp); + + //debug_level = 0; + printf("\n\nBegin Original Full Tests\n"); nok(ini->register_items(test_items, 5), "Check bad sizeof ini_items"); ok(ini->register_items(test_items, sizeof(struct ini_items)), "Check sizeof ini_items"); @@ -674,6 +797,7 @@ int main() fprintf(fp, "int32=100\n"); fprintf(fp, "bool=yes\n"); fprintf(fp, "plugin.test=parameter\n"); + fprintf(fp, "adate=\"1970-01-02 12:00:00\"\n"); fflush(fp); @@ -687,6 +811,7 @@ int main() ok(ini->items[2].val.int64val == 10, "Test int"); ok(ini->items[4].val.boolval == true, "Test bool"); ok(ini->items[6].val.int32val == 100, "Test int 32"); + ok(ini->items[6].val.btimeval != 126000, "Test btime"); alist *list = ini->items[3].val.alistval; nok(ini->items[3].found, "Test presence of alist"); @@ -740,6 +865,7 @@ int main() "pouet=@STR@\n" "int32=@INT32@\n" "plugin.test=@STR@\n" + "adate=@DATE@\n" ); fclose(fp); @@ -767,6 +893,9 @@ int main() ok((pos = ini->get_item("bool")) == 4, "Check bool definition"); ok(ini->items[pos].val.boolval == true, "Test bool"); + ok((pos = ini->get_item("adate")) == 9, "Check adate definition"); + ok(ini->items[pos].val.btimeval == 126000, "Test date"); + ok(ini->dump_results(&buf), "Test to dump results"); printf("<%s>\n", buf); diff --git a/bacula/src/lib/ini.h b/bacula/src/lib/ini.h index c68994bf12..851a578385 100644 --- a/bacula/src/lib/ini.h +++ b/bacula/src/lib/ini.h @@ -1,28 +1,21 @@ /* - Copyright (C) 2011-2011 Bacula Systems(R) SA - - The main author of Bacula is Kern Sibbald, with contributions from - many others, a complete list can be found in the file AUTHORS. - This program is Free Software; you can modify it under the terms of - version three of the GNU Affero General Public License as published by the - Free Software Foundation, which is listed in the file LICENSE. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. - - Bacula® is a registered trademark of Kern Sibbald. - Bacula Systems(R) is a trademark of Bacula Systems SA. - Bacula Enterprise(TM) is a trademark of Bacula Systems SA. - - The licensor of Bacula Enterprise(TM) is Bacula Systems(R) SA, - Rue Galilee 5, 1400 Yverdon-les-Bains, Switzerland. + Bacula(R) - The Network Backup Solution + + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2010-2014 Free Software Foundation Europe e.V. + + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. + + You may use this file and others of this release according to the + license defined in the LICENSE file, which includes the Affero General + Public License, v3.0 ("AGPLv3") and some additional permissions and + terms pursuant to its AGPLv3 Section 7. + + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ #ifndef INI_H @@ -61,6 +54,7 @@ typedef union { char nameval[MAX_NAME_LENGTH]; int64_t int64val; int32_t int32val; + btime_t btimeval; alist *alistval; bool boolval; } item_value; @@ -141,7 +135,7 @@ public: sizeof_ini_items = sizeof(struct ini_items); } - ~ConfigFile() { + virtual ~ConfigFile() { if (lc) { lex_close_file(lc); } @@ -198,7 +192,7 @@ public: int dump_results(POOLMEM **buf); /* Get item position in items list (useful when dynamic) */ - int get_item(const char *name); + virtual int get_item(const char *name); /* Register config file structure, if size doesn't match */ bool register_items(struct ini_items *aitems, int size) { @@ -213,9 +207,15 @@ public: return false; } - /* Parse a ini file with a item list previously registred (plugin side) */ + /* Parse an ini file with a item list previously registred (plugin side) */ bool parse(const char *filename); + /* Parse an ini buffer */ + bool parse_buf(const char *buf); + + /* Parse file or buffer already setup */ + bool parse(); + /* Create a item list from a ini file (director side) */ bool unserialize(const char *filename); @@ -239,6 +239,7 @@ bool ini_store_int64(LEX *lc, ConfigFile *inifile, ini_items *item); bool ini_store_pint32(LEX *lc, ConfigFile *inifile, ini_items *item); bool ini_store_int32(LEX *lc, ConfigFile *inifile, ini_items *item); bool ini_store_bool(LEX *lc, ConfigFile *inifile, ini_items *item); +bool ini_store_date(LEX *lc, ConfigFile *inifile, ini_items *item); /* Get handler code from handler @ */ const char *ini_get_store_code(INI_ITEM_HANDLER *handler); diff --git a/bacula/src/lib/jcr.c b/bacula/src/lib/jcr.c index ab56a6b4ec..097adece8e 100644 --- a/bacula/src/lib/jcr.c +++ b/bacula/src/lib/jcr.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Manipulation routines for Job Control Records and @@ -321,7 +325,6 @@ JCR *new_jcr(int size, JCR_free_HANDLER *daemon_free_jcr) { JCR *jcr; MQUEUE_ITEM *item = NULL; - struct sigaction sigtimer; int status; Dmsg0(dbglvl, "Enter new_jcr\n"); @@ -358,10 +361,13 @@ JCR *new_jcr(int size, JCR_free_HANDLER *daemon_free_jcr) jcr->setJobType(JT_SYSTEM); /* internal job until defined */ jcr->setJobLevel(L_NONE); jcr->setJobStatus(JS_Created); /* ready to run */ +#ifndef HAVE_WIN32 + struct sigaction sigtimer; sigtimer.sa_flags = 0; sigtimer.sa_handler = timeout_handler; sigfillset(&sigtimer.sa_mask); sigaction(TIMEOUT_SIGNAL, &sigtimer, NULL); +#endif /* * Locking jobs is a global lock that is needed @@ -493,10 +499,10 @@ void free_jcr(JCR *jcr) lock_jcr_chain(); jcr->dec_use_count(); /* decrement use count */ - if (jcr->use_count() < 0) { - Jmsg2(jcr, M_ERROR, 0, _("JCR use_count=%d JobId=%d\n"), - jcr->use_count(), jcr->JobId); - } + ASSERT2(jcr->use_count() >= 0, "JCR use_count < 0"); + // Jmsg2(jcr, M_ERROR, 0, _("JCR use_count=%d JobId=%d\n"), + // jcr->use_count(), jcr->JobId); + //} if (jcr->JobId > 0) { Dmsg3(dbglvl, "Dec free_jcr jid=%u use_count=%d Job=%s\n", jcr->JobId, jcr->use_count(), jcr->Job); @@ -509,6 +515,7 @@ void free_jcr(JCR *jcr) Dmsg3(dbglvl, "remove jcr jid=%u use_count=%d Job=%s\n", jcr->JobId, jcr->use_count(), jcr->Job); } + jcr->exiting = true; remove_jcr(jcr); /* remove Jcr from chain */ unlock_jcr_chain(); @@ -583,10 +590,9 @@ void remove_jcr_from_tsd(JCR *jcr) void JCR::set_killable(bool killable) { - JCR *jcr = this; - jcr->lock(); - jcr->my_thread_killable = killable; - jcr->unlock(); + lock(); + my_thread_killable = killable; + unlock(); } /* @@ -606,17 +612,24 @@ void set_jcr_in_tsd(JCR *jcr) void JCR::my_thread_send_signal(int sig) { + lock_jcr_chain(); /* use global lock */ this->lock(); + if (this->exiting) { + goto get_out; + } if (this->is_killable() && !pthread_equal(this->my_thread_id, pthread_self())) { Dmsg1(800, "Send kill to jid=%d\n", this->JobId); pthread_kill(this->my_thread_id, sig); + this->exiting = true; } else if (!this->is_killable()) { Dmsg1(10, "Warning, can't send kill to jid=%d\n", this->JobId); } +get_out: this->unlock(); + unlock_jcr_chain(); } /* @@ -830,6 +843,9 @@ static int get_status_priority(int JobStatus) { int priority = 0; switch (JobStatus) { + case JS_Incomplete: + priority = 10; + break; case JS_ErrorTerminated: case JS_FatalError: case JS_Canceled: @@ -850,9 +866,8 @@ static int get_status_priority(int JobStatus) */ bool JCR::sendJobStatus() { - JCR *jcr = this; - if (jcr->dir_bsock) { - return jcr->dir_bsock->fsend(Job_status, jcr->Job, jcr->JobStatus); + if (dir_bsock) { + return dir_bsock->fsend(Job_status, Job, JobStatus); } return true; } @@ -860,13 +875,12 @@ bool JCR::sendJobStatus() /* * Set and send Job status to Director */ -bool JCR::sendJobStatus(int newJobStatus) +bool JCR::sendJobStatus(int aJobStatus) { - JCR *jcr = this; - if (!jcr->is_JobStatus(newJobStatus)) { - setJobStatus(newJobStatus); - if (jcr->dir_bsock) { - return jcr->dir_bsock->fsend(Job_status, jcr->Job, jcr->JobStatus); + if (!is_JobStatus(aJobStatus)) { + setJobStatus(aJobStatus); + if (dir_bsock) { + return dir_bsock->fsend(Job_status, Job, JobStatus); } } return true; @@ -874,23 +888,21 @@ bool JCR::sendJobStatus(int newJobStatus) void JCR::setJobStarted() { - JCR *jcr = this; - jcr->job_started = true; - jcr->job_started_time = time(NULL); + job_started = true; + job_started_time = time(NULL); } void JCR::setJobStatus(int newJobStatus) { - JCR *jcr = this; int priority, old_priority; - int oldJobStatus = jcr->JobStatus; + int oldJobStatus = JobStatus; priority = get_status_priority(newJobStatus); old_priority = get_status_priority(oldJobStatus); Dmsg2(800, "set_jcr_job_status(%s, %c)\n", Job, newJobStatus); /* Update wait_time depending on newJobStatus and oldJobStatus */ - update_wait_time(jcr, newJobStatus); + update_wait_time(this, newJobStatus); /* * For a set of errors, ... keep the current status @@ -907,13 +919,13 @@ void JCR::setJobStatus(int newJobStatus) if (priority > old_priority || ( priority == 0 && old_priority == 0)) { Dmsg4(800, "Set new stat. old: %c,%d new: %c,%d\n", - jcr->JobStatus, old_priority, newJobStatus, priority); - jcr->JobStatus = newJobStatus; /* replace with new status */ + JobStatus, old_priority, newJobStatus, priority); + JobStatus = newJobStatus; /* replace with new status */ } - if (oldJobStatus != jcr->JobStatus) { + if (oldJobStatus != JobStatus) { Dmsg2(800, "leave setJobStatus old=%c new=%c\n", oldJobStatus, newJobStatus); -// generate_plugin_event(jcr, bEventStatusChange, NULL); +// generate_plugin_event(this, bEventStatusChange, NULL); } } @@ -1159,7 +1171,7 @@ extern "C" void timeout_handler(int sig) } /* Used to display specific daemon information after a fatal signal - * (like B_DB in the director) + * (like BDB in the director) */ #define MAX_DBG_HOOK 10 static dbg_jcr_hook_t *dbg_jcr_hooks[MAX_DBG_HOOK]; @@ -1186,6 +1198,7 @@ void dbg_jcr_add_hook(dbg_jcr_hook_t *hook) void dbg_print_jcr(FILE *fp) { char buf1[128], buf2[128], buf3[128], buf4[128]; + if (!jcrs) { return; } @@ -1195,11 +1208,8 @@ void dbg_print_jcr(FILE *fp) for (JCR *jcr = (JCR *)jcrs->first(); jcr ; jcr = (JCR *)jcrs->next(jcr)) { fprintf(fp, "threadid=%p JobId=%d JobStatus=%c jcr=%p name=%s\n", get_threadid(jcr->my_thread_id), (int)jcr->JobId, jcr->JobStatus, jcr, jcr->Job); - fprintf(fp, "threadid=%p killable=%d JobId=%d JobStatus=%c " - "jcr=%p name=%s\n", - get_threadid(jcr->my_thread_id), jcr->is_killable(), - (int)jcr->JobId, jcr->JobStatus, jcr, jcr->Job); - fprintf(fp, "\tuse_count=%i\n", jcr->use_count()); + fprintf(fp, "\tuse_count=%i killable=%d\n", + jcr->use_count(), jcr->is_killable()); fprintf(fp, "\tJobType=%c JobLevel=%c\n", jcr->getJobType(), jcr->getJobLevel()); bstrftime(buf1, sizeof(buf1), jcr->sched_time); diff --git a/bacula/src/lib/lex.c b/bacula/src/lib/lex.c index ead211cd2d..a337757742 100644 --- a/bacula/src/lib/lex.c +++ b/bacula/src/lib/lex.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Lexical scanner for Bacula configuration file @@ -34,7 +38,7 @@ static const int dbglvl = 5000; void scan_to_eol(LEX *lc) { int token; - Dmsg0(dbglvl, "start scan to eof\n"); + Dmsg0(dbglvl, "start scan to eol\n"); while ((token = lex_get_token(lc, T_ALL)) != T_EOL) { if (token == T_EOB) { lex_unget_char(lc); @@ -127,7 +131,9 @@ LEX *lex_close_file(LEX *lf) fclose(lf->fd); } Dmsg1(dbglvl, "Close cfg file %s\n", lf->fname); - free(lf->fname); + if (lf->fname) { + free(lf->fname); + } free_memory(lf->line); lf->line = NULL; free_memory(lf->str); @@ -146,6 +152,56 @@ LEX *lex_close_file(LEX *lf) return lf; } +/* + * Open a configuration in memory buffer. We push the + * state of the current file (lf) so that we + * can do includes. This is a bit of a hammer. + * Instead of passing back the pointer to the + * new packet, I simply replace the contents + * of the caller's packet with the new packet, + * and link the contents of the old packet into + * the next field. + * + */ +LEX *lex_open_buf(LEX *lf, const char *buffer, LEX_ERROR_HANDLER *scan_error) + +{ + LEX *nf; + + Dmsg0(400, "Open config buffer\n"); + nf = (LEX *)malloc(sizeof(LEX)); + if (lf) { + memcpy(nf, lf, sizeof(LEX)); + memset(lf, 0, sizeof(LEX)); + lf->next = nf; /* if have lf, push it behind new one */ + lf->options = nf->options; /* preserve user options */ + /* + * preserve err_type to prevent bacula exiting on 'reload' + * if config is invalid. Fixes bug #877 + */ + lf->err_type = nf->err_type; + } else { + lf = nf; /* start new packet */ + memset(lf, 0, sizeof(LEX)); + lex_set_error_handler_error_type(lf, M_ERROR_TERM); + } + if (scan_error) { + lf->scan_error = scan_error; + } else { + lex_set_default_error_handler(lf); + } + lf->fd = NULL; + lf->bpipe = NULL; + lf->fname = NULL; + lf->line = get_memory(5000); + pm_strcpy(lf->line, buffer); + pm_strcat(lf->line, ""); + lf->state = lex_none; + lf->ch = 0; + lf->str = get_memory(5000); + return lf; +} + /* * Open a new configuration file. We push the * state of the current file (lf) so that we @@ -220,7 +276,7 @@ int lex_get_char(LEX *lf) Emsg0(M_ABORT, 0, _("get_char: called after EOF." " You may have a open double quote without the closing double quote.\n")); } - if (lf->ch == L_EOL) { + if (lf->fd && lf->ch == L_EOL) { if (bfgets(lf->line, lf->fd) == NULL) { lf->ch = L_EOF; if (lf->next) { @@ -231,14 +287,32 @@ int lex_get_char(LEX *lf) lf->line_no++; lf->col_no = 0; Dmsg2(1000, "fget line=%d %s", lf->line_no, lf->line); + } else if (lf->ch == L_EOL) { + lf->line_no++; + lf->col_no++; } lf->ch = (uint8_t)lf->line[lf->col_no]; - if (lf->ch == 0) { - lf->ch = L_EOL; + if (lf->fd) { + if (lf->ch == 0) { + lf->ch = L_EOL; /* reached end of line, force bfgets */ + } else { + lf->col_no++; + } } else { - lf->col_no++; + if (lf->ch == 0) { /* End of buffer, stop scan */ + lf->ch = L_EOF; + if (lf->next) { + lex_close_file(lf); + } + return lf->ch; + } else if (lf->ch == '\n') { /* End of line */ + Dmsg0(dbglvl, "Found newline return L_EOL\n"); + lf->ch = L_EOL; + } else { + lf->col_no++; + } } - Dmsg2(dbglvl, "lex_get_char: %c %d\n", lf->ch, lf->ch); + Dmsg3(dbglvl, "lex_get_char: %c %d col=%d\n", lf->ch, lf->ch, lf->col_no); return lf->ch; } @@ -380,12 +454,12 @@ lex_get_token(LEX *lf, int expect) to tell which byte we are expecting. */ int bom_bytes_seen = 0; - Dmsg0(dbglvl, "enter lex_get_token\n"); + Dmsg1(dbglvl, "enter lex_get_token state=%s\n", lex_state_to_str(lf->state)); while (token == T_NONE) { ch = lex_get_char(lf); switch (lf->state) { case lex_none: - Dmsg2(dbglvl, "Lex state lex_none ch=%d,%x\n", ch, ch); + Dmsg2(dbglvl, "Lex state lex_none ch=%c,%d\n", ch, ch); if (B_ISSPACE(ch)) break; if (B_ISALPHA(ch)) { diff --git a/bacula/src/lib/lex.h b/bacula/src/lib/lex.h index d2568fc669..17afcda18a 100644 --- a/bacula/src/lib/lex.h +++ b/bacula/src/lib/lex.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * lex.h diff --git a/bacula/src/lib/lib.h b/bacula/src/lib/lib.h index 174e04bd39..cdeeeeeb8f 100644 --- a/bacula/src/lib/lib.h +++ b/bacula/src/lib/lib.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Library includes for Bacula lib directory @@ -59,3 +63,4 @@ #include "htable.h" #include "sellist.h" #include "protos.h" +#include "bget_msg.h" diff --git a/bacula/src/lib/lockmgr.c b/bacula/src/lib/lockmgr.c index a72dd726eb..109a7eeffb 100644 --- a/bacula/src/lib/lockmgr.c +++ b/bacula/src/lib/lockmgr.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2008-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* @@ -44,7 +48,7 @@ */ -#define _LOCKMGR_COMPLIANT +#define LOCKMGR_COMPLIANT #include "bacula.h" #undef ASSERT @@ -69,14 +73,14 @@ http://www.cs.berkeley.edu/~kamil/teaching/sp03/041403.pdf This lock manager will replace some pthread calls. It can be - enabled with _USE_LOCKMGR + enabled with USE_LOCKMGR Some part of the code can't use this manager, for example the rwlock object or the smartalloc lib. To disable LMGR, just add - _LOCKMGR_COMPLIANT before the inclusion of "bacula.h" + LOCKMGR_COMPLIANT before the inclusion of "bacula.h" cd build/src/tools - g++ -g -c lockmgr.c -I.. -I../lib -D_USE_LOCKMGR -D_TEST_IT + g++ -g -c lockmgr.c -I.. -I../lib -DUSE_LOCKMGR -D_TEST_IT g++ -o lockmgr lockmgr.o -lbac -L../lib/.libs -lssl -lpthread */ @@ -85,7 +89,7 @@ /* * pthread_mutex_lock for memory allocator and other - * parts that are _LOCKMGR_COMPLIANT + * parts that are LOCKMGR_COMPLIANT */ void lmgr_p(pthread_mutex_t *m) { @@ -107,13 +111,13 @@ void lmgr_v(pthread_mutex_t *m) } } -#ifdef _USE_LOCKMGR +#ifdef USE_LOCKMGR typedef enum { LMGR_WHITE, /* never seen */ LMGR_BLACK, /* no loop */ - LMGR_GREY /* seen before */ + LMGR_GRAY /* already seen */ } lmgr_color_t; /* @@ -207,11 +211,11 @@ static void search_all_node(dlist *g, lmgr_node_t *v, alist *ret) } } -static bool visite(dlist *g, lmgr_node_t *v) +static bool visit(dlist *g, lmgr_node_t *v) { bool ret=false; lmgr_node_t *n; - v->mark_as_seen(LMGR_GREY); + v->mark_as_seen(LMGR_GRAY); alist *d = New(alist(5, false)); /* use alist because own=false */ search_all_node(g, v, d); @@ -221,11 +225,11 @@ static bool visite(dlist *g, lmgr_node_t *v) //} foreach_alist(n, d) { - if (n->seen == LMGR_GREY) { /* already seen this node */ + if (n->seen == LMGR_GRAY) { /* already seen this node */ ret = true; goto bail_out; } else if (n->seen == LMGR_WHITE) { - if (visite(g, n)) { + if (visit(g, n)) { ret = true; goto bail_out; } @@ -242,7 +246,7 @@ static bool contains_cycle(dlist *g) lmgr_node_t *n; foreach_dlist(n, g) { if (n->seen == LMGR_WHITE) { - if (visite(g, n)) { + if (visit(g, n)) { return true; } } @@ -271,6 +275,8 @@ typedef struct static int32_t global_event_id=0; +static int global_int_thread_id=0; /* Keep an integer for each thread */ + /* Keep this number of event per thread */ #ifdef _TEST_IT # define LMGR_THREAD_EVENT_MAX 15 @@ -286,6 +292,7 @@ public: dlink link; pthread_mutex_t mutex; pthread_t thread_id; + intptr_t int_thread_id; lmgr_lock_t lock_list[LMGR_MAX_LOCK]; int current; int max; @@ -377,8 +384,13 @@ public: } void _dump(FILE *fp) { +#ifdef HAVE_WIN32 + fprintf(fp, "thread_id=%p int_threadid=%p max=%i current=%i\n", + (void *)(intptr_t)GetCurrentThreadId(), (void *)int_thread_id, max, current); +#else fprintf(fp, "threadid=%p max=%i current=%i\n", (void *)thread_id, max, current); +#endif for(int i=0; i<=current; i++) { fprintf(fp, " lock=%p state=%s priority=%i %s:%i\n", lock_list[i].lock, @@ -570,6 +582,7 @@ void lmgr_register_thread(lmgr_thread_t *item) { lmgr_p(&lmgr_global_mutex); { + item->int_thread_id = ++global_int_thread_id; global_mgr->prepend(item); } lmgr_v(&lmgr_global_mutex); @@ -590,6 +603,11 @@ void lmgr_unregister_thread(lmgr_thread_t *item) lmgr_v(&lmgr_global_mutex); } +#ifdef HAVE_WIN32 +# define TID int_thread_id +#else +# define TID thread_id +#endif /* * Search for a deadlock when it's secure to walk across * locks list. (after lmgr_detect_deadlock or a fatal signal) @@ -616,9 +634,9 @@ bool lmgr_detect_deadlock_unlocked() * */ if (lock->state == LMGR_LOCK_GRANTED) { - node = New(lmgr_node_t((void*)lock->lock, (void*)item->thread_id)); + node = New(lmgr_node_t((void*)lock->lock, (void*)item->TID)); } else if (lock->state == LMGR_LOCK_WANTED) { - node = New(lmgr_node_t((void*)item->thread_id, (void*)lock->lock)); + node = New(lmgr_node_t((void*)item->TID, (void*)lock->lock)); } if (node) { g->append(node); @@ -745,6 +763,15 @@ inline lmgr_thread_t *lmgr_get_thread_info() } } +/* On windows, the thread id is a struct, and sometime (for debug or openssl), + * we need a int + */ +intptr_t bthread_get_thread_id() +{ + lmgr_thread_t *self = lmgr_get_thread_info(); + return self->int_thread_id; +} + /* * launch once for all threads */ @@ -817,6 +844,10 @@ void lmgr_cleanup_main() } if (use_undertaker) { pthread_cancel(undertaker); +#ifdef DEVELOPER + /* Should avoid memory leak reporting */ + pthread_join(undertaker, NULL); +#endif } lmgr_cleanup_thread(); lmgr_p(&lmgr_global_mutex); @@ -1106,7 +1137,16 @@ int lmgr_thread_create(pthread_t *thread, return pthread_create(thread, attr, lmgr_thread_launcher, a); } -#else /* _USE_LOCKMGR */ +#else /* USE_LOCKMGR */ + +intptr_t bthread_get_thread_id() +{ +# ifdef HAVE_WIN32 + return (intptr_t)GetCurrentThreadId(); +# else + return (intptr_t)pthread_self(); +# endif +} /* * !!! WARNING !!! @@ -1118,7 +1158,7 @@ void dbg_print_lock(FILE *fp) Pmsg0(000, "lockmgr disabled\n"); } -#endif /* _USE_LOCKMGR */ +#endif /* USE_LOCKMGR */ #ifdef _TEST_IT diff --git a/bacula/src/lib/lockmgr.h b/bacula/src/lib/lockmgr.h index 6844eebfce..6cc2e4fddd 100644 --- a/bacula/src/lib/lockmgr.h +++ b/bacula/src/lib/lockmgr.h @@ -1,21 +1,25 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2008-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ -#ifndef _LOCKMGR_H -#define _LOCKMGR_H 1 +#ifndef LOCKMGR_H +#define LOCKMGR_H 1 #include "mutex_list.h" /* Manage mutex with priority in a central place */ @@ -26,7 +30,12 @@ void lmgr_p(pthread_mutex_t *m); void lmgr_v(pthread_mutex_t *m); -#ifdef _USE_LOCKMGR +/* + * Get integer thread id + */ +intptr_t bthread_get_thread_id(); + +#ifdef USE_LOCKMGR typedef struct bthread_mutex_t { @@ -181,17 +190,21 @@ int bthread_kill(pthread_t thread, int sig, #define bthread_cond_timedwait(x,y,z) bthread_cond_timedwait_p(x,y,z, __FILE__, __LINE__) /* - * Define _LOCKMGR_COMPLIANT to use real pthread functions + * Define LOCKMGR_COMPLIANT to use real pthread functions */ #define real_P(x) lmgr_p(&(x)) #define real_V(x) lmgr_v(&(x)) -#ifdef _LOCKMGR_COMPLIANT -# define P(x) lmgr_p(&(x)) -# define V(x) lmgr_v(&(x)) +#ifdef LOCKMGR_COMPLIANT +# define P(x) lmgr_p(&(x)) +# define pP(x) lmgr_p(x) +# define V(x) lmgr_v(&(x)) +# define pV(x) lmgr_v(x) #else -# define P(x) bthread_mutex_lock_p(&(x), __FILE__, __LINE__) -# define V(x) bthread_mutex_unlock_p(&(x), __FILE__, __LINE__) +# define P(x) bthread_mutex_lock_p(&(x), __FILE__, __LINE__) +# define pP(x) bthread_mutex_lock_p((x), __FILE__, __LINE__) +# define V(x) bthread_mutex_unlock_p(&(x), __FILE__, __LINE__) +# define pV(x) bthread_mutex_unlock_p((x), __FILE__, __LINE__) # define pthread_create(a, b, c, d) lmgr_thread_create(a,b,c,d) # define pthread_mutex_lock(x) bthread_mutex_lock(x) # define pthread_mutex_unlock(x) bthread_mutex_unlock(x) @@ -203,7 +216,7 @@ int bthread_kill(pthread_t thread, int sig, # endif #endif -#else /* _USE_LOCKMGR */ +#else /* !USE_LOCKMGR */ # define lmgr_detect_deadloc() # define lmgr_add_event_p(c, u, f, l) @@ -224,14 +237,15 @@ int bthread_kill(pthread_t thread, int sig, # define lmgr_cond_wait(a,b) pthread_cond_wait(a,b) # define lmgr_cond_timedwait(a,b,c) pthread_cond_timedwait(a,b,c) # define bthread_mutex_t pthread_mutex_t -# define P(x) lmgr_p(&(x)) -# define V(x) lmgr_v(&(x)) +# define P(x) lmgr_p(&(x)) +# define pP(x) lmgr_p((x)) +# define V(x) lmgr_v(&(x)) +# define pV(x) lmgr_v((x)) # define BTHREAD_MUTEX_PRIORITY(p) PTHREAD_MUTEX_INITIALIZER # define BTHREAD_MUTEX_NO_PRIORITY PTHREAD_MUTEX_INITIALIZER # define BTHREAD_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER # define lmgr_mutex_is_locked(m) (1) # define bthread_cond_wait_p(w, x, y, z) pthread_cond_wait(w,x) +#endif /* USE_LOCKMGR */ -#endif /* _USE_LOCKMGR */ - -#endif /* _LOCKMGR_H */ +#endif /* LOCKMGR_H */ diff --git a/bacula/src/lib/md5.c b/bacula/src/lib/md5.c index 421b7a6f58..09bafa2c1e 100644 --- a/bacula/src/lib/md5.c +++ b/bacula/src/lib/md5.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * This code implements the MD5 message-digest algorithm. @@ -161,7 +165,7 @@ void MD5Final(unsigned char digest[16], struct MD5Context *ctx) MD5Transform(ctx->buf, (uint32_t *) ctx->in); byteReverse((unsigned char *) ctx->buf, 4); memcpy(digest, ctx->buf, 16); - memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */ + memset(ctx, 0, sizeof(struct MD5Context)); /* In case it's sensitive */ } diff --git a/bacula/src/lib/md5.h b/bacula/src/lib/md5.h index 3301481f5f..a0414ba0a1 100644 --- a/bacula/src/lib/md5.h +++ b/bacula/src/lib/md5.h @@ -1,25 +1,27 @@ /* - * Bacula MD5 definitions - * - * Kern Sibbald, 2001 - * - * Version $Id$ - */ -/* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ +/* + * Bacula MD5 definitions + * + * Kern Sibbald, 2001 + */ #ifndef __BMD5_H #define __BMD5_H diff --git a/bacula/src/lib/mem_pool.c b/bacula/src/lib/mem_pool.c index 84fec5c1cf..7f8f86d906 100644 --- a/bacula/src/lib/mem_pool.c +++ b/bacula/src/lib/mem_pool.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula memory pool routines. @@ -85,6 +89,7 @@ struct abufhead { int32_t pool; /* pool */ struct abufhead *next; /* pointer to next free buffer */ int32_t bnet_size; /* dummy for bnet_send() */ + int32_t bnet_extension; /* dummy for bnet extension */ }; static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; diff --git a/bacula/src/lib/mem_pool.h b/bacula/src/lib/mem_pool.h index cc74bbeea7..0d4fccf63d 100644 --- a/bacula/src/lib/mem_pool.h +++ b/bacula/src/lib/mem_pool.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Memory Pool prototypes diff --git a/bacula/src/lib/message.c b/bacula/src/lib/message.c index fc2d1e3850..4c32a12825 100644 --- a/bacula/src/lib/message.c +++ b/bacula/src/lib/message.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula message handling routines @@ -21,15 +25,15 @@ * otherwise you may get into recursive calls if there are * errors, and that can lead to looping or deadlocks. * - * Written by Kern Sibbald, April 2000 + * Kern Sibbald, April 2000 * */ #include "bacula.h" #include "jcr.h" -sql_query_func p_sql_query = NULL; -sql_escape_func p_sql_escape = NULL; +sql_query_call p_sql_query = NULL; +sql_escape_call p_sql_escape = NULL; #define FULL_LOCATION 1 /* set for file:line in Debug messages */ @@ -43,20 +47,21 @@ const char *version = VERSION " (" BDATE ")"; const char *dist_name = DISTNAME " " DISTVER; char *exepath = (char *)NULL; char *exename = (char *)NULL; -char *catalog_db = NULL; /* database type */ +char db_engine_name[50] = {0}; /* Database engine name or type */ char con_fname[500]; /* Console filename */ char my_name[MAX_NAME_LENGTH] = {0}; /* daemon name is stored here */ char host_name[50] = {0}; /* host machine name */ char fail_time[30] = {0}; /* Time of failure */ int verbose = 0; /* increase User messages */ int64_t debug_level = 0; /* debug level */ +int64_t debug_level_tags = 0; /* debug tags */ int32_t debug_flags = 0; /* debug flags */ -int beef = BEEF; int console_msg_pending = false; utime_t daemon_start_time = 0; /* Daemon start time */ FILE *con_fd = NULL; /* Console file descriptor */ brwlock_t con_lock; /* Console lock structure */ bool dbg_timestamp = false; /* print timestamp in debug output */ +bool dbg_thread = false; /* add thread_id to details */ bool prt_kaboom = false; /* Print kaboom output */ job_code_callback_t message_job_code_callback = NULL; /* Job code callback. Only used by director. */ @@ -81,6 +86,7 @@ static bool trace = true; static bool trace = false; #endif static int hangup = 0; +static int blowup = 0; /* Constants */ const char *host_os = HOST_OS; @@ -105,16 +111,6 @@ static const char *bstrrpath(const char *start, const char *end) return end; } -/* - * Returns: 0 if not configured - * -1 on error - * 1 OK - */ -int generate_daemon_event(JCR *jcr, const char *event) -{ - return 0; -} - /* Some message class methods */ void MSGS::lock() { @@ -197,6 +193,14 @@ void set_debug_flags(char *options) dbg_timestamp = false; break; + case 'h': + dbg_thread = true; + break; + + case 'H': + dbg_thread = false; + break; + case 'c': /* truncate the trace file */ if (trace && trace_fd) { @@ -300,15 +304,11 @@ set_assert_msg(const char *file, int line, const char *msg) assert_msg = bstrdup(buf); } -void -set_db_type(const char *name) -{ - if (catalog_db != NULL) { - free(catalog_db); - } - catalog_db = bstrdup(name); -} - +void set_db_engine_name(const char *name) +{ + bstrncpy(db_engine_name, name, sizeof(db_engine_name)-1); +} + /* * Initialize message handler for a daemon or a Job * We make a copy of the MSGS resource passed, so it belows @@ -584,6 +584,7 @@ void close_msg(JCR *jcr) Dmsg1(850, "===Begin close msg resource at %p\n", msgs); cmd = get_pool_memory(PM_MESSAGE); for (d=msgs->dest_chain; d; ) { + bool success; if (d->fd) { switch (d->dest_code) { case MD_FILE: @@ -600,39 +601,18 @@ void close_msg(JCR *jcr) if (!d->fd) { break; } + success = jcr && (jcr->JobStatus == JS_Terminated || jcr->JobStatus == JS_Warnings); - switch (d->dest_code) { - case MD_MAIL_ON_ERROR: - if (jcr) { - switch (jcr->JobStatus) { - case JS_Terminated: - case JS_Warnings: - goto rem_temp_file; - default: - break; - } - } - break; - case MD_MAIL_ON_SUCCESS: - if (jcr) { - switch (jcr->JobStatus) { - case JS_Terminated: - case JS_Warnings: - break; - default: - goto rem_temp_file; - } - } - break; - default: - break; + if (d->dest_code == MD_MAIL_ON_ERROR && success) { + goto rem_temp_file; /* no mail */ + } else if (d->dest_code == MD_MAIL_ON_SUCCESS && !success) { + goto rem_temp_file; /* no mail */ } if (!(bpipe=open_mail_pipe(jcr, cmd, d))) { Pmsg0(000, _("open mail pipe failed.\n")); - goto rem_temp_file; + goto rem_temp_file; /* error get out */ } - Dmsg0(850, "Opened mail pipe\n"); len = d->max_len+10; line = get_memory(len); @@ -667,6 +647,7 @@ void close_msg(JCR *jcr) "ERR=%s\n"), cmd, be.bstrerror()); } free_memory(line); + rem_temp_file: /* Remove temp mail file */ if (d->fd) { @@ -754,11 +735,9 @@ void term_msg() if (trace_fd) { fclose(trace_fd); trace_fd = NULL; + trace = false; } - if (catalog_db) { - free(catalog_db); - catalog_db = NULL; - } + working_directory = NULL; term_last_jobs_list(); } @@ -872,10 +851,11 @@ void dispatch_message(JCR *jcr, int type, utime_t mtime, char *msg) for (d=msgs->dest_chain; d; d=d->next) { if (bit_is_set(type, d->msg_types)) { + bool ok; switch (d->dest_code) { case MD_CATALOG: char ed1[50]; - if (!jcr || !jcr->db) { + if (!jcr || !jcr->db) { break; } if (p_sql_query && p_sql_escape) { @@ -883,18 +863,17 @@ void dispatch_message(JCR *jcr, int type, utime_t mtime, char *msg) POOLMEM *esc_msg = get_pool_memory(PM_MESSAGE); int len = strlen(msg) + 1; - esc_msg = check_pool_memory_size(esc_msg, len * 2 + 1); - if (p_sql_escape(jcr, jcr->db, esc_msg, msg, len)) { - bstrutime(dt, sizeof(dt), mtime); - Mmsg(cmd, "INSERT INTO Log (JobId, Time, LogText) VALUES (%s,'%s','%s')", - edit_int64(jcr->JobId, ed1), dt, esc_msg); - if (!p_sql_query(jcr, cmd)) { - delivery_error(_("Msg delivery error: Unable to store data in database.\n")); - } - } else { - delivery_error(_("Msg delivery error: Unable to store data in database.\n")); - } - + esc_msg = check_pool_memory_size(esc_msg, len*2+1); + ok = p_sql_escape(jcr, jcr->db, esc_msg, msg, len); + if (ok) { + bstrutime(dt, sizeof(dt), mtime); + Mmsg(cmd, "INSERT INTO Log (JobId, Time, LogText) VALUES (%s,'%s','%s')", + edit_int64(jcr->JobId, ed1), dt, esc_msg); + ok = p_sql_query(jcr, cmd); + } + if (!ok) { + delivery_error(_("Message delivery error: Unable to store data in database.\n")); + } free_pool_memory(cmd); free_pool_memory(esc_msg); } @@ -1099,13 +1078,13 @@ static void pt_out(char *buf) * * If the level is negative, the details of file and line number * are not printed. + * */ void -d_msg(const char *file, int line, int64_t level, const char *fmt,...) +vd_msg(const char *file, int line, int64_t level, const char *fmt, va_list arg_ptr) { char buf[5000]; - int len; - va_list arg_ptr; + int len = 0; /* space used in buf */ bool details = true; utime_t mtime; @@ -1117,31 +1096,39 @@ d_msg(const char *file, int line, int64_t level, const char *fmt,...) if (chk_dbglvl(level)) { if (dbg_timestamp) { mtime = time(NULL); - bstrftimes(buf, sizeof(buf), mtime); + bstrftimes(buf+len, sizeof(buf)-len, mtime); len = strlen(buf); buf[len++] = ' '; - buf[len] = 0; - pt_out(buf); } #ifdef FULL_LOCATION if (details) { - len = bsnprintf(buf, sizeof(buf), "%s: %s:%d-%u ", - my_name, get_basename(file), line, get_jobid_from_tsd()); - } else { - len = 0; + if (dbg_thread) { + len += bsnprintf(buf+len, sizeof(buf)-len, "%s[%lld]: %s:%d-%u ", + my_name, bthread_get_thread_id(), + get_basename(file), line, get_jobid_from_tsd()); + } else { + len += bsnprintf(buf+len, sizeof(buf)-len, "%s: %s:%d-%u ", + my_name, get_basename(file), line, get_jobid_from_tsd()); + } } -#else - len = 0; #endif - va_start(arg_ptr, fmt); bvsnprintf(buf+len, sizeof(buf)-len, (char *)fmt, arg_ptr); - va_end(arg_ptr); pt_out(buf); } } +void +d_msg(const char *file, int line, int64_t level, const char *fmt,...) +{ + va_list arg_ptr; + va_start(arg_ptr, fmt); + vd_msg(file, line, level, fmt, arg_ptr); /* without tags */ + va_end(arg_ptr); +} + + /* * Set trace flag on/off. If argument is negative, there is no change */ @@ -1176,6 +1163,21 @@ int get_hangup(void) return hangup; } +void set_blowup(int blowup_value) +{ + if (blowup_value < 0) { + return; + } else { + blowup = blowup_value; + } +} + +int get_blowup(void) +{ + return blowup; +} + + bool get_trace(void) { return trace; @@ -1192,18 +1194,21 @@ void p_msg(const char *file, int line, int level, const char *fmt,...) { char buf[5000]; - int len; + int len = 0; /* space used in buf */ va_list arg_ptr; + if (dbg_timestamp) { + utime_t mtime = time(NULL); + bstrftimes(buf+len, sizeof(buf)-len, mtime); + len = strlen(buf); + buf[len++] = ' '; + } + #ifdef FULL_LOCATION if (level >= 0) { - len = bsnprintf(buf, sizeof(buf), "%s: %s:%d-%u ", + len += bsnprintf(buf+len, sizeof(buf)-len, "%s: %s:%d-%u ", my_name, get_basename(file), line, get_jobid_from_tsd()); - } else { - len = 0; } -#else - len = 0; #endif va_start(arg_ptr, fmt); @@ -1232,12 +1237,14 @@ t_msg(const char *file, int line, int64_t level, const char *fmt,...) va_list arg_ptr; int details = TRUE; + level = level & ~DT_ALL; /* level should be tag free */ + if (level < 0) { details = FALSE; level = -level; } - if (chk_dbglvl(level)) { + if (level <= debug_level) { if (!trace_fd) { bsnprintf(buf, sizeof(buf), "%s/%s.trace", working_directory ? working_directory : ".", my_name); trace_fd = fopen(buf, "a+b"); @@ -1318,6 +1325,7 @@ e_msg(const char *file, int line, int type, int level, const char *fmt,...) bvsnprintf(buf+len, sizeof(buf)-len, (char *)fmt, arg_ptr); va_end(arg_ptr); + pt_out(buf); dispatch_message(NULL, type, 0, buf); if (type == M_ABORT) { @@ -1457,6 +1465,10 @@ void j_msg(const char *file, int line, JCR *jcr, int type, utime_t mtime, const int i, len, maxlen; POOLMEM *pool_buf; + va_start(arg_ptr, fmt); + vd_msg(file, line, 0, fmt, arg_ptr); + va_end(arg_ptr); + pool_buf = get_pool_memory(PM_EMSG); i = Mmsg(pool_buf, "%s:%d ", get_basename(file), line); @@ -1619,6 +1631,12 @@ void Qmsg(JCR *jcr, int type, utime_t mtime, const char *fmt,...) if (!jcr) { jcr = get_jcr_from_tsd(); } + + if (jcr && type==M_FATAL) { + // TODO ASX MUST use a lock to protect access jcr->JobStatus from another thread + jcr->setJobStatus(JS_FatalError); + } + /* If no jcr or no queue or dequeuing send to syslog */ if (!jcr || !jcr->msg_queue || jcr->dequeuing_msgs) { syslog(LOG_DAEMON|LOG_ERR, "%s", item->msg); @@ -1702,10 +1720,25 @@ static struct debugtags debug_tags[] = { { NT_("memory"), DT_MEMORY, _("Debug memory allocation")}, { NT_("scheduler"), DT_SCHEDULER,_("Debug scheduler information")}, { NT_("protocol"), DT_PROTOCOL, _("Debug protocol information")}, + { NT_("snapshot"), DT_SNAPSHOT, _("Debug snapshots")}, + { NT_("asx"), DT_ASX, _("ASX personal's debugging")}, { NT_("all"), DT_ALL, _("Debug all information")}, { NULL, 0, NULL} }; +#define MAX_TAG (sizeof(debug_tags) / sizeof(struct debugtags)) + +const char *debug_get_tag(uint32_t pos, const char **desc) +{ + if (pos < MAX_TAG) { + if (desc) { + *desc = debug_tags[pos].help; + } + return debug_tags[pos].tag; + } + return NULL; +} + /* Allow +-, */ bool debug_find_tag(const char *tagname, bool add, int64_t *current_level) { @@ -1783,3 +1816,5 @@ bool debug_parse_tags(const char *options, int64_t *current_level) *current_level = level; return ret; } + +int generate_daemon_event(JCR *jcr, const char *event) { return 0; } diff --git a/bacula/src/lib/message.h b/bacula/src/lib/message.h index 382606f704..32b48453c4 100644 --- a/bacula/src/lib/message.h +++ b/bacula/src/lib/message.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Define Message Types for Bacula @@ -153,8 +157,11 @@ struct MQUEUE_ITEM { #define DT_MEMORY (1<<24) /* memory */ #define DT_SCHEDULER (1<<23) /* scheduler */ #define DT_PROTOCOL (1<<22) /* protocol */ +#define DT_SNAPSHOT (1<<19) /* Snapshot */ +#define DT_ASX (1<<16) /* used by Alain for personal debugging */ #define DT_ALL (0x7FFF0000) /* all (up to debug_level 65635, 15 flags available) */ +const char *debug_get_tag(uint32_t pos, const char **desc); bool debug_find_tag(const char *tagname, bool add, int64_t *current_level); bool debug_parse_tags(const char *options, int64_t *current_level); @@ -167,14 +174,15 @@ bool get_trace(void); void set_debug_flags(char *options); const char *get_basename(const char *pathname); -class B_DB; -typedef bool (*sql_query_func)(JCR *jcr, const char *cmd); -typedef bool (*sql_escape_func)(JCR *jcr, B_DB *db, char *snew, char *old, int len); +class BDB; /* define forward reference */ +typedef bool (*sql_query_call)(JCR *jcr, const char *cmd); +typedef bool (*sql_escape_call)(JCR *jcr, BDB *db, char *snew, char *sold, int len); -extern DLL_IMP_EXP sql_query_func p_sql_query; -extern DLL_IMP_EXP sql_escape_func p_sql_escape; +extern DLL_IMP_EXP sql_query_call p_sql_query; +extern DLL_IMP_EXP sql_escape_call p_sql_escape; extern DLL_IMP_EXP int64_t debug_level; +extern DLL_IMP_EXP int64_t debug_level_tags; extern DLL_IMP_EXP int32_t debug_flags; extern DLL_IMP_EXP bool dbg_timestamp; /* print timestamp in debug output */ extern DLL_IMP_EXP bool prt_kaboom; /* Print kaboom output */ diff --git a/bacula/src/lib/mntent_cache.c b/bacula/src/lib/mntent_cache.c deleted file mode 100644 index 0b34c704bd..0000000000 --- a/bacula/src/lib/mntent_cache.c +++ /dev/null @@ -1,484 +0,0 @@ -/* - Bacula® - The Network Backup Solution - - Copyright (C) 2009-2014 Free Software Foundation Europe e.V. - - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. - - You may use this file and others of this release according to the - license defined in the LICENSE file, which includes the Affero General - Public License, v3.0 ("AGPLv3") and some additional permissions and - terms pursuant to its AGPLv3 Section 7. - - Bacula® is a registered trademark of Kern Sibbald. -*/ - -/** - * This code implements a cache with the current mounted filesystems for which - * its uses the mostly in kernel mount information and export the different OS - * specific interfaces using a generic interface. We use a hashed cache which is - * accessed using a hash on the device id and we keep the previous cache hit as - * most of the time we get called quite a lot with most of the time the same - * device so keeping the previous cache hit we have a very optimized code path. - * - * This interface is implemented for the following OS-es: - * - * - Linux - * - HPUX - * - DARWIN (OSX) - * - IRIX - * - AIX - * - OSF1 (Tru64) - * - Solaris - * - * Currently we only use this code for Linux and OSF1 based fstype determination. - * For the other OS-es we can use the fstype present in stat structure on those OS-es. - * - * This code replaces the big switch we used before based on SUPER_MAGIC present in - * the statfs(2) structure but which need extra code for each new filesystem added to - * the OS and for Linux that tends to be often as it has quite some different filesystems. - * This new implementation should eliminate this as we use the Linux /proc/mounts in kernel - * data which automatically adds any new filesystem when added to the kernel. - */ - -/* - * Marco van Wieringen, August 2009 - */ - -#include "bacula.h" -#include "mntent_cache.h" - -#include -#include -#include -#include -#include - -#if defined(HAVE_GETMNTENT) -#if defined(HAVE_LINUX_OS) || \ - defined(HAVE_HPUX_OS) || \ - defined(HAVE_AIX_OS) -#include -#elif defined(HAVE_SUN_OS) -#include -#elif defined(HAVE_HURD_OS) -#include -#include -#endif /* HAVE_GETMNTENT */ -#elif defined(HAVE_GETMNTINFO) -#if defined(HAVE_OPENBSD_OS) -#include -#include -#elif defined(HAVE_NETBSD_OS) -#include -#include -#else -#include -#include -#include -#endif -#elif defined(HAVE_AIX_OS) -#include -#include -#elif defined(HAVE_OSF1_OS) -#include -#endif - -/* - * Protected data by mutex lock. - */ -static pthread_mutex_t mntent_cache_lock = PTHREAD_MUTEX_INITIALIZER; -static mntent_cache_entry_t *previous_cache_hit = NULL; -static htable *mntent_cache_entry_hashtable = NULL; - -/* - * Last time a rescan of the mountlist took place. - */ -static time_t last_rescan = 0; - -static const char *skipped_fs_types[] = { -#if defined(HAVE_LINUX_OS) - "rootfs", -#endif - NULL -}; - -/** - * Add a new entry to the cache. - * This function should be called with a write lock on the mntent_cache. - */ -static inline void add_mntent_mapping(uint32_t dev, - const char *special, - const char *mountpoint, - const char *fstype, - const char *mntopts) -{ - int len; - mntent_cache_entry_t *mce; - - /* - * Calculate the length of all strings so we can allocate the buffer - * as one big chunk of memory using the hash_malloc method. - */ - len = strlen(special) + 1; - len += strlen(mountpoint) + 1; - len += strlen(fstype) + 1; - if (mntopts) { - len += strlen(mntopts) + 1; - } - - /* - * We allocate all members of the hash entry in the same memory chunk. - */ - mce = (mntent_cache_entry_t *)mntent_cache_entry_hashtable->hash_malloc(sizeof(mntent_cache_entry_t) + len); - mce->dev = dev; - - mce->special = (char *)mce + sizeof(mntent_cache_entry_t); - strcpy(mce->special, special); - - mce->mountpoint = mce->special + strlen(mce->special) + 1; - strcpy(mce->mountpoint, mountpoint); - - mce->fstype = mce->mountpoint + strlen(mce->mountpoint) + 1; - strcpy(mce->fstype, fstype); - - if (mntopts) { - mce->mntopts = mce->fstype + strlen(mce->fstype) + 1; - strcpy(mce->mntopts, mntopts); - } else { - mce->mntopts = NULL; - } - - mntent_cache_entry_hashtable->insert(mce->dev, mce); -} - -static inline bool skip_fstype(const char *fstype) -{ - int i; - - for (i = 0; skipped_fs_types[i]; i++) { - if (bstrcmp(fstype, skipped_fs_types[i])) - return true; - } - - return false; -} - -/** - * OS specific function to load the different mntents into the cache. - * This function should be called with a write lock on the mntent_cache. - */ -static void refresh_mount_cache(void) -{ -#if defined(HAVE_GETMNTENT) - FILE *fp; - struct stat st; -#if defined(HAVE_LINUX_OS) || \ - defined(HAVE_HPUX_OS) || \ - defined(HAVE_IRIX_OS) || \ - defined(HAVE_AIX_OS) || \ - defined(HAVE_HURD_OS) - struct mntent *mnt; - -#if defined(HAVE_LINUX_OS) - if ((fp = setmntent("/proc/mounts", "r")) == (FILE *)NULL) { - if ((fp = setmntent(_PATH_MOUNTED, "r")) == (FILE *)NULL) { - return; - } - } -#elif defined(HAVE_HPUX_OS) - if ((fp = fopen(MNT_MNTTAB, "r")) == (FILE *)NULL) { - return; - } -#elif defined(HAVE_IRIX_OS) - if ((fp = setmntent(MOUNTED, "r")) == (FILE *)NULL) { - return; - } -#elif defined(HAVE_AIX_OS) - if ((fp = setmntent(MNTTAB, "r")) == (FILE *)NULL) { - return; - } -#elif defined(HAVE_HURD_OS) - if ((fp = setmntent(_PATH_MNTTAB, "r")) == (FILE *)NULL) { - return; - } -#endif - - while ((mnt = getmntent(fp)) != (struct mntent *)NULL) { - if (skip_fstype(mnt->mnt_type)) { - continue; - } - - if (stat(mnt->mnt_dir, &st) < 0) { - continue; - } - - add_mntent_mapping(st.st_dev, mnt->mnt_fsname, mnt->mnt_dir, mnt->mnt_type, mnt->mnt_opts); - } - - endmntent(fp); -#elif defined(HAVE_SUN_OS) - struct mnttab mnt; - - if ((fp = fopen(MNTTAB, "r")) == (FILE *)NULL) - return; - - while (getmntent(fp, &mnt) == 0) { - if (skip_fstype(mnt.mnt_fstype)) { - continue; - } - - if (stat(mnt.mnt_mountp, &st) < 0) { - continue; - } - - add_mntent_mapping(st.st_dev, mnt.mnt_special, mnt.mnt_mountp, mnt.mnt_fstype, mnt.mnt_mntopts); - } - - fclose(fp); -#endif /* HAVE_SUN_OS */ -#elif defined(HAVE_GETMNTINFO) - int cnt; - struct stat st; -#if defined(HAVE_NETBSD_OS) - struct statvfs *mntinfo; -#else - struct statfs *mntinfo; -#endif -#if defined(ST_NOWAIT) - int flags = ST_NOWAIT; -#elif defined(MNT_NOWAIT) - int flags = MNT_NOWAIT; -#else - int flags = 0; -#endif - - if ((cnt = getmntinfo(&mntinfo, flags)) > 0) { - while (cnt > 0) { - if (!skip_fstype(mntinfo->f_fstypename) && - stat(mntinfo->f_mntonname, &st) == 0) { - add_mntent_mapping(st.st_dev, - mntinfo->f_mntfromname, - mntinfo->f_mntonname, - mntinfo->f_fstypename, - NULL); - } - mntinfo++; - cnt--; - } - } -#elif defined(HAVE_AIX_OS) - int bufsize; - char *entries, *current; - struct vmount *vmp; - struct stat st; - struct vfs_ent *ve; - int n_entries, cnt; - - if (mntctl(MCTL_QUERY, sizeof(bufsize), (struct vmount *)&bufsize) != 0) { - return; - } - - entries = malloc(bufsize); - if ((n_entries = mntctl(MCTL_QUERY, bufsize, (struct vmount *) entries)) < 0) { - free(entries); - return; - } - - cnt = 0; - current = entries; - while (cnt < n_entries) { - vmp = (struct vmount *)current; - - if (skip_fstype(ve->vfsent_name)) { - continue; - } - - if (stat(current + vmp->vmt_data[VMT_STUB].vmt_off, &st) < 0) { - continue; - } - - ve = getvfsbytype(vmp->vmt_gfstype); - if (ve && ve->vfsent_name) { - add_mntent_mapping(st.st_dev, - current + vmp->vmt_data[VMT_OBJECT].vmt_off, - current + vmp->vmt_data[VMT_STUB].vmt_off, - ve->vfsent_name, - current + vmp->vmt_data[VMT_ARGS].vmt_off); - } - current = current + vmp->vmt_length; - cnt++; - } - free(entries); -#elif defined(HAVE_OSF1_OS) - struct statfs *entries, *current; - struct stat st; - int n_entries, cnt; - int size; - - if ((n_entries = getfsstat((struct statfs *)0, 0L, MNT_NOWAIT)) < 0) { - return; - } - - size = (n_entries + 1) * sizeof(struct statfs); - entries = malloc(size); - - if ((n_entries = getfsstat(entries, size, MNT_NOWAIT)) < 0) { - free(entries); - return; - } - - cnt = 0; - current = entries; - while (cnt < n_entries) { - if (skip_fstype(current->f_fstypename)) { - continue; - } - - if (stat(current->f_mntonname, &st) < 0) { - continue; - } - add_mntent_mapping(st.st_dev, - current->f_mntfromname, - current->f_mntonname, - current->f_fstypename, - NULL); - current++; - cnt++; - } - free(stats); -#endif -} - -/** - * Clear the cache (either by flushing it or by initializing it.) - * This function should be called with a write lock on the mntent_cache. - */ -static void clear_mount_cache() -{ - mntent_cache_entry_t *mce = NULL; - - if (!mntent_cache_entry_hashtable) { - /** - * Initialize the hash table. - */ - mntent_cache_entry_hashtable = (htable *)malloc(sizeof(htable)); - mntent_cache_entry_hashtable->init(mce, &mce->link, - NR_MNTENT_CACHE_ENTRIES, - NR_MNTENT_HTABLE_PAGES); - } else { - /** - * Clear the previous_cache_hit. - */ - previous_cache_hit = NULL; - - /** - * Destroy the current content and (re)initialize the hashtable. - */ - mntent_cache_entry_hashtable->destroy(); - mntent_cache_entry_hashtable->init(mce, &mce->link, - NR_MNTENT_CACHE_ENTRIES, - NR_MNTENT_HTABLE_PAGES); - } -} - -/** - * Initialize the cache for use. - * This function should be called with a write lock on the mntent_cache. - */ -static void initialize_mntent_cache(void) -{ - /** - * Make sure the cache is empty (either by flushing it or by initializing it.) - */ - clear_mount_cache(); - - /** - * Refresh the cache. - */ - refresh_mount_cache(); -} - -/** - * Flush the current content from the cache. - */ -void flush_mntent_cache(void) -{ - /** - * Lock the cache. - */ - P(mntent_cache_lock); - - if (mntent_cache_entry_hashtable) { - previous_cache_hit = NULL; - mntent_cache_entry_hashtable->destroy(); - mntent_cache_entry_hashtable = NULL; - } - - V(mntent_cache_lock); -} - -/** - * Find a mapping in the cache. - */ -mntent_cache_entry_t *find_mntent_mapping(uint32_t dev) -{ - mntent_cache_entry_t *mce = NULL; - time_t now; - - /** - * Lock the cache. - */ - P(mntent_cache_lock); - - /** - * Shortcut when we get a request for the same device again. - */ - if (previous_cache_hit && previous_cache_hit->dev == dev) { - mce = previous_cache_hit; - goto ok_out; - } - - /** - * Initialize the cache if that was not done before. - */ - if (!mntent_cache_entry_hashtable) { - initialize_mntent_cache(); - last_rescan = time(NULL); - } else { - /** - * We rescan the mountlist when called when more then - * MNTENT_RESCAN_INTERVAL seconds have past since the - * last rescan. This way we never work with data older - * then MNTENT_RESCAN_INTERVAL seconds. - */ - now = time(NULL); - if ((now - last_rescan) > MNTENT_RESCAN_INTERVAL) { - initialize_mntent_cache(); - } - } - - mce = (mntent_cache_entry_t *)mntent_cache_entry_hashtable->lookup(dev); - - /** - * If we fail to lookup the mountpoint its probably a mountpoint added - * after we did our initial scan. Lets rescan the mountlist and try - * the lookup again. - */ - if (!mce) { - initialize_mntent_cache(); - mce = (mntent_cache_entry_t *)mntent_cache_entry_hashtable->lookup(dev); - } - - /* - * Store the last successfull lookup as the previous_cache_hit. - */ - if (mce) { - previous_cache_hit = mce; - } - -ok_out: - V(mntent_cache_lock); - return mce; -} diff --git a/bacula/src/lib/mntent_cache.h b/bacula/src/lib/mntent_cache.h deleted file mode 100644 index 9a064fb591..0000000000 --- a/bacula/src/lib/mntent_cache.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - Bacula® - The Network Backup Solution - - Copyright (C) 2009-2014 Free Software Foundation Europe e.V. - - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. - - You may use this file and others of this release according to the - license defined in the LICENSE file, which includes the Affero General - Public License, v3.0 ("AGPLv3") and some additional permissions and - terms pursuant to its AGPLv3 Section 7. - - Bacula® is a registered trademark of Kern Sibbald. -*/ - -/* - * Marco van Wieringen, August 2009 - */ - -#ifndef _MNTENT_CACHE_H -#define _MNTENT_CACHE_H 1 - -/* - * Don't use the mountlist data when its older then this amount - * of seconds but perform a rescan of the mountlist. - */ -#define MNTENT_RESCAN_INTERVAL 1800 - -/* - * Initial size of number of hash entries we expect in the cache. - * If more are needed the hash table will grow as needed. - */ -#define NR_MNTENT_CACHE_ENTRIES 256 - -/* - * Number of pages to allocate for the big_buffer used by htable. - */ -#define NR_MNTENT_HTABLE_PAGES 32 - -struct mntent_cache_entry_t { - hlink link; - uint32_t dev; - char *special; - char *mountpoint; - char *fstype; - char *mntopts; -}; - -mntent_cache_entry_t *find_mntent_mapping(uint32_t dev); -void flush_mntent_cache(void); - -#endif /* _MNTENT_CACHE_H */ diff --git a/bacula/src/lib/mutex_list.h b/bacula/src/lib/mutex_list.h index ab76b14cf3..11a2ee743e 100644 --- a/bacula/src/lib/mutex_list.h +++ b/bacula/src/lib/mutex_list.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2009-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ #ifndef MUTEX_LIST_H diff --git a/bacula/src/lib/openssl.c b/bacula/src/lib/openssl.c index 647f38eff1..985a78a46e 100644 --- a/bacula/src/lib/openssl.c +++ b/bacula/src/lib/openssl.c @@ -1,25 +1,27 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2005-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * openssl.c OpenSSL support functions * * Author: Landon Fuller * - * Version $Id$ - * * This file was contributed to the Bacula project by Landon Fuller. * * Landon Fuller has been granted a perpetual, worldwide, non-exclusive, @@ -38,6 +40,9 @@ #ifdef HAVE_OPENSSL +/* Are we initialized? */ +static int crypto_initialized = false; + /* Array of mutexes for use with OpenSSL static locking */ static pthread_mutex_t *mutexes; @@ -82,9 +87,6 @@ void openssl_post_errors(JCR *jcr, int code, const char *errstring) */ static unsigned long get_openssl_thread_id(void) { -#ifdef HAVE_WIN32 - return (unsigned long)getpid(); -#else /* * Comparison without use of pthread_equal() is mandated by the OpenSSL API * @@ -92,7 +94,6 @@ static unsigned long get_openssl_thread_id(void) * emulation code, which defines pthread_t as a structure. */ return ((unsigned long)pthread_self()); -#endif } /* @@ -254,4 +255,81 @@ int openssl_save_prng (void) return 1; } +/* + * Perform global initialization of OpenSSL + * This function is not thread safe. + * Returns: 0 on success + * errno on failure + */ +int init_crypto (void) +{ + int stat; + + if ((stat = openssl_init_threads()) != 0) { + berrno be; + Jmsg1(NULL, M_ABORT, 0, + _("Unable to init OpenSSL threading: ERR=%s\n"), be.bstrerror(stat)); + } + + /* Load libssl and libcrypto human-readable error strings */ + SSL_load_error_strings(); + + /* Initialize OpenSSL SSL library */ + SSL_library_init(); + + /* Register OpenSSL ciphers and digests */ + OpenSSL_add_all_algorithms(); + + if (!openssl_seed_prng()) { + Jmsg0(NULL, M_ERROR_TERM, 0, _("Failed to seed OpenSSL PRNG\n")); + } + + crypto_initialized = true; + + return stat; +} + +/* + * Perform global cleanup of OpenSSL + * All cryptographic operations must be completed before calling this function. + * This function is not thread safe. + * Returns: 0 on success + * errno on failure + */ +int cleanup_crypto (void) +{ + /* + * Ensure that we've actually been initialized; Doing this here decreases the + * complexity of client's termination/cleanup code. + */ + if (!crypto_initialized) { + return 0; + } + + if (!openssl_save_prng()) { + Jmsg0(NULL, M_ERROR, 0, _("Failed to save OpenSSL PRNG\n")); + } + + openssl_cleanup_threads(); + + /* Free libssl and libcrypto error strings */ + ERR_free_strings(); + + /* Free all ciphers and digests */ + EVP_cleanup(); + + /* Free memory used by PRNG */ + RAND_cleanup(); + + crypto_initialized = false; + + return 0; +} + +#else + +/* Dummy routines */ +int init_crypto (void) { return 0; } +int cleanup_crypto (void) { return 0; } + #endif /* HAVE_OPENSSL */ diff --git a/bacula/src/lib/openssl.h b/bacula/src/lib/openssl.h index 339fafe079..4e93cf0e5b 100644 --- a/bacula/src/lib/openssl.h +++ b/bacula/src/lib/openssl.h @@ -1,25 +1,27 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2005-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * openssl.h OpenSSL support functions * * Author: Landon Fuller * - * Version $Id$ - * * This file was contributed to the Bacula project by Landon Fuller. * * Landon Fuller has been granted a perpetual, worldwide, non-exclusive, diff --git a/bacula/src/lib/parse_conf.c b/bacula/src/lib/parse_conf.c index b75786fb5b..eb86e8aae4 100644 --- a/bacula/src/lib/parse_conf.c +++ b/bacula/src/lib/parse_conf.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Master Configuration routines. @@ -86,22 +90,22 @@ static bool find_config_file(const char *config_file, char *full_path, int max_p * name handler value code flags default_value */ RES_ITEM msgs_items[] = { - {"name", store_name, ITEM(res_msgs.hdr.name), 0, 0, 0}, - {"description", store_str, ITEM(res_msgs.hdr.desc), 0, 0, 0}, - {"mailcommand", store_str, ITEM(res_msgs.mail_cmd), 0, 0, 0}, - {"operatorcommand", store_str, ITEM(res_msgs.operator_cmd), 0, 0, 0}, - {"syslog", store_msgs, ITEM(res_msgs), MD_SYSLOG, 0, 0}, - {"mail", store_msgs, ITEM(res_msgs), MD_MAIL, 0, 0}, - {"mailonerror", store_msgs, ITEM(res_msgs), MD_MAIL_ON_ERROR, 0, 0}, - {"mailonsuccess", store_msgs, ITEM(res_msgs), MD_MAIL_ON_SUCCESS, 0, 0}, - {"file", store_msgs, ITEM(res_msgs), MD_FILE, 0, 0}, - {"append", store_msgs, ITEM(res_msgs), MD_APPEND, 0, 0}, - {"stdout", store_msgs, ITEM(res_msgs), MD_STDOUT, 0, 0}, - {"stderr", store_msgs, ITEM(res_msgs), MD_STDERR, 0, 0}, - {"director", store_msgs, ITEM(res_msgs), MD_DIRECTOR, 0, 0}, - {"console", store_msgs, ITEM(res_msgs), MD_CONSOLE, 0, 0}, - {"operator", store_msgs, ITEM(res_msgs), MD_OPERATOR, 0, 0}, - {"catalog", store_msgs, ITEM(res_msgs), MD_CATALOG, 0, 0}, + {"Name", store_name, ITEM(res_msgs.hdr.name), 0, 0, 0}, + {"Description", store_str, ITEM(res_msgs.hdr.desc), 0, 0, 0}, + {"MailCommand", store_str, ITEM(res_msgs.mail_cmd), 0, 0, 0}, + {"OperatorCommand", store_str, ITEM(res_msgs.operator_cmd), 0, 0, 0}, + {"Syslog", store_msgs, ITEM(res_msgs), MD_SYSLOG, 0, 0}, + {"Mail", store_msgs, ITEM(res_msgs), MD_MAIL, 0, 0}, + {"MailOnError", store_msgs, ITEM(res_msgs), MD_MAIL_ON_ERROR, 0, 0}, + {"MailOnSuccess", store_msgs, ITEM(res_msgs), MD_MAIL_ON_SUCCESS, 0, 0}, + {"File", store_msgs, ITEM(res_msgs), MD_FILE, 0, 0}, + {"Append", store_msgs, ITEM(res_msgs), MD_APPEND, 0, 0}, + {"Stdout", store_msgs, ITEM(res_msgs), MD_STDOUT, 0, 0}, + {"Stderr", store_msgs, ITEM(res_msgs), MD_STDERR, 0, 0}, + {"Director", store_msgs, ITEM(res_msgs), MD_DIRECTOR, 0, 0}, + {"Console", store_msgs, ITEM(res_msgs), MD_CONSOLE, 0, 0}, + {"Operator", store_msgs, ITEM(res_msgs), MD_OPERATOR, 0, 0}, + {"Catalog", store_msgs, ITEM(res_msgs), MD_CATALOG, ITEM_LAST, 0}, {NULL, NULL, {0}, 0, 0, 0} }; @@ -111,40 +115,35 @@ struct s_mtypes { }; /* Various message types */ static struct s_mtypes msg_types[] = { - {"debug", M_DEBUG}, - {"abort", M_ABORT}, - {"fatal", M_FATAL}, - {"error", M_ERROR}, - {"warning", M_WARNING}, - {"info", M_INFO}, - {"saved", M_SAVED}, - {"notsaved", M_NOTSAVED}, - {"skipped", M_SKIPPED}, - {"mount", M_MOUNT}, - {"terminate", M_TERM}, - {"restored", M_RESTORED}, - {"security", M_SECURITY}, - {"alert", M_ALERT}, - {"volmgmt", M_VOLMGMT}, - {"all", M_MAX+1}, + {"Debug", M_DEBUG}, + {"Abort", M_ABORT}, + {"Fatal", M_FATAL}, + {"Error", M_ERROR}, + {"Warning", M_WARNING}, + {"Info", M_INFO}, + {"Saved", M_SAVED}, + {"NotSaved", M_NOTSAVED}, + {"Skipped", M_SKIPPED}, + {"Mount", M_MOUNT}, + {"Terminate", M_TERM}, + {"Restored", M_RESTORED}, + {"Security", M_SECURITY}, + {"Alert", M_ALERT}, + {"VolMgmt", M_VOLMGMT}, + {"ErrorTerm", M_ERROR_TERM}, + {"All", M_MAX+1}, {NULL, 0} }; -/* Used for certain KeyWord tables */ -struct s_kw { - const char *name; - int token; -}; - /* * Tape Label types permitted in Pool records * * tape label label code = token */ -static s_kw tapelabels[] = { - {"bacula", B_BACULA_LABEL}, - {"ansi", B_ANSI_LABEL}, - {"ibm", B_IBM_LABEL}, +s_kw tapelabels[] = { + {"Bacula", B_BACULA_LABEL}, + {"ANSI", B_ANSI_LABEL}, + {"IBM", B_IBM_LABEL}, {NULL, 0} }; @@ -544,15 +543,20 @@ void store_alist_str(LEX *lc, RES_ITEM *item, int index, int pass) if (pass == 2) { if (*(item->value) == NULL) { list = New(alist(10, owned_by_alist)); + *(item->value) = (char *)list; } else { list = (alist *)(*(item->value)); } - - lex_get_token(lc, T_STRING); /* scan next item */ - Dmsg4(900, "Append %s to alist %p size=%d %s\n", - lc->str, list, list->size(), item->name); - list->append(bstrdup(lc->str)); - *(item->value) = (char *)list; + for (;;) { + lex_get_token(lc, T_STRING); /* scan next item */ + Dmsg4(900, "Append %s to alist 0x%p size=%d %s\n", + lc->str, list, list->size(), item->name); + list->append(bstrdup(lc->str)); + if (lc->ch != ',') { /* if no other item follows */ + break; /* get out */ + } + lex_get_token(lc, T_ALL); /* eat comma */ + } } scan_to_eol(lc); set_bit(index, res_all.hdr.item_present); @@ -840,21 +844,6 @@ void CONFIG::init( * Note, the default behavior unless you have set an alternate * scan_error handler is to die on an error. */ -#ifdef xxx -int -parse_config(const char *cf, LEX_ERROR_HANDLER *scan_error, int err_type) -{ - int ok; - CONFIG *config = new_config_parser(); - config->init(cf, scan_error, err_type, (void *)&res_all, res_all_size, - r_first, r_last, resources, res_head); - ok = config->parse_config(); - free(config); - return ok; -} -#endif - - bool CONFIG::parse_config() { LEX *lc = NULL; @@ -1031,28 +1020,7 @@ bail_out: const char *get_default_configdir() { -#if defined(HAVE_WIN32) - HRESULT hr; - static char szConfigDir[MAX_PATH + 1] = { 0 }; - - if (!p_SHGetFolderPath) { - bstrncpy(szConfigDir, DEFAULT_CONFIGDIR, sizeof(szConfigDir)); - return szConfigDir; - } - - if (szConfigDir[0] == '\0') { - hr = p_SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, szConfigDir); - - if (SUCCEEDED(hr)) { - bstrncat(szConfigDir, "\\Bacula", sizeof(szConfigDir)); - } else { - bstrncpy(szConfigDir, DEFAULT_CONFIGDIR, sizeof(szConfigDir)); - } - } - return szConfigDir; -#else return SYSCONFDIR; -#endif } /* diff --git a/bacula/src/lib/parse_conf.h b/bacula/src/lib/parse_conf.h index 88ac9d240d..2eaf51c49d 100644 --- a/bacula/src/lib/parse_conf.h +++ b/bacula/src/lib/parse_conf.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -19,6 +23,12 @@ * */ +/* Used for certain keyword tables */ +struct s_kw { + const char *name; + uint32_t token; +}; + struct RES_ITEM; /* Declare forward referenced structure */ struct RES_ITEM2; /* Declare forward referenced structure */ class RES; /* Declare forware referenced structure */ @@ -113,6 +123,7 @@ struct RES_TABLE { #define ITEM_REQUIRED 0x1 /* item required */ #define ITEM_DEFAULT 0x2 /* default supplied */ #define ITEM_NO_EQUALS 0x4 /* Don't scan = after name */ +#define ITEM_LAST 0x8 /* Last item in list */ /* Message Resource */ class MSGS { diff --git a/bacula/src/lib/plugins.c b/bacula/src/lib/plugins.c index fef2787f33..95ec2b1de1 100644 --- a/bacula/src/lib/plugins.c +++ b/bacula/src/lib/plugins.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Plugin load/unloader for all Bacula daemons @@ -43,7 +47,7 @@ static const int dbglvl = 50; * NOTE!!! This is a global do not try walking it with * foreach_alist, you must use foreach_alist_index !!!!!! */ -alist *bplugin_list = NULL; +alist *b_plugin_list = NULL; /* * Create a new plugin "class" entry and enter it in the @@ -194,7 +198,7 @@ bool load_plugins(void *binfo, void *bfuncs, const char *plugin_dir, } found = true; /* found a plugin */ - bplugin_list->append(plugin); + b_plugin_list->append(plugin); } get_out: @@ -217,10 +221,10 @@ void unload_plugins() { Plugin *plugin; - if (!bplugin_list) { + if (!b_plugin_list) { return; } - foreach_alist(plugin, bplugin_list) { + foreach_alist(plugin, b_plugin_list) { /* Shut it down and unload it */ plugin->unloadPlugin(); dlclose(plugin->pHandle); @@ -229,8 +233,8 @@ void unload_plugins() } free(plugin); } - delete bplugin_list; - bplugin_list = NULL; + delete b_plugin_list; + b_plugin_list = NULL; } /* @@ -251,12 +255,12 @@ void dbg_plugin_add_hook(dbg_plugin_hook_t *fct) void dbg_print_plugin(FILE *fp) { Plugin *plugin; - fprintf(fp, "Attempt to dump plugins. Hook count=%d\n", dbg_plugin_hook_count); + fprintf(fp, "List plugins. Hook count=%d\n", dbg_plugin_hook_count); - if (!bplugin_list) { + if (!b_plugin_list) { return; } - foreach_alist(plugin, bplugin_list) { + foreach_alist(plugin, b_plugin_list) { for(int i=0; i < dbg_plugin_hook_count; i++) { // dbg_plugin_hook_t *fct = dbg_plugin_hooks[i]; fprintf(fp, "Plugin %p name=\"%s\" disabled=%d\n", diff --git a/bacula/src/lib/plugins.h b/bacula/src/lib/plugins.h index b5f90210c7..cd5470d22a 100644 --- a/bacula/src/lib/plugins.h +++ b/bacula/src/lib/plugins.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Common plugin definitions @@ -28,7 +32,7 @@ ****************************************************************************/ #ifndef BUILD_PLUGIN -extern DLL_IMP_EXP alist *bplugin_list; +extern DLL_IMP_EXP alist *b_plugin_list; #endif /* Universal return codes from all plugin functions */ diff --git a/bacula/src/lib/priv.c b/bacula/src/lib/priv.c index 08f625e9cc..663b466b91 100644 --- a/bacula/src/lib/priv.c +++ b/bacula/src/lib/priv.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ #include "bacula.h" diff --git a/bacula/src/lib/protos.h b/bacula/src/lib/protos.h index 2e3f09b6fe..c26df09b81 100644 --- a/bacula/src/lib/protos.h +++ b/bacula/src/lib/protos.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Prototypes for lib directory of Bacula @@ -42,6 +46,8 @@ int bin_to_base64 (char *buf, int buflen, char *bin, int binlen, int base64_to_bin(char *dest, int destlen, char *src, int srclen); /* bsys.c */ +int copyfile(const char *src, const char *dst); +void setup_env(char *envp[]); POOLMEM *quote_string (POOLMEM *snew, const char *old); POOLMEM *quote_where (POOLMEM *snew, const char *old); char *bstrncpy (char *dest, const char *src, int maxlen); @@ -61,6 +67,7 @@ void *bcalloc (size_t size1, size_t size2); int bsnprintf (char *str, int32_t size, const char *format, ...); int bvsnprintf (char *str, int32_t size, const char *format, va_list ap); int pool_sprintf (char *pool_buf, const char *fmt, ...); +int create_lock_file (char *fname, const char *progname, const char *filetype, POOLMEM **errmsg); void create_pid_file (char *dir, const char *progname, int port); int delete_pid_file (char *dir, const char *progname, int port); void drop (char *uid, char *gid, bool keep_readall_caps); @@ -78,6 +85,7 @@ int Zdeflate(char *in, int in_len, char *out, int &out_len); int Zinflate(char *in, int in_len, char *out, int &out_len); void stack_trace(); int safer_unlink(const char *pathname, const char *regex); +int fs_get_free_space(const char *path, int64_t *freeval, int64_t *totalval); /* bnet.c */ bool bnet_tls_server (TLS_CONTEXT *ctx, BSOCK *bsock, @@ -95,7 +103,7 @@ int bnet_get_peer (BSOCK *bs, char *buf, socklen_t buflen); BSOCK * dup_bsock (BSOCK *bsock); void term_bsock (BSOCK *bsock); const char *bnet_strerror (BSOCK *bsock); -const char *bnet_sig_to_ascii (BSOCK *bsock); +const char *bnet_sig_to_ascii (int32_t msglen); dlist *bnet_host2ipaddrs(const char *host, int family, const char **errstr); void bnet_restore_blocking (BSOCK *sock, int flags); int set_socket_errno(int sockstat); @@ -104,7 +112,7 @@ int set_socket_errno(int sockstat); int bget_msg(BSOCK *sock); /* bpipe.c */ -BPIPE * open_bpipe(char *prog, int wait, const char *mode); +BPIPE * open_bpipe(char *prog, int wait, const char *mode, char *envp[]=NULL); int close_wpipe(BPIPE *bpipe); int close_bpipe(BPIPE *bpipe); @@ -115,7 +123,7 @@ void hmac_md5(uint8_t* text, int text_len, uint8_t* key, int key_len, uint8_t *h /* crc32.c */ -uint32_t bcrc32(uint8_t *buf, int len); +uint32_t bcrc32(unsigned char *buf, int len); /* crypto.c */ int init_crypto (void); @@ -199,6 +207,7 @@ uint32_t get_jobid_from_tid(pthread_t tid); /* lex.c */ LEX * lex_close_file (LEX *lf); LEX * lex_open_file (LEX *lf, const char *fname, LEX_ERROR_HANDLER *scan_error); +LEX * lex_open_buf (LEX *lf, const char *buf, LEX_ERROR_HANDLER *scan_error); int lex_get_char (LEX *lf); void lex_unget_char (LEX *lf); const char * lex_tok_to_str (int token); @@ -223,23 +232,26 @@ void dispatch_message (JCR *jcr, int type, utime_t mtime, char *buf); void init_console_msg (const char *wd); void free_msgs_res (MSGS *msgs); void dequeue_messages (JCR *jcr); +void set_db_engine_name (const char *name); void set_trace (int trace_flag); bool get_trace (void); void set_hangup (int hangup_value); +void set_blowup (int blowup_value); int get_hangup (void); -void set_db_type (const char *name); +int get_blowup (void); void set_assert_msg (const char *file, int line, const char *msg); void register_message_callback(void msg_callback(int type, char *msg)); /* bnet_server.c */ -void bnet_thread_server(dlist *addr_list, int max_clients, workq_t *client_wq, - void *handle_client_request(void *bsock)); +void bnet_thread_server(dlist *addr_list, int max_clients, + workq_t *client_wq, void *handle_client_request(void *bsock)); void bnet_stop_thread_server(pthread_t tid); void bnet_server (int port, void handle_client_request(BSOCK *bsock)); int net_connect (int port); BSOCK * bnet_bind (int port); BSOCK * bnet_accept (BSOCK *bsock, char *who); +/* message.c */ typedef int (EVENT_HANDLER)(JCR *jcr, const char *event); int generate_daemon_event(JCR *jcr, const char *event); @@ -285,6 +297,7 @@ TLS_CONNECTION *new_tls_connection (TLS_CONTEXT *ctx, int fd); bool tls_bsock_accept (BSOCK *bsock); int tls_bsock_writen (BSOCK *bsock, char *ptr, int32_t nbytes); int tls_bsock_readn (BSOCK *bsock, char *ptr, int32_t nbytes); +bool tls_bsock_probe (BSOCK *bsock); #endif /* HAVE_TLS */ bool tls_bsock_connect (BSOCK *bsock); void tls_bsock_shutdown (BSOCK *bsock); @@ -294,7 +307,7 @@ bool get_tls_enable (TLS_CONTEXT *ctx); /* util.c */ -bool is_buf_zero (char *buf, int len); +bool is_buf_zero (const char *buf, int len); void lcase (char *str); void bash_spaces (char *str); void bash_spaces (POOL_MEM &pm); @@ -302,14 +315,17 @@ void unbash_spaces (char *str); void unbash_spaces (POOL_MEM &pm); char * encode_time (utime_t time, char *buf); char * encode_mode (mode_t mode, char *buf); +char * hexdump(const char *data, int len, char *buf, int capacity); +char * asciidump(const char *data, int len, char *buf, int capacity); +char * smartdump(const char *data, int len, char *buf, int capacity, bool *is_ascii=NULL); int do_shell_expansion (char *name, int name_len); void jobstatus_to_ascii (int JobStatus, char *msg, int maxlen); void jobstatus_to_ascii_gui (int JobStatus, char *msg, int maxlen); int run_program (char *prog, int wait, POOLMEM *&results); -int run_program_full_output (char *prog, int wait, POOLMEM *&results); +int run_program_full_output (char *prog, int wait, POOLMEM *&results, char *env[]=NULL); char * action_on_purge_to_string(int aop, POOL_MEM &ret); const char * job_type_to_str (int type); -const char * job_status_to_str (int stat); +const char * job_status_to_str (int stat, int errors); const char * job_level_to_str (int level); const char * volume_status_to_str (const char *status); void make_session_key (char *key, char *seed, int mode); diff --git a/bacula/src/lib/queue.c b/bacula/src/lib/queue.c index bc64f02a35..4ad37b04ce 100644 --- a/bacula/src/lib/queue.c +++ b/bacula/src/lib/queue.c @@ -1,32 +1,35 @@ /* + Bacula(R) - The Network Backup Solution - Q U E U E - Queue Handling Routines - - Taken from smartall written by John Walker. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - http://www.fourmilab.ch/smartall/ + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. + You may use this file and others of this release according to the + license defined in the LICENSE file, which includes the Affero General + Public License, v3.0 ("AGPLv3") and some additional permissions and + terms pursuant to its AGPLv3 Section 7. + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - Bacula® - The Network Backup Solution - Copyright (C) 2000-2014 Free Software Foundation Europe e.V. + Q U E U E + Queue Handling Routines - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + Taken from smartall written by John Walker. - You may use this file and others of this release according to the - license defined in the LICENSE file, which includes the Affero General - Public License, v3.0 ("AGPLv3") and some additional permissions and - terms pursuant to its AGPLv3 Section 7. + http://www.fourmilab.ch/smartall/ - Bacula® is a registered trademark of Kern Sibbald. -*/ +*/ + #include "bacula.h" /* General purpose queue */ diff --git a/bacula/src/lib/queue.h b/bacula/src/lib/queue.h index f8d9ecc53c..a3fa685999 100644 --- a/bacula/src/lib/queue.h +++ b/bacula/src/lib/queue.h @@ -1,24 +1,25 @@ /* - * Written by John Walker MM - * - * Version $Id$ - */ -/* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ +/* + * Written by John Walker MM + */ /* General purpose queue */ diff --git a/bacula/src/lib/rblist.c b/bacula/src/lib/rblist.c index 81ef484159..04a142b406 100644 --- a/bacula/src/lib/rblist.c +++ b/bacula/src/lib/rblist.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2005-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula red-black binary tree routines. @@ -370,7 +374,7 @@ void rblist::destroy() #ifdef TEST_PROGRAM struct MYJCR { - void link; + rblink link; char *buf; }; diff --git a/bacula/src/lib/rblist.h b/bacula/src/lib/rblist.h index d804cd2513..d4e1de1741 100644 --- a/bacula/src/lib/rblist.h +++ b/bacula/src/lib/rblist.h @@ -1,23 +1,22 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2005-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ - -/* - * Version $Id$ - */ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ /* ======================================================================== * * red-black binary tree routines -- rblist.h diff --git a/bacula/src/lib/res.c b/bacula/src/lib/res.c index 9ee51f10b0..dff2006c13 100644 --- a/bacula/src/lib/res.c +++ b/bacula/src/lib/res.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * This file handles locking and seaching resources diff --git a/bacula/src/lib/runscript.c b/bacula/src/lib/runscript.c index 595021bc5a..95536ab51a 100644 --- a/bacula/src/lib/runscript.c +++ b/bacula/src/lib/runscript.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2006-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Manipulation routines for RunScript list diff --git a/bacula/src/lib/runscript.h b/bacula/src/lib/runscript.h index 2adb2549e6..900c15c1e0 100644 --- a/bacula/src/lib/runscript.h +++ b/bacula/src/lib/runscript.h @@ -1,22 +1,25 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2006-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula RUNSCRIPT Structure definition for FileDaemon and Director * Eric Bollengier May 2006 - * Version $Id$ */ @@ -46,7 +49,7 @@ enum { SCRIPT_Never = 0, SCRIPT_After = (1<<0), /* AfterJob */ SCRIPT_Before = (1<<1), /* BeforeJob */ - SCRIPT_AfterVSS = (1<<2), /* BeforeJob and After VSS */ + SCRIPT_AfterVSS = (1<<2), /* BeforeJob and After VSS */ SCRIPT_Any = SCRIPT_Before | SCRIPT_After }; diff --git a/bacula/src/lib/rwlock.c b/bacula/src/lib/rwlock.c index a077a66ad8..cbad3be4ae 100644 --- a/bacula/src/lib/rwlock.c +++ b/bacula/src/lib/rwlock.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula Thread Read/Write locking code. It permits @@ -26,7 +30,7 @@ * */ -#define _LOCKMGR_COMPLIANT +#define LOCKMGR_COMPLIANT #include "bacula.h" /* @@ -101,11 +105,6 @@ int rwl_destroy(brwlock_t *rwl) return (stat != 0 ? stat : (stat1 != 0 ? stat1 : stat2)); } -bool rwl_is_init(brwlock_t *rwl) -{ - return (rwl->valid == RWLOCK_VALID); -} - /* * Handle cleanup when the read lock condition variable * wait is released. @@ -314,6 +313,12 @@ int rwl_writeunlock(brwlock_t *rwl) return (stat == 0 ? stat2 : stat); } +bool is_rwl_valid(brwlock_t *rwl) +{ + return (rwl->valid == RWLOCK_VALID); +} + + #ifdef TEST_RWLOCK #define THREADS 300 @@ -437,14 +442,11 @@ int main (int argc, char *argv[]) int thread_writes = 0; int data_writes = 0; -#ifdef USE_THR_SETCONCURRENCY /* - * On Solaris 2.5,2.6,7 and 8 threads are not timesliced. To ensure - * that our threads can run concurrently, we need to - * increase the concurrency level to THREADS. + * For Solaris 2.5,2.6,7 and 8 threads are not timesliced. + * Ensure our threads can run concurrently. */ - thr_setconcurrency (THREADS); -#endif + thr_setconcurrency(THREADS); /* Only implemented on Solaris */ /* * Initialize the shared data. @@ -520,7 +522,7 @@ int main (int argc, char *argv[]) * * Demonstrate use of non-blocking read-write locks. * - * Special notes: On older Solaris system, call thr_setconcurrency() + * On older Solaris systems, call thr_setconcurrency() * to allow interleaved thread execution, since threads are not * timesliced. */ @@ -610,15 +612,12 @@ int main (int argc, char *argv[]) int thread_updates = 0, data_updates = 0; int status; -#ifdef USE_THR_SETCONCURRENCY /* - * On Solaris 2.5,2.6,7 and 8 threads are not timesliced. To ensure - * that our threads can run concurrently, we need to - * increase the concurrency level to THREADS. + * For Solaris 2.5,2.6,7 and 8 threads are not timesliced. + * Ensure our threads can run concurrently. */ DPRINTF (("Setting concurrency level to %d\n", THREADS)); - thr_setconcurrency (THREADS); -#endif + thr_setconcurrency(THREADS); /* Only implemented on Solaris */ /* * Initialize the shared data. diff --git a/bacula/src/lib/rwlock.h b/bacula/src/lib/rwlock.h index ee5c947c27..f6a1178e96 100644 --- a/bacula/src/lib/rwlock.h +++ b/bacula/src/lib/rwlock.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula Thread Read/Write locking code. It permits @@ -21,9 +25,6 @@ * * This code adapted from "Programming with POSIX Threads", by * David R. Butenhof - * - * Version $Id$ - * */ #ifndef __RWLOCK_H @@ -61,7 +62,6 @@ typedef struct s_rwsteal_tag { */ extern int rwl_init(brwlock_t *wrlock, int priority=0); extern int rwl_destroy(brwlock_t *rwlock); -extern bool rwl_is_init(brwlock_t *rwl); extern int rwl_readlock(brwlock_t *rwlock); extern int rwl_readtrylock(brwlock_t *rwlock); extern int rwl_readunlock(brwlock_t *rwlock); @@ -69,5 +69,6 @@ extern int rwl_writelock_p(brwlock_t *rwlock, const char *file="*unknown*", int line=0); extern int rwl_writetrylock(brwlock_t *rwlock); extern int rwl_writeunlock(brwlock_t *rwlock); +extern bool is_rwl_valid(brwlock_t *rwl); #endif /* __RWLOCK_H */ diff --git a/bacula/src/lib/scan.c b/bacula/src/lib/scan.c index 158136577b..bbedc68c14 100644 --- a/bacula/src/lib/scan.c +++ b/bacula/src/lib/scan.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * scan.c -- scanning routines for Bacula @@ -20,17 +24,15 @@ * */ + #include "bacula.h" #include "jcr.h" #include "findlib/find.h" -/* - * Strip leading space from command line arguments - */ +/* Strip leading space from command line arguments */ void strip_leading_space(char *str) { char *p = str; - while (B_ISSPACE(*p)) { p++; } @@ -39,49 +41,35 @@ void strip_leading_space(char *str) } } -/* - * Strip any trailing junk from the command - */ + +/* Strip any trailing junk from the command */ void strip_trailing_junk(char *cmd) { char *p; - /* - * Strip trailing junk from command - */ - p = cmd + strlen(cmd) - 1; - while ((p >= cmd) && (*p == '\n' || *p == '\r' || *p == ' ')) { + /* strip trailing junk from command */ + p = cmd - 1 + strlen(cmd); + while ((p >= cmd) && (B_ISSPACE(*p) || *p == '\n' || *p == '\r')) { *p-- = 0; - } + } } -/* - * Strip any trailing newline characters from the string - */ +/* Strip any trailing newline characters from the string */ void strip_trailing_newline(char *cmd) { char *p; - - p = cmd + strlen(cmd) - 1; - while ((p >= cmd) && (*p == '\n' || *p == '\r')) { - *p-- = 0; - } + p = cmd - 1 + strlen(cmd); + while ((p >= cmd) && (*p == '\n' || *p == '\r')) *p-- = 0; } -/* - * Strip any trailing slashes from a directory path - */ +/* Strip any trailing slashes from a directory path */ void strip_trailing_slashes(char *dir) { char *p; - /* - * Strip trailing slashes - */ - p = dir + strlen(dir) - 1; - while (p >= dir && IsPathSeparator(*p)) { - *p-- = 0; - } + /* strip trailing slashes */ + p = dir -1 + strlen(dir); + while (p >= dir && IsPathSeparator(*p)) *p-- = 0; } /* @@ -123,10 +111,9 @@ bool skip_nonspaces(char **msg) return *p ? true : false; } -/* - * Folded search for string - case insensitive - */ -int fstrsch(const char *a, const char *b) /* folded case search */ +/* folded search for string - case insensitive */ +int +fstrsch(const char *a, const char *b) /* folded case search */ { const char *s1,*s2; char c1, c2; @@ -153,6 +140,7 @@ int fstrsch(const char *a, const char *b) /* folded case search */ return 1; } + /* * Return next argument from command line. Note, this * routine is destructive because it stored 0 at the end @@ -280,9 +268,7 @@ int parse_args_only(POOLMEM *cmd, POOLMEM **args, int *argc, strip_trailing_junk(*args); p = *args; *argc = 0; - /* - * Pick up all arguments - */ + /* Pick up all arguments */ while (*argc < max_args) { n = next_arg(&p); if (*n) { @@ -295,13 +281,14 @@ int parse_args_only(POOLMEM *cmd, POOLMEM **args, int *argc, return 1; } + /* * Given a full filename, split it into its path * and filename parts. They are returned in pool memory * in the arguments provided. */ void split_path_and_filename(const char *fname, POOLMEM **path, int *pnl, - POOLMEM **file, int *fnl) + POOLMEM **file, int *fnl) { const char *f; int slen; diff --git a/bacula/src/lib/sellist.c b/bacula/src/lib/sellist.c index 0997068996..7fb221e987 100644 --- a/bacula/src/lib/sellist.c +++ b/bacula/src/lib/sellist.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2011-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Kern Sibbald, January MMXII diff --git a/bacula/src/lib/sellist.h b/bacula/src/lib/sellist.h index 18389e9319..e0386a13c2 100644 --- a/bacula/src/lib/sellist.h +++ b/bacula/src/lib/sellist.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2011-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Kern Sibbald, January MMXII diff --git a/bacula/src/lib/serial.c b/bacula/src/lib/serial.c index 560c6d60c8..2375ba6f5d 100644 --- a/bacula/src/lib/serial.c +++ b/bacula/src/lib/serial.c @@ -1,22 +1,26 @@ /* + Bacula(R) - The Network Backup Solution - Serialisation Support Functions - John Walker -*/ -/* - Bacula® - The Network Backup Solution - + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. +*/ +/* + + Serialisation Support Functions + John Walker */ @@ -216,6 +220,29 @@ uint32_t unserial_uint32(uint8_t * * const ptr) return ntohl(vo); } +/* unserial_int64 -- Unserialise a 64 bit integer. */ + +int64_t unserial_int64(uint8_t * * const ptr) +{ + int64_t v; + + if (bigendian()) { + memcpy(&v, *ptr, sizeof(int64_t)); + } else { + int i; + uint8_t rv[sizeof(int64_t)]; + uint8_t *pv = (uint8_t *) &v; + + memcpy(&v, *ptr, sizeof(uint64_t)); + for (i = 0; i < 8; i++) { + rv[i] = pv[7 - i]; + } + memcpy(&v, &rv, sizeof(uint64_t)); + } + *ptr += sizeof(uint64_t); + return v; +} + /* unserial_uint64 -- Unserialise an unsigned 64 bit integer. */ uint64_t unserial_uint64(uint8_t * * const ptr) diff --git a/bacula/src/lib/serial.h b/bacula/src/lib/serial.h index fe73914ff3..75324b3c34 100644 --- a/bacula/src/lib/serial.h +++ b/bacula/src/lib/serial.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -67,12 +71,17 @@ extern void unserial_string(uint8_t * * const ptr, char * const str, int max); #define unser_length(x) ((uint32_t)(ser_ptr - (uint8_t *)(x))) /* ser_end(x, s) -- End serialisation into a buffer x of size s. */ -#define ser_end(x, s) ASSERT(ser_length(x) <= (s)) -#define unser_end(x, s) ASSERT(ser_length(x) <= (s)) +#define ser_end(x, s) ASSERT(ser_length(x) <= ((uint32_t)(s))) +#define unser_end(x, s) ASSERT(unser_length(x) <= ((uint32_t)(s))) /* ser_check(x, s) -- Verify length of serialised data in buffer x is expected length s. */ -#define ser_check(x, s) ASSERT(ser_length(x) == (s)) +#define ser_check(x, s) ASSERT(ser_length(x) == ((uint32_t)(s))) +#define unser_check(x, s) ASSERT(unser_length(x) == ((uint32_t)(s))) + +/* ser_assign(ptr, len) -- assign current position to ptr and go len bytes forward */ +#define ser_assign(ptr, len) { ptr = (typeof(ptr))ser_ptr; ser_ptr += (len); } +#define unser_assign(ptr, len) { ptr = (typeof(ptr))ser_ptr; ser_ptr += (len); } /* Serialisation */ diff --git a/bacula/src/lib/signal.c b/bacula/src/lib/signal.c index e23f27481f..a9c4d1aee3 100644 --- a/bacula/src/lib/signal.c +++ b/bacula/src/lib/signal.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Signal handlers for Bacula daemons @@ -85,7 +89,7 @@ static void dbg_print_bacula() fprintf(stderr, "Dumping: %s\n", buf); - /* Print also B_DB and RWLOCK structure + /* Print also BDB and RWLOCK structure * Can add more info about JCR with dbg_jcr_add_hook() */ dbg_print_lock(fp); @@ -140,7 +144,7 @@ extern "C" void signal_handler(int sig) } already_dead++; /* Don't use Emsg here as it may lock and thus block us */ - if (sig == SIGTERM) { + if (sig == SIGTERM || sig == SIGINT) { syslog(LOG_DAEMON|LOG_ERR, "Shutting down Bacula service: %s ...\n", my_name); } else { fprintf(stderr, _("Bacula interrupted by signal %d: %s\n"), sig, get_signal_name(sig)); @@ -152,7 +156,7 @@ extern "C" void signal_handler(int sig) } #ifdef TRACEBACK - if (sig != SIGTERM) { + if (sig != SIGTERM && sig != SIGINT) { struct sigaction sigdefault; static char *argv[5]; static char pid_buf[20]; @@ -247,7 +251,7 @@ extern "C" void signal_handler(int sig) #ifdef direct_print if (prt_kaboom) { FILE *fd; - snprintf(buf, sizeof(buf), "%s/bacula.%s.traceback", working_directory, pid_buf); + snprintf(buf, sizeof(buf), "%s/%s.%s.traceback", working_directory, my_name, pid_buf); fd = fopen(buf, "r"); if (fd != NULL) { printf("\n\n ==== Traceback output ====\n\n"); @@ -260,7 +264,7 @@ extern "C" void signal_handler(int sig) } #else if (prt_kaboom) { - snprintf(buf, sizeof(buf), "/bin/cat %s/bacula.%s.traceback", working_directory, pid_buf); + snprintf(buf, sizeof(buf), "/bin/cat %s/%s.%s.traceback", working_directory, my_name, pid_buf); fprintf(stderr, "\n\n ==== Traceback output ====\n\n"); system(buf); fprintf(stderr, " ==== End traceback output ====\n\n"); @@ -387,7 +391,7 @@ void init_signals(void terminate(int sig)) sigaction(SIGWINCH, &sigignore, NULL); sigaction(SIGIO, &sighandle, NULL); - sigaction(SIGINT, &sigdefault, NULL); + sigaction(SIGINT, &sighandle, NULL); sigaction(SIGXCPU, &sigdefault, NULL); sigaction(SIGXFSZ, &sigdefault, NULL); diff --git a/bacula/src/lib/smartall.c b/bacula/src/lib/smartall.c index b515419d62..6f77db113f 100644 --- a/bacula/src/lib/smartall.c +++ b/bacula/src/lib/smartall.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* @@ -30,7 +34,7 @@ */ -#define _LOCKMGR_COMPLIANT +#define LOCKMGR_COMPLIANT #include "bacula.h" /* Use the real routines here */ @@ -132,7 +136,7 @@ static void *smalloc(const char *fname, int lineno, unsigned int nbytes) } else { Emsg0(M_ABORT, 0, _("Out of memory\n")); } - Dmsg4(DT_MEMORY|50, "smalloc %d at %p from %s:%d\n", nbytes, buf, fname, lineno); + Dmsg4(DT_MEMORY|1050, "smalloc %d at %p from %s:%d\n", nbytes, buf, fname, lineno); #if SMALLOC_SANITY_CHECK > 0 if (sm_bytes > SMALLOC_SANITY_CHECK) { Emsg0(M_ABORT, 0, _("Too much memory used.")); @@ -147,9 +151,11 @@ static void *smalloc(const char *fname, int lineno, unsigned int nbytes) void sm_new_owner(const char *fname, int lineno, char *buf) { buf -= HEAD_SIZE; /* Decrement to header */ + P(mutex); ((struct abufhead *)buf)->abfname = bufimode ? NULL : fname; ((struct abufhead *)buf)->ablineno = (uint32_t) lineno; ((struct abufhead *)buf)->abin_use = true; + V(mutex); return; } @@ -173,13 +179,13 @@ void sm_free(const char *file, int line, void *fp) struct abufhead *head = (struct abufhead *)cp; P(mutex); - Dmsg4(DT_MEMORY|50, "sm_free %d at %p from %s:%d\n", + Dmsg4(DT_MEMORY|1050, "sm_free %d at %p from %s:%d\n", head->ablen, fp, get_basename(head->abfname), head->ablineno); if (!head->abin_use) { V(mutex); - Emsg2(M_ABORT, 0, _("double free from %s:%d\n"), file, lineno); + Emsg2(M_ABORT, 0, _("in-use bit not set: double free from %s:%d\n"), file, lineno); } head->abin_use = false; @@ -276,7 +282,7 @@ void *sm_realloc(const char *fname, int lineno, void *ptr, unsigned int size) void *buf; char *cp = (char *) ptr; - Dmsg4(DT_MEMORY|50, "sm_realloc %s:%d %p %d\n", get_basename(fname), (uint32_t)lineno, ptr, size); + Dmsg4(DT_MEMORY|1050, "sm_realloc %s:%d %p %d\n", get_basename(fname), (uint32_t)lineno, ptr, size); if (size <= 0) { e_msg(fname, lineno, M_ABORT, 0, _("sm_realloc size: %d\n"), size); } @@ -316,7 +322,7 @@ void *sm_realloc(const char *fname, int lineno, void *ptr, unsigned int size) /* All done. Free and dechain the original buffer. */ sm_free(fname, lineno, ptr); } - Dmsg4(DT_MEMORY|60, _("sm_realloc %d at %p from %s:%d\n"), size, buf, get_basename(fname), (uint32_t)lineno); + Dmsg4(DT_MEMORY|1060, _("sm_realloc %d at %p from %s:%d\n"), size, buf, get_basename(fname), (uint32_t)lineno); return buf; } @@ -347,7 +353,7 @@ void *actuallycalloc(unsigned int nelem, unsigned int elsize) void *actuallyrealloc(void *ptr, unsigned int size) { - Dmsg2(DT_MEMORY|40, "Actuallyrealloc %p %d\n", ptr, size); + Dmsg2(DT_MEMORY|1040, "Actuallyrealloc %p %d\n", ptr, size); return realloc(ptr, size); } diff --git a/bacula/src/lib/smartall.h b/bacula/src/lib/smartall.h index de2a0402f2..d40c731dca 100644 --- a/bacula/src/lib/smartall.h +++ b/bacula/src/lib/smartall.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* diff --git a/bacula/src/lib/status.h b/bacula/src/lib/status.h index 8dacd1800b..5028480a87 100644 --- a/bacula/src/lib/status.h +++ b/bacula/src/lib/status.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2008-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Status packet definition that is used in both the SD and FD. It @@ -21,8 +25,6 @@ * * Kern Sibbald, March MMVII * - * Version $Id: $ - * */ #ifndef __STATUS_H_ @@ -62,6 +64,9 @@ static void sendit(const char *msg, int len, STATUS_PKT *sp) } } +#ifndef STATUS_FUNCTIONS +#define STATUS_FUNCTIONS + /* common to SD/FD */ static void list_terminated_jobs(STATUS_PKT *sp) { @@ -117,6 +122,8 @@ static void list_terminated_jobs(STATUS_PKT *sp) case JS_Warnings: termstat = _("OK -- with warnings"); break; + case JS_Incomplete: + termstat = _("Incomplete"); break; default: termstat = _("Other"); @@ -217,5 +224,6 @@ done: #endif /* HAVE_WIN32 */ +#endif /* ! STATUS_FUNCTIONS */ #endif diff --git a/bacula/src/lib/tls.c b/bacula/src/lib/tls.c index 42c542aee4..0c9c761dcd 100644 --- a/bacula/src/lib/tls.c +++ b/bacula/src/lib/tls.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2005-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * tls.c TLS support functions @@ -56,6 +60,8 @@ struct TLS_Context { struct TLS_Connection { SSL *openssl; + pthread_mutex_t wlock; /* make openssl_bsock_readwrite() atomic when writing */ + pthread_mutex_t rwlock; /* only one SSL_read() or SSL_write() at a time */ }; /* @@ -462,6 +468,9 @@ TLS_CONNECTION *new_tls_connection(TLS_CONTEXT *ctx, int fd) /* Non-blocking partial writes */ SSL_set_mode(tls->openssl, SSL_MODE_ENABLE_PARTIAL_WRITE|SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER); + pthread_mutex_init(&tls->wlock, NULL); + pthread_mutex_init(&tls->rwlock, NULL); + return tls; err: @@ -477,6 +486,8 @@ err: */ void free_tls_connection(TLS_CONNECTION *tls) { + pthread_mutex_destroy(&tls->rwlock); + pthread_mutex_destroy(&tls->wlock); SSL_free(tls->openssl); free(tls); } @@ -653,12 +664,18 @@ static inline int openssl_bsock_readwrite(BSOCK *bsock, char *ptr, int nbytes, b nleft = nbytes; + if (write) { + pthread_mutex_lock(&tls->wlock); + } while (nleft > 0) { + + pthread_mutex_lock(&tls->rwlock); if (write) { nwritten = SSL_write(tls->openssl, ptr, nleft); } else { nwritten = SSL_read(tls->openssl, ptr, nleft); } + pthread_mutex_unlock(&tls->rwlock); /* Handle errors */ switch (SSL_get_error(tls->openssl, nwritten)) { @@ -721,6 +738,9 @@ static inline int openssl_bsock_readwrite(BSOCK *bsock, char *ptr, int nbytes, b } cleanup: + if (write) { + pthread_mutex_unlock(&tls->wlock); + } /* Restore saved flags */ bsock->restore_blocking(flags); @@ -743,6 +763,14 @@ int tls_bsock_readn(BSOCK *bsock, char *ptr, int32_t nbytes) return openssl_bsock_readwrite(bsock, ptr, nbytes, false); } +/* test if 4 bytes can be read without "blocking" */ +bool tls_bsock_probe(BSOCK *bsock) +{ + int32_t pktsiz; + return SSL_peek(bsock->tls->openssl, &pktsiz, sizeof(pktsiz))==sizeof(pktsiz); +} + + #else /* HAVE_OPENSSL */ # error No TLS implementation available. #endif /* !HAVE_OPENSSL */ diff --git a/bacula/src/lib/tls.h b/bacula/src/lib/tls.h index e9c90ebcfb..5747dddbc6 100644 --- a/bacula/src/lib/tls.h +++ b/bacula/src/lib/tls.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 2005-2014 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * tls.h TLS support functions diff --git a/bacula/src/lib/tree.c b/bacula/src/lib/tree.c index 1012f17e0c..81fdfe564a 100644 --- a/bacula/src/lib/tree.c +++ b/bacula/src/lib/tree.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Directory tree build/traverse routines @@ -91,7 +95,7 @@ TREE_ROOT *new_tree(int count) root->type = TN_ROOT; root->fname = ""; HL_ENTRY* entry = NULL; - root->hardlinks.init(entry, &entry->link, 0, 1); + root->hardlinks.init(entry, &entry->link, 0); return root; } diff --git a/bacula/src/lib/tree.h b/bacula/src/lib/tree.h index f2e7ec6418..dd70d2f282 100644 --- a/bacula/src/lib/tree.h +++ b/bacula/src/lib/tree.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Directory tree build/traverse routines diff --git a/bacula/src/lib/util.c b/bacula/src/lib/util.c index c64e2224c7..4267354336 100644 --- a/bacula/src/lib/util.c +++ b/bacula/src/lib/util.c @@ -1,24 +1,26 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * util.c miscellaneous utility subroutines for Bacula * * Kern Sibbald, MM - * - * Version $Id$ */ #include "bacula.h" @@ -31,10 +33,10 @@ */ /* Return true of buffer has all zero bytes */ -bool is_buf_zero(char *buf, int len) +bool is_buf_zero(const char *buf, int len) { uint64_t *ip; - char *p; + const char *p; int i, len64, done, rem; if (buf[0] != 0) { @@ -155,6 +157,95 @@ char *encode_time(utime_t utime, char *buf) +static char hexatable[]="0123456789abcdef"; + +/* + * do an hexadump of data[0:len] into buf[0:capacity] + * a space is inserted between every 4 bytes + * usage: + * char buf[10]; + * Dmsg2("msglen=%d msg=%s", fd->msglen, hexdump(fd->msg, fd->msglen, buf, sizeof(buf)); + * ==> + * msglen=36 msg=12345678 12345678 + */ +char *hexdump(const char *data, int len, char *buf, int capacity) +{ + char *b=buf; + int i=0; + while (i2) { + if (i>0 && i%4==0) { + *(b++)=' '; + capacity--; + } + if (capacity>2) { + *(b++)=hexatable[(data[i]&0xF0)>>4]; + *(b++)=hexatable[data[i++]&0x0F]; + } + capacity-=2; + } + *b='\0'; + return buf; +} + +/* + * do an ASCII dump of data[0:len] into buf[0:capacity] + * non printable chars are replaced by hexa "\xx" + * usage: + * char buf[10]; + * Dmsg2("msglen=%d msg=%s", fd->msglen, asciidump(fd->msg, fd->msglen, buf, sizeof(buf)); + * ==> + * msglen=5 msg=abcd\10 + */ +char *asciidump(const char *data, int len, char *buf, int capacity) +{ + char *b=buf; + const unsigned char *p=(const unsigned char *)data; + while (len>0 && capacity>1) { + if (isprint(*p)) { + *(b++)=*(p++); + capacity--; + } else { + if (capacity>3) { + *(b++)='\\'; + *(b++)=hexatable[((*p)&0xF0)>>4]; + *(b++)=hexatable[(*(p++))&0x0F]; + } + capacity-=3; + } + len--; + } + *b='\0'; + return buf; +} + +char *smartdump(const char *data, int len, char *buf, int capacity, bool *is_ascii) +{ + char *b=buf; + int l=len; + int c=capacity; + const unsigned char *p=(const unsigned char *)data; + if (is_ascii != NULL) { + *is_ascii = false; + } + while (l>0 && c>1) { + if (isprint(*p)) { + *(b++)=*(p++); + } else if (isspace(*p) || *p=='\0') { + *(b++)=' '; + p++; + } else { + return hexdump(data, len, buf, capacity); + } + c--; + l--; + } + *b='\0'; + if (is_ascii != NULL) { + *is_ascii = true; + } + return buf; +} + /* * Convert a JobStatus code into a human readable form */ @@ -176,6 +267,9 @@ void jobstatus_to_ascii(int JobStatus, char *msg, int maxlen) case JS_Terminated: jobstat = _("OK"); break; + case JS_Incomplete: + jobstat = _("Incomplete job"); + break; case JS_FatalError: case JS_ErrorTerminated: jobstat = _("Error"); @@ -296,17 +390,20 @@ void jobstatus_to_ascii_gui(int JobStatus, char *msg, int maxlen) } } - /* * Convert Job Termination Status into a string */ -const char *job_status_to_str(int stat) +const char *job_status_to_str(int status, int errors) { const char *str; - switch (stat) { + switch (status) { case JS_Terminated: - str = _("OK"); + if (errors > 0) { + str = _("OK -- with warnings"); + } else { + str = _("OK"); + } break; case JS_Warnings: str = _("OK -- with warnings"); @@ -707,6 +804,8 @@ void decode_session_key(char *decode, char *session, char *key, int maxlen) * %v = Volume name * %b = Job Bytes * %F = Job Files + * %E = Job Errors + * %R = Job ReadBytes * * omsg = edited output message * imsg = input string containing edit codes (%x) @@ -741,11 +840,14 @@ POOLMEM *edit_job_codes(JCR *jcr, char *omsg, char *imsg, const char *to, job_co break; case 'e': if (jcr) { - str = job_status_to_str(jcr->JobStatus); + str = job_status_to_str(jcr->JobStatus, jcr->getErrors()); } else { str = _("*none*"); } break; + case 'E': /* Job Errors */ + str = edit_uint64(jcr->getErrors(), add); + break; case 'i': if (jcr) { bsnprintf(add, sizeof(add), "%d", jcr->JobId); @@ -820,6 +922,9 @@ POOLMEM *edit_job_codes(JCR *jcr, char *omsg, char *imsg, const char *to, job_co edit_uint64(getpid(), add); str = add; break; + case 'R': /* Job ReadBytes */ + str = edit_uint64(jcr->ReadBytes, add); + break; default: str = NULL; if (callback != NULL) { diff --git a/bacula/src/lib/var.c b/bacula/src/lib/var.c index 3e52682df8..644afda95c 100644 --- a/bacula/src/lib/var.c +++ b/bacula/src/lib/var.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2003-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* ** OSSP var - Variable Expansion @@ -1863,6 +1867,7 @@ lookup_value( if (ctx->rel_lookup_flag && rc == VAR_ERR_UNDEFINED_VARIABLE) { ctx->rel_lookup_cnt--; buf[0] = EOS; + /* ****FIXME**** passing back stack variable!!! */ *val_ptr = buf; *val_len = 0; *val_size = 0; @@ -2403,7 +2408,7 @@ var_create( return VAR_RC(VAR_ERR_INVALID_ARGUMENT); if ((var = (var_t *)malloc(sizeof(var_t))) == NULL) return VAR_RC(VAR_ERR_OUT_OF_MEMORY); - memset(var, 0, sizeof(*var)); + memset(var, 0, sizeof(var_t)); var_config(var, VAR_CONFIG_SYNTAX, &var_syntax_default); *pvar = var; return VAR_OK; @@ -2428,7 +2433,7 @@ var_config( ...) { va_list ap; - var_rc_t rc; + var_rc_t rc = VAR_OK; if (var == NULL) return VAR_RC(VAR_ERR_INVALID_ARGUMENT); diff --git a/bacula/src/lib/var.h b/bacula/src/lib/var.h index 0e6005638b..df94f867f4 100644 --- a/bacula/src/lib/var.h +++ b/bacula/src/lib/var.h @@ -1,18 +1,3 @@ -/* - Bacula® - The Network Backup Solution - - Copyright (C) 2003-2014 Free Software Foundation Europe e.V. - - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. - - You may use this file and others of this release according to the - license defined in the LICENSE file, which includes the Affero General - Public License, v3.0 ("AGPLv3") and some additional permissions and - terms pursuant to its AGPLv3 Section 7. - - Bacula® is a registered trademark of Kern Sibbald. -*/ /* ** OSSP var - Variable Expansion ** Copyright (c) 2001-2002 Ralf S. Engelschall diff --git a/bacula/src/lib/waitq.h b/bacula/src/lib/waitq.h index 69a69274e3..4059ee31d2 100644 --- a/bacula/src/lib/waitq.h +++ b/bacula/src/lib/waitq.h @@ -1,30 +1,32 @@ /* - * Bacula wait queue routines. Permits waiting for something - * to be done. I.e. for operator to mount new volume. - * - * Kern Sibbald, March MMI - * - * This code inspired from "Programming with POSIX Threads", by - * David R. Butenhof - * - * Version $Id$ - * - */ -/* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ +/* + * Bacula wait queue routines. Permits waiting for something + * to be done. I.e. for operator to mount new volume. + * + * Kern Sibbald, March MMI + * + * This code inspired from "Programming with POSIX Threads", by + * David R. Butenhof + * + */ #ifndef __WAITQ_H #define __WAITQ_H 1 diff --git a/bacula/src/lib/watchdog.c b/bacula/src/lib/watchdog.c index 97953970b1..8ee7761f6e 100644 --- a/bacula/src/lib/watchdog.c +++ b/bacula/src/lib/watchdog.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula thread watchdog routine. General routine that diff --git a/bacula/src/lib/watchdog.h b/bacula/src/lib/watchdog.h index 3688cc1280..8298d63d99 100644 --- a/bacula/src/lib/watchdog.h +++ b/bacula/src/lib/watchdog.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Watchdog timer routines diff --git a/bacula/src/lib/workq.c b/bacula/src/lib/workq.c index 6a754d1d29..36bdd5ceb1 100644 --- a/bacula/src/lib/workq.c +++ b/bacula/src/lib/workq.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula work queue routines. Permits passing work to diff --git a/bacula/src/lib/workq.h b/bacula/src/lib/workq.h index 90521cce70..9a1b405128 100644 --- a/bacula/src/lib/workq.h +++ b/bacula/src/lib/workq.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula work queue routines. Permits passing work to @@ -21,8 +25,6 @@ * * This code adapted from "Programming with POSIX Threads", by * David R. Butenhof - * - * Version $Id$ */ #ifndef __WORKQ_H diff --git a/bacula/src/plugins/Makefile b/bacula/src/plugins/Makefile index 0ebe5b65c9..2aa5d1d6ca 100644 --- a/bacula/src/plugins/Makefile +++ b/bacula/src/plugins/Makefile @@ -1,8 +1,8 @@ # # Simple Makefile for building test plugins for Bacula # -# Author: Kern Sibbald -# License: LGPLv3 +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # first_rule: all diff --git a/bacula/src/plugins/dir/Makefile.in b/bacula/src/plugins/dir/Makefile.in index 3df8580ef4..6ba512138d 100644 --- a/bacula/src/plugins/dir/Makefile.in +++ b/bacula/src/plugins/dir/Makefile.in @@ -1,8 +1,8 @@ # # Simple Makefile for building test FD plugins for Bacula # -# Author: Kern Sibbald -# License: LGPLv3 +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # @MCOMMON@ @@ -40,8 +40,7 @@ clean: @LIBTOOL_CLEAN_TARGET@ rm -f main *.so *.o 1 2 3 distclean: clean - rm -f Makefile *.la *.lo - rm -rf .libs + rm -f Makefile libtool-uninstall: $(LIBTOOL_UNINSTALL) $(RMF) $(DESTDIR)$(plugindir)/example-plugin-dir.la diff --git a/bacula/src/plugins/dir/example-plugin-dir.c b/bacula/src/plugins/dir/example-plugin-dir.c index ea32d42146..40768e43e2 100644 --- a/bacula/src/plugins/dir/example-plugin-dir.c +++ b/bacula/src/plugins/dir/example-plugin-dir.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Sample Plugin program @@ -26,7 +30,7 @@ extern "C" { #endif -#define PLUGIN_LICENSE "Bacula AGPLv3" +#define PLUGIN_LICENSE "AGPLv3" #define PLUGIN_AUTHOR "Kern Sibbald" #define PLUGIN_DATE "January 2008" #define PLUGIN_VERSION "1" @@ -79,7 +83,7 @@ bRC loadPlugin(bDirInfo *lbinfo, bDirFuncs *lbfuncs, pDirInfo **pinfo, pDirFuncs return bRC_OK; } -bRC unloadPlugin() +bRC unloadPlugin() { printf("plugin: Unloaded\n"); return bRC_OK; @@ -102,13 +106,13 @@ static bRC freePlugin(bpContext *ctx) return bRC_OK; } -static bRC getPluginValue(bpContext *ctx, pDirVariable var, void *value) +static bRC getPluginValue(bpContext *ctx, pDirVariable var, void *value) { printf("plugin: getPluginValue var=%d\n", var); return bRC_OK; } -static bRC setPluginValue(bpContext *ctx, pDirVariable var, void *value) +static bRC setPluginValue(bpContext *ctx, pDirVariable var, void *value) { printf("plugin: setPluginValue var=%d\n", var); return bRC_OK; diff --git a/bacula/src/plugins/fd/Makefile.in b/bacula/src/plugins/fd/Makefile.in index fc0fa8e501..914d865f29 100644 --- a/bacula/src/plugins/fd/Makefile.in +++ b/bacula/src/plugins/fd/Makefile.in @@ -1,8 +1,8 @@ # # Simple Makefile for building test FD plugins for Bacula # -# Author: Kern Sibbald -# License: LGPLv3 +# Copyright (C) 2000-2015 by Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # @MCOMMON@ diff --git a/bacula/src/plugins/fd/bpipe-fd.c b/bacula/src/plugins/fd/bpipe-fd.c index 3338514156..fe58a2d4a7 100644 --- a/bacula/src/plugins/fd/bpipe-fd.c +++ b/bacula/src/plugins/fd/bpipe-fd.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * A simple pipe plugin for the Bacula File Daemon @@ -35,7 +39,7 @@ extern "C" { static const int dbglvl = 150; -#define PLUGIN_LICENSE "Bacula AGPLv3" +#define PLUGIN_LICENSE "AGPLv3" #define PLUGIN_AUTHOR "Kern Sibbald" #define PLUGIN_DATE "January 2008" #define PLUGIN_VERSION "1" @@ -100,7 +104,7 @@ static pFuncs pluginFuncs = { */ struct plugin_ctx { boffset_t offset; - FILE *fd; /* pipe file descriptor */ + BPIPE *pfd; /* bpipe file descriptor */ bool backup; /* set for backup (not needed) */ char *cmd; /* plugin command line */ char *fname; /* filename to "backup/restore" */ @@ -130,16 +134,16 @@ bRC loadPlugin(bInfo *lbinfo, bFuncs *lbfuncs, pInfo **pinfo, pFuncs **pfuncs) } /* - * External entry point to unload the plugin + * External entry point to unload the plugin */ -bRC unloadPlugin() +bRC unloadPlugin() { // printf("bpipe-fd: Unloaded\n"); return bRC_OK; } /* - * The following entry points are accessed through the function + * The following entry points are accessed through the function * pointers we supplied to Bacula. Each plugin type (dir, fd, sd) * has its own set of entry points that the plugin must define. */ @@ -177,7 +181,7 @@ static bRC freePlugin(bpContext *ctx) /* * Return some plugin value (none defined) */ -static bRC getPluginValue(bpContext *ctx, pVariable var, void *value) +static bRC getPluginValue(bpContext *ctx, pVariable var, void *value) { return bRC_OK; } @@ -185,7 +189,7 @@ static bRC getPluginValue(bpContext *ctx, pVariable var, void *value) /* * Set a plugin value (none defined) */ -static bRC setPluginValue(bpContext *ctx, pVariable var, void *value) +static bRC setPluginValue(bpContext *ctx, pVariable var, void *value) { return bRC_OK; } @@ -209,7 +213,7 @@ static bRC handlePluginEvent(bpContext *ctx, bEvent *event, void *value) */ switch (event->eventType) { case bEventPluginCommand: - bfuncs->DebugMessage(ctx, fi, li, dbglvl, + bfuncs->DebugMessage(ctx, fi, li, dbglvl, "bpipe-fd: PluginCommand=%s\n", (char *)value); break; case bEventJobStart: @@ -270,7 +274,7 @@ static bRC handlePluginEvent(bpContext *ctx, bEvent *event, void *value) } *p++ = 0; /* terminate reader string */ p_ctx->writer = p; -// printf("bpipe-fd: plugin=%s fname=%s reader=%s writer=%s\n", +// printf("bpipe-fd: plugin=%s fname=%s reader=%s writer=%s\n", // p_ctx->cmd, p_ctx->fname, p_ctx->reader, p_ctx->writer); break; @@ -281,7 +285,7 @@ static bRC handlePluginEvent(bpContext *ctx, bEvent *event, void *value) return bRC_OK; } -/* +/* * Start the backup of a specific file */ static bRC startBackupFile(bpContext *ctx, struct save_pkt *sp) @@ -327,8 +331,8 @@ static bRC pluginIO(bpContext *ctx, struct io_pkt *io) if (!p_ctx) { return bRC_Error; } - - io->status = 0; + + io->status = -1; io->io_errno = 0; switch(io->func) { case IO_OPEN: @@ -336,12 +340,12 @@ static bRC pluginIO(bpContext *ctx, struct io_pkt *io) if (io->flags & (O_CREAT | O_WRONLY)) { char *writer_codes = apply_rp_codes(p_ctx); - p_ctx->fd = popen(writer_codes, "w"); - bfuncs->DebugMessage(ctx, fi, li, dbglvl, "bpipe-fd: IO_OPEN fd=%d writer=%s\n", - p_ctx->fd, writer_codes); - if (!p_ctx->fd) { + p_ctx->pfd = open_bpipe(writer_codes, 0, "ws"); + bfuncs->DebugMessage(ctx, fi, li, dbglvl, "bpipe-fd: IO_OPEN fd=%p writer=%s\n", + p_ctx->pfd, writer_codes); + if (!p_ctx->pfd) { io->io_errno = errno; - bfuncs->JobMessage(ctx, fi, li, M_FATAL, 0, + bfuncs->JobMessage(ctx, fi, li, M_FATAL, 0, "Open pipe writer=%s failed: ERR=%s\n", writer_codes, strerror(errno)); if (writer_codes) { free(writer_codes); @@ -351,85 +355,70 @@ static bRC pluginIO(bpContext *ctx, struct io_pkt *io) if (writer_codes) { free(writer_codes); } + io->status = fileno(p_ctx->pfd->wfd); } else { - p_ctx->fd = popen(p_ctx->reader, "r"); - bfuncs->DebugMessage(ctx, fi, li, dbglvl, "bpipe-fd: IO_OPEN fd=%p reader=%s\n", - p_ctx->fd, p_ctx->reader); - if (!p_ctx->fd) { + p_ctx->pfd = open_bpipe(p_ctx->reader, 0, "rs"); + bfuncs->DebugMessage(ctx, fi, li, dbglvl, "bpipe-fd: IO_OPEN fd=%p reader=%s\n", + p_ctx->pfd, p_ctx->reader); + if (!p_ctx->pfd) { io->io_errno = errno; - bfuncs->JobMessage(ctx, fi, li, M_FATAL, 0, + bfuncs->JobMessage(ctx, fi, li, M_FATAL, 0, "Open pipe reader=%s failed: ERR=%s\n", p_ctx->reader, strerror(errno)); return bRC_Error; } + io->status = fileno(p_ctx->pfd->rfd); } sleep(1); /* let pipe connect */ break; case IO_READ: - if (!p_ctx->fd) { + if (!p_ctx->pfd) { bfuncs->JobMessage(ctx, fi, li, M_FATAL, 0, "Logic error: NULL read FD\n"); return bRC_Error; } - io->status = fread(io->buf, 1, io->count, p_ctx->fd); + io->status = fread(io->buf, 1, io->count, p_ctx->pfd->rfd); // bfuncs->DebugMessage(ctx, fi, li, dbglvl, "bpipe-fd: IO_READ buf=%p len=%d\n", io->buf, io->status); - if (io->status == 0 && ferror(p_ctx->fd)) { - bfuncs->JobMessage(ctx, fi, li, M_FATAL, 0, + if (io->status == 0 && ferror(p_ctx->pfd->rfd)) { + bfuncs->JobMessage(ctx, fi, li, M_FATAL, 0, "Pipe read error: ERR=%s\n", strerror(errno)); - bfuncs->DebugMessage(ctx, fi, li, dbglvl, + bfuncs->DebugMessage(ctx, fi, li, dbglvl, "Pipe read error: ERR=%s\n", strerror(errno)); return bRC_Error; } break; case IO_WRITE: - if (!p_ctx->fd) { + if (!p_ctx->pfd) { bfuncs->JobMessage(ctx, fi, li, M_FATAL, 0, "Logic error: NULL write FD\n"); return bRC_Error; } // printf("bpipe-fd: IO_WRITE fd=%p buf=%p len=%d\n", p_ctx->fd, io->buf, io->count); - io->status = fwrite(io->buf, 1, io->count, p_ctx->fd); + io->status = fwrite(io->buf, 1, io->count, p_ctx->pfd->wfd); // printf("bpipe-fd: IO_WRITE buf=%p len=%d\n", io->buf, io->status); - if (io->status == 0 && ferror(p_ctx->fd)) { - bfuncs->JobMessage(ctx, fi, li, M_FATAL, 0, + if (io->status == 0 && ferror(p_ctx->pfd->wfd)) { + bfuncs->JobMessage(ctx, fi, li, M_FATAL, 0, "Pipe write error\n"); - bfuncs->DebugMessage(ctx, fi, li, dbglvl, + bfuncs->DebugMessage(ctx, fi, li, dbglvl, "Pipe read error: ERR=%s\n", strerror(errno)); return bRC_Error; } break; case IO_CLOSE: - if (!p_ctx->fd) { + if (!p_ctx->pfd) { bfuncs->JobMessage(ctx, fi, li, M_FATAL, 0, "Logic error: NULL FD on bpipe close\n"); return bRC_Error; } - io->status = pclose(p_ctx->fd); - - /* Problem during execution */ - if (io->status < 0) { - io->io_errno = errno; - bfuncs->JobMessage(ctx, fi, li, M_ERROR, 0, "bpipe-fd: Error closing stream for pseudo file %s: %d (%s)\n", - p_ctx->fname, io->status, strerror(errno)); - - /* Problem inside the subprogram */ - } else if (io->status > 0) { - int status=1; - if (WIFEXITED(io->status)) { /* process exit()ed */ - status = WEXITSTATUS(io->status); - - } else if (WIFSIGNALED(io->status)) { /* process died */ -#ifndef HAVE_WIN32 - status = WTERMSIG(io->status); -#endif - } - bfuncs->DebugMessage(ctx, fi, li, dbglvl, "bpipe-fd: exit=%d\n", io->status); - bfuncs->JobMessage(ctx, fi, li, M_ERROR, 0, "bpipe-fd: Error closing stream for pseudo file %s: exit %d\n", - p_ctx->fname, status); + io->status = close_bpipe(p_ctx->pfd); + if (io->status != 0) { + bfuncs->JobMessage(ctx, fi, li, M_ERROR, 0, "bpipe-fd: Error closing for file %s: %d\n", + p_ctx->fname, io->status); } break; case IO_SEEK: io->offset = p_ctx->offset; + io->status = 0; break; } return bRC_OK; @@ -458,7 +447,7 @@ static bRC endRestoreFile(bpContext *ctx) /* * This is called during restore to create the file (if necessary) * We must return in rp->create_status: - * + * * CF_ERROR -- error * CF_SKIP -- skip processing this file * CF_EXTRACT -- extract the file (i.e.call i/o routines) @@ -536,9 +525,9 @@ static char *apply_rp_codes(struct plugin_ctx * p_ctx) } } - /* Required mem: - * len(imsg) - * + number of "where" codes * (len(where)-2) + /* Required mem: + * len(imsg) + * + number of "where" codes * (len(where)-2) * - number of "replace" codes */ omsg = (char*)malloc(strlen(imsg) + (w_count * (strlen(p_ctx->where)-2)) - r_count + 1); diff --git a/bacula/src/plugins/fd/example-plugin-fd.c b/bacula/src/plugins/fd/example-plugin-fd.c index 3a6f843f61..1f16ea83a8 100644 --- a/bacula/src/plugins/fd/example-plugin-fd.c +++ b/bacula/src/plugins/fd/example-plugin-fd.c @@ -1,19 +1,22 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2010-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ #define BUILD_PLUGIN #define BUILDING_DLL /* required for Windows plugin */ @@ -102,7 +105,7 @@ loadPlugin(bInfo *lbinfo, bFuncs *lbfuncs, pInfo **pinfo, pFuncs **pfuncs) * Bacula is going to exit. */ bRC DLL_IMP_EXP -unloadPlugin() +unloadPlugin() { printf("plugin: Unloaded\n"); return bRC_OK; @@ -125,7 +128,7 @@ static bRC newPlugin(bpContext *ctx) } /* - * Release everything concerning a particular instance of a + * Release everything concerning a particular instance of a * plugin. Normally called when the Job terminates. */ static bRC freePlugin(bpContext *ctx) @@ -140,17 +143,17 @@ static bRC freePlugin(bpContext *ctx) * Called by core code to get a variable from the plugin. * Not currently used. */ -static bRC getPluginValue(bpContext *ctx, pVariable var, void *value) +static bRC getPluginValue(bpContext *ctx, pVariable var, void *value) { // printf("plugin: getPluginValue var=%d\n", var); return bRC_OK; } -/* +/* * Called by core code to set a plugin variable. * Not currently used. */ -static bRC setPluginValue(bpContext *ctx, pVariable var, void *value) +static bRC setPluginValue(bpContext *ctx, pVariable var, void *value) { // printf("plugin: setPluginValue var=%d\n", var); return bRC_OK; @@ -228,13 +231,13 @@ static bRC startBackupFile(bpContext *ctx, struct save_pkt *sp) * Done backing up a file. */ static bRC endBackupFile(bpContext *ctx) -{ +{ return bRC_OK; } /* * Do actual I/O. Bacula calls this after startBackupFile - * or after startRestoreFile to do the actual file + * or after startRestoreFile to do the actual file * input or output. */ static bRC pluginIO(bpContext *ctx, struct io_pkt *io) diff --git a/bacula/src/plugins/fd/fd_common.h b/bacula/src/plugins/fd/fd_common.h index bcdd4e3131..50ba835e57 100644 --- a/bacula/src/plugins/fd/fd_common.h +++ b/bacula/src/plugins/fd/fd_common.h @@ -1,18 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2010-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. */ /* You can include this file to your plugin to have @@ -59,49 +62,144 @@ DLL_IMP_EXP void reallyfree(const char *file, int line, void *fp); #define malloc(s) sm_malloc(__FILE__, __LINE__, (s)) #define free(o) sm_free(__FILE__, __LINE__, (o)) -inline void *operator new(size_t size, char const * file, int line) -{ - void *pnew = sm_malloc(file,line, size); - memset((char *)pnew, 0, size); - return pnew; -} +#define Dmsg(context, level, ...) bfuncs->DebugMessage(context, __FILE__, __LINE__, level, __VA_ARGS__ ) +#define Jmsg(context, type, ...) bfuncs->JobMessage(context, __FILE__, __LINE__, type, 0, __VA_ARGS__ ) -inline void *operator new[](size_t size, char const * file, int line) -{ - void *pnew = sm_malloc(file, line, size); - memset((char *)pnew, 0, size); - return pnew; -} -inline void *operator new(size_t size) -{ - void *pnew = sm_malloc(__FILE__, __LINE__, size); - memset((char *)pnew, 0, size); - return pnew; -} +#ifdef USE_CMD_PARSER +/* from lib/scan.c */ +extern int parse_args(POOLMEM *cmd, POOLMEM **args, int *argc, + char **argk, char **argv, int max_args); +extern int parse_args_only(POOLMEM *cmd, POOLMEM **args, int *argc, + char **argk, char **argv, int max_args); + +class cmd_parser { +public: + POOLMEM *args; + POOLMEM *cmd; /* plugin command line */ + POOLMEM *org; /* original command line */ + + char **argk; /* Argument keywords */ + char **argv; /* Argument values */ + int argc; /* Number of arguments */ + int max_cmd; /* Max number of arguments */ + bool use_name; /* Search for : */ + + cmd_parser() { + org = get_pool_memory(PM_FNAME); + args = get_pool_memory(PM_FNAME); + cmd = get_pool_memory(PM_FNAME); + *args = *org = *cmd = 0; + argc = 0; + use_name = true; + max_cmd = MAX_CMD_ARGS; + argk = argv = NULL; + }; + + virtual ~cmd_parser() { + free_pool_memory(org); + free_pool_memory(cmd); + free_pool_memory(args); + if (argk) { + free(argk); + } + if (argv) { + free(argv); + } + } -inline void *operator new[](size_t size) -{ - void *pnew = sm_malloc(__FILE__, __LINE__, size); - memset((char *)pnew, 0, size); - return pnew; -} + /* + * Given a single keyword, find it in the argument list, but + * it must have a value + * Returns: -1 if not found or no value + * list index (base 0) on success + */ + int find_arg_with_value(const char *keyword) + { + for (int i=1; iDebugMessage(context, __FILE__, __LINE__, level, __VA_ARGS__ ) -#define Jmsg(context, type, ...) bfuncs->JobMessage(context, __FILE__, __LINE__, type, 0, __VA_ARGS__ ) + /* Same command line that before */ + if (!strcmp(line, org)) { + return bRC_OK; + } + + /* + * line = delta:minsize=10002 param1=xxx + * | backup command + */ + pm_strcpy(org, line); + pm_strcpy(cmd, line); + + if (use_name) { + if ((a = strchr(cmd, ':')) != NULL) { + *a = ' '; /* replace : by ' ' for command line processing */ + } else { + return bRC_Error; + } + } + for (char *p = cmd; *p ; p++) { + if (*p == '=') { + nbequal++; + } + } + + if (argk) { + free(argk); + } + if (argv) { + free(argv); + } + + max_cmd = MAX(nbequal, MAX_CMD_ARGS) + 1; + + argk = (char **) malloc(sizeof(char **) * max_cmd); + argv = (char **) malloc(sizeof(char **) * max_cmd); + + parse_args(cmd, &args, &argc, argk, argv, max_cmd); + + return bRC_OK; + } + +}; +#endif /* USE_CMD_PARSER */ #ifdef USE_ADD_DRIVE /* Keep drive letters for windows vss snapshot */ @@ -114,7 +212,7 @@ static void add_drive(char *drives, int *nCount, char *fname) { drives[*nCount] = ch; drives[*nCount+1] = 0; (*nCount)++; - } + } } } @@ -128,6 +226,6 @@ static void copy_drives(char *drives, char *dest) { } } } -#endif +#endif /* USE_ADD_DRIVE */ -#endif +#endif /* ! PCOMMON_H */ diff --git a/bacula/src/plugins/fd/test-deltaseq-fd.c b/bacula/src/plugins/fd/test-deltaseq-fd.c index 71bbc8df8b..c5ab173745 100644 --- a/bacula/src/plugins/fd/test-deltaseq-fd.c +++ b/bacula/src/plugins/fd/test-deltaseq-fd.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * A simple delta plugin for the Bacula File Daemon @@ -32,7 +36,7 @@ extern "C" { static const int dbglvl = 0; -#define PLUGIN_LICENSE "Bacula AGPLv3" +#define PLUGIN_LICENSE "AGPLv3" #define PLUGIN_AUTHOR "Eric Bollengier" #define PLUGIN_DATE "November 2010" #define PLUGIN_VERSION "1" @@ -51,6 +55,7 @@ static bRC startRestoreFile(bpContext *ctx, const char *cmd); static bRC endRestoreFile(bpContext *ctx); static bRC createFile(bpContext *ctx, struct restore_pkt *rp); static bRC setFileAttributes(bpContext *ctx, struct restore_pkt *rp); +static bRC checkFile(bpContext *ctx, char *fname); /* Pointers to Bacula functions */ static bFuncs *bfuncs = NULL; @@ -65,7 +70,7 @@ static pInfo pluginInfo = { PLUGIN_AUTHOR, PLUGIN_DATE, PLUGIN_VERSION, - PLUGIN_DESCRIPTION, + PLUGIN_DESCRIPTION }; /* Plugin entry points for Bacula */ @@ -86,7 +91,7 @@ static pFuncs pluginFuncs = { pluginIO, createFile, setFileAttributes, - NULL /* no checkFile */ + checkFile }; #define get_self(x) ((delta_test*)((x)->pContext)) @@ -105,7 +110,7 @@ public: bool done; int level; - delta_test(bpContext *bpc) { + delta_test(bpContext *bpc) { fd = NULL; ctx = bpc; done = false; @@ -142,16 +147,16 @@ bRC loadPlugin(bInfo *lbinfo, bFuncs *lbfuncs, pInfo **pinfo, pFuncs **pfuncs) } /* - * External entry point to unload the plugin + * External entry point to unload the plugin */ -bRC unloadPlugin() +bRC unloadPlugin() { // Dmsg(NULL, dbglvl, "delta-test-fd: Unloaded\n"); return bRC_OK; } /* - * The following entry points are accessed through the function + * The following entry points are accessed through the function * pointers we supplied to Bacula. Each plugin type (dir, fd, sd) * has its own set of entry points that the plugin must define. */ @@ -184,7 +189,7 @@ static bRC freePlugin(bpContext *ctx) /* * Return some plugin value (none defined) */ -static bRC getPluginValue(bpContext *ctx, pVariable var, void *value) +static bRC getPluginValue(bpContext *ctx, pVariable var, void *value) { return bRC_OK; } @@ -192,7 +197,7 @@ static bRC getPluginValue(bpContext *ctx, pVariable var, void *value) /* * Set a plugin value (none defined) */ -static bRC setPluginValue(bpContext *ctx, pVariable var, void *value) +static bRC setPluginValue(bpContext *ctx, pVariable var, void *value) { return bRC_OK; } @@ -218,7 +223,7 @@ static bRC handlePluginEvent(bpContext *ctx, bEvent *event, void *value) */ switch (event->eventType) { case bEventPluginCommand: -// Dmsg(ctx, dbglvl, +// Dmsg(ctx, dbglvl, // "delta-test-fd: PluginCommand=%s\n", (char *)value); break; case bEventJobStart: @@ -259,7 +264,7 @@ static bRC handlePluginEvent(bpContext *ctx, bEvent *event, void *value) if (self->level == 'I' || self->level == 'D') { bfuncs->getBaculaValue(ctx, bVarAccurate, (void *)&accurate); if (!accurate) { /* can be changed to FATAL */ - Jmsg(ctx, M_FATAL, + Jmsg(ctx, M_FATAL, "Accurate mode should be turned on when using the " "delta-test plugin\n"); return bRC_Error; @@ -282,7 +287,7 @@ static const char *files[] = { }; static int nb_files = 4; -/* +/* * Start the backup of a specific file */ static bRC startBackupFile(bpContext *ctx, struct save_pkt *sp) @@ -309,7 +314,7 @@ static bRC startBackupFile(bpContext *ctx, struct save_pkt *sp) self->delta = sp->delta_seq + 1; } pm_strcpy(self->fname, files[self->delta % nb_files]); - Dmsg(ctx, dbglvl, "delta-test-fd: delta_seq=%i delta=%i fname=%s\n", + Dmsg(ctx, dbglvl, "delta-test-fd: delta_seq=%i delta=%i fname=%s\n", sp->delta_seq, self->delta, self->fname); // Dmsg(ctx, dbglvl, "delta-test-fd: startBackupFile\n"); return bRC_OK; @@ -338,7 +343,7 @@ static bRC pluginIO(bpContext *ctx, struct io_pkt *io) if (!self) { return bRC_Error; } - + io->status = 0; io->io_errno = 0; switch(io->func) { @@ -353,7 +358,7 @@ static bRC pluginIO(bpContext *ctx, struct io_pkt *io) } if (!self->fd) { io->io_errno = errno; - Jmsg(ctx, M_FATAL, + Jmsg(ctx, M_FATAL, "Open failed: ERR=%s\n", strerror(errno)); return bRC_Error; } @@ -362,7 +367,7 @@ static bRC pluginIO(bpContext *ctx, struct io_pkt *io) self->fd = fopen(self->fname, "r"); if (!self->fd) { io->io_errno = errno; - Jmsg(ctx, M_FATAL, + Jmsg(ctx, M_FATAL, "Open failed: ERR=%s\n", strerror(errno)); return bRC_Error; } @@ -379,7 +384,7 @@ static bRC pluginIO(bpContext *ctx, struct io_pkt *io) } else { /* first time, read 300, then replace 50-250 by other data */ if (self->delta == 0) { - io->status = fread(io->buf, 1, 400, self->fd); + io->status = fread(io->buf, 1, 400, self->fd); } else { io->offset = self->delta * 100 / 2; /* chunks are melted */ io->status = fread(io->buf, 1, 100, self->fd); @@ -388,9 +393,9 @@ static bRC pluginIO(bpContext *ctx, struct io_pkt *io) self->done = true; } if (io->status == 0 && ferror(self->fd)) { - Jmsg(ctx, M_FATAL, + Jmsg(ctx, M_FATAL, "Pipe read error: ERR=%s\n", strerror(errno)); - Dmsg(ctx, dbglvl, + Dmsg(ctx, dbglvl, "Pipe read error: ERR=%s\n", strerror(errno)); return bRC_Error; } @@ -405,9 +410,9 @@ static bRC pluginIO(bpContext *ctx, struct io_pkt *io) Dmsg(ctx, dbglvl, "delta-test-fd: WRITE count=%lld\n", (int64_t)io->count); io->status = fwrite(io->buf, 1, io->count, self->fd); if (io->status == 0 && ferror(self->fd)) { - Jmsg(ctx, M_FATAL, + Jmsg(ctx, M_FATAL, "Pipe write error\n"); - Dmsg(ctx, dbglvl, + Dmsg(ctx, dbglvl, "Pipe read error: ERR=%s\n", strerror(errno)); return bRC_Error; } @@ -457,7 +462,7 @@ static bRC endRestoreFile(bpContext *ctx) /* * This is called during restore to create the file (if necessary) * We must return in rp->create_status: - * + * * CF_ERROR -- error * CF_SKIP -- skip processing this file * CF_EXTRACT -- extract the file (i.e.call i/o routines) @@ -482,6 +487,12 @@ static bRC setFileAttributes(bpContext *ctx, struct restore_pkt *rp) return bRC_OK; } +/* When using Incremental dump, all previous dumps are necessary */ +static bRC checkFile(bpContext *ctx, char *fname) +{ + return bRC_OK; +} + #ifdef __cplusplus } #endif diff --git a/bacula/src/plugins/fd/test-plugin-fd.c b/bacula/src/plugins/fd/test-plugin-fd.c index 0dff4c1716..634fe2aa45 100644 --- a/bacula/src/plugins/fd/test-plugin-fd.c +++ b/bacula/src/plugins/fd/test-plugin-fd.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * A simple test plugin for the Bacula File Daemon derived from @@ -38,7 +42,7 @@ extern "C" { static const int dbglvl = 000; -#define PLUGIN_LICENSE "Bacula AGPLv3" +#define PLUGIN_LICENSE "AGPLv3" #define PLUGIN_AUTHOR "Kern Sibbald" #define PLUGIN_DATE "May 2011" #define PLUGIN_VERSION "3" @@ -102,7 +106,7 @@ static struct ini_items test_items[] = { { "string2", ini_store_str, "2nd String", 0}, { "ok", ini_store_bool, "boolean", 0}, -// We can also use the ITEMS_DEFAULT +// We can also use the ITEMS_DEFAULT // { "ok", ini_store_bool, "boolean", 0, ITEMS_DEFAULT}, { NULL, NULL, NULL, 0} }; @@ -144,16 +148,16 @@ bRC loadPlugin(bInfo *lbinfo, bFuncs *lbfuncs, pInfo **pinfo, pFuncs **pfuncs) } /* - * External entry point to unload the plugin + * External entry point to unload the plugin */ -bRC unloadPlugin() +bRC unloadPlugin() { // printf("test-plugin-fd: Unloaded\n"); return bRC_OK; } /* - * The following entry points are accessed through the function + * The following entry points are accessed through the function * pointers we supplied to Bacula. Each plugin type (dir, fd, sd) * has its own set of entry points that the plugin must define. */ @@ -194,7 +198,7 @@ static bRC freePlugin(bpContext *ctx) /* * Return some plugin value (none defined) */ -static bRC getPluginValue(bpContext *ctx, pVariable var, void *value) +static bRC getPluginValue(bpContext *ctx, pVariable var, void *value) { return bRC_OK; } @@ -202,7 +206,7 @@ static bRC getPluginValue(bpContext *ctx, pVariable var, void *value) /* * Set a plugin value (none defined) */ -static bRC setPluginValue(bpContext *ctx, pVariable var, void *value) +static bRC setPluginValue(bpContext *ctx, pVariable var, void *value) { return bRC_OK; } @@ -254,7 +258,7 @@ static bRC handlePluginEvent(bpContext *ctx, bEvent *event, void *value) break; } rop = (restore_object_pkt *)value; - bfuncs->DebugMessage(ctx, fi, li, dbglvl, + bfuncs->DebugMessage(ctx, fi, li, dbglvl, "Get RestoreObject len=%d JobId=%d oname=%s type=%d data=%.127s\n", rop->object_len, rop->JobId, rop->object_name, rop->object_type, rop->object); @@ -280,7 +284,7 @@ static bRC handlePluginEvent(bpContext *ctx, bEvent *event, void *value) } ini.register_items(test_items, sizeof(struct ini_items)); if (ini.parse(ini.out_fname)) { - bfuncs->JobMessage(ctx, fi, li, M_INFO, 0, "string1 = %s\n", + bfuncs->JobMessage(ctx, fi, li, M_INFO, 0, "string1 = %s\n", ini.items[0].val.strval); } else { bfuncs->JobMessage(ctx, fi, li, M_ERROR, 0, "Can't parse config\n"); @@ -320,7 +324,7 @@ static bRC handlePluginEvent(bpContext *ctx, bEvent *event, void *value) } *p++ = 0; /* terminate reader string */ p_ctx->writer = p; - printf("test-plugin-fd: plugin=%s fname=%s reader=%s writer=%s\n", + printf("test-plugin-fd: plugin=%s fname=%s reader=%s writer=%s\n", p_ctx->cmd, p_ctx->fname, p_ctx->reader, p_ctx->writer); break; } @@ -339,7 +343,7 @@ static bRC handlePluginEvent(bpContext *ctx, bEvent *event, void *value) return bRC_OK; } -/* +/* * Start the backup of a specific file */ static bRC startBackupFile(bpContext *ctx, struct save_pkt *sp) @@ -351,15 +355,15 @@ static bRC startBackupFile(bpContext *ctx, struct save_pkt *sp) if (p_ctx->nb_obj == 0) { sp->fname = (char *)"takeme.h"; - bfuncs->DebugMessage(ctx, fi, li, dbglvl, "AcceptFile=%s = %d\n", + bfuncs->DebugMessage(ctx, fi, li, dbglvl, "AcceptFile=%s = %d\n", sp->fname, bfuncs->AcceptFile(ctx, sp)); sp->fname = (char *)"/path/to/excludeme.o"; - bfuncs->DebugMessage(ctx, fi, li, dbglvl, "AcceptFile=%s = %d\n", + bfuncs->DebugMessage(ctx, fi, li, dbglvl, "AcceptFile=%s = %d\n", sp->fname, bfuncs->AcceptFile(ctx, sp)); sp->fname = (char *)"/path/to/excludeme.c"; - bfuncs->DebugMessage(ctx, fi, li, dbglvl, "AcceptFile=%s = %d\n", + bfuncs->DebugMessage(ctx, fi, li, dbglvl, "AcceptFile=%s = %d\n", sp->fname, bfuncs->AcceptFile(ctx, sp)); } @@ -574,7 +578,7 @@ static bRC startBackupFile(bpContext *ctx, struct save_pkt *sp) fclose(fp); } free_pool_memory(q); - + } else if (p_ctx->nb_obj == 1) { ConfigFile ini; p_ctx->buf = get_pool_memory(PM_BSOCK); @@ -586,7 +590,7 @@ static bRC startBackupFile(bpContext *ctx, struct save_pkt *sp) sp->type = FT_PLUGIN_CONFIG; Dmsg1(0, "RestoreOptions=<%s>\n", p_ctx->buf); - } + } time_t now = time(NULL); sp->index = ++p_ctx->nb_obj; @@ -598,7 +602,7 @@ static bRC startBackupFile(bpContext *ctx, struct save_pkt *sp) sp->statp.st_blksize = 4096; sp->statp.st_blocks = 1; bfuncs->DebugMessage(ctx, fi, li, dbglvl, - "Creating RestoreObject len=%d oname=%s data=%.127s\n", + "Creating RestoreObject len=%d oname=%s data=%.127s\n", sp->object_len, sp->object_name, sp->object); printf("test-plugin-fd: startBackupFile\n"); @@ -627,7 +631,7 @@ static bRC pluginIO(bpContext *ctx, struct io_pkt *io) if (!p_ctx) { return bRC_Error; } - + io->status = 0; io->io_errno = 0; return bRC_OK; @@ -656,7 +660,7 @@ static bRC endRestoreFile(bpContext *ctx) /* * This is called during restore to create the file (if necessary) * We must return in rp->create_status: - * + * * CF_ERROR -- error * CF_SKIP -- skip processing this file * CF_EXTRACT -- extract the file (i.e.call i/o routines) diff --git a/bacula/src/plugins/sd/Makefile.in b/bacula/src/plugins/sd/Makefile.in index 290014bce5..ef5797d839 100644 --- a/bacula/src/plugins/sd/Makefile.in +++ b/bacula/src/plugins/sd/Makefile.in @@ -1,10 +1,8 @@ # -# Simple Makefile for building test FD plugins for Bacula +# Simple Makefile for building test SD plugins for Bacula # -# -# -# Author: Kern Sibbald -# License: LGPLv3 +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # @MCOMMON@ @@ -15,14 +13,14 @@ SDDIR=../../stored SRCDIR=../.. LIBDIR=../../lib -.SUFFIXES: .c .o .lo +.SUFFIXES: .c .lo .c.lo: $(LIBTOOL_COMPILE) $(CXX) $(DEFS) $(DEBUG) $(CPPFLAGS) -I${SRCDIR} -I${SDDIR} -DTEST_PROGRAM -c $< all: example-plugin-sd.la -example-plugin-sd.lo: example-plugin-sd.c ${SDDIR}/sd_plugins.h +example-plugin-sd.lo: example-plugin-sd.c $(LIBTOOL_COMPILE) $(CXX) $(DEFS) $(DEBUG) $(CFLAGS) -I../.. -I${SDDIR} -c example-plugin-sd.c example-plugin-sd.la: Makefile example-plugin-sd$(DEFAULT_OBJECT_TYPE) @@ -36,16 +34,13 @@ install: all libtool-clean: find . -name '*.lo' -print | xargs $(LIBTOOL_CLEAN) $(RMF) $(RMF) *.la - $(RMF) -rf .libs _libs + $(RMF) -r .libs _libs clean: @LIBTOOL_CLEAN_TARGET@ - rm -f main *.so *.o 1 2 3 *.la *.lo - rm -rf .libs - + rm -f main *.la *.so *.o 1 2 3 distclean: clean - rm -f Makefile *.la *.lo - rm -rf .libs + rm -f Makefile libtool-uninstall: $(LIBTOOL_UNINSTALL) $(RMF) $(DESTDIR)$(plugindir)/example-plugin-sd.so diff --git a/bacula/src/plugins/sd/example-plugin-sd.c b/bacula/src/plugins/sd/example-plugin-sd.c index be14924077..21b674a286 100644 --- a/bacula/src/plugins/sd/example-plugin-sd.c +++ b/bacula/src/plugins/sd/example-plugin-sd.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Sample Storage daemon Plugin program @@ -26,7 +30,7 @@ extern "C" { #endif -#define PLUGIN_LICENSE "Bacula AGPLv3" +#define PLUGIN_LICENSE "AGPLv3" #define PLUGIN_AUTHOR "Kern Sibbald" #define PLUGIN_DATE "November 2011" #define PLUGIN_VERSION "2" @@ -38,6 +42,7 @@ static bRC freePlugin(bpContext *ctx); static bRC getPluginValue(bpContext *ctx, psdVariable var, void *value); static bRC setPluginValue(bpContext *ctx, psdVariable var, void *value); static bRC handlePluginEvent(bpContext *ctx, bsdEvent *event, void *value); +static bRC handleGlobalPluginEvent(bsdEvent *event, void *value); /* Pointers to Bacula functions */ @@ -64,7 +69,8 @@ static psdFuncs pluginFuncs = { freePlugin, /* free plugin instance */ getPluginValue, setPluginValue, - handlePluginEvent + handlePluginEvent, + handleGlobalPluginEvent }; /* @@ -87,17 +93,17 @@ loadPlugin(bsdInfo *lbinfo, bsdFuncs *lbfuncs, psdInfo **pinfo, psdFuncs **pfunc } /* - * External entry point to unload the plugin + * External entry point to unload the plugin */ bRC DLL_IMP_EXP -unloadPlugin() +unloadPlugin() { printf("example-plugin-sd: Unloaded\n"); return bRC_OK; } /* - * The following entry points are accessed through the function + * The following entry points are accessed through the function * pointers we supplied to Bacula. Each plugin type (dir, fd, sd) * has its own set of entry points that the plugin must define. */ @@ -127,7 +133,7 @@ static bRC freePlugin(bpContext *ctx) /* * Return some plugin value (none defined) */ -static bRC getPluginValue(bpContext *ctx, psdVariable var, void *value) +static bRC getPluginValue(bpContext *ctx, psdVariable var, void *value) { printf("example-plugin-sd: getPluginValue var=%d\n", var); return bRC_OK; @@ -136,7 +142,7 @@ static bRC getPluginValue(bpContext *ctx, psdVariable var, void *value) /* * Set a plugin value (none defined) */ -static bRC setPluginValue(bpContext *ctx, psdVariable var, void *value) +static bRC setPluginValue(bpContext *ctx, psdVariable var, void *value) { printf("example-plugin-sd: setPluginValue var=%d\n", var); return bRC_OK; @@ -163,6 +169,15 @@ static bRC handlePluginEvent(bpContext *ctx, bsdEvent *event, void *value) return bRC_OK; } +/* + * Handle a Global event -- no context + */ +static bRC handleGlobalPluginEvent(bsdEvent *event, void *value) +{ + return bRC_OK; +} + + #ifdef __cplusplus } #endif diff --git a/bacula/src/plugins/sd/main.c b/bacula/src/plugins/sd/main.c index 07100ee0e9..4be52758c6 100644 --- a/bacula/src/plugins/sd/main.c +++ b/bacula/src/plugins/sd/main.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Main program to test loading and running Bacula plugins. @@ -41,7 +45,7 @@ static bFuncs bfuncs = { NULL, NULL }; - + @@ -51,8 +55,8 @@ int main(int argc, char *argv[]) bpContext ctx; bEvent event; Plugin *plugin; - - bplugin_list = New(alist(10, not_owned_by_alist)); + + b_plugin_list = New(alist(10, not_owned_by_alist)); ctx.bContext = NULL; ctx.pContext = NULL; @@ -60,24 +64,24 @@ int main(int argc, char *argv[]) load_plugins((void *)&bfuncs, plugin_dir, plugin_type); - foreach_alist(plugin, bplugin_list) { - printf("bacula: plugin_size=%d plugin_version=%d\n", + foreach_alist(plugin, b_plugin_list) { + printf("bacula: plugin_size=%d plugin_version=%d\n", pref(plugin)->size, pref(plugin)->interface); printf("License: %s\nAuthor: %s\nDate: %s\nVersion: %s\nDescription: %s\n", - pref(plugin)->plugin_license, pref(plugin)->plugin_author, - pref(plugin)->plugin_date, pref(plugin)->plugin_version, + pref(plugin)->plugin_license, pref(plugin)->plugin_author, + pref(plugin)->plugin_date, pref(plugin)->plugin_version, pref(plugin)->plugin_description); /* Start a new instance of the plugin */ pref(plugin)->newPlugin(&ctx); - event.eventType = bEventNewVolume; + event.eventType = bEventNewVolume; pref(plugin)->handlePluginEvent(&ctx, &event); /* Free the plugin instance */ pref(plugin)->freePlugin(&ctx); /* Start a new instance of the plugin */ pref(plugin)->newPlugin(&ctx); - event.eventType = bEventNewVolume; + event.eventType = bEventNewVolume; pref(plugin)->handlePluginEvent(&ctx, &event); /* Free the plugin instance */ pref(plugin)->freePlugin(&ctx); diff --git a/bacula/src/qt-console/README b/bacula/src/qt-console/README index 1db13a31a5..6f392ffc37 100644 --- a/bacula/src/qt-console/README +++ b/bacula/src/qt-console/README @@ -13,9 +13,10 @@ yourself or if your distro does not have it, we have included the source in depkgs-qt, which you can download from the Bacula Source Forge download area. -Building and running bat is done much like bconsole. You add the appropriate - options to your ./configure, then simply do a make. Please see the -Installation chapter of the manual for more details. +Building and running bat is done much like bconsole, the gnome console, +or the wxWidgets console. You add the appropriate options to your +./configure, then simply do a make. Please see the Installation chapter +of the manual for more details. Win32 mingw infos for QT4 : @@ -103,7 +104,8 @@ Design/implementation considerations: a tree view, but for the moment does nothing ... It is a bit ugly. Canceling it should get you back to the normal command prompt. -- Implement a restore page that does a directory tree restore selection. +- Implement a restore page that does a directory tree restore selection + much like wx-console does. Not working: - The left selection window and the right window (where the console diff --git a/bacula/src/qt-console/bat.h b/bacula/src/qt-console/bat.h index 2bbdbe1bab..214ac7d793 100644 --- a/bacula/src/qt-console/bat.h +++ b/bacula/src/qt-console/bat.h @@ -2,19 +2,23 @@ #define _BAT_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Kern Sibbald, January 2007 diff --git a/bacula/src/qt-console/bat.pro.in b/bacula/src/qt-console/bat.pro.in index cacba21766..7c43f13681 100644 --- a/bacula/src/qt-console/bat.pro.in +++ b/bacula/src/qt-console/bat.pro.in @@ -5,7 +5,7 @@ # Edit only bat.pro.in -- bat.pro is built by the ./configure program # # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -# +# CONFIG += qt debug @QWT@ bins.path = /$(DESTDIR)@sbindir@ @@ -27,7 +27,7 @@ QMAKE_INSTALL_PROGRAM = $${LIBTOOL_INSTALL} install -m @SBINPERM@ -p QMAKE_CLEAN += .libs/* bat qwt { - INCLUDEPATH += @QWT_INC@ + INCLUDEPATH += @QWT_INC@ LIBS += @QWT_LDFLAGS@ @QWT_LIB@ } @@ -41,10 +41,10 @@ OBJECTS_DIR = obj UI_DIR = ui # Main window -FORMS += main.ui +FORMS += main.ui FORMS += prefs.ui -FORMS += label/label.ui -FORMS += relabel/relabel.ui +FORMS += label/label.ui +FORMS += relabel/relabel.ui FORMS += mount/mount.ui FORMS += console/console.ui FORMS += restore/restore.ui restore/prerestore.ui restore/brestore.ui diff --git a/bacula/src/qt-console/bat.pro.mingw32.in b/bacula/src/qt-console/bat.pro.mingw32.in index 1f2c71d70b..23ac93a458 100644 --- a/bacula/src/qt-console/bat.pro.mingw32.in +++ b/bacula/src/qt-console/bat.pro.mingw32.in @@ -32,10 +32,19 @@ qwt { LIBS += @QWT_LDFLAGS@ @QWT_LIB@ } -RESOURCES = main.qrc -MOC_DIR = moc32 -OBJECTS_DIR = obj32 -UI_DIR = ui32 +RESOURCES = main.qrc +MOC_DIR = moc32 +OBJECTS_DIR = obj32 +UI_DIR = ui32 +QMAKE_CC = i686-w64-mingw32-gcc +QMAKE_CXX = i686-w64-mingw32-g++ +QMAKE_INCDIR = $(DEPKGS)/depkgs-mingw32/include/pthreads $(DEPKGS)/depkgs-mingw32/include/ ../win32/compat +QMAKE_INCDIR_QT = $(DEPKGS)/depkgs-mingw32/include/qt +QMAKE_LIBDIR_QT = $(DEPKGS)/depkgs-mingw32/lib/qt +QMAKE_LINK = i686-w64-mingw32-g++ +QMAKE_LFLAGS = -mthreads -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -m32 -fno-strict-aliasing -Wl,-enable-runtime-pseudo-reloc +QMAKE_LIB = i686-w64-mingw32-ar -ru +QMAKE_RC = i686-w64-mingw32-windres # Main window FORMS += main.ui diff --git a/bacula/src/qt-console/bat.pro.mingw64 b/bacula/src/qt-console/bat.pro.mingw64 new file mode 100644 index 0000000000..4812fecaac --- /dev/null +++ b/bacula/src/qt-console/bat.pro.mingw64 @@ -0,0 +1,191 @@ +###################################################################### +# +# !!!!!!! IMPORTANT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# +# Edit only bat.pro.mingw64.in -- bat.pro.mingw64 is built by the ./configure program +# +# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# +CONFIG += qt cross-win32 +# CONFIG += debug + +bins.path = ./ +bins.files = ./bat +confs.path = ./ +confs.commands = ./install_conf_file + +TEMPLATE = app +TARGET = bat +DEPENDPATH += . +INCLUDEPATH += .. . ./console ./restore ./select + +cross-win32 { +# LIBS += ../win32/dll/bacula.a + LIBS += -mwindows -L../win32/release64 -lbacula +} +!cross-win32 { + LIBS += -L../lib -lbac -L../findlib -lbacfind -lssl -lcrypto +} + +qwt { + INCLUDEPATH += + LIBS += +} + +RESOURCES = main.qrc +MOC_DIR = moc64 +OBJECTS_DIR = obj64 +UI_DIR = ui64 +QMAKE_CC = x86_64-w64-mingw32-gcc +QMAKE_CXX = x86_64-w64-mingw32-g++ +QMAKE_INCDIR = $(DEPKGS)/depkgs-mingw-w64/include/pthreads $(DEPKGS)/depkgs-mingw-w64/include/ ../win32/compat +QMAKE_INCDIR_QT = $(DEPKGS)/depkgs-mingw-w64/include/qt +QMAKE_LIBDIR_QT = $(DEPKGS)/depkgs-mingw-w64/lib/qt +QMAKE_LINK = x86_64-w64-mingw32-g++ +QMAKE_LFLAGS = -mthreads -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -m64 -fno-strict-aliasing -Wl,-enable-runtime-pseudo-reloc +QMAKE_LIB = x86_64-w64-mingw32-ar -ru +QMAKE_RC = x86_64-w64-mingw32-windres + +# Main window +FORMS += main.ui +FORMS += prefs.ui +FORMS += label/label.ui +FORMS += relabel/relabel.ui +FORMS += mount/mount.ui +FORMS += console/console.ui +FORMS += restore/restore.ui restore/prerestore.ui restore/brestore.ui +FORMS += restore/runrestore.ui restore/restoretree.ui +FORMS += run/run.ui run/runcmd.ui run/estimate.ui run/prune.ui +FORMS += select/select.ui select/textinput.ui +FORMS += medialist/medialist.ui mediaedit/mediaedit.ui joblist/joblist.ui +FORMS += medialist/mediaview.ui +FORMS += clients/clients.ui storage/storage.ui fileset/fileset.ui +FORMS += joblog/joblog.ui jobs/jobs.ui job/job.ui +FORMS += help/help.ui mediainfo/mediainfo.ui +FORMS += status/dirstat.ui storage/content.ui +FORMS += status/clientstat.ui +FORMS += status/storstat.ui +qwt { + FORMS += jobgraphs/jobplotcontrols.ui +} + +# Main directory +HEADERS += mainwin.h bat.h bat_conf.h qstd.h pages.h +SOURCES += main.cpp bat_conf.cpp mainwin.cpp qstd.cpp pages.cpp + +# bcomm +HEADERS += bcomm/dircomm.h +SOURCES += bcomm/dircomm.cpp bcomm/dircomm_auth.cpp + +# Console +HEADERS += console/console.h +SOURCES += console/console.cpp + +# Restore +HEADERS += restore/restore.h +SOURCES += restore/prerestore.cpp restore/restore.cpp restore/brestore.cpp + +# Label dialog +HEADERS += label/label.h +SOURCES += label/label.cpp + +# Relabel dialog +HEADERS += relabel/relabel.h +SOURCES += relabel/relabel.cpp + +# Mount dialog +HEADERS += mount/mount.h +SOURCES += mount/mount.cpp + +# Run dialog +HEADERS += run/run.h +SOURCES += run/run.cpp run/runcmd.cpp run/estimate.cpp run/prune.cpp + +# Select dialog +HEADERS += select/select.h select/textinput.h +SOURCES += select/select.cpp select/textinput.cpp + +## MediaList +HEADERS += medialist/medialist.h +SOURCES += medialist/medialist.cpp + +# MediaView +HEADERS += medialist/mediaview.h +SOURCES += medialist/mediaview.cpp + +## MediaEdit +HEADERS += mediaedit/mediaedit.h +SOURCES += mediaedit/mediaedit.cpp + +## JobList +HEADERS += joblist/joblist.h +SOURCES += joblist/joblist.cpp + +## Clients +HEADERS += clients/clients.h +SOURCES += clients/clients.cpp + +## Storage +HEADERS += storage/storage.h +SOURCES += storage/storage.cpp + +## Storage content +HEADERS += storage/content.h +SOURCES += storage/content.cpp + +## Fileset +HEADERS += fileset/fileset.h +SOURCES += fileset/fileset.cpp + +## Job log +HEADERS += joblog/joblog.h +SOURCES += joblog/joblog.cpp + +## Job +HEADERS += job/job.h +SOURCES += job/job.cpp + +## Jobs +HEADERS += jobs/jobs.h +SOURCES += jobs/jobs.cpp + +## RestoreTree +HEADERS += restore/restoretree.h +SOURCES += restore/restoretree.cpp + +## Job Step Graphs +qwt { + HEADERS += jobgraphs/jobplot.h + SOURCES += jobgraphs/jobplot.cpp +} + +# Help dialog +HEADERS += help/help.h +SOURCES += help/help.cpp + +# Media info dialog +HEADERS += mediainfo/mediainfo.h +SOURCES += mediainfo/mediainfo.cpp + +## Status Dir +HEADERS += status/dirstat.h +SOURCES += status/dirstat.cpp + +## Status Client +HEADERS += status/clientstat.h +SOURCES += status/clientstat.cpp + +## Status Client +HEADERS += status/storstat.h +SOURCES += status/storstat.cpp + +# Utility sources +HEADERS += util/fmtwidgetitem.h util/comboutil.h +SOURCES += util/fmtwidgetitem.cpp util/comboutil.cpp + +INSTALLS += bins +INSTALLS += confs + +QMAKE_EXTRA_TARGETS += depend + +TRANSLATIONS += ts/bat_fr.ts ts/bat_de.ts diff --git a/bacula/src/qt-console/bat.pro.mingw64.in b/bacula/src/qt-console/bat.pro.mingw64.in new file mode 100644 index 0000000000..1c22a2a5db --- /dev/null +++ b/bacula/src/qt-console/bat.pro.mingw64.in @@ -0,0 +1,191 @@ +###################################################################### +# +# !!!!!!! IMPORTANT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# +# Edit only bat.pro.mingw64.in -- bat.pro.mingw64 is built by the ./configure program +# +# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# +CONFIG += qt cross-win32 +# CONFIG += debug + +bins.path = ./ +bins.files = ./bat +confs.path = ./ +confs.commands = ./install_conf_file + +TEMPLATE = app +TARGET = bat +DEPENDPATH += . +INCLUDEPATH += .. . ./console ./restore ./select + +cross-win32 { +# LIBS += ../win32/dll/bacula.a + LIBS += -mwindows -L../win32/release64 -lbacula +} +!cross-win32 { + LIBS += -L../lib -lbac -L../findlib -lbacfind @OPENSSL_LIBS@ +} + +qwt { + INCLUDEPATH += @QWT_INC@ + LIBS += @QWT_LDFLAGS@ @QWT_LIB@ +} + +RESOURCES = main.qrc +MOC_DIR = moc64 +OBJECTS_DIR = obj64 +UI_DIR = ui64 +QMAKE_CC = x86_64-w64-mingw32-gcc +QMAKE_CXX = x86_64-w64-mingw32-g++ +QMAKE_INCDIR = $(DEPKGS)/depkgs-mingw-w64/include/pthreads $(DEPKGS)/depkgs-mingw-w64/include/ ../win32/compat +QMAKE_INCDIR_QT = $(DEPKGS)/depkgs-mingw-w64/include/qt +QMAKE_LIBDIR_QT = $(DEPKGS)/depkgs-mingw-w64/lib/qt +QMAKE_LINK = x86_64-w64-mingw32-g++ +QMAKE_LFLAGS = -mthreads -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -m64 -fno-strict-aliasing -Wl,-enable-runtime-pseudo-reloc +QMAKE_LIB = x86_64-w64-mingw32-ar -ru +QMAKE_RC = x86_64-w64-mingw32-windres + +# Main window +FORMS += main.ui +FORMS += prefs.ui +FORMS += label/label.ui +FORMS += relabel/relabel.ui +FORMS += mount/mount.ui +FORMS += console/console.ui +FORMS += restore/restore.ui restore/prerestore.ui restore/brestore.ui +FORMS += restore/runrestore.ui restore/restoretree.ui +FORMS += run/run.ui run/runcmd.ui run/estimate.ui run/prune.ui +FORMS += select/select.ui select/textinput.ui +FORMS += medialist/medialist.ui mediaedit/mediaedit.ui joblist/joblist.ui +FORMS += medialist/mediaview.ui +FORMS += clients/clients.ui storage/storage.ui fileset/fileset.ui +FORMS += joblog/joblog.ui jobs/jobs.ui job/job.ui +FORMS += help/help.ui mediainfo/mediainfo.ui +FORMS += status/dirstat.ui storage/content.ui +FORMS += status/clientstat.ui +FORMS += status/storstat.ui +qwt { + FORMS += jobgraphs/jobplotcontrols.ui +} + +# Main directory +HEADERS += mainwin.h bat.h bat_conf.h qstd.h pages.h +SOURCES += main.cpp bat_conf.cpp mainwin.cpp qstd.cpp pages.cpp + +# bcomm +HEADERS += bcomm/dircomm.h +SOURCES += bcomm/dircomm.cpp bcomm/dircomm_auth.cpp + +# Console +HEADERS += console/console.h +SOURCES += console/console.cpp + +# Restore +HEADERS += restore/restore.h +SOURCES += restore/prerestore.cpp restore/restore.cpp restore/brestore.cpp + +# Label dialog +HEADERS += label/label.h +SOURCES += label/label.cpp + +# Relabel dialog +HEADERS += relabel/relabel.h +SOURCES += relabel/relabel.cpp + +# Mount dialog +HEADERS += mount/mount.h +SOURCES += mount/mount.cpp + +# Run dialog +HEADERS += run/run.h +SOURCES += run/run.cpp run/runcmd.cpp run/estimate.cpp run/prune.cpp + +# Select dialog +HEADERS += select/select.h select/textinput.h +SOURCES += select/select.cpp select/textinput.cpp + +## MediaList +HEADERS += medialist/medialist.h +SOURCES += medialist/medialist.cpp + +# MediaView +HEADERS += medialist/mediaview.h +SOURCES += medialist/mediaview.cpp + +## MediaEdit +HEADERS += mediaedit/mediaedit.h +SOURCES += mediaedit/mediaedit.cpp + +## JobList +HEADERS += joblist/joblist.h +SOURCES += joblist/joblist.cpp + +## Clients +HEADERS += clients/clients.h +SOURCES += clients/clients.cpp + +## Storage +HEADERS += storage/storage.h +SOURCES += storage/storage.cpp + +## Storage content +HEADERS += storage/content.h +SOURCES += storage/content.cpp + +## Fileset +HEADERS += fileset/fileset.h +SOURCES += fileset/fileset.cpp + +## Job log +HEADERS += joblog/joblog.h +SOURCES += joblog/joblog.cpp + +## Job +HEADERS += job/job.h +SOURCES += job/job.cpp + +## Jobs +HEADERS += jobs/jobs.h +SOURCES += jobs/jobs.cpp + +## RestoreTree +HEADERS += restore/restoretree.h +SOURCES += restore/restoretree.cpp + +## Job Step Graphs +qwt { + HEADERS += jobgraphs/jobplot.h + SOURCES += jobgraphs/jobplot.cpp +} + +# Help dialog +HEADERS += help/help.h +SOURCES += help/help.cpp + +# Media info dialog +HEADERS += mediainfo/mediainfo.h +SOURCES += mediainfo/mediainfo.cpp + +## Status Dir +HEADERS += status/dirstat.h +SOURCES += status/dirstat.cpp + +## Status Client +HEADERS += status/clientstat.h +SOURCES += status/clientstat.cpp + +## Status Client +HEADERS += status/storstat.h +SOURCES += status/storstat.cpp + +# Utility sources +HEADERS += util/fmtwidgetitem.h util/comboutil.h +SOURCES += util/fmtwidgetitem.cpp util/comboutil.cpp + +INSTALLS += bins +INSTALLS += confs + +QMAKE_EXTRA_TARGETS += depend + +TRANSLATIONS += ts/bat_fr.ts ts/bat_de.ts diff --git a/bacula/src/qt-console/bat_conf.cpp b/bacula/src/qt-console/bat_conf.cpp index 279e7faf92..429cf4d8f3 100644 --- a/bacula/src/qt-console/bat_conf.cpp +++ b/bacula/src/qt-console/bat_conf.cpp @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 2000-2009 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2013 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Main configuration file parser for Bacula User Agent @@ -34,7 +38,6 @@ * * Kern Sibbald, January MM, September MM * - * Version $Id$ */ #include "bacula.h" @@ -80,7 +83,7 @@ static RES_ITEM dir_items[] = { {"tlscacertificatedir", store_dir, ITEM(dir_res.tls_ca_certdir), 0, 0, 0}, {"tlscertificate", store_dir, ITEM(dir_res.tls_certfile), 0, 0, 0}, {"tlskey", store_dir, ITEM(dir_res.tls_keyfile), 0, 0, 0}, - {"heartbeatinterval", store_time, ITEM(dir_res.heartbeat_interval), 0, ITEM_DEFAULT, 0}, + {"heartbeatinterval", store_time, ITEM(dir_res.heartbeat_interval), 0, ITEM_DEFAULT, 5 * 60}, {NULL, NULL, {0}, 0, 0, 0} }; @@ -95,7 +98,7 @@ static RES_ITEM con_items[] = { {"tlscacertificatedir", store_dir, ITEM(con_res.tls_ca_certdir), 0, 0, 0}, {"tlscertificate", store_dir, ITEM(con_res.tls_certfile), 0, 0, 0}, {"tlskey", store_dir, ITEM(con_res.tls_keyfile), 0, 0, 0}, - {"heartbeatinterval", store_time, ITEM(con_res.heartbeat_interval), 0, ITEM_DEFAULT, 0}, + {"heartbeatinterval", store_time, ITEM(con_res.heartbeat_interval), 0, ITEM_DEFAULT, 5 * 60}, {"director", store_str, ITEM(con_res.director), 0, 0, 0}, {NULL, NULL, {0}, 0, 0, 0} }; @@ -121,9 +124,9 @@ RES_TABLE resources[] = { /* Dump contents of resource */ -void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fmt, ...), void *sock) +void dump_resource(int type, RES *ares, void sendit(void *sock, const char *fmt, ...), void *sock) { - URES *res = (URES *)reshdr; + URES *res = (URES *)ares; bool recurse = true; if (res == NULL) { @@ -136,15 +139,15 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fm } switch (type) { case R_DIRECTOR: - printf(_("Director: name=%s address=%s DIRport=%d\n"), reshdr->name, + printf(_("Director: name=%s address=%s DIRport=%d\n"), ares->name, res->dir_res.address, res->dir_res.DIRport); break; case R_CONSOLE: - printf(_("Console: name=%s\n"), reshdr->name); + printf(_("Console: name=%s\n"), ares->name); break; case R_CONSOLE_FONT: printf(_("ConsoleFont: name=%s font face=%s\n"), - reshdr->name, NPRT(res->con_font.fontface)); + ares->name, NPRT(res->con_font.fontface)); break; default: printf(_("Unknown resource type %d\n"), type); @@ -183,7 +186,7 @@ void free_resource(RES *sres, int type) if (res->dir_res.address) { free(res->dir_res.address); } - if (res->dir_res.tls_ctx) { + if (res->dir_res.tls_ctx) { free_tls_context(res->dir_res.tls_ctx); } if (res->dir_res.tls_ca_certfile) { @@ -203,7 +206,7 @@ void free_resource(RES *sres, int type) if (res->con_res.password) { free(res->con_res.password); } - if (res->con_res.tls_ctx) { + if (res->con_res.tls_ctx) { free_tls_context(res->con_res.tls_ctx); } if (res->con_res.tls_ca_certfile) { @@ -231,7 +234,9 @@ void free_resource(RES *sres, int type) printf(_("Unknown resource type %d\n"), type); } /* Common stuff again -- free the resource, recurse to next one */ - free(res); + if (res) { + free(res); + } if (nres) { free_resource(nres, type); } diff --git a/bacula/src/qt-console/bat_conf.h b/bacula/src/qt-console/bat_conf.h index e9e41f76d5..143168c4bd 100644 --- a/bacula/src/qt-console/bat_conf.h +++ b/bacula/src/qt-console/bat_conf.h @@ -1,24 +1,26 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Bacula Adminstration Tool (bat) * * Kern Sibbald, March 2002 - * - * Version $Id$ */ #ifndef _BAT_CONF_H_ diff --git a/bacula/src/qt-console/bcomm/dircomm.cpp b/bacula/src/qt-console/bcomm/dircomm.cpp index 33500b00c8..55910641fc 100644 --- a/bacula/src/qt-console/bcomm/dircomm.cpp +++ b/bacula/src/qt-console/bcomm/dircomm.cpp @@ -1,24 +1,28 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2011 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * DirComm, Director communications,class * * Kern Sibbald, January MMVII * - */ + */ #include "bat.h" #include "console.h" @@ -63,7 +67,7 @@ void DirComm::terminate() } /* - * Connect to Director. + * Connect to Director. */ bool DirComm::connect_dir() { @@ -100,7 +104,7 @@ bool DirComm::connect_dir() /* Give GUI a chance */ app->processEvents(); - + LockRes(); /* If cons==NULL, default console will be used */ for (i=0; itls_ctx && (cons->tls_enable || cons->tls_require)) { /* Generate passphrase prompt */ - bsnprintf(buf, sizeof(buf), "Passphrase for Console \"%s\" TLS private key: ", + bsnprintf(buf, sizeof(buf), "Passphrase for Console \"%s\" TLS private key: ", cons->name()); /* Initialize TLS context: * Args: CA certfile, CA certdir, Certfile, Keyfile, - * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer + * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */ cons->tls_ctx = new_tls_context(cons->tls_ca_certfile, cons->tls_ca_certdir, cons->tls_certfile, @@ -159,7 +163,7 @@ bool DirComm::connect_dir() /* Initialize Director TLS context once */ if (!m_console->m_dir->tls_ctx && (m_console->m_dir->tls_enable || m_console->m_dir->tls_require)) { /* Generate passphrase prompt */ - bsnprintf(buf, sizeof(buf), "Passphrase for Director \"%s\" TLS private key: ", + bsnprintf(buf, sizeof(buf), "Passphrase for Director \"%s\" TLS private key: ", m_console->m_dir->name()); /* Initialize TLS context: @@ -186,7 +190,7 @@ bool DirComm::connect_dir() heart_beat = cons->heartbeat_interval; } else { heart_beat = 0; - } + } if (!m_sock) { m_sock = new_bsock(); @@ -232,7 +236,7 @@ bool DirComm::connect_dir() mainWin->set_status(_("Initializing ...")); - /* + /* * Set up input notifier */ m_notifier = new QSocketNotifier(m_sock->m_fd, QSocketNotifier::Read, 0); @@ -261,8 +265,8 @@ bail_out: return false; } -/* - * This should be moved into a bSocket class +/* + * This should be moved into a bSocket class */ char *DirComm::msg() { @@ -315,7 +319,7 @@ int DirComm::sock_read() return stat; } -/* +/* * Blocking read from director */ int DirComm::read() @@ -331,7 +335,7 @@ int DirComm::read() stat = m_sock->wait_data_intr(0, 50000); if (stat > 0) { break; - } + } app->processEvents(); if (m_api_set && m_console->is_messagesPending() && is_notify_enabled() && m_console->hasFocus()) { if (mainWin->m_commDebug) Pmsg1(000, "conn %i process_events\n", m_conn); @@ -394,7 +398,7 @@ int DirComm::read() mainWin->set_status(_("At prompt waiting for input ...")); break; case BNET_TEXT_INPUT: - if (mainWin->m_commDebug) Pmsg4(000, "conn %i TEXT_INPUT at_prompt=%d m_in_select=%d notify=%d\n", + if (mainWin->m_commDebug) Pmsg4(000, "conn %i TEXT_INPUT at_prompt=%d m_in_select=%d notify=%d\n", m_conn, m_at_prompt, m_in_select, is_notify_enabled()); if (!m_in_select && is_notify_enabled()) { new textInputDialog(m_console, m_conn); @@ -485,7 +489,7 @@ int DirComm::read() stat = BNET_HARDEOF; } break; - } + } return stat; } @@ -509,7 +513,7 @@ void DirComm::notify_read_dir(int /* fd */) /* * When the notifier is enabled, read_dir() will automatically be - * called by the Qt event loop when ever there is any output + * called by the Qt event loop when ever there is any output * from the Director, and read_dir() will then display it on * the console. * @@ -517,13 +521,13 @@ void DirComm::notify_read_dir(int /* fd */) * from the Directory, so we set notify to off. * m_console->notify(false); */ -bool DirComm::notify(bool enable) -{ +bool DirComm::notify(bool enable) +{ bool prev_enabled = false; /* Set global flag */ mainWin->m_notify = enable; if (m_notifier) { - prev_enabled = m_notifier->isEnabled(); + prev_enabled = m_notifier->isEnabled(); m_notifier->setEnabled(enable); m_notify = enable; if (mainWin->m_connDebug) Pmsg3(000, "conn=%i set_notify=%d prev=%d\n", m_conn, enable, prev_enabled); @@ -540,7 +544,7 @@ bool DirComm::is_notify_enabled() const /* * Call-back for reading a passphrase for an encrypted PEM file - * This function uses getpass(), + * This function uses getpass(), * which uses a static buffer and is NOT thread-safe. */ static int tls_pem_callback(char *buf, int size, const void *userdata) diff --git a/bacula/src/qt-console/bcomm/dircomm.h b/bacula/src/qt-console/bcomm/dircomm.h index 630c071f5e..5d6446116a 100644 --- a/bacula/src/qt-console/bcomm/dircomm.h +++ b/bacula/src/qt-console/bcomm/dircomm.h @@ -1,23 +1,25 @@ #ifndef _DIRCOMM_H_ #define _DIRCOMM_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * Version $Id$ - * * Kern Sibbald, January 2007 */ @@ -45,7 +47,7 @@ public: ~DirComm(); Console *m_console; int sock_read(); - bool authenticate_director(JCR *jcr, DIRRES *director, CONRES *cons, + bool authenticate_director(JCR *jcr, DIRRES *director, CONRES *cons, char *buf, int buflen); bool is_connected() { return m_sock != NULL; }; bool is_ready() { return is_connected() && m_at_prompt && m_at_main_prompt; }; @@ -54,7 +56,7 @@ public: bool is_notify_enabled() const; bool is_in_command() const { return m_in_command > 0; }; void terminate(); - bool connect_dir(); + bool connect_dir(); int read(void); int write(const char *msg); int write(QString msg); @@ -63,7 +65,7 @@ public slots: void notify_read_dir(int fd); private: - BSOCK *m_sock; + BSOCK *m_sock; bool m_at_prompt; bool m_at_main_prompt; bool m_sent_blank; diff --git a/bacula/src/qt-console/bcomm/dircomm_auth.cpp b/bacula/src/qt-console/bcomm/dircomm_auth.cpp index 548a26e577..32ac44cff6 100644 --- a/bacula/src/qt-console/bcomm/dircomm_auth.cpp +++ b/bacula/src/qt-console/bcomm/dircomm_auth.cpp @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 2001-2014 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2001-2013 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* @@ -46,8 +50,8 @@ static char newOKhello[] = "1000 OK: %d"; /* * Authenticate Director */ -bool DirComm::authenticate_director(JCR *jcr, DIRRES *director, CONRES *cons, - char *errmsg, int errmsg_len) +bool DirComm::authenticate_director(JCR *jcr, DIRRES *director, CONRES *cons, + char *errmsg, int errmsg_len) { BSOCK *dir = jcr->dir_bsock; int tls_local_need = BNET_TLS_NONE; @@ -156,10 +160,10 @@ bool DirComm::authenticate_director(JCR *jcr, DIRRES *director, CONRES *cons, return false; } else { /* If Dir version exists, get it */ - sscanf(dir->msg, newOKhello, &dir_version); + sscanf(dir->msg, newOKhello, &dir_version); } - if (m_conn == 0) { + if (m_conn == 0) { bsnprintf(errmsg, errmsg_len, "%s", dir->msg); } return true; @@ -169,7 +173,7 @@ bail_out: bsnprintf(errmsg, errmsg_len, _("Authorization problem with Director at \"%s:%d\"\n" "Most likely the passwords do not agree.\n" "If you are using TLS, there may have been a certificate validation error during the TLS handshake.\n" - "Please see " MANUAL_AUTH_URL " for help.\n"), + "For help, please see " MANUAL_AUTH_URL "\n"), dir->host(), dir->port()); return false; } diff --git a/bacula/src/qt-console/clients/clients.cpp b/bacula/src/qt-console/clients/clients.cpp index 6ba383de71..b9c2ea804d 100644 --- a/bacula/src/qt-console/clients/clients.cpp +++ b/bacula/src/qt-console/clients/clients.cpp @@ -1,27 +1,29 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2009 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* - * Version $Id$ - * * Clients Class * * Dirk Bartley, March 2007 * - */ + */ #include "bat.h" #include @@ -55,7 +57,7 @@ Clients::~Clients() } /* - * The main meat of the class!! The function that queries the director and + * The main meat of the class!! The function that queries the director and * creates the widgets with appropriate values. */ void Clients::populateTable() @@ -115,6 +117,10 @@ void Clients::populateTable() foreach (QString resultline, results) { QStringList fieldlist = resultline.split("\t"); + if (fieldlist.size() < 5) { // Uname is checked after + Pmsg1(0, "Unexpected line %s\n", resultline.toUtf8().data()); + continue; + } if (m_firstpopulation) { settingsOpenStatus(fieldlist[0]); } @@ -141,7 +147,11 @@ void Clients::populateTable() item.setNumericFld(col++, fld.next()); /* uname */ - item.setTextFld(col++, fld.next()); + if (fld.hasNext()) { + item.setTextFld(col++, fld.next()); + } else { + item.setTextFld(col++, ""); + } row++; } @@ -150,7 +160,7 @@ void Clients::populateTable() /* set default sorting */ tableWidget->sortByColumn(sortcol, sortord); tableWidget->setSortingEnabled(true); - + /* Resize rows and columns */ tableWidget->resizeColumnsToContents(); tableWidget->resizeRowsToContents(); @@ -214,8 +224,8 @@ void Clients::tableItemChanged(QTableWidgetItem *currentwidgetitem, QTableWidget } } -/* - * Setup a context menu +/* + * Setup a context menu * Made separate from populate so that it would not create context menu over and * over as the tree is repopulated. */ @@ -274,7 +284,7 @@ void Clients::currentStackItem() } /* - * Function responding to actionPurgeJobs + * Function responding to actionPurgeJobs */ void Clients::consolePurgeJobs() { diff --git a/bacula/src/qt-console/clients/clients.h b/bacula/src/qt-console/clients/clients.h index 4a7dbf8e2f..cbb593ec30 100644 --- a/bacula/src/qt-console/clients/clients.h +++ b/bacula/src/qt-console/clients/clients.h @@ -1,23 +1,25 @@ #ifndef _CLIENTS_H_ #define _CLIENTS_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * Version $Id$ - * * Dirk Bartley, March 2007 */ @@ -28,7 +30,7 @@ class Clients : public Pages, public Ui::ClientForm { - Q_OBJECT + Q_OBJECT public: Clients(); diff --git a/bacula/src/qt-console/console/console.cpp b/bacula/src/qt-console/console/console.cpp index ade97e5b76..eb8ef45669 100644 --- a/bacula/src/qt-console/console/console.cpp +++ b/bacula/src/qt-console/console/console.cpp @@ -1,24 +1,28 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Console Class * * Written by Kern Sibbald, January MMVII * - */ + */ #include "bat.h" #include "console.h" @@ -37,7 +41,7 @@ Console::Console(QTabWidget *parent) : Pages() m_warningPrevent = false; m_dircommCounter = 0; - /* + /* * Create a connection to the Director and put it in a hash table */ m_dircommHash.insert(m_dircommCounter, new DirComm(this, m_dircommCounter)); @@ -128,7 +132,7 @@ void Console::connect_dir() beginNewCommand(0); } mainWin->set_status(_("Connected")); - + startTimer(); /* start message timer */ } @@ -166,7 +170,7 @@ void Console::populateLists(int conn) dir_cmd(conn, ".jobs", job_list); dir_cmd(conn, ".jobs type=R", restore_list); dir_cmd(conn, ".clients", client_list); - dir_cmd(conn, ".filesets", fileset_list); + dir_cmd(conn, ".filesets", fileset_list); dir_cmd(conn, ".msgs", messages_list); dir_cmd(conn, ".pools", pool_list); dir_cmd(conn, ".storage", storage_list); @@ -219,7 +223,7 @@ bool Console::dir_cmd(const char *cmd, QStringList &results) /* * Send a command to the Director, and return the - * results in a QStringList. + * results in a QStringList. */ bool Console::dir_cmd(int conn, const char *cmd, QStringList &results) { @@ -278,7 +282,7 @@ bool Console::sql_cmd(const char *query, QStringList &results) /* * Send an sql query to the Director, and return the - * results in a QStringList. + * results in a QStringList. */ bool Console::sql_cmd(int &conn, const char *query, QStringList &results, bool donotify) { @@ -296,7 +300,7 @@ bool Console::sql_cmd(int &conn, const char *query, QStringList &results, bool d dircomm->notify(false); } mainWin->waitEnter(); - + pm_strcpy(cmd, ".sql query=\""); pm_strcat(cmd, query); pm_strcat(cmd, "\""); @@ -329,7 +333,7 @@ bool Console::sql_cmd(int &conn, const char *query, QStringList &results, bool d return !mainWin->isClosing(); /* return false if closing */ } -/* +/* * Overloads for * Sending a command to the Director */ @@ -396,9 +400,9 @@ bool Console::get_job_defaults(int &conn, struct job_defaults &job_defs) return get_job_defaults(conn, job_defs, true); } -/* +/* * Send a job name to the director, and read all the resulting - * defaults. + * defaults. */ bool Console::get_job_defaults(int &conn, struct job_defaults &job_defs, bool donotify) { @@ -414,10 +418,12 @@ bool Console::get_job_defaults(int &conn, struct job_defaults &job_defs, bool do } beginNewCommand(conn); bool prevWaitState = mainWin->getWaitState(); - if (!prevWaitState) + if (!prevWaitState) { mainWin->waitEnter(); - if (mainWin->m_connDebug) + } + if (mainWin->m_connDebug) { Pmsg2(000, "job_defaults conn %i %s\n", conn, m_dir->name()); + } scmd = QString(".defaults job=\"%1\"").arg(job_defs.job_name); dircomm->write(scmd); while ((stat = dircomm->read()) > 0) { @@ -509,7 +515,7 @@ void Console::writeSettings() * Read and restore user settings associated with this console */ void Console::readSettings() -{ +{ QFont font = get_font(); QSettings settings(m_dir->name(), "bat"); @@ -576,6 +582,7 @@ void Console::display_textf(const char *fmt, ...) void Console::display_text(const QString buf) { + if (mainWin->isClosing()) return; if (buf.size() != 0) { m_cursor->insertText(buf); update_cursor(); @@ -585,6 +592,7 @@ void Console::display_text(const QString buf) void Console::display_text(const char *buf) { + if (mainWin->isClosing()) return; if (*buf != 0) { m_cursor->insertText(buf); update_cursor(); @@ -593,6 +601,7 @@ void Console::display_text(const char *buf) void Console::display_html(const QString buf) { + if (mainWin->isClosing()) return; if (buf.size() != 0) { m_cursor->insertHtml(buf); update_cursor(); @@ -610,6 +619,9 @@ void Console::beginNewCommand(int conn) { DirComm *dircomm = m_dircommHash.value(conn); + if (dircomm->m_at_main_prompt) { + return; + } for (int i=0; i < 3; i++) { dircomm->write("."); while (dircomm->read() > 0) { @@ -620,11 +632,11 @@ void Console::beginNewCommand(int conn) break; } } - display_text("\n"); + //display_text("\n"); } void Console::displayToPrompt(int conn) -{ +{ DirComm *dircomm = m_dircommHash.value(conn); int stat = 0; @@ -666,7 +678,7 @@ void Console::discardToPrompt(int conn) } QString Console::returnFromPrompt(int conn) -{ +{ DirComm *dircomm = m_dircommHash.value(conn); QString text(""); @@ -686,7 +698,7 @@ QString Console::returnFromPrompt(int conn) /* * When the notifier is enabled, read_dir() will automatically be - * called by the Qt event loop when ever there is any output + * called by the Qt event loop when ever there is any output * from the Director, and read_dir() will then display it on * the console. * @@ -697,7 +709,7 @@ QString Console::returnFromPrompt(int conn) /* dual purpose function to turn notify off and return a connection */ int Console::notifyOff() -{ +{ int conn = 0; if (getDirComm(conn)) { notify(conn, false); @@ -707,7 +719,7 @@ int Console::notifyOff() /* knowing a connection, turn notify off or on */ bool Console::notify(int conn, bool enable) -{ +{ DirComm *dircomm = m_dircommHash.value(conn); if (dircomm) { return dircomm->notify(enable); @@ -732,8 +744,8 @@ void Console::setDirectorTreeItem(QTreeWidgetItem *item) m_directorTreeItem = item; } -void Console::setDirRes(DIRRES *dir) -{ +void Console::setDirRes(DIRRES *dir) +{ m_dir = dir; } @@ -769,7 +781,7 @@ bool Console::hasFocus() return false; } -/* For adding feature to have the gui's messages button change when +/* For adding feature to have the gui's messages button change when * messages are pending */ bool Console::messagesPending(bool pend) { @@ -864,13 +876,13 @@ bool Console::getDirComm(int &conn) /* * Try to find a free (unused but established) connection * KES: Note, I think there is a problem here because for - * some reason, the notifier is often turned off on file + * some reason, the notifier is often turned off on file * descriptors that seem to me to be available. That means * that we do not use a free descriptor and thus we will create * a new connection that is maybe not necessary. Someone needs * to look into whether or not notify() is correctly turned on * when we are back at the command prompt and idle. - * + * */ bool Console::findDirComm(int &conn) { @@ -882,7 +894,7 @@ bool Console::findDirComm(int &conn) return true; } if (mainWin->m_connDebug) { - Pmsg4(000, "currentDirComm=%d at_prompt=%d at_main=%d && notify=%d\n", + Pmsg4(000, "currentDirComm=%d at_prompt=%d at_main=%d && notify=%d\n", dircomm->m_conn, dircomm->m_at_prompt, dircomm->m_at_main_prompt, dircomm->is_notify_enabled()); } ++iter; diff --git a/bacula/src/qt-console/console/console.h b/bacula/src/qt-console/console/console.h index 1d16764837..e5e6c3a27d 100644 --- a/bacula/src/qt-console/console/console.h +++ b/bacula/src/qt-console/console/console.h @@ -1,23 +1,25 @@ #ifndef _CONSOLE_H_ #define _CONSOLE_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * Version $Id$ - * * Kern Sibbald, January 2007 */ @@ -54,7 +56,7 @@ struct job_defaults { class Console : public Pages, public Ui::ConsoleForm { - Q_OBJECT + Q_OBJECT friend class DirComm; public: @@ -68,7 +70,7 @@ public: int notifyOff(); // enables/disables socket notification - returns the previous state bool notify(int conn, bool enable); // enables/disables socket notification - returns the previous state bool is_notify_enabled(int conn) const; - bool getDirComm(int &conn); + bool getDirComm(int &conn); bool findDirComm(int &conn); void displayToPrompt(int conn); QString returnFromPrompt(int conn); @@ -128,7 +130,7 @@ public: QStringList location_list; public slots: - void connect_dir(); + void connect_dir(); void status_dir(void); void messages(void); void set_font(void); diff --git a/bacula/src/qt-console/fileset/fileset.cpp b/bacula/src/qt-console/fileset/fileset.cpp index a3f49b10dc..1a8a3f97fd 100644 --- a/bacula/src/qt-console/fileset/fileset.cpp +++ b/bacula/src/qt-console/fileset/fileset.cpp @@ -1,27 +1,29 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2009 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* - * Version $Id$ - * * FileSet Class * * Dirk Bartley, March 2007 * - */ + */ #include "bat.h" #include @@ -53,7 +55,7 @@ FileSet::~FileSet() } /* - * The main meat of the class!! The function that querries the director and + * The main meat of the class!! The function that querries the director and * creates the widgets with appropriate values. */ void FileSet::populateTable() @@ -109,13 +111,17 @@ void FileSet::populateTable() /* Iterate through the record returned from the query */ foreach (QString resultline, results) { fieldlist = resultline.split("\t"); + if (fieldlist.size() != 3) { + Pmsg1(000, "Unexpected line %s", resultline.toUtf8().data()); + continue; + } /* remove this fileSet from notFoundList */ int indexOf = notFoundList.indexOf(fieldlist[0]); if (indexOf != -1) { notFoundList.removeAt(indexOf); } TableItemFormatter item(*tableWidget, row); - + /* Iterate through fields in the record */ QStringListIterator fld(fieldlist); int col = 0; @@ -138,11 +144,11 @@ void FileSet::populateTable() item.setTextFld(0, filesetName); row++; } - + /* set default sorting */ tableWidget->sortByColumn(headerlist.indexOf(tr("FileSet Name")), Qt::AscendingOrder); tableWidget->setSortingEnabled(true); - + /* Resize rows and columns */ tableWidget->resizeColumnsToContents(); tableWidget->resizeRowsToContents(); @@ -203,8 +209,8 @@ void FileSet::tableItemChanged(QTableWidgetItem *currentwidgetitem, QTableWidget } } -/* - * Setup a context menu +/* + * Setup a context menu * Made separate from populate so that it would not create context menu over and * over as the tree is repopulated. */ @@ -262,7 +268,7 @@ void FileSet::writeSettings() * Read and restore user settings associated with this page */ void FileSet::readSettings() -{ +{ QSettings settings(m_console->m_dir->name(), "bat"); settings.beginGroup("FileSet"); restoreGeometry(settings.value("geometry").toByteArray()); diff --git a/bacula/src/qt-console/fileset/fileset.h b/bacula/src/qt-console/fileset/fileset.h index d75b112024..90f33b0733 100644 --- a/bacula/src/qt-console/fileset/fileset.h +++ b/bacula/src/qt-console/fileset/fileset.h @@ -1,23 +1,25 @@ #ifndef _FILESET_H_ #define _FILESET_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * Version $Id$ - * * Dirk Bartley, March 2007 */ @@ -28,7 +30,7 @@ class FileSet : public Pages, public Ui::FileSetForm { - Q_OBJECT + Q_OBJECT public: FileSet(); diff --git a/bacula/src/qt-console/help/help.cpp b/bacula/src/qt-console/help/help.cpp index dad2dacb1b..3e99563e7f 100644 --- a/bacula/src/qt-console/help/help.cpp +++ b/bacula/src/qt-console/help/help.cpp @@ -1,25 +1,29 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2010 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* * Help Window class * * Kern Sibbald, May MMVII * - */ + */ #include "bat.h" #include "help.h" diff --git a/bacula/src/qt-console/help/help.h b/bacula/src/qt-console/help/help.h index e2f9a290b9..3d11ef78bf 100644 --- a/bacula/src/qt-console/help/help.h +++ b/bacula/src/qt-console/help/help.h @@ -2,21 +2,25 @@ #define _HELP_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* * Help Window class * @@ -25,14 +29,14 @@ * Kern Sibbald, May MMVII * * $Id$ - */ + */ #include "bat.h" #include "ui_help.h" class Help : public QWidget, public Ui::helpForm { - Q_OBJECT + Q_OBJECT public: Help(const QString &path, const QString &file, QWidget *parent = NULL); diff --git a/bacula/src/qt-console/job/job.cpp b/bacula/src/qt-console/job/job.cpp index ca27d00b05..515ed4739e 100644 --- a/bacula/src/qt-console/job/job.cpp +++ b/bacula/src/qt-console/job/job.cpp @@ -1,19 +1,23 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 2007-2014 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2007-2009 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + #include "bat.h" #include "job.h" #include "util/fmtwidgetitem.h" @@ -28,6 +32,7 @@ Job::Job(QString &jobId, QTreeWidgetItem *parentTreeWidgetItem) : Pages() thisitem->setIcon(0,QIcon(QString::fromUtf8(":images/joblog.png"))); m_cursor = new QTextCursor(textJobLog->document()); + m_bwlimit = 0; m_jobId = jobId; m_timer = NULL; getFont(); @@ -37,6 +42,7 @@ Job::Job(QString &jobId, QTreeWidgetItem *parentTreeWidgetItem) : Pages() connect(pbCancel, SIGNAL(clicked()), this, SLOT(cancelJob())); connect(pbRun, SIGNAL(clicked()), this, SLOT(rerun())); connect(list_Volume, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(showInfoVolume(QListWidgetItem *))); + connect(spin_Bwlimit, SIGNAL(valueChanged(int)), this, SLOT(storeBwLimit(int))); populateAll(); dockPage(); @@ -131,7 +137,7 @@ void Job::populateText() if (mainWin->m_sqlDebug) { Pmsg1(000, "Log query cmd : %s\n", query.toUtf8().data()); } - + QStringList results; if (m_console->sql_cmd(query, results)) { @@ -141,13 +147,13 @@ void Job::populateText() "It is possible you may need to add \"catalog = all\" " "to the Messages resource for this job.\n"), QMessageBox::Ok); return; - } + } QString jobstr("JobId "); /* FIXME: should this be translated ? */ jobstr += m_jobId; QString htmlbuf("
");
-
+  
       /* Iterate through the lines of results. */
       QString field;
       QStringList fieldlist;
@@ -155,7 +161,7 @@ void Job::populateText()
       QString lastSvc;
       foreach (QString resultline, results) {
          fieldlist = resultline.split("\t");
-
+         
          if (fieldlist.size() < 2)
             continue;
 
@@ -164,12 +170,12 @@ void Job::populateText()
          field = fieldlist[1].trimmed();
          int colon = field.indexOf(":");
          if (colon > 0) {
-            /* string is like  : ..."
-             * we split at ':' then remove the jobId xxxx string (always the same) */
+            /* string is like  : ..." 
+             * we split at ':' then remove the jobId xxxx string (always the same) */ 
             QString curSvc(field.left(colon).replace(jobstr,"").trimmed());
             if (curSvc == lastSvc  && curTime == lastTime) {
                curTime.clear();
-               curSvc.clear();
+               curSvc.clear(); 
             } else {
                lastTime = curTime;
                lastSvc = curSvc;
@@ -196,7 +202,7 @@ void Job::populateText()
 //          htmlbuf += "
"; htmlbuf += "\n" + field ; } - + } /* foreach resultline */ htmlbuf += ""; @@ -204,13 +210,17 @@ void Job::populateText() /* full text ready. Here a custom sheet is used to align columns */ QString logSheet(".err {color:#FF0000;}"); textJobLog->document()->setDefaultStyleSheet(logSheet); - textJobLog->document()->setHtml(htmlbuf); + textJobLog->document()->setHtml(htmlbuf); textJobLog->moveCursor(QTextCursor::Start); } /* if results from query */ - + } +void Job::storeBwLimit(int val) +{ + m_bwlimit = val; +} void Job::updateRunInfo() { @@ -219,6 +229,17 @@ void Job::updateRunInfo() QStringList lst; bool parseit=false; +#ifdef xxx + /* This doesn't seem like the right thing to do */ + if (m_bwlimit >= 100) { + cmd = QString("setbandwidth limit=" + QString::number(m_bwlimit) + + " jobid=" + m_jobId); + m_console->dir_cmd(cmd, results); + results.clear(); + m_bwlimit = 0; + } +#endif + cmd = QString(".status client=\"" + m_client + "\" running"); /* * JobId 5 Job backup.2010-12-21_09.28.17_03 is running. @@ -238,13 +259,17 @@ void Job::updateRunInfo() */ QRegExp jobline("(JobId) (\\d+) Job "); QRegExp itemline("([\\w /]+)[:=]\\s*(.+)"); + QRegExp filesline("Files: Examined=([\\d,]+) Backed up=([\\d,])"); QRegExp oldline("Files=([\\d,]+) Bytes=([\\d,]+) Bytes/sec=([\\d,]+) Errors=([\\d,]+)"); + QRegExp restoreline("Files: Restored=([\\d,]+) Expected=([\\d,]+) Completed=([\\d,]+)%"); + QRegExp restoreline2("Files Examined=([\\d,]+) Expected Files=([\\d,]+) Percent Complete=([\\d,]+)"); + QString com(","); QString empty(""); - + if (m_console->dir_cmd(cmd, results)) { foreach (QString mline, results) { - foreach (QString line, mline.split("\n")) { + foreach (QString line, mline.split("\n")) { line = line.trimmed(); if (oldline.indexIn(line) >= 0) { if (parseit) { @@ -256,6 +281,21 @@ void Job::updateRunInfo() } continue; + } else if (filesline.indexIn(line) >= 0) { + if (parseit) { + lst = filesline.capturedTexts(); // Will also catch Backed up + label_FilesExamined->setText(lst[1]); + } + continue; + +// TODO: Need to be fixed +// } else if (restoreline2.indexIn(line) >= 0) { +// if (parseit) { +// lst = filesline.capturedTexts(); +// label_FilesExamined->setText(lst[1]); // Can also handle Expected and Completed +// } +// continue; + } else if (jobline.indexIn(line) >= 0) { lst = jobline.capturedTexts(); lst.removeFirst(); @@ -265,12 +305,12 @@ void Job::updateRunInfo() lst.removeFirst(); } else { - if (mainWin->m_miscDebug) + if (mainWin->m_miscDebug) Pmsg1(0, "bad line=%s\n", line.toUtf8().data()); continue; } if (lst.count() < 2) { - if (mainWin->m_miscDebug) + if (mainWin->m_miscDebug) Pmsg2(0, "bad line=%s count=%d\n", line.toUtf8().data(), lst.count()); } if (lst[0] == "JobId") { @@ -283,36 +323,53 @@ void Job::updateRunInfo() if (!parseit) { continue; } - + // } else if (lst[0] == "Job") { // grpRun->setTitle(lst[1]); - -// + +// // } else if (lst[0] == "VSS") { // } else if (lst[0] == "Level") { // Info->setText(lst[1]); // -// } else if (lst[0] == "JobType") { +// } else if (lst[0] == "JobType" || lst[0] == "Type") { // -// } else if (lst[0] == "JobStarted") { +// } else if (lst[0] == "JobStarted" || lst[0] == "StartTime") { // Started->setText(lst[1]); +#ifdef xxx + if (lst[0] == "Bwlimit") { + int val = lst[1].toInt(); + if (val > 0) { + chk_Bwlimit->setChecked(true); + spin_Bwlimit->setEnabled(true); + spin_Bwlimit->setValue(lst[1].toInt()/1024); + } else { + chk_Bwlimit->setEnabled(false); + spin_Bwlimit->setEnabled(false); + spin_Bwlimit->setValue(0); + } +#endif + if (lst[0] == "Errors") { label_JobErrors->setText(lst[1]); - + } else if (lst[0] == "Bytes/sec") { label_Speed->setText(convertBytesSI(lst[1].toULongLong())+"/s"); - - } else if (lst[0] == "Files") { + + } else if (lst[0] == "Files" || lst[0] == "JobFiles") { label_JobFiles->setText(lst[1]); - - } else if (lst[0] == "Bytes") { + + } else if (lst[0] == "Bytes" || lst[0] == "JobBytes") { label_JobBytes->setText(convertBytesSI(lst[1].toULongLong())); + + } else if (lst[0] == "Examined") { + label_FilesExamined->setText(lst[1]); } else if (lst[0] == "Files Examined") { label_FilesExamined->setText(lst[1]); - + } else if (lst[0] == "Processing file") { label_CurrentFile->setText(lst[1]); } @@ -328,14 +385,14 @@ void Job::populateForm() { QString stat, err; char buf[256]; - QString query = + QString query = "SELECT JobId, Job.Name, Level, Client.Name, Pool.Name, FileSet," "SchedTime, StartTime, EndTime, EndTime-StartTime AS Duration, " "JobBytes, JobFiles, JobErrors, JobStatus, PurgedFiles " "FROM Job JOIN Client USING (ClientId) " "LEFT JOIN Pool ON (Job.PoolId = Pool.PoolId) " "LEFT JOIN FileSet ON (Job.FileSetId = FileSet.FileSetId)" - "WHERE JobId=" + m_jobId; + "WHERE JobId=" + m_jobId; QStringList results; if (m_console->sql_cmd(query, results)) { QString resultline, duration; @@ -343,10 +400,14 @@ void Job::populateForm() foreach (resultline, results) { // should have only one result fieldlist = resultline.split("\t"); + if (fieldlist.size() != 15) { + Pmsg1(000, "Unexpected line %s", resultline.toUtf8().data()); + continue; + } QStringListIterator fld(fieldlist); label_JobId->setText(fld.next()); label_Name->setText(fld.next()); - + label_Level->setText(job_level_to_str(fld.next()[0].toAscii())); m_client = fld.next(); @@ -357,9 +418,9 @@ void Job::populateForm() label_StartTime->setText(fld.next()); label_EndTime->setText(fld.next()); duration = fld.next(); - /* + /* * Note: if we have a negative duration, it is because the EndTime - * is zero (i.e. the Job is still running). We should use + * is zero (i.e. the Job is still running). We should use * duration = StartTime - current_time */ if (duration.left(1) == "-") { @@ -405,16 +466,16 @@ void Job::populateForm() } } } - + void Job::populateVolumes() { - QString query = + QString query = "SELECT DISTINCT VolumeName, InChanger, Slot " "FROM Job JOIN JobMedia USING (JobId) JOIN Media USING (MediaId) " - "WHERE JobId=" + m_jobId + " ORDER BY VolumeName "; + "WHERE JobId=" + m_jobId + " ORDER BY VolumeName "; if (mainWin->m_sqlDebug) Pmsg1(0, "Query cmd : %s\n",query.toUtf8().data()); - + QStringList results; if (m_console->sql_cmd(query, results)) { @@ -424,7 +485,7 @@ void Job::populateVolumes() foreach (resultline, results) { // should have only one result fieldlist = resultline.split("\t"); QStringListIterator fld(fieldlist); -// QListWidgetItem(QIcon(":/images/inchanger" + fld.next() + ".png"), +// QListWidgetItem(QIcon(":/images/inchanger" + fld.next() + ".png"), // fld.next(), list_Volume); list_Volume->addItem(fld.next()); } diff --git a/bacula/src/qt-console/job/job.h b/bacula/src/qt-console/job/job.h index 9c08c175d2..44d328a0c7 100644 --- a/bacula/src/qt-console/job/job.h +++ b/bacula/src/qt-console/job/job.h @@ -1,19 +1,23 @@ #ifndef _JOB_H_ #define _JOB_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ #include @@ -22,7 +26,7 @@ class Job : public Pages, public Ui::JobForm { - Q_OBJECT + Q_OBJECT public: Job(QString &jobId, QTreeWidgetItem *parentTreeWidgetItem); @@ -33,6 +37,7 @@ public slots: void cancelJob(); void showInfoVolume(QListWidgetItem *); void rerun(); + void storeBwLimit(int val); private slots: @@ -46,6 +51,7 @@ private: QString m_jobId; QString m_client; QTimer *m_timer; + int m_bwlimit; }; #endif /* _JOB_H_ */ diff --git a/bacula/src/qt-console/job/job.ui b/bacula/src/qt-console/job/job.ui index 6f3305cbe6..a60cb74715 100644 --- a/bacula/src/qt-console/job/job.ui +++ b/bacula/src/qt-console/job/job.ui @@ -692,6 +692,35 @@ + + + + false + + + kB/s + + + 100 + + + 200000 + + + 100 + + + 200000 + + + + + + + Bandwidth Limit: + + + diff --git a/bacula/src/qt-console/jobgraphs/jobplot.cpp b/bacula/src/qt-console/jobgraphs/jobplot.cpp index 510d9f0e84..1b14e41b24 100644 --- a/bacula/src/qt-console/jobgraphs/jobplot.cpp +++ b/bacula/src/qt-console/jobgraphs/jobplot.cpp @@ -1,27 +1,29 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2007 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* - * Version $Id$ - * * JobPlots Class * * Dirk Bartley, March 2007 * - */ + */ #include "bat.h" #include @@ -181,7 +183,7 @@ void JobPlot::setupControls() controls->limitSpinBox->setValue(mainWin->m_recordLimitVal); controls->daysCheckBox->setCheckState(mainWin->m_daysLimitCheck ? Qt::Checked : Qt::Unchecked); controls->daysSpinBox->setValue(mainWin->m_daysLimitVal); - } + } } /* @@ -248,7 +250,7 @@ void JobPlot::runQuery() QString field; QStringList fieldlist; - + int row = 0; /* Iterate through the record returned from the query */ foreach (resultline, results) { @@ -271,7 +273,7 @@ void JobPlot::runQuery() } row++; } - } + } if ((controls->volumeComboBox->itemText(volumeIndex) != tr("Any")) && (results.count() == 0)){ /* for context sensitive searches, let the user know if there were no * * results */ @@ -308,7 +310,7 @@ void JobPlot::setupUserInterface() area->setObjectName(QString::fromUtf8("area")); controls = new JobPlotControls(); area->setWidget(controls); - + m_splitter->addWidget(m_jobPlot); m_splitter->addWidget(area); @@ -386,7 +388,7 @@ void JobPlot::addCurve() } QDateTime mdt = QDateTime::fromString(monthBegin, mainWin->m_dtformat); double monbeg = mdt.toTime_t(); - + // ...a vertical line at the first of each month QwtPlotMarker *mX = new QwtPlotMarker(); mX->setLabel(mdt.toString("MMM-d")); @@ -436,7 +438,7 @@ void JobPlot::setPlotType(QString currentText) void JobPlot::fillSymbolCombo(QComboBox *q) { q->addItem( tr("Ellipse"), (int)QwtSymbol::Ellipse); - q->addItem( tr("Rect"), (int)QwtSymbol::Rect); + q->addItem( tr("Rect"), (int)QwtSymbol::Rect); q->addItem( tr("Diamond"), (int)QwtSymbol::Diamond); q->addItem( tr("Triangle"), (int)QwtSymbol::Triangle); q->addItem( tr("DTrianle"), (int)QwtSymbol::DTriangle); @@ -449,7 +451,7 @@ void JobPlot::fillSymbolCombo(QComboBox *q) q->addItem( tr("Vline"), (int)QwtSymbol::VLine); q->addItem( tr("Star1"), (int)QwtSymbol::Star1); q->addItem( tr("Star2"), (int)QwtSymbol::Star2); - q->addItem( tr("Hexagon"), (int)QwtSymbol::Hexagon); + q->addItem( tr("Hexagon"), (int)QwtSymbol::Hexagon); q->addItem( tr("None"), (int)QwtSymbol::NoSymbol); } @@ -478,7 +480,7 @@ void JobPlot::setSymbolType(int index, int type) sym.setStyle( (QwtSymbol::Style)style.toInt() ); sym.setBrush(QColor(Qt::yellow)); m_fileCurve->setSymbol(sym); - + } else { style = controls->byteSymbolTypeCombo->itemData(index); sym.setStyle( (QwtSymbol::Style)style.toInt() ); @@ -533,7 +535,7 @@ void JobPlot::writeSettings() settings.endGroup(); } -/* +/* * Read settings values for Controls */ void JobPlot::readControlSettings() @@ -559,7 +561,7 @@ void JobPlot::readSplitterSettings() { QSettings settings(m_console->m_dir->name(), "bat"); settings.beginGroup("JobPlot"); - if (settings.contains("m_splitterSizes")) { + if (settings.contains("m_splitterSizes")) { m_splitter->restoreState(settings.value("m_splitterSizes").toByteArray()); } settings.endGroup(); diff --git a/bacula/src/qt-console/jobgraphs/jobplot.h b/bacula/src/qt-console/jobgraphs/jobplot.h index c418bff90e..4297b4be4c 100644 --- a/bacula/src/qt-console/jobgraphs/jobplot.h +++ b/bacula/src/qt-console/jobgraphs/jobplot.h @@ -1,23 +1,25 @@ #ifndef _JOBPLOT_H_ #define _JOBPLOT_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * Version $Id$ - * * Dirk Bartley, March 2007 */ @@ -48,7 +50,7 @@ struct PlotJobData /* * Class for the purpose of having a single object to pass data to the JobPlot - * Constructor. The other option was a constructor with this many passed + * Constructor. The other option was a constructor with this many passed * values or some sort of code to parse a list. I liked this best at the time. */ class JobPlotPass @@ -100,7 +102,7 @@ public: */ class JobPlot : public Pages { - Q_OBJECT + Q_OBJECT public: JobPlot(QTreeWidgetItem *parentTreeWidgetItem, JobPlotPass &); diff --git a/bacula/src/qt-console/joblist/joblist.cpp b/bacula/src/qt-console/joblist/joblist.cpp index 222043a8aa..4afbb68fc5 100644 --- a/bacula/src/qt-console/joblist/joblist.cpp +++ b/bacula/src/qt-console/joblist/joblist.cpp @@ -1,24 +1,26 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2009 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * Version $Id$ - * * Dirk Bartley, March 2007 */ - + #include "bat.h" #include #include @@ -110,8 +112,8 @@ void JobList::populateTable() /* Set up the Header for the table */ QStringList headerlist = (QStringList() - << tr("Job Id") << tr("Job Name") << tr("Client") << tr("Job Starttime") - << tr("Job Type") << tr("Job Level") << tr("Job Files") + << tr("Job Id") << tr("Job Name") << tr("Client") << tr("Job Starttime") + << tr("Job Type") << tr("Job Level") << tr("Job Files") << tr("Job Bytes") << tr("Job Status") << tr("Purged") << tr("File Set") << tr("Pool Name") << tr("First Volume") << tr("VolCount")); @@ -157,7 +159,7 @@ void JobList::populateTable() continue; /* some fields missing, ignore row */ TableItemFormatter jobitem(*mp_tableWidget, row); - + /* Iterate through fields in the record */ QStringListIterator fld(fieldlist); int col = 0; @@ -205,11 +207,11 @@ void JobList::populateTable() jobitem.setNumericFld(col++, fld.next()); row++; } - } + } /* set default sorting */ mp_tableWidget->sortByColumn(m_jobIdIndex, Qt::DescendingOrder); mp_tableWidget->setSortingEnabled(true); - + /* Resize the columns */ mp_tableWidget->resizeColumnsToContents(); mp_tableWidget->resizeRowsToContents(); @@ -266,7 +268,7 @@ void JobList::fillQueryString(QString &query) m_mediaName = volumeComboBox->itemText(volumeIndex); QString distinct = ""; if (m_mediaName != tr("Any")) { distinct = "DISTINCT "; } - query += "SELECT " + distinct + "Job.JobId AS JobId, Job.Name AS JobName, " + query += "SELECT " + distinct + "Job.JobId AS JobId, Job.Name AS JobName, " " Client.Name AS Client," " Job.Starttime AS JobStart, Job.Type AS JobType," " Job.Level AS BackupLevel, Job.Jobfiles AS FileCount," @@ -384,7 +386,7 @@ void JobList::treeWidgetName(QString &desc) */ void JobList::createConnections() { - /* connect to the action specific to this pages class that shows up in the + /* connect to the action specific to this pages class that shows up in the * page selector tree */ connect(actionRefreshJobList, SIGNAL(triggered()), this, SLOT(populateTable())); connect(refreshButton, SIGNAL(pressed()), this, SLOT(populateTable())); diff --git a/bacula/src/qt-console/joblist/joblist.h b/bacula/src/qt-console/joblist/joblist.h index 9f13912ab7..1a154ba134 100644 --- a/bacula/src/qt-console/joblist/joblist.h +++ b/bacula/src/qt-console/joblist/joblist.h @@ -1,23 +1,25 @@ #ifndef _JOBLIST_H_ #define _JOBLIST_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * Version $Id$ - * * Dirk Bartley, March 2007 */ @@ -28,10 +30,10 @@ class JobList : public Pages, public Ui::JobListForm { - Q_OBJECT + Q_OBJECT public: - JobList(const QString &medianame, const QString &clientname, + JobList(const QString &medianame, const QString &clientname, const QString &jobname, const QString &filesetname, QTreeWidgetItem *); ~JobList(); virtual void PgSeltreeWidgetClicked(); diff --git a/bacula/src/qt-console/joblog/joblog.cpp b/bacula/src/qt-console/joblog/joblog.cpp index 871edb3e8d..11d8bb9844 100644 --- a/bacula/src/qt-console/joblog/joblog.cpp +++ b/bacula/src/qt-console/joblog/joblog.cpp @@ -1,27 +1,29 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2009 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* - * Version $Id$ - * * JobLog Class * * Dirk Bartley, March 2007 * - */ + */ #include "bat.h" #include "joblog.h" @@ -69,24 +71,24 @@ void JobLog::populateText() if (mainWin->m_sqlDebug) { Pmsg1(000, "Log query cmd : %s\n", query.toUtf8().data()); } - + QStringList results; if (m_console->sql_cmd(query, results)) { if (!results.size()) { QMessageBox::warning(this, tr("Bat"), tr("There were no results!\n" - "It is possible you may need to add \"catalog = all\" " - "to the Messages resource for this job.\n"), QMessageBox::Ok); - return; - } + "It is possible you may need to add \"catalog = all\" " + "to the Messages resource for this job.\n"), QMessageBox::Ok); + return; + } QString jobstr("JobId "); /* FIXME: should this be translated ? */ jobstr += m_jobId; QString htmlbuf("" + tr("Log records for job %1").arg(m_jobId) ); htmlbuf += "
" + curTime + "
"; - + /* Iterate through the lines of results. */ QString field; QStringList fieldlist; @@ -94,52 +96,52 @@ void JobLog::populateText() QString lastSvc; foreach (QString resultline, results) { fieldlist = resultline.split("\t"); - - if (fieldlist.size() < 2) - continue; - - htmlbuf +=""; - - QString curTime = fieldlist[0].trimmed(); - - field = fieldlist[1].trimmed(); - int colon = field.indexOf(":"); - if (colon > 0) { - /* string is like : ..." - * we split at ':' then remove the jobId xxxx string (always the same) */ - QString curSvc(field.left(colon).replace(jobstr,"").trimmed()); - if (curSvc == lastSvc && curTime == lastTime) { - curTime.clear(); - curSvc.clear(); - } else { - lastTime = curTime; - lastSvc = curSvc; - } - htmlbuf += ""; - htmlbuf += ""; - - /* rest of string is marked as pre-formatted (here trimming should - * be avoided, to preserve original formatting) */ - QString msg(field.mid(colon+2)); - if (msg.startsWith( tr("Error:")) ) { /* FIXME: should really be translated ? */ - /* error msg, use a specific class */ - htmlbuf += ""; - } else { - htmlbuf += ""; - } - } else { - /* non standard string, place as-is */ - if (curTime == lastTime) { - curTime.clear(); - } else { - lastTime = curTime; - } - htmlbuf += ""; - htmlbuf += ""; - } - - htmlbuf += ""; - + + if (fieldlist.size() < 2) + continue; + + htmlbuf +=""; + + QString curTime = fieldlist[0].trimmed(); + + field = fieldlist[1].trimmed(); + int colon = field.indexOf(":"); + if (colon > 0) { + /* string is like : ..." + * we split at ':' then remove the jobId xxxx string (always the same) */ + QString curSvc(field.left(colon).replace(jobstr,"").trimmed()); + if (curSvc == lastSvc && curTime == lastTime) { + curTime.clear(); + curSvc.clear(); + } else { + lastTime = curTime; + lastSvc = curSvc; + } + htmlbuf += ""; + htmlbuf += ""; + + /* rest of string is marked as pre-formatted (here trimming should + * be avoided, to preserve original formatting) */ + QString msg(field.mid(colon+2)); + if (msg.startsWith( tr("Error:")) ) { /* FIXME: should really be translated ? */ + /* error msg, use a specific class */ + htmlbuf += ""; + } else { + htmlbuf += ""; + } + } else { + /* non standard string, place as-is */ + if (curTime == lastTime) { + curTime.clear(); + } else { + lastTime = curTime; + } + htmlbuf += ""; + htmlbuf += ""; + } + + htmlbuf += ""; + } /* foreach resultline */ htmlbuf += "
" + curTime + "

" + curSvc + "

" + msg + "
" + msg + "
" + curTime + "
" + field + "
" + curTime + "

" + curSvc + "

" + msg + "
" + msg + "
" + curTime + "
" + field + "
"; @@ -147,10 +149,10 @@ void JobLog::populateText() /* full text ready. Here a custom sheet is used to align columns */ QString logSheet("p,pre,.err {margin-left: 10px} .err {color:#FF0000;}"); textEdit->document()->setDefaultStyleSheet(logSheet); - textEdit->document()->setHtml(htmlbuf); + textEdit->document()->setHtml(htmlbuf); textEdit->moveCursor(QTextCursor::Start); } /* if results from query */ - + } - + diff --git a/bacula/src/qt-console/joblog/joblog.h b/bacula/src/qt-console/joblog/joblog.h index e890497b23..27d6bbb3f9 100644 --- a/bacula/src/qt-console/joblog/joblog.h +++ b/bacula/src/qt-console/joblog/joblog.h @@ -1,23 +1,25 @@ #ifndef _JOBLOG_H_ #define _JOBLOG_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * Version $Id$ - * * Dirk Bartley, March 2007 */ @@ -27,7 +29,7 @@ class JobLog : public Pages, public Ui::JobLogForm { - Q_OBJECT + Q_OBJECT public: JobLog(QString &jobId, QTreeWidgetItem *parentTreeWidgetItem); diff --git a/bacula/src/qt-console/jobs/jobs.cpp b/bacula/src/qt-console/jobs/jobs.cpp index 2dbff1494b..edb621788b 100644 --- a/bacula/src/qt-console/jobs/jobs.cpp +++ b/bacula/src/qt-console/jobs/jobs.cpp @@ -1,24 +1,28 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* * Jobs Class * * Dirk Bartley, March 2007 - */ + */ #include "bat.h" #include "jobs/jobs.h" @@ -51,7 +55,7 @@ Jobs::~Jobs() } /* - * The main meat of the class!! The function that querries the director and + * The main meat of the class!! The function that querries the director and * creates the widgets with appropriate values. */ void Jobs::populateTable() @@ -65,9 +69,9 @@ void Jobs::populateTable() m_checkcurwidget = false; tableWidget->clear(); m_checkcurwidget = true; - QStringList headerlist = (QStringList() << tr("Job Name") - << tr("Pool") << tr("Messages") << tr("Client") - << tr("Storage") << tr("Level") << tr("Type") + QStringList headerlist = (QStringList() << tr("Job Name") + << tr("Pool") << tr("Messages") << tr("Client") + << tr("Storage") << tr("Level") << tr("Type") << tr("FileSet") << tr("Catalog") << tr("Enabled") << tr("Where")); @@ -89,7 +93,7 @@ void Jobs::populateTable() if (m_console->get_job_defaults(job_defs)) { int col = 0; TableItemFormatter jobsItem(*tableWidget, row); - jobsItem.setTextFld(col++, jobName); + jobsItem.setTextFld(col++, jobName); jobsItem.setTextFld(col++, job_defs.pool_name); jobsItem.setTextFld(col++, job_defs.messages_name); jobsItem.setTextFld(col++, job_defs.client_name); @@ -106,7 +110,7 @@ void Jobs::populateTable() /* set default sorting */ tableWidget->sortByColumn(headerlist.indexOf(tr("Job Name")), Qt::AscendingOrder); tableWidget->setSortingEnabled(true); - + /* Resize rows and columns */ tableWidget->resizeColumnsToContents(); tableWidget->resizeRowsToContents(); @@ -165,8 +169,8 @@ void Jobs::tableItemChanged(QTableWidgetItem *currentwidgetitem, QTableWidgetIte } } -/* - * Setup a context menu +/* + * Setup a context menu * Made separate from populate so that it would not create context menu over and * over as the table is repopulated. */ @@ -252,7 +256,7 @@ void Jobs::listJobs() } /* - * Open a new job run page with the currently selected job + * Open a new job run page with the currently selected job * defaulted In */ void Jobs::runJob() diff --git a/bacula/src/qt-console/jobs/jobs.h b/bacula/src/qt-console/jobs/jobs.h index 0b77ac5e5b..425a398ac3 100644 --- a/bacula/src/qt-console/jobs/jobs.h +++ b/bacula/src/qt-console/jobs/jobs.h @@ -1,23 +1,25 @@ #ifndef _JOBS_H_ #define _JOBS_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * Version $Id$ - * * Dirk Bartley, March 2007 */ @@ -28,7 +30,7 @@ class Jobs : public Pages, public Ui::jobsForm { - Q_OBJECT + Q_OBJECT public: Jobs(); diff --git a/bacula/src/qt-console/label/label.cpp b/bacula/src/qt-console/label/label.cpp index 914e4276d8..fae53a770a 100644 --- a/bacula/src/qt-console/label/label.cpp +++ b/bacula/src/qt-console/label/label.cpp @@ -1,25 +1,29 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2011 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* * Label Page class * * Kern Sibbald, February MMVII * - */ + */ #include "bat.h" #include "label.h" @@ -81,7 +85,7 @@ void labelPage::okButtonPushed() scmd = QString("label volume=\"%1\" pool=\"%2\" storage=\"%3\" slot=%4\n") .arg(volumeName->text()) .arg(poolCombo->currentText()) - .arg(storageCombo->currentText()) + .arg(storageCombo->currentText()) .arg(slotSpin->value()); if (mainWin->m_commandDebug) { Pmsg1(000, "sending command : %s\n", scmd.toUtf8().data()); diff --git a/bacula/src/qt-console/label/label.h b/bacula/src/qt-console/label/label.h index 6f5bd2b4b0..ff87637401 100644 --- a/bacula/src/qt-console/label/label.h +++ b/bacula/src/qt-console/label/label.h @@ -1,19 +1,23 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ -/* +/* * Kern Sibbald, February MMVII */ @@ -27,7 +31,7 @@ class labelPage : public Pages, public Ui::labelForm { - Q_OBJECT + Q_OBJECT public: labelPage(); diff --git a/bacula/src/qt-console/main.cpp b/bacula/src/qt-console/main.cpp index 870cabca0f..9e8c723be1 100644 --- a/bacula/src/qt-console/main.cpp +++ b/bacula/src/qt-console/main.cpp @@ -1,24 +1,28 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Main program for bat (qt-console) * * Written by Kern Sibbald, January MMVII * - */ + */ #include "bat.h" @@ -38,7 +42,7 @@ MainWin *mainWin; QApplication *app; /* Forward referenced functions */ -void terminate_console(int sig); +void terminate_console(int sig); static void usage(); static int check_resources(); @@ -59,11 +63,11 @@ int main(int argc, char *argv[]) bool test_config = false; - app = new QApplication(argc, argv); + app = new QApplication(argc, argv); app->setStyle(new QPlastiqueStyle()); app->setQuitOnLastWindowClosed(true); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); - + QTranslator qtTranslator; qtTranslator.load(QString("qt_") + QLocale::system().name(),QLibraryInfo::location(QLibraryInfo::TranslationsPath)); app->installTranslator(&qtTranslator); @@ -90,13 +94,14 @@ int main(int argc, char *argv[]) init_msg(NULL, NULL); working_directory = "/tmp"; +#ifndef HAVE_WIN32 struct sigaction sigignore; sigignore.sa_flags = 0; sigignore.sa_handler = SIG_IGN; sigfillset(&sigignore.sa_mask); sigaction(SIGPIPE, &sigignore, NULL); sigaction(SIGUSR2, &sigignore, NULL); - +#endif while ((ch = getopt(argc, argv, "bc:d:r:st?")) != -1) { switch (ch) { @@ -169,7 +174,9 @@ int main(int argc, char *argv[]) void terminate_console(int /*sig*/) { -// WSA_Cleanup(); /* TODO: check when we have to call it */ +#ifdef HAVE_WIN32 + WSACleanup(); /* TODO: check when we have to call it */ +#endif exit(0); } @@ -225,7 +232,7 @@ static int check_resources() ok = false; } } - + if (numdir == 0) { Emsg1(M_FATAL, 0, _("No Director resource defined in %s\n" "Without that I don't how to speak to the Director :-(\n"), configfile); diff --git a/bacula/src/qt-console/mainwin.cpp b/bacula/src/qt-console/mainwin.cpp index 6425ca3c84..835f7156ba 100644 --- a/bacula/src/qt-console/mainwin.cpp +++ b/bacula/src/qt-console/mainwin.cpp @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2010 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* @@ -20,7 +24,7 @@ * * Kern Sibbald, January MMVII * - */ + */ #include "bat.h" #include "version.h" @@ -44,7 +48,7 @@ #include "status/dirstat.h" #include "util/fmtwidgetitem.h" -/* +/* * Daemon message callback */ void message_callback(int /* type */, char *msg) @@ -85,7 +89,7 @@ MainWin::MainWin(QWidget *parent) : QMainWindow(parent) foreach(Console *console, m_consoleHash) { console->connect_dir(); } - /* + /* * Note, the notifier is now a global flag, although each notifier * can be individually turned on and off at a socket level. Once * the notifier is turned off, we don't accept anything from anyone @@ -157,8 +161,8 @@ void MainWin::createPages() item->setForeground(0, redBrush); /* - * Create instances in alphabetic order of the rest - * of the classes that will by default exist under each Director. + * Create instances in alphabetic order of the rest + * of the classes that will by default exist under each Director. */ new bRestore(); new Clients(); @@ -305,7 +309,7 @@ void MainWin::disconnectSignals() */ void MainWin::waitEnter() { - if (m_waitState || m_isClosing) { + if (m_waitState || m_isClosing) { return; } m_waitState = true; @@ -351,7 +355,7 @@ void MainWin::disconnectConsoleSignals(Console *console) } -/* +/* * Two functions to respond to menu items to repop lists and execute reload and repopulate * the lists for jobs, clients, filesets .. .. */ @@ -366,8 +370,8 @@ void MainWin::reloadRepopLists() m_currentConsole->populateLists(false); } -/* - * Reimplementation of QWidget closeEvent virtual function +/* + * Reimplementation of QWidget closeEvent virtual function */ void MainWin::closeEvent(QCloseEvent *event) { @@ -413,7 +417,7 @@ void MainWin::writeSettings() } void MainWin::readSettings() -{ +{ QSettings settings("bacula.org", "bat"); settings.beginGroup("MainWin"); @@ -425,7 +429,7 @@ void MainWin::readSettings() /* * This subroutine is called with an item in the Page Selection window - * is clicked + * is clicked */ void MainWin::treeItemClicked(QTreeWidgetItem *item, int /*column*/) { @@ -478,7 +482,7 @@ void MainWin::treeItemChanged(QTreeWidgetItem *currentitem, QTreeWidgetItem *pre nextPage = NULL; nextConsole = NULL; } - + /* The Previous item */ /* this condition prevents a segfault. The first time there is no previousitem*/ @@ -506,7 +510,7 @@ void MainWin::treeItemChanged(QTreeWidgetItem *currentitem, QTreeWidgetItem *pre } /* process the current (next) item */ - + if ((nextPage) || (nextConsole)) { if (nextConsole != previousConsole) { /* make connections to the current console */ @@ -521,7 +525,7 @@ void MainWin::treeItemChanged(QTreeWidgetItem *currentitem, QTreeWidgetItem *pre /* set the value for the currently active console */ int stackindex = tabWidget->indexOf(nextPage); nextPage->firstUseDock(); - + /* Is this page currently on the stack or is it undocked */ if (stackindex >= 0) { /* put this page on the top of the stack */ @@ -544,22 +548,22 @@ void MainWin::treeItemChanged(QTreeWidgetItem *currentitem, QTreeWidgetItem *pre } } -void MainWin::labelButtonClicked() +void MainWin::labelButtonClicked() { new labelPage(); } -void MainWin::runButtonClicked() +void MainWin::runButtonClicked() { new runPage(""); } -void MainWin::estimateButtonClicked() +void MainWin::estimateButtonClicked() { new estimatePage(); } -void MainWin::browseButtonClicked() +void MainWin::browseButtonClicked() { // new restoreTree(); } @@ -581,7 +585,7 @@ void MainWin::statusPageButtonClicked() } } -void MainWin::restoreButtonClicked() +void MainWin::restoreButtonClicked() { new prerestorePage(); if (mainWin->m_miscDebug) Pmsg0(000, "in restoreButtonClicked after prerestorePage\n"); @@ -624,9 +628,8 @@ void MainWin::input_line() void MainWin::about() { QMessageBox::about(this, tr("About bat"), - tr("

Bat %1 (%2), by Dirk H Bartley and Kern Sibbald

" - "

Copyright © 2007-%3 Free Software Foundation Europe e.V." - "

Improved by Bacula Systems SA." + tr("

Bacula Bat %1 (%2)

" + "

Copyright © 2007-%3 Kern Sibbald" "

The bat is an administrative console" " interface to the Director.").arg(VERSION).arg(BDATE).arg(BYEAR)); } @@ -673,14 +676,14 @@ void MainWin::undockWindowButton() } /* - * Function to respond to action on page selector context menu to toggle the + * Function to respond to action on page selector context menu to toggle the * dock status of the window associated with the page selectors current * tree widget item. */ void MainWin::toggleDockContextWindow() { QTreeWidgetItem *currentitem = treeWidget->currentItem(); - + /* Is this a page that has been inserted into the hash */ if (getFromHash(currentitem)) { Pages* page = getFromHash(currentitem); @@ -776,8 +779,8 @@ void MainWin::closePage(int item) if (getFromHash(currentitem)) { page = getFromHash(currentitem); } - } - + } + if (page) { if (page->isCloseable()) { page->closeStackPage(); @@ -967,7 +970,7 @@ void MainWin::readPreferences() settings.beginGroup("Misc"); m_longList = settings.value("longList", false).toBool(); ItemFormatterBase::setBytesConversion( - (ItemFormatterBase::BYTES_CONVERSION) settings.value("byteConvert", + (ItemFormatterBase::BYTES_CONVERSION) settings.value("byteConvert", ItemFormatterBase::BYTES_CONVERSION_IEC).toInt()); m_openPlot = settings.value("openplot", false).toBool(); m_openBrowser = settings.value("openbrowser", false).toBool(); diff --git a/bacula/src/qt-console/mainwin.h b/bacula/src/qt-console/mainwin.h index f29464a55a..3d96e76b70 100644 --- a/bacula/src/qt-console/mainwin.h +++ b/bacula/src/qt-console/mainwin.h @@ -1,21 +1,23 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ -/* - * Version $Id$ - * +/* * qt-console main window class definition. * * Written by Kern Sibbald, January MMVII @@ -31,7 +33,7 @@ class Console; class Pages; -class MainWin : public QMainWindow, public Ui::MainForm +class MainWin : public QMainWindow, public Ui::MainForm { Q_OBJECT @@ -130,8 +132,8 @@ protected: private: void connectConsole(); void createPages(); - void connectSignals(); - void disconnectSignals(); + void connectSignals(); + void disconnectSignals(); void connectConsoleSignals(); void disconnectConsoleSignals(Console *console); diff --git a/bacula/src/qt-console/make-win32 b/bacula/src/qt-console/make-win32 index 5b1bab2e6e..9ee9a3dd86 100755 --- a/bacula/src/qt-console/make-win32 +++ b/bacula/src/qt-console/make-win32 @@ -1,40 +1,73 @@ #!/bin/sh # -# Used to build the Win32 version of bat +# Used to build the Win32/Win64 version of bat # + +prepare_bat_build () +{ + local version=$1 + local dpkgs_mingw + if test -d ../win32/release${version}; then + + + if [ ${version} -eq 32 ] + then + depkgs_mingw='depkgs-mingw32' + + elif [ ${version} -eq 64 ] + then + depkgs_mingw='depkgs-mingw-w64' + else + echo "wrong version - '${version}'." + exit 1 + fi + + cp -f ${DEPKGS}/${depkgs_mingw}/lib/qt/QtGui4.dll ../win32/release${version} + cp -f ${DEPKGS}/${depkgs_mingw}/lib/qt/QtCore4.dll ../win32/release${version} + + rm -rf ../win32/release${version}/help + mkdir ../win32/release${version}/help + cp -f help/*.html ../win32/release${version}/help/ + cp -f images/status.png ../win32/release${version}/help/ + cp -f images/mail-message-new.png ../win32/release${version}/help/ + qmake -spec win32 -unix -o Makefile.mingw${version} bat.pro.mingw${version} + echo "Make Windows bat" + make -j3 -f Makefile.mingw${version} $2 + if test -f release/bat.exe; then + cp -f release/bat.exe ../win32/release${version} + else + cp -f debug/bat.exe ../win32/release${version} + fi + fi +} + +prepare_tray_monitor_build () +{ + local version=$1 + cd tray-monitor + qmake -spec ../win32 -unix -o Makefile.mingw${version} tray-monitor.pro.mingw${version} + echo "Make Windows tray-monitor" + make -j3 -f Makefile.mingw${version} $2 + if test -f release/bacula-tray-monitor.exe; then + cp -f release/bacula-tray-monitor.exe ../../win32/release${version} + else + cp -f debug/bacula-tray-monitor.exe ../../win32/release${version} + fi + rm -f release/bacula-tray-monitor.exe debug/bacula-tray-monitor.exe + cd .. +} + +readonly BUILD_ARCH="$1" + rm -f debug/bat.exe if test -f ../config.h ; then mv -f ../config.h ../config.h.orig fi -qmake -spec win32 -unix -o Makefile.mingw32 bat.pro.mingw32 -echo "Make Windows bat" -make -j3 -f Makefile.mingw32 $1 + +prepare_bat_build ${BUILD_ARCH:-64} + if test -e ../config.h.orig ; then mv -f ../config.h.orig ../config.h fi -if test -d ../win32/release32; then - if test -f release/bat.exe; then - cp -f release/bat.exe ../win32/release32 - else - cp -f debug/bat.exe ../win32/release32 - fi - cp -f ${DEPKGS}/depkgs-mingw32/lib/qt/QtGui4.dll ../win32/release32 - cp -f ${DEPKGS}/depkgs-mingw32/lib/qt/QtCore4.dll ../win32/release32 - rm -rf ../win32/release32/help - mkdir ../win32/release32/help - cp -f help/*.html ../win32/release32/help/ - cp -f images/status.png ../win32/release32/help/ - cp -f images/mail-message-new.png ../win32/release32/help/ -fi -cd tray-monitor -rm -f release/bacula-tray-monitor.exe debug/bacula-tray-monitor.exe -qmake -spec ../win32 -unix -o Makefile.mingw32 tray-monitor.pro -echo "Make Windows tray-monitor" -make -j3 -f Makefile.mingw32 $1 -if test -f release/bacula-tray-monitor.exe; then - cp -f release/bacula-tray-monitor.exe ../../win32/release32 -else - cp -f debug/bacula-tray-monitor.exe ../../win32/release32 -fi -cd .. +prepare_tray_monitor_build ${BUILD_ARCH:-64} diff --git a/bacula/src/qt-console/mediaedit/mediaedit.cpp b/bacula/src/qt-console/mediaedit/mediaedit.cpp index 12b1cfa1b7..783c6da246 100644 --- a/bacula/src/qt-console/mediaedit/mediaedit.cpp +++ b/bacula/src/qt-console/mediaedit/mediaedit.cpp @@ -1,24 +1,26 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2009 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * Version $Id$ - * * Dirk Bartley, March 2007 */ - + #include "bat.h" #include #include @@ -26,9 +28,9 @@ #include "mediaedit.h" /* - * A constructor + * A constructor */ -MediaEdit::MediaEdit(QTreeWidgetItem *parentWidget, QString &mediaId) +MediaEdit::MediaEdit(QTreeWidgetItem *parentWidget, QString &mediaId) : Pages() { setupUi(this); @@ -55,7 +57,7 @@ MediaEdit::MediaEdit(QTreeWidgetItem *parentWidget, QString &mediaId) poolCombo->addItems(m_console->pool_list); /* The media's Status */ - QStringList statusList = (QStringList() << "Full" << "Used" << "Append" + QStringList statusList = (QStringList() << "Full" << "Used" << "Append" << "Error" << "Purged" << "Recycle" << "Read-Only" << "Cleaning"); statusCombo->addItems(statusList); @@ -290,7 +292,7 @@ void MediaEdit::useDurationChanged() void MediaEdit::setSpins(int value) { int years, months, days, hours, minutes, seconds, left; - + years = abs(value / 31536000); left = value - years * 31536000; months = abs(left / 2592000); @@ -364,7 +366,7 @@ void MediaEdit::durationChanged() connectSpins(); if (retentionRadio->isChecked()) { int retention; - retention = secondsSpin->value() + minutesSpin->value() * 60 + + retention = secondsSpin->value() + minutesSpin->value() * 60 + hoursSpin->value() * 3600 + daysSpin->value() * 86400 + monthsSpin->value() * 2592000 + yearsSpin->value() * 31536000; @@ -374,7 +376,7 @@ void MediaEdit::durationChanged() } if (useDurationRadio->isChecked()) { int useDuration; - useDuration = secondsSpin->value() + minutesSpin->value() * 60 + + useDuration = secondsSpin->value() + minutesSpin->value() * 60 + hoursSpin->value() * 3600 + daysSpin->value() * 86400 + monthsSpin->value() * 2592000 + yearsSpin->value() * 31536000; diff --git a/bacula/src/qt-console/mediaedit/mediaedit.h b/bacula/src/qt-console/mediaedit/mediaedit.h index 252fc44cd0..7aa986e45f 100644 --- a/bacula/src/qt-console/mediaedit/mediaedit.h +++ b/bacula/src/qt-console/mediaedit/mediaedit.h @@ -1,23 +1,25 @@ #ifndef _MEDIAEDIT_H_ #define _MEDIAEDIT_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * Version $Id$ - * * Dirk Bartley, March 2007 */ @@ -28,7 +30,7 @@ class MediaEdit : public Pages, public Ui::mediaEditForm { - Q_OBJECT + Q_OBJECT public: MediaEdit(QTreeWidgetItem *parentWidget, QString &mediaId); diff --git a/bacula/src/qt-console/mediainfo/mediainfo.cpp b/bacula/src/qt-console/mediainfo/mediainfo.cpp index 040192ad78..6184d4017c 100644 --- a/bacula/src/qt-console/mediainfo/mediainfo.cpp +++ b/bacula/src/qt-console/mediainfo/mediainfo.cpp @@ -1,19 +1,23 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2009 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + #include "bat.h" #include #include @@ -26,9 +30,9 @@ #include "job/job.h" /* - * A constructor + * A constructor */ -MediaInfo::MediaInfo(QTreeWidgetItem *parentWidget, QString &mediaName) +MediaInfo::MediaInfo(QTreeWidgetItem *parentWidget, QString &mediaName) : Pages() { setupUi(this); @@ -41,7 +45,7 @@ MediaInfo::MediaInfo(QTreeWidgetItem *parentWidget, QString &mediaName) connect(pbDelete, SIGNAL(clicked()), this, SLOT(deleteVol())); connect(pbEdit, SIGNAL(clicked()), this, SLOT(editVol())); connect(tableJob, SIGNAL(itemDoubleClicked(QTableWidgetItem*)), this, SLOT(showInfoForJob(QTableWidgetItem *))); - + dockPage(); setCurrent(); populateForm(); @@ -121,7 +125,7 @@ void MediaInfo::populateForm() QString stat, LastWritten; struct tm tm; char buf[256]; - QString query = + QString query = "SELECT MediaId, VolumeName, Pool.Name, MediaType, FirstWritten," "LastWritten, VolMounts, VolBytes, Media.Enabled," "Location.Location, VolStatus, RecyclePool.Name, Media.Recycle, " @@ -159,7 +163,7 @@ void MediaInfo::populateForm() label_Location->setText(fld.next()); label_VolStatus->setText(fld.next()); label_RecyclePool->setText(fld.next()); - chkbox_Recycle->setCheckState(fld.next().toInt()?Qt::Checked:Qt::Unchecked); + chkbox_Recycle->setCheckState(fld.next().toInt()?Qt::Checked:Qt::Unchecked); edit_utime(fld.next().toULongLong(), buf, sizeof(buf)); label_VolReadTime->setText(QString(buf)); @@ -181,7 +185,7 @@ void MediaInfo::populateForm() t = str_to_utime(LastWritten.toAscii().data()); t = t + stat.toULongLong(); ttime = t; - localtime_r(&ttime, &tm); + localtime_r(&ttime, &tm); strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tm); label_Expire->setText(QString(buf)); } @@ -193,11 +197,11 @@ void MediaInfo::populateForm() // jobstatus_to_ascii_gui(stat[0].toAscii(), buf, sizeof(buf)); // stat = buf; -// +// } } - query = + query = "SELECT DISTINCT JobId, Name, StartTime, Type, Level, JobFiles," "JobBytes,JobStatus " "FROM Job JOIN JobMedia USING (JobId) JOIN Media USING (MediaId) " @@ -219,7 +223,7 @@ void MediaInfo::populateForm() TableItemFormatter jobitem(*tableJob, row); /* JobId */ - jobitem.setNumericFld(index++, fld.next()); + jobitem.setNumericFld(index++, fld.next()); /* job name */ jobitem.setTextFld(index++, fld.next()); diff --git a/bacula/src/qt-console/mediainfo/mediainfo.h b/bacula/src/qt-console/mediainfo/mediainfo.h index c9194c2722..0e64d5dd75 100644 --- a/bacula/src/qt-console/mediainfo/mediainfo.h +++ b/bacula/src/qt-console/mediainfo/mediainfo.h @@ -1,22 +1,25 @@ #ifndef _MEDIAINFO_H_ #define _MEDIAINFO_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * Version $Id$ * */ @@ -27,7 +30,7 @@ class MediaInfo : public Pages, public Ui::mediaInfoForm { - Q_OBJECT + Q_OBJECT public: MediaInfo(QTreeWidgetItem *parentWidget, QString &mediaId); diff --git a/bacula/src/qt-console/mediainfo/mediainfo.ui b/bacula/src/qt-console/mediainfo/mediainfo.ui index 2393f83bb6..9dc9fa74b9 100644 --- a/bacula/src/qt-console/mediainfo/mediainfo.ui +++ b/bacula/src/qt-console/mediainfo/mediainfo.ui @@ -431,7 +431,7 @@ - First Written: + First Written: diff --git a/bacula/src/qt-console/medialist/medialist.cpp b/bacula/src/qt-console/medialist/medialist.cpp index 262784073a..e9adb2a52a 100644 --- a/bacula/src/qt-console/medialist/medialist.cpp +++ b/bacula/src/qt-console/medialist/medialist.cpp @@ -1,25 +1,29 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2010 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* * MediaList Class * * Dirk Bartley, March 2007 * - */ + */ #include "bat.h" #include @@ -57,7 +61,7 @@ MediaList::~MediaList() } /* - * The main meat of the class!! The function that querries the director and + * The main meat of the class!! The function that querries the director and * creates the widgets with appropriate values. */ void MediaList::populateTree() @@ -86,7 +90,7 @@ void MediaList::populateTree() m_topItem->setText(0, tr("Pools")); m_topItem->setData(0, Qt::UserRole, 0); m_topItem->setExpanded(true); - + mp_treeWidget->setHeaderLabels(headerlist); QSettings settings(m_console->m_dir->name(), "bat"); @@ -155,20 +159,21 @@ void MediaList::populateTree() pooltreeitem->setExpanded(true); } - if (fieldlist.size() < 18) + if (fieldlist.size() < 21) { // Handle recyclepool specifically, and pool is already removed + Pmsg2(000, "Unexpected line %s %d", resultline.toUtf8().data(), fieldlist.size()); continue; // some fields missing, ignore row - + } int index = 0; TreeItemFormatter mediaitem(*pooltreeitem, 2); - + /* Iterate through fields in the record */ QStringListIterator fld(fieldlist); /* volname */ - mediaitem.setTextFld(index++, fld.next()); + mediaitem.setTextFld(index++, fld.next()); /* id */ - mediaitem.setNumericFld(index++, fld.next()); + mediaitem.setNumericFld(index++, fld.next()); /* status */ mediaitem.setVolStatusFld(index++, fld.next()); @@ -180,24 +185,25 @@ void MediaList::populateTree() mediaitem.setBytesFld(index++, fld.next()); /* files */ - mediaitem.setNumericFld(index++, fld.next()); + mediaitem.setNumericFld(index++, fld.next()); /* jobs */ - mediaitem.setNumericFld(index++, fld.next()); + mediaitem.setNumericFld(index++, fld.next()); /* retention */ mediaitem.setDurationFld(index++, fld.next()); /* media type */ - mediaitem.setTextFld(index++, fld.next()); + mediaitem.setTextFld(index++, fld.next()); /* inchanger + slot */ int inchanger = fld.next().toInt(); if (inchanger) { - mediaitem.setNumericFld(index++, fld.next()); - } else { + mediaitem.setNumericFld(index++, fld.next()); + } + else { /* volume not in changer, show blank slot */ - mediaitem.setNumericFld(index++, ""); + mediaitem.setNumericFld(index++, ""); fld.next(); } @@ -205,10 +211,10 @@ void MediaList::populateTree() mediaitem.setDurationFld(index++, fld.next()); /* max jobs */ - mediaitem.setNumericFld(index++, fld.next()); + mediaitem.setNumericFld(index++, fld.next()); /* max files */ - mediaitem.setNumericFld(index++, fld.next()); + mediaitem.setNumericFld(index++, fld.next()); /* max bytes */ mediaitem.setBytesFld(index++, fld.next()); @@ -217,10 +223,10 @@ void MediaList::populateTree() mediaitem.setBoolFld(index++, fld.next()); /* last written */ - mediaitem.setTextFld(index++, fld.next()); + mediaitem.setTextFld(index++, fld.next()); /* first written */ - mediaitem.setTextFld(index++, fld.next()); + mediaitem.setTextFld(index++, fld.next()); /* read time */ mediaitem.setDurationFld(index++, fld.next()); @@ -229,10 +235,14 @@ void MediaList::populateTree() mediaitem.setDurationFld(index++, fld.next()); /* Recycle Count */ - mediaitem.setNumericFld(index++, fld.next()); + mediaitem.setNumericFld(index++, fld.next()); /* recycle pool */ - mediaitem.setTextFld(index++, fld.next()); + if (fld.hasNext()) { + mediaitem.setTextFld(index++, fld.next()); + } else { + mediaitem.setTextFld(index++, ""); + } } /* foreach resultline */ counter += 1; @@ -322,8 +332,8 @@ void MediaList::treeItemChanged(QTreeWidgetItem *currentwidgetitem, QTreeWidgetI } } -/* - * Setup a context menu +/* + * Setup a context menu * Made separate from populate so that it would not create context menu over and * over as the tree is repopulated. */ diff --git a/bacula/src/qt-console/medialist/medialist.h b/bacula/src/qt-console/medialist/medialist.h index 3ce2e0cec1..7850540118 100644 --- a/bacula/src/qt-console/medialist/medialist.h +++ b/bacula/src/qt-console/medialist/medialist.h @@ -1,19 +1,23 @@ #ifndef _MEDIALIST_H_ #define _MEDIALIST_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Dirk Bartley, March 2007 @@ -26,7 +30,7 @@ class MediaList : public Pages, public Ui::MediaListForm { - Q_OBJECT + Q_OBJECT public: MediaList(); diff --git a/bacula/src/qt-console/medialist/mediaview.cpp b/bacula/src/qt-console/medialist/mediaview.cpp index 1475297e4a..5650a264a9 100644 --- a/bacula/src/qt-console/medialist/mediaview.cpp +++ b/bacula/src/qt-console/medialist/mediaview.cpp @@ -1,19 +1,23 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2010 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + #include "bat.h" #include #include @@ -38,7 +42,7 @@ MediaView::MediaView() : Pages() connect(m_pbPurge, SIGNAL(pressed()), this, SLOT(purgePushed())); connect(m_pbDelete, SIGNAL(pressed()), this, SLOT(deletePushed())); connect(m_pbPrune, SIGNAL(pressed()), this, SLOT(prunePushed())); - connect(m_tableMedia, SIGNAL(itemDoubleClicked(QTableWidgetItem*)), + connect(m_tableMedia, SIGNAL(itemDoubleClicked(QTableWidgetItem*)), this, SLOT(showInfoForMedia(QTableWidgetItem *))); /* mp_treeWidget, Storage Tree Tree Widget inherited from ui_medialist.h */ @@ -70,7 +74,7 @@ void MediaView::editPushed() QStringList sel; QString cmd; getSelection(sel); - + for(int i=0; igetFromHash(this), cmd); @@ -103,28 +107,19 @@ void MediaView::purgePushed() bool MediaView::getSelection(QStringList &list) { - int i, nb, nr_rows, row; - bool *tab; QTableWidgetItem *it; QList items = m_tableMedia->selectedItems(); - - /* - * See if anything is selected. - */ - nb = items.count(); + int row; + int nrows; /* number of rows */ + bool *tab; + int nb = items.count(); if (!nb) { return false; } - - /* - * Create a nibble map for each row so we can see if its - * selected or not. - */ - nr_rows = m_tableMedia->rowCount(); - tab = (bool *)malloc (nr_rows * sizeof(bool)); - memset(tab, 0, sizeof(bool) * nr_rows); - - for (i = 0; i < nb; ++i) { + nrows = m_tableMedia->rowCount(); + tab = (bool *) malloc (nrows * sizeof(bool)); + memset(tab, 0, sizeof(bool)*nrows); + for (int i = 0; i < nb; ++i) { row = items[i]->row(); if (!tab[row]) { tab[row] = true; @@ -133,7 +128,6 @@ bool MediaView::getSelection(QStringList &list) } } free(tab); - return list.count() > 0; } @@ -193,7 +187,7 @@ void MediaView::populateForm() m_cbLocation->addItems(m_console->location_list); } -/* +/* * If chkExpired button is checked, we can remove all non Expired * entries */ @@ -225,7 +219,7 @@ void MediaView::filterExipired(QStringList &list) } /* - * The main meat of the class!! The function that querries the director and + * The main meat of the class!! The function that querries the director and * creates the widgets with appropriate values. */ void MediaView::populateTable() @@ -248,7 +242,7 @@ void MediaView::populateTable() if (m_cbPool->currentText() != "") { cmd = " Pool.Name = '" + m_cbPool->currentText() + "'"; where.append(cmd); - } + } if (m_cbStatus->currentText() != "") { cmd = " Media.VolStatus = '" + m_cbStatus->currentText() + "'"; @@ -293,22 +287,26 @@ void MediaView::populateTable() if (m_console->sql_cmd(query, results)) { foreach (resultline, results) { fieldlist = resultline.split("\t"); - if (fieldlist.at(1).toInt() >= 1) { + if (fieldlist.size() != 3) { + Pmsg1(000, "Unexpected line %s", resultline.toUtf8().data()); + continue; + } + if (fieldlist.at(1).toInt() >= 1) { // MediaType - hash_size[fieldlist.at(2)] - = fieldlist.at(0).toFloat(); + hash_size[fieldlist.at(2)] + = fieldlist.at(0).toFloat(); } } - } - + } + m_tableMedia->clearContents(); - query = + query = "SELECT VolumeName, InChanger, " "Slot, MediaType, VolStatus, VolBytes, Pool.Name, " "LastWritten, Media.VolRetention " "FROM Media JOIN Pool USING (PoolId) " "LEFT JOIN Location ON (Media.LocationId=Location.LocationId) " - + cmd + + + cmd + " ORDER BY VolumeName LIMIT " + m_sbLimit->cleanText(); m_tableMedia->sortByColumn(0, Qt::AscendingOrder); @@ -321,25 +319,25 @@ void MediaView::populateTable() int row=0; filterExipired(results); m_tableMedia->setRowCount(results.size()); - foreach (resultline, results) { // should have only one result int index = 0; - QString VolBytes, MediaType, LastWritten, VolStatus; + QString Slot, VolBytes, MediaType, LastWritten, VolStatus; fieldlist = resultline.split("\t"); - if (fieldlist.size() != 10) { + if (fieldlist.size() != 9) { + Pmsg1(000, "Unexpected line %s", resultline.toUtf8().data()); continue; } QStringListIterator fld(fieldlist); TableItemFormatter mediaitem(*m_tableMedia, row); /* VolumeName */ - mediaitem.setTextFld(index++, fld.next()); - + mediaitem.setTextFld(index++, fld.next()); + /* Online */ mediaitem.setInChanger(index++, fld.next()); - /* Slot */ - mediaitem.setNumericFld(index++, fld.next()); + Slot = fld.next(); // Slot + mediaitem.setNumericFld(index++, Slot); MediaType = fld.next(); VolStatus = fld.next(); @@ -372,10 +370,10 @@ void MediaView::populateTable() t = str_to_utime(LastWritten.toAscii().data()); t = t + stat.toULongLong(); ttime = t; - localtime_r(&ttime, &tm); + localtime_r(&ttime, &tm); strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tm); } - + /* LastWritten */ mediaitem.setTextFld(index++, LastWritten); @@ -427,7 +425,7 @@ void MediaView::currentStackItem() // setConsoleCurrent(); // new relabelDialog(m_console, m_currentVolumeName); // } -// +// // /* // * Called from the signal of the context sensitive menu to purge! // */ @@ -437,14 +435,14 @@ void MediaView::currentStackItem() // consoleCommand(cmd); // populateTable(); // } -// +// // void MediaView::allVolumes() // { // QString cmd = "update volume allfrompools"; // consoleCommand(cmd); // populateTable(); // } -// +// // /* // * Called from the signal of the context sensitive menu to purge! // */ @@ -458,4 +456,4 @@ void MediaView::currentStackItem() // consoleCommand(cmd); // populateTable(); // } -// +// diff --git a/bacula/src/qt-console/medialist/mediaview.h b/bacula/src/qt-console/medialist/mediaview.h index d11d271ace..0b41717673 100644 --- a/bacula/src/qt-console/medialist/mediaview.h +++ b/bacula/src/qt-console/medialist/mediaview.h @@ -1,19 +1,23 @@ #ifndef _MEDIAVIEW_H_ #define _MEDIAVIEW_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ #include @@ -23,7 +27,7 @@ class MediaView : public Pages, public Ui::MediaViewForm { - Q_OBJECT + Q_OBJECT public: MediaView(); diff --git a/bacula/src/qt-console/mount/mount.cpp b/bacula/src/qt-console/mount/mount.cpp index 188004abd1..475e486ba7 100644 --- a/bacula/src/qt-console/mount/mount.cpp +++ b/bacula/src/qt-console/mount/mount.cpp @@ -1,32 +1,36 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2007 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* * Label Dialog class * * Kern Sibbald, February MMVII * - */ + */ #include "bat.h" #include "mount/mount.h" #include /* - * A constructor + * A constructor */ mountDialog::mountDialog(Console *console, QString &storageName) : QDialog() { diff --git a/bacula/src/qt-console/mount/mount.h b/bacula/src/qt-console/mount/mount.h index 157c851d8d..9706d2b049 100644 --- a/bacula/src/qt-console/mount/mount.h +++ b/bacula/src/qt-console/mount/mount.h @@ -1,19 +1,23 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ -/* +/* * Kern Sibbald, February MMVII */ @@ -26,7 +30,7 @@ class mountDialog : public QDialog, public Ui::mountForm { - Q_OBJECT + Q_OBJECT public: mountDialog(Console *console, QString &storage); diff --git a/bacula/src/qt-console/pages.cpp b/bacula/src/qt-console/pages.cpp index fc1494e1c4..d21a76e5d4 100644 --- a/bacula/src/qt-console/pages.cpp +++ b/bacula/src/qt-console/pages.cpp @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2011 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Dirk Bartley, March 2007 @@ -21,7 +25,7 @@ #include "pages.h" /* A global function */ -bool isWin32Path(QString &fullPath) +bool isWin32Path(QString &fullPath) { if (fullPath.size()<2) { return false; @@ -121,8 +125,8 @@ void Pages::undockPage() } /* - * This function is intended to be called with the subclasses. When it is - * called the specific sublclass does not have to be known to Pages. When it + * This function is intended to be called with the subclasses. When it is + * called the specific sublclass does not have to be known to Pages. When it * is called this function will change the page from it's current state of being * docked or undocked and change it to the other. */ @@ -137,7 +141,7 @@ void Pages::togglePageDocking() } /* - * This function is because I wanted for some reason to keep it protected but still + * This function is because I wanted for some reason to keep it protected but still * give any subclasses the ability to find out if it is currently stacked or not. */ bool Pages::isDocked() @@ -194,8 +198,8 @@ void Pages::closeEvent(QCloseEvent* event) /* this fixes my woes of getting the widget to show up on top when closed */ event->ignore(); - /* Set the current tree widget item in the Page Selector window to the item - * which represents "this" + /* Set the current tree widget item in the Page Selector window to the item + * which represents "this" * Which will also bring "this" to the top of the stacked widget */ setCurrent(); } @@ -265,7 +269,7 @@ void Pages::pgInitialize(const QString &tname, QTreeWidgetItem *parentTreeWidget } QTreeWidgetItem *item = new QTreeWidgetItem(parentTreeWidgetItem); - QString name; + QString name; treeWidgetName(name); item->setText(0, name); mainWin->hashInsert(item, this); @@ -365,7 +369,7 @@ void Pages::setCurrent() /* * Function to set the text of the toggle dock context menu when page and - * widget item are NOT known. + * widget item are NOT known. */ void Pages::setContextMenuDockText() { @@ -376,7 +380,7 @@ void Pages::setContextMenuDockText() } else { docktext = tr("ReDock %1 Window").arg(item->text(0)); } - + mainWin->actionToggleDock->setText(docktext); setTreeWidgetItemDockColor(); } diff --git a/bacula/src/qt-console/pages.h b/bacula/src/qt-console/pages.h index c3e3280f8b..997207a589 100644 --- a/bacula/src/qt-console/pages.h +++ b/bacula/src/qt-console/pages.h @@ -1,19 +1,23 @@ #ifndef _PAGES_H_ #define _PAGES_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Dirk Bartley, March 2007 @@ -31,7 +35,7 @@ * of or into the stack. It also provides virtual functions called * from in mainwin so that subclasses can contain functions to allow them * to populate the screens at the time of first viewing, (when selected) as - * opposed to the first creation of the console connection. The + * opposed to the first creation of the console connection. The * console is not connected until after the page selector tree has been * populated. */ diff --git a/bacula/src/qt-console/relabel/relabel.cpp b/bacula/src/qt-console/relabel/relabel.cpp index fb967f6250..aeace6c4f8 100644 --- a/bacula/src/qt-console/relabel/relabel.cpp +++ b/bacula/src/qt-console/relabel/relabel.cpp @@ -1,25 +1,29 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2009 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* * Label Dialog class * * Kern Sibbald, February MMVII * - */ + */ #include "bat.h" #include "relabel.h" @@ -81,7 +85,7 @@ void relabelDialog::accept() return; } if (m_fromVolume == volumeName->text().toUtf8()) { - QMessageBox::warning(this, tr("New name must be different"), + QMessageBox::warning(this, tr("New name must be different"), tr("New name must be different"), QMessageBox::Ok, QMessageBox::Ok); return; diff --git a/bacula/src/qt-console/relabel/relabel.h b/bacula/src/qt-console/relabel/relabel.h index c4aa63640b..746ba3c8ab 100644 --- a/bacula/src/qt-console/relabel/relabel.h +++ b/bacula/src/qt-console/relabel/relabel.h @@ -1,19 +1,23 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ -/* +/* * Kern Sibbald, February MMVII */ @@ -26,7 +30,7 @@ class relabelDialog : public QDialog, public Ui::relabelForm { - Q_OBJECT + Q_OBJECT public: relabelDialog(Console *console, QString &fromVolume); diff --git a/bacula/src/qt-console/restore/brestore.cpp b/bacula/src/qt-console/restore/brestore.cpp index 980bd8e952..7503fb26c5 100644 --- a/bacula/src/qt-console/restore/brestore.cpp +++ b/bacula/src/qt-console/restore/brestore.cpp @@ -1,26 +1,30 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2011 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* * * bRestore Class (Eric's brestore) * * Kern Sibbald, January MMVII * - */ + */ #include "bat.h" #include "restore.h" @@ -183,7 +187,7 @@ void bRestore::displayFiles(int64_t pathid, QString path) LocationEntry->setText(m_path); QString offset = QString().setNum(Offset1Spin->value()); QString limit=QString().setNum(Offset2Spin->value() - Offset1Spin->value()); - QString q = ".bvfs_lsdir jobid=" + m_jobids + arg + QString q = ".bvfs_lsdir jobid=" + m_jobids + arg + " limit=" + limit + " offset=" + offset ; if (mainWin->m_miscDebug) qDebug() << q; if (m_console->dir_cmd(q, results)) { @@ -220,7 +224,7 @@ void bRestore::displayFiles(int64_t pathid, QString path) fieldlist = resultline.split("\t"); TableItemFormatter item(*FileList, row++); item.setTextFld(col++, fieldlist.at(5)); // name - decode_stat(fieldlist.at(4).toLocal8Bit().data(), + decode_stat(fieldlist.at(4).toLocal8Bit().data(), &statp, sizeof(statp), &LinkFI); item.setBytesFld(col++, QString().setNum(statp.st_size)); item.setDateFld(col++, statp.st_mtime); @@ -245,7 +249,7 @@ void bRestore::PgSeltreeWidgetClicked() } // Display all versions of a file for this client -void bRestore::displayFileVersion(QString pathid, QString fnid, +void bRestore::displayFileVersion(QString pathid, QString fnid, QString client, QString filename) { int row=0; @@ -253,10 +257,10 @@ void bRestore::displayFileVersion(QString pathid, QString fnid, int32_t LinkFI; Freeze frz_rev(*FileRevisions); /* disable updating*/ FileRevisions->clearContents(); - + QString q = ".bvfs_versions jobid=" + m_jobids + - " pathid=" + pathid + - " fnid=" + fnid + + " pathid=" + pathid + + " fnid=" + fnid + " client=" + client; if (VersionsChk->checkState() == Qt::Checked) { @@ -274,10 +278,10 @@ void bRestore::displayFileVersion(QString pathid, QString fnid, //PathId, FilenameId, fileid, jobid, lstat, Md5, VolName, Inchanger fieldlist = resultline.split("\t"); TableItemFormatter item(*FileRevisions, row++); - item.setInChanger(col++, fieldlist.at(7)); // inchanger + item.setInChanger(col++, fieldlist.at(7)); // inchanger item.setTextFld(col++, fieldlist.at(6)); // Volume item.setNumericFld(col++, fieldlist.at(3)); // JobId - decode_stat(fieldlist.at(4).toLocal8Bit().data(), + decode_stat(fieldlist.at(4).toLocal8Bit().data(), &statp, sizeof(statp), &LinkFI); item.setBytesFld(col++, QString().setNum(statp.st_size)); // size item.setDateFld(col++, statp.st_mtime); // date @@ -343,9 +347,9 @@ void bRestore::setupPage() ClientList->addItems(m_console->client_list); connect(ClientList, SIGNAL(currentIndexChanged(int)), this, SLOT(setClient())); connect(JobList, SIGNAL(currentIndexChanged(int)), this, SLOT(setJob())); - connect(FileList, SIGNAL(itemClicked(QTableWidgetItem*)), + connect(FileList, SIGNAL(itemClicked(QTableWidgetItem*)), this, SLOT(clearVersions(QTableWidgetItem *))); - connect(FileList, SIGNAL(itemDoubleClicked(QTableWidgetItem*)), + connect(FileList, SIGNAL(itemDoubleClicked(QTableWidgetItem*)), this, SLOT(showInfoForFile(QTableWidgetItem *))); connect(LocationBp, SIGNAL(pressed()), this, SLOT(applyLocation())); connect(MergeChk, SIGNAL(clicked()), this, SLOT(setJob())); @@ -450,7 +454,7 @@ void bRestoreTable::dropEvent(QDropEvent *event) item.setFileType(0, "folder"); } item.setTextFld(col++, fields.at(5)); // filename - decode_stat(fields.at(4).toLocal8Bit().data(), + decode_stat(fields.at(4).toLocal8Bit().data(), &statp, sizeof(statp), &LinkFI); item.setBytesFld(col++, QString().setNum(statp.st_size)); // size item.setDateFld(col++, statp.st_mtime); // date @@ -534,7 +538,7 @@ bRunRestore::bRunRestore(bRestore *parent) computeVolumeList(); } -void bRestore::get_info_from_selection(QStringList &fileids, +void bRestore::get_info_from_selection(QStringList &fileids, QStringList &jobids, QStringList &dirids, QStringList &findexes) @@ -548,7 +552,7 @@ void bRestore::get_info_from_selection(QStringList &fileids, if (lst.at(1) != "0") { // skip path fileids << lst.at(2); jobids << lst.at(3); - decode_stat(lst.at(4).toLocal8Bit().data(), + decode_stat(lst.at(4).toLocal8Bit().data(), &statp, sizeof(statp), &LinkFI); if (LinkFI) { findexes << lst.at(3) + "," + QString().setNum(LinkFI); @@ -576,7 +580,7 @@ void bRunRestore::computeVolumeList() QString q = " SELECT DISTINCT VolumeName, Enabled, InChanger " " FROM File, " - " ( " // -- Get all media from this job + " ( " // -- Get all media from this job " SELECT MIN(FirstIndex) AS FirstIndex, MAX(LastIndex) AS LastIndex, " " VolumeName, Enabled, Inchanger " " FROM JobMedia JOIN Media USING (MediaId) " @@ -593,7 +597,7 @@ void bRunRestore::computeVolumeList() TableMedia->setRowCount(results.size()); /* Iterate through the record returned from the query */ foreach (QString resultline, results) { - // 0 1 2 + // 0 1 2 //volname, enabled, inchanger fieldlist = resultline.split("\t"); int col=0; @@ -671,7 +675,7 @@ int64_t bRunRestore::runRestore(QString tablename) q += " file=\"?" + tablename + "\""; q += " when=\"" + WhenEditor->dateTime().toString("yyyy-MM-dd hh:mm:ss") + "\""; q += " done yes"; - + if (mainWin->m_miscDebug) qDebug() << q; QStringList results; if (brestore->console()->dir_cmd(q, results)) { @@ -707,5 +711,5 @@ void bRunRestore::computeRestore() q = ".bvfs_cleanup path=b2123"; brestore->console()->dir_cmd(q, results); } - } + } } diff --git a/bacula/src/qt-console/restore/brestore.ui b/bacula/src/qt-console/restore/brestore.ui index 388362baaa..921df79059 100644 --- a/bacula/src/qt-console/restore/brestore.ui +++ b/bacula/src/qt-console/restore/brestore.ui @@ -505,7 +505,7 @@ p, li { white-space: pre-wrap; } - Restore + Restore... diff --git a/bacula/src/qt-console/restore/prerestore.cpp b/bacula/src/qt-console/restore/prerestore.cpp index 50cf3e73a5..482c8d1dfc 100644 --- a/bacula/src/qt-console/restore/prerestore.cpp +++ b/bacula/src/qt-console/restore/prerestore.cpp @@ -1,25 +1,29 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2010 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* * preRestore -> dialog put up to determine the restore type * * Kern Sibbald, February MMVII * - */ + */ #include "bat.h" #include "restore.h" @@ -155,10 +159,10 @@ void prerestorePage::okButtonPushed() if (mainWin->m_commandDebug) { Pmsg1(000, "preRestore command \'%s\'\n", cmd.toUtf8().data()); } - /* + /* * Send off command that looks something like: * - * restore fileset="Full Set" client="timmy-fd" + * restore fileset="Full Set" client="timmy-fd" * storage="File" current select */ m_console->write_dir(m_conn, cmd.toUtf8().data()); @@ -347,7 +351,7 @@ void prerestorePage::jobRadioClicked(bool checked) selectJobIdsRadio->setChecked(true); } if (mainWin->m_miscDebug) { - Pmsg2(000, "jobRadio=%d jobidsRadio=%d\n", selectJobRadio->isChecked(), + Pmsg2(000, "jobRadio=%d jobidsRadio=%d\n", selectJobRadio->isChecked(), selectJobIdsRadio->isChecked()); } } @@ -380,7 +384,7 @@ void prerestorePage::jobidsRadioClicked(bool checked) selectJobIdsRadio->setChecked(false); } if (mainWin->m_miscDebug) { - Pmsg2(000, "jobRadio=%d jobidsRadio=%d\n", selectJobRadio->isChecked(), + Pmsg2(000, "jobRadio=%d jobidsRadio=%d\n", selectJobRadio->isChecked(), selectJobIdsRadio->isChecked()); } } diff --git a/bacula/src/qt-console/restore/restore.cpp b/bacula/src/qt-console/restore/restore.cpp index caeefee950..70cc2992e3 100644 --- a/bacula/src/qt-console/restore/restore.cpp +++ b/bacula/src/qt-console/restore/restore.cpp @@ -1,25 +1,29 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2010 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* - * Restore Class + * Restore Class * * Kern Sibbald, February MMVII * - */ + */ #include "bat.h" #include "restore.h" @@ -40,7 +44,7 @@ restorePage::restorePage(int conn) : Pages() m_console->notify(m_conn, false); /* this should already be off */ - connect(fileWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), + connect(fileWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), this, SLOT(fileDoubleClicked(QTreeWidgetItem *, int))); connect(directoryWidget, SIGNAL( currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), @@ -60,14 +64,14 @@ restorePage::restorePage(int conn) : Pages() setFont(m_console->get_font()); m_console->displayToPrompt(m_conn); - titles << tr("Mark") << tr("File") << tr("Mode") << tr("User") + titles << tr("Mark") << tr("File") << tr("Mode") << tr("User") << tr("Group") << tr("Size") << tr("Date"); fileWidget->setHeaderLabels(titles); get_cwd(); readSettings(); - /* wait was entered from pre-restore + /* wait was entered from pre-restore * will exit, but will reenter in fillDirectory */ mainWin->waitExit(); fillDirectory(); @@ -209,11 +213,11 @@ void restorePage::addDirectory(QString &newdirr) directoryWidget->setCurrentItem(NULL); } } else { - // Unix add / first if not already there + // Unix add / first if not already there if (m_dirPaths.empty()) { QTreeWidgetItem *item = new QTreeWidgetItem(directoryWidget); item->setIcon(0,QIcon(QString::fromUtf8(":images/folder.png"))); - + QString text("/"); item->setText(0, text.toUtf8().data()); if (mainWin->m_miscDebug) { @@ -223,7 +227,7 @@ void restorePage::addDirectory(QString &newdirr) m_dirTreeItems.insert(item, text); } } - + /* Does it already exist ?? */ if (!m_dirPaths.contains(fullpath)) { QTreeWidgetItem *item = NULL; @@ -325,8 +329,8 @@ void restorePage::fileDoubleClicked(QTreeWidgetItem *item, int column) m_console->displayToPrompt(m_conn); mainWin->waitExit(); return; - } - /* + } + /* * Double clicking other than column 0 means to decend into * the directory -- or nothing if it is not a directory. */ @@ -422,7 +426,7 @@ void restorePage::unmarkButtonPushed() } /* - * Change current working directory + * Change current working directory */ bool restorePage::cwd(const char *dir) { @@ -449,7 +453,7 @@ bool restorePage::cwd(const char *dir) } /* - * Return cwd when in tree restore mode + * Return cwd when in tree restore mode */ char *restorePage::get_cwd() { @@ -464,7 +468,7 @@ char *restorePage::get_cwd() Dmsg1(dbglvl, "Something went wrong read stat=%d\n", stat); QMessageBox::critical(this, "Error", tr(".pwd command failed"), QMessageBox::Ok); } - m_console->discardToPrompt(m_conn); + m_console->discardToPrompt(m_conn); mainWin->waitExit(); return m_cwd.toUtf8().data(); } @@ -488,7 +492,7 @@ void restorePage::readSettings() m_splitText = "splitterSizes_2"; QSettings settings(m_console->m_dir->name(), "bat"); settings.beginGroup("RestorePage"); - if (settings.contains(m_splitText)) { + if (settings.contains(m_splitText)) { splitter->restoreState(settings.value(m_splitText).toByteArray()); } settings.endGroup(); diff --git a/bacula/src/qt-console/restore/restore.h b/bacula/src/qt-console/restore/restore.h index ac79fd4bd5..8710635002 100644 --- a/bacula/src/qt-console/restore/restore.h +++ b/bacula/src/qt-console/restore/restore.h @@ -2,34 +2,38 @@ #define _RESTORE_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * * Kern Sibbald, February 2007 */ -#include - +#include +#include /* Needed for some systems */ #include #include "pages.h" #include "ui_runrestore.h" class bRestoreTable : public QTableWidget { - Q_OBJECT + Q_OBJECT private: QPoint dragStartPosition; public: @@ -61,7 +65,7 @@ enum { */ class prerestorePage : public Pages, public Ui::prerestoreForm { - Q_OBJECT + Q_OBJECT public: prerestorePage(); @@ -85,14 +89,14 @@ private: unsigned int m_dataInType; }; -/* +/* * The restore dialog is brought up once we are in the Bacula * restore tree routines. It handles putting up a GUI tree * representation of the files to be restored. */ class restorePage : public Pages, public Ui::restoreForm { - Q_OBJECT + Q_OBJECT public: restorePage(int conn); @@ -124,7 +128,7 @@ private: class bRestore : public Pages, public Ui::bRestoreForm { - Q_OBJECT + Q_OBJECT public: bRestore(); @@ -151,13 +155,13 @@ private: void setupPage(); bool m_populated; void displayFiles(int64_t pathid, QString path); - void displayFileVersion(QString pathid, QString fnid, + void displayFileVersion(QString pathid, QString fnid, QString client, QString filename); }; class bRunRestore : public QDialog, public Ui::bRunRestoreForm { - Q_OBJECT + Q_OBJECT private: bRestore *brestore; QStringList m_fileids, m_jobids, m_dirids, m_findexes; diff --git a/bacula/src/qt-console/restore/restoretree.cpp b/bacula/src/qt-console/restore/restoretree.cpp index c44f6f32e4..0bc9172d3d 100644 --- a/bacula/src/qt-console/restore/restoretree.cpp +++ b/bacula/src/qt-console/restore/restoretree.cpp @@ -1,26 +1,30 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2010 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* * - * Restore Class + * Restore Class * * Kern Sibbald, February MMVII * - */ + */ #include "bat.h" #include "restoretree.h" @@ -159,7 +163,7 @@ void restoreTree::populateDirectoryTree() updateRefresh(); int taskcount = 3, ontask = 1; if (m_dropdownChanged) taskcount += 1; - + /* Set progress bars and repaint */ prBar1->setVisible(true); prBar1->setRange(0,taskcount); @@ -280,7 +284,7 @@ void restoreTree::populateDirectoryTree() /* * Function to set m_checkedJobs from the jobs that are checked in the table * of jobs - */ + */ void restoreTree::setJobsCheckedList() { m_JobsCheckedList = ""; @@ -324,7 +328,7 @@ void restoreTree::parseDirectory(const QString &dir_in) QTreeWidgetItem *item = NULL; QTreeWidgetItem *parentItem = m_dirPaths.value(parent); - + if (parentItem==0) { // recurse to build parent... parseDirectory(parent); @@ -409,7 +413,7 @@ void restoreTree::directoryCurrentItemChanged(QTreeWidgetItem *item, QTreeWidget fileTable->setColumnCount(headerlist.size()); fileTable->setHorizontalHeaderLabels(headerlist); fileTable->setRowCount(0); - + m_fileCheckStateList.clear(); disconnect(fileTable, SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(fileTableItemChanged(QTableWidgetItem *))); @@ -430,12 +434,12 @@ void restoreTree::directoryCurrentItemChanged(QTreeWidgetItem *item, QTreeWidget QStringList results; if (m_console->sql_cmd(cmd, results)) { - + QTableWidgetItem* tableItem; QString field; QStringList fieldlist; fileTable->setRowCount(results.size()); - + int row = 0; /* Iterate through the record returned from the query */ foreach (QString resultline, results) { @@ -446,7 +450,7 @@ void restoreTree::directoryCurrentItemChanged(QTreeWidgetItem *item, QTreeWidget field = field.trimmed(); /* strip leading & trailing spaces */ tableItem = new QTableWidgetItem(field, 1); /* Possible flags are Qt::ItemFlags flag = Qt::ItemIsSelectable | Qt::ItemIsEditablex - * | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsUserCheckable + * | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsUserCheckable * | Qt::ItemIsEnabled | Qt::ItemIsTristate; */ tableItem->setForeground(blackBrush); /* Just in case a column ever gets added */ @@ -508,16 +512,16 @@ void restoreTree::fileCurrentItemChanged(QTableWidgetItem *currentFileTableItem, QBrush blackBrush(Qt::black); - QStringList headerlist = (QStringList() + QStringList headerlist = (QStringList() << tr("Job Id") << tr("Type") << tr("End Time") << tr("Hash") << tr("FileId") << tr("Job Type") << tr("First Volume")); versionTable->clear(); versionTable->setColumnCount(headerlist.size()); versionTable->setHorizontalHeaderLabels(headerlist); versionTable->setRowCount(0); - + int pathid = m_directoryPathIdHash.value(directory, -1); if ((pathid != -1) && (fileNameId != -1)) { - QString cmd = + QString cmd = "SELECT Job.JobId AS JobId, Job.Level AS Type," " Job.EndTime AS EndTime, File.MD5 AS MD5," " File.FileId AS FileId, Job.Type AS JobType," @@ -531,16 +535,16 @@ void restoreTree::fileCurrentItemChanged(QTableWidgetItem *currentFileTableItem, " AND Filename.FilenameId=" + QString("%1").arg(fileNameId) + " AND Job.Jobid IN (" + m_checkedJobs + ")" " ORDER BY Job.EndTime DESC"; - + if (mainWin->m_sqlDebug) Pmsg1(000, "Query cmd : %s\n", cmd.toUtf8().data()); QStringList results; if (m_console->sql_cmd(cmd, results)) { - + QTableWidgetItem* tableItem; QString field; QStringList fieldlist; versionTable->setRowCount(results.size()); - + int row = 0; /* Iterate through the record returned from the query */ foreach (QString resultline, results) { @@ -638,7 +642,7 @@ void restoreTree::populateJobTable() QBrush blackBrush(Qt::black); if (mainWin->m_rtPopDirDebug) Pmsg0(000, "Repopulating the Job Table\n"); - QStringList headerlist = (QStringList() + QStringList headerlist = (QStringList() << tr("Job Id") << tr("End Time") << tr("Level") << tr("Type") << tr("Name") << tr("Purged") << tr("TU") << tr("TD")); m_toggleUpIndex = headerlist.indexOf(tr("TU")); @@ -684,7 +688,7 @@ void restoreTree::populateJobTable() QStringList results; if (m_console->sql_cmd(jobQuery, results)) { - + QTableWidgetItem* tableItem; QString field; QStringList fieldlist; @@ -714,7 +718,7 @@ void restoreTree::populateJobTable() if (mainWin->m_sqlDebug) Pmsg1(000, "Column=%d\n", column); if (column == 0) { bool ok; - int purged = fieldlist[purgedIndex].toInt(&ok, 10); + int purged = fieldlist[purgedIndex].toInt(&ok, 10); if (!((ok) && (purged == 1))) { Qt::ItemFlags flag = Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsTristate; tableItem->setFlags(flag); @@ -1301,7 +1305,7 @@ void restoreTree::directoryIconStateRemove() QStringList paths; fullPathtoSubPaths(paths, keyPath); - /* if the state of the item in m_fileExceptionHash is checked + /* if the state of the item in m_fileExceptionHash is checked * each of the subpaths should be "Checked Green" */ if (state == Qt::Checked) { @@ -1461,7 +1465,7 @@ void restoreTree::restoreButtonPushed() if (mainWin->m_rtRestore1Debug) Pmsg1(000, "Directory Checked=\"%s\"\n", directory.toUtf8().data()); /* With a checked directory, query for the files in the directory */ - + QString cmd = "SELECT Filename.Name AS Filename, t1.JobId AS JobId, File.FileIndex AS FileIndex" " FROM" @@ -1478,12 +1482,12 @@ void restoreTree::restoreButtonPushed() " AND File.FilenameId=t1.FilenameId" " AND Job.Jobid=t1.JobId" " ORDER BY Filename"; - + if (mainWin->m_sqlDebug) Pmsg1(000, "Query cmd : %s\n", cmd.toUtf8().data()); QStringList results; if (m_console->sql_cmd(cmd, results)) { QStringList fieldlist; - + int row = 0; /* Iterate through the record returned from the query */ foreach (QString resultline, results) { @@ -1507,7 +1511,7 @@ void restoreTree::restoreButtonPushed() column++; } fileExcpState = m_fileExceptionHash.value(fullPath, (Qt::CheckState)3); - + int excpVersion = m_versionExceptionHash.value(fullPath, 0); if (fileExcpState != Qt::Unchecked) { QString debugtext; @@ -1674,7 +1678,7 @@ int restoreTree::mostRecentVersionfromFullPath(QString &fullPath) " AND Filename.Name='" + fileName + "'" " AND File.FilenameId!=" + QString("%1").arg(m_nullFileNameId) + " GROUP BY Filename.Name"; - + if (mainWin->m_sqlDebug) Pmsg1(000, "Query cmd : %s\n", cmd.toUtf8().data()); QStringList results; if (m_console->sql_cmd(cmd, results)) { diff --git a/bacula/src/qt-console/restore/restoretree.h b/bacula/src/qt-console/restore/restoretree.h index 7e203a4513..ae39d3c340 100644 --- a/bacula/src/qt-console/restore/restoretree.h +++ b/bacula/src/qt-console/restore/restoretree.h @@ -2,23 +2,25 @@ #define _RESTORETREE_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * Version $Id$ - * * Kern Sibbald, February 2007 */ @@ -27,12 +29,12 @@ #include "ui_restoretree.h" -/* +/* * A restore tree to view files in the catalog */ class restoreTree : public Pages, public Ui::restoreTreeForm { - Q_OBJECT + Q_OBJECT public: restoreTree(); diff --git a/bacula/src/qt-console/run/estimate.cpp b/bacula/src/qt-console/run/estimate.cpp index 7154d526ba..9aa894e37a 100644 --- a/bacula/src/qt-console/run/estimate.cpp +++ b/bacula/src/qt-console/run/estimate.cpp @@ -1,26 +1,30 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2009 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* * Run Dialog class * * Kern Sibbald, February MMVII * * $Id$ - */ + */ #include "bat.h" #include "run.h" @@ -61,7 +65,7 @@ void estimatePage::okButtonPushed() m_aButtonPushed = true; this->hide(); QString cmd; - QTextStream(&cmd) << "estimate" << + QTextStream(&cmd) << "estimate" << " job=\"" << jobCombo->currentText() << "\"" << " fileset=\"" << filesetCombo->currentText() << "\"" << " level=\"" << levelCombo->currentText() << "\"" << diff --git a/bacula/src/qt-console/run/prune.cpp b/bacula/src/qt-console/run/prune.cpp index 2836312395..94e08c7e76 100644 --- a/bacula/src/qt-console/run/prune.cpp +++ b/bacula/src/qt-console/run/prune.cpp @@ -1,26 +1,30 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2009 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* * Run Dialog class * * Kern Sibbald, February MMVII * * $Id$ - */ + */ #include "bat.h" #include "run.h" diff --git a/bacula/src/qt-console/run/run.cpp b/bacula/src/qt-console/run/run.cpp index d7585aee8f..a86f526829 100644 --- a/bacula/src/qt-console/run/run.cpp +++ b/bacula/src/qt-console/run/run.cpp @@ -1,25 +1,29 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2011 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* * Run Dialog class * * Kern Sibbald, February MMVII * - */ + */ #include "bat.h" #include "run.h" @@ -41,7 +45,7 @@ runPage::runPage(const QString &defJob) : Pages() } -runPage::runPage(const QString &defJob, const QString &level, +runPage::runPage(const QString &defJob, const QString &level, const QString &pool, const QString &storage, const QString &client, const QString &fileset) : Pages() @@ -57,7 +61,7 @@ runPage::runPage(const QString &defJob, const QString &level, poolCombo->setCurrentIndex(poolCombo->findText(pool, Qt::MatchExactly)); if (storage != "") { // TODO: enable storage - storageCombo->setCurrentIndex(storageCombo->findText(storage, + storageCombo->setCurrentIndex(storageCombo->findText(storage, Qt::MatchExactly)); } show(); @@ -70,7 +74,7 @@ runPage::runPage(const QString &defJob, const QString &level, void runPage::init() { QDateTime dt; - QDesktopWidget *desk = QApplication::desktop(); + QDesktopWidget *desk = QApplication::desktop(); QRect scrn; m_name = tr("Run"); @@ -114,7 +118,7 @@ void runPage::okButtonPushed() { this->hide(); QString cmd; - QTextStream(&cmd) << "run" << + QTextStream(&cmd) << "run" << " job=\"" << jobCombo->currentText() << "\"" << " fileset=\"" << filesetCombo->currentText() << "\"" << " level=\"" << levelCombo->currentText() << "\"" << @@ -129,7 +133,7 @@ void runPage::okButtonPushed() * with a job */ #endif if (bootstrap->text() != "") { - cmd += " bootstrap=\"" + bootstrap->text() + "\""; + cmd += " bootstrap=\"" + bootstrap->text() + "\""; } cmd += " yes"; diff --git a/bacula/src/qt-console/run/run.h b/bacula/src/qt-console/run/run.h index 4838d4a45b..59d037b03f 100644 --- a/bacula/src/qt-console/run/run.h +++ b/bacula/src/qt-console/run/run.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ #ifndef _RUN_H_ @@ -26,14 +30,14 @@ class runPage : public Pages, public Ui::runForm { - Q_OBJECT + Q_OBJECT public: runPage(); runPage(const QString &defJob); - runPage(const QString &defJob, + runPage(const QString &defJob, const QString &level, const QString &pool, const QString &storage, @@ -52,7 +56,7 @@ private: class runCmdPage : public Pages, public Ui::runCmdForm { - Q_OBJECT + Q_OBJECT public: runCmdPage(int conn); @@ -68,7 +72,7 @@ private: class estimatePage : public Pages, public Ui::estimateForm { - Q_OBJECT + Q_OBJECT public: estimatePage(); @@ -85,7 +89,7 @@ private: class prunePage : public Pages, public Ui::pruneForm { - Q_OBJECT + Q_OBJECT public: prunePage(const QString &volume, const QString &client); diff --git a/bacula/src/qt-console/run/runcmd.cpp b/bacula/src/qt-console/run/runcmd.cpp index 66573985b8..6ce39cefbe 100644 --- a/bacula/src/qt-console/run/runcmd.cpp +++ b/bacula/src/qt-console/run/runcmd.cpp @@ -1,31 +1,35 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2010 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* * Run Command Dialog class * * This is called when a Run Command signal is received from the - * Director. We parse the Director's output and throw up a + * Director. We parse the Director's output and throw up a * dialog box. This happens, for example, after the user finishes * selecting files to be restored. The Director will then submit a * run command, that causes this page to be popped up. * * Kern Sibbald, March MMVII * - */ + */ #include "bat.h" #include "run.h" @@ -61,7 +65,7 @@ void runCmdPage::fill() clientCombo->addItems(m_console->client_list); filesetCombo->addItems(m_console->fileset_list); - replaceCombo->addItems(QStringList() << tr("never") << tr("always") << tr("ifnewer") + replaceCombo->addItems(QStringList() << tr("never") << tr("always") << tr("ifnewer") << tr("ifolder")); replaceCombo->setCurrentIndex(replaceCombo->findText(tr("never"), Qt::MatchExactly)); storageCombo->addItems(m_console->storage_list); @@ -114,7 +118,7 @@ void runCmdPage::fill() if (item.startsWith("Priority:")) { bool okay; int pri = val.toInt(&okay, 10); - if (okay) + if (okay) prioritySpin->setValue(pri); continue; } @@ -141,7 +145,7 @@ void runCmdPage::okButtonPushed() QTextStream(&pri) << " priority=\"" << prioritySpin->value() << "\""; cmd += pri; cmd += " yes\n"; - + setConsoleCurrent(); QString displayhtml(""); displayhtml += cmd + "\n"; diff --git a/bacula/src/qt-console/select/select.cpp b/bacula/src/qt-console/select/select.cpp index 9184581be1..8d628de687 100644 --- a/bacula/src/qt-console/select/select.cpp +++ b/bacula/src/qt-console/select/select.cpp @@ -1,25 +1,29 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2010 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* * Select dialog class * * Kern Sibbald, March MMVII * - */ + */ #include "bat.h" #include "select.h" diff --git a/bacula/src/qt-console/select/select.h b/bacula/src/qt-console/select/select.h index fdeee45af9..a4377fc7bb 100644 --- a/bacula/src/qt-console/select/select.h +++ b/bacula/src/qt-console/select/select.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ #ifndef _SELECT_H_ @@ -23,7 +27,7 @@ class selectDialog : public QDialog, public Ui::selectForm { - Q_OBJECT + Q_OBJECT public: selectDialog(Console *console, int conn); @@ -41,7 +45,7 @@ private: class yesnoPopUp : public QDialog { - Q_OBJECT + Q_OBJECT public: yesnoPopUp(Console *console, int conn); diff --git a/bacula/src/qt-console/select/textinput.cpp b/bacula/src/qt-console/select/textinput.cpp index a085bce5f7..691f646bea 100644 --- a/bacula/src/qt-console/select/textinput.cpp +++ b/bacula/src/qt-console/select/textinput.cpp @@ -1,25 +1,29 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2010 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* * Select dialog class * * Kern Sibbald, March MMVII * - */ + */ #include "bat.h" #include "textinput.h" @@ -27,7 +31,7 @@ /* * Read input text box */ -textInputDialog::textInputDialog(Console *console, int conn) +textInputDialog::textInputDialog(Console *console, int conn) { m_conn = conn; QDateTime dt; diff --git a/bacula/src/qt-console/select/textinput.h b/bacula/src/qt-console/select/textinput.h index cfbcf070e6..83fb93e05f 100644 --- a/bacula/src/qt-console/select/textinput.h +++ b/bacula/src/qt-console/select/textinput.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 2000-2014 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ #ifndef _TEXTENTRY_H_ @@ -23,7 +27,7 @@ class textInputDialog : public QDialog, public Ui::textInputForm { - Q_OBJECT + Q_OBJECT public: textInputDialog(Console *console, int conn); diff --git a/bacula/src/qt-console/status/clientstat.cpp b/bacula/src/qt-console/status/clientstat.cpp index 40968309a1..97393a9c5e 100644 --- a/bacula/src/qt-console/status/clientstat.cpp +++ b/bacula/src/qt-console/status/clientstat.cpp @@ -1,22 +1,26 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2010 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Dirk Bartley, March 2007 */ - + #include "bat.h" #include #include diff --git a/bacula/src/qt-console/status/clientstat.h b/bacula/src/qt-console/status/clientstat.h index 2c4c88db2b..f88dfa917f 100644 --- a/bacula/src/qt-console/status/clientstat.h +++ b/bacula/src/qt-console/status/clientstat.h @@ -1,23 +1,25 @@ #ifndef _CLIENTSTAT_H_ #define _CLIENTSTAT_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * Version $Id: clientstat.h 5372 2007-08-17 12:17:04Z kerns $ - * * Dirk Bartley, March 2007 */ @@ -28,7 +30,7 @@ class ClientStat : public Pages, public Ui::ClientStatForm { - Q_OBJECT + Q_OBJECT public: ClientStat(QString&, QTreeWidgetItem*); diff --git a/bacula/src/qt-console/status/dirstat.cpp b/bacula/src/qt-console/status/dirstat.cpp index 4190de60fe..1747f4cb7b 100644 --- a/bacula/src/qt-console/status/dirstat.cpp +++ b/bacula/src/qt-console/status/dirstat.cpp @@ -1,23 +1,27 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2010 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * * Dirk Bartley, March 2007 */ - + #include "bat.h" #include #include @@ -131,10 +135,10 @@ void DirStat::populateTerminated() terminatedTable->clear(); QStringList headerlist = (QStringList() << tr("Job Id") << tr("Job Level") << tr("Job Files") - << tr("Job Bytes") << tr("Job Status") << tr("Job Time") + << tr("Job Bytes") << tr("Job Status") << tr("Job Time") << tr("Job Name")); QStringList flaglist = (QStringList() - << "R" << "L" << "R" << "R" << "LC" + << "R" << "L" << "R" << "R" << "LC" << "L" << "L"); terminatedTable->setColumnCount(headerlist.size()); @@ -187,7 +191,7 @@ void DirStat::populateScheduled() scheduledTable->clear(); QStringList headerlist = (QStringList() - << tr("Job Level") << tr("Job Type") << tr("Priority") << tr("Job Time") + << tr("Job Level") << tr("Job Type") << tr("Priority") << tr("Job Time") << tr("Job Name") << tr("Volume")); QStringList flaglist = (QStringList() << "L" << "L" << "R" << "L" << "L" << "L"); diff --git a/bacula/src/qt-console/status/dirstat.h b/bacula/src/qt-console/status/dirstat.h index 501ccf4398..c83c918583 100644 --- a/bacula/src/qt-console/status/dirstat.h +++ b/bacula/src/qt-console/status/dirstat.h @@ -1,23 +1,25 @@ #ifndef _DIRSTAT_H_ #define _DIRSTAT_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * Version $Id: dirstat.h 5372 2007-08-17 12:17:04Z kerns $ - * * Dirk Bartley, March 2007 */ @@ -28,7 +30,7 @@ class DirStat : public Pages, public Ui::DirStatForm { - Q_OBJECT + Q_OBJECT public: DirStat(); diff --git a/bacula/src/qt-console/status/storstat.cpp b/bacula/src/qt-console/status/storstat.cpp index 59bca7049a..86eff95916 100644 --- a/bacula/src/qt-console/status/storstat.cpp +++ b/bacula/src/qt-console/status/storstat.cpp @@ -1,23 +1,27 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2010 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * * Dirk Bartley, March 2007 */ - + #include "bat.h" #include #include @@ -29,7 +33,7 @@ static bool working = false; /* prevent timer recursion */ /* .status storage= -where is the storage name in the Director, and +where is the storage name in the Director, and is one of the following: header running @@ -228,10 +232,10 @@ void StorStat::populateTerminated() terminatedTable->clear(); QStringList headerlist = (QStringList() << tr("Job Id") << tr("Job Level") << tr("Job Files") - << tr("Job Bytes") << tr("Job Status") << tr("Job Time") + << tr("Job Bytes") << tr("Job Status") << tr("Job Time") << tr("Job Name")); QStringList flaglist = (QStringList() - << "R" << "L" << "R" << "R" << "LC" + << "R" << "L" << "R" << "R" << "LC" << "L" << "L"); terminatedTable->setColumnCount(headerlist.size()); @@ -437,4 +441,4 @@ void StorStat::releaseButtonPushed() void StorStat::labelButtonPushed() { new labelPage(m_storage); -} +} diff --git a/bacula/src/qt-console/status/storstat.h b/bacula/src/qt-console/status/storstat.h index 66cd155a44..55bd74a259 100644 --- a/bacula/src/qt-console/status/storstat.h +++ b/bacula/src/qt-console/status/storstat.h @@ -1,23 +1,25 @@ #ifndef _STORSTAT_H_ #define _STORSTAT_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * Version $Id: dirstat.h 5372 2007-08-17 12:17:04Z kerns $ - * * Dirk Bartley, March 2007 */ @@ -28,7 +30,7 @@ class StorStat : public Pages, public Ui::StorStatForm { - Q_OBJECT + Q_OBJECT public: StorStat(QString &, QTreeWidgetItem *); diff --git a/bacula/src/qt-console/storage/content.cpp b/bacula/src/qt-console/storage/content.cpp index a41f8737bb..fe3acf7f90 100644 --- a/bacula/src/qt-console/storage/content.cpp +++ b/bacula/src/qt-console/storage/content.cpp @@ -1,19 +1,23 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2009 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + #include "bat.h" #include #include @@ -24,11 +28,11 @@ #include "util/fmtwidgetitem.h" #include "status/storstat.h" -// +// // TODO: List tray // List drives in autochanger // use user selection to add slot= argument -// +// Content::Content(QString storage, QTreeWidgetItem *parentWidget) : Pages() { @@ -91,8 +95,12 @@ void table_get_selection(QTableWidget *table, QString &sel) * We take only one instance */ int s = table->rowCount(); + if (s == 0) { + /* No selection?? */ + return; + } bool *tab = (bool *)malloc(s * sizeof(bool)); - memset(tab, 0, s); + memset(tab, 0, s); foreach (item, table->selectedItems()) { current = item->row(); @@ -161,7 +169,7 @@ void Content::statusStorageWindow() } /* - * The main meat of the class!! The function that querries the director and + * The main meat of the class!! The function that querries the director and * creates the widgets with appropriate values. */ void Content::populateContent() @@ -212,33 +220,33 @@ void Content::populateContent() } /* Slot */ - slotitem.setNumericFld(index++, fld.next()); + slotitem.setNumericFld(index++, fld.next()); /* Real Slot */ if (fld.next() != "") { /* Volume */ slotitem.setTextFld(index++, fld.next()); - + /* Bytes */ slotitem.setBytesFld(index++, fld.next()); - + /* Status */ slotitem.setVolStatusFld(index++, fld.next()); - + /* MediaType */ slotitem.setTextFld(index++, fld.next()); - + /* Pool */ slotitem.setTextFld(index++, fld.next()); - + tim = fld.next().toInt(); if (tim > 0) { /* LastW */ localtime_r(&tim, &tm); strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tm); slotitem.setTextFld(index++, QString(buf)); - + /* Expire */ tim = fld.next().toInt(); localtime_r(&tim, &tm); @@ -249,6 +257,7 @@ void Content::populateContent() row++; } + tableContent->verticalHeader()->hide(); tableContent->sortByColumn(0, Qt::AscendingOrder); tableContent->setSortingEnabled(true); @@ -262,17 +271,16 @@ void Content::populateContent() tableTray->setEditTriggers(QAbstractItemView::NoEditTriggers); tableDrive->verticalHeader()->hide(); + /* Get count of rows needed (Drives) */ QStringList drives = results_all.filter(QRegExp("^D\\|[0-9]+\\|")); + /* Ensure we have sufficient rows for Drive display */ tableDrive->setRowCount(drives.size()); - row = 0; foreach (resultline, drives) { fieldlist = resultline.split("|"); if (fieldlist.size() < 4) { - Pmsg1(0, "Discarding %s\n", resultline.data()); continue; /* some fields missing, ignore row */ } - int index=0; QStringListIterator fld(fieldlist); TableItemFormatter slotitem(*tableDrive, row); @@ -281,14 +289,14 @@ void Content::populateContent() fld.next(); /* Number */ - slotitem.setNumericFld(index++, fld.next()); + slotitem.setNumericFld(index++, fld.next()); /* Slot */ fld.next(); - + /* Volume */ slotitem.setTextFld(index++, fld.next()); - + row++; } @@ -316,7 +324,7 @@ void Content::consoleUpdateSlots() { QString sel = ""; table_get_selection(tableContent, sel); - + QString cmd("update slots"); if (sel != "") { cmd += sel; diff --git a/bacula/src/qt-console/storage/content.h b/bacula/src/qt-console/storage/content.h index 9f86c5d165..854cb55794 100644 --- a/bacula/src/qt-console/storage/content.h +++ b/bacula/src/qt-console/storage/content.h @@ -1,19 +1,23 @@ #ifndef _CONTENT_H_ #define _CONTENT_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ #include @@ -23,7 +27,7 @@ class Content : public Pages, public Ui::ContentForm { - Q_OBJECT + Q_OBJECT public: Content(QString storage, QTreeWidgetItem *parentWidget); diff --git a/bacula/src/qt-console/storage/storage.cpp b/bacula/src/qt-console/storage/storage.cpp index da61da6964..9f5dc226cb 100644 --- a/bacula/src/qt-console/storage/storage.cpp +++ b/bacula/src/qt-console/storage/storage.cpp @@ -1,26 +1,30 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2010 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* * * Storage Class * * Dirk Bartley, March 2007 * - */ + */ #include "bat.h" #include @@ -57,7 +61,7 @@ Storage::~Storage() } /* - * The main meat of the class!! The function that querries the director and + * The main meat of the class!! The function that querries the director and * creates the widgets with appropriate values. */ void Storage::populateTree() @@ -73,7 +77,7 @@ void Storage::populateTree() m_checkcurwidget = true; QStringList headerlist = (QStringList() << tr("Name") << tr("Id") - << tr("Changer") << tr("Slot") << tr("Status") << tr("Enabled") << tr("Pool") + << tr("Changer") << tr("Slot") << tr("Status") << tr("Enabled") << tr("Pool") << tr("Media Type") ); m_topItem = new QTreeWidgetItem(mp_treeWidget); @@ -119,6 +123,10 @@ void Storage::populateTree() QStringList fieldlist; foreach (QString resultline, results) { fieldlist = resultline.split("\t"); + if (fieldlist.size() != 3) { + Pmsg1(000, "Unexpected line %s", resultline.toUtf8().data()); + continue; + } storageName = fieldlist.takeFirst(); if (m_firstpopulation) { settingsOpenStatus(storageName); @@ -132,9 +140,9 @@ void Storage::populateTree() int index = 1; QStringListIterator fld(fieldlist); - + /* storage id */ - storageItem.setNumericFld(index++, fld.next()); + storageItem.setNumericFld(index++, fld.next() ); /* changer */ QString changer = fld.next(); @@ -159,7 +167,7 @@ void Storage::mediaList(QTreeWidgetItem *parent, const QString &storageID) { QString query("SELECT Media.VolumeName AS Media, Media.Slot AS Slot," " Media.VolStatus AS VolStatus, Media.Enabled AS Enabled," - " Pool.Name AS MediaPool, Media.MediaType AS MediaType" + " Pool.Name AS MediaPool, Media.MediaType AS MediaType" " From Media" " JOIN Pool ON (Media.PoolId=Pool.PoolId)" " WHERE Media.StorageId='" + storageID + "'" @@ -175,11 +183,11 @@ void Storage::mediaList(QTreeWidgetItem *parent, const QString &storageID) QString resultline; QString field; QStringList fieldlist; - + foreach (resultline, results) { fieldlist = resultline.split("\t"); if (fieldlist.size() < 6) - continue; + continue; /* Iterate through fields in the record */ QStringListIterator fld(fieldlist); @@ -187,8 +195,8 @@ void Storage::mediaList(QTreeWidgetItem *parent, const QString &storageID) TreeItemFormatter fmt(*parent, 2); /* volname */ - fmt.setTextFld(index++, fld.next()); - + fmt.setTextFld(index++, fld.next()); + /* skip the next two columns, unused by media */ index += 2; @@ -199,13 +207,13 @@ void Storage::mediaList(QTreeWidgetItem *parent, const QString &storageID) fmt.setVolStatusFld(index++, fld.next()); /* enabled */ - fmt.setBoolFld(index++, fld.next()); + fmt.setBoolFld(index++, fld.next()); /* pool */ - fmt.setTextFld(index++, fld.next()); + fmt.setTextFld(index++, fld.next()); /* media type */ - fmt.setTextFld(index++, fld.next()); + fmt.setTextFld(index++, fld.next()); } } @@ -285,8 +293,8 @@ void Storage::treeItemChanged(QTreeWidgetItem *currentwidgetitem, QTreeWidgetIte } } -/* - * Setup a context menu +/* + * Setup a context menu * Made separate from populate so that it would not create context menu over and * over as the tree is repopulated. */ @@ -323,7 +331,7 @@ void Storage::createContextMenu() void Storage::contentWindow() { - if (m_currentStorage != "" && m_currentAutoChanger) { + if (m_currentStorage != "" && m_currentAutoChanger) { QTreeWidgetItem *parentItem = mainWin->getFromHash(this); new Content(m_currentStorage, parentItem); } diff --git a/bacula/src/qt-console/storage/storage.h b/bacula/src/qt-console/storage/storage.h index 2eee35547f..7ff77e66d8 100644 --- a/bacula/src/qt-console/storage/storage.h +++ b/bacula/src/qt-console/storage/storage.h @@ -1,23 +1,25 @@ #ifndef _STORAGE_H_ #define _STORAGE_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * Version $Id$ - * * Dirk Bartley, March 2007 */ @@ -28,7 +30,7 @@ class Storage : public Pages, public Ui::StorageForm { - Q_OBJECT + Q_OBJECT public: Storage(); diff --git a/bacula/src/qt-console/tray-monitor/authenticate.cpp b/bacula/src/qt-console/tray-monitor/authenticate.cpp index 22688b1bdb..16f78dd5d6 100644 --- a/bacula/src/qt-console/tray-monitor/authenticate.cpp +++ b/bacula/src/qt-console/tray-monitor/authenticate.cpp @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 2004-2014 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2004-2013 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -26,8 +30,8 @@ * */ +#include "winhdrs.h" #include "tray-monitor.h" -#include "jcr.h" void senditf(const char *fmt, ...); void sendit(const char *buf); @@ -74,7 +78,7 @@ int authenticate_director(JCR *jcr, MONITOR *mon, DIRRES *director) stop_bsock_timer(tid); Jmsg0(jcr, M_FATAL, 0, _("Director authorization problem.\n" "Most likely the passwords do not agree.\n" - "Please see " MANUAL_AUTH_URL " for help.\n")); + "For help, please see " MANUAL_AUTH_URL "\n")); return 0; } @@ -123,7 +127,7 @@ int authenticate_storage_daemon(JCR *jcr, MONITOR *monitor, STORE* store) !cram_md5_challenge(sd, store->password, tls_local_need, compatible)) { stop_bsock_timer(tid); Jmsg0(jcr, M_FATAL, 0, _("Director and Storage daemon passwords or names not the same.\n" - "Please see " MANUAL_AUTH_URL " for help.\n")); + "For help, please see " MANUAL_AUTH_URL "\n")); return 0; } Dmsg1(116, ">stored: %s", sd->msg); @@ -169,7 +173,7 @@ int authenticate_file_daemon(JCR *jcr, MONITOR *monitor, CLIENT* client) !cram_md5_challenge(fd, client->password, tls_local_need, compatible)) { stop_bsock_timer(tid); Jmsg(jcr, M_FATAL, 0, _("Director and File daemon passwords or names not the same.\n" - "Please see " MANUAL_AUTH_URL " for help.\n")); + "For help, please see " MANUAL_AUTH_URL "\n")); return 0; } Dmsg1(116, ">filed: %s", fd->msg); diff --git a/bacula/src/qt-console/tray-monitor/tray-monitor.cpp b/bacula/src/qt-console/tray-monitor/tray-monitor.cpp index ed69d101cd..590a1c00d8 100644 --- a/bacula/src/qt-console/tray-monitor/tray-monitor.cpp +++ b/bacula/src/qt-console/tray-monitor/tray-monitor.cpp @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 2004-2014 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2004-2013 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ #include "tray-ui.h" @@ -141,11 +145,13 @@ int main(int argc, char *argv[]) init_msg(NULL, NULL, NULL); working_directory = "/tmp"; +#ifndef HAVE_WIN32 struct sigaction sigignore; sigignore.sa_flags = 0; sigignore.sa_handler = SIG_IGN; sigfillset(&sigignore.sa_mask); sigaction(SIGPIPE, &sigignore, NULL); +#endif while ((ch = getopt(argc, argv, "bc:d:th?f:s:")) != -1) { switch (ch) { @@ -444,7 +450,7 @@ int docmd(monitoritem* item, const char* command) item->D_sock->signal(BNET_HB_RESPONSE); } else { - qDebug() << bnet_sig_to_ascii(item->D_sock); + qDebug() << bnet_sig_to_ascii(item->D_sock->msglen); } } else { /* BNET_HARDEOF || BNET_ERROR */ diff --git a/bacula/src/qt-console/tray-monitor/tray-monitor.h b/bacula/src/qt-console/tray-monitor/tray-monitor.h index 33f111b8cb..0e03420a90 100644 --- a/bacula/src/qt-console/tray-monitor/tray-monitor.h +++ b/bacula/src/qt-console/tray-monitor/tray-monitor.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2004-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Includes specific to the tray monitor @@ -117,7 +121,7 @@ public: /* Pointer to default value */ *def++ = 0; strip_trailing_junk(def); - + if (strcmp(dircomm->msg, "job") == 0) { if (strcmp(def, job_defs.job_name.toUtf8().data()) != 0) { goto bail_out; diff --git a/bacula/src/qt-console/tray-monitor/tray-monitor.pro.in b/bacula/src/qt-console/tray-monitor/tray-monitor.pro.in index 5a37f7d89f..924267c175 100644 --- a/bacula/src/qt-console/tray-monitor/tray-monitor.pro.in +++ b/bacula/src/qt-console/tray-monitor/tray-monitor.pro.in @@ -32,7 +32,7 @@ LIBTOOL_LINK = @QMAKE_LIBTOOL@ --silent --tag=CXX --mode=link LIBTOOL_INSTALL = @QMAKE_LIBTOOL@ --silent --mode=install QMAKE_LINK = $${LIBTOOL_LINK} $(CXX) QMAKE_INSTALL_PROGRAM = $${LIBTOOL_INSTALL} install -m @SBINPERM@ -p -QMAKE_CLEAN += .libs/* bacula-tray-monitor release/bacula-tray-monitor +QMAKE_CLEAN += obj/* .libs/* bacula-tray-monitor release/bacula-tray-monitor RESOURCES = ../main.qrc MOC_DIR = moc diff --git a/bacula/src/qt-console/tray-monitor/tray-monitor.pro.mingw32.in b/bacula/src/qt-console/tray-monitor/tray-monitor.pro.mingw32.in new file mode 100644 index 0000000000..cb212b2c22 --- /dev/null +++ b/bacula/src/qt-console/tray-monitor/tray-monitor.pro.mingw32.in @@ -0,0 +1,55 @@ +###################################################################### +# +# !!!!!!! IMPORTANT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# +# Edit only tray-monitor.pro.mingw32.in -- tray-monitor.pro.mingw32 is built by the ./configure program +# +# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# +# CONFIG options for Windows are pulled from win32/qmake.conf +CONFIG += qt +#CONFIG += qt debug + +cross-win32 { + LIBS += -mwindows -L../../win32/release32 -lbacula + INCLUDEPATH += ../../win32/compat +} +!cross-win32 { + LIBS += -L../../lib -lbaccfg -lbac -L../../findlib -lbacfind @OPENSSL_LIBS@ +} + + +bins.path = /$(DESTDIR)@sbindir@ +bins.files = bacula-tray-monitor +confs.path = /$(DESTDIR)@sysconfdir@ +confs.commands = ./install_conf_file + +TEMPLATE = app +TARGET = bacula-tray-monitor +DEPENDPATH += . +INCLUDEPATH += ../.. . +LIBTOOL_LINK = @QMAKE_LIBTOOL@ --silent --tag=CXX --mode=link +LIBTOOL_INSTALL = @QMAKE_LIBTOOL@ --silent --mode=install +QMAKE_LINK = $${LIBTOOL_LINK} $(CXX) +QMAKE_INSTALL_PROGRAM = $${LIBTOOL_INSTALL} install -m @SBINPERM@ -p +QMAKE_CLEAN += .libs/* bacula-tray-monitor release/bacula-tray-monitor + +RESOURCES = ../main.qrc +MOC_DIR = moc32 +OBJECTS_DIR = obj32 +UI_DIR = ui32 +QMAKE_CC = i686-w64-mingw32-gcc +QMAKE_CXX = i686-w64-mingw32-g++ +QMAKE_INCDIR = $(DEPKGS)/depkgs-mingw32/include/pthreads $(DEPKGS)/depkgs-mingw32/include/ ../win32/compat +QMAKE_INCDIR_QT = $(DEPKGS)/depkgs-mingw32/include/qt +QMAKE_LIBDIR_QT = $(DEPKGS)/depkgs-mingw32/lib/qt +QMAKE_LINK = i686-w64-mingw32-g++ +QMAKE_LFLAGS = -mthreads -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -m32 -fno-strict-aliasing -Wl,-enable-runtime-pseudo-reloc +QMAKE_LIB = i686-w64-mingw32-ar -ru +QMAKE_RC = i686-w64-mingw32-windres + +# Main directory +HEADERS += tray_conf.h tray-monitor.h tray-ui.h +SOURCES += authenticate.cpp tray_conf.cpp tray-monitor.cpp + +FORMS += ../run/run.ui diff --git a/bacula/src/qt-console/tray-monitor/tray-monitor.pro.mingw64.in b/bacula/src/qt-console/tray-monitor/tray-monitor.pro.mingw64.in new file mode 100644 index 0000000000..a52c640c94 --- /dev/null +++ b/bacula/src/qt-console/tray-monitor/tray-monitor.pro.mingw64.in @@ -0,0 +1,55 @@ +###################################################################### +# +# !!!!!!! IMPORTANT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# +# Edit only tray-monitor.pro.mingw64.in -- tray-monitor.pro.mingw64 is built by the ./configure program +# +# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# +# CONFIG options for Windows are pulled from win32/qmake.conf +CONFIG += qt +#CONFIG += qt debug + +cross-win32 { + LIBS += -mwindows -L../../win32/release64 -lbacula + INCLUDEPATH += ../../win32/compat +} +!cross-win32 { + LIBS += -L../../lib -lbaccfg -lbac -L../../findlib -lbacfind @OPENSSL_LIBS@ +} + + +bins.path = /$(DESTDIR)@sbindir@ +bins.files = bacula-tray-monitor +confs.path = /$(DESTDIR)@sysconfdir@ +confs.commands = ./install_conf_file + +TEMPLATE = app +TARGET = bacula-tray-monitor +DEPENDPATH += . +INCLUDEPATH += ../.. . +LIBTOOL_LINK = @QMAKE_LIBTOOL@ --silent --tag=CXX --mode=link +LIBTOOL_INSTALL = @QMAKE_LIBTOOL@ --silent --mode=install +QMAKE_LINK = $${LIBTOOL_LINK} $(CXX) +QMAKE_INSTALL_PROGRAM = $${LIBTOOL_INSTALL} install -m @SBINPERM@ -p +QMAKE_CLEAN += .libs/* bacula-tray-monitor release/bacula-tray-monitor + +RESOURCES = ../main.qrc +MOC_DIR = moc64 +OBJECTS_DIR = obj64 +UI_DIR = ui64 +QMAKE_CC = x86_64-w64-mingw32-gcc +QMAKE_CXX = x86_64-w64-mingw32-g++ +QMAKE_INCDIR = $(DEPKGS)/depkgs-mingw-w64/include/pthreads $(DEPKGS)/depkgs-mingw-w64/include/ ../win32/compat +QMAKE_INCDIR_QT = $(DEPKGS)/depkgs-mingw-w64/include/qt +QMAKE_LIBDIR_QT = $(DEPKGS)/depkgs-mingw-w64/lib/qt +QMAKE_LINK = x86_64-w64-mingw32-g++ +QMAKE_LFLAGS = -mthreads -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -m64 -fno-strict-aliasing -Wl,-enable-runtime-pseudo-reloc +QMAKE_LIB = x86_64-w64-mingw32-ar -ru +QMAKE_RC = x86_64-w64-mingw32-windres + +# Main directory +HEADERS += tray_conf.h tray-monitor.h tray-ui.h +SOURCES += authenticate.cpp tray_conf.cpp tray-monitor.cpp + +FORMS += ../run/run.ui diff --git a/bacula/src/qt-console/tray-monitor/tray-ui.h b/bacula/src/qt-console/tray-monitor/tray-ui.h index d0084055a9..e4e5dfc9fc 100644 --- a/bacula/src/qt-console/tray-monitor/tray-ui.h +++ b/bacula/src/qt-console/tray-monitor/tray-ui.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2011-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ #ifndef TRAYUI_H @@ -23,6 +27,7 @@ # endif #endif +#include "winhdrs.h" #include #include #include @@ -45,7 +50,7 @@ #include #include "version.h" -#include "ui/ui_run.h" +#include "ui_run.h" #include "tray-monitor.h" class RunDlg: public QDialog, public Ui::runForm @@ -70,7 +75,7 @@ public: qDebug() << "start getting elements"; get_list(item, ".jobs type=B", res.job_list); - + if (res.job_list.length() == 0) { QMessageBox msgBox; msgBox.setText("This restricted console doesn't have access to Backup jobs"); @@ -192,7 +197,7 @@ public: return hash.value(QString(title)); } - void clearText(char *title) + void clearText(char *title) { QPlainTextEdit *w = getTextEdit(title); if (!w) { @@ -201,7 +206,7 @@ public: w->clear(); } - void appendText(char *title, char *line) + void appendText(char *title, char *line) { QPlainTextEdit *w = getTextEdit(title); if (!w) { @@ -244,7 +249,7 @@ public: director = NULL; if (TrayMonitor->objectName().isEmpty()) TrayMonitor->setObjectName(QString::fromUtf8("TrayMonitor")); - TrayMonitor->setWindowIcon(QIcon(":/images/cartridge1.png")); + TrayMonitor->setWindowIcon(QIcon(":/images/cartridge1.png")); TrayMonitor->resize(789, 595); centralwidget = new QWidget(TrayMonitor); centralwidget->setObjectName(QString::fromUtf8("centralwidget")); @@ -306,7 +311,7 @@ public: stmenu->addAction(actAbout); stmenu->addSeparator(); stmenu->addAction(actQuit); - + connect(actRun, SIGNAL(triggered()), this, SLOT(cb_run())); connect(actShow, SIGNAL(triggered()), this, SLOT(cb_show())); connect(actQuit, SIGNAL(triggered()), this, SLOT(cb_quit())); @@ -344,8 +349,8 @@ private slots: void cb_about() { QMessageBox::about(this, "Bacula Tray Monitor", "Bacula Tray Monitor\n" "For more information, see: www.baculasystems.com\n" - "Copyright (C) 1999-2010, Bacula Systems(R) SA\n" - "Licensed under GNU AGPLv3."); + "Copyright (C) 1999-2015, Kern Sibbald.\n" + "License AGPLv3 see LICENSE."); } void cb_run() { diff --git a/bacula/src/qt-console/tray-monitor/tray_conf.cpp b/bacula/src/qt-console/tray-monitor/tray_conf.cpp index a6bbbf250c..ed6643f54e 100644 --- a/bacula/src/qt-console/tray-monitor/tray_conf.cpp +++ b/bacula/src/qt-console/tray-monitor/tray_conf.cpp @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2004-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Main configuration file parser for Bacula Tray Monitor. diff --git a/bacula/src/qt-console/tray-monitor/tray_conf.h b/bacula/src/qt-console/tray-monitor/tray_conf.h index a75a56e583..38320a0c68 100644 --- a/bacula/src/qt-console/tray-monitor/tray_conf.h +++ b/bacula/src/qt-console/tray-monitor/tray_conf.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2004-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Tray Monitor specific configuration and defines diff --git a/bacula/src/qt-console/ts/bat_de.ts b/bacula/src/qt-console/ts/bat_de.ts index 0b01e6db13..b7d8241b40 100644 --- a/bacula/src/qt-console/ts/bat_de.ts +++ b/bacula/src/qt-console/ts/bat_de.ts @@ -57,42 +57,42 @@ ClientStat - + Client Status %1 - + Job Id - + Job Level - + Job Files - + Job Bytes - + Job Status - + Job Time - + Job Name @@ -146,43 +146,43 @@ p, li { white-space: pre-wrap; } Clients - + Clients - - + + Client Name - + File Retention - + Job Retention - + AutoPrune - + ClientId - + Uname - + Are you sure you want to purge all jobs of client "%1" ? The Purge command will delete associated Catalog database records from Jobs and Volumes without considering the retention period. Purge works only on the Catalog database and does not affect data written to Volumes. This command can be dangerous because you can delete catalog records associated with current backups of files, and we recommend that you do not use it unless you know what you are doing. @@ -192,7 +192,7 @@ Press OK to proceed with the purge operation? - + Client Status %1 @@ -200,22 +200,22 @@ Press OK to proceed with the purge operation? Console - + Console - + No Director found. - + Director not connected. Click on connect button. - + Director is currently disconnected Please reconnect! @@ -252,7 +252,7 @@ Please reconnect! Content - + Storage Status %1 @@ -384,7 +384,7 @@ Please reconnect! DirComm - + Already connected. @@ -392,72 +392,72 @@ Please reconnect! DirStat - - + + Job Id - - - + + + Job Level - + Job Files - + Job Bytes - + Job Status - - + + Job Time - - + + Job Name - + Job Type - + Priority - + Volume - + Job Data - + Job Info - + Director Status @@ -522,23 +522,23 @@ p, li { white-space: pre-wrap; } FileSet - + FileSets - + FileSet Id - - + + FileSet Name - + Create Time @@ -574,7 +574,7 @@ p, li { white-space: pre-wrap; } Help - + Help: %1 @@ -582,35 +582,35 @@ p, li { white-space: pre-wrap; } Job - + Job - + Are you sure you want to delete?? !!!. This delete command is used to delete a Job record and all associated catalog records that were created. This command operates only on the Catalog database and has no effect on the actual data written to a Volume. This command can be dangerous and we strongly recommend that you do not use it unless you know what you are doing. The Job and all its associated records (File and JobMedia) will be deleted from the catalog.Press OK to proceed with delete operation.? - + Are you sure you want to cancel this job? - + Bat - + There were no results! It is possible you may need to add "catalog = all" to the Messages resource for this job. - + Error: @@ -874,7 +874,17 @@ It is possible you may need to add "catalog = all" to the Messages res - + + kB/s + + + + + Bandwidth Limit: + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -886,182 +896,182 @@ p, li { white-space: pre-wrap; } JobList - - - - - - - - + + + + + + + + Any - - + + Job Id - - + + Job Name - - + + Client - - + + Job Starttime - - + + Job Type - - + + Job Level - - + + Job Files - - + + Job Bytes - - + + Job Status - - + + Purged - - + + File Set - + Pool Name - + First Volume - + VolCount - + Delete list of %1 Jobs - + Purge Files from list of %1 Jobs - + Delete Single Job - + Purge Files from single job - + Running - + Created, not yet running - + Backup - + The Jobs query returned no results. Press OK to continue? - + Jobs Run on Volume %1 - + Jobs Run from Client %1 - + Jobs Run of Job %1 - + Jobs Run with fileset %1 - + Jobs Run - + Are you sure you want to delete?? !!!. This delete command is used to delete a Job record and all associated catalog records that were created. This command operates only on the Catalog database and has no effect on the actual data written to a Volume. This command can be dangerous and we strongly recommend that you do not use it unless you know what you are doing. The Job and all its associated records (File and JobMedia) will be deleted from the catalog.Press OK to proceed with delete operation.? - + run job="%1" client="%2" level=%3 - + fileset="%1" - + Are you sure you want to purge ?? !!!. The Purge command will delete associated Catalog database records from Jobs and Volumes without considering the retention period. Purge works only on the Catalog database and does not affect data written to Volumes. This command can be dangerous because you can delete catalog records associated with current backups of files, and we recommend that you do not use it unless you know what you are doing. Press OK to proceed with the purge operation? @@ -1219,29 +1229,29 @@ Press OK to proceed with the purge operation? JobLog - + JobLog - + Bat - + There were no results! It is possible you may need to add "catalog = all" to the Messages resource for this job. - + Log records for job %1 - + Error: @@ -1257,159 +1267,159 @@ It is possible you may need to add "catalog = all" to the Messages res JobPlot - + JobPlot - - + + Sticks - - + + Lines - - + + Steps - - - + + + None - - - - - - - + + + + + + + Any - + The Jobs query returned no results. Press OK to continue? - + Files and Bytes backed up - + <-- Bytes Kb - + date of backup --> - + Number of Files --> - + Files - + Bytes - + Fitted - + Ellipse - + Rect - + Diamond - + Triangle - + DTrianle - + UTriangle - + LTriangle - + RTriangle - + Cross - + XCross - + HLine - + Vline - + Star1 - + Star2 - + Hexagon @@ -1500,64 +1510,64 @@ Press OK to continue? Jobs - + Jobs - - + + Job Name - + Pool - + Messages - + Client - + Storage - + Where - + Level - - + + Type - + FileSet - + Catalog - + Enabled @@ -1881,33 +1891,33 @@ Press OK to continue? MainWin - + Select Page - + Console - + Director Status - + Director not connected. Click on connect button. - + About bat - - <br><h2>Bat %1 (%2), by Dirk H Bartley and Kern Sibbald</h2><p>Copyright &copy; 2007-%3 Free Software Foundation Europe e.V.<p>Improved by Bacula Systems SA.<p>The <b>bat</b> is an administrative console interface to the Director. + + <br><h2>Bacula Bat %1 (%2)</h2><p>Copyright &copy; 2007-%3 Kern Sibbald<p>The <b>bat</b> is an administrative console interface to the Director. @@ -1919,17 +1929,17 @@ Press OK to continue? MediaEdit - + Media Edit - + No Volume name - + No Volume name given @@ -1937,19 +1947,19 @@ Press OK to continue? MediaInfo - + Media Info - + Are you sure you want to purge ?? !!!. The Purge command will delete associated Catalog database records from Jobs and Volumes without considering the retention period. Purge works only on the Catalog database and does not affect data written to Volumes. This command can be dangerous because you can delete catalog records associated with current backups of files, and we recommend that you do not use it unless you know what you are doing. Press OK to proceed with the purge operation? - + Are you sure you want to delete?? !!!. This delete command is used to delete a Volume record and all associated catalog records that were created. This command operates only on the Catalog database and has no effect on the actual data written to a Volume. This command can be dangerous and we strongly recommend that you do not use it unless you know what you are doing. All Jobs and all associated records (File and JobMedia) will be deleted from the catalog.Press OK to proceed with delete operation.? @@ -1958,124 +1968,124 @@ This delete command is used to delete a Volume record and all associated catalog MediaList - + Volume Name - + Id - + Status - + Enabled - + Bytes - + Files - + Jobs - + Retention - + Media Type - + Slot - + Use Duration - + Max Jobs - + Max Files - + Max Bytes - + Recycle - + Last Written - - + + Pools - + First Written - + Read Time - + Write Time - + Recycle Count - + Recycle Pool - + Are you sure you want to delete?? !!!. This delete command is used to delete a Volume record and all associated catalog records that were created. This command operates only on the Catalog database and has no effect on the actual data written to a Volume. This command can be dangerous and we strongly recommend that you do not use it unless you know what you are doing. All Jobs and all associated records (File and JobMedia) will be deleted from the catalog.Press OK to proceed with delete operation.? - + Are you sure you want to purge ?? !!!. The Purge command will delete associated Catalog database records from Jobs and Volumes without considering the retention period. Purge works only on the Catalog database and does not affect data written to Volumes. This command can be dangerous because you can delete catalog records associated with current backups of files, and we recommend that you do not use it unless you know what you are doing. Press OK to proceed with the purge operation? @@ -2154,19 +2164,19 @@ Press OK to proceed with the purge operation? MediaView - + Media - + Are you sure you want to purge ?? !!!. The Purge command will delete associated Catalog database records from Jobs and Volumes without considering the retention period. Purge works only on the Catalog database and does not affect data written to Volumes. This command can be dangerous because you can delete catalog records associated with current backups of files, and we recommend that you do not use it unless you know what you are doing. Press OK to proceed with the purge operation? - + Are you sure you want to delete?? !!!. This delete command is used to delete a Volume record and all associated catalog records that were created. This command operates only on the Catalog database and has no effect on the actual data written to a Volume. This command can be dangerous and we strongly recommend that you do not use it unless you know what you are doing. All Jobs and all associated records (File and JobMedia) will be deleted from the catalog.Press OK to proceed with delete operation.? @@ -2298,22 +2308,22 @@ This delete command is used to delete a Volume record and all associated catalog Pages - + %1 of Director %2 - + UnDock %1 Window - + ReDock %1 Window - + Console @@ -2535,26 +2545,26 @@ This delete command is used to delete a Volume record and all associated catalog QObject - + Any - - - + + + No - - - + + + Yes - + Invalid job status %1 @@ -2562,42 +2572,42 @@ This delete command is used to delete a Volume record and all associated catalog StorStat - + Storage Status %1 - + Job Id - + Job Level - + Job Files - + Job Bytes - + Job Status - + Job Time - + Job Name @@ -2701,98 +2711,98 @@ p, li { white-space: pre-wrap; } Storage - - + + Storage - + Name - + Id - + Changer - + Slot - + Status - + Enabled - + Pool - + Media Type - + Yes - + Status Storage "%1" - + Status Storage "%1" in Window - + Label media in Storage "%1" - + Mount media in Storage "%1" - + "UN" Mount media in Storage "%1" - + Release media in Storage "%1" - + Barcode Scan media in Storage "%1" - + Read scan media in Storage "%1" - + Storage Status %1 @@ -2869,7 +2879,7 @@ p, li { white-space: pre-wrap; } bRestore - + bRestore @@ -2881,52 +2891,6 @@ p, li { white-space: pre-wrap; } brestore - - - - Type - - - - - File Name - - - - - - - Size - - - - - - - Date - - - - - InChanger - - - - - Volume - - - - - - JobId - - - - - Chksum - - Merge Jobs @@ -2952,11 +2916,36 @@ p, li { white-space: pre-wrap; } Double Click File Name to decend + + + + Type + + + + + File Name + + Double Click to decend + + + + + Size + + + + + + + Date + + Selection Range @@ -2986,6 +2975,37 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Drag and drop <span style=" font-weight:600;">File list</span> and/or <span style=" font-weight:600;">File revisions</span> items here for Restore</p></body></html> + + + Restore... + + + + + Select from Client list drop down then select from Job list drop down + + + + + InChanger + + + + + Volume + + + + + + JobId + + + + + Chksum + + Clear @@ -2996,11 +3016,6 @@ p, li { white-space: pre-wrap; } Estimate - - - Restore - - FileName @@ -3016,11 +3031,6 @@ p, li { white-space: pre-wrap; } Nb Files - - - Select from Client list drop down then select from Job list drop down - - bRunRestoreForm @@ -3198,7 +3208,7 @@ regexp: estimatePage - + Estimate @@ -3800,29 +3810,29 @@ p, li { white-space: pre-wrap; } mountDialog - + Storage : %1 - + No Storage name - + No Storage name given - + Context sensitive command : - + Director Response : @@ -3944,53 +3954,53 @@ p, li { white-space: pre-wrap; } prerestorePage - + Restore - - - + + + Any - - + + Comma separted list of Job Ids - + Canceled - + There can be no spaces in the text for the joblist. Press OK to continue? - + The string is not a comma separated list of integers. Press OK to continue? - + Bat - + At least one of the jobs is not a valid job of type "Backup". Press OK to continue? - + All jobs in the list must be of the same jobName and same client. Press OK to continue? @@ -4047,22 +4057,22 @@ Press OK to continue? prunePage - + Prune - - - - - - + + + + + + Any - + Canceled @@ -4070,23 +4080,23 @@ Press OK to continue? relabelDialog - + From Volume : - + No Volume name - + No Volume name given - + New name must be different @@ -4235,75 +4245,75 @@ p, li { white-space: pre-wrap; } restorePage - + Restore Select - + Mark - + File - + Mode - + User - + Group - + Size - + Date - + In addDirectory cwd "%1" newdir "%2" fullpath "%3" - + Nothing selected, nothing done - + cd command failed - + .pwd command failed - + In else of if parent cwd "%1" newdir "%2" - + Canceled @@ -4311,7 +4321,7 @@ p, li { white-space: pre-wrap; } restoreTree - + Version Browser @@ -4323,10 +4333,10 @@ p, li { white-space: pre-wrap; } - - - - + + + + Any @@ -4351,142 +4361,142 @@ p, li { white-space: pre-wrap; } - + Querying for Directories - + Processing Directories - + File Name - + Filename Id - + Task %1 of %2 - + No jobs were selected in the job query !!!. Press OK to continue - + Present Working Directory: %1 - - + + Job Id - - - + + + Type - - + + End Time - + Hash - + FileId - + Job Type - + First Volume - + RestoreTreePage - + Level - + Name - - + + Purged - - + + TU - - + + TD - + Task 1 of 3 - + Processing Checked directories - + Task 2 of 3 - + Processing Exceptions - + Task 3 of 3 - + Filling Database Table @@ -4675,33 +4685,33 @@ Press OK to continue runCmdPage - + Restore Run - - + + never - + always - + ifnewer - + ifolder - + Canceled @@ -4802,12 +4812,12 @@ Press OK to continue runPage - + Run - + Canceled @@ -4815,7 +4825,7 @@ Press OK to continue selectDialog - + Canceled @@ -4831,7 +4841,7 @@ Press OK to continue textInputDialog - + Canceled @@ -4852,7 +4862,7 @@ Press OK to continue yesnoPopUp - + Bat Question diff --git a/bacula/src/qt-console/ts/bat_fr.ts b/bacula/src/qt-console/ts/bat_fr.ts index 5360db4022..0faf64429d 100644 --- a/bacula/src/qt-console/ts/bat_fr.ts +++ b/bacula/src/qt-console/ts/bat_fr.ts @@ -57,42 +57,42 @@ ClientStat - + Client Status %1 État du client %1 - + Job Id Id du travail - + Job Level Niveau - + Job Files Fichiers - + Job Bytes Octets - + Job Status État - + Job Time Heure - + Job Name Nom @@ -149,43 +149,43 @@ p, li { white-space: pre-wrap; } Clients - + Clients Clients - - + + Client Name Nom du client - + File Retention Durée de rétention du fichier - + Job Retention Rétention du travail - + AutoPrune Élagage auto - + ClientId Id du client - + Uname Uname - + Are you sure you want to purge all jobs of client "%1" ? The Purge command will delete associated Catalog database records from Jobs and Volumes without considering the retention period. Purge works only on the Catalog database and does not affect data written to Volumes. This command can be dangerous because you can delete catalog records associated with current backups of files, and we recommend that you do not use it unless you know what you are doing. @@ -200,7 +200,7 @@ Comment vous persuader de clicker Annuler ? Vous ne désirez probablement pas fa Cliquer OK pour réaliser l'opération de purge ? - + Client Status %1 État du client %1 @@ -208,22 +208,22 @@ Cliquer OK pour réaliser l'opération de purge ? Console - + Console Console - + No Director found. Aucun Director trouvé. - + Director not connected. Click on connect button. Director déconnecté. Cliquer sur le bouton connexion. - + Director is currently disconnected Please reconnect! le Director est actuellement déconnecté @@ -261,7 +261,7 @@ Veuillez vous reconnecter ! Content - + Storage Status %1 Etat du dépôt %1 @@ -397,7 +397,7 @@ Veuillez vous reconnecter ! Bat - + Already connected. Déjà connecté. @@ -405,72 +405,72 @@ Veuillez vous reconnecter ! DirStat - - + + Job Id Id du travail - - - + + + Job Level Niveau - + Job Files Fichiers - + Job Bytes Octets - + Job Status État - - + + Job Time Heure - - + + Job Name Nom - + Job Type Type de travail - + Priority Priorité - + Volume Volume - + Job Data Données - + Job Info Information - + Director Status État du director @@ -541,7 +541,7 @@ p, li { white-space: pre-wrap; } FileSet - + FileSets Jeux de fichiers @@ -550,12 +550,12 @@ p, li { white-space: pre-wrap; } FileSet Name - + FileSet Id Id du jeu de fichiers - + Create Time Date de création @@ -564,8 +564,8 @@ p, li { white-space: pre-wrap; } FileSet - - + + FileSet Name Nom @@ -601,7 +601,7 @@ p, li { white-space: pre-wrap; } Help - + Help: %1 Aide : %1 @@ -609,28 +609,28 @@ p, li { white-space: pre-wrap; } Job - + Job Travail - + Are you sure you want to delete?? !!!. This delete command is used to delete a Job record and all associated catalog records that were created. This command operates only on the Catalog database and has no effect on the actual data written to a Volume. This command can be dangerous and we strongly recommend that you do not use it unless you know what you are doing. The Job and all its associated records (File and JobMedia) will be deleted from the catalog.Press OK to proceed with delete operation.? Êtes-vous sûr de vouloir détruire?? !!!.Cette commande est utilisée pour détruire un enregistrement "travail" et tous les enregistrements associés du catalogue. Cette commande influe uniquement sur le catalogue et n'a pas d'effet sur les données écrites sur un volume. Cette commande peut être dangereuse et nous vous recommandons fortement de ne pas l'utiliser, sauf si vous savez exactement ce que vous faites. Le travail et les autres enregistrements associés (fichiers et supports) seront détruits du catalogue. Cliquer OK pour réaliser la destruction ? - + Are you sure you want to cancel this job? Êtes-vous sûr de vouloir annuler ce travail ? - + Bat Bat - + There were no results! It is possible you may need to add "catalog = all" to the Messages resource for this job. @@ -639,7 +639,7 @@ Il se pourrait que vous deviez ajouter "catalog = all" à la ressource - + Error: Erreur : @@ -903,7 +903,17 @@ Il se pourrait que vous deviez ajouter "catalog = all" à la ressource - + + kB/s + + + + + Bandwidth Limit: + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -915,20 +925,20 @@ p, li { white-space: pre-wrap; } JobList - + The Jobs query returned no results. Press OK to continue? La requête ne renvoie aucun travail. Cliquer OK pour continuer ? - + Are you sure you want to delete?? !!!. This delete command is used to delete a Job record and all associated catalog records that were created. This command operates only on the Catalog database and has no effect on the actual data written to a Volume. This command can be dangerous and we strongly recommend that you do not use it unless you know what you are doing. The Job and all its associated records (File and JobMedia) will be deleted from the catalog.Press OK to proceed with delete operation.? Êtes-vous sûr de vouloir détruire?? !!!.Cette commande est utilisée pour détruire un enregistrement "travail" et tous les enregistrements associés du catalogue. Cette commande influe uniquement sur le catalogue et n'a pas d'effet sur les données écrites sur un volume. Cette commande peut être dangereuse et nous vous recommandons fortement de ne pas l'utiliser, sauf si vous savez exactement ce que vous faites. Le travail et les autres enregistrements associés (fichiers et supports) seront détruits du catalogue. Cliquer OK pour réaliser la destruction ? - + Are you sure you want to purge ?? !!!. The Purge command will delete associated Catalog database records from Jobs and Volumes without considering the retention period. Purge works only on the Catalog database and does not affect data written to Volumes. This command can be dangerous because you can delete catalog records associated with current backups of files, and we recommend that you do not use it unless you know what you are doing. Press OK to proceed with the purge operation? @@ -937,86 +947,86 @@ La commande de purge va détruire les enregistrements du catalogue associés (tr Cliquer OK pour réaliser la purge? - - - - - - - - + + + + + + + + Any Tous, mais peut-on le traduire ? - - + + Job Id Id du travail - - + + Job Name Nom - - + + Client Client - - + + Job Starttime Heure de début - - + + Job Type Type de travail - - + + Job Level Niveau - - + + Job Files Fichiers - - + + Job Bytes Octets - - + + Job Status État - - + + Purged Purgé - - + + File Set Jeu de fichiers - + Backup Sauvegarde .... mais peut-on le traduire ? @@ -1026,85 +1036,85 @@ Cliquer OK pour réaliser la purge? Restauration - + Pool Name Nom du Groupe - + First Volume Premier Volume - + VolCount nb de volumes - + Jobs Run on Volume %1 Exécutions sur le volume %1 - + Jobs Run from Client %1 Exécutions depuis le client %1 - + Jobs Run of Job %1 Exécutions du travail %1 - + Jobs Run with fileset %1 Exécutions avec le jeu de fichiers %1 - + Jobs Run Exécutions de travaux - + run job="%1" client="%2" level=%3 faut-il traduire les commandes envoyées à la console ? je ne crois pas. - + fileset="%1" faut-il traduire les commandes envoyées à la console ? je ne crois pas. - + Delete list of %1 Jobs Détruire %1 travaux - + Purge Files from list of %1 Jobs Purger les fichiers de %1 travaux - + Delete Single Job Détruire un travail - + Purge Files from single job Purger les fichiers d'un travail - + Running En cours ... mais faut-il le traduire ? - + Created, not yet running Créé, pas encore lancé ... mais faut-il le traduire ? @@ -1261,17 +1271,17 @@ Cliquer OK pour réaliser la purge? JobLog - + Bat Bat - + JobLog Traces du travail - + There were no results! It is possible you may need to add "catalog = all" to the Messages resource for this job. @@ -1280,12 +1290,12 @@ Il se pourrait que vous deviez ajouter "catalog = all" à la ressource - + Log records for job %1 Enregistrements de trace du travail %1 - + Error: Erreur : ... mais faut-il le traduire ? @@ -1302,160 +1312,160 @@ Il se pourrait que vous deviez ajouter "catalog = all" à la ressource JobPlot - + The Jobs query returned no results. Press OK to continue? La requête ne renvoie aucun travail. Cliquer OK pour continuer ? - + JobPlot - - + + Sticks - - + + Lines - - + + Steps - - - + + + None - - - - - - - + + + + + + + Any Tous - + Files and Bytes backed up - + <-- Bytes Kb - + date of backup --> - + Number of Files --> - + Files Fichiers - + Bytes Octets - + Fitted - + Ellipse - + Rect - + Diamond - + Triangle - + DTrianle - + UTriangle - + LTriangle - + RTriangle - + Cross - + XCross - + HLine - + Vline - + Star1 - + Star2 - + Hexagon @@ -1546,64 +1556,64 @@ Cliquer OK pour continuer ? Jobs - + Jobs Travaux - - + + Job Name Nom du travail - + Pool Groupe - + Messages Messages - + Client Client - + Storage Dépôt - + Where Où - + Level Niveau - - + + Type Type - + FileSet Jeu de fichiers - + Catalog Catalogue - + Enabled Activé @@ -1935,12 +1945,12 @@ Cliquer OK pour continuer ? MainWin - + Director not connected. Click on connect button. le Director n'est pas connecté. Cliquer le bouton de connexion. - + About bat À propos de bat @@ -1954,44 +1964,44 @@ Cliquer OK pour continuer ? Prêt - + Select Page Sélection d'onglet - + Console Console - + Director Status Etat du director - - <br><h2>Bat %1 (%2), by Dirk H Bartley and Kern Sibbald</h2><p>Copyright &copy; 2007-%3 Free Software Foundation Europe e.V.<p>Improved by Bacula Systems SA.<p>The <b>bat</b> is an administrative console interface to the Director. + + <br><h2>Bacula Bat %1 (%2)</h2><p>Copyright &copy; 2007-%3 Kern Sibbald<p>The <b>bat</b> is an administrative console interface to the Director. - <br><h2>bat %1 (%2), by Dirk H Bartley and Kern Sibbald</h2><p>Copyright &copy; 2007-%3 Free Software Foundation Europe e.V.<p>The <b>bat</b> is an administrative console interface to the Director. - <br><h2>bat %1 (%2), par Dirk H Bartley et Kern Sibbald</h2><p>Copyright &copy; 2007-%3 Free Software Foundation Europe e.V.<p><b>bat</b> est une console d'administration pour le "Director". + <br><h2>bat %1 (%2), by Dirk H Bartley and Kern Sibbald</h2><p>Copyright &copy; 2007-%3 Kern Sibbald<p>The <b>bat</b> is an administrative console interface to the Director. + <br><h2>bat %1 (%2), par Dirk H Bartley et Kern Sibbald</h2><p>Copyright &copy; 2007-%3 Kern Sibbald<p><b>bat</b> est une console d'administration pour le "Director". MediaEdit - + Media Edit Édition du support - + No Volume name Pas de nom de volume - + No Volume name given Pas de nom de Volume donné @@ -1999,12 +2009,12 @@ Cliquer OK pour continuer ? MediaInfo - + Media Info Informations du support - + Are you sure you want to purge ?? !!!. The Purge command will delete associated Catalog database records from Jobs and Volumes without considering the retention period. Purge works only on the Catalog database and does not affect data written to Volumes. This command can be dangerous because you can delete catalog records associated with current backups of files, and we recommend that you do not use it unless you know what you are doing. Press OK to proceed with the purge operation? @@ -2013,7 +2023,7 @@ La commande de purge va détruire les enregistrements du catalogue associés (tr Cliquer OK pour réaliser la purge? - + Are you sure you want to delete?? !!!. This delete command is used to delete a Volume record and all associated catalog records that were created. This command operates only on the Catalog database and has no effect on the actual data written to a Volume. This command can be dangerous and we strongly recommend that you do not use it unless you know what you are doing. All Jobs and all associated records (File and JobMedia) will be deleted from the catalog.Press OK to proceed with delete operation.? Êtes-vous sûr de vouloir détruire?? !!!. @@ -2023,14 +2033,14 @@ Cette commande est utilisée pour détruire un enregistrement "volume" MediaList - + Are you sure you want to delete?? !!!. This delete command is used to delete a Volume record and all associated catalog records that were created. This command operates only on the Catalog database and has no effect on the actual data written to a Volume. This command can be dangerous and we strongly recommend that you do not use it unless you know what you are doing. All Jobs and all associated records (File and JobMedia) will be deleted from the catalog.Press OK to proceed with delete operation.? Êtes-vous sûr de vouloir détruire?? !!!. Cette commande est utilisée pour détruire un enregistrement "volume" et tous les enregistrements associés du catalogue. Cette commande influe uniquement sur le catalogue et n'a pas d'effet sur les données écritessur un volume. Cette commande peut être dangereuse et nous vous recommandons fortement de ne pas l'utiliser, sauf si vous savez exactement ce que vous faites. Tous les travaux et autres enregistrements associés (fichiers et supports) seront détruits du catalogue. Cliquer OK pour réaliser la destruction ? - + Are you sure you want to purge ?? !!!. The Purge command will delete associated Catalog database records from Jobs and Volumes without considering the retention period. Purge works only on the Catalog database and does not affect data written to Volumes. This command can be dangerous because you can delete catalog records associated with current backups of files, and we recommend that you do not use it unless you know what you are doing. Press OK to proceed with the purge operation? @@ -2039,113 +2049,113 @@ La commande de purge va détruire les enregistrements du catalogue associés (tr Cliquer OK pour réaliser la purge? - + Volume Name Nom de volume - + Id - + Status État - + Enabled Activé - + Bytes Octets - + Files Fichiers - + Jobs Travaux - + Retention Rétention - + Media Type Type de support - + Slot Slot - + Use Duration Durée d'utilisation - + Max Jobs nb max de travaux - + Max Files nb max de fichiers - + Max Bytes nb max d'octets - + Recycle Recycler - + Last Written Dernière écriture - - + + Pools Groupes - + First Written Première écriture - + Read Time Temps de lecture - + Write Time Temps d'écriture - + Recycle Count Compteur de recyclage - + Recycle Pool Groupe de recyclage @@ -2222,12 +2232,12 @@ Cliquer OK pour réaliser la purge? MediaView - + Media Support - + Are you sure you want to purge ?? !!!. The Purge command will delete associated Catalog database records from Jobs and Volumes without considering the retention period. Purge works only on the Catalog database and does not affect data written to Volumes. This command can be dangerous because you can delete catalog records associated with current backups of files, and we recommend that you do not use it unless you know what you are doing. Press OK to proceed with the purge operation? @@ -2236,7 +2246,7 @@ La commande de purge va détruire les enregistrements du catalogue associés (tr Cliquer OK pour réaliser la purge ? - + Are you sure you want to delete?? !!!. This delete command is used to delete a Volume record and all associated catalog records that were created. This command operates only on the Catalog database and has no effect on the actual data written to a Volume. This command can be dangerous and we strongly recommend that you do not use it unless you know what you are doing. All Jobs and all associated records (File and JobMedia) will be deleted from the catalog.Press OK to proceed with delete operation.? Êtes-vous sûr de vouloir détruire?? !!!. @@ -2369,22 +2379,22 @@ Cette commande est utilisée pour détruire un enregistrement "volume" Pages - + %1 of Director %2 %1 du Director %2 - + UnDock %1 Window Déplacer %1 vers une nouvelle fenêtre - + ReDock %1 Window Remettre %1 en onglet - + Console Console @@ -2618,26 +2628,26 @@ Cette commande est utilisée pour détruire un enregistrement "volume" QObject - + Any Tous - - - + + + No Non - - - + + + Yes Oui - + Invalid job status %1 État de travail invalide : %1 @@ -2645,42 +2655,42 @@ Cette commande est utilisée pour détruire un enregistrement "volume" StorStat - + Storage Status %1 Etat du dépôt %1 - + Job Id Id du travail - + Job Level Niveau du Travail - + Job Files Fichiers - + Job Bytes Octets - + Job Status État - + Job Time Heure - + Job Name Nom @@ -2787,98 +2797,98 @@ p, li { white-space: pre-wrap; } Storage - - + + Storage Dépôt - + Name Nom - + Id Id - + Changer Changeur - + Slot Emplacement - + Status État - + Enabled Activé - + Pool Groupe - + Media Type Type de support - + Yes Oui - + Status Storage "%1" État du dépôt "%1" - + Status Storage "%1" in Window État du dépôt "%1" (dans une fenêtre) - + Label media in Storage "%1" Étiqueter le support dans le dépôt "%1" - + Mount media in Storage "%1" Monter le support dans le dépôt "%1" - + "UN" Mount media in Storage "%1" Démonter le support dans le dépôt "%1" - + Release media in Storage "%1" Libérer le support dans le dépôt "%1" - + Barcode Scan media in Storage "%1" Scanner le code-barre du support dans le dépôt "%1" - + Read scan media in Storage "%1" - + Storage Status %1 État du dépôt %1 @@ -2955,7 +2965,7 @@ p, li { white-space: pre-wrap; } bRestore - + bRestore b-Restauration @@ -3024,9 +3034,8 @@ p, li { white-space: pre-wrap; } Estimer - Restore - Restaurer + Restaurer @@ -3106,6 +3115,11 @@ p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Glisser et déplacer ici depuis <span style=" font-weight:600;">"Liste des fichiers"</span> et/ou depuis <span style=" font-weight:600;">"Versions de fichier"</span> les éléments à restaurer.</p></body></html> + + + Restore... + + Select from Client list drop down then select from Job list drop down @@ -3288,7 +3302,7 @@ regexp: estimatePage - + Estimate Estimer @@ -3896,22 +3910,22 @@ p, li { white-space: pre-wrap; } mountDialog - + Storage : %1 Dépôt : %1 - + No Storage name Pas de nom de dépôt - + No Storage name given Pas de nom de dépôt indiqué - + Context sensitive command : @@ -3920,7 +3934,7 @@ p, li { white-space: pre-wrap; } - + Director Response : @@ -4045,56 +4059,56 @@ p, li { white-space: pre-wrap; } prerestorePage - + Bat Bat - + There can be no spaces in the text for the joblist. Press OK to continue? Il ne peut pas y avoir d'espace dans la liste des travaux. Appuyer sur OK pour continuer ? - + At least one of the jobs is not a valid job of type "Backup". Press OK to continue? Il y a au moins un travail qui n'est pas du type "Backup" (Sauvegarde). Appuyer sur OK pour continuer ? - + All jobs in the list must be of the same jobName and same client. Press OK to continue? Tous les travaux de la liste doivent avoir le même nom et le même Client. Appuyer sur OK pour continuer ? - + Restore Restaurer - - - + + + Any Tous - - + + Comma separted list of Job Ids Liste de "id de travail" séparés par des virgules - + Canceled Annulé - + The string is not a comma separated list of integers. Press OK to continue? La chaine n'est pas une liste de nombres séparés par des virgules. @@ -4152,22 +4166,22 @@ Appuyer sur OK pour continuer ? prunePage - + Prune Élaguer (prune) - - - - - - + + + + + + Any Tous - + Canceled Annulé @@ -4175,23 +4189,23 @@ Appuyer sur OK pour continuer ? relabelDialog - + From Volume : Volume : - + No Volume name Pas de nom de volume - + No Volume name given Pas de nom de Volume donné - + New name must be different Le nouveau nom doit être différent @@ -4347,75 +4361,75 @@ p, li { white-space: pre-wrap; } restorePage - + Restore Select Sélection pour restauration - + Mark Sélectionner - + File Fichier - + Mode Mode - + User Propriétaire - + Group Groupe - + Size Taille - + Date Date - + In else of if parent cwd "%1" newdir "%2" Dans le "else" du "if parent" cwd "%1" newdir "%2" - + Canceled Annulé - + In addDirectory cwd "%1" newdir "%2" fullpath "%3" Dans "addDirectory" cwd "%1" newdir "%2" fullpath "%3" - + Nothing selected, nothing done Rien de sélectionné, rien de fait - + cd command failed la commande cd a échoué - + .pwd command failed la commande ".pwd" a échoué @@ -4423,7 +4437,7 @@ p, li { white-space: pre-wrap; } restoreTree - + Version Browser Navigateur temporel @@ -4435,10 +4449,10 @@ p, li { white-space: pre-wrap; } - - - - + + + + Any Tous @@ -4462,84 +4476,84 @@ p, li { white-space: pre-wrap; } Interrogation des travaux - + Querying for Directories Interrogation des dossiers - + Processing Directories Analyse des dossiers - + File Name Nom de fichier - + Filename Id Id du nom de fichier - - + + Job Id - - - + + + Type Type - - + + End Time Heure de fin - + Hash - + FileId FileId - + RestoreTreePage Onglet de l'arbre de restauration - + Level Niveau - + Name Nom - - + + Purged Purgé - - + + TU - - + + TD @@ -4551,59 +4565,59 @@ p, li { white-space: pre-wrap; } - + Task %1 of %2 Tâche %1 sur %2 - + No jobs were selected in the job query !!!. Press OK to continue La requête ne renvoie aucun travail !!! Cliquer OK pour continuer - + Present Working Directory: %1 Dossier de travail actuel : %1 - + Job Type Type de travail - + First Volume Premier volume - + Task 1 of 3 Tâche 1 sur 3 - + Processing Checked directories Traitement des dossiers - + Task 2 of 3 Tâche 2 sur 3 - + Processing Exceptions Traitement des exceptions - + Task 3 of 3 Tâche 3 sur 3 - + Filling Database Table Remplissage de la base de données @@ -4792,37 +4806,37 @@ Cliquer OK pour continuer runCmdPage - + Restore Run Restauration - - + + never jamais ... mais il faudrait retraduire dans okButtonPushed. never - + always toujours ... mais il faudrait retraduire dans okButtonPushed. always - + ifnewer si nouveau ... mais il faudrait retraduire dans okButtonPushed. si nouveau - + ifolder si plus vieux ... mais il faudrait retraduire dans okButtonPushed. si ancien - + Canceled Annulé @@ -4927,12 +4941,12 @@ Cliquer OK pour continuer runPage - + Run Lancer - + Canceled Annulé @@ -4940,7 +4954,7 @@ Cliquer OK pour continuer selectDialog - + Canceled Annulé @@ -4956,7 +4970,7 @@ Cliquer OK pour continuer textInputDialog - + Canceled Annulé @@ -4985,7 +4999,7 @@ Cliquer OK pour continuer yesnoPopUp - + Bat Question Bat Question diff --git a/bacula/src/qt-console/util/comboutil.cpp b/bacula/src/qt-console/util/comboutil.cpp index 1abc5c281c..cd78b93abc 100644 --- a/bacula/src/qt-console/util/comboutil.cpp +++ b/bacula/src/qt-console/util/comboutil.cpp @@ -1,22 +1,24 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2009 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * Version $Id$ - * * ComboBox helper functions * * Riccardo Ghetta, May 2008 @@ -99,30 +101,30 @@ void levelComboCond(QStringList &cndlist, const QComboBox *combo, const char *fl void jobStatusComboFill(QComboBox *combo) { static const char js[] = { - JS_Terminated, + JS_Terminated, JS_Created, - JS_Running, - JS_Blocked, - JS_ErrorTerminated, - JS_Error, - JS_FatalError, - JS_Differences, - JS_Canceled, - JS_WaitFD, - JS_WaitSD, - JS_WaitMedia, - JS_WaitMount, - JS_WaitStoreRes, - JS_WaitJobRes, - JS_WaitClientRes, - JS_WaitMaxJobs, - JS_WaitStartTime, - JS_WaitPriority, - JS_AttrDespooling, - JS_AttrInserting, - JS_DataDespooling, - JS_DataCommitting, - '\0'}; + JS_Running, + JS_Blocked, + JS_ErrorTerminated, + JS_Error, + JS_FatalError, + JS_Differences, + JS_Canceled, + JS_WaitFD, + JS_WaitSD, + JS_WaitMedia, + JS_WaitMount, + JS_WaitStoreRes, + JS_WaitJobRes, + JS_WaitClientRes, + JS_WaitMaxJobs, + JS_WaitStartTime, + JS_WaitPriority, + JS_AttrDespooling, + JS_AttrInserting, + JS_DataDespooling, + JS_DataCommitting, + '\0'}; int pos; diff --git a/bacula/src/qt-console/util/comboutil.h b/bacula/src/qt-console/util/comboutil.h index d440f82a8c..8933b4fea7 100644 --- a/bacula/src/qt-console/util/comboutil.h +++ b/bacula/src/qt-console/util/comboutil.h @@ -1,24 +1,26 @@ #ifndef _COMBOUTIL_H_ #define _COMBOUTIL_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * Version $Id$ - * - * Combobox helpers - Riccardo Ghetta, May 2008 + * Combobox helpers - Riccardo Ghetta, May 2008 */ class QComboBox; diff --git a/bacula/src/qt-console/util/fmtwidgetitem.cpp b/bacula/src/qt-console/util/fmtwidgetitem.cpp index dd0812902f..aebd1113db 100644 --- a/bacula/src/qt-console/util/fmtwidgetitem.cpp +++ b/bacula/src/qt-console/util/fmtwidgetitem.cpp @@ -1,26 +1,30 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2010 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + /* * * Helper functions for tree widget formatting * * Riccardo Ghetta, May 2008 * - */ + */ #include "bat.h" #include @@ -56,13 +60,13 @@ QString convertJobStatus(const QString &sts) Freeze::Freeze(QWidget &q): qw(&q) { - qw->setUpdatesEnabled(false); + qw->setUpdatesEnabled(false); } Freeze::~Freeze() { if (qw) { - qw->setUpdatesEnabled(true); + qw->setUpdatesEnabled(true); qw->update(); } } @@ -89,15 +93,15 @@ QString convertBytesIEC(qint64 qfld) smaller unit (e.g. GB for a TB number and so on) */ char suffix; if (qfld >= EB) { - qfld /= PB; + qfld /= PB; suffix = 'E'; } else if (qfld >= PB) { - qfld /= TB; + qfld /= TB; suffix = 'P'; } else if (qfld >= TB) { - qfld /= GB; + qfld /= GB; suffix = 'T'; } else if (qfld >= GB) { @@ -113,7 +117,7 @@ QString convertBytesIEC(qint64 qfld) } else { /* plain bytes, no need to reformat */ - return QString("%1 B").arg(qfld); + return QString("%1 B").arg(qfld); } /* having divided for a smaller unit, now we can safely convert to double and @@ -135,15 +139,15 @@ QString convertBytesSI(qint64 qfld) smaller unit (e.g. GB for a TB number and so on) */ char suffix; if (qfld >= EB) { - qfld /= PB; + qfld /= PB; suffix = 'E'; } else if (qfld >= PB) { - qfld /= TB; + qfld /= TB; suffix = 'P'; } else if (qfld >= TB) { - qfld /= GB; + qfld /= GB; suffix = 'T'; } else if (qfld >= GB) { @@ -159,7 +163,7 @@ QString convertBytesSI(qint64 qfld) } else { /* plain bytes, no need to reformat */ - return QString("%1 B").arg(qfld); + return QString("%1 B").arg(qfld); } /* having divided for a smaller unit, now we can safely convert to double and @@ -210,7 +214,7 @@ void ItemFormatterBase::setPercent(int index, float value) /* By default, the setPixmap implementation with tooltip don't implement * the tooltip stuff */ -void ItemFormatterBase::setPixmap(int index, const QPixmap &pix, +void ItemFormatterBase::setPixmap(int index, const QPixmap &pix, const QString & /* tip */) { setPixmap(index, pix); @@ -271,13 +275,13 @@ void ItemFormatterBase::setBoolFld(int index, int fld, bool center) void ItemFormatterBase::setNumericFld(int index, const QString &fld) { setRightFld(index, fld.trimmed()); - setSortValue(index, fld.toDouble()); + setSortValue(index, fld.toDouble() ); } void ItemFormatterBase::setNumericFld(int index, const QString &fld, const QVariant &sortval) { setRightFld(index, fld.trimmed()); - setSortValue(index, sortval); + setSortValue(index, sortval ); } void ItemFormatterBase::setBytesFld(int index, const QString &fld) @@ -375,7 +379,7 @@ void ItemFormatterBase::setJobStatusFld(int index, const QString &status, bool c setBackground(index, Qt::green); } else if (redchars.contains(st, Qt::CaseSensitive)) { setBackground(index, Qt::red); - } else if (yellowchars.contains(st, Qt::CaseSensitive)){ + } else if (yellowchars.contains(st, Qt::CaseSensitive)){ setBackground(index, Qt::yellow); } } @@ -455,7 +459,7 @@ void TableItemFormatter::BatSortingTableItem::setSortData(const QVariant &d) setData(SORTDATA_ROLE, d); } -bool TableItemFormatter::BatSortingTableItem::operator< ( const QTableWidgetItem & o ) const +bool TableItemFormatter::BatSortingTableItem::operator< ( const QTableWidgetItem & o ) const { QVariant my = data(SORTDATA_ROLE); QVariant other = o.data(SORTDATA_ROLE); @@ -464,11 +468,11 @@ bool TableItemFormatter::BatSortingTableItem::operator< ( const QTableWidgetItem /* 64bit integers must be handled separately, others can be converted to double */ if (QVariant::ULongLong == my.type()) { - return my.toULongLong() < other.toULongLong(); + return my.toULongLong() < other.toULongLong(); } else if (QVariant::LongLong == my.type()) { - return my.toLongLong() < other.toLongLong(); + return my.toLongLong() < other.toLongLong(); } else if (my.canConvert(QVariant::Double)) { - return my.toDouble() < other.toDouble(); + return my.toDouble() < other.toDouble(); } else { return QTableWidgetItem::operator< (o); /* invalid combination, revert to default sorting */ } @@ -496,7 +500,7 @@ void TableItemFormatter::setPixmap(int index, const QPixmap &pix) parent->setCellWidget(row, index, lbl); } -void TableItemFormatter::setPixmap(int index, const QPixmap &pix, +void TableItemFormatter::setPixmap(int index, const QPixmap &pix, const QString &tips) { // Centered, but not sortable ! diff --git a/bacula/src/qt-console/util/fmtwidgetitem.h b/bacula/src/qt-console/util/fmtwidgetitem.h index 05da32e60e..6dd5e12694 100644 --- a/bacula/src/qt-console/util/fmtwidgetitem.h +++ b/bacula/src/qt-console/util/fmtwidgetitem.h @@ -1,22 +1,26 @@ #ifndef _FMTWIDGETITEM_H_ #define _FMTWIDGETITEM_H_ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * TreeView formatting helpers - Riccardo Ghetta, May 2008 + * TreeView formatting helpers - Riccardo Ghetta, May 2008 */ class QWidget; @@ -68,7 +72,7 @@ public: }; public: - virtual ~ItemFormatterBase(); + virtual ~ItemFormatterBase(); /* Prints Yes if fld is != 0, No otherwise. Centers field if center true*/ void setBoolFld(int index, const QString &fld, bool center = true); @@ -98,19 +102,19 @@ public: /* fld value interpreted as volume status. Colored accordingly */ void setVolStatusFld(int index, const QString &fld, bool center = true); - + /* fld value interpreted as job status. Colored accordingly */ void setJobStatusFld(int index, const QString &status, bool center = true); - + /* fld value interpreted as job type. */ void setJobTypeFld(int index, const QString &fld, bool center = false); - + /* fld value interpreted as job level. */ void setJobLevelFld(int index, const QString &fld, bool center = false); /* fld value interpreted as Online/Offline */ void setInChanger(int index, const QString &InChanger); - + /* fld value interpreted as file or folder */ void setFileType(int index, const QString &type); @@ -174,14 +178,14 @@ class TableItemFormatter : public ItemFormatterBase { private: - /* specialized widget item - allows an optional data property for sorting */ + /* specialized widget item - allows an optional data property for sorting */ class BatSortingTableItem : public QTableWidgetItem { private: static const int SORTDATA_ROLE = Qt::UserRole + 100; public: BatSortingTableItem(); - + /* uses the sort data if available, reverts to default behavior othervise */ virtual bool operator< ( const QTableWidgetItem & o ) const; diff --git a/bacula/src/qt-console/win32/qmake.conf b/bacula/src/qt-console/win32/qmake.conf index 581668d0ac..7a4c04be25 100644 --- a/bacula/src/qt-console/win32/qmake.conf +++ b/bacula/src/qt-console/win32/qmake.conf @@ -14,12 +14,11 @@ QMAKE_COMPILER_DEFINES += __GNUC__ WIN32 QMAKE_EXT_OBJ = .o QMAKE_EXT_RES = _res.o -QMAKE_CC = $(DEPKGS)/cross-tools/mingw32/bin/mingw32-gcc QMAKE_LEX = flex QMAKE_LEXFLAGS = QMAKE_YACC = byacc QMAKE_YACCFLAGS = -d -QMAKE_CFLAGS = -DHAVE_MINGW -DHAVE_WIN32 +QMAKE_CFLAGS = -DHAVE_MINGW -DHAVE_WIN32 -DHAVE_MINGW_W64 QMAKE_CFLAGS_DEPS = -M QMAKE_CFLAGS_WARN_ON = -Wall QMAKE_CFLAGS_WARN_OFF = -w @@ -27,8 +26,7 @@ QMAKE_CFLAGS_RELEASE = -O2 QMAKE_CFLAGS_DEBUG = -g -O2 QMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses -QMAKE_CXX = $(DEPKGS)/cross-tools/mingw32/bin/mingw32-g++ -QMAKE_CXXFLAGS = $$QMAKE_CFLAGS -DHAVE_MINGW -DHAVE_WIN32 -DHAVE_ZLIB_H -DHAVE_LIBZ -DHAVE_CRYPTO -DHAVE_OPENSSL -DHAVE_TLS +QMAKE_CXXFLAGS = $$QMAKE_CFLAGS -DHAVE_MINGW -DHAVE_WIN32 -DHAVE_ZLIB_H -DHAVE_LIBZ -DHAVE_CRYPTO -DHAVE_OPENSSL -DHAVE_TLS -DHAVE_MINGW_W64 QMAKE_CXXFLAGS_DEPS = $$QMAKE_CFLAGS_DEPS QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF @@ -45,13 +43,13 @@ QMAKE_INCDIR = $(DEPKGS)/depkgs-mingw32/include/pthreads $(DEPKGS)/de QMAKE_INCDIR_QT = $(DEPKGS)/depkgs-mingw32/include/qt QMAKE_LIBDIR_QT = $(DEPKGS)/depkgs-mingw32/lib/qt -QMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src -QMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $< +QMAKE_RUN_CC = $(CXX) -c $(CFLAGS) $(INCPATH) -o $obj $src +QMAKE_RUN_CC_IMP = $(CXX) -c $(CFLAGS) $(INCPATH) -o $@ $< QMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src QMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< -QMAKE_LINK = $(DEPKGS)/cross-tools/mingw32/bin/mingw32-g++ -QMAKE_LFLAGS = -mthreads -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -mno-cygwin -m32 -fno-strict-aliasing -Wl,-enable-runtime-pseudo-reloc +QMAKE_LINK = i686-w64-mingw32-g++ +QMAKE_LFLAGS = -mthreads -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -m32 -fno-strict-aliasing -Wl,-enable-runtime-pseudo-reloc QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads -Wl QMAKE_LFLAGS_EXCEPTIONS_OFF = @@ -64,7 +62,7 @@ QMAKE_LINK_OBJECT_MAX = 10 QMAKE_LINK_OBJECT_SCRIPT= object_script -QMAKE_LIBS = -lwsock32 +QMAKE_LIBS = -lwsock32 -lstdc++ QMAKE_LIBS_CORE = -lkernel32 -luser32 -lshell32 -luuid -lole32 -ladvapi32 -lws2_32 QMAKE_LIBS_GUI = -lgdi32 -lcomdlg32 -loleaut32 -limm32 -lwinmm -lwinspool -lws2_32 -lole32 -luuid -luser32 -ladvapi32 QMAKE_LIBS_NETWORK = -lws2_32 @@ -88,10 +86,8 @@ QMAKE_UIC = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}uic QMAKE_IDC = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}idc QMAKE_IDL = midl -QMAKE_LIB = $(DEPKGS)/cross-tools/mingw32/bin/mingw32-ar -ru -QMAKE_RC = $(DEPKGS)/cross-tools/mingw32/bin/mingw32-windres QMAKE_ZIP = zip -r -9 -QMAKE_STRIP = $(DEPKGS)/cross-tools/mingw32/bin/mingw32-strip +QMAKE_STRIP = i686-w64-mingw32-strip QMAKE_STRIPFLAGS_LIB += --strip-unneeded load(qt_config) diff --git a/bacula/src/qt-console/win32/qplatformdefs.h b/bacula/src/qt-console/win32/qplatformdefs.h index b01b8a62b4..4802c2b623 100644 --- a/bacula/src/qt-console/win32/qplatformdefs.h +++ b/bacula/src/qt-console/win32/qplatformdefs.h @@ -49,6 +49,7 @@ #include "qglobal.h" +#include "winhdrs.h" #include #include #include @@ -57,77 +58,76 @@ #include #include #include -#include #include #if !defined(_WIN32_WINNT) || (_WIN32_WINNT-0 < 0x0500) typedef enum { - NameUnknown = 0, + NameUnknown = 0, NameFullyQualifiedDN = 1, - NameSamCompatible = 2, - NameDisplay = 3, - NameUniqueId = 6, - NameCanonical = 7, - NameUserPrincipal = 8, - NameCanonicalEx = 9, + NameSamCompatible = 2, + NameDisplay = 3, + NameUniqueId = 6, + NameCanonical = 7, + NameUserPrincipal = 8, + NameCanonicalEx = 9, NameServicePrincipal = 10, - NameDnsDomain = 12 + NameDnsDomain = 12 } EXTENDED_NAME_FORMAT, *PEXTENDED_NAME_FORMAT; #endif #define Q_FS_FAT #ifdef QT_LARGEFILE_SUPPORT -#define QT_STATBUF struct _stati64 // non-ANSI defs -#define QT_STATBUF4TSTAT struct _stati64 // non-ANSI defs -#define QT_STAT ::_stati64 -#define QT_FSTAT ::_fstati64 +#define QT_STATBUF struct _stati64 // non-ANSI defs +#define QT_STATBUF4TSTAT struct _stati64 // non-ANSI defs +#define QT_STAT ::_stati64 +#define QT_FSTAT ::_fstati64 #else -#define QT_STATBUF struct _stat // non-ANSI defs -#define QT_STATBUF4TSTAT struct _stat // non-ANSI defs -#define QT_STAT ::_stat -#define QT_FSTAT ::_fstat +#define QT_STATBUF struct _stat // non-ANSI defs +#define QT_STATBUF4TSTAT struct _stat // non-ANSI defs +#define QT_STAT ::_stat +#define QT_FSTAT ::_fstat #endif -#define QT_STAT_REG _S_IFREG -#define QT_STAT_DIR _S_IFDIR -#define QT_STAT_MASK _S_IFMT +#define QT_STAT_REG _S_IFREG +#define QT_STAT_DIR _S_IFDIR +#define QT_STAT_MASK _S_IFMT #if defined(_S_IFLNK) -# define QT_STAT_LNK _S_IFLNK +# define QT_STAT_LNK _S_IFLNK #endif -#define QT_FILENO _fileno -#define QT_OPEN ::_open -#define QT_CLOSE ::_close +#define QT_FILENO _fileno +#define QT_OPEN ::_open +#define QT_CLOSE ::_close #ifdef QT_LARGEFILE_SUPPORT -#define QT_LSEEK ::_lseeki64 +#define QT_LSEEK ::_lseeki64 #ifndef UNICODE -#define QT_TSTAT ::_stati64 +#define QT_TSTAT ::_stati64 #else -#define QT_TSTAT ::_wstati64 +#define QT_TSTAT ::_wstati64 #endif #else -#define QT_LSEEK ::_lseek +#define QT_LSEEK ::_lseek #ifndef UNICODE -#define QT_TSTAT ::_stat +#define QT_TSTAT ::_stat #else -#define QT_TSTAT ::_wstat +#define QT_TSTAT ::_wstat #endif #endif -#define QT_READ ::_read -#define QT_WRITE ::_write -#define QT_ACCESS ::_access -#define QT_GETCWD ::_getcwd -#define QT_CHDIR ::_chdir -#define QT_MKDIR ::_mkdir -#define QT_RMDIR ::_rmdir +#define QT_READ ::_read +#define QT_WRITE ::_write +#define QT_ACCESS ::_access +#define QT_GETCWD ::_getcwd +#define QT_CHDIR ::_chdir +#define QT_MKDIR ::_mkdir +#define QT_RMDIR ::_rmdir #define QT_OPEN_LARGEFILE 0 -#define QT_OPEN_RDONLY _O_RDONLY -#define QT_OPEN_WRONLY _O_WRONLY -#define QT_OPEN_RDWR _O_RDWR -#define QT_OPEN_CREAT _O_CREAT -#define QT_OPEN_TRUNC _O_TRUNC -#define QT_OPEN_APPEND _O_APPEND +#define QT_OPEN_RDONLY _O_RDONLY +#define QT_OPEN_WRONLY _O_WRONLY +#define QT_OPEN_RDWR _O_RDWR +#define QT_OPEN_CREAT _O_CREAT +#define QT_OPEN_TRUNC _O_TRUNC +#define QT_OPEN_APPEND _O_APPEND #if defined(O_TEXT) -# define QT_OPEN_TEXT _O_TEXT -# define QT_OPEN_BINARY _O_BINARY +# define QT_OPEN_TEXT _O_TEXT +# define QT_OPEN_BINARY _O_BINARY #endif #define QT_FOPEN ::fopen @@ -147,15 +147,15 @@ typedef enum { #define QT_OFF_T long #endif -#define QT_SIGNAL_ARGS int +#define QT_SIGNAL_ARGS int -#define QT_VSNPRINTF ::_vsnprintf -#define QT_SNPRINTF ::_snprintf +#define QT_VSNPRINTF ::_vsnprintf +#define QT_SNPRINTF ::_snprintf -# define F_OK 0 -# define X_OK 1 -# define W_OK 2 -# define R_OK 4 +# define F_OK 0 +# define X_OK 1 +# define W_OK 2 +# define R_OK 4 #endif // QPLATFORMDEFS_H diff --git a/bacula/src/stored/Makefile.in b/bacula/src/stored/Makefile.in index 1d712895f5..9a84b4c22d 100644 --- a/bacula/src/stored/Makefile.in +++ b/bacula/src/stored/Makefile.in @@ -1,6 +1,6 @@ # -# Author: Kern Sibbald -# License: LGPLv3 +# Copyright (C) 2000-2015 by Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # @MCOMMON@ @@ -32,6 +32,7 @@ SDOBJS = stored.o ansi_label.o vtape_dev.o \ askdir.o authenticate.o \ block.o block_util.o butil.o dev.o os.o file_dev.o tape_dev.o \ device.o dircmd.o ebcdic.o fd_cmds.o job.o \ + hello.o \ label.o lock.o match_bsr.o mount.o parse_bsr.o \ read.o read_records.o \ record_read.o record_write.o record_util.o \ diff --git a/bacula/src/stored/acquire.c b/bacula/src/stored/acquire.c index a64b14da63..b6faaf11c3 100644 --- a/bacula/src/stored/acquire.c +++ b/bacula/src/stored/acquire.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Routines to acquire and release a device for read/write @@ -34,8 +38,8 @@ static void set_dcr_from_vol(DCR *dcr, VOL_LIST *vol); * reserve_device_for_read(). We read the Volume label from the block and * leave the block pointers just after the label. * - * Returns: NULL if failed for any reason - * dcr if successful + * Returns: false if failed for any reason + * true if successful */ bool acquire_device_for_read(DCR *dcr) { @@ -193,7 +197,7 @@ bool acquire_device_for_read(DCR *dcr) dev->is_labeled(); // tape_initially_mounted = tape_previously_mounted; - /* Volume info is always needed because of VolParts */ + /* Volume info is always needed because of VolType */ Dmsg1(rdbglvl, "dir_get_volume_info vol=%s\n", dcr->VolumeName); if (!dir_get_volume_info(dcr, GET_VOL_INFO_FOR_READ)) { Dmsg2(rdbglvl, "dir_get_vol_info failed for vol=%s: %s\n", @@ -304,7 +308,7 @@ default_path: goto get_out; /* error return */ } - /* Volume info is always needed because of VolParts */ + /* Volume info is always needed because of VolType */ Dmsg1(150, "dir_get_volume_info vol=%s\n", dcr->VolumeName); if (!dir_get_volume_info(dcr, GET_VOL_INFO_FOR_READ)) { Dmsg2(150, "dir_get_vol_info failed for vol=%s: %s\n", @@ -550,7 +554,9 @@ bool release_device(DCR *dcr) /* If no writers, close if file or !CAP_ALWAYS_OPEN */ if (dev->num_writers == 0 && (!dev->is_tape() || !dev->has_cap(CAP_ALWAYSOPEN))) { generate_plugin_event(jcr, bsdEventDeviceClose, dcr); - dev->close(); + if (!dev->close()) { + Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg); + } free_volume(dev); } unlock_volumes(); @@ -653,6 +659,7 @@ DCR *new_dcr(JCR *jcr, DCR *dcr, DEVICE *dev, bool writing) if (dev) { dcr->free_blocks(); dcr->block = new_block(dev); + dcr->ameta_block = dcr->block; if (dcr->rec) { free_record(dcr->rec); } @@ -742,6 +749,12 @@ void DEVICE::detach_dcr_from_dev(DCR *dcr) attached_dcrs->remove(dcr); /* detach dcr from device */ } } + /* Check if someone accidentally left a drive reserved, and clear it */ + if (attached_dcrs->size() == 0 && num_reserved() > 0) { + Pmsg2(000, "Warning!!! dcrs=0 reserved=%d setting reserved==0. dev=%s\n", + num_reserved(), print_name()); + m_num_reserved = 0; + } dcr->attached_to_dev = false; Unlock_dcrs(); Unlock(); diff --git a/bacula/src/stored/ansi_label.c b/bacula/src/stored/ansi_label.c index 31a74e7a1d..516c925e7a 100644 --- a/bacula/src/stored/ansi_label.c +++ b/bacula/src/stored/ansi_label.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2005-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * diff --git a/bacula/src/stored/append.c b/bacula/src/stored/append.c index fa3946fcd6..973476a4ab 100644 --- a/bacula/src/stored/append.c +++ b/bacula/src/stored/append.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Append code for Storage daemon @@ -27,6 +31,28 @@ static char OK_data[] = "3000 OK data\n"; static char OK_append[] = "3000 OK append data\n"; +/* Forward referenced functions */ + + +/* + * Check if we can mark this job incomplete + * + */ +void possible_incomplete_job(JCR *jcr, int32_t last_file_index) +{ + /* + * Note, here we decide if it is worthwhile to restart + * the Job at this point. For the moment, if at least + * 10 Files have been seen. + * We must be sure that the saved files are safe. + * Using this function when their is as comm line problem is probably safe, + * it is inappropriate to use it for a any failure that could + * involve corrupted data. + */ + if (jcr->spool_attributes && last_file_index > 10) { + jcr->setJobStatus(JS_Incomplete); + } +} /* * Append Data sent from Client (FD/SD) * @@ -43,7 +69,8 @@ bool do_append_data(JCR *jcr) DCR *dcr = jcr->dcr; DEVICE *dev; char ec[50]; - + POOLMEM *eblock = NULL; + POOL_MEM errmsg(PM_EMSG); if (!dcr) { pm_strcpy(jcr->errmsg, _("DCR is NULL!!!\n")); @@ -98,6 +125,7 @@ bool do_append_data(JCR *jcr) jcr->setJobStatus(JS_ErrorTerminated); ok = false; } + //ASSERT(dev->VolCatInfo.VolCatName[0]); if (dev->VolCatInfo.VolCatName[0] == 0) { Pmsg0(000, _("NULL Volume name. This shouldn't happen!!!\n")); @@ -118,7 +146,7 @@ bool do_append_data(JCR *jcr) * - Multiple records of data * - EOD record * - * The Stream header is just used to sychronize things, and + * The Stream header is just used to synchronize things, and * none of the stream header is written to tape. * The Multiple records of data, contain first the Attributes, * then after another stream header, the file data, then @@ -130,6 +158,12 @@ bool do_append_data(JCR *jcr) */ dcr->VolFirstIndex = dcr->VolLastIndex = 0; jcr->run_time = time(NULL); /* start counting time for rates */ + + GetMsg *qfd; + + qfd = New(GetMsg(jcr, fd, NULL, GETMSG_MAX_MSG_SIZE)); + qfd->start_read_sock(); + for (last_file_index = 0; ok && !jcr->is_job_canceled(); ) { /* Read Stream header from the File daemon. @@ -140,20 +174,26 @@ bool do_append_data(JCR *jcr) * will be the size backed up if the file does not * grow during the backup. */ - if ((n=bget_msg(fd)) <= 0) { - if (n == BNET_SIGNAL && fd->msglen == BNET_EOD) { + n = qfd->bget_msg(NULL); + if (n <= 0) { + if (n == BNET_SIGNAL && qfd->msglen == BNET_EOD) { Dmsg0(200, "Got EOD on reading header.\n"); break; /* end of data */ } Jmsg3(jcr, M_FATAL, 0, _("Error reading data header from FD. n=%d msglen=%d ERR=%s\n"), - n, fd->msglen, fd->bstrerror()); + n, qfd->msglen, fd->bstrerror()); + // ASX TODO the fd->bstrerror() can be related to the wrong error, I should Queue the error too + possible_incomplete_job(jcr, last_file_index); ok = false; break; } - if (sscanf(fd->msg, "%ld %ld %lld", &file_index, &stream, &stream_len) != 3) { - Jmsg1(jcr, M_FATAL, 0, _("Malformed data header from FD: %s\n"), fd->msg); + if (sscanf(qfd->msg, "%ld %ld %lld", &file_index, &stream, &stream_len) != 3) { + // TODO ASX already done in bufmsg, should reuse the values + char buf[256]; + Jmsg1(jcr, M_FATAL, 0, _("Malformed data header from FD: %s\n"), asciidump(qfd->msg, qfd->msglen, buf, sizeof(buf))); ok = false; + possible_incomplete_job(jcr, last_file_index); break; } @@ -162,6 +202,8 @@ bool do_append_data(JCR *jcr) /* * We make sure the file_index is advancing sequentially. + * An incomplete job can start the file_index at any number. + * otherwise, it must start at 1. */ if (jcr->rerunning && file_index > 0 && last_file_index == 0) { goto fi_checked; @@ -173,6 +215,7 @@ bool do_append_data(JCR *jcr) } Jmsg2(jcr, M_FATAL, 0, _("FI=%d from FD not positive or last_FI=%d\n"), file_index, last_file_index); + possible_incomplete_job(jcr, last_file_index); ok = false; break; @@ -185,21 +228,21 @@ fi_checked: /* Read data stream from the File daemon. * The data stream is just raw bytes */ - while ((n=bget_msg(fd)) > 0 && !jcr->is_job_canceled()) { + while ((n=qfd->bget_msg(NULL)) > 0 && !jcr->is_job_canceled()) { + rec.VolSessionId = jcr->VolSessionId; rec.VolSessionTime = jcr->VolSessionTime; rec.FileIndex = file_index; rec.Stream = stream; rec.StreamLen = stream_len; rec.maskedStream = stream & STREAMMASK_TYPE; /* strip high bits */ - rec.data_len = fd->msglen; - rec.data = fd->msg; /* use message buffer */ + rec.data_len = qfd->msglen; + rec.data = qfd->msg; /* use message buffer */ Dmsg4(850, "before writ_rec FI=%d SessId=%d Strm=%s len=%d\n", rec.FileIndex, rec.VolSessionId, stream_to_ascii(buf1, rec.Stream,rec.FileIndex), rec.data_len); - ok = dcr->write_record(&rec); if (!ok) { Dmsg2(90, "Got write_block_to_dev error on device %s. %s\n", @@ -207,6 +250,7 @@ fi_checked: break; } jcr->JobBytes += rec.data_len; /* increment bytes this job */ + jcr->JobBytes += qfd->bmsg->jobbytes; // if the block as been downloaded, count it Dmsg4(850, "write_record FI=%s SessId=%d Strm=%s len=%d\n", FI_to_ascii(buf1, rec.FileIndex), rec.VolSessionId, stream_to_ascii(buf2, rec.Stream, rec.FileIndex), rec.data_len); @@ -221,12 +265,20 @@ fi_checked: Dmsg1(350, "Network read error from FD. ERR=%s\n", fd->bstrerror()); Jmsg1(jcr, M_FATAL, 0, _("Network error reading from FD. ERR=%s\n"), fd->bstrerror()); + possible_incomplete_job(jcr, last_file_index); } ok = false; break; } } + qfd->wait_read_sock(); + free_GetMsg(qfd); + + if (eblock != NULL) { + free_pool_memory(eblock); + } + /* Create Job status for end of session label */ jcr->setJobStatus(ok?JS_Terminated:JS_ErrorTerminated); @@ -250,24 +302,26 @@ fi_checked: if (ok && !jcr->is_job_canceled()) { Jmsg1(jcr, M_FATAL, 0, _("Error writing end session label. ERR=%s\n"), dev->bstrerror()); + possible_incomplete_job(jcr, last_file_index); } jcr->setJobStatus(JS_ErrorTerminated); ok = false; } /* Flush out final partial block of this session */ - if (!dcr->write_block_to_device()) { + if (!dcr->write_final_block_to_device()) { /* Print only if ok and not cancelled to avoid spurious messages */ if (ok && !jcr->is_job_canceled()) { Jmsg2(jcr, M_FATAL, 0, _("Fatal append error on device %s: ERR=%s\n"), dev->print_name(), dev->bstrerror()); - Dmsg0(100, _("Set ok=FALSE after write_block_to_device.\n")); + Dmsg0(100, _("Set ok=FALSE after write_final_block_to_device.\n")); + possible_incomplete_job(jcr, last_file_index); } jcr->setJobStatus(JS_ErrorTerminated); ok = false; } } - - if (!ok) { + flush_jobmedia_queue(jcr); + if (!ok && !jcr->is_JobStatus(JS_Incomplete)) { discard_data_spool(dcr); } else { /* Note: if commit is OK, the device will remain blocked */ @@ -294,7 +348,7 @@ fi_checked: */ release_device(dcr); - if (!ok || jcr->is_job_canceled()) { + if ((!ok || jcr->is_job_canceled()) && !jcr->is_JobStatus(JS_Incomplete)) { discard_attribute_spool(jcr); } else { commit_attribute_spool(jcr); diff --git a/bacula/src/stored/askdir.c b/bacula/src/stored/askdir.c index f31a30f471..a3cb80e613 100644 --- a/bacula/src/stored/askdir.c +++ b/bacula/src/stored/askdir.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Subroutines to handle Catalog reqests sent to the Director @@ -27,26 +31,26 @@ static const int dbglvl = 200; /* Requests sent to the Director */ -static char Find_media[] = "CatReq Job=%s FindMedia=%d pool_name=%s media_type=%s\n"; +static char Find_media[] = "CatReq Job=%s FindMedia=%d pool_name=%s media_type=%s vol_type=%d\n"; static char Get_Vol_Info[] = "CatReq Job=%s GetVolInfo VolName=%s write=%d\n"; static char Update_media[] = "CatReq Job=%s UpdateMedia VolName=%s" - " VolJobs=%u VolFiles=%u VolBlocks=%u VolBytes=%s VolMounts=%u" + " VolJobs=%u VolFiles=%u VolBlocks=%u VolBytes=%s VolABytes=%s" + " VolHoleBytes=%s VolHoles=%u VolMounts=%u" " VolErrors=%u VolWrites=%u MaxVolBytes=%s EndTime=%s VolStatus=%s" " Slot=%d relabel=%d InChanger=%d VolReadTime=%s VolWriteTime=%s" - " VolFirstWritten=%s VolParts=%u\n"; -static char Create_job_media[] = "CatReq Job=%s CreateJobMedia" - " FirstIndex=%u LastIndex=%u StartFile=%u EndFile=%u" - " StartBlock=%u EndBlock=%u Copy=%d Strip=%d MediaId=%s\n"; + " VolFirstWritten=%s VolType=%u\n"; +static char Create_jobmedia[] = "CatReq Job=%s CreateJobMedia\n"; static char FileAttributes[] = "UpdCat Job=%s FileAttributes "; /* Responses received from the Director */ static char OK_media[] = "1000 OK VolName=%127s VolJobs=%u VolFiles=%lu" - " VolBlocks=%lu VolBytes=%lld VolMounts=%lu" + " VolBlocks=%lu VolBytes=%lld VolABytes=%lld" + " VolHoleBytes=%lld VolHoles=%lu VolMounts=%lu" " VolErrors=%lu VolWrites=%lu" " MaxVolBytes=%lld VolCapacityBytes=%lld VolStatus=%20s" " Slot=%ld MaxVolJobs=%lu MaxVolFiles=%lu InChanger=%ld" " VolReadTime=%lld VolWriteTime=%lld EndFile=%lu EndBlock=%lu" - " VolParts=%lu LabelType=%ld MediaId=%lld ScratchPoolId=%lld\n"; + " VolType=%lu LabelType=%ld MediaId=%lld ScratchPoolId=%lld\n"; static char OK_create[] = "1000 OK CreateJobMedia\n"; @@ -60,6 +64,7 @@ static char Device_update[] = "DevUpd Job=%s device=%s " "open=%d labeled=%d offline=%d " "reserved=%d max_writers=%d " "autoselect=%d autochanger=%d " + "enabled=%d " "changer_name=%s media_type=%s volume_name=%s\n"; @@ -96,6 +101,7 @@ bool dir_update_device(JCR *jcr, DEVICE *dev) dev->is_offline()!=0, dev->reserved_device, dev->is_tape()?100000:1, dev->autoselect, 0, + dev->enabled, ChangerName.c_str(), MediaType.c_str(), VolumeName.c_str()); Dmsg1(dbglvl, ">dird: %s\n", dir->msg); return ok; @@ -121,6 +127,7 @@ bool dir_update_changer(JCR *jcr, AUTOCHANGER *changer) 0, 0, 0, /* is_open, is_labeled, offline */ 0, 0, /* reserved, max_writers */ 0, /* Autoselect */ + 0, /* Enabled */ changer->device->size(), /* Number of devices */ "0", /* PoolId */ "*", /* ChangerName */ @@ -173,14 +180,15 @@ static bool do_get_volume_info(DCR *dcr) n = sscanf(dir->msg, OK_media, vol.VolCatName, &vol.VolCatJobs, &vol.VolCatFiles, &vol.VolCatBlocks, &vol.VolCatAmetaBytes, - &vol.VolCatMounts, &vol.VolCatErrors, + &vol.VolCatAdataBytes, &vol.VolCatHoleBytes, + &vol.VolCatHoles, &vol.VolCatMounts, &vol.VolCatErrors, &vol.VolCatWrites, &vol.VolCatMaxBytes, &vol.VolCatCapacityBytes, vol.VolCatStatus, &vol.Slot, &vol.VolCatMaxJobs, &vol.VolCatMaxFiles, &InChanger, &vol.VolReadTime, &vol.VolWriteTime, - &vol.EndFile, &vol.EndBlock, &vol.VolCatParts, + &vol.EndFile, &vol.EndBlock, &vol.VolCatType, &vol.LabelType, &vol.VolMediaId, &vol.VolScratchPoolId); - if (n != 23) { + if (n != 26) { Dmsg1(dbglvl, "get_volume_info failed: ERR=%s", dir->msg); /* * Note, we can get an error here either because there is @@ -201,7 +209,8 @@ static bool do_get_volume_info(DCR *dcr) Dmsg2(dbglvl, "do_reqest_vol_info return true slot=%d Volume=%s\n", vol.Slot, vol.VolCatName); Dmsg3(dbglvl, "Dir returned VolCatAmetaBytes=%lld Status=%s Vol=%s\n", - vol.VolCatAmetaBytes, vol.VolCatStatus, vol.VolCatName); + vol.VolCatAmetaBytes, + vol.VolCatStatus, vol.VolCatName); return true; } @@ -270,7 +279,8 @@ bool dir_find_next_appendable_volume(DCR *dcr) for (int vol_index=1; vol_index < 30; vol_index++) { bash_spaces(dcr->media_type); bash_spaces(dcr->pool_name); - dir->fsend(Find_media, jcr->Job, vol_index, dcr->pool_name, dcr->media_type); + dir->fsend(Find_media, jcr->Job, vol_index, dcr->pool_name, dcr->media_type, + dcr->dev->dev_type); unbash_spaces(dcr->media_type); unbash_spaces(dcr->pool_name); Dmsg1(dbglvl, ">dird %s", dir->msg); @@ -282,6 +292,15 @@ bool dir_find_next_appendable_volume(DCR *dcr) Dmsg1(dbglvl, "Got same vol = %s\n", lastVolume); break; } + /* + * If we have VolType and we are disk or ameta, the VolType must match + */ + if (dcr->VolCatInfo.VolCatType != 0 && + (dcr->dev->dev_type == B_FILE_DEV) && + dcr->dev->dev_type != (int)dcr->VolCatInfo.VolCatType) { + Dmsg2(000, "Skip vol. Wanted VolType=%d Got=%d\n", dcr->dev->dev_type, dcr->VolCatInfo.VolCatType); + continue; + } bstrncpy(lastVolume, dcr->VolumeName, sizeof(lastVolume)); if (dcr->can_i_write_volume()) { Dmsg1(dbglvl, "Call reserve_volume for write. Vol=%s\n", dcr->VolumeName); @@ -338,9 +357,9 @@ bool dir_update_volume_info(DCR *dcr, bool label, bool update_LastWritten) { JCR *jcr = dcr->jcr; BSOCK *dir = jcr->dir_bsock; - DEVICE *dev = dcr->dev; + DEVICE *dev = dcr->ameta_dev; VOLUME_CAT_INFO *vol; - char ed1[50], ed4[50], ed5[50], ed6[50], ed7[50], ed8[50]; + char ed1[50], ed2[50], ed3[50], ed4[50], ed5[50], ed6[50], ed7[50], ed8[50]; int InChanger; bool ok = false; POOL_MEM VolumeName; @@ -360,6 +379,8 @@ bool dir_update_volume_info(DCR *dcr, bool label, bool update_LastWritten) /* Lock during Volume update */ P(vol_info_mutex); dev->Lock_VolCatInfo(); + Dmsg3(100, "Update cat VolBytes=%lld Status=%s Vol=%s\n", + vol->VolCatAmetaBytes, vol->VolCatStatus, vol->VolCatName); /* Just labeled or relabeled the tape */ if (label) { dev->setVolCatStatus("Append"); @@ -370,10 +391,18 @@ bool dir_update_volume_info(DCR *dcr, bool label, bool update_LastWritten) pm_strcpy(VolumeName, vol->VolCatName); bash_spaces(VolumeName); InChanger = vol->InChanger; + vol->VolCatHoleBytes = 0; + + /* Set device type where this Volume used */ + if (vol->VolCatType == 0) { + vol->VolCatType = dev->dev_type; + } dir->fsend(Update_media, jcr->Job, VolumeName.c_str(), vol->VolCatJobs, vol->VolCatFiles, vol->VolCatBlocks, edit_uint64(vol->VolCatAmetaBytes, ed1), - vol->VolCatMounts, vol->VolCatErrors, + edit_uint64(vol->VolCatAdataBytes, ed2), + edit_uint64(vol->VolCatHoleBytes, ed3), + vol->VolCatHoles, vol->VolCatMounts, vol->VolCatErrors, vol->VolCatWrites, edit_uint64(vol->VolCatMaxBytes, ed4), edit_uint64(vol->VolLastWritten, ed5), vol->VolCatStatus, vol->Slot, label, @@ -381,7 +410,7 @@ bool dir_update_volume_info(DCR *dcr, bool label, bool update_LastWritten) edit_int64(vol->VolReadTime, ed6), edit_int64(vol->VolWriteTime, ed7), edit_uint64(vol->VolFirstWritten, ed8), - vol->VolCatParts); + vol->VolCatType); Dmsg1(100, ">dird %s", dir->msg); /* Do not lock device here because it may be locked from label */ @@ -399,7 +428,13 @@ bool dir_update_volume_info(DCR *dcr, bool label, bool update_LastWritten) } Dmsg1(100, "get_volume_info() %s", dir->msg); /* Update dev Volume info in case something changed (e.g. expired) */ + dcr->VolCatInfo.VolCatAdataBytes = dev->VolCatInfo.VolCatAdataBytes; dcr->VolCatInfo.VolCatAmetaBytes = dev->VolCatInfo.VolCatAmetaBytes; + dcr->VolCatInfo.VolCatHoleBytes = dev->VolCatInfo.VolCatHoleBytes; + dcr->VolCatInfo.VolCatHoles = dev->VolCatInfo.VolCatHoles; + dcr->VolCatInfo.VolCatPadding = dev->VolCatInfo.VolCatPadding; + dcr->VolCatInfo.VolCatAmetaPadding = dev->VolCatInfo.VolCatAmetaPadding; + dcr->VolCatInfo.VolCatAdataPadding = dev->VolCatInfo.VolCatAdataPadding; dcr->VolCatInfo.VolCatFiles = dev->VolCatInfo.VolCatFiles; bstrncpy(vol->VolCatStatus, dcr->VolCatInfo.VolCatStatus, sizeof(vol->VolCatStatus)); /* ***FIXME*** copy other fields that can change, if any */ @@ -412,18 +447,87 @@ bail_out: return ok; } -/** +struct JOBMEDIA_ITEM { + dlink link; + uint32_t VolFirstIndex; + uint32_t VolLastIndex; + uint32_t StartFile; + uint32_t EndFile; + uint32_t StartBlock; + uint32_t EndBlock; + int64_t VolMediaId; +}; + +void create_jobmedia_queue(JCR *jcr) +{ + JOBMEDIA_ITEM *item = NULL; + jcr->jobmedia_queue = New(dlist(item, &item->link)); +} + +bool flush_jobmedia_queue(JCR *jcr) +{ + JOBMEDIA_ITEM *item; + BSOCK *dir = jcr->dir_bsock; + bool ok; + + if (!jcr->jobmedia_queue || jcr->jobmedia_queue->size() == 0) { + //Dmsg0(000, "No jobmedia_queue\n"); + return true; /* should never happen */ + } + Dmsg1(400, "=== Flush jobmedia queue = %d\n", jcr->jobmedia_queue->size()); + + dir->fsend(Create_jobmedia, jcr->Job); + foreach_dlist(item, jcr->jobmedia_queue) { + ok = dir->fsend("%u %u %u %u %u %u %lld\n", + item->VolFirstIndex, item->VolLastIndex, + item->StartFile, item->EndFile, + item->StartBlock, item->EndBlock, + item->VolMediaId); + Dmsg2(400, "sd->dir: ok=%d Jobmedia=%s", ok, dir->msg); + } + dir->signal(BNET_EOD); + jcr->jobmedia_queue->destroy(); + + if (dir->recv() <= 0) { + Dmsg0(dbglvl, "create_jobmedia error bnet_recv\n"); + Jmsg(jcr, M_FATAL, 0, _("Error creating JobMedia records: ERR=%s\n"), + dir->bstrerror()); + return false; + } + Dmsg1(210, "msg); + if (strcmp(dir->msg, OK_create) != 0) { + Dmsg1(dbglvl, "Bad response from Dir: %s\n", dir->msg); + Jmsg(jcr, M_FATAL, 0, _("Error creating JobMedia records: %s\n"), dir->msg); + return false; + } + return true; +} + +/* * After writing a Volume, create the JobMedia record. */ bool dir_create_jobmedia_record(DCR *dcr, bool zero) { JCR *jcr = dcr->jcr; BSOCK *dir = jcr->dir_bsock; - char ed1[50]; + JOBMEDIA_ITEM *item; + bool ok = true;; if (!dcr->WroteVol) { + return true; + } + if (dcr->VolLastIndex == 0) { + Dmsg7(dbglvl, "JobMedia Vol=%s wrote=%d MediaId=%d FI=%d LI=%d StartBlock=%d EndBlock=%d Suppressed\n", + dcr->VolumeName, dcr->WroteVol, dcr->VolMediaId, + dcr->VolFirstIndex, dcr->VolLastIndex, dcr->StartBlock, dcr->EndBlock); return true; /* nothing written to the Volume */ } + if (dcr->StartFile == dcr->EndFile && dcr->EndBlock < dcr->StartBlock) { + Dmsg7(0/*dbglvl*/, "PROBLEM Vol=%s wrote=%d MediaId=%d FI=%d LI=%d StartBlock=%d EndBlock=%d Suppressed\n", + dcr->VolumeName, dcr->WroteVol, dcr->VolMediaId, + dcr->VolFirstIndex, dcr->VolLastIndex, dcr->StartBlock, dcr->EndBlock); + return true; + } /* If system job, do not update catalog */ if (jcr->getJobType() == JT_SYSTEM) { @@ -439,36 +543,50 @@ bool dir_create_jobmedia_record(DCR *dcr, bool zero) return true; } + /* + * If this Job is incomplete, we need to backup the FileIndex + * to the last correctly saved file so that the JobMedia + * LastIndex is correct. + * + * Note: ***FIXME*** though it is not required, we probably + * should also keep a last EndFile and last EndBlock and + * reset them correctly too so that the JobMedia record is + * really correct. + */ + if (jcr->is_JobStatus(JS_Incomplete)) { + dcr->VolLastIndex = dir->get_lastFileIndex(); + Dmsg1(100, "======= Set FI=%ld\n", dcr->VolLastIndex); + } + Dmsg7(100, "JobMedia Vol=%s wrote=%d MediaId=%d FI=%d LI=%d StartBlock=%d EndBlock=%d Wrote\n", dcr->VolumeName, dcr->WroteVol, dcr->VolMediaId, dcr->VolFirstIndex, dcr->VolLastIndex, dcr->StartBlock, dcr->EndBlock); dcr->WroteVol = false; + item = (JOBMEDIA_ITEM *)malloc(sizeof(JOBMEDIA_ITEM)); if (zero) { - /* Send dummy place holder to avoid purging */ - dir->fsend(Create_job_media, jcr->Job, - 0 , 0, 0, 0, 0, 0, 0, 0, edit_uint64(dcr->VolMediaId, ed1)); + item->VolFirstIndex = item->VolLastIndex = 0; + item->StartFile = item->EndFile = 0; + item->StartBlock = item->EndBlock = 0; + item->VolMediaId = dcr->VolMediaId; } else { - dir->fsend(Create_job_media, jcr->Job, - dcr->VolFirstIndex, dcr->VolLastIndex, - dcr->StartFile, dcr->EndFile, - dcr->StartBlock, dcr->EndBlock, - dcr->Copy, dcr->Stripe, - edit_uint64(dcr->VolMediaId, ed1)); - } - Dmsg1(dbglvl, ">dird %s", dir->msg); - if (dir->recv() <= 0) { - Dmsg0(dbglvl, "create_jobmedia error bnet_recv\n"); - Jmsg(jcr, M_FATAL, 0, _("Error creating JobMedia record: ERR=%s\n"), - dir->bstrerror()); - return false; + item->VolFirstIndex = dcr->VolFirstIndex; + item->VolLastIndex = dcr->VolLastIndex; + item->StartFile = dcr->StartFile; + item->EndFile = dcr->EndFile; + item->StartBlock = dcr->StartBlock; + item->EndBlock = dcr->EndBlock; + item->VolMediaId = dcr->VolMediaId; } - Dmsg1(210, "msg); - if (strcmp(dir->msg, OK_create) != 0) { - Dmsg1(dbglvl, "Bad response from Dir: %s\n", dir->msg); - Jmsg(jcr, M_FATAL, 0, _("Error creating JobMedia record: %s\n"), dir->msg); - return false; + jcr->jobmedia_queue->append(item); + /* Flush at 100 queue size of 100 jobmedia records */ + if (zero || jcr->jobmedia_queue->size() >= 100) { + ok = flush_jobmedia_queue(jcr); } - return true; + + dcr->VolFirstIndex = dcr->VolLastIndex = 0; + dcr->StartFile = dcr->EndFile = 0; + dcr->StartBlock = dcr->EndBlock = 0; + return ok; } @@ -546,6 +664,7 @@ bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) bool got_vol = false; if (job_canceled(jcr)) { + dev->poll = false; return false; } Dmsg0(400, "enter dir_ask_sysop_to_create_appendable_volume\n"); @@ -556,6 +675,7 @@ bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) _("Job %s canceled while waiting for mount on Storage Device \"%s\".\n"), jcr->Job, dev->print_name()); Jmsg(jcr, M_INFO, 0, "%s", dev->errmsg); + dev->poll = false; return false; } got_vol = dir_find_next_appendable_volume(dcr); /* get suggested volume */ @@ -594,6 +714,7 @@ bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) dev->print_name(), jcr->Job); Jmsg(jcr, M_FATAL, 0, "%s", dev->errmsg); Dmsg1(dbglvl, "Gave up waiting on device %s\n", dev->print_name()); + dev->poll = false; return false; /* exceeded maximum waits */ } continue; @@ -602,12 +723,14 @@ bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) berrno be; Mmsg0(dev->errmsg, _("pthread error in mount_next_volume.\n")); Jmsg(jcr, M_FATAL, 0, "%s", dev->errmsg); + dev->poll = false; return false; } Dmsg1(dbglvl, "Someone woke me for device %s\n", dev->print_name()); } get_out: + dev->poll = false; jcr->sendJobStatus(JS_Running); Dmsg0(dbglvl, "leave dir_ask_sysop_to_create_appendable_volume\n"); return true; @@ -634,6 +757,13 @@ bool dir_ask_sysop_to_mount_volume(DCR *dcr, bool write_access) Dmsg0(400, "enter dir_ask_sysop_to_mount_volume\n"); if (!dcr->VolumeName[0]) { Mmsg0(dev->errmsg, _("Cannot request another volume: no volume name given.\n")); + dev->poll = false; + return false; + } + + if (dcr->no_mount_request) { + Mmsg(dev->errmsg, _("The current operation doesn't support mount request\n")); + dev->poll = false; return false; } @@ -641,6 +771,7 @@ bool dir_ask_sysop_to_mount_volume(DCR *dcr, bool write_access) if (job_canceled(jcr)) { Mmsg(dev->errmsg, _("Job %s canceled while waiting for mount on Storage Device %s.\n"), jcr->Job, dev->print_name()); + dev->poll = false; return false; } @@ -654,7 +785,7 @@ bool dir_ask_sysop_to_mount_volume(DCR *dcr, bool write_access) * Otherwise skip it. */ if (!dev->poll && (stat == W_TIMEOUT || stat == W_MOUNT)) { - char *msg; + const char *msg; if (write_access) { msg = _("%sPlease mount append Volume \"%s\" or label a new one for:\n" " Job: %s\n" @@ -695,6 +826,7 @@ bool dir_ask_sysop_to_mount_volume(DCR *dcr, bool write_access) dev->print_name(), jcr->Job); Jmsg(jcr, M_FATAL, 0, "%s", dev->errmsg); Dmsg1(400, "Gave up waiting on device %s\n", dev->print_name()); + dev->poll = false; return false; /* exceeded maximum waits */ } continue; @@ -703,6 +835,7 @@ bool dir_ask_sysop_to_mount_volume(DCR *dcr, bool write_access) berrno be; Mmsg(dev->errmsg, _("pthread error in mount_volume\n")); Jmsg(jcr, M_FATAL, 0, "%s", dev->errmsg); + dev->poll = false; return false; } Dmsg1(100, "Someone woke me for device %s\n", dev->print_name()); @@ -710,6 +843,7 @@ bool dir_ask_sysop_to_mount_volume(DCR *dcr, bool write_access) } get_out: + dev->poll = false; jcr->sendJobStatus(JS_Running); Dmsg0(100, "leave dir_ask_sysop_to_mount_volume\n"); return true; diff --git a/bacula/src/stored/authenticate.c b/bacula/src/stored/authenticate.c index 2289c30109..7572cd731a 100644 --- a/bacula/src/stored/authenticate.c +++ b/bacula/src/stored/authenticate.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Authenticate caller @@ -26,83 +30,22 @@ extern STORES *me; /* our Global resource */ - const int dbglvl = 50; -/* Version at end of Hello - * prior to 06Aug13 no version - * 1 06Aug13 - added comm line compression - * 2 13Dec13 - added api version to status command - * 3 22Feb14 - Added SD->SD with SD_Calls_Client - */ -#define SD_VERSION 3 -#define FD_VERSION 10 -static char hello_sd[] = "Hello Bacula SD: Start Job %s %d %d\n"; - - -static char Dir_sorry[] = "3999 No go\n"; -static char OK_hello[] = "3000 OK Hello %d\n"; - static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; -/********************************************************************* - * - * +/* + * Authenticate the Director */ -static int authenticate(int rcode, BSOCK *bs, JCR* jcr) +bool authenticate_director(JCR* jcr) { - POOLMEM *dirname; - DIRRES *director = NULL; + DIRRES *director = jcr->director; int tls_local_need = BNET_TLS_NONE; int tls_remote_need = BNET_TLS_NONE; int compatible = true; /* require md5 compatible DIR */ bool auth_success = false; alist *verify_list = NULL; - int dir_version = 0; - - if (rcode != R_DIRECTOR) { - Dmsg1(dbglvl, "I only authenticate Directors, not %d\n", rcode); - Jmsg1(jcr, M_FATAL, 0, _("I only authenticate Directors, not %d\n"), rcode); - return 0; - } - if (bs->msglen < 25 || bs->msglen > 500) { - Dmsg2(dbglvl, "Bad Hello command from Director at %s. Len=%d.\n", - bs->who(), bs->msglen); - Jmsg2(jcr, M_FATAL, 0, _("Bad Hello command from Director at %s. Len=%d.\n"), - bs->who(), bs->msglen); - return 0; - } - dirname = get_pool_memory(PM_MESSAGE); - dirname = check_pool_memory_size(dirname, bs->msglen); - - if (sscanf(bs->msg, "Hello SD: Bacula Director %127s calling %d", - dirname, &dir_version) != 2 && - sscanf(bs->msg, "Hello SD: Bacula Director %127s calling", - dirname) != 1) { - bs->msg[100] = 0; - Dmsg2(dbglvl, "Bad Hello command from Director at %s: %s\n", - bs->who(), bs->msg); - Jmsg2(jcr, M_FATAL, 0, _("Bad Hello command from Director at %s: %s\n"), - bs->who(), bs->msg); - free_pool_memory(dirname); - return 0; - } - director = NULL; - unbash_spaces(dirname); - foreach_res(director, rcode) { - if (strcasecmp(director->hdr.name, dirname) == 0) { - break; - } - } - if (!director) { - Dmsg2(dbglvl, "Connection from unknown Director %s at %s rejected.\n", - dirname, bs->who()); - Jmsg2(jcr, M_FATAL, 0, _("Connection from unknown Director %s at %s rejected.\n" - "Please see " MANUAL_AUTH_URL " for help.\n"), - dirname, bs->who()); - free_pool_memory(dirname); - return 0; - } + BSOCK *dir = jcr->dir_bsock; /* TLS Requirement */ if (director->tls_enable) { @@ -121,21 +64,21 @@ static int authenticate(int rcode, BSOCK *bs, JCR* jcr) verify_list = director->tls_allowed_cns; } - /* Timeout Hello after 10 mins */ - btimer_t *tid = start_bsock_timer(bs, AUTH_TIMEOUT); - auth_success = cram_md5_challenge(bs, director->password, tls_local_need, compatible); + /* Timeout authentication after 10 mins */ + btimer_t *tid = start_bsock_timer(dir, AUTH_TIMEOUT); + auth_success = cram_md5_challenge(dir, director->password, tls_local_need, compatible); if (auth_success) { - auth_success = cram_md5_respond(bs, director->password, &tls_remote_need, &compatible); + auth_success = cram_md5_respond(dir, director->password, &tls_remote_need, &compatible); if (!auth_success) { - Dmsg1(dbglvl, "cram_get_auth respond failed with Director %s\n", bs->who()); + Dmsg1(dbglvl, "cram_get_auth respond failed with Director %s\n", dir->who()); } } else { - Dmsg1(dbglvl, "cram_auth challenge failed with Director %s\n", bs->who()); + Dmsg1(dbglvl, "cram_auth challenge failed with Director %s\n", dir->who()); } if (!auth_success) { Jmsg0(jcr, M_FATAL, 0, _("Incorrect password given by Director.\n" - "Please see " MANUAL_AUTH_URL " for help.\n")); + "For help, please see: " MANUAL_AUTH_URL "\n")); auth_success = false; goto auth_fatal; } @@ -159,53 +102,33 @@ static int authenticate(int rcode, BSOCK *bs, JCR* jcr) if (tls_local_need >= BNET_TLS_OK && tls_remote_need >= BNET_TLS_OK) { /* Engage TLS! Full Speed Ahead! */ - if (!bnet_tls_server(director->tls_ctx, bs, verify_list)) { + if (!bnet_tls_server(director->tls_ctx, dir, verify_list)) { Jmsg(jcr, M_FATAL, 0, _("TLS negotiation failed with DIR at \"%s:%d\"\n"), - bs->host(), bs->port()); + dir->host(), dir->port()); auth_success = false; goto auth_fatal; } if (director->tls_authenticate) { /* authenticate with tls only? */ - bs->free_tls(); /* yes, shut it down */ + dir->free_tls(); /* yes, shut it down */ } } auth_fatal: stop_bsock_timer(tid); - free_pool_memory(dirname); jcr->director = director; - return auth_success; -} - -/* - * Inititiate the message channel with the Director. - * He has made a connection to our server. - * - * Basic tasks done here: - * Assume the Hello message is already in the input - * buffer. We then authenticate him. - * Get device, media, and pool information from Director - * - * This is the channel across which we will send error - * messages and job status information. - */ -int authenticate_director(JCR *jcr) -{ - BSOCK *dir = jcr->dir_bsock; - - if (!authenticate(R_DIRECTOR, dir, jcr)) { - dir->fsend(Dir_sorry); - Dmsg1(dbglvl, "Unable to authenticate Director at %s.\n", dir->who()); - Jmsg1(jcr, M_ERROR, 0, _("Unable to authenticate Director at %s.\n"), dir->who()); - bmicrosleep(5, 0); - return 0; + if (auth_success) { + return send_hello_ok(dir); } - return dir->fsend(OK_hello, SD_VERSION); + send_sorry(dir); + Dmsg1(dbglvl, "Unable to authenticate Director at %s.\n", dir->who()); + Jmsg1(jcr, M_ERROR, 0, _("Unable to authenticate Director at %s.\n"), dir->who()); + bmicrosleep(5, 0); + return false; } -int authenticate_filed(JCR *jcr) + +int authenticate_filed(JCR *jcr, BSOCK *fd, int FDVersion) { - BSOCK *fd = jcr->file_bsock; int tls_local_need = BNET_TLS_NONE; int tls_remote_need = BNET_TLS_NONE; int compatible = true; /* require md5 compatible FD */ @@ -229,7 +152,7 @@ int authenticate_filed(JCR *jcr) verify_list = me->tls_allowed_cns; } - /* Timeout Hello after 5 mins */ + /* Timeout authentication after 5 mins */ btimer_t *tid = start_bsock_timer(fd, AUTH_TIMEOUT); /* Challenge FD */ Dmsg0(050, "Challenge FD\n"); @@ -247,7 +170,7 @@ int authenticate_filed(JCR *jcr) if (!auth_success) { Jmsg(jcr, M_FATAL, 0, _("Incorrect authorization key from File daemon at %s rejected.\n" - "Please see " MANUAL_AUTH_URL " for help.\n"), + "For help, please see: " MANUAL_AUTH_URL "\n"), fd->who()); auth_success = false; goto auth_fatal; @@ -287,13 +210,17 @@ auth_fatal: stop_bsock_timer(tid); if (!auth_success) { Jmsg(jcr, M_FATAL, 0, _("Incorrect authorization key from File daemon at %s rejected.\n" - "Please see " MANUAL_AUTH_URL " for help.\n"), + "For help, please see: " MANUAL_AUTH_URL "\n"), fd->who()); } - jcr->authenticated = auth_success; - if (auth_success && jcr->FDVersion >= 5) { - /* Send hello and our version to FD */ - fd->fsend(OK_hello, SD_VERSION); + + /* Version 5 of the protocol is a bit special, it is used by both 6.0.0 + * Enterprise version and 7.0.x Community version, but do not support the + * same level of features. As nobody is using the 6.0.0 release, we can + * be pretty sure that the FD in version 5 is a community FD. + */ + if (auth_success && (FDVersion >= 9 || FDVersion == 5)) { + send_hello_ok(fd); } return auth_success; } @@ -302,7 +229,7 @@ auth_fatal: * First prove our identity to the Storage daemon, then * make him prove his identity. */ -bool authenticate_storagedaemon(JCR *jcr, char *Job) +bool authenticate_storagedaemon(JCR *jcr) { BSOCK *sd = jcr->store_bsock; int tls_local_need = BNET_TLS_NONE; @@ -331,11 +258,6 @@ bool authenticate_storagedaemon(JCR *jcr, char *Job) goto auth_fatal; } - - bash_spaces(Job); - sd->fsend(hello_sd, Job, FD_VERSION, SD_VERSION); - Dmsg1(100, "Send to SD: %s\n", sd->msg); - /* Respond to SD challenge */ Dmsg0(050, "Respond to SD challenge\n"); auth_success = cram_md5_respond(sd, jcr->sd_auth_key, &tls_remote_need, &compatible); @@ -395,7 +317,6 @@ bool authenticate_storagedaemon(JCR *jcr, char *Job) goto auth_fatal; } sscanf(sd->msg, "3000 OK Hello %d", &sd_version); - /* At this point, we have successfully connected */ auth_fatal: diff --git a/bacula/src/stored/autochanger.c b/bacula/src/stored/autochanger.c index 4f294e6a70..4060056281 100644 --- a/bacula/src/stored/autochanger.c +++ b/bacula/src/stored/autochanger.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * diff --git a/bacula/src/stored/bacula-sd.conf.in b/bacula/src/stored/bacula-sd.conf.in index 73d5669cec..f9948109ec 100644 --- a/bacula/src/stored/bacula-sd.conf.in +++ b/bacula/src/stored/bacula-sd.conf.in @@ -9,6 +9,10 @@ # "Media Type" in the Device resource, please ensure # that dird.conf has corresponding changes. # +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# Storage { # definition of myself Name = @basename@-sd @@ -39,6 +43,8 @@ Director { # # Note, for a list of additional Device templates please # see the directory /examples/devices +# Or follow the following link: +# http://bacula.svn.sourceforge.net/viewvc/bacula/trunk/bacula/examples/devices/ # # diff --git a/bacula/src/stored/bcopy.c b/bacula/src/stored/bcopy.c index ce1144e1f7..eaac36ef16 100644 --- a/bacula/src/stored/bcopy.c +++ b/bacula/src/stored/bcopy.c @@ -1,23 +1,27 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * * Program to copy a Bacula from one volume to another. * - * Written by Kern E. Sibbald, October 2002 + * Kern E. Sibbald, October 2002 * */ @@ -54,12 +58,11 @@ bool forge_on = false; /* proceed inspite of I/O errors */ pthread_mutex_t device_release_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t wait_device_release = PTHREAD_COND_INITIALIZER; - static void usage() { fprintf(stderr, _( PROG_COPYRIGHT -"\nVersion: %s (%s)\n\n" +"\n%sVersion: %s (%s)\n\n" "Usage: bcopy [-d debug_level] \n" " -b bootstrap specify a bootstrap file\n" " -c specify a Storage configuration file\n" @@ -70,7 +73,7 @@ PROG_COPYRIGHT " -p proceed inspite of errors\n" " -v verbose\n" " -w

specify working directory (default /tmp)\n" -" -? print this message\n\n"), 2002, VERSION, BDATE); +" -? print this message\n\n"), 2002, "", VERSION, BDATE); exit(1); } @@ -165,7 +168,7 @@ int main (int argc, char *argv[]) /* Setup and acquire input device for reading */ Dmsg0(100, "About to setup input jcr\n"); - in_jcr = setup_jcr("bcopy", argv[0], bsr, iVolumeName, SD_READ); /* read device */ + in_jcr = setup_jcr("bcopy", argv[0], bsr, iVolumeName, SD_READ, true/*read dedup data*/); /* read device */ if (!in_jcr) { exit(1); } @@ -203,7 +206,7 @@ int main (int argc, char *argv[]) ok = read_records(in_jcr->dcr, record_cb, mount_next_read_volume); if (ok || out_dev->can_write()) { - if (!out_jcr->dcr->write_block_to_device()) { + if (!out_jcr->dcr->write_final_block_to_device()) { Pmsg0(000, _("Write of last block failed.\n")); } } @@ -237,7 +240,7 @@ static bool record_cb(DCR *in_dcr, DEV_RECORD *rec) get_session_record(in_dcr->dev, rec, &sessrec); if (verbose > 1) { - dump_label_record(in_dcr->dev, rec, 1); + dump_label_record(in_dcr->dev, rec, 1/*verbose*/, false/*check err*/); } switch (rec->FileIndex) { case PRE_LABEL: @@ -352,6 +355,7 @@ static void get_session_record(DEVICE *dev, DEV_RECORD *rec, SESSION_LABEL *sess bool dir_find_next_appendable_volume(DCR *dcr) { return 1;} bool dir_update_volume_info(DCR *dcr, bool relabel, bool update_LastWritten) { return 1; } bool dir_create_jobmedia_record(DCR *dcr, bool zero) { return 1; } +bool flush_jobmedia_queue(JCR *jcr) { return true; } bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) { return 1; } bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { return 1;} bool dir_send_job_status(JCR *jcr) {return 1;} @@ -371,9 +375,6 @@ bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw writing) { Dmsg0(100, "Fake dir_get_volume_info\n"); dcr->setVolCatName(dcr->VolumeName); -#ifdef BUILD_DVD - dcr->VolCatInfo.VolCatParts = find_num_dvd_parts(dcr); -#endif - Dmsg2(500, "Vol=%s num_parts=%d\n", dcr->getVolCatName(), dcr->VolCatInfo.VolCatParts); + Dmsg2(500, "Vol=%s VolType=%d\n", dcr->getVolCatName(), dcr->VolCatInfo.VolCatType); return 1; } diff --git a/bacula/src/stored/bextract.c b/bacula/src/stored/bextract.c index 5e2664a672..baeb42ef08 100644 --- a/bacula/src/stored/bextract.c +++ b/bacula/src/stored/bextract.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -46,7 +50,10 @@ static bool extract = false; static int non_support_data = 0; static long total = 0; static ATTR *attr; +static POOLMEM *curr_fname; static char *where; +static uint64_t num_errors = 0; +static uint64_t num_records = 0; static uint32_t num_files = 0; static uint32_t compress_buf_size = 70000; static POOLMEM *compress_buf; @@ -65,6 +72,7 @@ void *start_heap; char *configfile = NULL; STORES *me = NULL; /* our Global resource */ bool forge_on = false; +bool skip_extract = false; pthread_mutex_t device_release_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t wait_device_release = PTHREAD_COND_INITIALIZER; @@ -72,18 +80,20 @@ static void usage() { fprintf(stderr, _( PROG_COPYRIGHT -"\nVersion: %s (%s)\n\n" +"\n%sVersion: %s (%s)\n\n" "Usage: bextract \n" " -b specify a bootstrap file\n" " -c specify a Storage configuration file\n" " -d set debug level to \n" " -dt print timestamp in debug output\n" +" -T send debug traces to trace file\n" " -e exclude list\n" " -i include list\n" " -p proceed inspite of I/O errors\n" +" -t read data from volume, do not write anything\n" " -v verbose\n" " -V specify Volume names (separated by |)\n" -" -? print this message\n\n"), 2000, VERSION, BDATE); +" -? print this message\n\n"), 2000, "", VERSION, BDATE); exit(1); } @@ -110,13 +120,21 @@ int main (int argc, char *argv[]) ff = init_find_files(); binit(&bfd); - while ((ch = getopt(argc, argv, "b:c:d:e:i:pvV:?")) != -1) { + while ((ch = getopt(argc, argv, "Ttb:c:d:e:i:pvV:?")) != -1) { switch (ch) { + case 't': + skip_extract = true; + break; + case 'b': /* bootstrap file */ bsr = parse_bsr(NULL, optarg); // dump_bsr(bsr, true); break; + case 'T': /* Send debug to trace file */ + set_trace(1); + break; + case 'c': /* specify config file */ if (configfile != NULL) { free(configfile); @@ -226,11 +244,12 @@ int main (int argc, char *argv[]) static void do_extract(char *devname) { + char ed1[50]; struct stat statp; enable_backup_privileges(NULL, 1); - jcr = setup_jcr("bextract", devname, bsr, VolumeName, SD_READ); + jcr = setup_jcr("bextract", devname, bsr, VolumeName, SD_READ, false/*read dedup data*/); if (!jcr) { exit(1); } @@ -255,6 +274,8 @@ static void do_extract(char *devname) attr = new_attr(jcr); compress_buf = get_memory(compress_buf_size); + curr_fname = get_pool_memory(PM_FNAME); + *curr_fname = 0; read_records(dcr, record_cb, mount_next_read_volume); /* If output file is still open, it was the last one in the @@ -267,8 +288,12 @@ static void do_extract(char *devname) free_attr(attr); free_jcr(jcr); dev->term(); + free_pool_memory(curr_fname); printf(_("%u files restored.\n"), num_files); + if (num_errors) { + printf(_("Found %s error%s\n"), edit_uint64(num_errors, ed1), num_errors>1? "s":""); + } return; } @@ -297,13 +322,46 @@ static bool store_data(BFILE *bfd, char *data, const int32_t length) */ static bool record_cb(DCR *dcr, DEV_RECORD *rec) { - int stat; + int stat, ret=true; JCR *jcr = dcr->jcr; + char ed1[50]; + + bool restoredatap = false; + POOLMEM *orgdata = NULL; + uint32_t orgdata_len = 0; if (rec->FileIndex < 0) { return true; /* we don't want labels */ } + /* In this mode, we do not create any file on disk, just read + * everything from the volume. + */ + if (skip_extract) { + switch (rec->maskedStream) { + case STREAM_UNIX_ATTRIBUTES: + case STREAM_UNIX_ATTRIBUTES_EX: + if (!unpack_attributes_record(jcr, rec->Stream, rec->data, rec->data_len, attr)) { + Emsg0(M_ERROR_TERM, 0, _("Cannot continue.\n")); + } + if (verbose) { + attr->data_stream = decode_stat(attr->attr, &attr->statp, sizeof(attr->statp), &attr->LinkFI); + build_attr_output_fnames(jcr, attr); + print_ls_output(jcr, attr); + } + pm_strcpy(curr_fname, attr->fname); + num_files++; + break; + } + num_records++; + + /* We display some progress information if verbose not set or set to 2 */ + if (verbose != 1 && (num_records % 200000) == 0L) { + fprintf(stderr, "\rfiles=%d records=%s\n", num_files, edit_uint64(num_records, ed1)); + } + return true; + } + /* File Attributes stream */ switch (rec->maskedStream) { @@ -325,6 +383,9 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) Emsg0(M_ERROR_TERM, 0, _("Cannot continue.\n")); } + /* Keep the name of the current file if we find a bad block */ + pm_strcpy(curr_fname, attr->fname); + if (file_is_included(ff, attr->fname) && !file_is_excluded(ff, attr->fname)) { attr->data_stream = decode_stat(attr->attr, &attr->statp, sizeof(attr->statp), &attr->LinkFI); if (!is_restore_stream_supported(attr->data_stream)) { @@ -333,7 +394,7 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) stream_to_ascii(attr->data_stream)); } extract = false; - return true; + goto bail_out; } build_attr_output_fnames(jcr, attr); @@ -341,11 +402,12 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) if (attr->type == FT_DELETED) { /* TODO: choose the right fname/ofname */ Jmsg(jcr, M_INFO, 0, _("%s was deleted.\n"), attr->fname); extract = false; - return true; + goto bail_out; } extract = false; stat = create_file(jcr, attr, &bfd, REPLACE_ALWAYS); + switch (stat) { case CF_ERROR: case CF_SKIP: @@ -426,7 +488,7 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) Emsg3(M_ERROR, 0, _("Seek to %s error on %s: ERR=%s\n"), edit_uint64(fileAddr, ec1), attr->ofname, be.bstrerror()); extract = false; - return true; + goto bail_out; } } } else { @@ -444,7 +506,7 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) if (stat != Z_OK) { Emsg1(M_ERROR, 0, _("Uncompression error. ERR=%d\n"), stat); extract = false; - return true; + goto bail_out; } Dmsg2(100, "Write uncompressed %d bytes, total before write=%d\n", compress_len, total); @@ -458,7 +520,7 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) if (extract) { Emsg0(M_ERROR, 0, _("GZIP data stream found, but GZIP not configured!\n")); extract = false; - return true; + goto bail_out; } #endif break; @@ -491,7 +553,7 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) Emsg3(M_ERROR, 0, _("Seek to %s error on %s: ERR=%s\n"), edit_uint64(fileAddr, ec1), attr->ofname, be.bstrerror()); extract = false; - return true; + goto bail_out; } } } else { @@ -512,13 +574,15 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) /* version check */ if (comp_version != COMP_HEAD_VERSION) { Emsg1(M_ERROR, 0, _("Compressed header version error. version=0x%x\n"), comp_version); - return false; + ret = false; + goto bail_out; } /* size check */ if (comp_len + sizeof(comp_stream_header) != wsize) { Emsg2(M_ERROR, 0, _("Compressed header size error. comp_len=%d, msglen=%d\n"), comp_len, wsize); - return false; + ret = false; + goto bail_out; } switch(comp_magic) { @@ -540,7 +604,7 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) if (r != LZO_E_OK) { Emsg1(M_ERROR, 0, _("LZO uncompression error. ERR=%d\n"), r); extract = false; - return true; + goto bail_out; } Dmsg2(100, "Write uncompressed %d bytes, total before write=%d\n", compress_len, total); store_data(&bfd, compress_buf, compress_len); @@ -552,7 +616,7 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) default: Emsg1(M_ERROR, 0, _("Compression algorithm 0x%x found, but not supported!\n"), comp_magic); extract = false; - return true; + goto bail_out; } } @@ -591,13 +655,19 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) break; } /* end switch */ - return true; +bail_out: + if (restoredatap) { + rec->data = orgdata; + rec->data_len = orgdata_len; + } + return ret; } /* Dummies to replace askdir.c */ bool dir_find_next_appendable_volume(DCR *dcr) { return 1;} bool dir_update_volume_info(DCR *dcr, bool relabel, bool update_LastWritten) { return 1; } bool dir_create_jobmedia_record(DCR *dcr, bool zero) { return 1; } +bool flush_jobmedia_queue(JCR *jcr) { return true; } bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) { return 1; } bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { return 1;} bool dir_send_job_status(JCR *jcr) {return 1;} @@ -617,9 +687,6 @@ bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw writing) { Dmsg0(100, "Fake dir_get_volume_info\n"); dcr->setVolCatName(dcr->VolumeName); -#ifdef BUILD_DVD - dcr->VolCatInfo.VolCatParts = find_num_dvd_parts(dcr); -#endif - Dmsg2(500, "Vol=%s num_parts=%d\n", dcr->getVolCatName(), dcr->VolCatInfo.VolCatParts); + Dmsg2(500, "Vol=%s VolType=%d\n", dcr->getVolCatName(), dcr->VolCatInfo.VolCatType); return 1; } diff --git a/bacula/src/stored/block.c b/bacula/src/stored/block.c index 3cf0dbb368..75ec5bfba7 100644 --- a/bacula/src/stored/block.c +++ b/bacula/src/stored/block.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -53,15 +57,15 @@ bool unser_block_header(JCR *jcr, DEVICE *dev, DEV_BLOCK *block); * : false on failure * */ -bool DCR::write_block_to_device() +bool DCR::write_block_to_device(bool final) { - bool stat = true; + bool ok = true; DCR *dcr = this; if (dcr->spooling) { Dmsg0(200, "Write to spool\n"); - stat = write_block_to_spool_file(dcr); - return stat; + ok = write_block_to_spool_file(dcr); + return ok; } if (!is_dev_locked()) { /* device already locked? */ @@ -70,28 +74,31 @@ bool DCR::write_block_to_device() } if (!check_for_newvol_or_newfile(dcr)) { - stat = false; + ok = false; goto bail_out; /* fatal error */ } Dmsg1(500, "Write block to dev=%p\n", dcr->dev); if (!write_block_to_dev()) { + Dmsg1(40, "*** Failed write_block_to_dev block=%p\n", block); if (job_canceled(jcr) || jcr->getJobType() == JT_SYSTEM) { - stat = false; + ok = false; Dmsg2(40, "cancel=%d or SYSTEM=%d\n", job_canceled(jcr), jcr->getJobType() == JT_SYSTEM); } else { - Dmsg0(40, "Calling fixup_device ...\n"); - stat = fixup_device_block_write_error(dcr); + ok = fixup_device_block_write_error(dcr); } } + if (ok && final && !dir_create_jobmedia_record(dcr)) { + Jmsg(jcr, M_FATAL, 0, _("Error writing final JobMedia record to catalog.\n")); + } bail_out: if (!dcr->is_dev_locked()) { /* did we lock dev above? */ /* note, do not change this to dcr->dunlock */ dev->Unlock(); /* unlock it now */ } - return stat; + return ok; } /* @@ -151,7 +158,6 @@ bool DCR::write_block_to_dev() checksum = ser_block_header(block, dev->do_checksum()); - /* Handle max vol size here */ if (user_volume_size_reached(dcr, true)) { Dmsg0(40, "Calling terminate_writing_volume\n"); terminate_writing_volume(dcr); @@ -258,10 +264,18 @@ bool DCR::write_block_to_dev() dev->dev_errno = ENOSPC; /* out of space */ } if (dev->dev_errno == ENOSPC) { - dev->clear_nospace(); - Jmsg(jcr, M_INFO, 0, _("End of Volume \"%s\" at %u:%u on device %s. Write of %u bytes got %d.\n"), - dev->getVolCatName(), - dev->file, dev->block_num, dev->print_name(), wlen, stat); + dev->update_freespace(); + if (dev->is_freespace_ok() && dev->free_space < dev->min_free_space) { + dev->set_nospace(); + Jmsg(jcr, M_WARNING, 0, _("Out of freespace caused End of Volume \"%s\" at %u:%u on device %s. Write of %u bytes got %d.\n"), + dev->getVolCatName(), + dev->file, dev->block_num, dev->print_name(), wlen, stat); + } else { + dev->clear_nospace(); + Jmsg(jcr, M_INFO, 0, _("End of Volume \"%s\" at %u:%u on device %s. Write of %u bytes got %d.\n"), + dev->getVolCatName(), + dev->file, dev->block_num, dev->print_name(), wlen, stat); + } } if (chk_dbglvl(100)) { berrno be; @@ -282,8 +296,6 @@ bool DCR::write_block_to_dev() Dmsg2(1300, "VolCatBytes=%lld newVolCatBytes=%lld\n", dev->VolCatInfo.VolCatBytes, (dev->VolCatInfo.VolCatBytes+wlen)); dev->updateVolCatBytes(wlen); - Dmsg2(200, "AmetaBytes=%lld Bytes=%lld\n", - dev->VolCatInfo.VolCatAmetaBytes, dev->VolCatInfo.VolCatBytes); dev->updateVolCatBlocks(1); dev->EndBlock = dev->block_num; dev->EndFile = dev->file; @@ -292,34 +304,35 @@ bool DCR::write_block_to_dev() /* Update dcr values */ if (dev->is_tape()) { - dcr->EndBlock = dev->EndBlock; - dcr->EndFile = dev->EndFile; + if (dcr->EndFile != dev->EndFile || dev->EndBlock > dcr->EndBlock) { + dcr->EndBlock = dev->EndBlock; + dcr->EndFile = dev->EndFile; + } dev->block_num++; } else { /* Save address of block just written */ uint64_t addr = dev->file_addr + wlen - 1; - if (dcr->EndBlock > (uint32_t)addr || - dcr->EndFile > (uint32_t)(addr >> 32)) { - Pmsg4(000, "Incorrect EndBlock/EndFile oldEndBlock=%d newEndBlock=%d oldEndFile=%d newEndFile=%d\n", + if (dcr->EndFile == (uint32_t)(addr >> 32) && + (uint32_t)addr < dcr->EndBlock) { + Pmsg4(000, "Possible incorrect EndBlock oldEndBlock=%d newEndBlock=%d oldEndFile=%d newEndFile=%d\n", dcr->EndBlock, (uint32_t)addr, dcr->EndFile, (uint32_t)(addr >> 32)); + } else { + dcr->EndBlock = (uint32_t)addr; + dcr->EndFile = (uint32_t)(addr >> 32); } - dcr->EndBlock = (uint32_t)addr; - dcr->EndFile = (uint32_t)(addr >> 32); dev->block_num = (uint32_t)addr; dev->file = (uint32_t)(addr >> 32); block->BlockAddr = dev->file_addr + wlen; Dmsg3(150, "Set block->BlockAddr=%lld wlen=%d block=%x\n", block->BlockAddr, wlen, block); - Dmsg2(200, "AmetaBytes=%lld Bytes=%lld\n", - dev->VolCatInfo.VolCatAmetaBytes, dev->VolCatInfo.VolCatBytes); } dcr->VolMediaId = dev->VolCatInfo.VolMediaId; Dmsg3(150, "VolFirstIndex=%d blockFirstIndex=%d Vol=%s\n", - dcr->VolFirstIndex, block->FirstIndex, dcr->VolumeName); + dcr->VolFirstIndex, block->FirstIndex, dcr->VolumeName); if (dcr->VolFirstIndex == 0 && block->FirstIndex > 0) { dcr->VolFirstIndex = block->FirstIndex; } - if (block->LastIndex > 0) { + if (block->LastIndex > (int32_t)dcr->VolLastIndex) { dcr->VolLastIndex = block->LastIndex; } dcr->WroteVol = true; @@ -350,6 +363,18 @@ bool DCR::read_block_from_device(bool check_block_numbers) return ok; } +static void set_block_position(DCR *dcr, DEVICE *dev, DEV_BLOCK *block) +{ + if (dev->is_tape()) { + block->Block = dev->block_num; + block->File = dev->file; + } else { + block->Block = (uint32_t)dev->file_addr; + block->File = (uint32_t)(dev->file_addr >> 32); + } + block->RecNum = 0; +} + /* * Read the next block into the block structure and unserialize * the block header. For a file, the block may be partially @@ -380,11 +405,12 @@ bool DCR::read_block_from_dev(bool check_block_numbers) Mmsg4(dev->errmsg, _("Attempt to read closed device: fd=%d at file:blk %u:%u on device %s\n"), dev->fd(), dev->file, dev->block_num, dev->print_name()); Jmsg(dcr->jcr, M_FATAL, 0, "%s", dev->errmsg); - Pmsg2(000, "Fatal: dev=%p dcr=%p\n", dev, dcr); Pmsg1(000, "%s", dev->errmsg); block->read_len = 0; return false; - } + } + + set_block_position(dcr, dev, block); reread: if (looping > 1) { @@ -398,6 +424,21 @@ reread: dump_block(block, "before read"); +#ifdef xxxBUILD_DVD + /* Check for DVD part file end */ + if (dev->at_eof() && dev->is_dvd() && dev->num_dvd_parts > 0 && + dev->part <= dev->num_dvd_parts) { + Dmsg0(400, "Call dvd_open_next_part\n"); + if (dvd_open_next_part(dcr) < 0) { + Mmsg3(dev->errmsg, _("Unable to open device part=%d %s: ERR=%s\n"), + dev->part, dev->print_name(), dev->bstrerror()); + Jmsg(dcr->jcr, M_FATAL, 0, "%s", dev->errmsg); + dev->dev_errno = EIO; + return false; + } + } +#endif /* xxxBUILD_DVD */ + retry = 0; errno = 0; stat = 0; @@ -423,7 +464,7 @@ reread: block->read_len = 0; if (dev->file == 0 && dev->block_num == 0) { /* Attempt to read label */ Mmsg(dev->errmsg, _("The Volume=%s on device=%s appears to be unlabeled.\n"), - dev->VolCatInfo.VolCatName, dev->print_name()); + "", dev->VolCatInfo.VolCatName, dev->print_name()); } else { Mmsg5(dev->errmsg, _("Read error on fd=%d at file:blk %u:%u on device %s. ERR=%s.\n"), dev->fd(), dev->file, dev->block_num, dev->print_name(), be.bstrerror()); @@ -436,11 +477,11 @@ reread: } if (stat == 0) { /* Got EOF ! */ if (dev->file == 0 && dev->block_num == 0) { /* Attempt to read label */ - Mmsg2(dev->errmsg, _("The Volume=%s on device=%s appears to be unlabeled.\n"), - dev->VolCatInfo.VolCatName, dev->print_name()); + Mmsg3(dev->errmsg, _("The %sVolume=%s on device=%s appears to be unlabeled.\n"), + "", dev->VolCatInfo.VolCatName, dev->print_name()); } else { - Mmsg3(dev->errmsg, _("Read zero bytes Vol=%s at %lld on device %s.\n"), - dev->VolCatInfo.VolCatName, pos, dev->print_name()); + Mmsg4(dev->errmsg, _("Read zero %sbytes Vol=%s at %lld on device %s.\n"), + "", dev->VolCatInfo.VolCatName, pos, dev->print_name()); } dev->block_num = 0; block->read_len = 0; @@ -549,16 +590,20 @@ reread: /* Update dcr values */ if (dev->is_tape()) { - dcr->EndBlock = dev->EndBlock; - dcr->EndFile = dev->EndFile; + if (dcr->EndFile != dev->EndFile || dev->EndBlock > dcr->EndBlock) { + dcr->EndBlock = dev->EndBlock; + dcr->EndFile = dev->EndFile; + } } else { /* We need to take care about a short block in EndBlock/File * computation */ uint32_t len = MIN(block->read_len, block->block_len); uint64_t addr = dev->file_addr + len - 1; - dcr->EndBlock = (uint32_t)addr; - dcr->EndFile = (uint32_t)(addr >> 32); + if ((uint32_t)(addr >> 32) != dcr->EndFile || (uint32_t)addr > dcr->EndBlock) { + dcr->EndBlock = (uint32_t)addr; + dcr->EndFile = (uint32_t)(addr >> 32); + } dev->block_num = dev->EndBlock = (uint32_t)addr; dev->file = dev->EndFile = (uint32_t)(addr >> 32); } diff --git a/bacula/src/stored/block.h b/bacula/src/stored/block.h index a438350423..ff8f0851fe 100644 --- a/bacula/src/stored/block.h +++ b/bacula/src/stored/block.h @@ -1,22 +1,26 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Block definitions for Bacula media data format. * - * Written by Kern Sibbald, MM + * Kern Sibbald, MM * */ @@ -92,12 +96,14 @@ class DEVICE; /* for forward reference */ */ struct DEV_BLOCK { DEV_BLOCK *next; /* pointer to next one */ - DEVICE *dev; /* pointer to device */ + DEVICE *dev; /* pointer to device */ /* binbuf is the number of bytes remaining in the buffer. * For writes, it is bytes not yet written. * For reads, it is remaining bytes not yet read. */ uint64_t BlockAddr; /* Block address */ + uint32_t File; /* Block address on volume */ + uint32_t Block; /* Block address on volume */ uint32_t binbuf; /* bytes in buffer */ uint32_t block_len; /* length of current block read */ uint32_t buf_len; /* max/default block length */ @@ -108,10 +114,12 @@ struct DEV_BLOCK { uint32_t VolSessionTime; /* */ uint32_t read_errors; /* block errors (checksum, header, ...) */ uint32_t CheckSum; /* Block checksum */ + uint32_t RecNum; /* Number of records read from the current block */ int BlockVer; /* block version 1 or 2 */ bool write_failed; /* set if write failed */ bool block_read; /* set when block read */ bool needs_write; /* block must be written */ + bool adata; /* adata block */ bool no_header; /* Set if no block header */ bool new_fi; /* New FI arrived */ int32_t FirstIndex; /* first index this block */ diff --git a/bacula/src/stored/block_util.c b/bacula/src/stored/block_util.c index 790dad89b7..7fc45d2118 100644 --- a/bacula/src/stored/block_util.c +++ b/bacula/src/stored/block_util.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -554,6 +558,7 @@ bool terminate_writing_volume(DCR *dcr) Jmsg(dcr->jcr, M_FATAL, 0, "%s", dev->errmsg); ok = false; } + flush_jobmedia_queue(dcr->jcr); dcr->block->write_failed = true; if (dev->can_append() && !dev->weof(1)) { /* end the tape */ dev->VolCatInfo.VolCatErrors++; @@ -626,6 +631,7 @@ bool check_for_newvol_or_newfile(DCR *dcr) return false; } if (dcr->NewVol) { + flush_jobmedia_queue(jcr); /* Note, setting a new volume also handles any pending new file */ set_new_volume_parameters(dcr); } else { diff --git a/bacula/src/stored/bls.c b/bacula/src/stored/bls.c index 3ee9604c67..e677004dbd 100644 --- a/bacula/src/stored/bls.c +++ b/bacula/src/stored/bls.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -53,7 +57,8 @@ STORES *me = NULL; /* our Global resource */ bool forge_on = false; pthread_mutex_t device_release_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t wait_device_release = PTHREAD_COND_INITIALIZER; - +bool detect_errors = false; +int errors = 0; static FF_PKT *ff; @@ -63,7 +68,7 @@ static void usage() { fprintf(stderr, _( PROG_COPYRIGHT -"\nVersion: %s (%s)\n\n" +"\n%sVersion: %s (%s)\n\n" "Usage: bls [options] \n" " -b specify a bootstrap file\n" " -c specify a Storage configuration file\n" @@ -78,7 +83,8 @@ PROG_COPYRIGHT " -p proceed inspite of errors\n" " -v be verbose\n" " -V specify Volume names (separated by |)\n" -" -? print this message\n\n"), 2000, VERSION, BDATE); +" -E Check records to detect errors\n" +" -? print this message\n\n"), 2000, "", VERSION, BDATE); exit(1); } @@ -106,12 +112,16 @@ int main (int argc, char *argv[]) ff = init_find_files(); - while ((ch = getopt(argc, argv, "b:c:d:e:i:jkLpvV:?")) != -1) { + while ((ch = getopt(argc, argv, "b:c:d:e:i:jkLpvV:?E")) != -1) { switch (ch) { case 'b': bsrName = optarg; break; + case 'E': + detect_errors = true; + break; + case 'c': /* specify config file */ if (configfile != NULL) { free(configfile); @@ -252,6 +262,10 @@ int main (int argc, char *argv[]) } term_include_exclude_files(ff); term_find_files(ff); + + if (detect_errors) { + return (errors > 0)? 1 : 0; + } return 0; } @@ -298,6 +312,7 @@ static void do_blocks(char *infname) continue; } else { /* I/O error */ + errors++; display_tape_error_status(jcr, dev); break; } @@ -335,7 +350,7 @@ static void do_blocks(char *infname) static bool jobs_cb(DCR *dcr, DEV_RECORD *rec) { if (rec->FileIndex < 0) { - dump_label_record(dcr->dev, rec, verbose); + dump_label_record(dcr->dev, rec, verbose, detect_errors); } rec->remainder = 0; return true; @@ -344,7 +359,9 @@ static bool jobs_cb(DCR *dcr, DEV_RECORD *rec) /* Do list job records */ static void do_jobs(char *infname) { - read_records(dcr, jobs_cb, mount_next_read_volume); + if (!read_records(dcr, jobs_cb, mount_next_read_volume)) { + errors++; + } } /* Do an ls type listing of an archive */ @@ -354,7 +371,9 @@ static void do_ls(char *infname) dump_volume_label(dev); return; } - read_records(dcr, record_cb, mount_next_read_volume); + if (!read_records(dcr, record_cb, mount_next_read_volume)) { + errors++; + } printf("%u files found.\n", num_files); } @@ -364,7 +383,7 @@ static void do_ls(char *infname) static bool record_cb(DCR *dcr, DEV_RECORD *rec) { if (verbose && rec->FileIndex < 0) { - dump_label_record(dcr->dev, rec, verbose); + dump_label_record(dcr->dev, rec, verbose, false); return true; } if (verbose) { @@ -464,6 +483,7 @@ static void get_session_record(DEVICE *dev, DEV_RECORD *rec, SESSION_LABEL *sess bool dir_find_next_appendable_volume(DCR *dcr) { return 1;} bool dir_update_volume_info(DCR *dcr, bool relabel, bool update_LastWritten) { return 1; } bool dir_create_jobmedia_record(DCR *dcr, bool zero) { return 1; } +bool flush_jobmedia_queue(JCR *jcr) { return true; } bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) { return 1; } bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { return 1;} bool dir_send_job_status(JCR *jcr) {return 1;} @@ -484,9 +504,6 @@ bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw writing) { Dmsg0(100, "Fake dir_get_volume_info\n"); dcr->setVolCatName(dcr->VolumeName); -#ifdef BUILD_DVD - dcr->VolCatInfo.VolCatParts = find_num_dvd_parts(dcr); -#endif - Dmsg2(500, "Vol=%s num_parts=%d\n", dcr->getVolCatName(), dcr->VolCatInfo.VolCatParts); + Dmsg2(500, "Vol=%s VolType=%d\n", dcr->getVolCatName(), dcr->VolCatInfo.VolCatType); return 1; } diff --git a/bacula/src/stored/bscan.c b/bacula/src/stored/bscan.c index 0a029711bb..3702b88d2d 100644 --- a/bacula/src/stored/bscan.c +++ b/bacula/src/stored/bscan.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -27,32 +31,31 @@ #include "stored.h" #include "findlib/find.h" #include "cats/cats.h" -#include "cats/sql_glue.h" extern bool parse_sd_config(CONFIG *config, const char *configfile, int exit_code); /* Forward referenced functions */ static void do_scan(void); static bool record_cb(DCR *dcr, DEV_RECORD *rec); -static int create_file_attributes_record(B_DB *db, JCR *mjcr, +static int create_file_attributes_record(BDB *db, JCR *mjcr, char *fname, char *lname, int type, char *ap, DEV_RECORD *rec); -static int create_media_record(B_DB *db, MEDIA_DBR *mr, VOLUME_LABEL *vl); -static bool update_media_record(B_DB *db, MEDIA_DBR *mr); -static int create_pool_record(B_DB *db, POOL_DBR *pr); -static JCR *create_job_record(B_DB *db, JOB_DBR *mr, SESSION_LABEL *label, DEV_RECORD *rec); -static int update_job_record(B_DB *db, JOB_DBR *mr, SESSION_LABEL *elabel, +static int create_media_record(BDB *db, MEDIA_DBR *mr, VOLUME_LABEL *vl); +static bool update_media_record(BDB *db, MEDIA_DBR *mr); +static int create_pool_record(BDB *db, POOL_DBR *pr); +static JCR *create_job_record(BDB *db, JOB_DBR *mr, SESSION_LABEL *label, DEV_RECORD *rec); +static int update_job_record(BDB *db, JOB_DBR *mr, SESSION_LABEL *elabel, DEV_RECORD *rec); -static int create_client_record(B_DB *db, CLIENT_DBR *cr); -static int create_fileset_record(B_DB *db, FILESET_DBR *fsr); -static int create_jobmedia_record(B_DB *db, JCR *jcr); +static int create_client_record(BDB *db, CLIENT_DBR *cr); +static int create_fileset_record(BDB *db, FILESET_DBR *fsr); +static int create_jobmedia_record(BDB *db, JCR *jcr); static JCR *create_jcr(JOB_DBR *jr, DEV_RECORD *rec, uint32_t JobId); -static int update_digest_record(B_DB *db, char *digest, DEV_RECORD *rec, int type); +static int update_digest_record(BDB *db, char *digest, DEV_RECORD *rec, int type); /* Local variables */ static DEVICE *dev = NULL; -static B_DB *db; +static BDB *db; static JCR *bjcr; /* jcr for bscan */ static BSR *bsr = NULL; static MEDIA_DBR mr; @@ -98,12 +101,11 @@ bool forge_on = false; /* proceed inspite of I/O errors */ pthread_mutex_t device_release_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t wait_device_release = PTHREAD_COND_INITIALIZER; - static void usage() { fprintf(stderr, _( PROG_COPYRIGHT -"\nVersion: %s (%s)\n\n" +"\n%sVersion: %s (%s)\n\n" "Usage: bscan [ options ] \n" " -b bootstrap specify a bootstrap file\n" " -c specify configuration file\n" @@ -124,7 +126,7 @@ PROG_COPYRIGHT " -V specify Volume names (separated by |)\n" " -w specify working directory (default from conf file)\n" " -? print this message\n\n"), - 2001, VERSION, BDATE); + 2001, "", VERSION, BDATE); exit(1); } @@ -281,12 +283,18 @@ int main (int argc, char *argv[]) edit_uint64(currentVolumeSize, ed1)); } - if ((db = db_init_database(NULL, db_driver, db_name, db_user, db_password, - db_host, db_port, NULL, false, false)) == NULL) { - Emsg0(M_ERROR_TERM, 0, _("Could not init Bacula database\n")); - } - if (!db_open_database(NULL, db)) { - Emsg0(M_ERROR_TERM, 0, db_strerror(db)); + db = db_init_database(NULL, db_driver, db_name, db_user, db_password, + db_host, db_port, NULL, false, false); + if (!db || !db_open_database(NULL, db)) { + Pmsg2(000, _("Could not open Catalog \"%s\", database \"%s\".\n"), + db_driver, db_name); + if (db) { + Jmsg(NULL, M_FATAL, 0, _("%s"), db_strerror(db)); + Pmsg1(000, "%s", db_strerror(db)); + db_close_database(NULL, db); + } + Jmsg(NULL, M_ERROR_TERM, 0, _("Could not open Catalog \"%s\", database \"%s\".\n"), + db_driver, db_name); } Dmsg0(200, "Database opened\n"); if (verbose) { @@ -421,7 +429,7 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) bool save_update_db = update_db; if (verbose > 1) { - dump_label_record(dev, rec, 1); + dump_label_record(dev, rec, 1, false); } switch (rec->FileIndex) { case PRE_LABEL: @@ -802,43 +810,43 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) } break; - case STREAM_UNIX_ACCESS_ACL: /* Deprecated Standard ACL attributes on UNIX */ - case STREAM_UNIX_DEFAULT_ACL: /* Deprecated Default ACL attributes on UNIX */ - case STREAM_HFSPLUS_ATTRIBUTES: - case STREAM_ACL_AIX_TEXT: - case STREAM_ACL_DARWIN_ACCESS_ACL: - case STREAM_ACL_FREEBSD_DEFAULT_ACL: - case STREAM_ACL_FREEBSD_ACCESS_ACL: - case STREAM_ACL_HPUX_ACL_ENTRY: - case STREAM_ACL_IRIX_DEFAULT_ACL: - case STREAM_ACL_IRIX_ACCESS_ACL: - case STREAM_ACL_LINUX_DEFAULT_ACL: - case STREAM_ACL_LINUX_ACCESS_ACL: - case STREAM_ACL_TRU64_DEFAULT_ACL: - case STREAM_ACL_TRU64_DEFAULT_DIR_ACL: - case STREAM_ACL_TRU64_ACCESS_ACL: - case STREAM_ACL_SOLARIS_ACLENT: - case STREAM_ACL_SOLARIS_ACE: - case STREAM_ACL_AFS_TEXT: - case STREAM_ACL_AIX_AIXC: - case STREAM_ACL_AIX_NFS4: - case STREAM_ACL_FREEBSD_NFS4_ACL: - case STREAM_ACL_HURD_DEFAULT_ACL: - case STREAM_ACL_HURD_ACCESS_ACL: + case STREAM_UNIX_ACCESS_ACL: /* Deprecated Standard ACL attributes on UNIX */ + case STREAM_UNIX_DEFAULT_ACL: /* Deprecated Default ACL attributes on UNIX */ + case STREAM_HFSPLUS_ATTRIBUTES: + case STREAM_ACL_AIX_TEXT: + case STREAM_ACL_DARWIN_ACCESS: + case STREAM_ACL_FREEBSD_DEFAULT: + case STREAM_ACL_FREEBSD_ACCESS: + case STREAM_ACL_HPUX_ACL_ENTRY: + case STREAM_ACL_IRIX_DEFAULT: + case STREAM_ACL_IRIX_ACCESS: + case STREAM_ACL_LINUX_DEFAULT: + case STREAM_ACL_LINUX_ACCESS: + case STREAM_ACL_TRU64_DEFAULT: + case STREAM_ACL_TRU64_DEFAULT_DIR: + case STREAM_ACL_TRU64_ACCESS: + case STREAM_ACL_SOLARIS_POSIX: + case STREAM_ACL_SOLARIS_NFS4: + case STREAM_ACL_AFS_TEXT: + case STREAM_ACL_AIX_AIXC: + case STREAM_ACL_AIX_NFS4: + case STREAM_ACL_FREEBSD_NFS4: + case STREAM_ACL_HURD_DEFAULT: + case STREAM_ACL_HURD_ACCESS: /* Ignore Unix ACL attributes */ break; - case STREAM_XATTR_HURD: - case STREAM_XATTR_IRIX: - case STREAM_XATTR_TRU64: - case STREAM_XATTR_AIX: - case STREAM_XATTR_OPENBSD: - case STREAM_XATTR_SOLARIS_SYS: - case STREAM_XATTR_SOLARIS: - case STREAM_XATTR_DARWIN: - case STREAM_XATTR_FREEBSD: - case STREAM_XATTR_LINUX: - case STREAM_XATTR_NETBSD: + case STREAM_XATTR_HURD: + case STREAM_XATTR_IRIX: + case STREAM_XATTR_TRU64: + case STREAM_XATTR_AIX: + case STREAM_XATTR_OPENBSD: + case STREAM_XATTR_SOLARIS_SYS: + case STREAM_XATTR_SOLARIS: + case STREAM_XATTR_DARWIN: + case STREAM_XATTR_FREEBSD: + case STREAM_XATTR_LINUX: + case STREAM_XATTR_NETBSD: /* Ignore Unix Extended attributes */ break; @@ -878,7 +886,7 @@ static void bscan_free_jcr(JCR *jcr) * We got a File Attributes record on the tape. Now, lookup the Job * record, and then create the attributes record. */ -static int create_file_attributes_record(B_DB *db, JCR *mjcr, +static int create_file_attributes_record(BDB *db, JCR *mjcr, char *fname, char *lname, int type, char *ap, DEV_RECORD *rec) { @@ -919,7 +927,7 @@ static int create_file_attributes_record(B_DB *db, JCR *mjcr, /* * For each Volume we see, we create a Medium record */ -static int create_media_record(B_DB *db, MEDIA_DBR *mr, VOLUME_LABEL *vl) +static int create_media_record(BDB *db, MEDIA_DBR *mr, VOLUME_LABEL *vl) { struct date_time dt; struct tm tm; @@ -973,7 +981,7 @@ static int create_media_record(B_DB *db, MEDIA_DBR *mr, VOLUME_LABEL *vl) /* * Called at end of media to update it */ -static bool update_media_record(B_DB *db, MEDIA_DBR *mr) +static bool update_media_record(BDB *db, MEDIA_DBR *mr) { if (!update_db && !update_vol_info) { return true; @@ -992,7 +1000,7 @@ static bool update_media_record(B_DB *db, MEDIA_DBR *mr) } -static int create_pool_record(B_DB *db, POOL_DBR *pr) +static int create_pool_record(BDB *db, POOL_DBR *pr) { pr->NumVols++; pr->UseCatalog = 1; @@ -1016,7 +1024,7 @@ static int create_pool_record(B_DB *db, POOL_DBR *pr) /* * Called from SOS to create a client for the current Job */ -static int create_client_record(B_DB *db, CLIENT_DBR *cr) +static int create_client_record(BDB *db, CLIENT_DBR *cr) { /* * Note, update_db can temporarily be set false while @@ -1040,7 +1048,7 @@ static int create_client_record(B_DB *db, CLIENT_DBR *cr) return 1; } -static int create_fileset_record(B_DB *db, FILESET_DBR *fsr) +static int create_fileset_record(BDB *db, FILESET_DBR *fsr) { if (!update_db) { return 1; @@ -1072,7 +1080,7 @@ static int create_fileset_record(B_DB *db, FILESET_DBR *fsr) * the Job record and to update it when the Job actually * begins running. */ -static JCR *create_job_record(B_DB *db, JOB_DBR *jr, SESSION_LABEL *label, +static JCR *create_job_record(BDB *db, JOB_DBR *jr, SESSION_LABEL *label, DEV_RECORD *rec) { JCR *mjcr; @@ -1127,7 +1135,7 @@ static JCR *create_job_record(B_DB *db, JOB_DBR *jr, SESSION_LABEL *label, * Simulate the database call that updates the Job * at Job termination time. */ -static int update_job_record(B_DB *db, JOB_DBR *jr, SESSION_LABEL *elabel, +static int update_job_record(BDB *db, JOB_DBR *jr, SESSION_LABEL *elabel, DEV_RECORD *rec) { struct date_time dt; @@ -1238,7 +1246,7 @@ static int update_job_record(B_DB *db, JOB_DBR *jr, SESSION_LABEL *elabel, return 1; } -static int create_jobmedia_record(B_DB *db, JCR *mjcr) +static int create_jobmedia_record(BDB *db, JCR *mjcr) { JOBMEDIA_DBR jmr; DCR *dcr = mjcr->read_dcr; @@ -1276,7 +1284,7 @@ static int create_jobmedia_record(B_DB *db, JCR *mjcr) /* * Simulate the database call that updates the MD5/SHA1 record */ -static int update_digest_record(B_DB *db, char *digest, DEV_RECORD *rec, int type) +static int update_digest_record(BDB *db, char *digest, DEV_RECORD *rec, int type) { JCR *mjcr; @@ -1339,6 +1347,7 @@ static JCR *create_jcr(JOB_DBR *jr, DEV_RECORD *rec, uint32_t JobId) bool dir_find_next_appendable_volume(DCR *dcr) { return 1;} bool dir_update_volume_info(DCR *dcr, bool relabel, bool update_LastWritten) { return 1; } bool dir_create_jobmedia_record(DCR *dcr, bool zero) { return 1; } +bool flush_jobmedia_queue(JCR *jcr) { return true; } bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) { return 1; } bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { return 1;} bool dir_send_job_status(JCR *jcr) {return 1;} @@ -1360,9 +1369,6 @@ bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw writing) { Dmsg0(100, "Fake dir_get_volume_info\n"); dcr->setVolCatName(dcr->VolumeName); -#ifdef BUILD_DVD - dcr->VolCatInfo.VolCatParts = find_num_dvd_parts(dcr); -#endif - Dmsg2(500, "Vol=%s num_parts=%d\n", dcr->getVolCatName(), dcr->VolCatInfo.VolCatParts); + Dmsg2(500, "Vol=%s VolType=%d\n", dcr->getVolCatName(), dcr->VolCatInfo.VolCatType); return 1; } diff --git a/bacula/src/stored/bsr.h b/bacula/src/stored/bsr.h index 577a268c59..568bfe9c7a 100644 --- a/bacula/src/stored/bsr.h +++ b/bacula/src/stored/bsr.h @@ -1,25 +1,27 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * BootStrap record definition -- for restoring files. * * Kern Sibbald, June 2002 * - * Version $Id$ - * */ @@ -140,6 +142,7 @@ struct BSR { BSR *next; /* pointer to next one */ BSR *prev; /* pointer to previous one */ BSR *root; /* root bsr */ + BSR *cur_bsr; bool reposition; /* set when any bsr is marked done */ bool mount_next_volume; /* set when next volume should be mounted */ bool done; /* set when everything found for this bsr */ @@ -149,6 +152,7 @@ struct BSR { BSR_VOLUME *volume; uint32_t count; /* count of files to restore this bsr */ uint32_t found; /* count of restored files this bsr */ + int32_t LastFI; /* LastFI seen by this bsr */ BSR_VOLFILE *volfile; BSR_VOLBLOCK *volblock; BSR_VOLADDR *voladdr; diff --git a/bacula/src/stored/btape.c b/bacula/src/stored/btape.c index c527467546..f4fa3aa6ef 100644 --- a/bacula/src/stored/btape.c +++ b/bacula/src/stored/btape.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -136,7 +140,6 @@ static int vol_num = 0; static JCR *jcr = NULL; - static void usage(); static void terminate_btape(int sig); int get_cmd(const char *prompt); @@ -1114,7 +1117,7 @@ static bool write_two_files() /* * Set big max_file_size so that write_record_to_block * doesn't insert any additional EOF marks - * Do calculation in 64 bits to avoid overflow. + * Do calculation in 64 bits to avoid overflow. */ dev->max_file_size = (uint64_t)2 * (uint64_t)num_recs * (uint64_t)dev->max_block_size; Pmsg2(-1, _("\n=== Write, rewind, and re-read test ===\n\n" @@ -2952,7 +2955,7 @@ static void usage() { fprintf(stderr, _( PROG_COPYRIGHT -"\nVersion: %s (%s)\n\n" +"\n%sVersion: %s (%s)\n\n" "Usage: btape \n" " -b specify bootstrap file\n" " -c set configuration file to file\n" @@ -2962,7 +2965,7 @@ PROG_COPYRIGHT " -s turn off signals\n" " -v be verbose\n" " -? print this message.\n" -"\n"), 2000, VERSION, BDATE); +"\n"), 2000, "", VERSION, BDATE); } @@ -3004,6 +3007,7 @@ get_cmd(const char *prompt) /* Dummies to replace askdir.c */ bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { return 1;} bool dir_send_job_status(JCR *jcr) {return 1;} +bool flush_jobmedia_queue(JCR *jcr) { return true; } bool dir_update_volume_info(DCR *dcr, bool relabel, bool update_LastWritten) { diff --git a/bacula/src/stored/butil.c b/bacula/src/stored/butil.c index 471d328009..bc9d14a238 100644 --- a/bacula/src/stored/butil.c +++ b/bacula/src/stored/butil.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -30,7 +34,8 @@ #include "stored.h" /* Forward referenced functions */ -static DCR *setup_to_access_device(JCR *jcr, char *dev_name, const char *VolumeName, bool writing); +static DCR *setup_to_access_device(JCR *jcr, char *dev_name, + const char *VolumeName, bool writing, bool read_dedup_data); static DEVRES *find_device_res(char *device_name, bool writing); static void my_free_jcr(JCR *jcr); @@ -84,7 +89,7 @@ void setup_me() * tools (e.g. bls, bextract, bscan, ...) */ JCR *setup_jcr(const char *name, char *dev_name, BSR *bsr, - const char *VolumeName, bool writing) + const char *VolumeName, bool writing, bool read_dedup_data) { DCR *dcr; JCR *jcr = new_jcr(sizeof(JCR), my_free_jcr); @@ -110,7 +115,7 @@ JCR *setup_jcr(const char *name, char *dev_name, BSR *bsr, init_autochangers(); create_volume_lists(); - dcr = setup_to_access_device(jcr, dev_name, VolumeName, writing); + dcr = setup_to_access_device(jcr, dev_name, VolumeName, writing, read_dedup_data); if (!dcr) { return NULL; } @@ -128,7 +133,7 @@ JCR *setup_jcr(const char *name, char *dev_name, BSR *bsr, * the caller will do it. */ static DCR *setup_to_access_device(JCR *jcr, char *dev_name, - const char *VolumeName, bool writing) + const char *VolumeName, bool writing, bool read_dedup_data) { DEVICE *dev; char *p; diff --git a/bacula/src/stored/dev.c b/bacula/src/stored/dev.c index 263a881863..2ff57f8076 100644 --- a/bacula/src/stored/dev.c +++ b/bacula/src/stored/dev.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -79,7 +83,7 @@ extern uint32_t status_dev(DEVICE *dev); /* Forward referenced functions */ const char *mode_to_str(int mode); -DEVICE *m_init_dev(JCR *jcr, DEVRES *device, bool alt); +DEVICE *m_init_dev(JCR *jcr, DEVRES *device); /* * Device types for printing */ @@ -91,8 +95,7 @@ static const char *prt_dev_types[] = { "FIFO", "Vtape", "FTP", - "VTL", - "virtual" + "VTL" }; /* @@ -109,16 +112,16 @@ static const char *prt_dev_types[] = { DEVICE *init_dev(JCR *jcr, DEVRES *device) { generate_global_plugin_event(bsdGlobalEventDeviceInit, device); - DEVICE *dev = m_init_dev(jcr, device, false); + DEVICE *dev = m_init_dev(jcr, device); return dev; } -DEVICE *m_init_dev(JCR *jcr, DEVRES *device, bool alt) +DEVICE *m_init_dev(JCR *jcr, DEVRES *device) { struct stat statp; int errstat; DCR *dcr = NULL; - DEVICE *dev; + DEVICE *dev = NULL; uint32_t max_bs; /* If no device type specified, try to guess */ @@ -151,14 +154,14 @@ DEVICE *m_init_dev(JCR *jcr, DEVRES *device, bool alt) } else { device->dev_type = B_DVD_DEV; } + if (strcmp(device->device_name, "/dev/null") == 0) { + device->dev_type = B_NULL_DEV; + } } switch (device->dev_type) { case B_DVD_DEV: Jmsg0(jcr, M_FATAL, 0, _("DVD support is now deprecated.\n")); return NULL; - case B_VIRTUAL_DEV: - Jmsg0(jcr, M_FATAL, 0, _("Aligned device not supported. Please use \"DeviceType = File\"\n")); - return NULL; case B_VTAPE_DEV: dev = New(vtape); break; @@ -167,26 +170,16 @@ DEVICE *m_init_dev(JCR *jcr, DEVRES *device, bool alt) dev = New(ftp_device); break; #endif -#ifdef xHAVE_WIN32 -/* TODO: defined in src/win32/stored/mtops.cpp */ - case B_TAPE_DEV: - dev = New(win_tape_dev); - break; - case B_FILE_DEV: - dev = New(win_file_dev); - break; -#else case B_TAPE_DEV: dev = New(tape_dev); break; case B_FILE_DEV: case B_FIFO_DEV: + case B_NULL_DEV: dev = New(file_dev); break; - break; -#endif default: - return NULL; + return NULL; } dev->clear_slot(); /* unknown */ @@ -198,6 +191,7 @@ DEVICE *m_init_dev(JCR *jcr, DEVRES *device, bool alt) Mmsg(dev->prt_name, "\"%s\" (%s)", device->hdr.name, device->device_name); Dmsg1(400, "Allocate dev=%s\n", dev->print_name()); dev->capabilities = device->cap_bits; + dev->min_free_space = device->min_free_space; dev->min_block_size = device->min_block_size; dev->max_block_size = device->max_block_size; dev->max_volume_size = device->max_volume_size; @@ -209,6 +203,7 @@ DEVICE *m_init_dev(JCR *jcr, DEVRES *device, bool alt) dev->vol_poll_interval = device->vol_poll_interval; dev->max_spool_size = device->max_spool_size; dev->drive_index = device->drive_index; + dev->enabled = device->enabled; dev->autoselect = device->autoselect; dev->read_only = device->read_only; dev->dev_type = device->dev_type; @@ -222,24 +217,13 @@ DEVICE *m_init_dev(JCR *jcr, DEVRES *device, bool alt) if (dev->vol_poll_interval && dev->vol_poll_interval < 60) { dev->vol_poll_interval = 60; } - /* - * ***FIXME*** remove this when we implement write device - * switching. - * - * We limit aligned Jobs to run one at a time. - * This is required because: - * 1. BlockAddr must be local for each JCR, today it - * is global. - * 2. When flushing buffers, all other processes must - * be locked out, and they currently are not. - * 3. We need to reserve the full space for a job, but - * currently space for only one block is reserved. - * 4. In the case that the file grows, we must be able - * to create multiple references to the correct data - * blocks, if they are not contiguous. - */ - device->dev = dev; + if (!device->dev) { + /* The first time we create a DEVICE from the DEVRES, we keep a pointer + * to the DEVICE accessible from the DEVRES. + */ + device->dev = dev; + } if (dev->is_fifo()) { dev->capabilities |= CAP_STREAM; /* set stream device */ @@ -260,6 +244,11 @@ DEVICE *m_init_dev(JCR *jcr, DEVRES *device, bool alt) if (!device->mount_command || !device->unmount_command) { Jmsg0(jcr, M_ERROR_TERM, 0, _("Mount and unmount commands must defined for a device which requires mount.\n")); } + } + + /* Keep the device ID in the DEVICE struct to identify the hardware */ + if (dev->is_file() && stat(dev->archive_name(), &statp) == 0) { + dev->devno = statp.st_dev; } /* Sanity check */ @@ -394,7 +383,7 @@ bool DEVICE::open(DCR *dcr, int omode) if (is_tape() || is_fifo()) { open_tape_device(dcr, omode); } else if (is_ftp()) { - this->open_device(dcr, omode); + open_device(dcr, omode); } else { Dmsg1(100, "call open_file_device mode=%s\n", mode_to_str(omode)); open_file_device(dcr, omode); @@ -539,12 +528,207 @@ void DEVICE::clear_volhdr() setVolCatInfo(false); } +void DEVICE::set_nospace() +{ + state |= ST_NOSPACE; +} + +void DEVICE::clear_nospace() +{ + state &= ~ST_NOSPACE; +} + +/* Put device in append mode */ +void DEVICE::set_append() +{ + state &= ~(ST_NOSPACE|ST_READ|ST_EOT|ST_EOF|ST_WEOT); /* remove EOF/EOT flags */ + state |= ST_APPEND; +} + +/* Clear append mode */ +void DEVICE::clear_append() +{ + state &= ~ST_APPEND; +} + +/* Put device in read mode */ +void DEVICE::set_read() +{ + state &= ~(ST_APPEND|ST_EOT|ST_EOF|ST_WEOT); /* remove EOF/EOT flags */ + state |= ST_READ; +} + +/* Clear read mode */ +void DEVICE::clear_read() +{ + state &= ~ST_READ; +} + +/* + * Get freespace using OS calls + * TODO: See if it's working with mount commands + */ +bool DEVICE::get_os_device_freespace() +{ + int64_t freespace, totalspace; + + if (!is_file()) { + return true; + } + if (fs_get_free_space(dev_name, &freespace, &totalspace) == 0) { + set_freespace(freespace, totalspace, 0, true); + Mmsg(errmsg, ""); + return true; + + } else { + set_freespace(0, 0, 0, false); /* No valid freespace */ + } + return false; +} + +/* Update the free space on the device */ +bool DEVICE::update_freespace() +{ + POOL_MEM ocmd(PM_FNAME); + POOLMEM* results; + char* icmd; + char* p; + uint64_t free, total; + char ed1[50]; + bool ok = false; + int status; + berrno be; + + if (!is_file()) { + Mmsg(errmsg, ""); + return true; + } + + /* The device must be mounted in order for freespace to work */ + if (requires_mount()) { + mount(1); + } + + if (get_os_device_freespace()) { + Dmsg4(20, "get_os_device_freespace: free_space=%s freespace_ok=%d free_space_errno=%d have_media=%d\n", + edit_uint64(free_space, ed1), !!is_freespace_ok(), free_space_errno, !!have_media()); + return true; + } + + icmd = device->free_space_command; + + if (!icmd) { + set_freespace(0, 0, 0, false); + Dmsg2(20, "ERROR: update_free_space_dev: free_space=%s, free_space_errno=%d (!icmd)\n", + edit_uint64(free_space, ed1), free_space_errno); + Mmsg(errmsg, _("No FreeSpace command defined.\n")); + return false; + } + + edit_mount_codes(ocmd, icmd); + + Dmsg1(20, "update_freespace: cmd=%s\n", ocmd.c_str()); + + results = get_pool_memory(PM_MESSAGE); + + Dmsg1(20, "Run freespace prog=%s\n", ocmd.c_str()); + status = run_program_full_output(ocmd.c_str(), max_open_wait/2, results); + Dmsg2(20, "Freespace status=%d result=%s\n", status, results); + /* Should report "1223232 12323232\n" "free total\n" */ + if (status == 0) { + free = str_to_int64(results) * 1024; + p = results; + + if (skip_nonspaces(&p)) { + total = str_to_int64(p) * 1024; + + } else { + total = 0; + } + + Dmsg1(400, "Free space program run: Freespace=%s\n", results); + if (free >= 0) { + set_freespace(free, total, 0, true); /* have valid freespace */ + Mmsg(errmsg, ""); + ok = true; + } + } else { + set_freespace(0, 0, EPIPE, false); /* no valid freespace */ + Mmsg2(errmsg, _("Cannot run free space command. Results=%s ERR=%s\n"), + results, be.bstrerror(status)); + + dev_errno = free_space_errno; + Dmsg4(20, "Cannot get free space on device %s. free_space=%s, " + "free_space_errno=%d ERR=%s\n", + print_name(), edit_uint64(free_space, ed1), + free_space_errno, errmsg); + } + free_pool_memory(results); + Dmsg4(20, "leave update_freespace: free_space=%s freespace_ok=%d free_space_errno=%d have_media=%d\n", + edit_uint64(free_space, ed1), !!is_freespace_ok(), free_space_errno, !!have_media()); + return ok; +} + +void DEVICE::updateVolCatBytes(uint64_t bytes) +{ + DEVICE *dev = this; + Lock_VolCatInfo(); + dev->VolCatInfo.VolCatAmetaBytes += bytes; + Dmsg1(200, "updateVolBytes ameta=%lld\n", + dev->VolCatInfo.VolCatAmetaBytes); + dev->VolCatInfo.VolCatBytes += bytes; + setVolCatInfo(false); + Unlock_VolCatInfo(); +} + +void DEVICE::updateVolCatBlocks(uint32_t blocks) +{ + DEVICE *dev = this; + Lock_VolCatInfo(); + dev->VolCatInfo.VolCatAmetaBlocks += blocks; + dev->VolCatInfo.VolCatBlocks += blocks; + setVolCatInfo(false); + Unlock_VolCatInfo(); +} + + +void DEVICE::updateVolCatWrites(uint32_t writes) +{ + DEVICE *dev = this; + Lock_VolCatInfo(); + dev->VolCatInfo.VolCatAmetaWrites += writes; + dev->VolCatInfo.VolCatWrites += writes; + setVolCatInfo(false); + Unlock_VolCatInfo(); +} + +void DEVICE::updateVolCatReads(uint32_t reads) +{ + DEVICE *dev = this; + Lock_VolCatInfo(); + dev->VolCatInfo.VolCatAmetaReads += reads; + dev->VolCatInfo.VolCatReads += reads; + setVolCatInfo(false); + Unlock_VolCatInfo(); +} + +void DEVICE::updateVolCatReadBytes(uint64_t bytes) +{ + DEVICE *dev = this; + Lock_VolCatInfo(); + dev->VolCatInfo.VolCatAmetaRBytes += bytes; + dev->VolCatInfo.VolCatRBytes += bytes; + setVolCatInfo(false); + Unlock_VolCatInfo(); +} /* * Close the device */ -void DEVICE::close() +bool DEVICE::close() { + bool ok = true; + Dmsg4(40, "close_dev vol=%s fd=%d dev=%p dev=%s\n", VolHdr.VolumeName, m_fd, this, print_name()); offline_or_rewind(); @@ -552,7 +736,7 @@ void DEVICE::close() if (!is_open()) { Dmsg2(200, "device %s already closed vol=%s\n", print_name(), VolHdr.VolumeName); - return; /* already closed */ + return true; /* already closed */ } switch (dev_type) { @@ -562,12 +746,18 @@ void DEVICE::close() unlock_door(); /* Fall through wanted */ default: - d_close(m_fd); + if (d_close(m_fd) != 0) { + berrno be; + dev_errno = errno; + Mmsg2(errmsg, _("Error closing device %s. ERR=%s.\n"), + print_name(), be.bstrerror()); + ok = false; + } break; } - unmount(1); /* do unmount if required */ - + unmount(1); /* do unmount if required */ + /* Clean up device packet so it can be reused */ clear_opened(); @@ -589,6 +779,7 @@ void DEVICE::close() stop_thread_timer(tid); tid = 0; } + return ok; } /* @@ -613,70 +804,30 @@ void DEVICE::close_part(DCR * /*dcr*/) VolCatInfo = saveVolCatInfo; /* structure assignment */ } -/* - * Mount the device. +/* * If timeout, wait until the mount command returns 0. * If !timeout, try to mount the device only once. */ bool DEVICE::mount(int timeout) { Dmsg0(190, "Enter mount\n"); - - if (is_mounted()) { - return true; - } - - switch (dev_type) { - case B_VTL_DEV: - case B_VTAPE_DEV: - case B_TAPE_DEV: - if (device->mount_command) { - return do_tape_mount(1, timeout); - } - break; - case B_FILE_DEV: - if (requires_mount() && device->mount_command) { - return do_file_mount(1, timeout); - } - break; - default: - break; - } - + if (!is_mounted() && device->mount_command) { + return mount_file(1, timeout); + } return true; } -/* - * Unmount the device +/* + * Unmount the device * If timeout, wait until the unmount command returns 0. * If !timeout, try to unmount the device only once. */ bool DEVICE::unmount(int timeout) { Dmsg0(100, "Enter unmount\n"); - - if (!is_mounted()) { - return true; - } - - switch (dev_type) { - case B_VTL_DEV: - case B_VTAPE_DEV: - case B_TAPE_DEV: - if (device->unmount_command) { - return do_tape_mount(0, timeout); - } - break; - case B_FILE_DEV: - case B_DVD_DEV: - if (requires_mount() && device->unmount_command) { - return do_file_mount(0, timeout); - } - break; - default: - break; - } - + if (is_mounted() && requires_mount() && device->unmount_command) { + return mount_file(0, timeout); + } return true; } @@ -813,7 +964,7 @@ uint32_t DEVICE::get_file() if (is_dvd() || is_tape()) { return file; } else { - uint64_t bytes = VolCatInfo.VolCatAmetaBytes; + uint64_t bytes = VolCatInfo.VolCatAdataBytes + VolCatInfo.VolCatAmetaBytes; return (uint32_t)(bytes >> 32); } } @@ -823,7 +974,7 @@ uint32_t DEVICE::get_block_num() if (is_dvd() || is_tape()) { return block_num; } else { - return VolCatInfo.VolCatAmetaBlocks; + return VolCatInfo.VolCatAdataBlocks + VolCatInfo.VolCatAmetaBlocks; } } @@ -898,11 +1049,13 @@ void DEVICE::term(void) pthread_cond_destroy(&wait); pthread_cond_destroy(&wait_next_vol); pthread_mutex_destroy(&spool_mutex); + pthread_mutex_destroy(&freespace_mutex); if (attached_dcrs) { delete attached_dcrs; attached_dcrs = NULL; } - if (device) { + /* We let the DEVRES pointer if not our device */ + if (device && device->dev == this) { device->dev = NULL; } delete this; @@ -911,6 +1064,35 @@ void DEVICE::term(void) } } +/* Get freespace values */ +void DEVICE::get_freespace(uint64_t *freeval, uint64_t *totalval) +{ + get_os_device_freespace(); + P(freespace_mutex); + if (is_freespace_ok()) { + *freeval = free_space; + *totalval = total_space; + } else { + *freeval = *totalval = 0; + } + V(freespace_mutex); +} + +/* Set freespace values */ +void DEVICE::set_freespace(uint64_t freeval, uint64_t totalval, int errnoval, bool valid) +{ + P(freespace_mutex); + free_space = freeval; + total_space = totalval; + free_space_errno = errnoval; + if (valid) { + set_freespace_ok(); + } else { + clear_freespace_ok(); + } + V(freespace_mutex); +} + /* * This routine initializes the device wait timers */ diff --git a/bacula/src/stored/dev.h b/bacula/src/stored/dev.h index f773267ddd..ef24f3ef68 100644 --- a/bacula/src/stored/dev.h +++ b/bacula/src/stored/dev.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Definitions for using the Device functions in Bacula @@ -79,8 +83,8 @@ enum { B_FIFO_DEV, B_VTAPE_DEV, /* change to B_TAPE_DEV after init */ B_FTP_DEV, - B_VTL_DEV, - B_VIRTUAL_DEV /* Virtual device */ + B_VTL_DEV, /* Virtual tape library device */ + B_NULL_DEV }; /* Generic status bits returned from status_dev() */ @@ -118,7 +122,7 @@ enum { #define CAP_CLOSEONPOLL (1<<18) /* Close device on polling */ #define CAP_POSITIONBLOCKS (1<<19) /* Use block positioning */ #define CAP_MTIOCGET (1<<20) /* Basic support for fileno and blkno */ -#define CAP_REQMOUNT (1<<21) /* Require mount/unmount */ +#define CAP_REQMOUNT (1<<21) /* Require mount and unmount */ #define CAP_CHECKLABELS (1<<22) /* Check for ANSI/IBM labels */ #define CAP_BLOCKCHECKSUM (1<<23) /* Create/test block checksum */ @@ -155,19 +159,28 @@ struct VOLUME_CAT_INFO { /* Media info for the current Volume */ uint64_t VolCatBytes; /* Total bytes written */ uint64_t VolCatAmetaBytes; /* Ameta bytes written */ + uint64_t VolCatAdataBytes; /* Adata bytes written */ uint64_t VolCatPadding; /* Total padding bytes written */ + uint64_t VolCatAmetaPadding; /* Ameta zeros (padding) written */ + uint64_t VolCatAdataPadding; /* Adata zeros (padding) written */ uint32_t VolCatBlocks; /* Total blocks */ uint32_t VolCatAmetaBlocks; /* Ameta blocks */ + uint32_t VolCatAdataBlocks; /* Adata blocks */ uint32_t VolCatWrites; /* Total writes this volume */ uint32_t VolCatAmetaWrites; /* Ameta writes this volume */ + uint32_t VolCatAdataWrites; /* Adata writes this volume */ uint32_t VolCatReads; /* Total reads this volume */ uint32_t VolCatAmetaReads; /* Ameta reads this volume */ + uint32_t VolCatAdataReads; /* Adata reads this volume */ uint64_t VolCatRBytes; /* Total bytes read */ uint64_t VolCatAmetaRBytes; /* Ameta bytes read */ + uint64_t VolCatAdataRBytes; /* Adata bytes read */ + uint64_t VolCatHoleBytes; /* Total hole bytes */ + uint32_t VolCatHoles; /* Number of holes */ uint32_t VolCatJobs; /* Number of jobs on this Volume */ uint32_t VolCatFiles; /* Number of files */ - uint32_t VolCatParts; /* Number of parts written */ + uint32_t VolCatType; /* Volume drive type */ uint32_t VolCatMounts; /* Number of mounts this volume */ uint32_t VolCatErrors; /* Number of errors this volume */ uint32_t VolCatRecycles; /* Number of recycles this volume */ @@ -207,17 +220,18 @@ private: int m_blocked; /* set if we must wait (i.e. change tape) */ int m_count; /* Mutex use count -- DEBUG only */ int m_num_reserved; /* counter of device reservations */ - bool m_append_reserve; /* reserved for append or read in m_num_reserved set */ - int32_t m_slot; /* slot loaded in drive or -1 if none */ pthread_t m_pid; /* Thread that locked -- DEBUG only */ + int32_t m_slot; /* slot loaded in drive or -1 if none */ bool m_unload; /* set when Volume must be unloaded */ bool m_load; /* set when Volume must be loaded */ bool m_wait; /* must wait for device to free volume */ + bool m_append_reserve; /* reserved for append or read in m_num_reserved set */ bthread_mutex_t m_mutex; /* access control */ bthread_mutex_t acquire_mutex; /* mutex for acquire code */ pthread_mutex_t read_acquire_mutex; /* mutex for acquire read code */ pthread_mutex_t volcat_mutex; /* VolCatInfo mutex */ pthread_mutex_t dcrs_mutex; /* Attached dcr mutex */ + pthread_mutex_t freespace_mutex; /* mutex to compute the freespace */ public: DEVICE() {}; @@ -237,14 +251,10 @@ public: int mode; /* read/write modes */ int openmode; /* parameter passed to open_dev (useful to reopen the device) */ int dev_type; /* device type */ + bool enabled; /* Set when enabled */ bool autoselect; /* Autoselect in autochanger */ bool read_only; /* Device is read only */ bool initiated; /* set when init_dev() called */ - bool m_shstore; /* Shares storage can be used */ - bool m_shstore_lock; /* set if shared lock set */ - bool m_shstore_user_lock; /* set if user set shared lock */ - bool m_shstore_register; /* set if register key set */ - bool m_shstore_blocked; /* Set if I am blocked */ int label_type; /* Bacula/ANSI/IBM label types */ uint32_t drive_index; /* Autochanger drive index (base 0) */ POOLMEM *dev_name; /* Physical device name */ @@ -275,6 +285,8 @@ public: uint32_t num_dvd_parts; /* number of parts WRITTEN on the DVD */ /* state ST_FREESPACE_OK is set if free_space is valid */ uint64_t free_space; /* current free space on device */ + uint64_t total_space; /* current used space on device */ + uint64_t devno; /* device id */ uint64_t min_free_space; /* Minimum free disk space */ int free_space_errno; /* indicates errno getting freespace */ bool truncating; /* if set, we are currently truncating the DVD */ @@ -320,15 +332,16 @@ public: int is_autochanger() const { return capabilities & CAP_AUTOCHANGER; } int requires_mount() const { return capabilities & CAP_REQMOUNT; } int is_removable() const { return capabilities & CAP_REM; } - int is_tape() const { return (dev_type == B_TAPE_DEV || + bool is_tape() const { return (dev_type == B_TAPE_DEV || dev_type == B_VTAPE_DEV); } - int is_ftp() const { return dev_type == B_FTP_DEV; } - int is_file() const { return (dev_type == B_FILE_DEV); } - int is_fifo() const { return dev_type == B_FIFO_DEV; } - int is_dvd() const { return dev_type == B_DVD_DEV; } - int is_vtl() const { return dev_type == B_VTL_DEV; } - int is_vtape() const { return dev_type == B_VTAPE_DEV; } - int is_open() const { return m_fd >= 0; } + bool is_ftp() const { return dev_type == B_FTP_DEV; } + bool is_file() const { return (dev_type == B_FILE_DEV); } + bool is_null() const { return dev_type == B_NULL_DEV; } + bool is_fifo() const { return dev_type == B_FIFO_DEV; } + bool is_dvd() const { return dev_type == B_DVD_DEV; } + bool is_vtl() const { return dev_type == B_VTL_DEV; } + bool is_vtape() const { return dev_type == B_VTAPE_DEV; } + bool is_open() const { return m_fd >= 0; } int is_offline() const { return state & ST_OFFLINE; } int is_labeled() const { return state & ST_LABEL; } int is_mounted() const { return state & ST_MOUNTED; } @@ -382,6 +395,8 @@ public: void set_part_spooled(int val) { if (val) state |= ST_PART_SPOOLED; \ else state &= ~ST_PART_SPOOLED; }; + void get_freespace(uint64_t *freeval, uint64_t *totalval); /* in dev.c */ + void set_freespace(uint64_t freeval, uint64_t totalval, int errnoval, bool valid); /* in dev.c */ bool is_volume_to_unload() const { \ return m_unload && strcmp(VolHdr.VolumeName, UnloadVolName) == 0; }; void set_load() { m_load = true; }; @@ -422,6 +437,7 @@ public: void clearVolCatBytes() { VolCatInfo.VolCatBytes = 0; VolCatInfo.VolCatAmetaBytes = 0; + VolCatInfo.VolCatAdataBytes = 0; }; char *getVolCatName() { return VolCatInfo.VolCatName; }; @@ -438,8 +454,6 @@ public: void term(void); /* in dev.c */ ssize_t read(void *buf, size_t len); /* in dev.c */ ssize_t write(const void *buf, size_t len); /* in dev.c */ - bool mount(int timeout); /* in dev.c */ - bool unmount(int timeout); /* in dev.c */ void edit_mount_codes(POOL_MEM &omsg, const char *imsg); /* in dev.c */ bool offline_or_rewind(); /* in dev.c */ bool eod(DCR *dcr); /* in dev.c */ @@ -451,6 +465,8 @@ public: void clrerror(int func); /* in dev.c */ void set_slot(int32_t slot); /* in dev.c */ void clear_slot(); /* in dev.c */ + bool update_freespace(); /* in dev.c */ + bool get_os_device_freespace(); /* in dev.c */ void notify_newvol_in_attached_dcrs(const char *VolumeName); /* in dev.c */ void notify_newfile_in_attached_dcrs();/* in dev.c */ void attach_dcr_to_dev(DCR *dcr); /* in acquire.c */ @@ -461,11 +477,14 @@ public: void updateVolCatWrites(uint32_t); /* in dev.c */ void updateVolCatReads(uint32_t); /* in dev.c */ void updateVolCatReadBytes(uint64_t); /* in dev.c */ + void updateVolCatPadding(uint64_t); /* in dev.c */ + void updateVolCatHoleBytes(uint64_t); /* in dev.c */ uint32_t get_file(); /* in dev.c */ uint32_t get_block_num(); /* in dev.c */ int fd() const { return m_fd; }; + bool mount_file(int mount, int dottimout); /* Virtual functions that can be overridden */ virtual int d_ioctl(int fd, ioctl_req_t request, char *mt_com=NULL); @@ -478,8 +497,11 @@ public: virtual bool rewind(DCR *dcr); virtual bool truncate(DCR *dcr); virtual void open_device(DCR *dcr, int omode); - virtual void close(); /* in dev.c */ + virtual bool close(); /* in dev.c */ virtual bool open(DCR *dcr, int mode); /* in dev.c */ + virtual bool mount(int timeout); + virtual bool unmount(int timeout); + /* These could probably be made tape_dev only */ virtual bool bsf(int count) { return true; } @@ -489,7 +511,6 @@ public: virtual void unlock_door() { return; } virtual bool reposition(DCR *dcr, uint32_t rfile, uint32_t rblock); - /* * Locking and blocking calls */ @@ -527,6 +548,7 @@ public: int init_read_acquire_mutex(); /* in lock.c */ int init_volcat_mutex(); /* in lock.c */ int init_dcrs_mutex(); /* in lock.c */ + int init_freespace_mutex(); /* in lock.c */ void set_mutex_priorities(); /* in lock.c */ int next_vol_timedwait(const struct timespec *timeout); /* in lock.c */ void dblock(int why); /* in lock.c */ @@ -536,17 +558,17 @@ public: int blocked() const { return m_blocked; }; bool is_blocked() const { return m_blocked != BST_NOT_BLOCKED; }; const char *print_blocked() const; /* in dev.c */ - void open_tape_device(DCR *dcr, int omode); /* in dev.c */ - void open_file_device(DCR *dcr, int omode); /* in dev.c */ + void open_tape_device(DCR *dcr, int omode); /* in dev.c */ + void open_file_device(DCR *dcr, int omode); /* in dev.c */ private: - bool do_tape_mount(int mount, int dotimeout); /* in dev.c */ - bool do_file_mount(int mount, int dotimeout); /* in dev.c */ - void set_mode(int omode); /* in dev.c */ + bool mount_tape(int mount, int dotimeout); /* in dev.c */ +protected: + void set_mode(int omode); /* in dev.c */ }; inline const char *DEVICE::strerror() const { return errmsg; } inline const char *DEVICE::archive_name() const { return dev_name; } -inline const char *DEVICE::print_name() const { return prt_name; } +inline const char *DEVICE::print_name() const { return NPRT(prt_name); } #define CHECK_BLOCK_NUMBERS true @@ -579,6 +601,7 @@ public: DEVICE *ameta_dev; /* pointer to ameta_dev */ DEVRES *device; /* pointer to device resource */ DEV_BLOCK *block; /* pointer to block */ + DEV_BLOCK *ameta_block; /* meta data block */ DEV_RECORD *rec; /* pointer to record */ pthread_t tid; /* Thread running this dcr */ int spool_fd; /* fd if spooling */ @@ -593,6 +616,7 @@ public: bool any_volume; /* Any OK for dir_find_next... */ bool attached_to_dev; /* set when attached to dev */ bool keep_dcr; /* do not free dcr in release_dcr */ + bool no_mount_request; /* do not submit any mount request */ uint32_t VolFirstIndex; /* First file index this Volume */ uint32_t VolLastIndex; /* Last file index this Volume */ uint32_t FileIndex; /* Current File Index */ @@ -613,7 +637,9 @@ public: VOLUME_CAT_INFO VolCatInfo; /* Catalog info for desired volume */ /* Methods */ + void set_no_mount_request() { no_mount_request = true; }; /* Just fail in case of mount request */ void set_dev(DEVICE *ndev) { dev = ndev; ameta_dev = ndev; }; + void set_ameta() { dev = ameta_dev; block = ameta_block; }; void set_dev_locked() { m_dev_locked = true; }; void set_writing() { m_writing = true; }; void clear_writing() { m_writing = false; }; @@ -634,6 +660,7 @@ public: setVolCatInfo(false); }; char *getVolCatName() { return VolCatInfo.VolCatName; }; + bool write_final_block_to_device() { return write_block_to_device(true); }; /* Methods in autochanger.c */ bool is_virtual_autochanger(); @@ -679,7 +706,7 @@ public: /* Methods in block.c */ void free_blocks(); - bool write_block_to_device(); + bool write_block_to_device(bool final=false); bool write_block_to_dev(); bool read_block_from_device(bool check_block_numbers); bool read_block_from_dev(bool check_block_numbers); @@ -703,4 +730,4 @@ public: #endif #endif -#endif +#endif /* __DEV_H */ diff --git a/bacula/src/stored/device.c b/bacula/src/stored/device.c index 3743bcee90..90a11cfb38 100644 --- a/bacula/src/stored/device.c +++ b/bacula/src/stored/device.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -44,17 +48,8 @@ */ #include "bacula.h" /* pull in global headers */ -#ifdef HAVE_SYS_STATVFS_H -#include -#else -#define statvfs statfs -#endif -/* statvfs.h defines ST_APPEND, which is also used by Bacula */ -#undef ST_APPEND - #include "stored.h" /* pull in Storage Deamon headers */ - /* Forward referenced functions */ /* @@ -83,6 +78,7 @@ bool fixup_device_block_write_error(DCR *dcr, int retries) char PrevVolName[MAX_NAME_LENGTH]; DEV_BLOCK *label_blk; DEV_BLOCK *block; + DEV_BLOCK *ameta_block = dcr->ameta_block; char b1[30], b2[30]; time_t wait_time; char dt[MAX_TIME_LENGTH]; @@ -114,7 +110,7 @@ bool fixup_device_block_write_error(DCR *dcr, int retries) bstrncpy(dev->VolHdr.PrevVolumeName, PrevVolName, sizeof(dev->VolHdr.PrevVolumeName)); label_blk = new_block(dev); - dcr->block = label_blk; + dcr->ameta_block = dcr->block = label_blk; /* Inform User about end of medium */ Jmsg(jcr, M_INFO, 0, _("End of medium on Volume \"%s\" Bytes=%s Blocks=%s at %s.\n"), @@ -132,6 +128,7 @@ bool fixup_device_block_write_error(DCR *dcr, int retries) if (!dcr->mount_next_write_volume()) { free_block(label_blk); dcr->block = block; + dcr->ameta_block = ameta_block; dev->Lock(); goto bail_out; } @@ -159,10 +156,12 @@ bool fixup_device_block_write_error(DCR *dcr, int retries) be.bstrerror(dev->dev_errno)); free_block(label_blk); dcr->block = block; + dcr->ameta_block = ameta_block; goto bail_out; } free_block(label_blk); dcr->block = block; + dcr->ameta_block = ameta_block; /* Clear NewVol now because dir_get_volume_info() already done */ jcr->dcr->NewVol = false; @@ -204,12 +203,9 @@ void set_start_vol_position(DCR *dcr) DEVICE *dev = dcr->dev; /* Set new start position */ if (dev->is_tape()) { - dcr->StartBlock = dev->block_num; - dcr->StartFile = dev->file; + dcr->StartBlock = dcr->EndBlock = dev->block_num; + dcr->StartFile = dcr->EndFile = dev->file; } else { - /* - * Note: we only update the DCR values for blocks - */ dcr->StartBlock = dcr->EndBlock = (uint32_t)dev->file_addr; dcr->StartFile = dcr->EndFile = (uint32_t)(dev->file_addr >> 32); } @@ -314,7 +310,7 @@ bail_out: /* * Make sure device is open, if not do so */ -bool open_dev(DCR *dcr) +bool open_device(DCR *dcr) { DEVICE *dev = dcr->dev; /* Open device */ @@ -338,96 +334,3 @@ bool open_dev(DCR *dcr) } return true; } - -/* - */ -void DEVICE::updateVolCatBytes(uint64_t bytes) -{ - DEVICE *dev; - Lock_VolCatInfo(); - dev = this; - dev->VolCatInfo.VolCatAmetaBytes += bytes; - dev->VolCatInfo.VolCatBytes += bytes; - setVolCatInfo(false); - Unlock_VolCatInfo(); -} - -void DEVICE::updateVolCatBlocks(uint32_t blocks) -{ - DEVICE *dev; - Lock_VolCatInfo(); - dev = this; - dev->VolCatInfo.VolCatAmetaBlocks += blocks; - dev->VolCatInfo.VolCatBlocks += blocks; - setVolCatInfo(false); - Unlock_VolCatInfo(); -} - -void DEVICE::updateVolCatWrites(uint32_t writes) -{ - DEVICE *dev; - Lock_VolCatInfo(); - dev = this; - dev->VolCatInfo.VolCatAmetaWrites += writes; - dev->VolCatInfo.VolCatWrites += writes; - setVolCatInfo(false); - Unlock_VolCatInfo(); -} - -void DEVICE::updateVolCatReads(uint32_t reads) -{ - DEVICE *dev; - Lock_VolCatInfo(); - dev = this; - dev->VolCatInfo.VolCatAmetaReads += reads; - dev->VolCatInfo.VolCatReads += reads; - setVolCatInfo(false); - Unlock_VolCatInfo(); -} - -void DEVICE::updateVolCatReadBytes(uint64_t bytes) -{ - DEVICE *dev; - Lock_VolCatInfo(); - dev = this; - dev->VolCatInfo.VolCatAmetaRBytes += bytes; - dev->VolCatInfo.VolCatRBytes += bytes; - setVolCatInfo(false); - Unlock_VolCatInfo(); -} - -void DEVICE::set_nospace() -{ - state |= ST_NOSPACE; -} - -void DEVICE::clear_nospace() -{ - state &= ~ST_NOSPACE; -} - -/* Put device in append mode */ -void DEVICE::set_append() -{ - state &= ~(ST_NOSPACE|ST_READ|ST_EOT|ST_EOF|ST_WEOT); /* remove EOF/EOT flags */ - state |= ST_APPEND; -} - -/* Clear append mode */ -void DEVICE::clear_append() -{ - state &= ~ST_APPEND; -} - -/* Put device in read mode */ -void DEVICE::set_read() -{ - state &= ~(ST_APPEND|ST_EOT|ST_EOF|ST_WEOT); /* remove EOF/EOT flags */ - state |= ST_READ; -} - -/* Clear read mode */ -void DEVICE::clear_read() -{ - state &= ~ST_READ; -} diff --git a/bacula/src/stored/dircmd.c b/bacula/src/stored/dircmd.c index 0d4a065fe4..dee3a03610 100644 --- a/bacula/src/stored/dircmd.c +++ b/bacula/src/stored/dircmd.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * This file handles accepting Director Commands @@ -72,6 +76,8 @@ static bool setdebug_cmd(JCR *jcr); static bool cancel_cmd(JCR *cjcr); static bool mount_cmd(JCR *jcr); static bool unmount_cmd(JCR *jcr); +static bool enable_cmd(JCR *jcr); +static bool disable_cmd(JCR *jcr); //static bool action_on_purge_cmd(JCR *jcr); static bool bootstrap_cmd(JCR *jcr); static bool changer_cmd(JCR *sjcr); @@ -110,6 +116,8 @@ static struct s_cmds cmds[] = { {".die", die_cmd, 0}, {"label", label_cmd, 0}, /* label a tape */ {"mount", mount_cmd, 0}, + {"enable", enable_cmd, 0}, + {"disable", disable_cmd, 0}, {"readlabel", readlabel_cmd, 0}, {"release", release_cmd, 0}, {"relabel", relabel_cmd, 0}, /* relabel a tape */ @@ -130,7 +138,7 @@ static struct s_cmds cmds[] = { * Connection request. We accept connections either from the * Director or a Client (File daemon). * - * Note, we are running as a seperate thread of the Storage daemon. + * Note, we are running as a separate thread of the Storage daemon. * and it is because a Director has made a connection with * us on the "Message" channel. * @@ -147,10 +155,8 @@ void *handle_connection_request(void *arg) BSOCK *bs = (BSOCK *)arg; JCR *jcr; int i; - int fd_version, sd_version; bool found, quit; int bnet_stat = 0; - char name[500]; char tbuf[100]; if (bs->recv() <= 0) { @@ -160,31 +166,9 @@ void *handle_connection_request(void *arg) return NULL; } - /* - * Do a sanity check on the message received - */ - if (bs->msglen < 25 || bs->msglen > (int)sizeof(name)) { - Pmsg1(000, "msg); - Jmsg2(NULL, M_ERROR, 0, _("Invalid connection from %s. Len=%d\n"), bs->who(), bs->msglen); - bmicrosleep(5, 0); /* make user wait 5 seconds */ - bs->destroy(); - return NULL; - } - - Dmsg1(100, "Conn: %s", bs->msg); - fd_version = 0; - sd_version = 0; - /* - * See if this is a File daemon connection. If so - * call FD handler. - */ - if (sscanf(bs->msg, "Hello Bacula SD: Start Job %127s %d %d", name, &fd_version, &sd_version) == 3 || - sscanf(bs->msg, "Hello FD: Bacula Storage calling Start Job %127s %d", name, &sd_version) == 2 || - sscanf(bs->msg, "Hello Start Job %127s", name) == 1) { - Dmsg1(050, "Got a FD connection at %s\n", bstrftimes(tbuf, sizeof(tbuf), - (utime_t)time(NULL))); - Dmsg1(50, "%s", bs->msg); - handle_filed_connection(bs, name, fd_version, sd_version); + /* Check for client connection */ + if (is_client_connection(bs)) { + handle_client_connection(bs); return NULL; } @@ -197,6 +181,7 @@ void *handle_connection_request(void *arg) jcr->dir_bsock = bs; /* save Director bsock */ jcr->dir_bsock->set_jcr(jcr); jcr->dcrs = New(alist(10, not_owned_by_alist)); + create_jobmedia_queue(jcr); /* Initialize FD start condition variable */ int errstat = pthread_cond_init(&jcr->job_start_wait, NULL); if (errstat != 0) { @@ -208,9 +193,11 @@ void *handle_connection_request(void *arg) Dmsg0(1000, "stored in start_job\n"); /* - * Authenticate the Director + * Validate then authenticate the Director */ - /* We should have: Hello SD: Bacula Director calling */ + if (!validate_dir_hello(jcr)) { + goto bail_out; + } if (!authenticate_director(jcr)) { Jmsg(jcr, M_FATAL, 0, _("Unable to authenticate Director\n")); goto bail_out; @@ -255,6 +242,7 @@ void *handle_connection_request(void *arg) bail_out: generate_daemon_event(jcr, "JobEnd"); generate_plugin_event(jcr, bsdEventJobEnd); + flush_jobmedia_queue(jcr); dequeue_messages(jcr); /* send any queued messages */ bs->signal(BNET_TERMINATE); free_plugins(jcr); /* release instantiated plugins */ @@ -290,6 +278,7 @@ static bool die_cmd(JCR *jcr) /* * Get address of client from Director + * This initiates SD Calls Client. * We attempt to connect to the client (an FD or SD) and * authenticate it. */ @@ -326,10 +315,12 @@ static bool client_cmd(JCR *jcr) } Dmsg0(110, "SD connection OK to Client.\n"); - /* Send Hello */ - cl->fsend("Hello FD: Bacula Storage calling Start Job %s 1\n", jcr->Job); jcr->file_bsock = cl; jcr->file_bsock->set_jcr(jcr); + if (!send_hello_client(jcr, jcr->Job)) { + goto bail_out; + } + /* Send OK to Director */ return dir->fsend(OKclient); @@ -400,7 +391,11 @@ static bool storage_cmd(JCR *jcr) } } - if (!authenticate_storagedaemon(jcr, Job)) { + if (!send_hello_sd(jcr, Job)) { + goto bail_out; + } + + if (!authenticate_storagedaemon(jcr)) { goto bail_out; } /* @@ -430,16 +425,16 @@ bail_out: static bool setdebug_cmd(JCR *jcr) { BSOCK *dir = jcr->dir_bsock; - int32_t trace_flag, lvl, hangup; /* hangup is ignored right now */ - int64_t level; + int32_t trace_flag, lvl, hangup, blowup; + int64_t level, level_tags = 0; char options[60]; char tags[512]; *tags = *options = 0; Dmsg1(10, "setdebug_cmd: %s", dir->msg); - if (sscanf(dir->msg, "setdebug=%ld trace=%ld hangup=%ld options=%55s tags=%511s", - &lvl, &trace_flag, &hangup, options, tags) != 5) + if (sscanf(dir->msg, "setdebug=%ld trace=%ld hangup=%ld blowup=%ld options=%55s tags=%511s", + &lvl, &trace_flag, &hangup, &blowup, options, tags) != 6) { if (sscanf(dir->msg, "setdebug=%ld trace=%ld", &lvl, &trace_flag) != 2 || lvl < 0) { dir->fsend(_("3991 Bad setdebug command: %s\n"), dir->msg); @@ -448,11 +443,16 @@ static bool setdebug_cmd(JCR *jcr) } level = lvl; set_trace(trace_flag); + set_hangup(hangup); + set_blowup(blowup); set_debug_flags(options); - if (!debug_parse_tags(tags, &level)) { + if (!debug_parse_tags(tags, &level_tags)) { *tags = 0; } - debug_level = level; + if (level >= 0) { + debug_level = level; + } + debug_level_tags = level_tags; return dir->fsend(OKsetdebug, lvl, trace_flag, options, tags); } @@ -475,6 +475,9 @@ static bool cancel_cmd(JCR *cjcr) if (sscanf(dir->msg, "cancel Job=%127s", Job) == 1) { status = JS_Canceled; reason = "canceled"; + } else if (sscanf(dir->msg, "stop Job=%127s", Job) == 1) { + status = JS_Incomplete; + reason = "stopped"; } else { dir->fsend(_("3903 Error scanning cancel command.\n")); goto bail_out; @@ -619,7 +622,6 @@ static void label_volume_if_ok(DCR *dcr, char *oldname, int label_status; int mode; const char *volname = (relabel == 1) ? oldname : newname; - char ed1[50]; steal_device_lock(dev, &hold, BST_WRITING_LABEL); Dmsg1(100, "Stole device %s lock, writing label.\n", dev->print_name()); @@ -683,9 +685,15 @@ static void label_volume_if_ok(DCR *dcr, char *oldname, } bstrncpy(dcr->VolumeName, newname, sizeof(dcr->VolumeName)); /* The following 3000 OK label. string is scanned in ua_label.c */ - dir->fsend("3000 OK label. VolBytes=%s DVD=%d Volume=\"%s\" Device=%s\n", - edit_uint64(dev->VolCatInfo.VolCatBytes, ed1), - dev->is_dvd()?1:0, newname, dev->print_name()); + int type; + if (dev->dev_type == B_FILE_DEV) { + type = dev->dev_type; + } else { + type = 0; + } + dir->fsend("3000 OK label. VolBytes=%lld VolABytes=%lld VolType=%d Volume=\"%s\" Device=%s\n", + dev->VolCatInfo.VolCatBytes, dev->VolCatInfo.VolCatAdataBytes, + type, newname, dev->print_name()); break; case VOL_TYPE_ERROR: dir->fsend(_("3915 Failed to label Volume: ERR=%s\n"), dev->errmsg); @@ -695,7 +703,7 @@ static void label_volume_if_ok(DCR *dcr, char *oldname, break; default: dir->fsend(_("3913 Cannot label Volume. " -"Unknown status %d from read_volume_label()\n"), label_status); + "Unknown status %d from read_volume_label()\n"), label_status); break; } @@ -796,6 +804,9 @@ static DCR *find_device(JCR *jcr, POOL_MEM &devname, if (!device->dev->autoselect) { Dmsg1(100, "Device %s not autoselect skipped.\n", devname.c_str()); continue; /* device is not available */ + } else if (!device->dev->enabled) { + Dmsg1(100, "Device %s disabled skipped.\n", devname.c_str()); + continue; /* device disabled */ } if ((drive < 0 || drive == (int)device->dev->drive_index) && (!media_type || strcmp(device->media_type, media_type) ==0)) { @@ -819,7 +830,6 @@ static DCR *find_device(JCR *jcr, POOL_MEM &devname, return dcr; } - /* * Mount command from Director */ @@ -829,16 +839,18 @@ static bool mount_cmd(JCR *jcr) BSOCK *dir = jcr->dir_bsock; DEVICE *dev; DCR *dcr; - int32_t drive; - int32_t slot = 0; + int32_t drive; /* device index */ + int32_t slot; bool ok; + Dmsg1(100, "%s\n", dir->msg); ok = sscanf(dir->msg, "mount %127s drive=%d slot=%d", devname.c_str(), &drive, &slot) == 3; if (!ok) { + slot = 0; ok = sscanf(dir->msg, "mount %127s drive=%d", devname.c_str(), &drive) == 2; } - Dmsg3(100, "ok=%d drive=%d slot=%d\n", ok, drive, slot); + Dmsg3(100, "ok=%d device_index=%d slot=%d\n", ok, drive, slot); if (ok) { dcr = find_device(jcr, devname, NULL, drive); if (dcr) { @@ -979,6 +991,71 @@ static bool mount_cmd(JCR *jcr) return true; } +/* enable command from Director */ +static bool enable_cmd(JCR *jcr) +{ + POOL_MEM devname; + BSOCK *dir = jcr->dir_bsock; + DEVICE *dev; + DCR *dcr; + int32_t drive; + bool ok; + + ok = sscanf(dir->msg, "enable %127s drive=%d", devname.c_str(), + &drive) == 2; + Dmsg3(100, "ok=%d device=%s device_index=%d\n", ok, devname.c_str(), drive); + if (ok) { + dcr = find_device(jcr, devname, NULL, drive); + if (dcr) { + dev = dcr->dev; + dev->Lock(); /* Use P to avoid indefinite block */ + dev->enabled = true; + dir->fsend(_("3002 Device \"%s\" enabled.\n"), dev->print_name()); + dev->Unlock(); + free_dcr(dcr); + } + } else { + /* NB dir->msg gets clobbered in bnet_fsend, so save command */ + pm_strcpy(jcr->errmsg, dir->msg); + dir->fsend(_("3907 Error scanning \"enable\" command: %s\n"), jcr->errmsg); + } + dir->signal(BNET_EOD); + return true; +} + +/* enable command from Director */ +static bool disable_cmd(JCR *jcr) +{ + POOL_MEM devname; + BSOCK *dir = jcr->dir_bsock; + DEVICE *dev; + DCR *dcr; + int32_t drive; + bool ok; + + ok = sscanf(dir->msg, "disable %127s drive=%d", devname.c_str(), + &drive) == 2; + Dmsg3(100, "ok=%d device=%s device_index=%d\n", ok, devname.c_str(), drive); + if (ok) { + dcr = find_device(jcr, devname, NULL, drive); + if (dcr) { + dev = dcr->dev; + dev->Lock(); + dev->enabled = false; + dir->fsend(_("3002 Device \"%s\" disabled.\n"), dev->print_name()); + dev->Unlock(); + free_dcr(dcr); + } + } else { + /* NB dir->msg gets clobbered in bnet_fsend, so save command */ + pm_strcpy(jcr->errmsg, dir->msg); + dir->fsend(_("3907 Error scanning \"disable\" command: %s\n"), jcr->errmsg); + } + dir->signal(BNET_EOD); + return true; +} + + /* * unmount command from Director */ diff --git a/bacula/src/stored/ebcdic.c b/bacula/src/stored/ebcdic.c index 2e7d4bdd6b..1a4d2651c0 100644 --- a/bacula/src/stored/ebcdic.c +++ b/bacula/src/stored/ebcdic.c @@ -1,22 +1,26 @@ /* - * Taken from the public domain ansitape program for - * integration into Bacula. KES - Mar 2005 - */ -/* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2006-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ +/* + * Taken from the public domain ansitape program for + * integration into Bacula. KES - Mar 2005 + */ /* Mapping of EBCDIC codes to ASCII equivalents. */ diff --git a/bacula/src/stored/fd_cmds.c b/bacula/src/stored/fd_cmds.c index e8fcc2036a..d966250cf5 100644 --- a/bacula/src/stored/fd_cmds.c +++ b/bacula/src/stored/fd_cmds.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * This file handles commands from the File daemon. @@ -81,6 +85,7 @@ static char read_open[] = "read open session = %127s %ld %ld %ld %ld %ld % /* Responses sent to the File daemon */ static char NO_open[] = "3901 Error session already open\n"; static char NOT_opened[] = "3902 Error session not opened\n"; +static char ERROR_open[] = "3904 Error open session, bad parameters\n"; static char OK_end[] = "3000 OK end\n"; static char OK_close[] = "3000 OK close Status = %d\n"; static char OK_open[] = "3000 OK open ticket = %d\n"; @@ -121,7 +126,7 @@ void run_job(JCR *jcr) Dmsg3(050, "==== JobType=%c run_job=%d sd_client=%d\n", jcr->getJobType(), jcr->JobId, jcr->sd_client); if (jcr->is_JobType(JT_BACKUP) && jcr->sd_client) { jcr->session_opened = true; - Dmsg0(050, "Do: receive for 3000 OK data then append"); + Dmsg0(050, "Do: receive for 3000 OK data then append\n"); if (!response(jcr, jcr->file_bsock, "3000 OK data\n", "Append data")) { Dmsg1(050, "Expect: 3000 OK data, got: %s", jcr->file_bsock->msg); Jmsg0(jcr, M_FATAL, 0, "Append data not accepted\n"); @@ -131,8 +136,8 @@ void run_job(JCR *jcr) append_end_session(jcr); } else if (jcr->is_JobType(JT_MIGRATE) || jcr->is_JobType(JT_COPY)) { jcr->session_opened = true; - Dmsg1(050, "Do: read_data_cmd file_bsock=%p\n", jcr->file_bsock); read_data_cmd(jcr); + Dmsg0(050, "Do: receive for 3000 OK data then read\n"); if (!response(jcr, jcr->file_bsock, "3000 OK data\n", "Data received")) { Dmsg1(050, "Expect 3000 OK data, got: %s", jcr->file_bsock->msg); Jmsg0(jcr, M_FATAL, 0, "Read data not accepted\n"); @@ -147,6 +152,7 @@ void run_job(JCR *jcr) } bail_out: jcr->end_time = time(NULL); + flush_jobmedia_queue(jcr); dequeue_messages(jcr); /* send any queued messages */ jcr->setJobStatus(JS_Terminated); generate_daemon_event(jcr, "JobEnd"); @@ -245,7 +251,7 @@ static bool append_end_session(JCR *jcr) { BSOCK *fd = jcr->file_bsock; - Dmsg1(120, "storemsg); + Dmsg1(120, ">filed: %s", fd->msg); if (!jcr->session_opened) { pm_strcpy(jcr->errmsg, _("Attempt to close non-open session.\n")); fd->fsend(NOT_opened); @@ -299,7 +305,6 @@ static bool append_close_session(JCR *jcr) Dmsg1(120, ">filed: %s", fd->msg); fd->signal(BNET_EOD); /* send EOD to File daemon */ - jcr->session_opened = false; return true; } @@ -337,7 +342,7 @@ static bool read_open_session(JCR *jcr) Dmsg1(120, "%s", fd->msg); if (jcr->session_opened) { - pm_strcpy(jcr->errmsg, _("Attempt to open read on non-open session.\n")); + pm_strcpy(jcr->errmsg, _("Attempt to open an already open session.\n")); fd->fsend(NO_open); return false; } @@ -345,17 +350,17 @@ static bool read_open_session(JCR *jcr) if (sscanf(fd->msg, read_open, jcr->read_dcr->VolumeName, &jcr->read_VolSessionId, &jcr->read_VolSessionTime, &jcr->read_StartFile, &jcr->read_EndFile, &jcr->read_StartBlock, &jcr->read_EndBlock) == 7) { - if (jcr->session_opened) { - pm_strcpy(jcr->errmsg, _("Attempt to open read on non-open session.\n")); - fd->fsend(NOT_opened); - return false; - } Dmsg4(100, "read_open_session got: JobId=%d Vol=%s VolSessId=%ld VolSessT=%ld\n", jcr->JobId, jcr->read_dcr->VolumeName, jcr->read_VolSessionId, jcr->read_VolSessionTime); Dmsg4(100, " StartF=%ld EndF=%ld StartB=%ld EndB=%ld\n", jcr->read_StartFile, jcr->read_EndFile, jcr->read_StartBlock, jcr->read_EndBlock); + + } else { + pm_strcpy(jcr->errmsg, _("Cannot open session, received bad parameters.\n")); + fd->fsend(ERROR_open); + return false; } jcr->session_opened = true; diff --git a/bacula/src/stored/file_dev.c b/bacula/src/stored/file_dev.c index e5ad02f859..d7166e7f79 100644 --- a/bacula/src/stored/file_dev.c +++ b/bacula/src/stored/file_dev.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -42,7 +46,11 @@ int DEVICE::d_close(int fd) int DEVICE::d_ioctl(int fd, ioctl_req_t request, char *mt_com) { +#ifdef HAVE_WIN32 + return -1; +#else return ::ioctl(fd, request, mt_com); +#endif } ssize_t DEVICE::d_read(int fd, void *buffer, size_t count) @@ -123,12 +131,12 @@ boffset_t DEVICE::lseek(DCR *dcr, boffset_t offset, int whence) } /* - * Open a file device. For Aligned type we open both Volumes + * Open a file device. */ void DEVICE::open_file_device(DCR *dcr, int omode) { POOL_MEM archive_name(PM_FNAME); - POOL_MEM aligned_name(PM_FNAME); + struct stat sp; get_autochanger_loaded_slot(dcr); @@ -151,10 +159,13 @@ void DEVICE::open_file_device(DCR *dcr, int omode) return; } - if (!IsPathSeparator(archive_name.c_str()[strlen(archive_name.c_str())-1])) { - pm_strcat(archive_name, "/"); + /* If not /dev/null concatenate VolumeName */ + if (!is_null()) { + if (!IsPathSeparator(archive_name.c_str()[strlen(archive_name.c_str())-1])) { + pm_strcat(archive_name, "/"); + } + pm_strcat(archive_name, getVolCatName()); } - pm_strcat(archive_name, getVolCatName()); } mount(1); /* do mount if required */ @@ -171,19 +182,25 @@ void DEVICE::open_file_device(DCR *dcr, int omode) Mmsg3(errmsg, _("Could not open(%s,%s,0640): ERR=%s\n"), archive_name.c_str(), mode_to_str(omode), be.bstrerror()); Dmsg1(40, "open failed: %s", errmsg); + } else { + Dmsg2(40, "Did open(%s,%s,0640)\n", archive_name.c_str(), mode_to_str(omode)); } if (m_fd >= 0) { dev_errno = 0; file = 0; file_addr = 0; + + /* Refresh the underline device id */ + if (fstat(m_fd, &sp) == 0) { + devno = sp.st_dev; + } } Dmsg1(100, "open dev: disk fd=%d opened\n", m_fd); } /* - * Truncate a volume. If this is aligned disk, we - * truncate both volumes. + * Truncate a volume. */ bool DEVICE::truncate(DCR *dcr) /* We need the DCR for DVD-writing */ { @@ -198,61 +215,65 @@ bool DEVICE::truncate(DCR *dcr) /* We need the DCR for DVD-writing */ /* maybe we should rewind and write and eof ???? */ return true; /* we don't really truncate tapes */ case B_FILE_DEV: - Dmsg1(100, "Truncate fd=%d\n", dev->m_fd); - if (ftruncate(dev->m_fd, 0) != 0) { - berrno be; - Mmsg2(errmsg, _("Unable to truncate device %s. ERR=%s\n"), - print_name(), be.bstrerror()); - return false; - } - - /* - * Check for a successful ftruncate() and issue a work-around for devices - * (mostly cheap NAS) that don't support truncation. - * Workaround supplied by Martin Schmid as a solution to bug #1011. - * 1. close file - * 2. delete file - * 3. open new file with same mode - * 4. change ownership to original - */ - - if (fstat(dev->m_fd, &st) != 0) { - berrno be; - Mmsg2(errmsg, _("Unable to stat device %s. ERR=%s\n"), - print_name(), be.bstrerror()); - return false; - } - - if (st.st_size != 0) { /* ftruncate() didn't work */ - POOL_MEM archive_name(PM_FNAME); - - pm_strcpy(archive_name, dev_name); - if (!IsPathSeparator(archive_name.c_str()[strlen(archive_name.c_str())-1])) { - pm_strcat(archive_name, "/"); + /* Do truncate for 1 or 2 devices */ + for ( ;; ) { + Dmsg1(100, "Truncate fd=%d\n", dev->m_fd); + if (ftruncate(dev->m_fd, 0) != 0) { + berrno be; + Mmsg2(errmsg, _("Unable to truncate device %s. ERR=%s\n"), + print_name(), be.bstrerror()); + return false; } - pm_strcat(archive_name, dcr->VolumeName); - - Mmsg2(errmsg, _("Device %s doesn't support ftruncate(). Recreating file %s.\n"), - print_name(), archive_name.c_str()); - /* Close file and blow it away */ - ::close(dev->m_fd); - ::unlink(archive_name.c_str()); - - /* Recreate the file -- of course, empty */ - dev->set_mode(CREATE_READ_WRITE); - if ((dev->m_fd = ::open(archive_name.c_str(), mode, st.st_mode)) < 0) { + /* + * Check for a successful ftruncate() and issue a work-around for devices + * (mostly cheap NAS) that don't support truncation. + * Workaround supplied by Martin Schmid as a solution to bug #1011. + * 1. close file + * 2. delete file + * 3. open new file with same mode + * 4. change ownership to original + */ + + if (fstat(dev->m_fd, &st) != 0) { berrno be; - dev_errno = errno; - Mmsg2(errmsg, _("Could not reopen: %s, ERR=%s\n"), archive_name.c_str(), - be.bstrerror()); - Dmsg1(40, "reopen failed: %s", errmsg); - Emsg0(M_FATAL, 0, errmsg); + Mmsg2(errmsg, _("Unable to stat device %s. ERR=%s\n"), + print_name(), be.bstrerror()); return false; } - /* Reset proper owner */ - chown(archive_name.c_str(), st.st_uid, st.st_gid); + if (st.st_size != 0) { /* ftruncate() didn't work */ + POOL_MEM archive_name(PM_FNAME); + + pm_strcpy(archive_name, dev_name); + if (!IsPathSeparator(archive_name.c_str()[strlen(archive_name.c_str())-1])) { + pm_strcat(archive_name, "/"); + } + pm_strcat(archive_name, dcr->VolumeName); + + Mmsg2(errmsg, _("Device %s doesn't support ftruncate(). Recreating file %s.\n"), + print_name(), archive_name.c_str()); + + /* Close file and blow it away */ + ::close(dev->m_fd); + ::unlink(archive_name.c_str()); + + /* Recreate the file -- of course, empty */ + dev->set_mode(CREATE_READ_WRITE); + if ((dev->m_fd = ::open(archive_name.c_str(), mode, st.st_mode)) < 0) { + berrno be; + dev_errno = errno; + Mmsg2(errmsg, _("Could not reopen: %s, ERR=%s\n"), archive_name.c_str(), + be.bstrerror()); + Dmsg1(40, "reopen failed: %s", errmsg); + Emsg0(M_FATAL, 0, errmsg); + return false; + } + + /* Reset proper owner */ + chown(archive_name.c_str(), st.st_uid, st.st_gid); + } + break; } return true; } @@ -263,7 +284,7 @@ bool DEVICE::truncate(DCR *dcr) /* We need the DCR for DVD-writing */ /* * (Un)mount the device (either a FILE or DVD device) */ -bool DEVICE::do_file_mount(int mount, int dotimeout) +bool DEVICE::mount_file(int mount, int dotimeout) { POOL_MEM ocmd(PM_FNAME); POOLMEM *results; @@ -283,7 +304,7 @@ bool DEVICE::do_file_mount(int mount, int dotimeout) clear_freespace_ok(); edit_mount_codes(ocmd, icmd); - Dmsg2(100, "do_file_mount: cmd=%s mounted=%d\n", ocmd.c_str(), !!is_mounted()); + Dmsg2(100, "mount_file: cmd=%s mounted=%d\n", ocmd.c_str(), !!is_mounted()); if (dotimeout) { /* Try at most 10 times to (un)mount the device. This should perhaps be configurable. */ @@ -294,7 +315,7 @@ bool DEVICE::do_file_mount(int mount, int dotimeout) results = get_memory(4000); /* If busy retry each second */ - Dmsg1(100, "do_file_mount run_prog=%s\n", ocmd.c_str()); + Dmsg1(100, "mount_file run_prog=%s\n", ocmd.c_str()); while ((status = run_program_full_output(ocmd.c_str(), max_open_wait/2, results)) != 0) { /* Doesn't work with internationalization (This is not a problem) */ if (mount && fnmatch("*is already mounted on*", results, 0) == 0) { @@ -308,7 +329,7 @@ bool DEVICE::do_file_mount(int mount, int dotimeout) * Try to unmount it, then remount it */ if (mount) { Dmsg1(400, "Trying to unmount the device %s...\n", print_name()); - do_file_mount(0, 0); + mount_file(0, 0); } bmicrosleep(1, 0); continue; @@ -329,7 +350,7 @@ bool DEVICE::do_file_mount(int mount, int dotimeout) if (!(dp = opendir(device->mount_point))) { berrno be; dev_errno = errno; - Dmsg3(100, "do_file_mount: failed to open dir %s (dev=%s), ERR=%s\n", + Dmsg3(100, "mount_file: failed to open dir %s (dev=%s), ERR=%s\n", device->mount_point, print_name(), be.bstrerror()); goto get_out; } @@ -339,7 +360,7 @@ bool DEVICE::do_file_mount(int mount, int dotimeout) while (1) { if ((readdir_r(dp, entry, &result) != 0) || (result == NULL)) { dev_errno = EIO; - Dmsg2(129, "do_file_mount: failed to find suitable file in dir %s (dev=%s)\n", + Dmsg2(129, "mount_file: failed to find suitable file in dir %s (dev=%s)\n", device->mount_point, print_name()); break; } @@ -347,13 +368,13 @@ bool DEVICE::do_file_mount(int mount, int dotimeout) count++; /* result->d_name != ., .. or .keep (Gentoo-specific) */ break; } else { - Dmsg2(129, "do_file_mount: ignoring %s in %s\n", result->d_name, device->mount_point); + Dmsg2(129, "mount_file: ignoring %s in %s\n", result->d_name, device->mount_point); } } free(entry); closedir(dp); - Dmsg1(100, "do_file_mount: got %d files in the mount point (not counting ., .. and .keep)\n", count); + Dmsg1(100, "mount_file: got %d files in the mount point (not counting ., .. and .keep)\n", count); if (count > 0) { /* If we got more than ., .. and .keep */ @@ -379,6 +400,7 @@ get_out: set_mounted(mount); /* set/clear mounted flag */ free_pool_memory(results); + /* Do not check free space when unmounting */ Dmsg1(200, "============ mount=%d\n", mount); return true; } diff --git a/bacula/src/stored/file_dev.h b/bacula/src/stored/file_dev.h index eef61b29d6..6dcbaee340 100644 --- a/bacula/src/stored/file_dev.h +++ b/bacula/src/stored/file_dev.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 2014-2014 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Inspired by vtape.h @@ -25,6 +29,7 @@ public: file_dev() { }; ~file_dev() { m_fd = -1; }; +// bool mount_file(int mount, int dotimeout); }; #endif /* __FILE_DEV_ */ diff --git a/bacula/src/stored/hello.c b/bacula/src/stored/hello.c new file mode 100644 index 0000000000..f0f3f03c3a --- /dev/null +++ b/bacula/src/stored/hello.c @@ -0,0 +1,319 @@ +/* + Bacula(R) - The Network Backup Solution + + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2014 Free Software Foundation Europe e.V. + + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. + + You may use this file and others of this release according to the + license defined in the LICENSE file, which includes the Affero General + Public License, v3.0 ("AGPLv3") and some additional permissions and + terms pursuant to its AGPLv3 Section 7. + + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. +*/ +/* + * Hello routines for Storage daemon. + * + * This file contains all the code relating to reading and writing of + * all Hello commands between the daemons. + * + * Written by Kern Sibbald, June 2014 + * + */ + + +#include "bacula.h" +#include "stored.h" + +extern STORES *me; /* our Global resource */ + +const int dbglvl = 50; + +/* + * SD_VERSION history + * None prior to 06Aug13 + * 1 - Skipped + * 2 - Skipped + * 3 22Feb14 - Added SD->SD with SD_Calls_Client + * 4 - Skipped + * 305 04Jun15 - Added JobMedia queueing + */ + +#define SD_VERSION 305 /* Community SD version */ +#define FD_VERSION 305 /* Community FD version */ + +static char hello_sd[] = "Hello Bacula SD: Start Job %s %d %d\n"; + +static char Sorry[] = "3999 No go\n"; +static char OK_hello[] = "3000 OK Hello %d\n"; + +/********************************************************************* + * + * Validate hello from the Director. + * + * Returns: true if Hello is good. + * false if Hello is bad. + */ +bool validate_dir_hello(JCR* jcr) +{ + POOLMEM *dirname; + DIRRES *director = NULL; + int dir_version = 0; + BSOCK *dir = jcr->dir_bsock; + + if (dir->msglen < 25 || dir->msglen > 500) { + Dmsg2(dbglvl, "Bad Hello command from Director at %s. Len=%d.\n", + dir->who(), dir->msglen); + Jmsg2(jcr, M_FATAL, 0, _("Bad Hello command from Director at %s. Len=%d.\n"), + dir->who(), dir->msglen); + return false; + } + dirname = get_pool_memory(PM_MESSAGE); + dirname = check_pool_memory_size(dirname, dir->msglen); + + if (sscanf(dir->msg, "Hello SD: Bacula Director %127s calling %d", + dirname, &dir_version) != 2 && + sscanf(dir->msg, "Hello SD: Bacula Director %127s calling", + dirname) != 1) { + dir->msg[100] = 0; + Dmsg2(dbglvl, "Bad Hello command from Director at %s: %s\n", + dir->who(), dir->msg); + Jmsg2(jcr, M_FATAL, 0, _("Bad Hello command from Director at %s: %s\n"), + dir->who(), dir->msg); + free_pool_memory(dirname); + return false; + } + + director = NULL; + unbash_spaces(dirname); + foreach_res(director, R_DIRECTOR) { + if (strcasecmp(director->hdr.name, dirname) == 0) { + break; + } + } + if (!director) { + Dmsg2(dbglvl, "Connection from unknown Director %s at %s rejected.\n", + dirname, dir->who()); + Jmsg2(jcr, M_FATAL, 0, _("Connection from unknown Director %s at %s rejected.\n" + "Please see " MANUAL_AUTH_URL " for help.\n"), + dirname, dir->who()); + free_pool_memory(dirname); + return false; + } + jcr->director = director; + free_pool_memory(dirname); + return true; +} + +/* + * After receiving a connection (in dircmd.c) if it is + * from the File daemon, this routine is called. + */ +void handle_client_connection(BSOCK *fd) +{ + JCR *jcr; + int fd_version = 0; + int sd_version = 0; + char job_name[500]; + /* + * Do a sanity check on the message received + */ + if (fd->msglen < 25 || fd->msglen > (int)sizeof(job_name)) { + Pmsg1(000, "msg); + Jmsg2(NULL, M_ERROR, 0, _("Invalid connection from %s. Len=%d\n"), fd->who(), fd->msglen); + bmicrosleep(5, 0); /* make user wait 5 seconds */ + fd->destroy(); + return; + } + + Dmsg1(100, "Conn: %s", fd->msg); + /* + * See if this is a File daemon connection. If so + * call FD handler. + */ + if (sscanf(fd->msg, "Hello Bacula SD: Start Job %127s %d %d", job_name, &fd_version, &sd_version) != 3 && + sscanf(fd->msg, "Hello FD: Bacula Storage calling Start Job %127s %d", job_name, &sd_version) != 2 && + sscanf(fd->msg, "Hello Start Job %127s", job_name) != 1) { + Jmsg2(NULL, M_ERROR, 0, _("Invalid Hello from %s. Len=%d\n"), fd->who(), fd->msglen); + return; + } + + if (!(jcr=get_jcr_by_full_name(job_name))) { + Jmsg1(NULL, M_FATAL, 0, _("Client connect failed: Job name not found: %s\n"), job_name); + Dmsg1(3, "**** Job \"%s\" not found.\n", job_name); + fd->destroy(); + return; + } + + /* After this point, we can use bail_out */ + Dmsg1(100, "Found Client Job %s\n", job_name); + if (jcr->authenticated) { + Jmsg3(jcr, M_WARNING, 0, _("A Client \"%s\" tried to authenticate for Job %s, " + "but the Job is already authenticated with \"%s\".\n"), + fd->who(), jcr->Job, jcr->file_bsock?jcr->file_bsock->who():"N/A"); + Dmsg2(050, "Hey!!!! JobId %u Job %s already authenticated.\n", + (uint32_t)jcr->JobId, jcr->Job); + goto bail_out; + } + + fd->set_jcr(jcr); + Dmsg2(050, "fd_version=%d sd_version=%d\n", fd_version, sd_version); + + /* + * Authenticate the Client (FD or SD) + */ + jcr->lock_auth(); /* Ensure that only one thread is dealing with auth */ + if (jcr->authenticated) { + Jmsg2(jcr, M_WARNING, 0, _("A Client \"%s\" tried to authenticate for Job %s, " + "but the job is already authenticated.\n"), + fd->who(), jcr->Job); + + } else if (!authenticate_filed(jcr, fd, fd_version)) { + Dmsg1(50, "Authentication failed Job %s\n", jcr->Job); + /* Job not yet started, we can cancel */ + Jmsg(jcr, M_FATAL, 0, _("Unable to authenticate File daemon\n")); + + } else { + Dmsg2(050, "OK Authentication jid=%u Job %s\n", (uint32_t)jcr->JobId, jcr->Job); + jcr->file_bsock = fd; + jcr->FDVersion = fd_version; + jcr->SDVersion = sd_version; + jcr->authenticated = true; + + if (sd_version > 0) { + jcr->sd_client = true; + } + } + jcr->unlock_auth(); + + if (!jcr->authenticated) { + jcr->setJobStatus(JS_ErrorTerminated); + } + + Dmsg4(050, "=== Auth %s, unblock Job %s jid=%d sd_ver=%d\n", + jcr->authenticated?"OK":"KO", job_name, jcr->JobId, sd_version); + +bail_out: + /* file_bsock might be NULL or a previous BSOCK */ + if (jcr->file_bsock != fd) { + free_bsock(fd); + } + pthread_cond_signal(&jcr->job_start_wait); /* wake waiting job */ + free_jcr(jcr); + return; +} + + +bool is_client_connection(BSOCK *bs) +{ + return + sscanf(bs->msg, "Hello Bacula SD: Start Job ") == 0 || + sscanf(bs->msg, "Hello FD: Bacula Storage calling Start Job ") == 0 || + sscanf(bs->msg, "Hello Start Job ") == 0; +} + +/* + * If sd_calls_client, we must read the client's response to + * the hello we previously sent. + */ +bool read_client_hello(JCR *jcr) +{ + int i; + int stat; + int fd_version = 0; + int sd_version = 0; + BSOCK *cl = jcr->file_bsock; + char job_name[500]; + + /* We connected to Client, so finish work */ + if (!cl) { + Jmsg0(jcr, M_FATAL, 0, _("Client socket not open. Could not connect to Client.\n")); + Dmsg0(050, "Client socket not open. Could not connect to Client.\n"); + return false; + } + /* Get response to Hello command sent earlier */ + Dmsg0(050, "Read Hello command from Client\n"); + for (i=0; i<60; i++) { + stat = cl->recv(); + if (stat <= 0) { + bmicrosleep(1, 0); + } else { + break; + } + } + if (stat <= 0) { + berrno be; + Jmsg1(jcr, M_FATAL, 0, _("Recv request to Client failed. ERR=%s\n"), + be.bstrerror()); + Dmsg1(050, _("Recv request to Client failed. ERR=%s\n"), be.bstrerror()); + return false; + } + Dmsg1(050, ">filed: %s\n", cl->msg); + if (sscanf(cl->msg, "Hello Bacula SD: Start Job %127s %d %d", job_name, &fd_version, &sd_version) != 3) { + Jmsg1(jcr, M_FATAL, 0, _("Bad Hello from Client: %s.\n"), cl->msg); + Dmsg1(050, _("Bad Hello from Client: %s.\n"), cl->msg); + return false; + } + unbash_spaces(job_name); + jcr->FDVersion = fd_version; + jcr->SDVersion = sd_version; + Dmsg1(050, "FDVersion=%d\n", fd_version); + + return true; +} + +/* + * Send Hello OK to DIR or FD + */ +bool send_hello_ok(BSOCK *bs) +{ + return bs->fsend(OK_hello, SD_VERSION); +} + +bool send_sorry(BSOCK *bs) +{ + return bs->fsend(Sorry); +} + +/* + * We are acting as a client, so send Hello to the SD. + */ +bool send_hello_sd(JCR *jcr, char *Job) +{ + bool rtn; + BSOCK *sd = jcr->store_bsock; + + bash_spaces(Job); + rtn = sd->fsend(hello_sd, Job, FD_VERSION, SD_VERSION); + unbash_spaces(Job); + Dmsg1(100, "Send to SD: %s\n", sd->msg); + if (!rtn) { + return false; + } + + return true; +} + +/* + * We are SD so send Hello to client + * Note: later the Client will send us a Hello. + */ +bool send_hello_client(JCR *jcr, char *Job) +{ + bool rtn; + BSOCK *cl = jcr->file_bsock; + + bash_spaces(Job); + rtn = cl->fsend("Hello FD: Bacula Storage calling Start Job %s %d\n", Job, SD_VERSION); + unbash_spaces(Job); + if (!rtn) { + return false; + } + return rtn; +} diff --git a/bacula/src/stored/job.c b/bacula/src/stored/job.c index 82546db35d..168c75b2bc 100644 --- a/bacula/src/stored/job.c +++ b/bacula/src/stored/job.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Job control and execution for Storage Daemon @@ -63,7 +67,8 @@ bool job_cmd(JCR *jcr) BSOCK *dir = jcr->dir_bsock; POOL_MEM job_name, client_name, job, fileset_name, fileset_md5; int32_t JobType, level, spool_attributes, no_attributes, spool_data; - int32_t write_part_after_job, PreferMountedVols, rerunning; + int32_t write_part_after_job, PreferMountedVols; + int32_t rerunning; int32_t is_client; int stat; JCR *ojcr; @@ -87,7 +92,7 @@ bool job_cmd(JCR *jcr) jcr->setJobStatus(JS_ErrorTerminated); return false; } - jcr->rerunning = (rerunning) ? true : false; + jcr->rerunning = rerunning; jcr->sd_client = is_client; if (is_client) { jcr->sd_auth_key = bstrdup(sd_auth_key); @@ -108,6 +113,11 @@ bool job_cmd(JCR *jcr) Dmsg2(800, "Start JobId=%d %p\n", JobId, jcr); set_jcr_in_tsd(jcr); + /* + * If job rescheduled because previous was incomplete, + * the Resched flag is set and VolSessionId and VolSessionTime + * are given to us (same as restarted job). + */ if (!jcr->rerunning) { jcr->VolSessionId = newVolSessionId(); jcr->VolSessionTime = VolSessionTime; @@ -164,12 +174,6 @@ bool run_cmd(JCR *jcr) struct timezone tz; struct timespec timeout; int errstat = 0; - BSOCK *cl; - int fd_version = 0; - int sd_version = 0; - char job_name[500]; - int i; - int stat; Dsm_check(200); Dmsg1(200, "Run_cmd: %s\n", jcr->dir_bsock->msg); @@ -184,46 +188,14 @@ bool run_cmd(JCR *jcr) Dmsg2(050, "sd_calls_client=%d sd_client=%d\n", jcr->sd_calls_client, jcr->sd_client); if (jcr->sd_calls_client) { - /* We connected to Client, so finish work */ - cl = jcr->file_bsock; - if (!cl) { - Jmsg0(jcr, M_FATAL, 0, _("Client socket not open. Could not connect to Client.\n")); - Dmsg0(050, "Client socket not open. Could not connect to Client.\n"); - return false; - } - /* Get response to Hello command sent earlier */ - Dmsg0(050, "Read Hello command from Client\n"); - for (i=0; i<60; i++) { - stat = cl->recv(); - if (stat <= 0) { - bmicrosleep(1, 0); - } else { - break; - } - } - if (stat <= 0) { - berrno be; - Jmsg1(jcr, M_FATAL, 0, _("Recv request to Client failed. ERR=%s\n"), - be.bstrerror()); - Dmsg1(050, _("Recv request to Client failed. ERR=%s\n"), be.bstrerror()); + if (!read_client_hello(jcr)) { return false; } - Dmsg1(050, "Got from FD: %s\n", cl->msg); - if (sscanf(cl->msg, "Hello Bacula SD: Start Job %127s %d %d", job_name, &fd_version, &sd_version) != 3) { - Jmsg1(jcr, M_FATAL, 0, _("Bad Hello from Client: %s.\n"), cl->msg); - Dmsg1(050, _("Bad Hello from Client: %s.\n"), cl->msg); - return false; - } - unbash_spaces(job_name); - jcr->FDVersion = fd_version; - jcr->SDVersion = sd_version; - Dmsg1(050, "FDVersion=%d\n", fd_version); - /* * Authenticate the File daemon */ Dmsg0(050, "=== Authenticate FD\n"); - if (jcr->authenticated || !authenticate_filed(jcr)) { + if (jcr->authenticated || !authenticate_filed(jcr, jcr->file_bsock, jcr->FDVersion)) { Dmsg1(050, "Authentication failed Job %s\n", jcr->Job); Jmsg(jcr, M_FATAL, 0, _("Unable to authenticate File daemon\n")); } else { @@ -269,63 +241,6 @@ bool run_cmd(JCR *jcr) return false; } -/* - * After receiving a connection (in dircmd.c) if it is - * from the File daemon, this routine is called. - */ -void handle_filed_connection(BSOCK *fd, char *job_name, int fd_version, - int sd_version) -{ - JCR *jcr; - - if (!(jcr=get_jcr_by_full_name(job_name))) { - Jmsg1(NULL, M_FATAL, 0, _("FD connect failed: Job name not found: %s\n"), job_name); - Dmsg1(3, "**** Job \"%s\" not found.\n", job_name); - fd->destroy(); - return; - } - - Dmsg1(100, "Found Filed Job %s\n", job_name); - - if (jcr->authenticated) { - Jmsg2(jcr, M_FATAL, 0, _("Hey!!!! JobId %u Job %s already authenticated.\n"), - (uint32_t)jcr->JobId, jcr->Job); - Dmsg2(050, "Hey!!!! JobId %u Job %s already authenticated.\n", - (uint32_t)jcr->JobId, jcr->Job); - fd->destroy(); - free_jcr(jcr); - return; - } - - jcr->file_bsock = fd; - jcr->file_bsock->set_jcr(jcr); - jcr->FDVersion = fd_version; - jcr->SDVersion = sd_version; - Dmsg2(050, "fd_version=%d sd_version=%d\n", fd_version, sd_version); - - /* - * Authenticate the File daemon - */ - if (jcr->authenticated || !authenticate_filed(jcr)) { - Dmsg1(50, "Authentication failed Job %s\n", jcr->Job); - Jmsg(jcr, M_FATAL, 0, _("Unable to authenticate File daemon\n")); - } else { - jcr->authenticated = true; - Dmsg2(050, "OK Authentication jid=%u Job %s\n", (uint32_t)jcr->JobId, jcr->Job); - } - - if (!jcr->authenticated) { - jcr->setJobStatus(JS_ErrorTerminated); - } - Dmsg3(050, "=== Auth OK, unblock Job %s jid=%d sd_ver=%d\n", job_name, jcr->JobId, sd_version); - if (sd_version > 0) { - jcr->sd_client = true; - } - pthread_cond_signal(&jcr->job_start_wait); /* wake waiting job */ - free_jcr(jcr); - return; -} - #ifdef needed /* @@ -407,6 +322,11 @@ bool query_cmd(JCR *jcr) void stored_free_jcr(JCR *jcr) { Dmsg2(800, "End Job JobId=%u %p\n", jcr->JobId, jcr); + if (jcr->jobmedia_queue) { + flush_jobmedia_queue(jcr); + delete jcr->jobmedia_queue; + jcr->jobmedia_queue = NULL; + } if (jcr->dir_bsock) { Dmsg2(800, "Send terminate jid=%d %p\n", jcr->JobId, jcr); jcr->dir_bsock->signal(BNET_EOD); diff --git a/bacula/src/stored/label.c b/bacula/src/stored/label.c index 86155f2534..cbab189a31 100644 --- a/bacula/src/stored/label.c +++ b/bacula/src/stored/label.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -1107,13 +1111,74 @@ static void dump_session_label(DEV_RECORD *rec, const char *type) debug_level = dbl; } -void dump_label_record(DEVICE *dev, DEV_RECORD *rec, int verbose) +static int check_label(SESSION_LABEL *label) +{ + int errors = 0; + + if (label->JobId > 10000000 || label->JobId < 0) { + Pmsg0(-1, _("***** ERROR ****** : Found error with the JobId\n")); + errors++; + } + + if (!errors) { + switch (label->JobLevel) { + case L_FULL: + case L_INCREMENTAL: + case L_DIFFERENTIAL: + case L_SINCE: + case L_VERIFY_CATALOG: + case L_VERIFY_INIT: + case L_VERIFY_VOLUME_TO_CATALOG: + case L_VERIFY_DISK_TO_CATALOG: + case L_VERIFY_DATA: + case L_BASE: + case L_NONE: + case L_VIRTUAL_FULL: + break; + default: + Pmsg0(-1, _("***** ERROR ****** : Found error with the JobLevel\n")); + errors++; + } + } + if (!errors) { + switch (label->JobType) { + case JT_BACKUP: + case JT_MIGRATED_JOB: + case JT_VERIFY: + case JT_RESTORE: + case JT_CONSOLE: + case JT_SYSTEM: + case JT_ADMIN: + case JT_ARCHIVE: + case JT_JOB_COPY: + case JT_COPY: + case JT_MIGRATE: + case JT_SCAN: + break; + default: + Pmsg0(-1, _("***** ERROR ****** : Found error with the JobType\n")); + errors++; + } + } + if (!errors) { + POOLMEM *err = get_pool_memory(PM_EMSG); + if (!is_name_valid(label->Job, &err)) { + Pmsg1(-1, _("***** ERROR ****** : Found error with the Job name %s\n"), err); + errors++; + } + free_pool_memory(err); + } + return errors; +} + +int dump_label_record(DEVICE *dev, DEV_RECORD *rec, int verbose, bool check_err) { const char *type; int64_t dbl; + int errors = 0; if (rec->FileIndex == 0 && rec->VolSessionId == 0 && rec->VolSessionTime == 0) { - return; + return 0; } dbl = debug_level; debug_level = 1; @@ -1147,10 +1212,9 @@ void dump_label_record(DEVICE *dev, DEV_RECORD *rec, int verbose) unser_volume_label(dev, rec); dump_volume_label(dev); break; - case SOS_LABEL: - dump_session_label(rec, type); - break; + case EOS_LABEL: + case SOS_LABEL: dump_session_label(rec, type); break; case EOM_LABEL: @@ -1178,6 +1242,9 @@ void dump_label_record(DEVICE *dev, DEV_RECORD *rec, int verbose) type, dev->file, dev->block_num, rec->VolSessionId, rec->VolSessionTime, label.JobId); Pmsg4(-1, _(" Job=%s Date=%s Level=%c Type=%c\n"), label.Job, dt, label.JobLevel, label.JobType); + if (check_err) { + errors += check_label(&label); + } break; case EOS_LABEL: char ed1[30], ed2[30]; @@ -1190,6 +1257,9 @@ void dump_label_record(DEVICE *dev, DEV_RECORD *rec, int verbose) edit_uint64_with_commas(label.JobFiles, ed1), edit_uint64_with_commas(label.JobBytes, ed2), label.JobErrors, (char)label.JobStatus); + if (check_err) { + errors += check_label(&label); + } break; case EOM_LABEL: case PRE_LABEL: @@ -1204,4 +1274,5 @@ void dump_label_record(DEVICE *dev, DEV_RECORD *rec, int verbose) } } debug_level = dbl; + return errors; } diff --git a/bacula/src/stored/lock.c b/bacula/src/stored/lock.c index f0459e912e..0fea98821b 100644 --- a/bacula/src/stored/lock.c +++ b/bacula/src/stored/lock.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Collection of Bacula Storage daemon locking software @@ -239,6 +243,7 @@ void DEVICE::dbg_rLock(const char *file, int line, bool locked) void DEVICE::rLock(bool locked) { + if (!locked) { Lock(); m_count++; @@ -344,6 +349,12 @@ int DEVICE::init_mutex() return pthread_mutex_init(&m_mutex, NULL); } +/* Mutex around the freespace command */ +int DEVICE::init_freespace_mutex() +{ + return pthread_mutex_init(&freespace_mutex, NULL); +} + /* Write device acquire mutex */ int DEVICE::init_acquire_mutex() { diff --git a/bacula/src/stored/lock.h b/bacula/src/stored/lock.h index 16b47bb924..2376ff7303 100644 --- a/bacula/src/stored/lock.h +++ b/bacula/src/stored/lock.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Definitions for locking and blocking functions in the SD diff --git a/bacula/src/stored/match_bsr.c b/bacula/src/stored/match_bsr.c index 28b08bbb3e..208a9a3a4f 100644 --- a/bacula/src/stored/match_bsr.c +++ b/bacula/src/stored/match_bsr.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 2002-2014 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Match Bootstrap Records (used for restores) against diff --git a/bacula/src/stored/mount.c b/bacula/src/stored/mount.c index fc92b14d11..0aae19a5dc 100644 --- a/bacula/src/stored/mount.c +++ b/bacula/src/stored/mount.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 2002-2014 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2002-2015 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -111,8 +115,8 @@ mount_next_vol: if (job_canceled(jcr)) { goto bail_out; } - Dmsg3(100, "After find_a_volume. Vol=%s Slot=%d Parts=%d\n", - getVolCatName(), VolCatInfo.Slot, VolCatInfo.VolCatParts); + Dmsg3(100, "After find_a_volume. Vol=%s Slot=%d VolType=%d\n", + getVolCatName(), VolCatInfo.Slot, VolCatInfo.VolCatType); dev->notify_newvol_in_attached_dcrs(getVolCatName()); @@ -134,7 +138,11 @@ mount_next_vol: } else { autochanger = false; VolCatInfo.Slot = 0; - ask = retry >= 2; + if (dev->is_autochanger() && !VolCatInfo.InChanger) { + ask = true; /* not in changer, do not retry */ + } else { + ask = retry >= 2; + } } Dmsg1(100, "autoload_dev returns %d\n", autochanger); /* @@ -208,11 +216,22 @@ mount_next_vol: if (try_autolabel(false) == try_read_vol) { break; /* created a new volume label */ } + Jmsg4(jcr, M_WARNING, 0, _("Open of %s device %s Volume \"%s\" failed: ERR=%s\n"), dev->print_type(), dev->print_name(), dcr->VolumeName, dev->bstrerror()); - Dmsg0(100, "set_unload\n"); - dev->set_unload(); /* force ask sysop */ - ask = true; + + /* If not removable, Volume is broken. This is a serious issue here. */ + if(dev->is_file() && !dev->is_removable()) { + Dmsg3(40, "Volume \"%s\" not loaded on %s device %s.\n", + dcr->VolumeName, dev->print_type(), dev->print_name()); + mark_volume_in_error(); + + } else { + Dmsg0(100, "set_unload\n"); + dev->set_unload(); /* force ask sysop */ + ask = true; + } + Dmsg0(100, "goto mount_next_vol\n"); goto mount_next_vol; } @@ -409,19 +428,23 @@ int DCR::check_volume_label(bool &ask, bool &autochanger) VOLUME_CAT_INFO dcrVolCatInfo, devVolCatInfo; char saveVolumeName[MAX_NAME_LENGTH]; - Dmsg2(150, "Vol NAME Error Have=%s, want=%s\n", dev->VolHdr.VolumeName, VolumeName); + Dmsg2(40, "Vol NAME Error Have=%s, want=%s\n", dev->VolHdr.VolumeName, VolumeName); if (dev->is_volume_to_unload()) { ask = true; goto check_next_volume; } +#ifdef xxx /* If not removable, Volume is broken */ if (!dev->is_removable()) { - Jmsg(jcr, M_WARNING, 0, _("Volume \"%s\" not on %s device %s.\n"), + Jmsg3(jcr, M_WARNING, 0, _("Volume \"%s\" not loaded on %s device %s.\n"), + VolumeName, dev->print_type(), dev->print_name()); + Dmsg3(40, "Volume \"%s\" not loaded on %s device %s.\n", VolumeName, dev->print_type(), dev->print_name()); mark_volume_in_error(); goto check_next_volume; } +#endif /* * OK, we got a different volume mounted. First save the @@ -550,7 +573,7 @@ bool DCR::is_suitable_volume_mounted() bstrncpy(VolumeName, dev->VolHdr.VolumeName, sizeof(VolumeName)); ok = dir_get_volume_info(this, GET_VOL_INFO_FOR_WRITE); if (!ok) { - Dmsg1(40, "dir_get_volume_info failed: %s\n", jcr->errmsg); + Dmsg1(40, "dir_get_volume_info failed: %s", jcr->errmsg); dev->set_wait(); } return ok; @@ -676,9 +699,9 @@ bool DCR::is_eod_valid() pos = dev->lseek(this, (boffset_t)0, SEEK_END); if (dev->VolCatInfo.VolCatAmetaBytes == (uint64_t)pos) { - Jmsg(jcr, M_INFO, 0, _("Ready to append to end of Volume \"%s\"" - " size=%s\n"), VolumeName, - edit_uint64_with_commas(dev->VolCatInfo.VolCatAmetaBytes, ed1)); + Jmsg(jcr, M_INFO, 0, _("Ready to append to end of Volume \"%s\"" + " size=%s\n"), VolumeName, + edit_uint64_with_commas(dev->VolCatInfo.VolCatAmetaBytes, ed1)); } else if ((uint64_t)pos >= dev->VolCatInfo.VolCatAmetaBytes) { if ((uint64_t)pos != dev->VolCatInfo.VolCatAmetaBytes) { Jmsg(jcr, M_WARNING, 0, _("For Volume \"%s\":\n" @@ -737,7 +760,7 @@ int DCR::try_autolabel(bool opened) return try_default; /* if polling, don't try to create new labels */ } /* For a tape require it to be opened and read before labeling */ - if (!opened && dev->is_tape()) { + if (!opened && (dev->is_tape() || dev->is_null())) { return try_default; } if (dev->has_cap(CAP_LABEL) && (VolCatInfo.VolCatBytes == 0 || @@ -776,16 +799,18 @@ int DCR::try_autolabel(bool opened) Jmsg(jcr, M_WARNING, 0, _("%s device %s not configured to autolabel Volumes.\n"), dev->print_type(), dev->print_name()); } +#ifdef xxx /* If not removable, Volume is broken */ if (!dev->is_removable()) { - Jmsg(jcr, M_WARNING, 0, _("Volume \"%s\" not on %s device %s.\n"), + Jmsg3(jcr, M_WARNING, 0, _("Volume \"%s\" not loaded on %s device %s.\n"), VolumeName, dev->print_type(), dev->print_name()); - Dmsg3(100, "Volume \"%s\" not on %s device %s.\n", + Dmsg3(40, "Volume \"%s\" not loaded on %s device %s.\n", VolumeName, dev->print_type(), dev->print_name()); mark_volume_in_error(); return try_next_vol; } +#endif return try_default; } @@ -924,6 +949,7 @@ bool mount_next_read_volume(DCR *dcr) if (!acquire_device_for_read(dcr)) { Jmsg3(jcr, M_FATAL, 0, _("Cannot open %s Dev=%s, Vol=%s for reading.\n"), dev->print_type(), dev->print_name(), dcr->VolumeName); + jcr->setJobStatus(JS_FatalError); /* Jmsg is not working for *SystemJob* */ return false; } return true; /* next volume mounted */ diff --git a/bacula/src/stored/os.c b/bacula/src/stored/os.c index c726f1d382..9f853b8bb4 100644 --- a/bacula/src/stored/os.c +++ b/bacula/src/stored/os.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * diff --git a/bacula/src/stored/parse_bsr.c b/bacula/src/stored/parse_bsr.c index 1cd2979b8c..69f73c7775 100644 --- a/bacula/src/stored/parse_bsr.c +++ b/bacula/src/stored/parse_bsr.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Parse a Bootstrap Records (used for restores) @@ -843,9 +847,11 @@ void dump_bsr(BSR *bsr, bool recurse) static void free_bsr_item(BSR *bsr) { - if (bsr) { - free_bsr_item(bsr->next); + BSR *next; + while (bsr) { + next = bsr->next; free(bsr); + bsr = next; } } @@ -891,15 +897,13 @@ void remove_bsr(BSR *bsr) void free_bsr(BSR *bsr) { BSR *next_bsr; - - if (!bsr) { - return; + while (bsr) { + next_bsr = bsr->next; + /* Remove (free) current bsr */ + remove_bsr(bsr); + /* Now get the next one */ + bsr = next_bsr; } - next_bsr = bsr->next; - /* Remove (free) current bsr */ - remove_bsr(bsr); - /* Now get the next one */ - free_bsr(next_bsr); } /***************************************************************** diff --git a/bacula/src/stored/protos.h b/bacula/src/stored/protos.h index a0572acecd..3b7d36c576 100644 --- a/bacula/src/stored/protos.h +++ b/bacula/src/stored/protos.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Protypes for stored @@ -46,13 +50,15 @@ bool dir_ask_sysop_to_mount_volume(DCR *dcr, bool read_access); bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec); bool dir_send_job_status(JCR *jcr); bool dir_create_jobmedia_record(DCR *dcr, bool zero=false); +void create_jobmedia_queue(JCR *jcr); +bool flush_jobmedia_queue(JCR *jcr); bool dir_update_device(JCR *jcr, DEVICE *dev); bool dir_update_changer(JCR *jcr, AUTOCHANGER *changer); /* authenticate.c */ -int authenticate_director(JCR *jcr); -int authenticate_filed(JCR *jcr); -bool authenticate_storagedaemon(JCR *jcr, char *Job); +bool authenticate_director(JCR *jcr); +int authenticate_filed(JCR *jcr, BSOCK *fd, int FDVersion); +bool authenticate_storagedaemon(JCR *jcr); /* From autochanger.c */ bool init_autochangers(); @@ -84,7 +90,7 @@ bool check_for_newvol_or_newfile(DCR *dcr); void setup_me(); void print_ls_output(const char *fname, const char *link, int type, struct stat *statp); JCR *setup_jcr(const char *name, char *dev_name, BSR *bsr, - const char *VolumeName, bool writing); + const char *VolumeName, bool writing, bool read_dedup_data=true); void display_tape_error_status(JCR *jcr, DEVICE *dev); @@ -114,7 +120,7 @@ boffset_t lseek_dvd(DCR *dcr, boffset_t offset, int whence); void dvd_remove_empty_part(DCR *dcr); /* From device.c */ -bool open_dev(DCR *dcr); +bool open_device(DCR *dcr); bool first_open_device(DCR *dcr); bool fixup_device_block_write_error(DCR *dcr, int retries=4); void set_start_vol_position(DCR *dcr); @@ -127,13 +133,22 @@ void *handle_connection_request(void *arg); /* From fd_cmds.c */ void run_job(JCR *jcr); +void do_fd_commands(JCR *jcr); +bool do_handle_command(JCR *jcr); void do_client_commands(JCR *jcr); /* From job.c */ void stored_free_jcr(JCR *jcr); -void connection_from_filed(void *arg); -void handle_filed_connection(BSOCK *fd, char *job_name, - int fdversion, int sdversion); + +/* From hello.c */ +bool validate_dir_hello(JCR* jcr); +bool send_hello_ok(BSOCK *bs); +bool send_sorry(BSOCK *bs); +bool send_hello_sd(JCR *jcr, char *Job); +bool send_hello_client(JCR *jcr, char *Job); +bool read_client_hello(JCR *jcr); +bool is_client_connection(BSOCK *bs); +void handle_client_connection(BSOCK *fd); /* From label.c */ int read_dev_volume_label(DCR *dcr); @@ -147,7 +162,7 @@ bool write_ansi_ibm_labels(DCR *dcr, int type, const char *VolName); int read_ansi_ibm_label(DCR *dcr); bool write_session_label(DCR *dcr, int label); void dump_volume_label(DEVICE *dev); -void dump_label_record(DEVICE *dev, DEV_RECORD *rec, int verbose); +int dump_label_record(DEVICE *dev, DEV_RECORD *rec, int verbose, bool check_err); bool unser_volume_label(DEVICE *dev, DEV_RECORD *rec); bool unser_session_label(SESSION_LABEL *label, DEV_RECORD *rec); bool write_new_volume_label_to_dev(DCR *dcr, const char *VolName, @@ -194,6 +209,7 @@ DEV_RECORD *new_record(); void free_record(DEV_RECORD *rec); void empty_record(DEV_RECORD *rec); uint64_t get_record_address(DEV_RECORD *rec); +bool flush_adata_to_device(DCR *dcr); /* From read_record.c */ bool read_records(DCR *dcr, diff --git a/bacula/src/stored/read.c b/bacula/src/stored/read.c index 476b2d4991..329cd599eb 100644 --- a/bacula/src/stored/read.c +++ b/bacula/src/stored/read.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Read code for Storage daemon @@ -27,7 +31,6 @@ static bool read_record_cb(DCR *dcr, DEV_RECORD *rec); static bool mac_record_cb(DCR *dcr, DEV_RECORD *rec); - /* Responses sent to the File daemon */ static char OK_data[] = "3000 OK data\n"; static char FD_error[] = "3000 error\n"; @@ -67,7 +70,11 @@ bool do_read_data(JCR *jcr) } /* Tell File daemon we will send data */ - fd->fsend(OK_data); + if (!jcr->is_ok_data_sent) { + /* OK_DATA can have been already sent for copy/migrate by run_job() to avoid dead lock*/ + fd->fsend(OK_data); + jcr->is_ok_data_sent = true; + } jcr->sendJobStatus(JS_Running); jcr->run_time = time(NULL); @@ -104,11 +111,6 @@ bool do_read_data(JCR *jcr) return ok; } -/* - * Called here for reading (restore) for each record from read_records() - * Returns: true if OK - * false if error - */ static bool read_record_cb(DCR *dcr, DEV_RECORD *rec) { JCR *jcr = dcr->jcr; @@ -116,25 +118,27 @@ static bool read_record_cb(DCR *dcr, DEV_RECORD *rec) bool ok = true; POOLMEM *save_msg; char ec1[50], ec2[50]; + POOLMEM *wbuf = rec->data; /* send buffer */ + uint32_t wsize = rec->data_len; /* send size */ if (rec->FileIndex < 0) { return true; } + Dmsg5(400, "Send to FD: SessId=%u SessTim=%u FI=%s Strm=%s, len=%d\n", rec->VolSessionId, rec->VolSessionTime, FI_to_ascii(ec1, rec->FileIndex), stream_to_ascii(ec2, rec->Stream, rec->FileIndex), - rec->data_len); + wsize); /* Send record header to File daemon */ if (!fd->fsend(rec_header, rec->VolSessionId, rec->VolSessionTime, - rec->FileIndex, rec->Stream, rec->data_len)) { + rec->FileIndex, rec->Stream, wsize)) { Pmsg1(000, _(">filed: Error Hdr=%s\n"), fd->msg); - Jmsg1(jcr, M_FATAL, 0, _("Error sending to File daemon. ERR=%s\n"), + Jmsg1(jcr, M_FATAL, 0, _("Error sending header to Client. ERR=%s\n"), fd->bstrerror()); return false; } - /* * For normal migration jobs, FileIndex values are sequential because * we are dealing with one job. However, for Vbackup (consolidation), @@ -155,20 +159,32 @@ static bool read_record_cb(DCR *dcr, DEV_RECORD *rec) } } - /* Send data record to File daemon */ + /* Debug code: check if we must hangup */ + if (get_hangup() > 0 && (jcr->JobFiles > (uint32_t)get_hangup())) { + jcr->setJobStatus(JS_Incomplete); + Jmsg1(jcr, M_FATAL, 0, "Debug hangup requested after %d files.\n", + get_hangup()); + set_hangup(0); + return false; + } + if (get_blowup() > 0 && (jcr->JobFiles > (uint32_t)get_blowup())) { + Jmsg1(jcr, M_ABORT, 0, "Debug blowup() requested after %d files.\n", + get_blowup()); + return false; + } + save_msg = fd->msg; /* save fd message pointer */ - fd->msg = rec->data; /* pass data directly to the FD */ - fd->msglen = rec->data_len; - jcr->JobBytes += rec->data_len; /* increment bytes this job */ - Dmsg1(400, ">filed: send %d bytes data.\n", fd->msglen); + fd->msg = wbuf; + fd->msglen = wsize; + /* Send data record to File daemon */ + jcr->JobBytes += wsize; /* increment bytes this job */ if (!fd->send()) { Pmsg1(000, _("Error sending to FD. ERR=%s\n"), fd->bstrerror()); - Jmsg1(jcr, M_FATAL, 0, _("Error sending to File daemon. ERR=%s\n"), + Jmsg1(jcr, M_FATAL, 0, _("Error sending data to Client. ERR=%s\n"), fd->bstrerror()); - ok = false; } - fd->msg = save_msg; /* restore fd message pointer */ + fd->msg = save_msg; return ok; } @@ -187,6 +203,8 @@ static bool mac_record_cb(DCR *dcr, DEV_RECORD *rec) POOLMEM *save_msg; char ec1[50], ec2[50]; bool ok = true; + POOLMEM *wbuf = rec->data;; /* send buffer */ + uint32_t wsize = rec->data_len; /* send size */ #ifdef xxx Pmsg5(000, "on entry JobId=%d FI=%s SessId=%d Strm=%s len=%d\n", @@ -239,14 +257,14 @@ static bool mac_record_cb(DCR *dcr, DEV_RECORD *rec) if (new_header) { new_header = false; - Dmsg5(400, "Send header to FD: SessId=%u SessTim=%u FI=%s Strm=%s, len=%d\n", + Dmsg5(400, "Send header to FD: SessId=%u SessTim=%u FI=%s Strm=%s, len=%ld\n", rec->VolSessionId, rec->VolSessionTime, FI_to_ascii(ec1, rec->FileIndex), stream_to_ascii(ec2, rec->Stream, rec->FileIndex), - rec->data_len); + wsize); /* Send data header to File daemon */ - if (!fd->fsend("%ld %ld %ld", rec->FileIndex, rec->Stream, rec->data_len)) { + if (!fd->fsend("%ld %ld %ld", rec->FileIndex, rec->Stream, wsize)) { Pmsg1(000, _(">filed: Error Hdr=%s\n"), fd->msg); Jmsg1(jcr, M_FATAL, 0, _("Error sending to File daemon. ERR=%s\n"), fd->bstrerror()); @@ -257,9 +275,9 @@ static bool mac_record_cb(DCR *dcr, DEV_RECORD *rec) Dmsg1(400, "FI=%d\n", rec->FileIndex); /* Send data record to File daemon */ save_msg = fd->msg; /* save fd message pointer */ - fd->msg = rec->data; /* pass data directly to the FD */ - fd->msglen = rec->data_len; - jcr->JobBytes += rec->data_len; /* increment bytes this job */ + fd->msg = wbuf; /* pass data directly to the FD */ + fd->msglen = wsize; + jcr->JobBytes += wsize; /* increment bytes this job */ Dmsg1(400, ">filed: send %d bytes data.\n", fd->msglen); if (!fd->send()) { Pmsg1(000, _("Error sending to FD. ERR=%s\n"), fd->bstrerror()); diff --git a/bacula/src/stored/read_records.c b/bacula/src/stored/read_records.c index 249437e4a2..3987cb00c2 100644 --- a/bacula/src/stored/read_records.c +++ b/bacula/src/stored/read_records.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -233,6 +237,8 @@ bool read_records(DCR *dcr, */ if (jcr->bsr) { rec->match_stat = match_bsr(jcr->bsr, rec, &dev->VolHdr, &sessrec, jcr); + Dmsg2(dbglvl, "match_bsr=%d bsr->reposition=%d\n", rec->match_stat, + jcr->bsr->reposition); if (rec->match_stat == -1) { /* no more possible matches */ done = true; /* all items found, stop */ Dmsg2(dbglvl, "All done=(file:block) %u:%u\n", dev->file, dev->block_num); @@ -315,6 +321,7 @@ static bool try_repositioning(JCR *jcr, DEV_RECORD *rec, DCR *dcr) DEVICE *dev = dcr->dev; bsr = find_next_bsr(jcr->bsr, dev); + Dmsg2(dbglvl, "nextbsr=%p mount_next_volume=%d\n", bsr, jcr->bsr->mount_next_volume); if (bsr == NULL && jcr->bsr->mount_next_volume) { Dmsg0(dbglvl, "Would mount next volume here\n"); Dmsg2(dbglvl, "Current postion (file:block) %u:%u\n", @@ -346,6 +353,7 @@ static bool try_repositioning(JCR *jcr, DEV_RECORD *rec, DCR *dcr) dev->file, dev->block_num, file, block); dev->reposition(dcr, file, block); rec->Block = 0; + return true; } return false; } diff --git a/bacula/src/stored/record.c b/bacula/src/stored/record.c deleted file mode 100644 index d60647fe7c..0000000000 --- a/bacula/src/stored/record.c +++ /dev/null @@ -1,695 +0,0 @@ -/* - Bacula® - The Network Backup Solution - - Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. - - You may use this file and others of this release according to the - license defined in the LICENSE file, which includes the Affero General - Public License, v3.0 ("AGPLv3") and some additional permissions and - terms pursuant to its AGPLv3 Section 7. - - Bacula® is a registered trademark of Kern Sibbald. -*/ -/* - * - * record.c -- Volume (tape/disk) record handling functions - * - * Kern Sibbald, April MMI - * added BB02 format October MMII - * - */ - - -#include "bacula.h" -#include "stored.h" - -/* - * Convert a FileIndex into a printable - * ASCII string. Not reentrant. - * If the FileIndex is negative, it flags the - * record as a Label, otherwise it is simply - * the FileIndex of the current file. - */ -const char *FI_to_ascii(char *buf, int fi) -{ - if (fi >= 0) { - sprintf(buf, "%d", fi); - return buf; - } - switch (fi) { - case PRE_LABEL: - return "PRE_LABEL"; - case VOL_LABEL: - return "VOL_LABEL"; - case EOM_LABEL: - return "EOM_LABEL"; - case SOS_LABEL: - return "SOS_LABEL"; - case EOS_LABEL: - return "EOS_LABEL"; - case EOT_LABEL: - return "EOT_LABEL"; - break; - case SOB_LABEL: - return "SOB_LABEL"; - break; - case EOB_LABEL: - return "EOB_LABEL"; - break; - default: - sprintf(buf, _("unknown: %d"), fi); - return buf; - } -} - - -/* - * Convert a Stream ID into a printable - * ASCII string. Not reentrant. - - * A negative stream number represents - * stream data that is continued from a - * record in the previous block. - * If the FileIndex is negative, we are - * dealing with a Label, hence the - * stream is the JobId. - */ -const char *stream_to_ascii(char *buf, int stream, int fi) -{ - - if (fi < 0) { - sprintf(buf, "%d", stream); - return buf; - } - if (stream < 0) { - stream = -stream; - stream &= STREAMMASK_TYPE; - /* Stream was negative => all are continuation items */ - switch (stream) { - case STREAM_UNIX_ATTRIBUTES: - return "contUATTR"; - case STREAM_FILE_DATA: - return "contDATA"; - case STREAM_WIN32_DATA: - return "contWIN32-DATA"; - case STREAM_WIN32_GZIP_DATA: - return "contWIN32-GZIP"; - case STREAM_WIN32_COMPRESSED_DATA: - return "contWIN32-COMPRESSED"; - case STREAM_MD5_DIGEST: - return "contMD5"; - case STREAM_SHA1_DIGEST: - return "contSHA1"; - case STREAM_GZIP_DATA: - return "contGZIP"; - case STREAM_COMPRESSED_DATA: - return "contCOMPRESSED"; - case STREAM_UNIX_ATTRIBUTES_EX: - return "contUNIX-ATTR-EX"; - case STREAM_RESTORE_OBJECT: - return "contRESTORE-OBJECT"; - case STREAM_SPARSE_DATA: - return "contSPARSE-DATA"; - case STREAM_SPARSE_GZIP_DATA: - return "contSPARSE-GZIP"; - case STREAM_SPARSE_COMPRESSED_DATA: - return "contSPARSE-COMPRESSED"; - case STREAM_PROGRAM_NAMES: - return "contPROG-NAMES"; - case STREAM_PROGRAM_DATA: - return "contPROG-DATA"; - case STREAM_MACOS_FORK_DATA: - return "contMACOS-RSRC"; - case STREAM_HFSPLUS_ATTRIBUTES: - return "contHFSPLUS-ATTR"; - case STREAM_SHA256_DIGEST: - return "contSHA256"; - case STREAM_SHA512_DIGEST: - return "contSHA512"; - case STREAM_SIGNED_DIGEST: - return "contSIGNED-DIGEST"; - case STREAM_ENCRYPTED_SESSION_DATA: - return "contENCRYPTED-SESSION-DATA"; - case STREAM_ENCRYPTED_FILE_DATA: - return "contENCRYPTED-FILE"; - case STREAM_ENCRYPTED_FILE_GZIP_DATA: - return "contENCRYPTED-GZIP"; - case STREAM_ENCRYPTED_FILE_COMPRESSED_DATA: - return "contENCRYPTED-COMPRESSED"; - case STREAM_ENCRYPTED_WIN32_DATA: - return "contENCRYPTED-WIN32-DATA"; - case STREAM_ENCRYPTED_WIN32_GZIP_DATA: - return "contENCRYPTED-WIN32-GZIP"; - case STREAM_ENCRYPTED_WIN32_COMPRESSED_DATA: - return "contENCRYPTED-WIN32-COMPRESSED"; - case STREAM_ENCRYPTED_MACOS_FORK_DATA: - return "contENCRYPTED-MACOS-RSRC"; - case STREAM_PLUGIN_NAME: - return "contPLUGIN-NAME"; - - default: - sprintf(buf, "%d", -stream); - return buf; - } - } - - switch (stream & STREAMMASK_TYPE) { - case STREAM_UNIX_ATTRIBUTES: - return "UATTR"; - case STREAM_FILE_DATA: - return "DATA"; - case STREAM_WIN32_DATA: - return "WIN32-DATA"; - case STREAM_WIN32_GZIP_DATA: - return "WIN32-GZIP"; - case STREAM_WIN32_COMPRESSED_DATA: - return "WIN32-COMPRESSED"; - case STREAM_MD5_DIGEST: - return "MD5"; - case STREAM_SHA1_DIGEST: - return "SHA1"; - case STREAM_GZIP_DATA: - return "GZIP"; - case STREAM_COMPRESSED_DATA: - return "COMPRESSED"; - case STREAM_UNIX_ATTRIBUTES_EX: - return "UNIX-ATTR-EX"; - case STREAM_RESTORE_OBJECT: - return "RESTORE-OBJECT"; - case STREAM_SPARSE_DATA: - return "SPARSE-DATA"; - case STREAM_SPARSE_GZIP_DATA: - return "SPARSE-GZIP"; - case STREAM_SPARSE_COMPRESSED_DATA: - return "SPARSE-COMPRESSED"; - case STREAM_PROGRAM_NAMES: - return "PROG-NAMES"; - case STREAM_PROGRAM_DATA: - return "PROG-DATA"; - case STREAM_PLUGIN_NAME: - return "PLUGIN-NAME"; - case STREAM_MACOS_FORK_DATA: - return "MACOS-RSRC"; - case STREAM_HFSPLUS_ATTRIBUTES: - return "HFSPLUS-ATTR"; - case STREAM_SHA256_DIGEST: - return "SHA256"; - case STREAM_SHA512_DIGEST: - return "SHA512"; - case STREAM_SIGNED_DIGEST: - return "SIGNED-DIGEST"; - case STREAM_ENCRYPTED_SESSION_DATA: - return "ENCRYPTED-SESSION-DATA"; - case STREAM_ENCRYPTED_FILE_DATA: - return "ENCRYPTED-FILE"; - case STREAM_ENCRYPTED_FILE_GZIP_DATA: - return "ENCRYPTED-GZIP"; - case STREAM_ENCRYPTED_FILE_COMPRESSED_DATA: - return "ENCRYPTED-COMPRESSED"; - case STREAM_ENCRYPTED_WIN32_DATA: - return "ENCRYPTED-WIN32-DATA"; - case STREAM_ENCRYPTED_WIN32_GZIP_DATA: - return "ENCRYPTED-WIN32-GZIP"; - case STREAM_ENCRYPTED_WIN32_COMPRESSED_DATA: - return "ENCRYPTED-WIN32-COMPRESSED"; - case STREAM_ENCRYPTED_MACOS_FORK_DATA: - return "ENCRYPTED-MACOS-RSRC"; - - default: - sprintf(buf, "%d", stream); - return buf; - } -} - -/* - * Return a new record entity - */ -DEV_RECORD *new_record(void) -{ - DEV_RECORD *rec; - - rec = (DEV_RECORD *)get_memory(sizeof(DEV_RECORD)); - memset(rec, 0, sizeof(DEV_RECORD)); - rec->data = get_pool_memory(PM_MESSAGE); - rec->state = st_none; - return rec; -} - -void empty_record(DEV_RECORD *rec) -{ - rec->File = rec->Block = 0; - rec->VolSessionId = rec->VolSessionTime = 0; - rec->FileIndex = rec->Stream = 0; - rec->data_len = rec->remainder = 0; - rec->state_bits &= ~(REC_PARTIAL_RECORD|REC_BLOCK_EMPTY|REC_NO_MATCH|REC_CONTINUATION); - rec->state = st_none; -} - -/* - * Free the record entity - * - */ -void free_record(DEV_RECORD *rec) -{ - Dmsg0(950, "Enter free_record.\n"); - if (rec->data) { - free_pool_memory(rec->data); - } - Dmsg0(950, "Data buf is freed.\n"); - free_pool_memory((POOLMEM *)rec); - Dmsg0(950, "Leave free_record.\n"); -} - -static bool write_header_to_block(DEV_BLOCK *block, DEV_RECORD *rec) -{ - ser_declare; - - rec->remlen = block->buf_len - block->binbuf; - /* Require enough room to write a full header */ - if (rec->remlen >= WRITE_RECHDR_LENGTH) { - ser_begin(block->bufp, WRITE_RECHDR_LENGTH); - if (BLOCK_VER == 1) { - ser_uint32(rec->VolSessionId); - ser_uint32(rec->VolSessionTime); - } else { - block->VolSessionId = rec->VolSessionId; - block->VolSessionTime = rec->VolSessionTime; - } - ser_int32(rec->FileIndex); - ser_int32(rec->Stream); - ser_uint32(rec->data_len); - - block->bufp += WRITE_RECHDR_LENGTH; - block->binbuf += WRITE_RECHDR_LENGTH; - rec->remlen -= WRITE_RECHDR_LENGTH; - rec->remainder = rec->data_len; - if (rec->FileIndex > 0) { - /* If data record, update what we have in this block */ - if (block->FirstIndex == 0) { - block->FirstIndex = rec->FileIndex; - } - block->LastIndex = rec->FileIndex; - } - } else { - rec->remainder = rec->data_len + WRITE_RECHDR_LENGTH; - return false; - } - return true; -} - -static void write_continue_header_to_block(DEV_BLOCK *block, DEV_RECORD *rec) -{ - ser_declare; - - rec->remlen = block->buf_len - block->binbuf; - /* - * We have unwritten bytes from a previous - * time. Presumably we have a new buffer (possibly - * containing a volume label), so the new header - * should be able to fit in the block -- otherwise we have - * an error. Note, we have to continue splitting the - * data record if it is longer than the block. - * - * First, write the header. - * - * Every time we write a header and it is a continuation - * of a previous partially written record, we store the - * Stream as -Stream in the record header. - */ - ser_begin(block->bufp, WRITE_RECHDR_LENGTH); - if (BLOCK_VER == 1) { - ser_uint32(rec->VolSessionId); - ser_uint32(rec->VolSessionTime); - } else { - block->VolSessionId = rec->VolSessionId; - block->VolSessionTime = rec->VolSessionTime; - } - ser_int32(rec->FileIndex); - if (rec->remainder > rec->data_len) { - ser_int32(rec->Stream); /* normal full header */ - ser_uint32(rec->data_len); - rec->remainder = rec->data_len; /* must still do data record */ - } else { - ser_int32(-rec->Stream); /* mark this as a continuation record */ - ser_uint32(rec->remainder); /* bytes to do */ - } - - /* Require enough room to write a full header */ - ASSERT(rec->remlen >= WRITE_RECHDR_LENGTH); - - block->bufp += WRITE_RECHDR_LENGTH; - block->binbuf += WRITE_RECHDR_LENGTH; - rec->remlen -= WRITE_RECHDR_LENGTH; - if (rec->FileIndex > 0) { - /* If data record, update what we have in this block */ - if (block->FirstIndex == 0) { - block->FirstIndex = rec->FileIndex; - } - block->LastIndex = rec->FileIndex; - } -} - -static bool write_data_to_block(DEV_BLOCK *block, DEV_RECORD *rec) -{ - rec->remlen = block->buf_len - block->binbuf; - /* Write as much of data as possible */ - if (rec->remlen >= rec->remainder) { - memcpy(block->bufp, rec->data+rec->data_len-rec->remainder, - rec->remainder); - block->bufp += rec->remainder; - block->binbuf += rec->remainder; - } else { - memcpy(block->bufp, rec->data+rec->data_len-rec->remainder, - rec->remlen); -#ifdef xxxxxSMCHECK - if (!sm_check_rtn(__FILE__, __LINE__, False)) { - /* We damaged a buffer */ - Dmsg6(0, "Damaged block FI=%s SessId=%d Strm=%s len=%d\n" - "rem=%d remainder=%d\n", - FI_to_ascii(buf1, rec->FileIndex), rec->VolSessionId, - stream_to_ascii(buf2, rec->Stream, rec->FileIndex), rec->data_len, - rec->remlen, rec->remainder); - Dmsg5(0, "Damaged block: bufp=%x binbuf=%d buf_len=%d rem=%d moved=%d\n", - block->bufp, block->binbuf, block->buf_len, block->buf_len-block->binbuf, - rec->remlen); - Dmsg2(0, "Damaged block: buf=%x binbuffrombuf=%d \n", - block->buf, block->bufp-block->buf); - Emsg0(M_ABORT, 0, _("Damaged buffer\n")); - } -#endif - - block->bufp += rec->remlen; - block->binbuf += rec->remlen; - rec->remainder -= rec->remlen; - return false; /* did partial transfer */ - } - return true; -} - -/* - * Write a Record to the block - * - * Returns: false means the block could not be written to tape/disk. - * true on success (all bytes written to the block). - */ -bool DCR::write_record(DEV_RECORD *rec) -{ - while (!write_record_to_block(this, rec)) { - Dmsg2(850, "!write_record_to_block data_len=%d rem=%d\n", rec->data_len, - rec->remainder); - if (!write_block_to_device()) { - Dmsg2(90, "Got write_block_to_dev error on device %s. %s\n", - dev->print_name(), dev->bstrerror()); - return false; - } - } - return true; -} - -/* - * Write a Record to the block - * - * Returns: false on failure (none or partially written) - * true on success (all bytes written) - * - * and remainder returned in packet. - * - * We require enough room for the header, and we deal with - * two special cases. 1. Only part of the record may have - * been transferred the last time (when remainder is - * non-zero), and 2. The remaining bytes to write may not - * all fit into the block. - */ -bool write_record_to_block(DCR *dcr, DEV_RECORD *rec) -{ - char buf1[100], buf2[100]; - DEV_BLOCK *block = dcr->block; - - for ( ;; ) { - ASSERT(block->binbuf == (uint32_t)(block->bufp - block->buf)); - ASSERT(block->buf_len >= block->binbuf); - - Dmsg6(890, "write_record_to_block() FI=%s SessId=%d Strm=%s len=%d\n" - "rem=%d remainder=%d\n", - FI_to_ascii(buf1, rec->FileIndex), rec->VolSessionId, - stream_to_ascii(buf2, rec->Stream, rec->FileIndex), rec->data_len, - rec->remlen, rec->remainder); - - switch (rec->state) { - case st_none: - /* Figure out what to do */ - rec->state = st_header; - continue; /* go to next state */ - - case st_header: - /* - * Write header - * - * If rec->remainder is non-zero, we have been called a - * second (or subsequent) time to finish writing a record - * that did not previously fit into the block. - */ - if (!write_header_to_block(block, rec)) { - return false; /* write block then come back here */ - } - rec->state = st_data; /* after header, now write data */ - continue; - - /* Write continuation header */ - case st_header_cont: - write_continue_header_to_block(block, rec); - rec->state = st_data; - if (rec->remlen == 0) { - return false; /* partial transfer */ - } - continue; - - /* Write normal data */ - case st_data: - /* - * Write data - * - * Part of it may have already been transferred, and we - * may not have enough room to transfer the whole this time. - */ - if (rec->remainder > 0) { - if (!write_data_to_block(block, rec)) { - rec->state = st_header_cont; - return false; - } - } - rec->remainder = 0; /* did whole transfer */ - rec->state = st_none; - return true; - - default: - Dmsg0(000, "Something went wrong. Default state.\n"); - rec->state = st_none; - return true; - } - } - return true; -} - -/* - * Test if we can write whole record to the block - * - * Returns: false on failure - * true on success (all bytes can be written) - */ -bool can_write_record_to_block(DEV_BLOCK *block, DEV_RECORD *rec) -{ - uint32_t remlen; - - remlen = block->buf_len - block->binbuf; - if (rec->remainder == 0) { - if (remlen >= WRITE_RECHDR_LENGTH) { - remlen -= WRITE_RECHDR_LENGTH; - rec->remainder = rec->data_len; - } else { - return false; - } - } else { - return false; - } - if (rec->remainder > 0 && remlen < rec->remainder) { - return false; - } - return true; -} - -uint64_t get_record_address(DEV_RECORD *rec) -{ - return ((uint64_t)rec->File)<<32 | rec->Block; -} - -/* - * Read a Record from the block - * Returns: false if nothing read or if the continuation record does not match. - * In both of these cases, a block read must be done. - * true if at least the record header was read, this - * routine may have to be called again with a new - * block if the entire record was not read. - */ -bool read_record_from_block(DCR *dcr, DEV_RECORD *rec) -{ - ser_declare; - uint32_t remlen; - uint32_t VolSessionId; - uint32_t VolSessionTime; - int32_t FileIndex; - int32_t Stream; - uint32_t data_bytes; - uint32_t rhl; - char buf1[100], buf2[100]; - - remlen = dcr->block->binbuf; - - /* Clear state flags */ - rec->state_bits = 0; - if (dcr->block->dev->is_tape()) { - rec->state_bits |= REC_ISTAPE; - } - rec->Block = ((DEVICE *)(dcr->block->dev))->EndBlock; - rec->File = ((DEVICE *)(dcr->block->dev))->EndFile; - - /* - * Get the header. There is always a full header, - * otherwise we find it in the next block. - */ - Dmsg3(450, "Block=%d Ver=%d size=%u\n", dcr->block->BlockNumber, dcr->block->BlockVer, - dcr->block->block_len); - if (dcr->block->BlockVer == 1) { - rhl = RECHDR1_LENGTH; - } else { - rhl = RECHDR2_LENGTH; - } - if (remlen >= rhl) { - Dmsg4(450, "Enter read_record_block: remlen=%d data_len=%d rem=%d blkver=%d\n", - remlen, rec->data_len, rec->remainder, dcr->block->BlockVer); - - unser_begin(dcr->block->bufp, WRITE_RECHDR_LENGTH); - if (dcr->block->BlockVer == 1) { - unser_uint32(VolSessionId); - unser_uint32(VolSessionTime); - } else { - VolSessionId = dcr->block->VolSessionId; - VolSessionTime = dcr->block->VolSessionTime; - } - unser_int32(FileIndex); - unser_int32(Stream); - unser_uint32(data_bytes); - - dcr->block->bufp += rhl; - dcr->block->binbuf -= rhl; - remlen -= rhl; - - /* If we are looking for more (remainder!=0), we reject anything - * where the VolSessionId and VolSessionTime don't agree - */ - if (rec->remainder && (rec->VolSessionId != VolSessionId || - rec->VolSessionTime != VolSessionTime)) { - rec->state_bits |= REC_NO_MATCH; - Dmsg0(450, "remainder and VolSession doesn't match\n"); - return false; /* This is from some other Session */ - } - - /* if Stream is negative, it means that this is a continuation - * of a previous partially written record. - */ - if (Stream < 0) { /* continuation record? */ - Dmsg1(500, "Got negative Stream => continuation. remainder=%d\n", - rec->remainder); - rec->state_bits |= REC_CONTINUATION; - if (!rec->remainder) { /* if we didn't read previously */ - rec->data_len = 0; /* return data as if no continuation */ - } else if (rec->Stream != -Stream) { - rec->state_bits |= REC_NO_MATCH; - return false; /* This is from some other Session */ - } - rec->Stream = -Stream; /* set correct Stream */ - rec->maskedStream = rec->Stream & STREAMMASK_TYPE; - } else { /* Regular record */ - rec->Stream = Stream; - rec->maskedStream = rec->Stream & STREAMMASK_TYPE; - rec->data_len = 0; /* transfer to beginning of data */ - } - rec->VolSessionId = VolSessionId; - rec->VolSessionTime = VolSessionTime; - rec->FileIndex = FileIndex; - if (FileIndex > 0) { - if (dcr->block->FirstIndex == 0) { - dcr->block->FirstIndex = FileIndex; - } - dcr->block->LastIndex = FileIndex; - } - - Dmsg6(450, "rd_rec_blk() got FI=%s SessId=%d Strm=%s len=%u\n" - "remlen=%d data_len=%d\n", - FI_to_ascii(buf1, rec->FileIndex), rec->VolSessionId, - stream_to_ascii(buf2, rec->Stream, rec->FileIndex), data_bytes, remlen, - rec->data_len); - } else { - /* - * No more records in this block because the number - * of remaining bytes are less than a record header - * length, so return empty handed, but indicate that - * he must read again. By returning, we allow the - * higher level routine to fetch the next block and - * then reread. - */ - Dmsg0(450, "read_record_block: nothing\n"); - rec->state_bits |= (REC_NO_HEADER | REC_BLOCK_EMPTY); - empty_block(dcr->block); /* mark block empty */ - return false; - } - - /* Sanity check */ - if (data_bytes >= MAX_BLOCK_LENGTH) { - /* - * Something is wrong, force read of next block, abort - * continuing with this block. - */ - rec->state_bits |= (REC_NO_HEADER | REC_BLOCK_EMPTY); - empty_block(dcr->block); - Jmsg2(dcr->jcr, M_WARNING, 0, _("Sanity check failed. maxlen=%d datalen=%d. Block discarded.\n"), - MAX_BLOCK_LENGTH, data_bytes); - return false; - } - - rec->data = check_pool_memory_size(rec->data, rec->data_len+data_bytes); - - /* - * At this point, we have read the header, now we - * must transfer as much of the data record as - * possible taking into account: 1. A partial - * data record may have previously been transferred, - * 2. The current block may not contain the whole data - * record. - */ - if (remlen >= data_bytes) { - /* Got whole record */ - memcpy(rec->data+rec->data_len, dcr->block->bufp, data_bytes); - dcr->block->bufp += data_bytes; - dcr->block->binbuf -= data_bytes; - rec->data_len += data_bytes; - } else { - /* Partial record */ - memcpy(rec->data+rec->data_len, dcr->block->bufp, remlen); - dcr->block->bufp += remlen; - dcr->block->binbuf -= remlen; - rec->data_len += remlen; - rec->remainder = 1; /* partial record transferred */ - Dmsg1(450, "read_record_block: partial xfered=%d\n", rec->data_len); - rec->state_bits |= (REC_PARTIAL_RECORD | REC_BLOCK_EMPTY); - return true; - } - rec->remainder = 0; - Dmsg4(450, "Rtn full rd_rec_blk FI=%s SessId=%d Strm=%s len=%d\n", - FI_to_ascii(buf1, rec->FileIndex), rec->VolSessionId, - stream_to_ascii(buf2, rec->Stream, rec->FileIndex), rec->data_len); - return true; /* transferred full record */ -} diff --git a/bacula/src/stored/record.h b/bacula/src/stored/record.h index c8f5273c93..16fb0f60ce 100644 --- a/bacula/src/stored/record.h +++ b/bacula/src/stored/record.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Record, and label definitions for Bacula diff --git a/bacula/src/stored/record_read.c b/bacula/src/stored/record_read.c index d92fd0e6b9..5e001cefb8 100644 --- a/bacula/src/stored/record_read.c +++ b/bacula/src/stored/record_read.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -19,6 +23,7 @@ * * Kern Sibbald, April MMI * added BB02 format October MMII + * */ @@ -27,9 +32,8 @@ /* Imported subroutines */ - static const int read_dbglvl = 200; -static const int dbgep = 250; /* debug execution path */ +static const int dbgep = 200; /* debug execution path */ /* * Read the header record @@ -232,9 +236,10 @@ bool read_record_from_block(DCR *dcr, DEV_RECORD *rec) for ( ;; ) { switch (rec->rstate) { case st_none: - dump_block(dcr->block, "st_none"); + dump_block(dcr->ameta_block, "st_none"); case st_header: Dmsg0(dbgep, "=== rpath 33 st_header\n"); + dcr->set_ameta(); rec->remlen = dcr->block->binbuf; /* Note read_header sets rec->rstate on return true */ if (!read_header(dcr, dcr->block, rec)) { /* sets state */ diff --git a/bacula/src/stored/record_util.c b/bacula/src/stored/record_util.c index acac86460d..e708193c40 100644 --- a/bacula/src/stored/record_util.c +++ b/bacula/src/stored/record_util.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * diff --git a/bacula/src/stored/record_write.c b/bacula/src/stored/record_write.c index e078e7f8cb..45799bcf60 100644 --- a/bacula/src/stored/record_write.c +++ b/bacula/src/stored/record_write.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 20xx-2014 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -19,7 +23,6 @@ * * Kern Sibbald, April MMI * added BB02 format October MMII - * added aligned format November MMXII * */ diff --git a/bacula/src/stored/reserve.c b/bacula/src/stored/reserve.c index 30719a77b0..cad831abdd 100644 --- a/bacula/src/stored/reserve.c +++ b/bacula/src/stored/reserve.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Drive reservation functions for Storage Daemon @@ -445,7 +449,8 @@ bool find_suitable_device_for_job(JCR *jcr, RCTX &rctx) } if (vol->dev->is_autochanger()) { Dmsg1(dbglvl, "vol=%s is in changer\n", vol->vol_name); - if (!is_vol_in_autochanger(rctx, vol) || !vol->dev->autoselect) { + if (!is_vol_in_autochanger(rctx, vol) || !vol->dev->autoselect || + !vol->dev->enabled) { continue; } } else if (strcmp(device_name, vol->dev->device->hdr.name) != 0) { @@ -648,6 +653,11 @@ static int reserve_device(RCTX &rctx) rctx.device_name); } return -1; /* no use waiting */ + } else if (!rctx.device->dev->enabled) { + Jmsg(rctx.jcr, M_WARNING, 0, _("\n" + " Device \"%s\" requested by DIR is disabled.\n"), + rctx.device_name); + return -1; /* no use waiting */ } rctx.suitable_device = true; diff --git a/bacula/src/stored/reserve.h b/bacula/src/stored/reserve.h index 20f7e74e2f..cb51f80c88 100644 --- a/bacula/src/stored/reserve.h +++ b/bacula/src/stored/reserve.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2006-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Definitions for reservation system. diff --git a/bacula/src/stored/scan.c b/bacula/src/stored/scan.c index c2dba1dbb8..e4290b2722 100644 --- a/bacula/src/stored/scan.c +++ b/bacula/src/stored/scan.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2006-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * diff --git a/bacula/src/stored/sd_plugins.c b/bacula/src/stored/sd_plugins.c index 968a69b97d..58bedc50f7 100644 --- a/bacula/src/stored/sd_plugins.c +++ b/bacula/src/stored/sd_plugins.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Main program to test loading and running Bacula plugins. @@ -29,7 +33,6 @@ const char *plugin_type = "-sd.so"; /* Forward referenced functions */ static bRC baculaGetValue(bpContext *ctx, bsdrVariable var, void *value); -static bRC baculaGetGlobal(bsdrGlobalVariable var, void *value); static bRC baculaSetValue(bpContext *ctx, bsdwVariable var, void *value); static bRC baculaRegisterEvents(bpContext *ctx, ...); static bRC baculaJobMsg(bpContext *ctx, const char *file, int line, @@ -57,7 +60,6 @@ static bsdFuncs bfuncs = { baculaJobMsg, baculaDebugMsg, baculaEditDeviceCodes, - baculaGetGlobal }; /* @@ -94,11 +96,11 @@ int generate_plugin_event(JCR *jcr, bsdEventType eventType, void *value) bpContext *plugin_ctx; bsdEvent event; Plugin *plugin; - int i; + int i = 0; bRC rc = bRC_OK; - if (!bplugin_list) { - Dmsg0(dbglvl, "No bplugin_list: generate_plugin_event ignored.\n"); + if (!b_plugin_list) { + Dmsg0(dbglvl, "No b_plugin_list: generate_plugin_event ignored.\n"); return bRC_OK; } if (!jcr) { @@ -106,8 +108,8 @@ int generate_plugin_event(JCR *jcr, bsdEventType eventType, void *value) return bRC_OK; } if (!jcr->plugin_ctx_list) { - Dmsg0(dbglvl, "No plugin_ctx_list: generate_plugin_event ignored.\n"); - return bRC_OK; /* Return if no plugins loaded */ + Dmsg0(dbglvl, "No plugin_ctx_list: generate_plugin_event ignored.\n"); + return bRC_OK; /* Return if no plugins loaded */ } /* Always handle JobEnd and DeviceClose requests */ @@ -127,7 +129,7 @@ int generate_plugin_event(JCR *jcr, bsdEventType eventType, void *value) Dmsg2(dbglvl, "sd-plugin_ctx_list=%p JobId=%d\n", jcr->plugin_ctx_list, jcr->JobId); - foreach_alist_index(i, plugin, bplugin_list) { + foreach_alist_index(i, plugin, b_plugin_list) { plugin_ctx = &plugin_ctx_list[i]; if (is_plugin_disabled(plugin_ctx)) { continue; @@ -151,13 +153,13 @@ int generate_global_plugin_event(bsdGlobalEventType eventType, void *value) int i; bRC rc = bRC_OK; - if (!bplugin_list) { - Dmsg0(dbglvl, "No bplugin_list: generate_global_plugin_event ignored.\n"); + if (!b_plugin_list) { + Dmsg0(dbglvl, "No b_plugin_list: generate_global_plugin_event ignored.\n"); return bRC_OK; } event.eventType = eventType; - foreach_alist_index(i, plugin, bplugin_list) { + foreach_alist_index(i, plugin, b_plugin_list) { if (sdplug_func(plugin)->handleGlobalPluginEvent != NULL) { rc = sdplug_func(plugin)->handleGlobalPluginEvent(&event, value); if (rc != bRC_OK) { @@ -201,13 +203,13 @@ void load_sd_plugins(const char *plugin_dir) Dmsg0(dbglvl, "No sd plugin dir!\n"); return; } - bplugin_list = New(alist(10, not_owned_by_alist)); + b_plugin_list = New(alist(10, not_owned_by_alist)); if (!load_plugins((void *)&binfo, (void *)&bfuncs, plugin_dir, plugin_type, is_plugin_compatible)) { /* Either none found, or some error */ - if (bplugin_list->size() == 0) { - delete bplugin_list; - bplugin_list = NULL; + if (b_plugin_list->size() == 0) { + delete b_plugin_list; + b_plugin_list = NULL; Dmsg0(dbglvl, "No plugins loaded\n"); return; } @@ -216,12 +218,12 @@ void load_sd_plugins(const char *plugin_dir) * Verify that the plugin is acceptable, and print information * about it. */ - foreach_alist_index(i, plugin, bplugin_list) { + foreach_alist_index(i, plugin, b_plugin_list) { Jmsg(NULL, M_INFO, 0, _("Loaded plugin: %s\n"), plugin->file); Dmsg1(dbglvl, "Loaded plugin: %s\n", plugin->file); } - Dmsg1(dbglvl, "num plugins=%d\n", bplugin_list->size()); + Dmsg1(dbglvl, "num plugins=%d\n", b_plugin_list->size()); dbg_plugin_add_hook(dump_sd_plugin); } @@ -277,10 +279,10 @@ static bool is_plugin_compatible(Plugin *plugin) void new_plugins(JCR *jcr) { Plugin *plugin; - int i; + int i = 0;; Dmsg0(dbglvl, "=== enter new_plugins ===\n"); - if (!bplugin_list) { + if (!b_plugin_list) { Dmsg0(dbglvl, "No sd plugin list!\n"); return; } @@ -294,7 +296,7 @@ void new_plugins(JCR *jcr) return; } - int num = bplugin_list->size(); + int num = b_plugin_list->size(); Dmsg1(dbglvl, "sd-plugin-list size=%d\n", num); if (num == 0) { @@ -305,7 +307,7 @@ void new_plugins(JCR *jcr) bpContext *plugin_ctx_list = jcr->plugin_ctx_list; Dmsg2(dbglvl, "Instantiate sd-plugin_ctx_list=%p JobId=%d\n", jcr->plugin_ctx_list, jcr->JobId); - foreach_alist_index(i, plugin, bplugin_list) { + foreach_alist_index(i, plugin, b_plugin_list) { /* Start a new instance of each plugin */ bacula_ctx *b_ctx = (bacula_ctx *)malloc(sizeof(bacula_ctx)); memset(b_ctx, 0, sizeof(bacula_ctx)); @@ -324,15 +326,15 @@ void new_plugins(JCR *jcr) void free_plugins(JCR *jcr) { Plugin *plugin; - int i; + int i = 0; - if (!bplugin_list || !jcr->plugin_ctx_list) { + if (!b_plugin_list || !jcr->plugin_ctx_list) { return; } bpContext *plugin_ctx_list = (bpContext *)jcr->plugin_ctx_list; Dmsg2(dbglvl, "Free instance sd-plugin_ctx_list=%p JobId=%d\n", jcr->plugin_ctx_list, jcr->JobId); - foreach_alist_index(i, plugin, bplugin_list) { + foreach_alist_index(i, plugin, b_plugin_list) { /* Free the plugin instance */ sdplug_func(plugin)->freePlugin(&plugin_ctx_list[i]); free(plugin_ctx_list[i].bContext); /* free Bacula private context */ @@ -349,19 +351,6 @@ void free_plugins(JCR *jcr) * ============================================================== */ -/* Get a global. No job context */ -static bRC baculaGetGlobal(bsdrGlobalVariable var, void *value) -{ - if (!value) { - return bRC_Error; - } - switch (var) { - default: - break; - } - return bRC_OK; -} - static bRC baculaGetValue(bpContext *ctx, bsdrVariable var, void *value) { diff --git a/bacula/src/stored/sd_plugins.h b/bacula/src/stored/sd_plugins.h index e4ccb01a45..742f699039 100644 --- a/bacula/src/stored/sd_plugins.h +++ b/bacula/src/stored/sd_plugins.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2007-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Interface definition for Bacula Plugins @@ -82,11 +86,6 @@ typedef enum { bsdVarSDJobStatus = 21 } bsdrVariable; -typedef enum { - bsdVarDevTypes = 1 -} bsdrGlobalVariable; - - typedef enum { bsdwVarJobReport = 1, bsdwVarVolumeName = 2, @@ -131,7 +130,6 @@ typedef struct s_sdbaculaFuncs { int level, const char *fmt, ...); char *(*EditDeviceCodes)(DCR *dcr, char *omsg, const char *imsg, const char *cmd); - bRC (*getBaculaGlobal)(bsdrGlobalVariable var, void *value); } bsdFuncs; /* Bacula Subroutines */ @@ -154,7 +152,7 @@ typedef enum { } psdVariable; -# define SD_PLUGIN_MAGIC "*BaculaSDPluginData*" +#define SD_PLUGIN_MAGIC "*BaculaSDPluginData*" #define SD_PLUGIN_INTERFACE_VERSION ( 12 ) diff --git a/bacula/src/stored/spool.c b/bacula/src/stored/spool.c index 4306655b35..3e26fa76bf 100644 --- a/bacula/src/stored/spool.c +++ b/bacula/src/stored/spool.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2004-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Spooling code @@ -222,7 +226,7 @@ static bool despool_data(DCR *dcr, bool commit) rdev = (DEVICE *)malloc(sizeof(DEVICE)); memset(rdev, 0, sizeof(DEVICE)); rdev->dev_name = get_memory(strlen(spool_name)+1); - bstrncpy(rdev->dev_name, spool_name, sizeof(rdev->dev_name)); + bstrncpy(rdev->dev_name, spool_name, strlen(spool_name)+1); rdev->errmsg = get_pool_memory(PM_EMSG); *rdev->errmsg = 0; rdev->max_block_size = dcr->dev->max_block_size; @@ -263,6 +267,7 @@ static bool despool_data(DCR *dcr, bool commit) dcr->dev->print_name(), dcr->dev->bstrerror()); Pmsg2(000, "Fatal append error on device %s: ERR=%s\n", dcr->dev->print_name(), dcr->dev->bstrerror()); + /* Force in case Incomplete set */ jcr->forceJobStatus(JS_FatalError); } Dmsg3(800, "Write block ok=%d FI=%d LI=%d\n", ok, block->FirstIndex, block->LastIndex); @@ -271,8 +276,9 @@ static bool despool_data(DCR *dcr, bool commit) if (!dir_create_jobmedia_record(dcr)) { Jmsg2(jcr, M_FATAL, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"), dcr->getVolCatName(), jcr->Job); - jcr->forceJobStatus(JS_FatalError); + jcr->forceJobStatus(JS_FatalError); /* override any Incomplete */ } + flush_jobmedia_queue(jcr); /* Set new file/block parameters for current dcr */ set_new_file_parameters(dcr); @@ -361,21 +367,21 @@ static int read_block_from_spool_file(DCR *dcr) Pmsg2(000, _("Spool read error. Wanted %u bytes, got %d\n"), rlen, stat); Jmsg2(jcr, M_FATAL, 0, _("Spool header read error. Wanted %u bytes, got %d\n"), rlen, stat); } - jcr->forceJobStatus(JS_FatalError); + jcr->forceJobStatus(JS_FatalError); /* override any Incomplete */ return RB_ERROR; } rlen = hdr.len; if (rlen > block->buf_len) { Pmsg2(000, _("Spool block too big. Max %u bytes, got %u\n"), block->buf_len, rlen); Jmsg2(jcr, M_FATAL, 0, _("Spool block too big. Max %u bytes, got %u\n"), block->buf_len, rlen); - jcr->forceJobStatus(JS_FatalError); + jcr->forceJobStatus(JS_FatalError); /* override any Incomplete */ return RB_ERROR; } stat = read(dcr->spool_fd, (char *)block->buf, (size_t)rlen); if (stat != (ssize_t)rlen) { Pmsg2(000, _("Spool data read error. Wanted %u bytes, got %d\n"), rlen, stat); Jmsg2(dcr->jcr, M_FATAL, 0, _("Spool data read error. Wanted %u bytes, got %d\n"), rlen, stat); - jcr->forceJobStatus(JS_FatalError); + jcr->forceJobStatus(JS_FatalError); /* override any Incomplete */ return RB_ERROR; } /* Setup write pointers */ @@ -482,7 +488,7 @@ static bool write_spool_header(DCR *dcr) berrno be; Jmsg(jcr, M_FATAL, 0, _("Error writing header to spool file. ERR=%s\n"), be.bstrerror()); - jcr->forceJobStatus(JS_FatalError); + jcr->forceJobStatus(JS_FatalError); /* override any Incomplete */ } if (stat != (ssize_t)sizeof(hdr)) { Jmsg(jcr, M_ERROR, 0, _("Error writing header to spool file." @@ -504,7 +510,7 @@ static bool write_spool_header(DCR *dcr) } if (!despool_data(dcr, false)) { Jmsg(jcr, M_FATAL, 0, _("Fatal despooling error.")); - jcr->forceJobStatus(JS_FatalError); + jcr->forceJobStatus(JS_FatalError); /* override any Incomplete */ return false; } continue; /* try again */ @@ -512,7 +518,7 @@ static bool write_spool_header(DCR *dcr) return true; } Jmsg(jcr, M_FATAL, 0, _("Retrying after header spooling error failed.\n")); - jcr->forceJobStatus(JS_FatalError); + jcr->forceJobStatus(JS_FatalError); /* override any Incomplete */ return false; } @@ -529,7 +535,7 @@ static bool write_spool_data(DCR *dcr) berrno be; Jmsg(jcr, M_FATAL, 0, _("Error writing data to spool file. ERR=%s\n"), be.bstrerror()); - jcr->forceJobStatus(JS_FatalError); + jcr->forceJobStatus(JS_FatalError); /* override any Incomplete */ } if (stat != (ssize_t)block->binbuf) { /* @@ -550,7 +556,7 @@ static bool write_spool_data(DCR *dcr) } if (!despool_data(dcr, false)) { Jmsg(jcr, M_FATAL, 0, _("Fatal despooling error.")); - jcr->forceJobStatus(JS_FatalError); + jcr->forceJobStatus(JS_FatalError); /* override any Incomplete */ return false; } if (!write_spool_header(dcr)) { @@ -561,7 +567,7 @@ static bool write_spool_data(DCR *dcr) return true; } Jmsg(jcr, M_FATAL, 0, _("Retrying after data spooling error failed.\n")); - jcr->forceJobStatus(JS_FatalError); + jcr->forceJobStatus(JS_FatalError); /* override any Incomplete */ return false; } @@ -648,7 +654,7 @@ static bool blast_attr_spool_file(JCR *jcr, boffset_t size) if (jcr->dir_bsock->recv() <= 0) { Jmsg(jcr, M_FATAL, 0, _("Network error on BlastAttributes.\n")); - jcr->forceJobStatus(JS_FatalError); + jcr->forceJobStatus(JS_FatalError); /* override any Incomplete */ return false; } @@ -660,7 +666,7 @@ static bool blast_attr_spool_file(JCR *jcr, boffset_t size) bool commit_attribute_spool(JCR *jcr) { - boffset_t size; + boffset_t size, data_end; char ec1[30]; char tbuf[100]; BSOCK *dir; @@ -673,15 +679,31 @@ bool commit_attribute_spool(JCR *jcr) berrno be; Jmsg(jcr, M_FATAL, 0, _("Fseek on attributes file failed: ERR=%s\n"), be.bstrerror()); - jcr->forceJobStatus(JS_FatalError); + jcr->forceJobStatus(JS_FatalError); /* override any Incomplete */ goto bail_out; } size = ftello(dir->m_spool_fd); + /* For Incomplete Job truncate spool file to last valid data_end if necssary */ + if (jcr->is_JobStatus(JS_Incomplete)) { + data_end = dir->get_last_data_end(); + if (size > data_end) { + if (ftruncate(fileno(dir->m_spool_fd), data_end) != 0) { + berrno be; + Jmsg(jcr, M_FATAL, 0, _("Truncate on attributes file failed: ERR=%s\n"), + be.bstrerror()); + jcr->forceJobStatus(JS_FatalError); /* override any Incomplete */ + goto bail_out; + } + Dmsg2(100, "=== Attrib spool truncated from %lld to %lld\n", + size, data_end); + size = data_end; + } + } if (size < 0) { berrno be; Jmsg(jcr, M_FATAL, 0, _("Fseek on attributes file failed: ERR=%s\n"), be.bstrerror()); - jcr->forceJobStatus(JS_FatalError); + jcr->forceJobStatus(JS_FatalError); /* override any Incomplete */ goto bail_out; } P(mutex); @@ -719,7 +741,7 @@ static bool open_attr_spool_file(JCR *jcr, BSOCK *bs) berrno be; Jmsg(jcr, M_FATAL, 0, _("fopen attr spool file %s failed: ERR=%s\n"), name, be.bstrerror()); - jcr->forceJobStatus(JS_FatalError); + jcr->forceJobStatus(JS_FatalError); /* override any Incomplete */ free_pool_memory(name); return false; } diff --git a/bacula/src/stored/status.c b/bacula/src/stored/status.c index 33d47e3d00..e3612b5ceb 100644 --- a/bacula/src/stored/status.c +++ b/bacula/src/stored/status.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2003-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * This file handles the status command @@ -24,32 +28,31 @@ #include "bacula.h" #include "stored.h" #include "lib/status.h" +#include "sd_plugins.h" /* Imported functions */ +extern void dbg_print_plugin(FILE *fp); /* Imported variables */ extern BSOCK *filed_chan; extern void *start_heap; /* Static variables */ -static char qstatus[] = ".status %127s\n"; - static char OKqstatus[] = "3000 OK .status\n"; static char DotStatusJob[] = "JobId=%d JobStatus=%c JobErrors=%d\n"; /* Forward referenced functions */ -static void sendit(const char *msg, int len, STATUS_PKT *sp); static void sendit(POOL_MEM &msg, int len, STATUS_PKT *sp); static void sendit(const char *msg, int len, void *arg); - +static void dbg_sendit(const char *msg, int len, void *arg); static void send_blocked_status(DEVICE *dev, STATUS_PKT *sp); static void send_device_status(DEVICE *dev, STATUS_PKT *sp); -static void list_terminated_jobs(STATUS_PKT *sp); static void list_running_jobs(STATUS_PKT *sp); static void list_jobs_waiting_on_reservation(STATUS_PKT *sp); static void list_status_header(STATUS_PKT *sp); -static void list_devices(STATUS_PKT *sp); +static void list_devices(STATUS_PKT *sp, char *name=NULL); +static void list_plugins(STATUS_PKT *sp); /* * Status command from Director @@ -72,7 +75,7 @@ void output_status(STATUS_PKT *sp) list_jobs_waiting_on_reservation(sp); /* - * List terminated jobs + * List terminated jobs (defined in lib/status.h) */ list_terminated_jobs(sp); @@ -90,8 +93,12 @@ void output_status(STATUS_PKT *sp) list_spool_stats(sendit, (void *)sp); + if (!sp->api) sendit("====\n\n", 6, sp); + if (chk_dbglvl(10)) { + dbg_print_plugin(stdout); + } } static void list_resources(STATUS_PKT *sp) @@ -126,100 +133,150 @@ static find_device(char *devname) } #endif -static void list_devices(STATUS_PKT *sp) + +static void list_one_device(char *name, DEVICE *dev, STATUS_PKT *sp) { - DEVRES *device; - AUTOCHANGER *changer; - DEVICE *dev; char b1[35], b2[35], b3[35]; POOL_MEM msg(PM_MESSAGE); int len; int bpb; - len = Mmsg(msg, _("\nDevice status:\n")); - if (!sp->api) sendit(msg, len, sp); - - foreach_res(changer, R_AUTOCHANGER) { - len = Mmsg(msg, _("Autochanger \"%s\" with devices:\n"), - changer->hdr.name); + if (!dev) { + len = Mmsg(msg, _("\nDevice \"%s\" is not open or does not exist.\n"), + name); sendit(msg, len, sp); + if (!sp->api) sendit("==\n", 4, sp); + return; + } - foreach_alist(device, changer->device) { - if (device->dev) { - len = Mmsg(msg, " %s\n", device->dev->print_name()); - sendit(msg, len, sp); + if (dev->is_open()) { + if (dev->is_labeled()) { + len = Mmsg(msg, _("\nDevice %s is %s %s:\n" + " Volume: %s\n" + " Pool: %s\n" + " Media type: %s\n"), + dev->print_type(), dev->print_name(), + dev->blocked()?_("waiting for"):_("mounted with"), + dev->VolHdr.VolumeName, + dev->pool_name[0]?dev->pool_name:_("*unknown*"), + dev->device->media_type); + sendit(msg, len, sp); + } else { + len = Mmsg(msg, _("\nDevice %s: %s open but no Bacula volume is currently mounted.\n"), + dev->print_type(), dev->print_name()); + sendit(msg, len, sp); + } + send_blocked_status(dev, sp); + if (dev->can_append()) { + bpb = dev->VolCatInfo.VolCatBlocks; + if (bpb <= 0) { + bpb = 1; + } + bpb = dev->VolCatInfo.VolCatBytes / bpb; + len = Mmsg(msg, _(" Total Bytes=%s Blocks=%s Bytes/block=%s\n"), + edit_uint64_with_commas(dev->VolCatInfo.VolCatBytes, b1), + edit_uint64_with_commas(dev->VolCatInfo.VolCatBlocks, b2), + edit_uint64_with_commas(bpb, b3)); + sendit(msg, len, sp); + } else { /* reading */ + bpb = dev->VolCatInfo.VolCatReads; + if (bpb <= 0) { + bpb = 1; + } + if (dev->VolCatInfo.VolCatRBytes > 0) { + bpb = dev->VolCatInfo.VolCatRBytes / bpb; } else { - len = Mmsg(msg, " %s\n", device->hdr.name); - sendit(msg, len, sp); + bpb = 0; } + len = Mmsg(msg, _(" Total Bytes Read=%s Blocks Read=%s Bytes/block=%s\n"), + edit_uint64_with_commas(dev->VolCatInfo.VolCatRBytes, b1), + edit_uint64_with_commas(dev->VolCatInfo.VolCatReads, b2), + edit_uint64_with_commas(bpb, b3)); + sendit(msg, len, sp); } - } + len = Mmsg(msg, _(" Positioned at File=%s Block=%s\n"), + edit_uint64_with_commas(dev->file, b1), + edit_uint64_with_commas(dev->block_num, b2)); + sendit(msg, len, sp); + } else { + len = Mmsg(msg, _("\nDevice %s: %s is not open.\n"), + dev->print_type(), dev->print_name()); + sendit(msg, len, sp); + send_blocked_status(dev, sp); + } - foreach_res(device, R_DEVICE) { - dev = device->dev; - if (dev && dev->is_open()) { - if (dev->is_labeled()) { - len = Mmsg(msg, _("\nDevice %s is %s:\n" - " Volume: %s\n" - " Pool: %s\n" - " Media type: %s\n"), - dev->print_name(), - dev->blocked()?_("waiting for"):_("mounted with"), - dev->VolHdr.VolumeName, - dev->pool_name[0]?dev->pool_name:_("*unknown*"), - dev->device->media_type); - sendit(msg, len, sp); - } else { - len = Mmsg(msg, _("\nDevice %s open but no Bacula volume is currently mounted.\n"), - dev->print_name()); - sendit(msg, len, sp); - } - send_blocked_status(dev, sp); - if (dev->can_append()) { - bpb = dev->VolCatInfo.VolCatBlocks; - if (bpb <= 0) { - bpb = 1; - } - bpb = dev->VolCatInfo.VolCatBytes / bpb; - len = Mmsg(msg, _(" Total Bytes=%s Blocks=%s Bytes/block=%s\n"), - edit_uint64_with_commas(dev->VolCatInfo.VolCatBytes, b1), - edit_uint64_with_commas(dev->VolCatInfo.VolCatBlocks, b2), - edit_uint64_with_commas(bpb, b3)); - sendit(msg, len, sp); - } else { /* reading */ - bpb = dev->VolCatInfo.VolCatReads; - if (bpb <= 0) { - bpb = 1; - } - if (dev->VolCatInfo.VolCatRBytes > 0) { - bpb = dev->VolCatInfo.VolCatRBytes / bpb; - } else { - bpb = 0; - } - len = Mmsg(msg, _(" Total Bytes Read=%s Blocks Read=%s Bytes/block=%s\n"), - edit_uint64_with_commas(dev->VolCatInfo.VolCatRBytes, b1), - edit_uint64_with_commas(dev->VolCatInfo.VolCatReads, b2), - edit_uint64_with_commas(bpb, b3)); - sendit(msg, len, sp); - } - len = Mmsg(msg, _(" Positioned at File=%s Block=%s\n"), - edit_uint64_with_commas(dev->file, b1), - edit_uint64_with_commas(dev->block_num, b2)); + /* TODO: We need to check with Mount command, maybe we can + * display this number only when the device is open. + */ + if (dev->is_file()) { + char ed1[50]; + uint64_t f, t; + dev->get_freespace(&f, &t); + if (t > 0) { /* We might not have access to numbers */ + len = Mmsg(msg, _(" Available Space=%sB\n"), + edit_uint64_with_suffix(f, ed1)); sendit(msg, len, sp); + } + } + if (!sp->api) sendit("==\n", 4, sp); +} + +void _dbg_list_one_device(char *name, DEVICE *dev, const char *file, int line) +{ + STATUS_PKT sp; + sp.bs = NULL; + sp.callback = dbg_sendit; + sp.context = NULL; + d_msg(file, line, 0, "Called dbg_list_one_device():"); + list_one_device(name, dev, &sp); + send_device_status(dev, &sp); +} + +static void list_one_autochanger(char *name, AUTOCHANGER *changer, STATUS_PKT *sp) +{ + int len; + DEVRES *device; + POOL_MEM msg(PM_MESSAGE); + + len = Mmsg(msg, _("Autochanger \"%s\" with devices:\n"), + changer->hdr.name); + sendit(msg, len, sp); + + foreach_alist(device, changer->device) { + if (device->dev) { + len = Mmsg(msg, " %s\n", device->dev->print_name()); + sendit(msg, len, sp); } else { - if (dev) { - len = Mmsg(msg, _("\nDevice %s is not open.\n"), dev->print_name()); - sendit(msg, len, sp); - send_blocked_status(dev, sp); - } else { - len = Mmsg(msg, _("\nDevice \"%s\" is not open or does not exist.\n"), device->hdr.name); - sendit(msg, len, sp); - } + len = Mmsg(msg, " %s\n", device->hdr.name); + sendit(msg, len, sp); } + } +} - if (!sp->api) sendit("==\n", 4, sp); +static void list_devices(STATUS_PKT *sp, char *name) +{ + int len; + DEVRES *device; + AUTOCHANGER *changer; + POOL_MEM msg(PM_MESSAGE); + + if (!sp->api) { + len = Mmsg(msg, _("\nDevice status:\n")); + sendit(msg, len, sp); + } + + foreach_res(changer, R_AUTOCHANGER) { + if (!name || strcmp(changer->hdr.name, name) == 0) { + list_one_autochanger(changer->hdr.name, changer, sp); + } + } + + foreach_res(device, R_DEVICE) { + if (!name || strcmp(device->hdr.name, name) == 0) { + list_one_device(device->hdr.name, device->dev, sp); + } } if (!sp->api) sendit("====\n\n", 6, sp); } @@ -231,8 +288,8 @@ static void list_status_header(STATUS_PKT *sp) POOL_MEM msg(PM_MESSAGE); int len; - len = Mmsg(msg, _("%s Version: %s (%s) %s %s %s\n"), - my_name, VERSION, BDATE, HOST_OS, DISTNAME, DISTVER); + len = Mmsg(msg, _("%s %sVersion: %s (%s) %s %s %s\n"), + my_name, "", VERSION, BDATE, HOST_OS, DISTNAME, DISTVER); sendit(msg, len, sp); bstrftime_nc(dt, sizeof(dt), daemon_start_time); @@ -251,23 +308,9 @@ static void list_status_header(STATUS_PKT *sp) len = Mmsg(msg, " Sizes: boffset_t=%d size_t=%d int32_t=%d int64_t=%d " "mode=%d,%d\n", (int)sizeof(boffset_t), (int)sizeof(size_t), (int)sizeof(int32_t), - (int)sizeof(int64_t), (int)DEVELOPER_MODE, (int)BEEF); + (int)sizeof(int64_t), (int)DEVELOPER_MODE, (int)0); sendit(msg, len, sp); - if (bplugin_list->size() > 0) { - Plugin *plugin; - int len; - pm_strcpy(msg, " Plugin: "); - foreach_alist(plugin, bplugin_list) { - len = pm_strcat(msg, plugin->file); - if (len > 80) { - pm_strcat(msg, "\n "); - } else { - pm_strcat(msg, " "); - } - } - len = pm_strcat(msg, "\n"); - sendit(msg.c_str(), len, sp); - } + list_plugins(sp); } static void send_blocked_status(DEVICE *dev, STATUS_PKT *sp) @@ -280,6 +323,10 @@ static void send_blocked_status(DEVICE *dev, STATUS_PKT *sp) sendit(msg, len, sp); return; } + if (!dev->enabled) { + len = Mmsg(msg, _(" Device is disabled. User command.\n")); + sendit(msg, len, sp); + } switch (dev->blocked()) { case BST_UNMOUNTED: len = Mmsg(msg, _(" Device is BLOCKED. User unmounted.\n")); @@ -350,7 +397,7 @@ static void send_blocked_status(DEVICE *dev, STATUS_PKT *sp) } } -static void send_device_status(DEVICE *dev, STATUS_PKT *sp) +void send_device_status(DEVICE *dev, STATUS_PKT *sp) { POOL_MEM msg(PM_MESSAGE); int len; @@ -392,11 +439,11 @@ static void send_device_status(DEVICE *dev, STATUS_PKT *sp) dev->state & ST_SHORT ? "" : "!", dev->state & ST_MOUNTED ? "" : "!"); sendit(msg, len, sp); - len = Mmsg(msg, _(" num_writers=%d reserves=%d block=%d\n"), dev->num_writers, - dev->num_reserved(), dev->blocked()); + len = Mmsg(msg, _(" num_writers=%d reserves=%d block=%d enabled=%d\n"), dev->num_writers, + dev->num_reserved(), dev->blocked(), dev->enabled); sendit(msg, len, sp); - len = Mmsg(msg, _("Attached JobsIds: ")); + len = Mmsg(msg, _("Attached JobIds: ")); sendit(msg, len, sp); dev->Lock(); dev->Lock_dcrs(); @@ -428,7 +475,8 @@ static void send_device_status(DEVICE *dev, STATUS_PKT *sp) static void list_running_jobs(STATUS_PKT *sp) { bool found = false; - int avebps, bps, sec; + uint64_t inst_bps, total_bps; + int inst_sec, total_sec; JCR *jcr; DCR *dcr, *rdcr; char JobName[MAX_NAME_LENGTH]; @@ -470,7 +518,7 @@ static void list_running_jobs(STATUS_PKT *sp) rdcr->device->device_name); sendit(msg, len, sp); } - if (dcr && dcr->device) { + if (dcr && dcr->device && dcr != rdcr) { len = Mmsg(msg, _("Writing: %s %s job %s JobId=%d Volume=\"%s\"\n" " pool=\"%s\" device=%s\n"), job_level_to_str(jcr->getJobLevel()), @@ -489,24 +537,35 @@ static void list_running_jobs(STATUS_PKT *sp) if (jcr->last_time == 0) { jcr->last_time = jcr->run_time; } - sec = now - jcr->last_time; - if (sec <= 0) { - sec = 1; + total_sec = now - jcr->run_time; + inst_sec = now - jcr->last_time; + if (total_sec <= 0) { + total_sec = 1; + } + if (inst_sec <= 0) { + inst_sec = 1; } - bps = (jcr->JobBytes - jcr->LastJobBytes) / sec; + /* Instanteous bps not smoothed */ + inst_bps = (jcr->JobBytes - jcr->LastJobBytes) / inst_sec; if (jcr->LastRate == 0) { - jcr->LastRate = bps; + jcr->LastRate = inst_bps; } - avebps = (jcr->LastRate + bps) / 2; + /* Smooth the instantaneous bps a bit */ + inst_bps = (2 * jcr->LastRate + inst_bps) / 3; + /* total bps (AveBytes/sec) since start of job */ + total_bps = jcr->JobBytes / total_sec; len = Mmsg(msg, _(" Files=%s Bytes=%s AveBytes/sec=%s LastBytes/sec=%s\n"), edit_uint64_with_commas(jcr->JobFiles, b1), edit_uint64_with_commas(jcr->JobBytes, b2), - edit_uint64_with_commas(avebps, b3), - edit_uint64_with_commas(bps, b4)); + edit_uint64_with_commas(total_bps, b3), + edit_uint64_with_commas(inst_bps, b4)); sendit(msg, len, sp); - jcr->LastRate = avebps; - jcr->LastJobBytes = jcr->JobBytes; - jcr->last_time = now; + /* Update only every 10 seconds */ + if (now - jcr->last_time > 10) { + jcr->LastRate = inst_bps; + jcr->LastJobBytes = jcr->JobBytes; + jcr->last_time = now; + } found = true; #ifdef DEBUG if (jcr->file_bsock) { @@ -551,9 +610,7 @@ static void list_jobs_waiting_on_reservation(STATUS_PKT *sp) if (!sp->api) sendit("====\n", 5, sp); } -/* - * Send to Director - */ + static void sendit(const char *msg, int len, void *sp) { sendit(msg, len, (STATUS_PKT *)sp); @@ -563,6 +620,7 @@ static void sendit(POOL_MEM &msg, int len, STATUS_PKT *sp) { BSOCK *bs = sp->bs; if (bs) { + bs->msg = check_pool_memory_size(bs->msg, len+1); memcpy(bs->msg, msg.c_str(), len+1); bs->msglen = len+1; bs->send(); @@ -571,6 +629,12 @@ static void sendit(POOL_MEM &msg, int len, STATUS_PKT *sp) } } +static void dbg_sendit(const char *msg, int len, void *sp) +{ + if (len > 0) { + Dmsg0(-1, msg); + } +} /* * Status command from Director @@ -593,122 +657,123 @@ bool status_cmd(JCR *jcr) bool qstatus_cmd(JCR *jcr) { BSOCK *dir = jcr->dir_bsock; - POOL_MEM cmd; JCR *njcr; s_last_job* job; STATUS_PKT sp; + POOLMEM *args = get_pool_memory(PM_MESSAGE); + char *argk[MAX_CMD_ARGS]; /* argument keywords */ + char *argv[MAX_CMD_ARGS]; /* argument values */ + int argc; /* number of arguments */ + bool ret=true; + char *cmd; + char *device=NULL; + int api = true; sp.bs = dir; - if (sscanf(dir->msg, qstatus, cmd.c_str()) != 1) { + + parse_args(dir->msg, &args, &argc, argk, argv, MAX_CMD_ARGS); + + /* .status xxxx at the minimum */ + if (argc < 2 || strcmp(argk[0], ".status") != 0) { pm_strcpy(jcr->errmsg, dir->msg); dir->fsend(_("3900 No arg in .status command: %s\n"), jcr->errmsg); dir->signal(BNET_EOD); return false; } + + cmd = argk[1]; unbash_spaces(cmd); - Dmsg1(200, "cmd=%s\n", cmd.c_str()); + /* The status command can contain some arguments + * i=0 => .status + * i=1 => [running | current | last | ... ] + */ + for (int i=0 ; i < argc ; i++) { + if (!strcmp(argk[i], "device") && argv[i]) { + device = argv[i]; + unbash_spaces(device); + + } else if (!strcmp(argk[i], "api") && argv[i]) { + api = atoi(argv[i]); + + } else if (!strcmp(argk[i], "api_opts") && argv[i]) { + strncpy(sp.api_opts, argv[i], sizeof(sp.api_opts));; + } + } - if (strcasecmp(cmd.c_str(), "current") == 0) { - dir->fsend(OKqstatus, cmd.c_str()); + Dmsg1(100, "cmd=%s\n", cmd); + + if (strcasecmp(cmd, "current") == 0) { + dir->fsend(OKqstatus, cmd); foreach_jcr(njcr) { if (njcr->JobId != 0) { dir->fsend(DotStatusJob, njcr->JobId, njcr->JobStatus, njcr->JobErrors); } } endeach_jcr(njcr); - } else if (strcasecmp(cmd.c_str(), "last") == 0) { - dir->fsend(OKqstatus, cmd.c_str()); + } else if (strcasecmp(cmd, "last") == 0) { + dir->fsend(OKqstatus, cmd); if ((last_jobs) && (last_jobs->size() > 0)) { job = (s_last_job*)last_jobs->last(); dir->fsend(DotStatusJob, job->JobId, job->JobStatus, job->Errors); } - } else if (strcasecmp(cmd.c_str(), "header") == 0) { - sp.api = true; + } else if (strcasecmp(cmd, "header") == 0) { + sp.api = api; list_status_header(&sp); - } else if (strcasecmp(cmd.c_str(), "running") == 0) { - sp.api = true; + } else if (strcasecmp(cmd, "running") == 0) { + sp.api = api; list_running_jobs(&sp); - } else if (strcasecmp(cmd.c_str(), "waitreservation") == 0) { - sp.api = true; + } else if (strcasecmp(cmd, "waitreservation") == 0) { + sp.api = api; list_jobs_waiting_on_reservation(&sp); - } else if (strcasecmp(cmd.c_str(), "devices") == 0) { - sp.api = true; - list_devices(&sp); - } else if (strcasecmp(cmd.c_str(), "volumes") == 0) { - sp.api = true; + } else if (strcasecmp(cmd, "devices") == 0) { + sp.api = api; + list_devices(&sp, device); + } else if (strcasecmp(cmd, "volumes") == 0) { + sp.api = api; list_volumes(sendit, &sp); - } else if (strcasecmp(cmd.c_str(), "spooling") == 0) { - sp.api = true; + } else if (strcasecmp(cmd, "spooling") == 0) { + sp.api = api; list_spool_stats(sendit, &sp); - } else if (strcasecmp(cmd.c_str(), "terminated") == 0) { - sp.api = true; - list_terminated_jobs(&sp); - } else if (strcasecmp(cmd.c_str(), "resources") == 0) { - sp.api = true; + } else if (strcasecmp(cmd, "terminated") == 0) { + sp.api = api; + list_terminated_jobs(&sp); /* defined in lib/status.h */ + } else if (strcasecmp(cmd, "resources") == 0) { + sp.api = api; list_resources(&sp); } else { pm_strcpy(jcr->errmsg, dir->msg); dir->fsend(_("3900 Unknown arg in .status command: %s\n"), jcr->errmsg); dir->signal(BNET_EOD); - return false; + ret = false; } dir->signal(BNET_EOD); - return true; + free_pool_memory(args); + return ret; } -#if defined(HAVE_WIN32) -int bacstat = 0; - -/* Return a one line status for the tray monitor */ -char *bac_status(char *buf, int buf_len) +static void list_plugins(STATUS_PKT *sp) { - JCR *njcr; - const char *termstat = _("Bacula Storage: Idle"); - struct s_last_job *job; - int stat = 0; /* Idle */ - - if (!last_jobs) { - goto done; - } - Dmsg0(1000, "Begin bac_status jcr loop.\n"); - foreach_jcr(njcr) { - if (njcr->JobId != 0) { - stat = JS_Running; - termstat = _("Bacula Storage: Running"); - break; - } - } - endeach_jcr(njcr); - - if (stat != 0) { - goto done; - } - if (last_jobs->size() > 0) { - job = (struct s_last_job *)last_jobs->last(); - stat = job->JobStatus; - switch (job->JobStatus) { - case JS_Canceled: - termstat = _("Bacula Storage: Last Job Canceled"); - break; - case JS_ErrorTerminated: - case JS_FatalError: - termstat = _("Bacula Storage: Last Job Failed"); - break; - default: - if (job->Errors) { - termstat = _("Bacula Storage: Last Job had Warnings"); + POOL_MEM msg(PM_MESSAGE); + if (b_plugin_list->size() > 0) { + Plugin *plugin; + int len; + pm_strcpy(msg, " Plugin: "); + foreach_alist(plugin, b_plugin_list) { + len = pm_strcat(msg, plugin->file); + /* Print plugin version when debug activated */ + if (debug_level > 0 && plugin->pinfo) { + pm_strcat(msg, "("); + pm_strcat(msg, NPRT(sdplug_info(plugin)->plugin_version)); + len = pm_strcat(msg, ")"); + } + if (len > 80) { + pm_strcat(msg, "\n "); + } else { + pm_strcat(msg, " "); } - break; } + len = pm_strcat(msg, "\n"); + sendit(msg.c_str(), len, sp); } - Dmsg0(1000, "End bac_status jcr loop.\n"); -done: - bacstat = stat; - if (buf) { - bstrncpy(buf, termstat, buf_len); - } - return buf; } - -#endif /* HAVE_WIN32 */ diff --git a/bacula/src/stored/stored.c b/bacula/src/stored/stored.c index 1429aa7a5f..5782088340 100644 --- a/bacula/src/stored/stored.c +++ b/bacula/src/stored/stored.c @@ -1,22 +1,26 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Second generation Storage daemon. * - * Kern Sibbald, MM + * Written by Kern Sibbald, MM * * It accepts a number of simple commands from the File daemon * and acts on them. When a request to append data is made, @@ -50,6 +54,7 @@ extern "C" void *device_initialization(void *arg); char OK_msg[] = "3000 OK\n"; char TERM_msg[] = "3999 Terminate\n"; STORES *me = NULL; /* our Global resource */ + bool forge_on = false; /* proceed inspite of I/O errors */ pthread_mutex_t device_release_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t wait_device_release = PTHREAD_COND_INITIALIZER; @@ -73,23 +78,23 @@ static CONFIG *config; static void usage() { fprintf(stderr, _( -PROG_COPYRIGHT -"\nVersion: %s (%s)\n\n" -"Usage: bacula-sd [options] [-c config_file] [config_file]\n" -" -c use as configuration file\n" -" -d set debug level to \n" -" -dt print timestamp in debug output\n" -" -f run in foreground (for debugging)\n" -" -g set groupid to group\n" -" -m print kaboom output (for debugging)\n" -" -p proceed despite I/O errors\n" -" -s no signals (for debugging)\n" -" -t test - read config and exit\n" -" -u userid to \n" -" -v verbose user messages\n" -" -? print this message.\n" -"\n"), 2000, VERSION, BDATE); - + PROG_COPYRIGHT + "\n%sVersion: %s (%s)\n\n" + "Usage: bacula-sd [options] [-c config_file] [config_file]\n" + " -c use as configuration file\n" + " -d [,] set debug level to , debug tags to \n" + " -dt print timestamp in debug output\n" + " -T set trace on\n" + " -f run in foreground (for debugging)\n" + " -g set groupid to group\n" + " -m print kaboom output (for debugging)\n" + " -p proceed despite I/O errors\n" + " -s no signals (for debugging)\n" + " -t test - read config and exit\n" + " -u userid to \n" + " -v verbose user messages\n" + " -? print this message.\n" + "\n"), 2000, "", VERSION, BDATE); exit(1); } @@ -130,7 +135,7 @@ int main (int argc, char *argv[]) Emsg1(M_ABORT, 0, _("Tape block size (%d) is not a power of 2\n"), TAPE_BSIZE); } - while ((ch = getopt(argc, argv, "c:d:fg:mpstu:v?")) != -1) { + while ((ch = getopt(argc, argv, "c:d:fg:mpstu:v?T")) != -1) { switch (ch) { case 'c': /* configuration file */ if (configfile != NULL) { @@ -143,13 +148,25 @@ int main (int argc, char *argv[]) if (*optarg == 't') { dbg_timestamp = true; } else { + char *p; + /* We probably find a tag list -d 10,sql,bvfs */ + if ((p = strchr(optarg, ',')) != NULL) { + *p = 0; + } debug_level = atoi(optarg); if (debug_level <= 0) { debug_level = 1; } + if (p) { + debug_parse_tags(p+1, &debug_level_tags); + } } break; + case 'T': + set_trace(true); + break; + case 'f': /* run in foreground */ foreground = true; break; @@ -297,7 +314,6 @@ static int check_resources() bool OK = true; bool tls_needed; - me = (STORES *)GetNextRes(R_STORAGE, NULL); if (!me) { Jmsg1(NULL, M_ERROR, 0, _("No Storage resource defined in %s. Cannot continue.\n"), @@ -528,7 +544,6 @@ get_out2: free_pool_memory(basename); } - /* * Here we attempt to init and open each device. This is done * once at startup in a separate thread. @@ -545,6 +560,7 @@ void *device_initialization(void *arg) pthread_detach(pthread_self()); jcr = new_jcr(sizeof(JCR), stored_free_jcr); + new_plugins(jcr); /* instantiate plugins */ jcr->setJobType(JT_SYSTEM); /* Initialize FD start condition variable */ int errstat = pthread_cond_init(&jcr->job_start_wait, NULL); @@ -564,20 +580,29 @@ void *device_initialization(void *arg) jcr->dcr = dcr = new_dcr(jcr, NULL, dev); generate_plugin_event(jcr, bsdEventDeviceInit, dcr); - if (dev->is_autochanger()) { - /* If autochanger set slot in dev sturcture */ - get_autochanger_loaded_slot(dcr); - } if (device->cap_bits & CAP_ALWAYSOPEN) { + if (dev->is_autochanger()) { + /* If autochanger set slot in dev sturcture */ + get_autochanger_loaded_slot(dcr); + } Dmsg1(20, "calling first_open_device %s\n", dev->print_name()); + if (generate_plugin_event(jcr, bsdEventDeviceOpen, dcr) != bRC_OK) { + Jmsg(jcr, M_FATAL, 0, _("generate_plugin_event(bsdEventDeviceOpen) Failed\n")); + continue; + } + if (!first_open_device(dcr)) { Jmsg1(NULL, M_ERROR, 0, _("Could not open device %s\n"), dev->print_name()); Dmsg1(20, "Could not open device %s\n", dev->print_name()); + generate_plugin_event(jcr, bsdEventDeviceClose, dcr); free_dcr(dcr); jcr->dcr = NULL; continue; } + } else { + /* If not always open, we don't know what is in the drive */ + dev->clear_slot(); } if (device->cap_bits & CAP_AUTOMOUNT && dev->is_open()) { switch (read_dev_volume_label(dcr)) { @@ -590,12 +615,15 @@ void *device_initialization(void *arg) break; } } + free_dcr(dcr); jcr->dcr = NULL; } + + #ifdef xxx if (jcr->dcr) { - Dmsg1(000, "free_dcr=%p\n", jcr->dcr); + Pmsg1(000, "free_dcr=%p\n", jcr->dcr); free_dcr(jcr->dcr); jcr->dcr = NULL; } @@ -623,7 +651,7 @@ void terminate_stored(int sig) debug_level = 0; /* turn off any debug */ stop_watchdog(); - if (sig == SIGTERM) { /* normal shutdown request? */ + if (sig == SIGTERM || sig == SIGINT) { /* normal shutdown request? or ^C */ /* * This is a normal shutdown request. We wiffle through * all open jobs canceling them and trying to wake @@ -636,6 +664,10 @@ void terminate_stored(int sig) free_jcr(jcr); continue; /* ignore console */ } + if (jcr->dcr) { + /* Make sure no device remains locked */ + generate_plugin_event(jcr, bsdEventDeviceClose, jcr->dcr); + } jcr->setJobStatus(JS_Canceled); fd = jcr->file_bsock; if (fd) { @@ -680,6 +712,7 @@ void terminate_stored(int sig) if (server_tid_valid) { bnet_stop_thread_server(server_tid); } + if (configfile) { free(configfile); configfile = NULL; diff --git a/bacula/src/stored/stored.conf.in b/bacula/src/stored/stored.conf.in index 6aa82cd3c1..062e20681f 100644 --- a/bacula/src/stored/stored.conf.in +++ b/bacula/src/stored/stored.conf.in @@ -3,6 +3,9 @@ # # For Bacula release @VERSION@ (@DATE@) -- @DISTNAME@ @DISTVER@ # +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # # "Global" Storage daemon configuration specifications # diff --git a/bacula/src/stored/stored.h b/bacula/src/stored/stored.h index 7721184fed..dc4eb5e34a 100644 --- a/bacula/src/stored/stored.h +++ b/bacula/src/stored/stored.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Storage daemon specific defines and includes diff --git a/bacula/src/stored/stored_conf.c b/bacula/src/stored/stored_conf.c index 4f4afabf7d..3480d7328a 100644 --- a/bacula/src/stored/stored_conf.c +++ b/bacula/src/stored/stored_conf.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Configuration file parser for Bacula Storage daemon @@ -28,7 +32,6 @@ int32_t r_last = R_LAST; static RES *sres_head[R_LAST - R_FIRST + 1]; RES **res_head = sres_head; - /* We build the current resource here statically, * then move it to dynamic memory */ #if defined(_MSC_VER) @@ -45,122 +48,131 @@ int32_t res_all_size = sizeof(res_all); * information. */ -/* Globals for the Storage daemon. */ +/* + * Globals for the Storage daemon. + * name handler value code flags default_value + */ static RES_ITEM store_items[] = { - {"name", store_name, ITEM(res_store.hdr.name), 0, ITEM_REQUIRED, 0}, - {"description", store_str, ITEM(res_dir.hdr.desc), 0, 0, 0}, - {"sdaddress", store_addresses_address, ITEM(res_store.sdaddrs), 0, ITEM_DEFAULT, 9103}, - {"sdaddresses", store_addresses, ITEM(res_store.sdaddrs), 0, ITEM_DEFAULT, 9103}, - {"messages", store_res, ITEM(res_store.messages), R_MSGS, 0, 0}, - {"sdport", store_addresses_port, ITEM(res_store.sdaddrs), 0, ITEM_DEFAULT, 9103}, - {"workingdirectory", store_dir, ITEM(res_store.working_directory), 0, ITEM_REQUIRED, 0}, - {"piddirectory", store_dir, ITEM(res_store.pid_directory), 0, ITEM_REQUIRED, 0}, - {"subsysdirectory", store_dir, ITEM(res_store.subsys_directory), 0, 0, 0}, - {"plugindirectory", store_dir, ITEM(res_store.plugin_directory), 0, 0, 0}, - {"scriptsdirectory", store_dir, ITEM(res_store.scripts_directory), 0, 0, 0}, - {"maximumconcurrentjobs", store_pint32, ITEM(res_store.max_concurrent_jobs), 0, ITEM_DEFAULT, 20}, - {"heartbeatinterval", store_time, ITEM(res_store.heartbeat_interval), 0, ITEM_DEFAULT, 5 * 60}, - {"tlsauthenticate", store_bool, ITEM(res_store.tls_authenticate), 0, 0, 0}, - {"tlsenable", store_bool, ITEM(res_store.tls_enable), 0, 0, 0}, - {"tlsrequire", store_bool, ITEM(res_store.tls_require), 0, 0, 0}, - {"tlsverifypeer", store_bool, ITEM(res_store.tls_verify_peer), 1, ITEM_DEFAULT, 1}, - {"tlscacertificatefile", store_dir, ITEM(res_store.tls_ca_certfile), 0, 0, 0}, - {"tlscacertificatedir", store_dir, ITEM(res_store.tls_ca_certdir), 0, 0, 0}, - {"tlscertificate", store_dir, ITEM(res_store.tls_certfile), 0, 0, 0}, - {"tlskey", store_dir, ITEM(res_store.tls_keyfile), 0, 0, 0}, - {"tlsdhfile", store_dir, ITEM(res_store.tls_dhfile), 0, 0, 0}, - {"tlsallowedcn", store_alist_str, ITEM(res_store.tls_allowed_cns), 0, 0, 0}, - {"clientconnectwait", store_time, ITEM(res_store.client_wait), 0, ITEM_DEFAULT, 30 * 60}, - {"verid", store_str, ITEM(res_store.verid), 0, 0, 0}, + {"Name", store_name, ITEM(res_store.hdr.name), 0, ITEM_REQUIRED, 0}, + {"Description", store_str, ITEM(res_dir.hdr.desc), 0, 0, 0}, + {"SdAddress", store_addresses_address, ITEM(res_store.sdaddrs), 0, ITEM_DEFAULT, 9103}, + {"SdAddresses", store_addresses, ITEM(res_store.sdaddrs), 0, ITEM_DEFAULT, 9103}, + {"Messages", store_res, ITEM(res_store.messages), R_MSGS, 0, 0}, + {"SdPort", store_addresses_port, ITEM(res_store.sdaddrs), 0, ITEM_DEFAULT, 9103}, + {"WorkingDirectory", store_dir, ITEM(res_store.working_directory), 0, ITEM_REQUIRED, 0}, + {"PidDirectory", store_dir, ITEM(res_store.pid_directory), 0, ITEM_REQUIRED, 0}, + {"SubsysDirectory", store_dir, ITEM(res_store.subsys_directory), 0, 0, 0}, + {"PluginDirectory", store_dir, ITEM(res_store.plugin_directory), 0, 0, 0}, + {"ScriptsDirectory", store_dir, ITEM(res_store.scripts_directory), 0, 0, 0}, + {"MaximumConcurrentJobs", store_pint32, ITEM(res_store.max_concurrent_jobs), 0, ITEM_DEFAULT, 20}, + {"ClientConnectTimeout", store_time, ITEM(res_store.ClientConnectTimeout), 0, ITEM_DEFAULT, 60 * 30}, + {"HeartbeatInterval", store_time, ITEM(res_store.heartbeat_interval), 0, ITEM_DEFAULT, 5 * 60}, + {"TlsAuthenticate", store_bool, ITEM(res_store.tls_authenticate), 0, 0, 0}, + {"TlsEnable", store_bool, ITEM(res_store.tls_enable), 0, 0, 0}, + {"TlsRequire", store_bool, ITEM(res_store.tls_require), 0, 0, 0}, + {"TlsVerifyPeer", store_bool, ITEM(res_store.tls_verify_peer), 1, ITEM_DEFAULT, 1}, + {"TlsCaCertificateFile", store_dir, ITEM(res_store.tls_ca_certfile), 0, 0, 0}, + {"TlsCaCertificateDir", store_dir, ITEM(res_store.tls_ca_certdir), 0, 0, 0}, + {"TlsCertificate", store_dir, ITEM(res_store.tls_certfile), 0, 0, 0}, + {"TlsKey", store_dir, ITEM(res_store.tls_keyfile), 0, 0, 0}, + {"TlsDhFile", store_dir, ITEM(res_store.tls_dhfile), 0, 0, 0}, + {"TlsAllowedCn", store_alist_str, ITEM(res_store.tls_allowed_cns), 0, 0, 0}, + {"ClientConnectWait", store_time, ITEM(res_store.client_wait), 0, ITEM_DEFAULT, 30 * 60}, + {"VerId", store_str, ITEM(res_store.verid), 0, 0, 0}, {NULL, NULL, {0}, 0, 0, 0} }; /* Directors that can speak to the Storage daemon */ static RES_ITEM dir_items[] = { - {"name", store_name, ITEM(res_dir.hdr.name), 0, ITEM_REQUIRED, 0}, - {"description", store_str, ITEM(res_dir.hdr.desc), 0, 0, 0}, - {"password", store_password, ITEM(res_dir.password), 0, ITEM_REQUIRED, 0}, - {"monitor", store_bool, ITEM(res_dir.monitor), 0, 0, 0}, - {"tlsauthenticate", store_bool, ITEM(res_dir.tls_authenticate), 0, 0, 0}, - {"tlsenable", store_bool, ITEM(res_dir.tls_enable), 0, 0, 0}, - {"tlsrequire", store_bool, ITEM(res_dir.tls_require), 0, 0, 0}, - {"tlsverifypeer", store_bool, ITEM(res_dir.tls_verify_peer), 1, ITEM_DEFAULT, 1}, - {"tlscacertificatefile", store_dir, ITEM(res_dir.tls_ca_certfile), 0, 0, 0}, - {"tlscacertificatedir", store_dir, ITEM(res_dir.tls_ca_certdir), 0, 0, 0}, - {"tlscertificate", store_dir, ITEM(res_dir.tls_certfile), 0, 0, 0}, - {"tlskey", store_dir, ITEM(res_dir.tls_keyfile), 0, 0, 0}, - {"tlsdhfile", store_dir, ITEM(res_dir.tls_dhfile), 0, 0, 0}, - {"tlsallowedcn", store_alist_str, ITEM(res_dir.tls_allowed_cns), 0, 0, 0}, + {"Name", store_name, ITEM(res_dir.hdr.name), 0, ITEM_REQUIRED, 0}, + {"Description", store_str, ITEM(res_dir.hdr.desc), 0, 0, 0}, + {"Password", store_password, ITEM(res_dir.password), 0, ITEM_REQUIRED, 0}, + {"Monitor", store_bool, ITEM(res_dir.monitor), 0, 0, 0}, + {"TlsAuthenticate", store_bool, ITEM(res_dir.tls_authenticate), 0, 0, 0}, + {"TlsEnable", store_bool, ITEM(res_dir.tls_enable), 0, 0, 0}, + {"TlsRequire", store_bool, ITEM(res_dir.tls_require), 0, 0, 0}, + {"TlsVerifyPeer", store_bool, ITEM(res_dir.tls_verify_peer), 1, ITEM_DEFAULT, 1}, + {"TlsCaCertificateFile", store_dir, ITEM(res_dir.tls_ca_certfile), 0, 0, 0}, + {"TlsCaCertificateDir", store_dir, ITEM(res_dir.tls_ca_certdir), 0, 0, 0}, + {"TlsCertificate", store_dir, ITEM(res_dir.tls_certfile), 0, 0, 0}, + {"TlsKey", store_dir, ITEM(res_dir.tls_keyfile), 0, 0, 0}, + {"TlsDhFile", store_dir, ITEM(res_dir.tls_dhfile), 0, 0, 0}, + {"TlsAllowedCn", store_alist_str, ITEM(res_dir.tls_allowed_cns), 0, 0, 0}, {NULL, NULL, {0}, 0, 0, 0} }; /* Device definition */ static RES_ITEM dev_items[] = { - {"name", store_name, ITEM(res_dev.hdr.name), 0, ITEM_REQUIRED, 0}, - {"description", store_str, ITEM(res_dir.hdr.desc), 0, 0, 0}, - {"mediatype", store_strname,ITEM(res_dev.media_type), 0, ITEM_REQUIRED, 0}, - {"devicetype", store_devtype,ITEM(res_dev.dev_type), 0, 0, 0}, - {"archivedevice", store_strname,ITEM(res_dev.device_name), 0, ITEM_REQUIRED, 0}, - {"hardwareendoffile", store_bit, ITEM(res_dev.cap_bits), CAP_EOF, ITEM_DEFAULT, 1}, - {"hardwareendofmedium", store_bit, ITEM(res_dev.cap_bits), CAP_EOM, ITEM_DEFAULT, 1}, - {"backwardspacerecord", store_bit, ITEM(res_dev.cap_bits), CAP_BSR, ITEM_DEFAULT, 1}, - {"backwardspacefile", store_bit, ITEM(res_dev.cap_bits), CAP_BSF, ITEM_DEFAULT, 1}, - {"bsfateom", store_bit, ITEM(res_dev.cap_bits), CAP_BSFATEOM, ITEM_DEFAULT, 0}, - {"twoeof", store_bit, ITEM(res_dev.cap_bits), CAP_TWOEOF, ITEM_DEFAULT, 0}, - {"forwardspacerecord", store_bit, ITEM(res_dev.cap_bits), CAP_FSR, ITEM_DEFAULT, 1}, - {"forwardspacefile", store_bit, ITEM(res_dev.cap_bits), CAP_FSF, ITEM_DEFAULT, 1}, - {"fastforwardspacefile", store_bit, ITEM(res_dev.cap_bits), CAP_FASTFSF, ITEM_DEFAULT, 1}, - {"removablemedia", store_bit, ITEM(res_dev.cap_bits), CAP_REM, ITEM_DEFAULT, 1}, - {"randomaccess", store_bit, ITEM(res_dev.cap_bits), CAP_RACCESS, 0, 0}, - {"automaticmount", store_bit, ITEM(res_dev.cap_bits), CAP_AUTOMOUNT, ITEM_DEFAULT, 0}, - {"labelmedia", store_bit, ITEM(res_dev.cap_bits), CAP_LABEL, ITEM_DEFAULT, 0}, - {"alwaysopen", store_bit, ITEM(res_dev.cap_bits), CAP_ALWAYSOPEN, ITEM_DEFAULT, 1}, - {"autochanger", store_bit, ITEM(res_dev.cap_bits), CAP_AUTOCHANGER, ITEM_DEFAULT, 0}, - {"closeonpoll", store_bit, ITEM(res_dev.cap_bits), CAP_CLOSEONPOLL, ITEM_DEFAULT, 0}, - {"blockpositioning", store_bit, ITEM(res_dev.cap_bits), CAP_POSITIONBLOCKS, ITEM_DEFAULT, 1}, - {"usemtiocget", store_bit, ITEM(res_dev.cap_bits), CAP_MTIOCGET, ITEM_DEFAULT, 1}, - {"checklabels", store_bit, ITEM(res_dev.cap_bits), CAP_CHECKLABELS, ITEM_DEFAULT, 0}, - {"requiresmount", store_bit, ITEM(res_dev.cap_bits), CAP_REQMOUNT, ITEM_DEFAULT, 0}, - {"offlineonunmount", store_bit, ITEM(res_dev.cap_bits), CAP_OFFLINEUNMOUNT, ITEM_DEFAULT, 0}, - {"blockchecksum", store_bit, ITEM(res_dev.cap_bits), CAP_BLOCKCHECKSUM, ITEM_DEFAULT, 1}, - {"autoselect", store_bool, ITEM(res_dev.autoselect), 1, ITEM_DEFAULT, 1}, - {"readonly", store_bool, ITEM(res_dev.read_only), 1, ITEM_DEFAULT, 0}, - {"changerdevice", store_strname,ITEM(res_dev.changer_name), 0, 0, 0}, - {"changercommand", store_strname,ITEM(res_dev.changer_command), 0, 0, 0}, - {"alertcommand", store_strname,ITEM(res_dev.alert_command), 0, 0, 0}, - {"maximumchangerwait", store_time, ITEM(res_dev.max_changer_wait), 0, ITEM_DEFAULT, 5 * 60}, - {"maximumopenwait", store_time, ITEM(res_dev.max_open_wait), 0, ITEM_DEFAULT, 5 * 60}, - {"maximumnetworkbuffersize", store_pint32, ITEM(res_dev.max_network_buffer_size), 0, 0, 0}, - {"volumepollinterval", store_time, ITEM(res_dev.vol_poll_interval), 0, ITEM_DEFAULT, 5 * 60}, - {"maximumrewindwait", store_time, ITEM(res_dev.max_rewind_wait), 0, ITEM_DEFAULT, 5 * 60}, - {"minimumblocksize", store_pint32, ITEM(res_dev.min_block_size), 0, 0, 0}, - {"maximumblocksize", store_maxblocksize, ITEM(res_dev.max_block_size), 0, 0, 0}, - {"maximumvolumesize", store_size64, ITEM(res_dev.max_volume_size), 0, 0, 0}, - {"maximumfilesize", store_size64, ITEM(res_dev.max_file_size), 0, ITEM_DEFAULT, 1000000000}, - {"volumecapacity", store_size64, ITEM(res_dev.volume_capacity), 0, 0, 0}, - {"maximumconcurrentjobs", store_pint32, ITEM(res_dev.max_concurrent_jobs), 0, 0, 0}, - {"spooldirectory", store_dir, ITEM(res_dev.spool_directory), 0, 0, 0}, - {"maximumspoolsize", store_size64, ITEM(res_dev.max_spool_size), 0, 0, 0}, - {"maximumjobspoolsize", store_size64, ITEM(res_dev.max_job_spool_size), 0, 0, 0}, - {"driveindex", store_pint32, ITEM(res_dev.drive_index), 0, 0, 0}, - {"maximumpartsize", store_size64, ITEM(res_dev.max_part_size), 0, ITEM_DEFAULT, 0}, - {"mountpoint", store_strname,ITEM(res_dev.mount_point), 0, 0, 0}, - {"mountcommand", store_strname,ITEM(res_dev.mount_command), 0, 0, 0}, - {"unmountcommand", store_strname,ITEM(res_dev.unmount_command), 0, 0, 0}, - {"writepartcommand", store_strname,ITEM(res_dev.write_part_command), 0, 0, 0}, - {"freespacecommand", store_strname,ITEM(res_dev.free_space_command), 0, 0, 0}, - {"labeltype", store_label, ITEM(res_dev.label_type), 0, 0, 0}, + {"Name", store_name, ITEM(res_dev.hdr.name), 0, ITEM_REQUIRED, 0}, + {"Description", store_str, ITEM(res_dir.hdr.desc), 0, 0, 0}, + {"MediaType", store_strname,ITEM(res_dev.media_type), 0, ITEM_REQUIRED, 0}, + {"DeviceType", store_devtype,ITEM(res_dev.dev_type), 0, 0, 0}, + {"ArchiveDevice", store_strname,ITEM(res_dev.device_name), 0, ITEM_REQUIRED, 0}, + {"HardwareEndOfFile", store_bit, ITEM(res_dev.cap_bits), CAP_EOF, ITEM_DEFAULT, 1}, + {"HardwareEndOfMedium", store_bit, ITEM(res_dev.cap_bits), CAP_EOM, ITEM_DEFAULT, 1}, + {"BackwardSpaceRecord", store_bit, ITEM(res_dev.cap_bits), CAP_BSR, ITEM_DEFAULT, 1}, + {"BackwardSpaceFile", store_bit, ITEM(res_dev.cap_bits), CAP_BSF, ITEM_DEFAULT, 1}, + {"BsfAtEom", store_bit, ITEM(res_dev.cap_bits), CAP_BSFATEOM, ITEM_DEFAULT, 0}, + {"TwoEof", store_bit, ITEM(res_dev.cap_bits), CAP_TWOEOF, ITEM_DEFAULT, 0}, + {"ForwardSpaceRecord", store_bit, ITEM(res_dev.cap_bits), CAP_FSR, ITEM_DEFAULT, 1}, + {"ForwardSpaceFile", store_bit, ITEM(res_dev.cap_bits), CAP_FSF, ITEM_DEFAULT, 1}, + {"FastForwardSpaceFile", store_bit, ITEM(res_dev.cap_bits), CAP_FASTFSF, ITEM_DEFAULT, 1}, + {"RemovableMedia", store_bit, ITEM(res_dev.cap_bits), CAP_REM, ITEM_DEFAULT, 1}, + {"RandomAccess", store_bit, ITEM(res_dev.cap_bits), CAP_RACCESS, 0, 0}, + {"AutomaticMount", store_bit, ITEM(res_dev.cap_bits), CAP_AUTOMOUNT, ITEM_DEFAULT, 0}, + {"LabelMedia", store_bit, ITEM(res_dev.cap_bits), CAP_LABEL, ITEM_DEFAULT, 0}, + {"AlwaysOpen", store_bit, ITEM(res_dev.cap_bits), CAP_ALWAYSOPEN, ITEM_DEFAULT, 1}, + {"Autochanger", store_bit, ITEM(res_dev.cap_bits), CAP_AUTOCHANGER, ITEM_DEFAULT, 0}, + {"CloseOnPoll", store_bit, ITEM(res_dev.cap_bits), CAP_CLOSEONPOLL, ITEM_DEFAULT, 0}, + {"BlockPositioning", store_bit, ITEM(res_dev.cap_bits), CAP_POSITIONBLOCKS, ITEM_DEFAULT, 1}, + {"UseMtiocGet", store_bit, ITEM(res_dev.cap_bits), CAP_MTIOCGET, ITEM_DEFAULT, 1}, + {"CheckLabels", store_bit, ITEM(res_dev.cap_bits), CAP_CHECKLABELS, ITEM_DEFAULT, 0}, + {"RequiresMount", store_bit, ITEM(res_dev.cap_bits), CAP_REQMOUNT, ITEM_DEFAULT, 0}, + {"OfflineOnUnmount", store_bit, ITEM(res_dev.cap_bits), CAP_OFFLINEUNMOUNT, ITEM_DEFAULT, 0}, + {"BlockChecksum", store_bit, ITEM(res_dev.cap_bits), CAP_BLOCKCHECKSUM, ITEM_DEFAULT, 1}, + {"Enabled", store_bool, ITEM(res_dev.enabled), 0, ITEM_DEFAULT, 1}, + {"AutoSelect", store_bool, ITEM(res_dev.autoselect), 0, ITEM_DEFAULT, 1}, + {"ReadOnly", store_bool, ITEM(res_dev.read_only), 0, ITEM_DEFAULT, 0}, + {"ChangerDevice", store_strname,ITEM(res_dev.changer_name), 0, 0, 0}, + {"ControlDevice", store_strname,ITEM(res_dev.control_name), 0, 0, 0}, + {"ChangerCommand", store_strname,ITEM(res_dev.changer_command), 0, 0, 0}, + {"AlertCommand", store_strname,ITEM(res_dev.alert_command), 0, 0, 0}, + {"MaximumChangerWait", store_time, ITEM(res_dev.max_changer_wait), 0, ITEM_DEFAULT, 5 * 60}, + {"MaximumOpenWait", store_time, ITEM(res_dev.max_open_wait), 0, ITEM_DEFAULT, 5 * 60}, + {"MaximumNetworkBufferSize", store_pint32, ITEM(res_dev.max_network_buffer_size), 0, 0, 0}, + {"VolumePollInterval", store_time, ITEM(res_dev.vol_poll_interval), 0, ITEM_DEFAULT, 5 * 60}, + {"MaximumRewindWait", store_time, ITEM(res_dev.max_rewind_wait), 0, ITEM_DEFAULT, 5 * 60}, + {"MinimumBlockSize", store_size32, ITEM(res_dev.min_block_size), 0, 0, 0}, + {"MaximumBlockSize", store_maxblocksize, ITEM(res_dev.max_block_size), 0, 0, 0}, + {"PaddingSize", store_size32, ITEM(res_dev.padding_size), 0, ITEM_DEFAULT, 4096}, + {"FileAlignment", store_size32, ITEM(res_dev.file_alignment), 0, ITEM_DEFAULT, 4096}, + {"MaximumVolumeSize", store_size64, ITEM(res_dev.max_volume_size), 0, 0, 0}, + {"MaximumFileSize", store_size64, ITEM(res_dev.max_file_size), 0, ITEM_DEFAULT, 1000000000}, + {"VolumeCapacity", store_size64, ITEM(res_dev.volume_capacity), 0, 0, 0}, + {"MinimumFeeSpace", store_size64, ITEM(res_dev.min_free_space), 0, ITEM_DEFAULT, 5000000}, + {"MaximumConcurrentJobs", store_pint32, ITEM(res_dev.max_concurrent_jobs), 0, 0, 0}, + {"SpoolDirectory", store_dir, ITEM(res_dev.spool_directory), 0, 0, 0}, + {"MaximumSpoolSize", store_size64, ITEM(res_dev.max_spool_size), 0, 0, 0}, + {"MaximumJobSpoolSize", store_size64, ITEM(res_dev.max_job_spool_size), 0, 0, 0}, + {"DriveIndex", store_pint32, ITEM(res_dev.drive_index), 0, 0, 0}, + {"MaximumPartSize", store_size64, ITEM(res_dev.max_part_size), 0, ITEM_DEFAULT, 0}, + {"MountPoint", store_strname,ITEM(res_dev.mount_point), 0, 0, 0}, + {"MountCommand", store_strname,ITEM(res_dev.mount_command), 0, 0, 0}, + {"UnmountCommand", store_strname,ITEM(res_dev.unmount_command), 0, 0, 0}, + {"WritePartCommand", store_strname,ITEM(res_dev.write_part_command), 0, 0, 0}, + {"FreeSpaceCommand", store_strname,ITEM(res_dev.free_space_command), 0, 0, 0}, + {"LabelType", store_label, ITEM(res_dev.label_type), 0, 0, 0}, {NULL, NULL, {0}, 0, 0, 0} }; /* Autochanger definition */ static RES_ITEM changer_items[] = { - {"name", store_name, ITEM(res_changer.hdr.name), 0, ITEM_REQUIRED, 0}, - {"description", store_str, ITEM(res_changer.hdr.desc), 0, 0, 0}, - {"device", store_alist_res, ITEM(res_changer.device), R_DEVICE, ITEM_REQUIRED, 0}, - {"changerdevice", store_strname, ITEM(res_changer.changer_name), 0, ITEM_REQUIRED, 0}, - {"changercommand", store_strname, ITEM(res_changer.changer_command), 0, ITEM_REQUIRED, 0}, + {"Name", store_name, ITEM(res_changer.hdr.name), 0, ITEM_REQUIRED, 0}, + {"Description", store_str, ITEM(res_changer.hdr.desc), 0, 0, 0}, + {"Device", store_alist_res, ITEM(res_changer.device), R_DEVICE, ITEM_REQUIRED, 0}, + {"ChangerDevice", store_strname, ITEM(res_changer.changer_name), 0, ITEM_REQUIRED, 0}, + {"ChangerCommand", store_strname, ITEM(res_changer.changer_command), 0, ITEM_REQUIRED, 0}, {NULL, NULL, {0}, 0, 0, 0} }; @@ -174,11 +186,11 @@ extern RES_ITEM msgs_items[]; /* This is the master resource definition */ RES_TABLE resources[] = { - {"director", dir_items, R_DIRECTOR}, - {"storage", store_items, R_STORAGE}, - {"device", dev_items, R_DEVICE}, - {"messages", msgs_items, R_MSGS}, - {"autochanger", changer_items, R_AUTOCHANGER}, + {"Director", dir_items, R_DIRECTOR}, + {"Storage", store_items, R_STORAGE}, + {"Device", dev_items, R_DEVICE}, + {"Messages", msgs_items, R_MSGS}, + {"Autochanger", changer_items, R_AUTOCHANGER}, {NULL, NULL, 0} }; @@ -187,18 +199,13 @@ RES_TABLE resources[] = { * * device type device code = token */ -struct s_kw { - const char *name; - int32_t token; -}; - -static s_kw dev_types[] = { - {"file", B_FILE_DEV}, - {"tape", B_TAPE_DEV}, - {"dvd", B_DVD_DEV}, - {"fifo", B_FIFO_DEV}, - {"vtl", B_VTL_DEV}, - {"vtape", B_VTAPE_DEV}, +s_kw dev_types[] = { + {"File", B_FILE_DEV}, + {"Tape", B_TAPE_DEV}, + {"Dvd", B_DVD_DEV}, + {"Fifo", B_FIFO_DEV}, + {"Vtl", B_VTL_DEV}, + {"VTape", B_VTAPE_DEV}, {NULL, 0} }; @@ -240,11 +247,10 @@ void store_maxblocksize(LEX *lc, RES_ITEM *item, int index, int pass) } } - /* Dump contents of resource */ -void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fmt, ...), void *sock) +void dump_resource(int type, RES *rres, void sendit(void *sock, const char *fmt, ...), void *sock) { - URES *res = (URES *)reshdr; + URES *res = (URES *)rres; char buf[1000]; int recurse = 1; IPADDR *p; @@ -286,16 +292,18 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fm res->res_dev.hdr.name, res->res_dev.media_type, res->res_dev.device_name, res->res_dev.label_type); - sendit(sock, " rew_wait=%" lld " min_bs=%d max_bs=%d chgr_wait=%" lld "\n", + sendit(sock, " rew_wait=%lld min_bs=%d max_bs=%d chgr_wait=%lld\n", res->res_dev.max_rewind_wait, res->res_dev.min_block_size, res->res_dev.max_block_size, res->res_dev.max_changer_wait); - sendit(sock, " max_jobs=%d max_files=%" lld " max_size=%" lld "\n", + sendit(sock, " max_jobs=%d max_files=%lld max_size=%lld\n", res->res_dev.max_volume_jobs, res->res_dev.max_volume_files, res->res_dev.max_volume_size); - sendit(sock, " max_file_size=%" lld " capacity=%" lld "\n", + sendit(sock, " min_block_size=%lld max_block_size=%lld\n", + res->res_dev.min_block_size, res->res_dev.max_block_size); + sendit(sock, " max_file_size=%lld capacity=%lld\n", res->res_dev.max_file_size, res->res_dev.volume_capacity); sendit(sock, " spool_directory=%s\n", NPRT(res->res_dev.spool_directory)); - sendit(sock, " max_spool_size=%" lld " max_job_spool_size=%" lld "\n", + sendit(sock, " max_spool_size=%lld max_job_spool_size=%lld\n", res->res_dev.max_spool_size, res->res_dev.max_job_spool_size); if (res->res_dev.changer_res) { sendit(sock, " changer=%p\n", res->res_dev.changer_res); @@ -371,8 +379,9 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fm sendit(sock, _("Warning: unknown resource type %d\n"), type); break; } - if (recurse && res->res_dir.hdr.next) + if (recurse && res->res_dir.hdr.next) { dump_resource(type, (RES *)res->res_dir.hdr.next, sendit, sock); + } } /* @@ -496,6 +505,9 @@ void free_resource(RES *sres, int type) if (res->res_dev.device_name) { free(res->res_dev.device_name); } + if (res->res_dev.control_name) { + free(res->res_dev.control_name); + } if (res->res_dev.changer_name) { free(res->res_dev.changer_name); } @@ -678,7 +690,7 @@ void save_resource(int type, RES_ITEM *items, int pass) last = next; if (strcmp(next->name, res->res_dir.hdr.name) == 0) { Emsg2(M_ERROR_TERM, 0, - _("Attempt to define second \"%s\" resource named \"%s\" is not permitted.\n"), + _("Attempt to define second %s resource named \"%s\" is not permitted.\n"), resources[rindex].name, res->res_dir.hdr.name); } } diff --git a/bacula/src/stored/stored_conf.h b/bacula/src/stored/stored_conf.h index 98c2925a7d..a262f1f8d6 100644 --- a/bacula/src/stored/stored_conf.h +++ b/bacula/src/stored/stored_conf.h @@ -1,19 +1,24 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ +extern s_kw dev_types[]; /* * Resource codes -- they must be sequential for indexing @@ -91,6 +96,7 @@ public: alist *tls_allowed_cns; /* TLS Allowed Clients */ char *verid; /* Custom Id to print in version command */ TLS_CONTEXT *tls_ctx; /* Shared TLS Context */ + }; typedef class s_res_store STORES; @@ -117,6 +123,7 @@ public: char *spool_directory; /* Spool file directory */ uint32_t dev_type; /* device type */ uint32_t label_type; /* label type */ + bool enabled; /* Set when enabled (default) */ bool autoselect; /* Automatically select from AutoChanger */ bool read_only; /* Drive is read only */ uint32_t drive_index; /* Autochanger drive index */ @@ -124,6 +131,8 @@ public: utime_t max_changer_wait; /* Changer timeout */ utime_t max_rewind_wait; /* maximum secs to wait for rewind */ utime_t max_open_wait; /* maximum secs to wait for open */ + uint32_t padding_size; /* adata block padding -- bytes */ + uint32_t file_alignment; /* adata file alignment -- bytes */ uint32_t min_block_size; /* min block size */ uint32_t max_block_size; /* max block size */ uint32_t max_volume_jobs; /* max jobs to put on one volume */ diff --git a/bacula/src/stored/tape_dev.c b/bacula/src/stored/tape_dev.c index 281b85af2f..0119ee028e 100644 --- a/bacula/src/stored/tape_dev.c +++ b/bacula/src/stored/tape_dev.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -895,7 +899,6 @@ bool tape_dev::reposition(DCR *dcr, uint32_t rfile, uint32_t rblock) return true; } - /* * Write an end of file on the device * Returns: true on success @@ -944,10 +947,40 @@ bool DEVICE::weof(int num) return stat == 0; } +/* + * If timeout, wait until the mount command returns 0. + * If !timeout, try to mount the device only once. + */ +bool tape_dev::mount(int timeout) +{ + Dmsg0(190, "Enter tape mount\n"); + + if (!is_mounted() && device->mount_command) { + return mount_tape(1, timeout); + } + return true; +} + +/* + * Unmount the device + * If timeout, wait until the unmount command returns 0. + * If !timeout, try to unmount the device only once. + */ +bool tape_dev::unmount(int timeout) +{ + Dmsg0(100, "Enter tape unmount\n"); + + if (!is_mounted() && requires_mount() && device->unmount_command) { + return mount_tape(0, timeout); + } + return true; +} + + /* * (Un)mount the device (for tape devices) */ -bool DEVICE::do_tape_mount(int mount, int dotimeout) +bool tape_dev::mount_tape(int mount, int dotimeout) { POOL_MEM ocmd(PM_FNAME); POOLMEM *results; @@ -964,7 +997,7 @@ bool DEVICE::do_tape_mount(int mount, int dotimeout) edit_mount_codes(ocmd, icmd); - Dmsg2(100, "do_tape_mount: cmd=%s mounted=%d\n", ocmd.c_str(), !!is_mounted()); + Dmsg2(100, "mount_tape: cmd=%s mounted=%d\n", ocmd.c_str(), !!is_mounted()); if (dotimeout) { /* Try at most 10 times to (un)mount the device. This should perhaps be configurable. */ @@ -975,7 +1008,7 @@ bool DEVICE::do_tape_mount(int mount, int dotimeout) results = get_memory(4000); /* If busy retry each second */ - Dmsg1(100, "do_tape_mount run_prog=%s\n", ocmd.c_str()); + Dmsg1(100, "mount_tape run_prog=%s\n", ocmd.c_str()); while ((status = run_program_full_output(ocmd.c_str(), max_open_wait/2, results)) != 0) { if (tries-- > 0) { continue; diff --git a/bacula/src/stored/tape_dev.h b/bacula/src/stored/tape_dev.h index f6e087b0f0..c4dd9ce730 100644 --- a/bacula/src/stored/tape_dev.h +++ b/bacula/src/stored/tape_dev.h @@ -1,17 +1,21 @@ -/* - Bacula® - The Network Backup Solution +/* [vssfs.c] IQ + Bacula(R) - The Network Backup Solution - Copyright (C) 2014-2014 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Inspired by vtape.h @@ -34,6 +38,9 @@ public: void lock_door(); void unlock_door(); bool reposition(DCR *dcr, uint32_t rfile, uint32_t rblock); + bool mount(int timeout); + bool unmount(int timeout); + bool mount_tape(int mount, int dotimeout); }; #endif /* __TAPE_DEV_ */ diff --git a/bacula/src/stored/vbackup.c b/bacula/src/stored/vbackup.c index a8ae560542..b5715d3fd3 100644 --- a/bacula/src/stored/vbackup.c +++ b/bacula/src/stored/vbackup.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2006-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * SD -- vbackup.c -- responsible for doing virtual backup jobs. @@ -87,7 +91,6 @@ bool do_vbackup(JCR *jcr) } Dmsg2(200, "===== After acquire pos %u:%u\n", jcr->dcr->dev->file, jcr->dcr->dev->block_num); - jcr->sendJobStatus(JS_Running); begin_data_spool(jcr->dcr); @@ -98,6 +101,8 @@ bool do_vbackup(JCR *jcr) set_start_vol_position(jcr->dcr); jcr->JobFiles = 0; + jcr->dcr->set_ameta(); + jcr->read_dcr->set_ameta(); ok = read_records(jcr->read_dcr, record_cb, mount_next_read_volume); goto ok_out; @@ -106,19 +111,20 @@ bail_out: ok_out: if (jcr->dcr) { + jcr->dcr->set_ameta(); dev = jcr->dcr->dev; Dmsg1(100, "ok=%d\n", ok); if (ok || dev->can_write()) { - /* Flush out final partial block of this session */ - if (!jcr->dcr->write_block_to_device()) { + /* Flush out final ameta partial block of this session */ + if (!jcr->dcr->write_final_block_to_device()) { Jmsg2(jcr, M_FATAL, 0, _("Fatal append error on device %s: ERR=%s\n"), dev->print_name(), dev->bstrerror()); - Dmsg0(100, _("Set ok=FALSE after write_block_to_device.\n")); + Dmsg0(100, _("Set ok=FALSE after write_final_block_to_device.\n")); ok = false; } Dmsg2(200, "Flush block to device pos %u:%u\n", dev->file, dev->block_num); } - + flush_jobmedia_queue(jcr); if (!ok) { discard_data_spool(jcr->dcr); } else { @@ -140,12 +146,6 @@ ok_out: job_elapsed / 3600, job_elapsed % 3600 / 60, job_elapsed % 60, edit_uint64_with_suffix(jcr->JobBytes / job_elapsed, ec1)); -#ifdef BUILD_DVD - if (ok && dev->is_dvd()) { - ok = dvd_close_job(jcr->dcr); /* do DVD cleanup if any */ - } -#endif - /* Release the device -- and send final Vol info to DIR */ release_device(jcr->dcr); @@ -193,16 +193,15 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) JCR *jcr = dcr->jcr; DEVICE *dev = jcr->dcr->dev; char buf1[100], buf2[100]; + bool restoredatap = false; + POOLMEM *orgdata = NULL; + uint32_t orgdata_len = 0; + bool ret = false; -#ifdef xxx - Pmsg5(000, "on entry JobId=%d FI=%s SessId=%d Strm=%s len=%d\n", - jcr->JobId, - FI_to_ascii(buf1, rec->FileIndex), rec->VolSessionId, - stream_to_ascii(buf2, rec->Stream, rec->FileIndex), rec->data_len); -#endif /* If label and not for us, discard it */ if (rec->FileIndex < 0 && rec->match_stat <= 0) { - return true; + ret = true; + goto bail_out; } /* We want to write SOS_LABEL and EOS_LABEL discard all others */ switch (rec->FileIndex) { @@ -210,7 +209,8 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) case VOL_LABEL: case EOT_LABEL: case EOM_LABEL: - return true; /* don't write vol labels */ + ret = true; /* don't write vol labels */ + goto bail_out; } /* @@ -244,16 +244,18 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) jcr->JobId, FI_to_ascii(buf1, rec->FileIndex), rec->VolSessionId, stream_to_ascii(buf2, rec->Stream, rec->FileIndex), rec->data_len); + if (!jcr->dcr->write_record(rec)) { Jmsg2(jcr, M_FATAL, 0, _("Fatal append error on device %s: ERR=%s\n"), dev->print_name(), dev->bstrerror()); - return false; + goto bail_out; } /* Restore packet */ rec->VolSessionId = rec->last_VolSessionId; rec->VolSessionTime = rec->last_VolSessionTime; if (rec->FileIndex < 0) { - return true; /* don't send LABELs to Dir */ + ret = true; /* don't send LABELs to Dir */ + goto bail_out; } jcr->JobBytes += rec->data_len; /* increment bytes this job */ Dmsg5(500, "wrote_record JobId=%d FI=%s SessId=%d Strm=%s len=%d\n", @@ -262,6 +264,12 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) stream_to_ascii(buf2, rec->Stream, rec->FileIndex), rec->data_len); send_attrs_to_dir(jcr, rec); + ret = true; - return true; +bail_out: + if (restoredatap) { + rec->data = orgdata; + rec->data_len = orgdata_len; + } + return ret; } diff --git a/bacula/src/stored/vol_mgr.c b/bacula/src/stored/vol_mgr.c index 31bf14a6ce..0b7115473c 100644 --- a/bacula/src/stored/vol_mgr.c +++ b/bacula/src/stored/vol_mgr.c @@ -1,22 +1,26 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Volume management functions for Storage Daemon * - * Written by Kern Sibbald, MM + * Kern Sibbald, MM * * Split from reserve.c October 2008 * @@ -503,26 +507,27 @@ VOLRES *reserve_volume(DCR *dcr, const char *VolumeName) if (dev) { Jmsg8(jcr, M_WARNING, 0, "Need volume for %s from other drive, " "but swap not possible. Status: reader=%d writers=%d " - "reserves=%d swap=%d vol=%s from dev=%s to %s\n", + "reserves=%d swap=%d vol=%s from dev=%s to %s\n", dcr->is_writing()?"write":"read", vol->dev->can_read(), vol->dev->num_writers, vol->dev->num_reserved(), vol->is_swapping(), VolumeName, vol->dev->print_name(), dev->print_name()); } if (vol->is_swapping()) { - if (vol->dev && vol->dev->swap_dev && dev && dev->swap_dev) { + DEVICE *swapdev = dev->swap_dev; + if (vol && dev && swapdev) { Mmsg3(jcr->errmsg, _("Volume %s is busy swapping from %s to %s\n"), - vol->vol_name, dev->print_name(), dev->swap_dev->print_name()); + NPRT(vol->vol_name), dev->print_name(), swapdev->print_name()); } else { Mmsg1(jcr->errmsg, _("Volume %s is busy swapping.\n"), - vol->vol_name); + NPRT(vol->vol_name)); } } else if (vol->dev) { - Mmsg2(jcr->errmsg, _("%s device %s is busy.\n"), + Mmsg2(jcr->errmsg, _("%s device %s is busy.\n"), vol->dev->print_type(), vol->dev->print_name()); } else { Mmsg1(jcr->errmsg, _("Volume %s is busy swapping.\n"), - vol->vol_name); + NPRT(vol->vol_name)); } debug_list_volumes("failed swap"); vol = NULL; /* device busy */ diff --git a/bacula/src/stored/vol_mgr.h b/bacula/src/stored/vol_mgr.h index a065f3fb6c..f492c11eb4 100644 --- a/bacula/src/stored/vol_mgr.h +++ b/bacula/src/stored/vol_mgr.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Pulled out of dev.h diff --git a/bacula/src/stored/vtape_dev.c b/bacula/src/stored/vtape_dev.c index d50cc2ba05..429d4bd361 100644 --- a/bacula/src/stored/vtape_dev.c +++ b/bacula/src/stored/vtape_dev.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2008-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* @@ -436,11 +440,13 @@ int vtape::weof() ASSERT(online); ASSERT(current_file >= 0); +#if 0 if (atEOT) { errno = ENOSPC; current_block = -1; return -1; } +#endif if (!atEOD) { truncate_file(); /* nothing after this point */ @@ -882,8 +888,6 @@ int vtape::d_open(const char *pathname, int uflags) struct flock lock; struct stat statp; - ASSERT(!m_shstore || (m_shstore_lock && m_shstore_register)); - if (stat(pathname, &statp) != 0) { fd = -1; Dmsg1(dbglevel, "Can't stat on %s\n", pathname); diff --git a/bacula/src/stored/vtape_dev.h b/bacula/src/stored/vtape_dev.h index b5aa36b1b0..a53738d226 100644 --- a/bacula/src/stored/vtape_dev.h +++ b/bacula/src/stored/vtape_dev.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2008-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * vtape.h - Emulate the Linux st (scsi tape) driver on file. @@ -110,7 +114,7 @@ public: int d_close(int) { return -1; } int d_ioctl(int fd, ioctl_req_t request, char *mt=NULL) { return -1; } boffset_t lseek(DCR *dcr, off_t offset, int whence) { return -1; } -}; +}; #endif /* USE_VTAPE */ diff --git a/bacula/src/stored/wait.c b/bacula/src/stored/wait.c index e74c7bcaf6..018ed139a0 100644 --- a/bacula/src/stored/wait.c +++ b/bacula/src/stored/wait.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Subroutines to handle waiting for operator intervention diff --git a/bacula/src/streams.h b/bacula/src/streams.h index d85adf78b9..d1db5b4120 100644 --- a/bacula/src/streams.h +++ b/bacula/src/streams.h @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /** * Stream definitions. Split from baconfig.h Nov 2010 @@ -36,7 +40,7 @@ #define STREAMBITS_TYPE 11 /* type bit size */ #define STREAMMASK_TYPE (~((~0)<< STREAMBITS_TYPE) << STREAMBASE_TYPE) /* - * Note additional base, bits, and masks can be defined for new + * Note additional base, bits, and masks can be defined for new * ranges or subranges of stream attributes. */ @@ -85,9 +89,11 @@ #define STREAM_PLUGIN_NAME 26 /* Plugin "file" string */ #define STREAM_PLUGIN_DATA 27 /* Plugin specific data */ #define STREAM_RESTORE_OBJECT 28 /* Plugin restore object */ -/* Non GZip compressed streams. Those streams can handle arbitrary compression algorithm data - * as an additional header is stored at the beginning of the stream. - * see stream_compressed_header definition for more details. +/* + * Non-gzip compressed streams. Those streams can handle arbitrary + * compression algorithm data as an additional header is stored + * at the beginning of the stream. See comp_stream_header definition + * in ch.h for more details. */ #define STREAM_COMPRESSED_DATA 29 /* Compressed file data */ #define STREAM_SPARSE_COMPRESSED_DATA 30 /* Sparse compressed data stream */ @@ -95,7 +101,7 @@ #define STREAM_ENCRYPTED_FILE_COMPRESSED_DATA 32 /* Encrypted, compressed data */ #define STREAM_ENCRYPTED_WIN32_COMPRESSED_DATA 33 /* Encrypted, compressed Win32 BackupRead data */ -/** +/* * Additional Stream definitions. Once defined these must NEVER * change as they go on the storage media. * @@ -106,76 +112,39 @@ * different acl streams from 1000 on and the different extended attributes streams from * 1999 down. So the two naming spaces grows towards each other. */ -#define STREAM_ACL_AIX_TEXT 1000 /* AIX specific string representation from acl_get */ -#define STREAM_ACL_DARWIN_ACCESS_ACL 1001 /* Darwin (OSX) specific acl_t string representation - * from acl_to_text (POSIX acl) - */ -#define STREAM_ACL_FREEBSD_DEFAULT_ACL 1002 /* FreeBSD specific acl_t string representation - * from acl_to_text (POSIX acl) for default acls. - */ -#define STREAM_ACL_FREEBSD_ACCESS_ACL 1003 /* FreeBSD specific acl_t string representation - * from acl_to_text (POSIX acl) for access acls. - */ -#define STREAM_ACL_HPUX_ACL_ENTRY 1004 /* HPUX specific acl_entry string representation - * from acltostr (POSIX acl) - */ -#define STREAM_ACL_IRIX_DEFAULT_ACL 1005 /* IRIX specific acl_t string representation - * from acl_to_text (POSIX acl) for default acls. - */ -#define STREAM_ACL_IRIX_ACCESS_ACL 1006 /* IRIX specific acl_t string representation - * from acl_to_text (POSIX acl) for access acls. - */ -#define STREAM_ACL_LINUX_DEFAULT_ACL 1007 /* Linux specific acl_t string representation - * from acl_to_text (POSIX acl) for default acls. - */ -#define STREAM_ACL_LINUX_ACCESS_ACL 1008 /* Linux specific acl_t string representation - * from acl_to_text (POSIX acl) for access acls. - */ -#define STREAM_ACL_TRU64_DEFAULT_ACL 1009 /* Tru64 specific acl_t string representation - * from acl_to_text (POSIX acl) for default acls. - */ -#define STREAM_ACL_TRU64_DEFAULT_DIR_ACL 1010 /* Tru64 specific acl_t string representation - * from acl_to_text (POSIX acl) for default acls. - */ -#define STREAM_ACL_TRU64_ACCESS_ACL 1011 /* Tru64 specific acl_t string representation - * from acl_to_text (POSIX acl) for access acls. - */ -#define STREAM_ACL_SOLARIS_ACLENT 1012 /* Solaris specific aclent_t string representation - * from acltotext or acl_totext (POSIX acl) - */ -#define STREAM_ACL_SOLARIS_ACE 1013 /* Solaris specific ace_t string representation from - * from acl_totext (NFSv4 or ZFS acl) - */ -#define STREAM_ACL_AFS_TEXT 1014 /* AFS specific string representation from pioctl */ - -#define STREAM_ACL_AIX_AIXC 1015 /* AIX specific string representation from - * aclx_printStr (POSIX acl) - */ -#define STREAM_ACL_AIX_NFS4 1016 /* AIX specific string representation from - * aclx_printStr (NFSv4 acl) - */ -#define STREAM_ACL_FREEBSD_NFS4_ACL 1017 /* FreeBSD specific acl_t string representation - * from acl_to_text (NFSv4 or ZFS acl) - */ -#define STREAM_ACL_HURD_DEFAULT_ACL 1018 /* GNU HURD specific acl_t string representation - * from acl_to_text (POSIX acl) for default acls. - */ -#define STREAM_ACL_HURD_ACCESS_ACL 1019 /* GNU HURD specific acl_t string representation - * from acl_to_text (POSIX acl) for access acls. - */ -#define STREAM_XATTR_HURD 1989 /* GNU HURD specific extended attributes */ -#define STREAM_XATTR_IRIX 1990 /* IRIX specific extended attributes */ -#define STREAM_XATTR_TRU64 1991 /* TRU64 specific extended attributes */ -#define STREAM_XATTR_AIX 1992 /* AIX specific extended attributes */ -#define STREAM_XATTR_OPENBSD 1993 /* OpenBSD specific extended attributes */ -#define STREAM_XATTR_SOLARIS_SYS 1994 /* Solaris specific extensible attributes or - * otherwise named extended system attributes. - */ -#define STREAM_XATTR_SOLARIS 1995 /* Solaris specific extented attributes */ -#define STREAM_XATTR_DARWIN 1996 /* Darwin (OSX) specific extended attributes */ -#define STREAM_XATTR_FREEBSD 1997 /* FreeBSD specific extended attributes */ -#define STREAM_XATTR_LINUX 1998 /* Linux specific extended attributes */ -#define STREAM_XATTR_NETBSD 1999 /* NetBSD specific extended attributes */ +#define STREAM_ACL_AIX_TEXT 1000 /* AIX string of acl_get */ +#define STREAM_ACL_DARWIN_ACCESS 1001 /* Darwin (OSX) acl_t string of acl_to_text (POSIX acl) */ +#define STREAM_ACL_FREEBSD_DEFAULT 1002 /* FreeBSD acl_t string of acl_to_text (POSIX acl) for default acls */ +#define STREAM_ACL_FREEBSD_ACCESS 1003 /* FreeBSD acl_t string of acl_to_text (POSIX acl) for access acls */ +#define STREAM_ACL_HPUX_ACL_ENTRY 1004 /* HPUX acl_entry string of acltostr (POSIX acl) */ +#define STREAM_ACL_IRIX_DEFAULT 1005 /* IRIX acl_t string of acl_to_text (POSIX acl) for default acls */ +#define STREAM_ACL_IRIX_ACCESS 1006 /* IRIX acl_t string of acl_to_text (POSIX acl) for access acls */ +#define STREAM_ACL_LINUX_DEFAULT 1007 /* Linux acl_t string of acl_to_text (POSIX acl) for default acls */ +#define STREAM_ACL_LINUX_ACCESS 1008 /* Linux acl_t string of acl_to_text (POSIX acl) for access acls */ +#define STREAM_ACL_TRU64_DEFAULT 1009 /* Tru64 acl_t string of acl_to_text (POSIX acl) for default acls */ +#define STREAM_ACL_TRU64_DEFAULT_DIR 1010 /* Tru64 acl_t string of acl_to_text (POSIX acl) for default acls */ +#define STREAM_ACL_TRU64_ACCESS 1011 /* Tru64 acl_t string of acl_to_text (POSIX acl) for access acls */ +#define STREAM_ACL_SOLARIS_POSIX 1012 /* Solaris aclent_t string of acltotext or acl_totext (POSIX acl) */ +#define STREAM_ACL_SOLARIS_NFS4 1013 /* Solaris ace_t string of of acl_totext (NFSv4 or ZFS acl) */ +#define STREAM_ACL_AFS_TEXT 1014 /* AFS string of pioctl */ +#define STREAM_ACL_AIX_AIXC 1015 /* AIX string of aclx_printStr (POSIX acl) */ +#define STREAM_ACL_AIX_NFS4 1016 /* AIX string of aclx_printStr (NFSv4 acl) */ +#define STREAM_ACL_FREEBSD_NFS4 1017 /* FreeBSD acl_t string of acl_to_text (NFSv4 or ZFS acl) */ +#define STREAM_ACL_HURD_DEFAULT 1018 /* GNU HURD acl_t string of acl_to_text (POSIX acl) for default acls */ +#define STREAM_ACL_HURD_ACCESS 1019 /* GNU HURD acl_t string of acl_to_text (POSIX acl) for access acls */ +#define STREAM_XATTR_HURD 1989 /* GNU HURD extended attributes */ +#define STREAM_XATTR_IRIX 1990 /* IRIX extended attributes */ +#define STREAM_XATTR_TRU64 1991 /* TRU64 extended attributes */ +#define STREAM_XATTR_AIX 1992 /* AIX extended attributes */ +#define STREAM_XATTR_OPENBSD 1993 /* OpenBSD extended attributes */ +#define STREAM_XATTR_SOLARIS_SYS 1994 /* Solaris extensible attributes or + * otherwise named extended system attributes. + */ +#define STREAM_XATTR_SOLARIS 1995 /* Solaris extented attributes */ +#define STREAM_XATTR_DARWIN 1996 /* Darwin (OSX) extended attributes */ +#define STREAM_XATTR_FREEBSD 1997 /* FreeBSD extended attributes */ +#define STREAM_XATTR_LINUX 1998 /* Linux specific attributes */ +#define STREAM_XATTR_NETBSD 1999 /* NetBSD extended attributes */ /* WARNING!!! do not define more than 2047 of these old types */ diff --git a/bacula/src/tools/Makefile.in b/bacula/src/tools/Makefile.in index 1957467a09..bd312ccb8f 100644 --- a/bacula/src/tools/Makefile.in +++ b/bacula/src/tools/Makefile.in @@ -1,6 +1,6 @@ # -# Copyright (C) 2000-2015, Kern Sibbald -# License: BSD 2-Clause +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # Bacula Tools Makefile # @@ -28,19 +28,19 @@ dummy: GETTEXT_LIBS = @LIBINTL@ -FINDOBJS = testfind.o ../dird/dird_conf.o ../dird/inc_conf.o ../dird/ua_acl.o ../dird/run_conf.o +FINDOBJS = testfind.o ../dird/dird_conf.o ../dird/inc_conf.o ../dird/run_conf.o ../dird/ua_acl.o # these are the objects that are changed by the .configure process EXTRAOBJS = @OBJLIST@ -DIRCONFOBJS = ../dird/dird_conf.o ../dird/ua_acl.o ../dird/run_conf.o ../dird/inc_conf.o +DIRCONFOBJS = ../dird/dird_conf.o ../dird/run_conf.o ../dird/inc_conf.o ../dird/ua_acl.o NODIRTOOLS = bsmtp -DIRTOOLS = bsmtp dbcheck drivetype fstype testfind testls bregex bwild bbatch bregtest bvfs_test bpluginfo timelimit +DIRTOOLS = bsmtp dbcheck drivetype fstype testfind testls bregex bwild bbatch bregtest bvfs_test TOOLS = $(@DIR_TOOLS@) INSNODIRTOOLS = bsmtp -INSDIRTOOLS = bsmtp dbcheck bwild bregex bpluginfo +INSDIRTOOLS = bsmtp dbcheck bwild bregex INSTOOLS = $(INS@DIR_TOOLS@) .SUFFIXES: .c .o @@ -59,6 +59,10 @@ all: Makefile $(TOOLS) gigaslam grow bsmtp: Makefile bsmtp.o ../lib/libbac$(DEFAULT_ARCHIVE_TYPE) $(LIBTOOL_LINK) $(CXX) $(LDFLAGS) -L../lib -o $@ bsmtp.o -lbac -lm $(DLIB) $(LIBS) $(GETTEXT_LIBS) $(OPENSSL_LIBS) +bsnapshot: Makefile bsnapshot.o ../lib/libbac$(DEFAULT_ARCHIVE_TYPE) + $(LIBTOOL_LINK) $(CXX) $(LDFLAGS) -L../lib -o $@ bsnapshot.o ../lib/ini$(DEFAULT_OBJECT_TYPE) -lbac -lm $(DLIB) $(LIBS) $(GETTEXT_LIBS) + + bregtest: Makefile bregtest.o ../lib/libbac$(DEFAULT_ARCHIVE_TYPE) $(LIBTOOL_LINK) $(CXX) $(LDFLAGS) -L../lib -o $@ bregtest.o -lbac -lm $(DLIB) $(LIBS) $(GETTEXT_LIBS) $(OPENSSL_LIBS) @@ -78,9 +82,6 @@ drivetype: Makefile drivetype.o ../lib/libbac$(DEFAULT_ARCHIVE_TYPE) ../findlib/ dird_conf.o: ../dird/dird_conf.c $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) $< -ua_acl.o: ../dird/ua_acl.c - $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) $< - run_conf.o: ../dird/run_conf.c $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) $< @@ -88,7 +89,7 @@ inc_conf.o: ../dird/inc_conf.c $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) $< timelimit: timelimit.o - ${CC} ${DEFS} ${DEBUG} -DHAVE_ERRNO_H -DHAVE_SETITIMER -DHAVE_SIGACTION -c timelimit.c + ${CC} ${DEFS} ${DEBUG} -pipe -DHAVE_ERRNO_H -DHAVE_SETITIMER -DHAVE_SIGACTION -c timelimit.c ${CC} -o timelimit timelimit.o testfind: Makefile ../lib/libbac$(DEFAULT_ARCHIVE_TYPE) ../lib/libbaccfg$(DEFAULT_ARCHIVE_TYPE) \ @@ -127,7 +128,7 @@ cats_test: Makefile ../findlib/libbacfind$(DEFAULT_ARCHIVE_TYPE) ../lib/libbac$( -lbaccats -lbacsql -lbacfind -lbac -lm $(DB_LIBS) $(LIBS) $(GETTEXT_LIBS) $(OPENSSL_LIBS) gigaslam.o: gigaslam.c - $(CXX) $(CFLAGS) -c $< + $(CXX) $(CFLAGS) -c $< gigaslam: gigaslam.o $(LIBTOOL_LINK) $(CXX) $(LDFLAGS) -o $@ gigaslam.o @@ -149,8 +150,8 @@ libtool-clean: @$(RMF) -r .libs _libs clean: libtool-clean - @$(RMF) bsmtp core core.* a.out *.o *.bak *~ *.intpro *.extpro 1 2 3 - @$(RMF) $(DIRTOOLS) + @$(RMF) core core.* a.out *.o *.bak *~ *.intpro *.extpro 1 2 3 + @$(RMF) $(DIRTOOLS) gigaslam grow realclean: clean @$(RMF) tags @@ -163,18 +164,23 @@ devclean: realclean if test $(srcdir) = .; then $(MAKE) realclean; fi (cd $(srcdir); $(RMF) Makefile) -installall: $(TOOLS) - @for tool in ${TOOLS} ; do \ +install-bsnapshot: bsnapshot + $(LIBTOOL_INSTALL) $(INSTALL_PROGRAM) bsnapshot $(DESTDIR)$(sbindir)/bsnapshot + +installall: $(TOOLS) timelimit + @for tool in ${TOOLS} timelimit ; do \ $(LIBTOOL_INSTALL) $(INSTALL_PROGRAM) $$tool $(DESTDIR)$(sbindir)/$$tool ; \ done - chmod 755 $(DESTDIR)$(sbindir)/bsmtp +# chattr +i $(DESTDIR)$(sbindir)/bsmtp +# chmod 755 $(DESTDIR)$(sbindir)/bsmtp # Allow non-root execution of bsmtp for non-root Directors install: $(INSTOOLS) @for tool in ${INSTOOLS} ; do \ $(LIBTOOL_INSTALL) $(INSTALL_PROGRAM) $$tool $(DESTDIR)$(sbindir)/$$tool ; \ done - chmod 755 $(DESTDIR)$(sbindir)/bsmtp +# chattr +i $(DESTDIR)$(sbindir)/bsmtp +# chmod 755 $(DESTDIR)$(sbindir)/bsmtp uninstall: @for tool in ${INSTOOLS} ; do \ diff --git a/bacula/src/tools/assert_macro.h b/bacula/src/tools/assert_macro.h deleted file mode 100644 index 2b4f302502..0000000000 --- a/bacula/src/tools/assert_macro.h +++ /dev/null @@ -1,154 +0,0 @@ -/* - Bacula® - The Network Backup Solution - - Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. - - You may use this file and others of this release according to the - license defined in the LICENSE file, which includes the Affero General - Public License, v3.0 ("AGPLv3") and some additional permissions and - terms pursuant to its AGPLv3 Section 7. - - Bacula® is a registered trademark of Kern Sibbald. -*/ -/** - * Assertion definitions - * - */ - - -#ifndef _ASSERT_MACRO_H -#define _ASSERT_MACRO_H 1 - -/* Assertions definitions */ - -/* check valid pointer if not return */ -#ifndef ASSERT_NVAL_RET -#define ASSERT_NVAL_RET(value) \ - if ( ! value ){ \ - return; \ - } -#endif - -/* check an error if true return */ -#ifndef ASSERT_VAL_RET -#define ASSERT_VAL_RET(value) \ - if ( value ){ \ - return; \ - } -#endif - -/* check valid pointer with Null return */ -#ifndef ASSERT_NVAL_RET_NULL -#define ASSERT_NVAL_RET_NULL(value) \ - if ( ! value ) \ - { \ - return NULL; \ - } -#endif - -/* if value then Null return */ -#ifndef ASSERT_VAL_RET_NULL -#define ASSERT_VAL_RET_NULL(value) \ - if ( value ) \ - { \ - return NULL; \ - } -#endif - -/* check valid pointer with int/err return */ -#ifndef ASSERT_NVAL_RET_ONE -#define ASSERT_NVAL_RET_ONE(value) \ - if ( ! value ) \ - { \ - return 1; \ - } -#endif - -/* check valid pointer with int/err return */ -#ifndef ASSERT_NVAL_RET_NONE -#define ASSERT_NVAL_RET_NONE(value) \ - if ( ! value ) \ - { \ - return -1; \ - } -#endif - -/* check error if not exit with error */ -#ifndef ASSERT_NVAL_EXIT_ONE -#define ASSERT_NVAL_EXIT_ONE(value) \ - if ( ! value ){ \ - exit ( 1 ); \ - } -#endif - -/* check error if not exit with error */ -#ifndef ASSERT_NVAL_EXIT_E -#define ASSERT_NVAL_EXIT_E(value,ev) \ - if ( ! value ){ \ - exit ( ev ); \ - } -#endif - -/* check error if not return zero */ -#ifndef ASSERT_NVAL_RET_ZERO -#define ASSERT_NVAL_RET_ZERO(value) \ - if ( ! value ){ \ - return 0; \ - } -#endif - -/* check error if not return value */ -#ifndef ASSERT_NVAL_RET_V -#define ASSERT_NVAL_RET_V(value,rv) \ - if ( ! value ){ \ - return rv; \ - } -#endif - -/* checks error value then int/err return */ -#ifndef ASSERT_VAL_RET_ONE -#define ASSERT_VAL_RET_ONE(value) \ - if ( value ) \ - { \ - return 1; \ - } -#endif - -/* checks error value then int/err return */ -#ifndef ASSERT_VAL_RET_NONE -#define ASSERT_VAL_RET_NONE(value) \ - if ( value ) \ - { \ - return -1; \ - } -#endif - -/* checks error value then exit one */ -#ifndef ASSERT_VAL_EXIT_ONE -#define ASSERT_VAL_EXIT_ONE(value) \ - if ( value ) \ - { \ - exit (1); \ - } -#endif - -/* check error if not return zero */ -#ifndef ASSERT_VAL_RET_ZERO -#define ASSERT_VAL_RET_ZERO(value) \ - if ( value ){ \ - return 0; \ - } -#endif - -/* check error if not return value */ -#ifndef ASSERT_VAL_RET_V -#define ASSERT_VAL_RET_V(value,rv) \ - if ( value ){ \ - return rv; \ - } -#endif - -#endif /* _ASSERT_MACRO_H */ diff --git a/bacula/src/tools/bbatch.c b/bacula/src/tools/bbatch.c index a0cf906f02..9542648e4d 100644 --- a/bacula/src/tools/bbatch.c +++ b/bacula/src/tools/bbatch.c @@ -1,33 +1,38 @@ /* - * Program to test batch mode - * - * Eric Bollengier, March 2007 - * - */ -/* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2001-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ +/* + * + * Program to test batch mode + * + * Eric Bollengier, March 2007 + * + */ /* to create datafile - + for i in $(seq 10000 99999) ; do j=$((($i % 1000) + 555)) echo "$i;/tmp/totabofds$j/fiddddle${j}$i;xxxLSTATxxxx;xxxxxxxMD5xxxxxx" done > dat1 - + or j=0 @@ -41,14 +46,13 @@ #include "stored/stored.h" #include "findlib/find.h" #include "cats/cats.h" -#include "cats/sql_glue.h" - + /* Forward referenced functions */ static void *do_batch(void *); /* Local variables */ -static B_DB *db; +static BDB *db; static const char *db_name = "bacula"; static const char *db_user = "bacula"; @@ -61,7 +65,7 @@ static void usage() { fprintf(stderr, _( PROG_COPYRIGHT -"\nVersion: %s (%s)\n" +"\n%sVersion: %s (%s)\n" "Example : bbatch -w /path/to/workdir -h localhost -f dat1 -f dat -f datx\n" " will start 3 thread and load dat1, dat and datx in your catalog\n" "See bbatch.c to generate datafile\n\n" @@ -78,7 +82,7 @@ PROG_COPYRIGHT " -r call restore code with given jobids\n" " -v verbose\n" " -f specify data file\n" -" -? print this message\n\n"), 2001, VERSION, BDATE); +" -? print this message\n\n"), 2001, "", VERSION, BDATE); exit(1); } @@ -102,7 +106,7 @@ int main (int argc, char *argv[]) textdomain("bacula"); init_stack_dump(); lmgr_init_thread(); - + char **files = (char **) malloc (10 * sizeof(char *)); int i; my_name_is(argc, argv, "bbatch"); @@ -180,7 +184,7 @@ int main (int argc, char *argv[]) uint64_t nb_file=0; btime_t start, end; /* To use the -r option, the catalog should already contains records */ - + if ((db = db_init_database(NULL, NULL, db_name, db_user, db_password, db_host, 0, NULL, false, disable_batch)) == NULL) { Emsg0(M_ERROR_TERM, 0, _("Could not init Bacula database\n")); @@ -193,9 +197,9 @@ int main (int argc, char *argv[]) db_get_file_list(NULL, db, restore_list, false, false, list_handler, &nb_file); end = get_current_btime(); - Pmsg3(0, _("Computing file list for jobid=%s files=%lld secs=%d\n"), + Pmsg3(0, _("Computing file list for jobid=%s files=%lld secs=%d\n"), restore_list, nb_file, (uint32_t)btime_to_unix(end-start)); - + free(restore_list); return 0; } @@ -229,7 +233,7 @@ int main (int argc, char *argv[]) pm_strcpy(bjcr->fileset_name, "Dummy.fileset.name"); bjcr->fileset_md5 = get_pool_memory(PM_FNAME); pm_strcpy(bjcr->fileset_md5, "Dummy.fileset.md5"); - + if ((db = db_init_database(NULL, NULL, db_name, db_user, db_password, db_host, 0, NULL, false, false)) == NULL) { Emsg0(M_ERROR_TERM, 0, _("Could not init Bacula database\n")); @@ -241,7 +245,7 @@ int main (int argc, char *argv[]) if (verbose) { Pmsg2(000, _("Using Database: %s, User: %s\n"), db_name, db_user); } - + bjcr->db = db; pthread_create(&thid, NULL, do_batch, bjcr); @@ -313,12 +317,12 @@ static void *do_batch(void *jcr) fclose(fd); db_write_batch_file_records(bjcr); btime_t end = get_current_btime(); - + P(mutex); char ed1[200], ed2[200]; printf("\rbegin = %s, end = %s\n", edit_int64(begin, ed1),edit_int64(end, ed2)); printf("Insert time = %sms\n", edit_int64((end - begin) / 10000, ed1)); - printf("Create %u files at %.2f/s\n", lineno, + printf("Create %u files at %.2f/s\n", lineno, (lineno / ((float)((end - begin) / 1000000)))); nb--; V(mutex); diff --git a/bacula/src/tools/bpluginfo.c b/bacula/src/tools/bpluginfo.c deleted file mode 100644 index 1655bd5bca..0000000000 --- a/bacula/src/tools/bpluginfo.c +++ /dev/null @@ -1,625 +0,0 @@ -/* - * Contributed in 2012 by Inteos sp. z o.o. - * - * Utility tool display various information about Bacula plugin, - * including but not limited to: - * - Name and Author of the plugin - * - Plugin License - * - Description - * - API version - * - Enabled functions, etc. - */ -/* - Bacula® - The Network Backup Solution - - Copyright (C) 2006-2014 Free Software Foundation Europe e.V. - - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. - - You may use this file and others of this release according to the - license defined in the LICENSE file, which includes the Affero General - Public License, v3.0 ("AGPLv3") and some additional permissions and - terms pursuant to its AGPLv3 Section 7. - - Bacula® is a registered trademark of Kern Sibbald. -*/ - -#include -#include -#include -#include -#include -#include -#ifndef __WIN32__ -#include -#endif -#include "bacula.h" -#include "../filed/fd_plugins.h" -#include "../dird/dir_plugins.h" -// I can't include sd_plugins.h here ... -#include "../stored/stored.h" -#include "assert_macro.h" - -extern "C" { - typedef int (*loadPlugin) (void *binfo, void *bfuncs, void **pinfo, - void **pfuncs); - typedef int (*unloadPlugin) (void); -} -#define DEFAULT_API_VERSION 1 -enum plugintype { - DIRPLUGIN, - FDPLUGIN, - SDPLUGIN, - ERRORPLUGIN, -}; - -/* - * pDirInfo - * pInfo - * psdInfo - */ -typedef union _pluginfo pluginfo; -union _pluginfo { - pDirInfo pdirinfo; - pInfo pfdinfo; - psdInfo psdinfo; -}; - -/* - * pDirFuncs - * pFuncs - * psdFuncs - */ -typedef union _plugfuncs plugfuncs; -union _plugfuncs { - pDirFuncs pdirfuncs; - pFuncs pfdfuncs; - psdFuncs psdfuncs; -}; - -/* - * bDirFuncs - * bFuncs - * bsdFuncs - */ -/* - * TODO: change to union - * -typedef union _baculafuncs baculafuncs; -union _baculafuncs { - bDirFuncs bdirfuncs; - bFuncs bfdfuncs; - bsdFuncs bsdfuncs; -}; -*/ -typedef struct _baculafuncs baculafuncs; -struct _baculafuncs { - uint32_t size; - uint32_t version; - int (*registerBaculaEvents) (void *ctx, ...); - int (*getBaculaValue) (void *ctx, int var, void *value); - int (*setBaculaValue) (void *ctx, int var, void *value); - int (*JobMessage) (void *ctx, const char *file, int line, int type, int64_t mtime, - const char *fmt, ...); - int (*DebugMessage) (void *ctx, const char *file, int line, int level, - const char *fmt, ...); - void *(*baculaMalloc) (void *ctx, const char *file, int line, size_t size); - void (*baculaFree) (void *ctx, const char *file, int line, void *mem); -}; - -/* - * bDirInfo - * bInfo - * bsdInfo - */ -typedef union _baculainfos baculainfos; -union _baculainfos { - bDirInfo bdirinfo; - bInfo bfdinfo; - bsdInfo bsdinfo; -}; - -/* -typedef struct _baculainfos baculainfos; -struct _baculainfos { - uint32_t size; - uint32_t version; -}; -*/ - -typedef struct _progdata progdata; -struct _progdata { - int verbose; - int listinfo; - int listfunc; - char *pluginfile; - void *pluginhandle; - int bapiversion; - int bplugtype; - pluginfo *pinfo; - plugfuncs *pfuncs; -}; - -/* memory allocation/deallocation */ -#define MALLOC(size) \ - (char *) bmalloc ( size ); - -#define ASSERT_MEMORY(m) \ - if ( m == NULL ){ \ - printf ( "Error: memory allocation error!\n" ); \ - exit (10); \ - } - -#define FREE(ptr) \ - if ( ptr != NULL ){ \ - bfree ( ptr ); \ - ptr = NULL; \ - } - -int registerBaculaEvents(void *ctx, ...) -{ - return 0; -}; - -int getBaculaValue(void *ctx, int var, void *value) -{ - return 0; -}; - -int setBaculaValue(void *ctx, int var, void *value) -{ - return 0; -}; - -int DebugMessage(void *ctx, const char *file, int line, int level, const char *fmt, ...) -{ -#ifdef DEBUGMSG - printf("DG: %s:%d %s\n", file, line, fmt); -#endif - return 0; -}; - -int JobMessage(void *ctx, const char *file, int line, int type, int64_t mtime, - const char *fmt, ...) -{ -#ifdef DEBUGMSG - printf("JM: %s:%d <%d> %s\n", file, line, type, fmt); -#endif - return 0; -}; - -void *baculaMalloc(void *ctx, const char *file, int line, size_t size) -{ - return MALLOC(size); -}; - -void baculaFree(void *ctx, const char *file, int line, void *mem) -{ - FREE(mem); -}; - -/* - * displays a short help - */ -void print_help(int argc, char *argv[]) -{ - - printf("\n" - "Usage: bpluginfo [options] \n" - " -v verbose\n" - " -i list plugin header information only (default)\n" - " -f list plugin functions information only\n" - " -a bacula api version (default %d)\n" - " -h help screen\n" "\n", DEFAULT_API_VERSION); -} - -/* allocates and resets a main program data variable */ -progdata *allocpdata(void) -{ - - progdata *pdata; - - pdata = (progdata *) bmalloc(sizeof(progdata)); - ASSERT_MEMORY(pdata); - memset(pdata, 0, sizeof(progdata)); - - return pdata; -} - -/* releases all allocated program data resources */ -void freepdata(progdata * pdata) -{ - - if (pdata->pluginfile) { - FREE(pdata->pluginfile); - } - FREE(pdata); -} - -/* - * parse execution arguments and fills required pdata structure fields - * - * input: - * pdata - pointer to program data structure - * argc, argv - execution envinroment variables - * output: - * pdata - required structure fields - * - * supported options: - * -v verbose flag - * -i list plugin header info only (default) - * -f list implemented functions only - * -a bacula api version (default 1) - * -h help screen - */ -void parse_args(progdata * pdata, int argc, char *argv[]) -{ - - int i; - char *dirtmp; - char *progdir; - int api; - int s; - - if (argc < 2) { - /* TODO - add a real help screen */ - printf("\nNot enough parameters!\n"); - print_help(argc, argv); - exit(1); - } - - if (argc > 5) { - /* TODO - add a real help screen */ - printf("\nToo many parameters!\n"); - print_help(argc, argv); - exit(1); - } - - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-h") == 0) { - /* help screen */ - print_help(argc, argv); - exit(0); - } - if (strcmp(argv[i], "-v") == 0) { - /* verbose option */ - pdata->verbose = 1; - continue; - } - if (strcmp(argv[i], "-f") == 0) { - /* functions list */ - pdata->listfunc = 1; - continue; - } - if (strcmp(argv[i], "-i") == 0) { - /* header list */ - pdata->listinfo = 1; - continue; - } - if (strcmp(argv[i], "-a") == 0) { - /* bacula api version */ - if (i < argc - 1) { - s = sscanf(argv[i + 1], "%d", &api); - if (s == 1) { - pdata->bapiversion = api; - i++; - continue; - } - } - printf("\nAPI version number required!\n"); - print_help(argc, argv); - exit(1); - } - if (!pdata->pluginfile) { - if (argv[i][0] != '/') { - dirtmp = MALLOC(PATH_MAX); - ASSERT_MEMORY(dirtmp); - progdir = MALLOC(PATH_MAX); - ASSERT_MEMORY(progdir); - dirtmp = getcwd(dirtmp, PATH_MAX); - - strcat(dirtmp, "/"); - strcat(dirtmp, argv[i]); - - if (realpath(dirtmp, progdir) == NULL) { - /* error in resolving path */ - FREE(progdir); - progdir = bstrdup(argv[i]); - } - pdata->pluginfile = bstrdup(progdir); - FREE(dirtmp); - FREE(progdir); - } else { - pdata->pluginfile = bstrdup(argv[i]); - } - continue; - } - } -} - -/* - * checks a plugin type based on a plugin magic string - * - * input: - * pdata - program data with plugin info structure - * output: - * int - enum plugintype - */ -int getplugintype(progdata * pdata) -{ - - ASSERT_NVAL_RET_V(pdata, ERRORPLUGIN); - - pluginfo *pinfo = pdata->pinfo; - - ASSERT_NVAL_RET_V(pinfo, ERRORPLUGIN); - - if (pinfo->pdirinfo.plugin_magic && - strcmp(pinfo->pdirinfo.plugin_magic, DIR_PLUGIN_MAGIC) == 0) { - return DIRPLUGIN; - } else - if (pinfo->pfdinfo.plugin_magic && - strcmp(pinfo->pfdinfo.plugin_magic, FD_PLUGIN_MAGIC) == 0) { - return FDPLUGIN; - } else - if (pinfo->psdinfo.plugin_magic && - strcmp(pinfo->psdinfo.plugin_magic, SD_PLUGIN_MAGIC) == 0) { - return SDPLUGIN; - } else { - return ERRORPLUGIN; - } -} - -/* - * prints any available information about a plugin - * - * input: - * pdata - program data with plugin info structure - * output: - * printed info - */ -void dump_pluginfo(progdata * pdata) -{ - - ASSERT_NVAL_RET(pdata); - - pluginfo *pinfo = pdata->pinfo; - - ASSERT_NVAL_RET(pinfo); - - plugfuncs *pfuncs = pdata->pfuncs; - - ASSERT_NVAL_RET(pfuncs); - - switch (pdata->bplugtype) { - case DIRPLUGIN: - printf("\nPlugin type:\t\tBacula Director plugin\n"); - if (pdata->verbose) { - printf("Plugin magic:\t\t%s\n", NPRT(pinfo->pdirinfo.plugin_magic)); - } - printf("Plugin version:\t\t%s\n", pinfo->pdirinfo.plugin_version); - printf("Plugin release date:\t%s\n", NPRT(pinfo->pdirinfo.plugin_date)); - printf("Plugin author:\t\t%s\n", NPRT(pinfo->pdirinfo.plugin_author)); - printf("Plugin licence:\t\t%s\n", NPRT(pinfo->pdirinfo.plugin_license)); - printf("Plugin description:\t%s\n", NPRT(pinfo->pdirinfo.plugin_description)); - printf("Plugin API version:\t%d\n", pinfo->pdirinfo.version); - break; - case FDPLUGIN: - printf("\nPlugin type:\t\tFile Daemon plugin\n"); - if (pdata->verbose) { - printf("Plugin magic:\t\t%s\n", NPRT(pinfo->pfdinfo.plugin_magic)); - } - printf("Plugin version:\t\t%s\n", pinfo->pfdinfo.plugin_version); - printf("Plugin release date:\t%s\n", NPRT(pinfo->pfdinfo.plugin_date)); - printf("Plugin author:\t\t%s\n", NPRT(pinfo->pfdinfo.plugin_author)); - printf("Plugin licence:\t\t%s\n", NPRT(pinfo->pfdinfo.plugin_license)); - printf("Plugin description:\t%s\n", NPRT(pinfo->pfdinfo.plugin_description)); - printf("Plugin API version:\t%d\n", pinfo->pfdinfo.version); - break; - case SDPLUGIN: - printf("\nPlugin type:\t\tBacula Storage plugin\n"); - if (pdata->verbose) { - printf("Plugin magic:\t\t%s\n", NPRT(pinfo->psdinfo.plugin_magic)); - } - printf("Plugin version:\t\t%s\n", pinfo->psdinfo.plugin_version); - printf("Plugin release date:\t%s\n", NPRT(pinfo->psdinfo.plugin_date)); - printf("Plugin author:\t\t%s\n", NPRT(pinfo->psdinfo.plugin_author)); - printf("Plugin licence:\t\t%s\n", NPRT(pinfo->psdinfo.plugin_license)); - printf("Plugin description:\t%s\n", NPRT(pinfo->psdinfo.plugin_description)); - printf("Plugin API version:\t%d\n", pinfo->psdinfo.version); - break; - default: - printf("\nUnknown plugin type or other Error\n\n"); - } -} - -/* - * prints any available information about plugin' functions - * - * input: - * pdata - program data with plugin info structure - * output: - * printed info - */ -void dump_plugfuncs(progdata * pdata) -{ - - ASSERT_NVAL_RET(pdata); - - plugfuncs *pfuncs = pdata->pfuncs; - - ASSERT_NVAL_RET(pfuncs); - - printf("\nPlugin functions:\n"); - - switch (pdata->bplugtype) { - case DIRPLUGIN: - if (pdata->verbose) { - if (pfuncs->pdirfuncs.newPlugin) { - printf(" newPlugin()\n"); - } - if (pfuncs->pdirfuncs.freePlugin) { - printf(" freePlugin()\n"); - } - } - if (pfuncs->pdirfuncs.getPluginValue) { - printf(" getPluginValue()\n"); - } - if (pfuncs->pdirfuncs.setPluginValue) { - printf(" setPluginValue()\n"); - } - if (pfuncs->pdirfuncs.handlePluginEvent) { - printf(" handlePluginEvent()\n"); - } - break; - case FDPLUGIN: - if (pdata->verbose) { - if (pfuncs->pfdfuncs.newPlugin) { - printf(" newPlugin()\n"); - } - if (pfuncs->pfdfuncs.freePlugin) { - printf(" freePlugin()\n"); - } - } - if (pfuncs->pfdfuncs.getPluginValue) { - printf(" getPluginValue()\n"); - } - if (pfuncs->pfdfuncs.setPluginValue) { - printf(" setPluginValue()\n"); - } - if (pfuncs->pfdfuncs.handlePluginEvent) { - printf(" handlePluginEvent()\n"); - } - if (pfuncs->pfdfuncs.startBackupFile) { - printf(" startBackupFile()\n"); - } - if (pfuncs->pfdfuncs.endBackupFile) { - printf(" endBackupFile()\n"); - } - if (pfuncs->pfdfuncs.startRestoreFile) { - printf(" startRestoreFile()\n"); - } - if (pfuncs->pfdfuncs.endRestoreFile) { - printf(" endRestoreFile()\n"); - } - if (pfuncs->pfdfuncs.pluginIO) { - printf(" pluginIO()\n"); - } - if (pfuncs->pfdfuncs.createFile) { - printf(" createFile()\n"); - } - if (pfuncs->pfdfuncs.setFileAttributes) { - printf(" setFileAttributes()\n"); - } - if (pfuncs->pfdfuncs.checkFile) { - printf(" checkFile()\n"); - } - break; - case SDPLUGIN: - if (pdata->verbose) { - if (pfuncs->psdfuncs.newPlugin) { - printf(" newPlugin()\n"); - } - if (pfuncs->psdfuncs.freePlugin) { - printf(" freePlugin()\n"); - } - } - if (pfuncs->psdfuncs.getPluginValue) { - printf(" getPluginValue()\n"); - } - if (pfuncs->psdfuncs.setPluginValue) { - printf(" setPluginValue()\n"); - } - if (pfuncs->psdfuncs.handlePluginEvent) { - printf(" handlePluginEvent()\n"); - } - break; - default: - printf("\nUnknown plugin type or other Error\n\n"); - } -} - -/* - * input parameters: - * argv[0] [options] - * - * exit codes: - * 0 - success - * 1 - cannot load a plugin - * 2 - cannot find a loadPlugin function - * 3 - cannot find an unloadPlugin function - * 10 - not enough memory - */ -int main(int argc, char *argv[]) -{ - - progdata *pdata; - loadPlugin loadplugfunc; - unloadPlugin unloadplugfunc; - baculafuncs bfuncs = { - sizeof(bfuncs), - 1, - registerBaculaEvents, - getBaculaValue, - setBaculaValue, - JobMessage, - DebugMessage, - baculaMalloc, - baculaFree, - }; - baculainfos binfos; - - pdata = allocpdata(); - parse_args(pdata, argc, argv); - - binfos.bfdinfo.size = sizeof(binfos); - binfos.bfdinfo.version = DEFAULT_API_VERSION; - - pdata->pluginhandle = dlopen(pdata->pluginfile, RTLD_LAZY); - if (pdata->pluginhandle == NULL) { - printf("\nCannot load a plugin: %s\n\n", dlerror()); - freepdata(pdata); - exit(1); - } - - loadplugfunc = (loadPlugin) dlsym(pdata->pluginhandle, "loadPlugin"); - if (loadplugfunc == NULL) { - printf("\nCannot find loadPlugin function: %s\n", dlerror()); - printf("\nWhether the file is a really Bacula plugin?\n\n"); - freepdata(pdata); - exit(2); - } - - unloadplugfunc = (unloadPlugin) dlsym(pdata->pluginhandle, "unloadPlugin"); - if (unloadplugfunc == NULL) { - printf("\nCannot find unloadPlugin function: %s\n", dlerror()); - printf("\nWhether the file is a really Bacula plugin?\n\n"); - freepdata(pdata); - exit(3); - } - - if (pdata->bapiversion > 0) { - binfos.bdirinfo.version = pdata->bapiversion; - } - - loadplugfunc(&binfos, &bfuncs, (void **)&pdata->pinfo, (void **)&pdata->pfuncs); - - pdata->bplugtype = getplugintype(pdata); - - if (!pdata->listfunc) { - dump_pluginfo(pdata); - } - if ((!pdata->listinfo && pdata->listfunc) || pdata->verbose) { - dump_plugfuncs(pdata); - } - printf("\n"); - - unloadplugfunc(); - - dlclose(pdata->pluginhandle); - - freepdata(pdata); - - return 0; -} diff --git a/bacula/src/tools/bregex.c b/bacula/src/tools/bregex.c index ceefa91ec0..0b08934bdc 100644 --- a/bacula/src/tools/bregex.c +++ b/bacula/src/tools/bregex.c @@ -1,24 +1,28 @@ /* - * Test program for testing regular expressions. - * - * Kern Sibbald, MMVI - * - */ -/* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2006-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ +/* + * Test program for testing regular expressions. + * + * Kern Sibbald, MMVI + * + */ #include "bacula.h" @@ -74,7 +78,7 @@ int main(int argc, char *const *argv) bool match_only = true; int lineno; bool no_linenos = false; - + setlocale(LC_ALL, ""); bindtextdomain("bacula", LOCALEDIR); diff --git a/bacula/src/tools/bregtest.c b/bacula/src/tools/bregtest.c index 4853d93f04..d28f0bcecc 100644 --- a/bacula/src/tools/bregtest.c +++ b/bacula/src/tools/bregtest.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2006-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Test program for testing regular expressions. @@ -112,7 +116,7 @@ int main(int argc, char *const *argv) alist *list; char *p; - + list = get_bregexps(expr); if (!list) { @@ -141,10 +145,10 @@ int main(int argc, char *const *argv) exit(0); } /* - TODO: + TODO: - ajout /g - - tests + - tests * test avec /i * test avec un sed et faire un diff * test avec une boucle pour voir les fuites diff --git a/bacula/src/tools/bsmtp.c b/bacula/src/tools/bsmtp.c index 8e6d4f53a7..55148d405e 100644 --- a/bacula/src/tools/bsmtp.c +++ b/bacula/src/tools/bsmtp.c @@ -1,55 +1,46 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 2001-2014 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2001-2015 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* - Derived from a SMTPclient: - - ======== Original copyrights ========== - - SMTPclient -- simple SMTP client - - Copyright (c) 1997 Ralf S. Engelschall, All rights reserved. - - This program is free software; it may be redistributed and/or modified - only under the terms of either the Artistic License or the GNU General - Public License, which may be found in the SMTP source distribution. - Look at the file COPYING. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - ====================================================================== - - smtpclient_main.c -- program source - - Based on smtp.c as of August 11, 1995 from - W.Z. Venema, - Eindhoven University of Technology, - Department of Mathematics and Computer Science, - Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands. - - ========= - + Derived from smtp-orig.c + + AUTHOR(S) + W.Z. Venema + Eindhoven University of Technology + Department of Mathematics and Computer Science + Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands + CREATION DATE + Wed Dec 1 14:51:13 MET 1993 + LAST UPDATE + Fri Aug 11 12:29:23 MET DST 1995 + COPYRIGHT + None specified. Kern Sibbald, July 2001 Note, the original W.Z. Venema smtp.c had no license and no copyright. See: http://archives.neohapsis.com/archives/postfix/2000-05/1520.html + + In previous versions, I believed that this code cam from + Ralf S. Engelshall's smtpclient_main.c, but in fact 99% was + Wietse Venema's code. */ #include "bacula.h" @@ -60,7 +51,6 @@ #include #endif - #ifndef MAXSTRING #define MAXSTRING 254 #endif @@ -85,7 +75,7 @@ static char my_hostname[MAXSTRING]; static bool content_utf8 = false; static resolv_type default_resolv_type = RESOLV_PROTO_IPV4; -/* +/* * Take input that may have names and other stuff and strip * it down to the mail box address ... i.e. what is enclosed * in < >. Otherwise add < >. @@ -105,68 +95,71 @@ static char *cleanup_addr(char *addr, char *buf, int buf_len) *q++ = *p; } *q = 0; - } - Dmsg2(100, "cleanup in=%s out=%s\n", addr, buf); - return buf; + } + Dmsg2(100, "cleanup in=%s out=%s\n", addr, buf); + return buf; } /* - * examine message from server + * get_response - examine message from server */ static void get_response(void) { - char buf[1000]; - - Dmsg0(50, "Calling fgets on read socket rfp.\n"); - buf[3] = 0; - while (fgets(buf, sizeof(buf), rfp)) { - int len = strlen(buf); - if (len > 0) { - buf[len-1] = 0; - } - if (debug_level >= 10) { - fprintf(stderr, "%s <-- %s\n", mailhost, buf); - } - Dmsg2(10, "%s --> %s\n", mailhost, buf); - if (!isdigit((int)buf[0]) || buf[0] > '3') { - Pmsg2(0, _("Fatal malformed reply from %s: %s\n"), mailhost, buf); - exit(1); - } - if (buf[3] != '-') { - break; - } - } - if (ferror(rfp)) { - fprintf(stderr, _("Fatal fgets error: ERR=%s\n"), strerror(errno)); - } - return; + char buf[1000]; + + Dmsg0(50, "Calling fgets on read socket rfp.\n"); + buf[3] = 0; + while (fgets(buf, sizeof(buf), rfp)) { + int len = strlen(buf); + if (len > 0) { + buf[len-1] = 0; + } + if (debug_level >= 10) { + fprintf(stderr, "%s <-- %s\n", mailhost, buf); + } + Dmsg2(10, "%s --> %s\n", mailhost, buf); + if (!isdigit((int)buf[0]) || buf[0] > '3') { + Pmsg2(0, _("Fatal malformed reply from %s: %s\n"), mailhost, buf); + exit(1); + } + if (buf[3] != '-') { + break; + } + } + if (ferror(rfp)) { + fprintf(stderr, _("Fatal fgets error: ERR=%s\n"), strerror(errno)); + } + return; } /* - * say something to server and check the response + * chat - say something to server and check the response */ static void chat(const char *fmt, ...) { - va_list ap; - - va_start(ap, fmt); - vfprintf(sfp, fmt, ap); - va_end(ap); - if (debug_level >= 10) { - fprintf(stdout, "%s --> ", my_hostname); - va_start(ap, fmt); - vfprintf(stdout, fmt, ap); - va_end(ap); - } - - fflush(sfp); - if (debug_level >= 10) { - fflush(stdout); - } - get_response(); -} + va_list ap; + + va_start(ap, fmt); + vfprintf(sfp, fmt, ap); + va_end(ap); + if (debug_level >= 10) { + fprintf(stdout, "%s --> ", my_hostname); + va_start(ap, fmt); + vfprintf(stdout, fmt, ap); + va_end(ap); + } + /* Send message to server and parse its response. */ + fflush(sfp); + if (debug_level >= 10) { + fflush(stdout); + } + get_response(); +} +/* + * usage - explain and bail out + */ static void usage() { fprintf(stderr, @@ -274,7 +267,7 @@ int main (int argc, char *argv[]) #else const char *options = "48ac:d:f:h:r:s:l:?"; #endif - + setlocale(LC_ALL, "en_US"); bindtextdomain("bacula", LOCALEDIR); textdomain("bacula"); @@ -382,7 +375,7 @@ int main (int argc, char *argv[]) /* * Find out my own host name for HELO; - * if possible, get the fully qualified domain name + * if possible, get the FQDN - fully qualified domain name */ if (gethostname(my_hostname, sizeof(my_hostname) - 1) < 0) { Pmsg1(0, _("Fatal gethostname error: ERR=%s\n"), strerror(errno)); @@ -568,14 +561,14 @@ lookup_host: #endif /* - * Send SMTP headers. Note, if any of the strings have a < - * in them already, we do not enclose the string in < >, otherwise - * we do. + * Send SMTP headers. Note, if any of the strings have a < + * in them already, we do not enclose the string in < >, otherwise + * we do. */ get_response(); /* banner */ chat("HELO %s\r\n", my_hostname); chat("MAIL FROM:%s\r\n", cleanup_addr(from_addr, buf, sizeof(buf))); - + for (i = 0; i < argc; i++) { Dmsg1(20, "rcpt to: %s\n", argv[i]); chat("RCPT TO:%s\r\n", cleanup_addr(argv[i], buf, sizeof(buf))); @@ -588,7 +581,7 @@ lookup_host: chat("DATA\r\n"); /* - * Send message header + * Send header */ fprintf(sfp, "From: %s\r\n", from_addr); Dmsg1(10, "From: %s\r\n", from_addr); @@ -652,7 +645,7 @@ lookup_host: fprintf(sfp, "\r\n"); /* - * Send message body + * Send message body */ lines = 0; while (fgets(buf, sizeof(buf), stdin)) { @@ -682,9 +675,5 @@ lookup_host: */ chat(".\r\n"); chat("QUIT\r\n"); - - /* - * Go away gracefully ... - */ exit(0); } diff --git a/bacula/src/tools/bsnapshot.c b/bacula/src/tools/bsnapshot.c new file mode 100644 index 0000000000..6d6b85b028 --- /dev/null +++ b/bacula/src/tools/bsnapshot.c @@ -0,0 +1,1977 @@ +/* + Bacula(R) - The Network Backup Solution + + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2011-2014 Free Software Foundation Europe e.V. + + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. + + You may use this file and others of this release according to the + license defined in the LICENSE file, which includes the Affero General + Public License, v3.0 ("AGPLv3") and some additional permissions and + terms pursuant to its AGPLv3 Section 7. + + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. +*/ + +#include "bacula.h" +#include "lib/ini.h" + +#ifdef HAVE_SUN_OS +#include +#include /* Define major() and minor() */ +#endif + +#define Dmsg(level, ...) do { \ + if (level <= debug_level) { \ + fprintf(debug, "%s:%d ", __FILE__ , __LINE__); \ + fprintf(debug, __VA_ARGS__ ); \ + } \ + } while (0) + +#define Pmsg(level, ...) do { \ + if (level <= debug_level) { \ + fprintf(stderr, "%s:%d ", __FILE__ , __LINE__ ); \ + fprintf(stderr, __VA_ARGS__ ); \ + } \ + } while (0) + +#define BSNAPSHOT_CONF SYSCONFDIR "/bsnapshot.conf" + +static FILE *debug = NULL; + +static void usage(const char *msg=NULL) +{ + if (msg) { + fprintf(stderr, _("ERROR %s\n\n"), msg); + } + + fprintf(stderr, _( + "Bacula %s (%s)\n\n" + "Usage: bsnapshot\n" + " -d level Set debug level\n" + " -v Verbose\n" + " -s Use sudo\n" + " -o logfile send debug to logfile\n" + " -V volume volume\n" + " -T type volume type\n" + " -t check compatibility\n" + " -c specify configuration file\n" + "\n"), VERSION, LSMDATE); + exit(2); +} + +static const char *Months[] = { + NULL, + "Jan", + "Feb", + "Mar", + "Apr", + "Mai", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" +}; + +/* Skip leading slash(es) */ +static bool makedir(char *path) +{ + char *p = path; + + while (IsPathSeparator(*p)) { + p++; + } + while ((p = first_path_separator(p))) { + char save_p; + save_p = *p; + *p = 0; + mkdir(path, 0700); + *p = save_p; + while (IsPathSeparator(*p)) { + p++; + } + } + /* If not having a ending / */ + if (!IsPathSeparator(path[strlen(path) - 1])) { + mkdir(path, 0700); + } + return true; +} + +/* Strip trailing junk and " */ +void strip_quotes(char *str) +{ + strip_trailing_junk(str); + for(char *p = str; *p ; p++) { + if (*p == '"') { + *p = ' '; + } + } +} + +static void set_trace_file(const char *path) +{ + char dt[MAX_TIME_LENGTH]; + if (debug && debug != stderr) { + fclose(debug); + } + debug = fopen(path, "a"); + if (!debug) { + debug = stderr; + } else { + Dmsg(10, "Starting bsnapshot %s\n", + bstrftime(dt, MAX_TIME_LENGTH, time(NULL))); + } +} + +/* Small function to avoid double // in path name */ +static void path_concat(POOLMEM *&dest, const char *path1, const char *path2, const char *path3) { + int last; + + last = pm_strcpy(dest, path1); + last = MAX(last - 1, 0); + + /* Check if the last char of dest is / and the first of path2 is / */ + if (dest[last] == '/') { + if (path2[0] == '/') { + dest[last] = 0; + } + } else { + if (path2[0] != '/') { + pm_strcat(dest, "/"); + } + } + + last = pm_strcat(dest, path2); + last = MAX(last - 1, 0); + + if (path3) { + if (dest[last] == '/') { + if (path3[0] == '/') { + dest[last] = 0; + } + } else { + if (path3[0] != '/') { + pm_strcat(dest, "/"); + } + } + pm_strcat(dest, path3); + } +} + +static struct ini_items bsnap_cfg[] = { + // name handler comment required default + { "trace", ini_store_str, "", 0, NULL}, + { "debug", ini_store_int32, "", 0, NULL}, + { "sudo", ini_store_bool, "", 0, NULL}, + { "disabled", ini_store_bool, "", 0, "no"}, + { "retry", ini_store_int32, "", 0, "3"}, + { "lvm_snapshot_size", ini_store_alist_str,"", 0, NULL}, + { "skip_volume", ini_store_alist_str,"", 0, NULL}, + { "snapshot_dir", ini_store_str, "", 0, NULL}, + { "fail_job_on_error", ini_store_bool, "", 0, "yes"}, + { NULL, NULL, NULL, 0, NULL} +}; + +class arguments { +public: + char *action; /* list, create, delete... */ + char *volume; /* snapshot device */ + char *device; /* original device name */ + char *name; /* snapshot name */ + char *mountpoint; /* device mountpoint */ + char *snapmountpoint; /* snapshot mountpoint */ + char *type; /* snapshot type */ + char *fstype; /* filesystem type */ + const char *snapdir; /* .snapshot */ + const char *sudo; /* prepend sudo to commands */ + int verbose; + int retry; /* retry some operations */ + bool disabled; /* disabled by config file */ + bool fail_job_on_error; /* Fail job on snapshot error */ + ConfigFile ini; /* Configuration file */ + POOL_MEM config_file; /* Path to a config file */ + + arguments(): + action(getenv("SNAPSHOT_ACTION")), + volume(getenv("SNAPSHOT_VOLUME")), + device(getenv("SNAPSHOT_DEVICE")), + name( getenv("SNAPSHOT_NAME")), + mountpoint(getenv("SNAPSHOT_MOUNTPOINT")), + snapmountpoint(getenv("SNAPSHOT_SNAPMOUNTPOINT")), + type( getenv("SNAPSHOT_TYPE")), + fstype(getenv("SNAPSHOT_FSTYPE")), + snapdir(".snapshots"), + sudo(""), + verbose(0), + retry(3), + disabled(false), + fail_job_on_error(true) + { + struct stat sp; + ini.register_items(bsnap_cfg, sizeof(struct ini_items)); + + if (stat(BSNAPSHOT_CONF, &sp) == 0) { + Dmsg(10, "conf=%s\n", BSNAPSHOT_CONF); + pm_strcpy(config_file, BSNAPSHOT_CONF); + } + }; + + ~arguments() { + }; + + bool validate() { + int pos; + if (!action) { + return false; + } + if (strcmp(config_file.c_str(), "") != 0) { + Dmsg(10, "Reading configuration from %s\n", config_file.c_str()); + if (!ini.parse(config_file.c_str())) { + printf("status=1 error=\"Unable to parse %s\"\n", + config_file.c_str()); + return false; + } + pos = ini.get_item("debug"); + if (ini.items[pos].found && debug_level == 0) { + debug_level = ini.items[pos].val.int32val; + } + pos = ini.get_item("trace"); + if (ini.items[pos].found) { + set_trace_file(ini.items[pos].val.strval); + } + pos = ini.get_item("sudo"); + if (ini.items[pos].found && ini.items[pos].val.boolval) { + sudo = "sudo "; + } + pos = ini.get_item("snapshot_dir"); + if (ini.items[pos].found) { + snapdir = ini.items[pos].val.strval; + } + pos = ini.get_item("retry"); + if (ini.items[pos].found) { + retry = ini.items[pos].val.int32val; + } + pos = ini.get_item("disabled"); + if (ini.items[pos].found) { + disabled = ini.items[pos].val.boolval; + } + pos = ini.get_item("fail_job_on_error"); + if (ini.items[pos].found) { + fail_job_on_error = ini.items[pos].val.boolval; + } + } + return true; + }; +}; + +class snapshot { +public: + const char *type; /* snapshot type, btrfs, zfs, etc.. */ + POOLMEM *cmd; /* buffer to edit a command */ + POOLMEM *path; /* buffer to edit volume path */ + POOLMEM *fname; /* used for split_path_and_filename */ + POOLMEM *errmsg; /* buffer to edit error message */ + arguments *arg; /* program argument */ + int pnl; /* path length */ + int fnl; /* fname length */ + + snapshot(arguments *a, const char *t): + type(t), + cmd(get_pool_memory(PM_NAME)), + path(get_pool_memory(PM_NAME)), + fname(get_pool_memory(PM_NAME)), + errmsg(get_pool_memory(PM_NAME)), + arg(a), + pnl(0), + fnl(0) + { + }; + + virtual ~snapshot() { + free_pool_memory(cmd); + free_pool_memory(path); + free_pool_memory(fname); + free_pool_memory(errmsg); + }; + + /* Basically, we check parameters here that are + * common to all backends + */ + virtual int mount() { + Dmsg(10, "[%s] Doing mount command\n", type); + if (!arg->volume || !arg->name || !arg->device || !arg->mountpoint) { + Dmsg(10, "volume=%s name=%s device=%s mountpoint=%s\n", + NPRT(arg->volume), NPRT(arg->name), + NPRT(arg->device), NPRT(arg->mountpoint)); + return 0; + } + return 1; + }; + + virtual int unmount() { + Dmsg(10, "[%s] Doing unmount command on %s\n", type, + NPRT(arg->snapmountpoint)); + if (!arg->snapmountpoint) { + Dmsg(10, "snapmountpoint=%s\n", NPRT(arg->snapmountpoint)); + return 0; + } + return 1; + }; + + virtual int support() { + Dmsg(10, "[%s] Doing support on %s (%s)\n", type, NPRT(arg->mountpoint), + NPRT(arg->device)); + if (!arg->fstype || !arg->mountpoint || !arg->device) { + Dmsg(10, "fstype=%s mountpoint=%s device=%s\n", + NPRT(arg->fstype), NPRT(arg->mountpoint), NPRT(arg->device)); + return 0; + } + return 1; + }; + + virtual int check() { + Dmsg(10, "[%s] Doing check on %s\n", type, NPRT(arg->mountpoint)); + if (!arg->mountpoint) { + Dmsg(10, "mountpoint=%s\n", NPRT(arg->mountpoint)); + return 0; + } + return 1; + }; + + virtual int create() { + Dmsg(10, "[%s] Doing create %s\n", type, NPRT(arg->mountpoint)); + if (!arg->mountpoint || !arg->name || !arg->device) { + Dmsg(10, "mountpoint=%s name=%s device=%s\n", + NPRT(arg->mountpoint), NPRT(arg->name), NPRT(arg->device)); + return 0; + } + return 1; + }; + + virtual int del() { + Dmsg(10, "[%s] Doing del %s\n", type, NPRT(arg->volume)); + if (!arg->volume || !arg->name) { + Dmsg(10, "volume=%s name=%s\n", + NPRT(arg->volume), NPRT(arg->name)); + return 0; + } + return 1; + }; + + virtual int list() { + Dmsg(10, "[%s] Doing list on %s\n", type, NPRT(arg->device)); + if (!arg->type || !arg->device || !arg->mountpoint) { + return 0; + } + return 1; + }; + + virtual int subvolumes() { + Dmsg(10, "[%s] Doing subvolumes %s\n", type, NPRT(arg->mountpoint)); + if (!arg->fstype || !arg->device || !arg->mountpoint) { + return 0; + } + return 1; + }; + + /* Function used in create() to know if we mark the error as FATAL */ + int get_error_code() { + Dmsg1(0, "get_error_code = %d\n", (int)arg->fail_job_on_error); + /* 1 is OK */ + if (arg->fail_job_on_error) { + return 0; /* Fatal */ + } + return 2; /* Error */ + }; +}; + +/* Structure used to sort subvolumes with btrfs backend */ +struct vols { + rblink link; + int64_t id; + int count; + char uuid[MAX_NAME_LENGTH]; + char puuid[MAX_NAME_LENGTH]; + char otime[MAX_NAME_LENGTH]; + char path[1]; +}; + +int vols_compare_id(void *item1, void *item2) +{ + vols *vol1 = (vols *) item1; + vols *vol2 = (vols *) item2; + + if (vol1->id > vol2->id) { + return 1; + + } else if (vol1->id < vol2->id) { + return -1; + + } else { + return 0; + } +} + +int vols_compare_uuid(void *item1, void *item2) +{ + vols *vol1 = (vols *) item1; + vols *vol2 = (vols *) item2; + + return strcmp(vol1->uuid, vol2->uuid); +} + +/* btrfs backend */ +class btrfs: public snapshot { +public: + btrfs(arguments *arg): snapshot(arg, "btrfs") {}; + + /* With BTRFS, the volume is already mounted */ + int mount() { + if (!snapshot::mount()) { + return 0; + } + split_path_and_filename(arg->volume, &path, &pnl, &fname, &fnl); + fprintf(stdout, "status=1 snapmountpoint=\"%s\" snapdirectory=\"%s\"\n", + arg->volume, path); + return 1; + }; + + int unmount() { + if (!snapshot::unmount()) { + return 0; + } + printf("status=1\n"); + return 1; + }; + + int support() { + if (!snapshot::support()) { + return 0; + } + /* If the fstype is btrfs, snapshots are supported */ +/* + Mmsg(cmd, "%sbtrfs filesystem label \"%s\"", arg->sudo, arg->mountpoint); + if (run_program(cmd, 60, errmsg)) { + printf("status=0 type=btrfs\n"); + return 0; + } + Dmsg(0, "output=%s\n", errmsg); +*/ + printf("status=1 device=\"%s\" type=btrfs\n", arg->mountpoint); + return 1; + }; + + int check() { + if (!snapshot::check()) { + return 0; + } + return 1; + }; + + int create() { + utime_t createdate = 0; + char ed1[50]; + if (!snapshot::create()) { + return 0; + } + + Mmsg(path, "%s/%s", arg->mountpoint, arg->snapdir); + if (!makedir(path)) { + printf("status=%d error=\"Unable to create mountpoint directory %s errno=%d\n", + get_error_code(), + arg->mountpoint, errno); + return 0; + } + + Dmsg(10, "mountpoint=%s snapdir=%s name=%s\n", arg->mountpoint, arg->snapdir, arg->name); + path_concat(path, arg->mountpoint, arg->snapdir, arg->name); + Dmsg(10, "path=%s\n", path); + + /* Create the actual btrfs snapshot */ + Mmsg(cmd, "%sbtrfs subvolume snapshot -r \"%s\" \"%s\"", + arg->sudo, arg->mountpoint, path); + + if (run_program(cmd, 60, errmsg)) { + Dmsg(10, "Unable to create snapshot %s %s\n", arg->mountpoint, errmsg); + strip_quotes(errmsg); + printf("status=%d error=\"Unable to create snapshot %s\"\n", + get_error_code(), + errmsg); + return 0; + } + + /* On SLES12 btrfs 3.16, commands on "/" returns "doesn't belong to btrfs mount point" */ + Mmsg(cmd, "%sbtrfs subvolume show \"%s\"", arg->sudo, path); + if (run_program_full_output(cmd, 60, errmsg)) { + Dmsg(10, "Unable to display snapshot stats %s %s\n", arg->mountpoint, errmsg); + + } else { + /* TODO: Check that btrfs subvolume show is reporting "Creation time:" */ + char *p = strstr(errmsg, "Creation time:"); + if (p) { + p += strlen("Creation time:"); + skip_spaces(&p); + createdate = str_to_utime(p); + + } else { + Dmsg(10, "Unable to find Creation time on %s %s\n", arg->mountpoint, errmsg); + } + } + + if (!createdate) { + createdate = time(NULL); + } + printf("status=1 volume=\"%s\" createtdate=%s type=btrfs\n", + path, edit_uint64(createdate, ed1)); + return 1; + }; + + int del() { + if (!snapshot::del()) { + return 0; + } + + Mmsg(cmd, "%sbtrfs subvolume delete \"%s\"", arg->sudo, arg->volume); + if (run_program(cmd, 300, errmsg)) { + Dmsg(10, "Unable to delete snapshot %s\n", errmsg); + strip_quotes(errmsg); + printf("status=0 type=btrfs error=\"%s\"\n", errmsg); + return 0; + } + printf("status=1\n"); + return 1; + }; + + /* btrfs subvolume list -u -q -s /tmp/regress/btrfs + * ID 259 gen 52 top level 5 parent_uuid - uuid baf4b5d7-28d0-9b4a-856e-36e6fd4fbc96 path .snapshots/aaa + */ + int list() { + char *p, *p2, *end, *path; + char id[50], day[50], hour[50]; + struct vols *v = NULL, *v2; + rblist *lst; + + if (!snapshot::list()) { + return 0; + } + Mmsg(cmd, "%sbtrfs subvolume list -u -q -o -s \"%s\"", arg->sudo, arg->mountpoint); + if (run_program_full_output(cmd, 300, errmsg)) { + Dmsg(10, "Unable to list snapshot %s\n", errmsg); + strip_quotes(errmsg); + printf("status=0 type=btrfs error=\"%s\"\n", errmsg); + return 0; + } + + lst = New(rblist(v, &v->link)); + + /* ID 259 gen 52 top level 5 parent_uuid - uuid baf4b5d7-28d0-9b4a-856e-36e6fd4fbc96 path .snapshots/aaa */ + for (p = errmsg; p && *p ;) { + Dmsg(20, "getting subvolumes from %s", p); + + /* Replace final \n by \0 to have strstr() happy */ + end = strchr(p, '\n'); + + /* If end=NULL, we are at the end of the buffer (without trailing \n) */ + if (end) { + *end = 0; + } + + /* Each line is supposed to start with "ID", and end with "path" */ + bool ok = false; + if (sscanf(p, "ID %50s ", id) == 1) { /* We found ID, look for path */ + p2 = strstr(p, "path "); + if (p2) { + path = p2 + strlen("path "); + v = (struct vols*) malloc(sizeof (vols) + strlen(path) + 1); + *v->otime = *v->uuid = *v->puuid = 0; + v->id = str_to_int64(id); + v->count = 0; + strcpy(v->path, path); + + p2 = strstr(p, "otime"); + if (p2 && sscanf(p2, "otime %50s %50s", day, hour) == 2) { + bsnprintf(v->otime, sizeof(v->otime), "%s %s", day, hour); + } + + p2 = strstr(p, "parent_uuid "); + if (p2 && sscanf(p2, "parent_uuid %127s", v->puuid) == 1) { + + p2 = strstr(p, " uuid "); + if (p2 && sscanf(p2, " uuid %127s", v->uuid) == 1) { + + v2 = (struct vols *)lst->insert(v, vols_compare_uuid); + if (v2 != v) { + v2->count++; + free(v); + } + ok = true; + /* Replace final \n by \0 to have strstr() happy */ + Dmsg(10, "puuid=%s uuid=%s path=%s\n", v2->puuid, v2->uuid, v2->path); + } + } + } + } + if (!ok) { + Dmsg(10, "Unable to decode \"%s\" line\n", p); + } + if (end) { + *end = '\n'; + end++; + } + /* If end==NULL, we stop */ + p = end; + } + + foreach_rblist(v, lst) { + char *name = v->path; + int len = strlen(arg->snapdir); + if ((p = strstr(v->path, arg->snapdir))) { + name = p + len + ((arg->snapdir[len-1] == '/') ? 0 : 1); + } + printf("volume=\"%s%s%s\" name=\"%s\" device=\"%s\" createdate=\"%s\" type=\"btrfs\"\n", + arg->mountpoint, + arg->mountpoint[strlen(arg->mountpoint) - 1] == '/' ? "": "/", + v->path, + name, + arg->mountpoint, + v->otime + ); + } + + delete lst; + return 1; + }; + + void scan_subvolumes(char *buf, rblist *lst) { + char *p, *end; + char id[50]; + bool ok; + struct vols *elt1 = NULL, *elt2 = NULL; + + /* btrfs subvolume list /var/lib/pacman/ + * ID 349 gen 383 top level 5 path test + * ID 354 gen 391 cgen 391 top level 5 otime 2014-11-05 17:49:07 path .snapshots/aa + */ + for (p = buf; p && *p ;) { + Dmsg(20, "getting subvolumes from %s", p); + + /* Replace final \n by \0 to have strstr() happy */ + end = strchr(p, '\n'); + /* If end=NULL, we are at the end of the buffer (without trailing \n) */ + if (end) { + *end = 0; + } + + /* Each line is supposed to start with "ID", and end with "path" */ + ok = (sscanf(p, "ID %50s ", id) == 1); + if (ok) { /* We found ID, look for path */ + p = strstr(p, "path "); + if (p) { + p += strlen("path "); + + elt1 = (struct vols *) malloc(sizeof(struct vols) + strlen(p) + 1); + elt1->id = str_to_int64(id); + elt1->count = 0; + strcpy(elt1->path, p); + Dmsg(10, "Found path %s for id %s\n", elt1->path, id); + elt2 = (struct vols *)lst->insert(elt1, vols_compare_id); + if (elt2 != elt1) { + elt2->count++; + free(elt1); + } + } else { + Dmsg(10, "Unable to find the path in this line\n"); + } + + } else { + Dmsg(10, "Unable to decode %s line\n", p); + } + if (end) { + *end = '\n'; + end++; + } + /* If end==NULL, we stop */ + p = end; + } + }; + + /* List subvolumes, they may not be listed by mount */ + int subvolumes() { + rblist *lst; + struct stat sp; + struct vols *elt1 = NULL; + char ed1[50]; + + Mmsg(cmd, "%sbtrfs subvolume show \"%s\"", arg->sudo, arg->mountpoint); + if (run_program_full_output(cmd, 300, errmsg)) { + Dmsg(10, "Unable to get information %s\n", errmsg); + strip_quotes(errmsg); + printf("status=0 type=btrfs error=\"%s\"\n", errmsg); + return 0; + } + + /* TODO: Very week way to analyse FS */ + if (!strstr(errmsg, "is btrfs root")) { + printf("status=0 type=btrfs error=\"Not btrfs root fs\"\n"); + return 0; + } + + Mmsg(cmd, "%sbtrfs subvolume list -s \"%s\"", arg->sudo, arg->mountpoint); + if (run_program_full_output(cmd, 300, errmsg)) { + Dmsg(10, "Unable to list snapshot snapshot %s\n", errmsg); + strip_quotes(errmsg); + printf("status=0 type=btrfs error=\"%s\"\n", errmsg); + return 0; + } + + lst = New(rblist(elt1, &elt1->link)); + scan_subvolumes(errmsg, lst); + + Mmsg(cmd, "%sbtrfs subvolume list \"%s\"", arg->sudo, arg->mountpoint); + if (run_program_full_output(cmd, 300, errmsg)) { + Dmsg(10, "Unable to list subvolume %s\n", errmsg); + strip_quotes(errmsg); + printf("status=0 type=btrfs error=\"%s\"\n", errmsg); + delete lst; + return 0; + } + scan_subvolumes(errmsg, lst); + + foreach_rblist(elt1, lst) { + if (elt1->count > 0) { /* Looks to be a snapshot, we saw two entries */ + continue; + } + + path_concat(path, arg->mountpoint, elt1->path, NULL); + + if (stat(path, &sp) == 0) { + printf("dev=%s mountpoint=\"%s\" fstype=btrfs\n", + edit_uint64(sp.st_dev, ed1), path); + + } else { + Dmsg(10, "Unable to stat %s (%s)\n", elt1->path, path); + } + } + delete lst; + return 1; + }; +}; + +/* Create pool + * zpool create pool /dev/device + * zfs create pool/eric + * zfs set mountpoint=/mnt test/eric + * zfs mount pool/eric + */ +/* zfs backend */ +class zfs: public snapshot { +public: + zfs(arguments *arg): snapshot(arg, "zfs") { + arg->snapdir = ".zfs/snapshot"; + }; + + /* With ZFS, the volume is already mounted + * but on linux https://github.com/zfsonlinux/zfs/issues/173 + * we need to use the mount command. + * TODO: Adapt the code for solaris + */ + int mount() { + struct stat sp; + + if (!snapshot::mount()) { + return 0; + } + + path_concat(path, arg->mountpoint, arg->snapdir, arg->name); + + if (stat(path, &sp) != 0) { + /* See if we can change the snapdir attribute */ + Mmsg(cmd, "%szfs set snapdir=visible \"%s\"", arg->sudo, arg->device); + if (run_program(cmd, 60, errmsg)) { + Dmsg(10, "Unable to change the snapdir attribute %s %s\n", arg->device, errmsg); + strip_quotes(errmsg); + printf("status=0 error=\"Unable to mount snapshot %s\"\n", errmsg); + return 0; + } + if (stat(path, &sp) != 0) { + Dmsg(10, "Unable to get the snapdir %s %s\n", arg->snapdir, arg->device); + strip_quotes(errmsg); + printf("status=0 error=\"Unable to mount snapshot, no snapdir %s\"\n", arg->snapdir); + return 0; + } + } +#if 0 /* On linux, this function is broken for now */ + makedir(path); + Mmsg(cmd, "%smount -t %s \"%s\" \"%s\"", arg->sudo, arg->fstype, arg->volume, path); + if (run_program(cmd, 60, errmsg)) { + Dmsg(10, "Unable to create mount snapshot %s %s\n", arg->volume, errmsg); + strip_quotes(errmsg); + printf("status=0 error=\"Unable to mount snapshot %s\"\n", errmsg); + return 0; + } + +#endif + fprintf(stdout, "status=1 snapmountpoint=\"%s\" snapdirectory=\"%s/%s\"\n", + path, arg->mountpoint, arg->snapdir); + return 1; + }; + + /* No need to unmount something special */ + int unmount() { + printf("status=1\n"); + return 1; + }; + + int support() { + if (!snapshot::support()) { + return 0; + } + Mmsg(cmd, "%szfs list -H -o name \"%s\"", arg->sudo, arg->mountpoint); + if (run_program(cmd, 60, errmsg)) { + Dmsg(10, "Unable to get device %s %s\n", arg->mountpoint, errmsg); + strip_quotes(errmsg); + printf("status=0 error=\"Unable to get device %s\"\n", errmsg); + return 0; + } + strip_trailing_junk(errmsg); + /* If the fstype is zfs, snapshots are supported */ + printf("status=1 device=\"%s\" type=zfs\n", errmsg); + return 1; + }; + + int create() { + char ed1[50]; + + if (!snapshot::create()) { + return 0; + } + + Mmsg(path, "%s@%s", arg->device, arg->name); + + /* Create the actual zfs snapshot */ + Mmsg(cmd, "%szfs snapshot \"%s\"", arg->sudo, path); + + if (run_program(cmd, 60, errmsg)) { + Dmsg(10, "Unable to create snapshot %s %s\n", arg->device, errmsg); + strip_quotes(errmsg); + printf("status=%d error=\"Unable to create snapshot %s\"\n", + get_error_code(), + errmsg); + return 0; + } + + Mmsg(cmd, "%szfs get -p creation \"%s\"", arg->sudo, path); + if (run_program_full_output(cmd, 60, errmsg)) { + Dmsg(10, "Unable to display snapshot stats %s %s\n", arg->device, errmsg); + strip_quotes(errmsg); + printf("status=%d error=\"Unable to get snapshot info %s\"\n", + get_error_code(), + errmsg); + return 0; + } + + /* TODO: Check that zfs get is reporting "creation" time */ + Mmsg(cmd, "NAME PROPERTY VALUE SOURCE\n%s creation %%s", path); + if (sscanf(errmsg, cmd, ed1) == 1) { + Dmsg(10, "Found CreateTDate=%s\n", ed1); + printf("status=1 volume=\"%s\" createtdate=%s type=zfs\n", + path, ed1); + + } else { + printf("status=1 volume=\"%s\" createtdate=%s type=zfs\n", + path, edit_uint64(time(NULL), ed1)); + } + return 1; + }; + + int del() { + if (!snapshot::del()) { + return 0; + } + + Mmsg(cmd, "%szfs destroy \"%s\"", arg->sudo, arg->volume); + if (run_program(cmd, 300, errmsg)) { + Dmsg(10, "Unable to delete snapshot %s\n", errmsg); + strip_quotes(errmsg); + printf("status=0 type=zfs error=\"%s\"\n", errmsg); + return 0; + } + printf("status=1\n"); + return 1; + }; + + /* zfs list -t snapshot + * test/eric@snap1 17K - 21K - + * test/eric@snap2 17K - 21K - + * + * it is possible to change fields to display with -o + */ + int list() { + POOL_MEM buf2; + if (!snapshot::list()) { + return 0; + } + + Mmsg(cmd, "%szfs list -t snapshot -H -o name,used,creation", arg->sudo); + /* rpool@basezone_snap00 0 Fri Mar 6 9:55 2015 */ + if (run_program_full_output(cmd, 60, errmsg)) { + Dmsg(10, "Unable to list snapshot %s\n", errmsg); + strip_quotes(errmsg); + printf("status=0 error=\"Unable to list snapshot %s\"\n", errmsg); + return 0; + } + + int i = 1, Day, Year, Hour, Min; + char DayW[50], Month[50], CreateDate[50]; + const char *buf[4]; + + buf[0] = errmsg; + for (char *p = errmsg; p && *p ; p++) { + if (*p == '\n') { + *p = 0; + /* Flush the current one */ + if (!arg->device || strcmp(arg->device, buf[0]) == 0) { + + if (sscanf(buf[3], "%s %s %d %d:%d %d", + DayW, Month, &Day, &Hour, &Min, &Year) == 6) + { + /* Get a clean iso format */ + for (int j=1; j <= 12 ; j++) { + if (strcmp(Month, Months[j]) == 0) { + snprintf(Month, sizeof(Month), "%02d", j); + } + } + snprintf(CreateDate, sizeof(CreateDate), "%d-%s-%02d %02d:%02d:00", + Year, Month, Day, Hour, Min); + buf[3] = CreateDate; + } + printf("volume=\"%s@%s\" name=\"%s\" device=\"%s\" size=\"%s\" " + "createdate=\"%s\" status=1 error=\"\" type=\"zfs\"\n", + buf[0], buf[1], buf[1], buf[0], buf[2], buf[3]); + } else { + Dmsg(10, "Do not list %s@%s\n", buf[0], buf[1]); + } + + i = 1; + buf[0] = p+1; + buf[1] = buf[2] = buf[3] = ""; + + } else if ((*p == '\t' || *p == '@') && i < 4) { + buf[i++] = p+1; + *p = 0; + } + } + + return 1; + }; +}; + +/* Structure of the LVS output */ +typedef struct { + const char *name; + int pos; +} Header; + +/* -1 is mandatory, -2 is optionnal */ +static Header lvs_header[] = { + /* KEEP FIRST */ + {"Path", -1}, /* Volume Path: /dev/ubuntu-vg/root */ + {"DMPath",-2}, /* Device mapper Path /dev/mapper/ubuntu--vg-root */ + {"LV", -1}, /* Volume Name: root */ + {"Attr", -1}, /* Attributes: -wi-ao--- */ + {"KMaj", -1}, /* Kernel Major: 252 */ + {"KMin", -1}, /* Kernel Minor: 0 */ + {"LSize", -1}, /* Size (b) */ + {"#Seg", -1}, /* Number of segments */ + {"Origin",-1}, + {"OSize", -1}, + {"Snap%", -1}, + {"Time", -1}, /* Creation date */ + {NULL, -1} +}; + +static Header vgs_header[] = { + /* KEEP FIRST */ + {"VG", -1}, /* VG Name: vgroot */ + {"VSize", -1}, /* Size */ + {"VFree", -1}, /* Space left */ + {"#Ext", -1}, /* Nb Ext */ + {"Free", -1}, /* Nb Ext free */ + {"Ext", -1}, /* Ext size */ + {NULL, -1} +}; + +/* LVM backend, not finished */ +class lvm: public snapshot { +public: + alist *lvs, *vgs; + int lvs_nbelt, vgs_nbelt; + + lvm(arguments *arg): + snapshot(arg, "lvm"), lvs(NULL), vgs(NULL), lvs_nbelt(0), + vgs_nbelt(0) {}; + + ~lvm() { + free_header(lvs, lvs_nbelt); + free_header(vgs, vgs_nbelt); + }; + + void free_header(alist *lst, int nbelt) { + if (lst) { + char **current; + /* cleanup at the end */ + foreach_alist(current, lst) { + for (int j=0; j < nbelt ; j++) { + Dmsg(50, "current[%d] = %s\n", j, current[j]); + free(current[j]); + } + free(current); + } + delete lst; + } + }; + + char *get_vg_from_lv_path(char *path, char *vg, int max) { + char *p; + + if (!path) { + return NULL; + } + + /* Make a copy of the path */ + bstrncpy(vg, path, max); + path = vg; + + if (strncmp(path, "/dev/", 5) != 0) { + Dmsg(10, "Strange path %s\n", path); + return NULL; + } + path += 5; /* skip /dev/ */ + + /* End the string at the last / */ + p = strchr(path, '/'); + if (!p) { + Dmsg(10, "Strange end of path %s\n", path); + return NULL; + } + *p = 0; + + return path; + }; + + /* Report the space available on VG */ + int64_t get_space_available(char *lv) { + char buf[512]; + char *vgname = get_vg_from_lv_path(get_lv_value(lv, "Path"), + buf, sizeof(buf)); + + if (vgname) { + char *s = get_vg_value(vgname, "VFree"); + if (s) { + return str_to_int64(s); + + } else { + Dmsg(10, "Unable to get VFree\n"); + } + + } else { + Dmsg(10, "Unable to get VG from %s\n", lv); + } + return -1; + }; + + /* return vg_ssd-pacman */ + char *get_lv_from_dm(char *dm, POOLMEM **ret, uint32_t *major, uint32_t *minor) { + struct stat sp; + char *p, *start; + uint32_t maj, min; + + /* Looks to be a device mapper, need to convert the name */ + if (strncmp(dm, "/dev/dm", strlen("/dev/dm")) != 0) { + return NULL; + } + if (stat(dm, &sp) < 0) { + return NULL; + } + + Mmsg(cmd, "%sdmsetup ls", arg->sudo); + if (run_program_full_output(cmd, 60, errmsg)) { + Dmsg(10, "Unable to query dmsetup %s\n", errmsg); + return NULL; + } + /* vg_ssd-pacman-real (254:1) + * vg_ssd-pacman (254:0) + * or + * vg_ssd-pacman-real (254, 1) + * vg_ssd-pacman-real (254, 1) + */ + *ret = check_pool_memory_size(*ret, strlen(errmsg)+1); + for (start = p = errmsg; *p ; p++) { + if (*p == '\n') { + *p = 0; + if (sscanf(start, "%s (%d:%d)", *ret, &maj, &min) == 3 || + sscanf(start, "%s (%d, %d)", *ret, &maj, &min) == 3) + { + if (maj == major(sp.st_rdev) && + min == minor(sp.st_rdev)) + { + return *ret; + } + } + start = p+1; + } + } + return NULL; + }; + + /* The LV path from name or dmpath */ + char **get_lv(char *lv) { + char **elt = NULL, *dm = NULL; + int path = get_value_pos(lvs_header, "Path"); + int dmpath = get_value_pos(lvs_header, "DMPath"); + int kmaj = get_value_pos(lvs_header, "KMaj"); + int kmin = get_value_pos(lvs_header, "KMin"); + uint32_t min = 0, maj = 0; + POOLMEM *buf = get_pool_memory(PM_FNAME); + + if (!lv || (path < 0 && dmpath < 0)) { + Dmsg(10, "Unable to get LV parameters\n"); + goto bail_out; + } + + dm = get_lv_from_dm(lv, &buf, &maj, &min); + Dmsg(50, "%s = get_lv_from_dm(%s, %s, %d, %d)\n", dm, lv, buf, maj, min); + + /* HERE: Need to loop over LVs */ + foreach_alist(elt, lvs) { + if (path > 0 && strcmp(NPRT(elt[path]), lv) == 0) { + goto bail_out; + } + + if (dmpath > 0 && strcmp(NPRT(elt[dmpath]), lv) == 0) { + goto bail_out; + } + + /* Try by Minor/Major if comming from device mapper */ + if ((maj && kmaj && str_to_uint64(elt[kmaj]) == maj) && + (min && kmin && str_to_uint64(elt[kmin]) == min)) + { + goto bail_out; + } + + /* Find if /dev/mapper/vg_ssd-pacman matches vg_ssd-pacman */ + if (dm && dmpath && strlen(elt[dmpath]) > strlen("/dev/mapper/")) { + if (strcmp(elt[dmpath] + strlen("/dev/mapper/"), dm) == 0) { + goto bail_out; + } + } + + /* Special case for old LVM where mapper path doesn't exist */ + if (dmpath < 0 && strncmp("/dev/mapper/", lv, 12) == 0) { + + POOLMEM *buf2 = get_memory(strlen(elt[path])*2+10); + pm_strcpy(buf2, "/dev/mapper/"); + + char *d = buf2 + 12; /* Skip /dev/mapper/ */ + bool ret = false; + + /* Keep the same path, but escape - to -- and / to - */ + for (char *p = elt[path]+5; *p ; p++) { + if (*p == '-') { + *d++ = *p; + } + /* Escape / to - if needed */ + *d++ = (*p == '/') ? '-' : *p; + } + *d = 0; + ret = (strcmp(buf2, lv) == 0); + free_pool_memory(buf2); + + if (ret) { + goto bail_out; + } + } + } + Dmsg(10, "%s not found in lv list\n", lv); + return NULL; /* not found */ + + bail_out: + if (buf) { + free_pool_memory(buf); + } + return elt; + }; + + /* Report LV Size in bytes */ + int64_t get_lv_size(char *name) { + char **elt = get_lv(arg->device); + int sp; + + if (!elt) { + return -1; + } + + sp = get_value_pos(lvs_header, "LSize"); + /* Check if we have enough space on the VG */ + return str_to_int64(elt[sp]); + }; + + char *get_lv_value(char *name, const char *value) { + return get_value(lvs_header, lvs_nbelt, lvs, name, value); + }; + + int get_value_pos(Header *header, const char *value) { + for (int i = 0; header[i].name ; i++) { + if (strcmp(header[i].name, value) == 0) { + return header[i].pos; + } + } + return -1; /* not found */ + }; + + /* Return an element value */ + char *get_value(Header *header, int nbelt, alist *lst, + char *name, const char *value) { + char **elt; + int pos = get_value_pos(header, value); + int id = header[0].pos; /* position name */ + + if (pos < 0 || id == -1) { + return NULL; + } + /* Loop over elements we have, and return the value that is asked */ + foreach_alist(elt, lst) { + if (strcmp(NPRT(elt[id]), name) == 0) { + return elt[pos]; + } + } + return NULL; + }; + + /* Return a parameter for a VolumeGroup */ + char *get_vg_value(char *vg, const char *value) { + return get_value(vgs_header, vgs_nbelt, vgs, vg, value); + }; + + /* Get snapshot size, look in config file if needed */ + int get_lvm_snapshot_size(char *lv) { + char *tmp, **elt; + uint64_t s, size; + int sp; + alist *lst; + + int pos = arg->ini.get_item("lvm_snapshot_size"); + if (!arg->ini.items[pos].found) { + return -1; /* Nothing specified, stop here */ + } + + lst = arg->ini.items[pos].val.alistval; + if (lst) { + /* /dev/ubuntu-vg/root:100M + * /dev/ubuntu-vg/home:10% + * /dev/ubuntu-vg/var:200GB + */ + foreach_alist(tmp, lst) { + char *p = strchr(tmp, ':'); + + /* Check the LV name */ + if (p && strncmp(tmp, lv, p - tmp) != 0) { + continue; + } + + /* This is a percent */ + if (strchr(p+1, '%') != NULL) { + Dmsg(10, "Found a %%\n"); + s = str_to_int64(p+1); + + /* Compute the requested size */ + sp = get_value_pos(lvs_header, "LSize"); + elt = get_lv(lv); + size = str_to_int64(elt[sp]); + return size * (s / 100); + } + + /* It might be a size */ + if (size_to_uint64(p+1, strlen(p+1), &s)) { + Dmsg(10, "Found size %ld\n", s); + return s; + } + Dmsg(10, "Unable to use %s\n", tmp); + return -1; + } + } + return -1; + }; + + int create() { + char *name, *ts, buf[128], *lvname; + int64_t size, ssize, maxsize; + if (!snapshot::create()) { + return 0; + } + + if (!parse_lvs_output() || + !parse_vgs_output()) + { + printf("status=%d error=\"Unable parse lvs or vgs output\"\n", + get_error_code()); + return 0; + } + + path_concat(path, arg->mountpoint, arg->snapdir, arg->name); + + if (!makedir(path)) { + printf("status=%d error=\"Unable to create mountpoint directory %s errno=%d\n", + get_error_code(), + arg->mountpoint, errno); + return 0; + } + + name = get_lv_value(arg->device, "LV"); + size = get_lv_size(arg->device); + if (size < 0) { + printf("status=%d error=\"Unable to get lv size\"\n", + get_error_code()); + return 0; + } + + ssize = get_lvm_snapshot_size(arg->device); + if (ssize > 0) { + size = ssize; + } else { + size = size / 10; /* Ask to get 10% */ + } + + size = (size / 512L) * 512L; + + lvname = get_lv_value(arg->device, "Path"); + maxsize = get_space_available(lvname); + Dmsg(10, "maxsize=%ld size=%ld\n", maxsize, size); + + if (maxsize < 0) { + printf("status=%d error=\"Unable to detect maxsize\" type=lvm\n", + get_error_code()); + return 0; + } + + if (size > maxsize) { + char ed1[50], ed2[50]; + printf("status=%d error=\"Not enough space left on VG %sB, " + "%sB is required\" type=lvm\n", + get_error_code(), + edit_uint64_with_suffix(maxsize, ed1), + edit_uint64_with_suffix(size, ed2)); + return 0; + } + + /* TODO: Need to get the volume name and add the snapshot + * name at the end + */ + Mmsg(cmd, "%slvcreate -s -n \"%s_%s\" -L %lldb \"%s\"", + arg->sudo, name, arg->name, size, arg->device); + if (run_program(cmd, 60, errmsg)) { + Dmsg(10, "Unable to create snapshot %s %s\n", arg->name, errmsg); + strip_quotes(errmsg); + printf("status=0 error=\"Unable to create snapshot %s\"\n", errmsg); + return 0; + } + if (!parse_lvs_output()) { + Dmsg(10, "Unable to parse lvm output after snapshot creation\n"); + printf("status=0 error=\"Unable to parse lvs\"\n"); + return 0; + } + + Mmsg(cmd, "%s_%s", arg->device, arg->name); + ts = get_lv_value(cmd, "Time"); + if (!ts) { + Dmsg(10, "Unable to find snapshot in lvs output\n"); + bstrftimes(buf, sizeof(buf), time(NULL)); + ts = buf; + } + Dmsg(10, "status=1 volume=\"%s_%s\" createdate=\"%s\" type=lvm\n", + arg->device, arg->name, ts); + printf("status=1 volume=\"%s_%s\" createdate=\"%s\" type=lvm\n", + arg->device, arg->name, ts); + return 1; + }; + + int del() { + if (!snapshot::del()) { + return 0; + } + Mmsg(cmd, "%slvremove -f \"%s\"", + arg->sudo, arg->volume); + + if (run_program(cmd, 60, errmsg)) { + Dmsg(10, "Unable to delete snapshot %s %s\n", arg->name, errmsg); + strip_quotes(errmsg); + printf("status=0 error=\"Unable to delete snapshot %s\"\n", errmsg); + return 0; + } + + printf("status=1\n"); + return 1; + }; + + int check() { + if (!snapshot::check()) { + return 0; + } + parse_vgs_output(); + for (int i = 0; vgs_header[i].name ; i++) { + if (vgs_header[i].pos == -1) { + printf("status=0 error=\"Unable to use output of vgs command." + " %s is missing.\"\n", + vgs_header[i].name); + return 0; + } + } + + parse_lvs_output(); + for (int i = 0; lvs_header[i].name ; i++) { + if (lvs_header[i].pos == -1) { + printf("status=0 error=\"Unable to use output of lvs command." + " %s is missing.\"\n", + lvs_header[i].name); + return 0; + } + } + return 1; + }; + + void strip_double_slashes(char *fname) + { + char *p = fname; + while (p && *p) { + p = strpbrk(p, "/\\"); + if (p != NULL) { + if (IsPathSeparator(p[1])) { + strcpy(p, p+1); + } + p++; + } + } + }; + + int mount() { + if (!snapshot::mount()) { + return 0; + } + + path_concat(path, arg->mountpoint, arg->snapdir, arg->name); + + if (!makedir(path)) { + printf("status=0 error=\"Unable to create mount point %s errno=%d\"\n", + path, errno); + return 0; + } + + Mmsg(cmd, "%smount -o ro \"%s\" \"%s\"", arg->sudo, arg->volume, path); + if (run_program(cmd, 60, errmsg) != 0) { + Dmsg(10, "Unable to mount volume. ERR=%s\n", errmsg); + strip_quotes(errmsg); + printf("status=0 error=\"Unable to mount the device %s\"\n", errmsg); + return 0; + } + + Dmsg(10, "status=1 snapmountpoint=\"%s\" snapdirectory=\"%s/%s\"\n", + path, arg->mountpoint, arg->snapdir); + printf("status=1 snapmountpoint=\"%s\" snapdirectory=\"%s/%s\"\n", + path, arg->mountpoint, arg->snapdir); + return 1; + }; + + int unmount() { + int ret, retry = arg->retry; + + if (!snapshot::unmount()) { + return 0; + } + + Mmsg(cmd, "%sumount \"%s\"", arg->sudo, arg->snapmountpoint); + do { + ret = run_program(cmd, 60, errmsg); + if (ret != 0) { + Dmsg(10, "Unable to unmount the directory. ERR=%s\n", errmsg); + sleep(3); + } + } while (ret != 0 && retry-- > 0); + + if (ret != 0) { + Dmsg(10, "Unable to mount volume. ERR=%s\n", errmsg); + strip_quotes(errmsg); + printf("status=0 error=\"Unable to umount the device %s\"\n", errmsg); + return 0; + } + + retry = arg->retry; + do { + Dmsg(10, "Trying to delete mountpoint %s\n", arg->snapmountpoint); + if ((ret = rmdir(arg->snapmountpoint)) != 0) { + sleep(3); + } + } while (retry-- > 0 && ret != 0); + + if (ret != 0) { + berrno be; + Dmsg(10, "Unable to delete mountpoint after unmount\n"); + printf("error=\"Unable to delete mountpoint after unmount errno=%s\"", + be.bstrerror(errno)); + } + printf(" status=1\n"); + return 1; + }; + + /* TODO: Here we need to check LVM settings */ + int support() { + char **elt; + int mp; + + if (!snapshot::support()) { + return 0; + } + if (!check()) { + return 0; + } + + elt = get_lv(arg->device); + + if (!elt) { + Dmsg(10, "Not detected as LVM\n"); + printf("status=0 error=\"Not detected as LVM\"\n"); + return 0; + } + mp = get_value_pos(lvs_header ,"Path"); + printf("status=1 device=\"%s\" type=lvm\n", elt[mp]); + return 1; + }; + + /* count the number of column in the output */ + int count_col(char *l, char sep) { + int nb=0; + for (char *p = l ; *p ; p++) { + if (*p == sep) { + nb++; + } + } + return nb; + }; + + /* Decode the Attr field */ + int decode_attr(char *l) { + /* + * Volume type: (m)irrored, (M)irrored without initial sync, + * (o)rigin, (O)rigin with merging snapshot, (r)aid, (R)aid + * without initial sync, (s)napshot, merging (S)napshot, + * (p)vmove, (v)irtual, mirror or raid (i)mage, mirror or raid + * (I)mage out-of-sync, mirror (l)og device, under (c)onversion, + * thin (V)olume, (t)hin pool, (T)hin pool data, raid or thin + * pool m(e)tadata + */ + + return 0; + }; + + bool parse_vgs_output() { + Mmsg(cmd, "%svgs -o vg_all --separator=; --units b --nosuffix", arg->sudo); + if (vgs) { + free_header(vgs, vgs_nbelt); + vgs_nbelt=0; + } + vgs = New(alist(10, not_owned_by_alist)); + if (!parse_output(cmd, vgs, &vgs_nbelt, vgs_header)) { + return false; + } + return true; + }; + + bool parse_lvs_output() { + Mmsg(cmd, "%slvs -o lv_all --separator=; --units b --nosuffix", arg->sudo); + if (lvs) { + free_header(lvs, lvs_nbelt); + lvs_nbelt=0; + } + lvs = New(alist(10, not_owned_by_alist)); + if (!parse_output(cmd, lvs, &lvs_nbelt, lvs_header)) { + return false; + } + return true; + }; + + /* Function to parse LVM command output */ + bool parse_output(char *cmd, alist *ret, int *ret_nbelt, Header *hdr) { + char *p; + int i=0; + int pos=0; + int nbelt=0; + char buf[2048]; /* Size for a single line */ + bool header_done=false; + + if (run_program_full_output(cmd, 60, errmsg)) { + strip_quotes(errmsg); + Dmsg(10, "Unable to run lvs. ERR=%s\n", errmsg); + return false; + } + + char **current = NULL; + + for (p = errmsg; *p ; p++) { + if (*p == ';') { /* We have a separator, handle current value */ + buf[i]=0; + if (!header_done) { + nbelt++; /* Keep the number of element in the line */ + + /* Find if we need this value, and where to store it */ + for (int j=0; hdr[j].name ; j++) { + if (strcasecmp(buf, hdr[j].name) == 0) { + hdr[j].pos = pos; + break; + } + } + + } else { + if (pos == 0) { + /* First item, need to allocate new array */ + current = (char **)malloc(nbelt * sizeof(char *) + 1); + memset(current, 0, nbelt * sizeof(char *) + 1); + ret->append(current); + } + /* Keep the current value */ + current[pos] = bstrdup(buf); + } + pos++; + i = 0; + } else if (*p == '\n') { + /* We deal with a new line, so the header is done (if in) */ + header_done = true; + i = 0; + pos = 0; + + } else if (i < (int)sizeof(buf)) { + buf[i++] = *p; + + } else { + Dmsg(10, "Output too big !!! %s\n", errmsg); + break; + } + } + *ret_nbelt = nbelt; + return true; + }; + + int list() { + char **elt, **elt2 = NULL; + const char *err = NULL; + int p_attr, p_path, p_origin, p_time, p_size; + POOLMEM *p, *f, *d; + int fnl, pnl, status; + + if (!snapshot::list()) { + return false; + } + + if (!parse_lvs_output()) { + return false; + } + + p_attr = get_value_pos(lvs_header, "Attr"); + p_path = get_value_pos(lvs_header, "Path"); + p_time = get_value_pos(lvs_header, "Time"); + p_size = get_value_pos(lvs_header, "Snap%"); + p_origin = get_value_pos(lvs_header, "Origin"); + + if (p_time < 0 || p_origin < 0) { + printf("status=1 error=\"Unable to get snapshot Origin from lvs command\"\n"); + return false; + } + + p = get_pool_memory(PM_FNAME); + f = get_pool_memory(PM_FNAME); + d = get_pool_memory(PM_FNAME); + + elt2 = get_lv(arg->device); + + /* TODO: We need to get the device name from the mount point */ + foreach_alist(elt, lvs) { + char *attr = elt[p_attr]; + /* swi-a-s-- */ + if (attr[0] == 's') { + if (attr[4] == 'I') { + /* 5 State: (a)ctive, (s)uspended, (I)nvalid snapshot, invalid (S)uspended + * snapshot, snapshot (m)erge failed, suspended snapshot (M)erge + * failed, mapped (d)evice present without tables, mapped device + * present with (i)nactive table, (X) unknown + */ + status = 0; + err = "Invalid snapshot"; + } else { + status = 1; + err = ""; + } + + split_path_and_filename(elt[p_path], &p, &pnl, &f, &fnl); + Mmsg(d, "%s%s", p, elt[p_origin]); + + if ((!arg->device || strcmp(arg->device, d) == 0) || + (elt2 && strcmp(elt2[p_path], d) == 0)) + { + /* On LVM, the name is LV_SnapshotName, we can strip the LV_ if we find it */ + Mmsg(p, "%s_", d); /* /dev/mapper/vg_ssd/test_ */ + if (strncmp(p, elt[p_path], strlen(p)) == 0) { + pm_strcpy(f, elt[p_path] + strlen(p));/* test_MySnapshot_2020.. => MySnapshot_2020 */ + } + + printf("volume=\"%s\" device=\"%s\" name=\"%s\" createdate=\"%s\" size=\"%s\" " + "status=%d error=\"%s\" type=lvm\n", + elt[p_path], d, f, elt[p_time], elt[p_size], status, err); + } + } + } + free_pool_memory(p); + free_pool_memory(f); + free_pool_memory(d); + return true; + }; +}; + +/* The simulator is using a simple symlink */ +class simulator: public snapshot { +public: + simulator(arguments *arg): snapshot(arg, "simulator") {}; + + int mount() { + if (!snapshot::mount()) { + return 0; + } + split_path_and_filename(arg->volume, &path, &pnl, &fname, &fnl); + printf("status=1 snapmountpoint=\"%s\" snapdirectory=\"%s\"\n", + arg->volume, path); + return 1; + }; + + int unmount() { + printf("status=1\n"); + return 1; + }; + + int support() { + if (!snapshot::support()) { + return 0; + } + if (access(arg->mountpoint, W_OK) != 0) { + printf("status=0 device=\"%s\" type=simulator " + "error=\"Unable to access mountpoint\"\n", + arg->mountpoint); + return 0; + } + printf("status=1 device=\"%s\" type=simulator\n", arg->mountpoint); + return 1; + }; + + int create() { + char ed1[50]; + utime_t now; + + if (!snapshot::create()) { + return 0; + } + Mmsg(path, "%s/%s", arg->mountpoint, arg->snapdir); + makedir(path); + now = time(NULL); + Mmsg(cmd, "ln -vsf \"%s\" \"%s\"", arg->mountpoint, path); + if (run_program(cmd, 60, errmsg)) { + Dmsg(10, "Unable to create symlink. ERR=%s\n", errmsg); + strip_quotes(errmsg); + printf("status=%d error=\"Unable to umount the device %s\"\n", + get_error_code(), + errmsg); + } + printf("status=1 volume=\"%s\" createtdate=%s type=simulator\n", + path, edit_uint64(now, ed1)); + return 1; + }; + + int del() { + int ret; + if (!snapshot::del()) { + return 0; + } + ret = unlink(arg->volume); + printf("status=%d\n", (ret == 0)? 1 : 0); + return 1; + }; +}; + +snapshot *detect_snapshot_backend(arguments *arg) +{ + if (arg->type) { + if (strcasecmp(arg->type, "btrfs") == 0) { + return new btrfs(arg); + + } else if (strcasecmp(arg->type, "lvm") == 0) { + return new lvm(arg); + + } else if (strcasecmp(arg->type, "simulator") == 0) { + return new simulator(arg); + + } else if (strcasecmp(arg->type, "zfs") == 0) { + return new zfs(arg); + } + } + if (arg->fstype) { + if (strcasecmp(arg->fstype, "btrfs") == 0) { + return new btrfs(arg); + + } else if (strcasecmp(arg->fstype, "tmpfs") == 0) { + return new simulator(arg); + + /* TODO: Need to find something smarter here */ + } else if (strcasecmp(arg->fstype, "ext4") == 0) { + return new lvm(arg); + + } else if (strcasecmp(arg->fstype, "xfs") == 0) { + return new lvm(arg); + + } else if (strcasecmp(arg->fstype, "ext3") == 0) { + return new lvm(arg); + + } else if (strcasecmp(arg->fstype, "zfs") == 0 || + strcasecmp(arg->fstype, "fuse.zfs") == 0) + { + return new zfs(arg); + } + } + Dmsg(10, "Backend not found\n"); + return NULL; +} + +/* defined in jcr.c */ +void create_jcr_key(); + +int main(int argc, char **argv) +{ + snapshot *snap; + arguments arg; + char ch; + int ret=0; + struct stat sp; + + set_trace_file("/dev/null"); + setlocale(LC_ALL, ""); + setenv("LANG", "C", true); + bindtextdomain("bacula", LOCALEDIR); + textdomain("bacula"); + lmgr_init_thread(); + OSDependentInit(); + init_stack_dump(); + my_name_is(argc, argv, "bsnapshot"); + create_jcr_key(); + + while ((ch = getopt(argc, argv, "?d:vc:so:V:T:t")) != -1) { + switch (ch) { + case 'd': /* set debug level */ + debug_level = atoi(optarg); + if (debug_level <= 0) { + debug_level = 1; + } + break; + + case 'v': + arg.verbose++; + break; + + case 's': /* use sudo */ + arg.sudo = "sudo "; + break; + + case 'c': /* config file */ + pm_strcpy(arg.config_file, optarg); + if (stat(optarg, &sp) < 0) { + Pmsg(000, "Unable to access %s. ERR=%s\n",optarg, strerror(errno)); + usage(_("Unable to open -p argument for reading")); + } + break; + + case 'o': /* where to send the debug output */ + set_trace_file(optarg); + break; + + case 't': + arg.action = (char *)"check"; + break; + + case 'V': /* set volume name */ + arg.volume = optarg; + break; + + case 'T': /* device type */ + arg.type = optarg; + break; + default: + usage(); + } + } + + argc -= optind; + argv += optind; + + if (!arg.validate()) { + usage(); + } + + if (arg.disabled) { + Dmsg(10, "disabled from config file\n"); + exit (1); + } + + snap = detect_snapshot_backend(&arg); + + if (!snap) { + printf("status=0 error=\"Unable to detect snapshot backend\""); + exit(0); + } + + start_watchdog(); + + if (strcasecmp(arg.action, "mount") == 0) { + ret = snap->mount(); + + } else if (strcasecmp(arg.action, "support") == 0) { + ret = snap->support(); + + } else if (strcasecmp(arg.action, "create") == 0) { + ret = snap->create(); + + } else if (strcasecmp(arg.action, "delete") == 0) { + ret = snap->del(); + + } else if (strcasecmp(arg.action, "subvolumes") == 0) { + ret = snap->subvolumes(); + + } else if (strcasecmp(arg.action, "list") == 0) { + ret = snap->list(); + + } else if (strcasecmp(arg.action, "check") == 0) { + ret = snap->check(); + + } else if (strcasecmp(arg.action, "unmount") == 0) { + ret = snap->unmount(); + } + + delete snap; + stop_watchdog(); + close_memory_pool(); + lmgr_cleanup_main(); + + Dmsg(10, "exit code = %d\n", (ret == 1) ? 0 : 1); + return (ret == 1)? 0 : 1; +} diff --git a/bacula/src/tools/bvfs_test.c b/bacula/src/tools/bvfs_test.c index 1f93e07fae..b2a7ed04ee 100644 --- a/bacula/src/tools/bvfs_test.c +++ b/bacula/src/tools/bvfs_test.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2009-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -24,12 +28,11 @@ #include "bacula.h" #include "cats/cats.h" -#include "cats/sql_glue.h" #include "cats/bvfs.h" #include "findlib/find.h" - + /* Local variables */ -static B_DB *db; +static BDB *db; static const char *file = "COPYRIGHT"; static DBId_t fnid=0; static const char *db_name = "regress"; @@ -41,7 +44,7 @@ static void usage() { fprintf(stderr, _( PROG_COPYRIGHT -"\nVersion: %s (%s)\n" +"\n%sVersion: %s (%s)\n" " -d set debug level to \n" " -dt print timestamp in debug output\n" " -n specify the database name (default bacula)\n" @@ -55,7 +58,7 @@ PROG_COPYRIGHT " -l maximum tuple to fetch\n" " -T truncate cache table before starting\n" " -v verbose\n" -" -? print this message\n\n"), 2001, VERSION, BDATE); +" -? print this message\n\n"), 2001, "", VERSION, BDATE); exit(1); } @@ -73,13 +76,13 @@ static int result_handler(void *ctx, int fields, char **row) /* display clean stuffs */ if (bvfs_is_dir(row)) { - pm_strcpy(attr->ofname, bvfs_basename_dir(row[BVFS_Name])); + pm_strcpy(attr->ofname, bvfs_basename_dir(row[BVFS_Name])); } else { /* if we see the requested file, note his filenameid */ if (bstrcmp(row[BVFS_Name], file)) { fnid = str_to_int64(row[BVFS_FilenameId]); } - pm_strcpy(attr->ofname, row[BVFS_Name]); + pm_strcpy(attr->ofname, row[BVFS_Name]); } print_ls_output(vfs->get_jcr(), attr); @@ -110,7 +113,7 @@ int main (int argc, char *argv[]) init_stack_dump(); Dmsg0(0, "Starting bvfs_test tool\n"); - + my_name_is(argc, argv, "bvfs_test"); init_msg(NULL, NULL); @@ -197,12 +200,12 @@ int main (int argc, char *argv[]) bjcr->client_name = get_pool_memory(PM_FNAME); pm_strcpy(bjcr->client_name, "Dummy.Client.Name"); bstrncpy(bjcr->Job, "bvfs_test", sizeof(bjcr->Job)); - + if ((db = db_init_database(NULL, NULL, db_name, db_user, db_password, db_host, 0, NULL, false, false)) == NULL) { Emsg0(M_ERROR_TERM, 0, _("Could not init Bacula database\n")); } - Dmsg1(0, "db_type=%s\n", db_get_type(db)); + Dmsg1(0, "db_type=%s\n", db_get_engine_name(db)); if (!db_open_database(NULL, db)) { Emsg0(M_ERROR_TERM, 0, db_strerror(db)); @@ -211,7 +214,7 @@ int main (int argc, char *argv[]) if (verbose) { Pmsg2(000, _("Using Database: %s, User: %s\n"), db_name, db_user); } - + bjcr->db = db; if (clean) { @@ -247,7 +250,7 @@ int main (int argc, char *argv[]) exit (0); } - + Pmsg0(0, "list /\n"); fs.ch_dir("/"); fs.ls_special_dirs(); diff --git a/bacula/src/tools/bwild.c b/bacula/src/tools/bwild.c index ca5dd66c3d..e523d3f5a6 100644 --- a/bacula/src/tools/bwild.c +++ b/bacula/src/tools/bwild.c @@ -1,24 +1,28 @@ /* - * Test program for testing wild card expressions - * - * Kern Sibbald, MMVI - * - */ -/* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2006-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ +/* + * Test program for testing wild card expressions + * + * Kern Sibbald, MMVI + * + */ #include "bacula.h" #include "lib/fnmatch.h" @@ -49,7 +53,7 @@ int main(int argc, char *const *argv) int lineno; bool no_linenos = false; int ic = 0; - + setlocale(LC_ALL, ""); bindtextdomain("bacula", LOCALEDIR); diff --git a/bacula/src/tools/cats_test.c b/bacula/src/tools/cats_test.c index 9e350766a0..f204aa0cf0 100644 --- a/bacula/src/tools/cats_test.c +++ b/bacula/src/tools/cats_test.c @@ -1,34 +1,36 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2011-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Program to test CATS DB routines * - * + * */ #define _BDB_PRIV_INTERFACE_ #include "bacula.h" #include "cats/cats.h" -#include "cats/bdb_priv.h" -#include "cats/sql_glue.h" #include "cats/bvfs.h" #include "findlib/find.h" - + /* Local variables */ -static B_DB *db; +static BDB *db; static const char *file = "COPYRIGHT"; //static DBId_t fnid=0; static const char *db_name = "bacula"; @@ -45,7 +47,7 @@ static void usage() { fprintf(stderr, _( PROG_COPYRIGHT -"\nVersion: %s (%s)\n" +"\n%sVersion: %s (%s)\n" " -d set debug level to \n" " -dt print timestamp in debug output\n" " -n specify the database name (default bacula)\n" @@ -58,7 +60,7 @@ PROG_COPYRIGHT " -l maximum tuple to fetch\n" " -q print only errors\n" " -v verbose\n" -" -? print this message\n\n"), 2011, VERSION, BDATE); +" -? print this message\n\n"), 2011, BDEMO, VERSION, BDATE); exit(1); } @@ -151,7 +153,7 @@ static void cmp_client(CLIENT_DBR &cr, CLIENT_DBR &cr2) ok(!strcmp(cr2.Name, cr.Name), " Check Client Name"); ok(!strcmp(cr2.Uname, cr.Uname), " Check Client Uname"); ok(cr.AutoPrune == cr2.AutoPrune, " Check Client Autoprune"); - ok(cr.JobRetention == cr2.JobRetention, " Check Client JobRetention"); + ok(cr.JobRetention == cr2.JobRetention, " Check Client JobRetention"); ok(cr.FileRetention == cr2.FileRetention," Check Client FileRetention"); } @@ -227,7 +229,7 @@ int main (int argc, char *argv[]) pid = getpid(); Pmsg0(0, "Starting cats_test tool" PLINE); - + my_name_is(argc, argv, ""); init_msg(NULL, NULL); @@ -334,7 +336,7 @@ int main (int argc, char *argv[]) Pmsg1(0, PLINE "Test DB connection \"%s\"" PLINE, db_name); if (full_test) { - db = db_init_database(jcr /* JCR */, + db = db_init_database(jcr /* JCR */, NULL /* dbi driver */, db_name, db_user, db_password, db_address, db_port + 100, NULL /* db_socket */, @@ -348,7 +350,7 @@ int main (int argc, char *argv[]) db_close_database(jcr, db); } - db = db_init_database(jcr /* JCR */, + db = db_init_database(jcr /* JCR */, NULL /* dbi driver */, db_name, db_user, db_password, db_address, db_port, NULL /* db_socket */, @@ -372,9 +374,8 @@ int main (int argc, char *argv[]) /* Check if the SQL library is thread-safe */ - //db_check_backend_thread_safe(); ok(check_tables_version(jcr, db), "Check table version"); - ok(db_sql_query(db, "SELECT VersionId FROM Version", + ok(db_sql_query(db, "SELECT VersionId FROM Version", db_int_handler, &j), "SELECT VersionId"); ok(UPDATE_DB(jcr, db, (char*)"UPDATE Version SET VersionId = 1"), @@ -387,15 +388,15 @@ int main (int argc, char *argv[]) ok(db_check_max_connections(jcr, db, 1), "Test min Max Connexion"); nok(db_check_max_connections(jcr, db, 10000), "Test max Max Connexion"); } - + ok(db_open_batch_connexion(jcr, db), "Opening batch connection"); db_close_database(jcr, jcr->db_batch); jcr->db_batch = NULL; /* ---------------------------------------------------------------- */ - + uint32_t storageid=0; - ok(db_sql_query(db, "SELECT MIN(StorageId) FROM Storage", + ok(db_sql_query(db, "SELECT MIN(StorageId) FROM Storage", db_int_handler, &storageid), "Get StorageId"); ok(storageid > 0, "Check StorageId"); if (!storageid) { @@ -407,7 +408,7 @@ int main (int argc, char *argv[]) Pmsg0(0, PLINE "Doing Basic SQL tests" PLINE); ok(db_sql_query(db, "SELECT 1,2,3,4,5", count_col, &j), "Count 5 rows"); ok(j == 5, "Check number of columns"); - ok(db_sql_query(db, "SELECT 1,2,3,4,5,'a','b','c','d','e'", + ok(db_sql_query(db, "SELECT 1,2,3,4,5,'a','b','c','d','e'", count_col, &j), "Count 10 rows"); ok(j == 10, "Check number of columns"); @@ -415,7 +416,7 @@ int main (int argc, char *argv[]) ok(db_sql_query(db, "SELECT 2", db_int_handler, &j), "Good SELECT query"); ok(db_sql_query(db, "SELECT 1 FROM Media WHERE VolumeName='missing'", db_int_handler, &j), "Good empty SELECT query"); - + db_int64_ctx i64; i64.value = 0; i64.count = 0; ok(db_sql_query(db, "SELECT 1",db_int64_handler, &i64),"db_int64_handler"); @@ -454,10 +455,10 @@ int main (int argc, char *argv[]) Mmsg(buf, "DELETE FROM %s", temp); ok(DELETE_DB(jcr, db, buf), "DELETE query"); nok(DELETE_DB(jcr, db, buf), "Empty DELETE query"); /* TODO bug ? */ - + Mmsg(buf, "DELETE FROM aaa%s", temp); ok(DELETE_DB(jcr, db, buf), "Bad DELETE query"); /* TODO bug ? */ - + Mmsg(buf, "DROP TABLE %s", temp); ok(QUERY_DB(jcr, db, buf), "DROP query"); nok(QUERY_DB(jcr, db, buf), "Empty DROP query"); @@ -471,7 +472,7 @@ int main (int argc, char *argv[]) ok(db_sql_query(db, buf, NULL, NULL), "Inserting quoted string"); /* ---------------------------------------------------------------- */ - Pmsg0(0, PLINE "Doing Job tests" PLINE); + Pmsg0(0, PLINE "Doing Job tests" PLINE); JOB_DBR jr, jr2; memset(&jr, 0, sizeof(jr)); @@ -479,7 +480,7 @@ int main (int argc, char *argv[]) jr.JobId = 1; ok(db_get_job_record(jcr, db, &jr), "Get Job record for JobId=1"); ok(jr.JobFiles > 10, "Check number of files"); - + jr.JobId = (JobId_t)pid; Mmsg(buf, "%s-%lld", jr.Job, pid); strcpy(jr.Job, buf); @@ -554,7 +555,7 @@ int main (int argc, char *argv[]) ok(db_get_client_record(jcr, db, &cr2), "Search client by ClientId"); cmp_client(cr, cr2); - + Pmsg0(0, "Search client by Name\n"); memset(&cr2, 0, sizeof(cr2)); strcpy(cr2.Name, cr.Name); @@ -591,7 +592,7 @@ int main (int argc, char *argv[]) POOL_DBR pr, pr2; memset(&pr, 0, sizeof(pr)); memset(&pr2, 0, sizeof(pr2)); - + bsnprintf(pr.Name, sizeof(pr.Name), "pool-%lld", pid); pr.MaxVols = 10; pr.UseOnce = 0; @@ -610,16 +611,16 @@ int main (int argc, char *argv[]) pr.RecyclePoolId = 0; pr.ScratchPoolId = 0; pr.ActionOnPurge = 1; - + ok(db_create_pool_record(jcr, db, &pr), "db_create_pool_record()"); ok(pr.PoolId > 0, "Check PoolId"); - + pr2.PoolId = pr.PoolId; pr.PoolId = 0; Pmsg0(0, "Search pool by PoolId\n"); nok(db_create_pool_record(jcr, db, &pr),"Can't create pool twice"); - ok(db_get_pool_record(jcr, db, &pr2), "Search pool by PoolId"); + ok(db_get_pool_numvols(jcr, db, &pr2), "Search pool by PoolId"); cmp_pool(pr, pr2); pr2.MaxVols++; @@ -639,7 +640,7 @@ int main (int argc, char *argv[]) ok(db_update_pool_record(jcr, db, &pr2), "Update Pool record"); memset(&pr, 0, sizeof(pr)); pr.PoolId = pr2.PoolId; - ok(db_get_pool_record(jcr, db, &pr), "Search pool by PoolId"); + ok(db_get_pool_numvols(jcr, db, &pr), "Search pool by PoolId"); cmp_pool(pr, pr2); ok(db_delete_pool_record(jcr, db, &pr), "Delete Pool"); @@ -649,11 +650,11 @@ int main (int argc, char *argv[]) /* ---------------------------------------------------------------- */ Pmsg0(0, PLINE "Doing Media tests" PLINE); - + MEDIA_DBR mr, mr2; memset(&mr, 0, sizeof(mr)); memset(&mr2, 0, sizeof(mr2)); - + bsnprintf(mr.VolumeName, sizeof(mr.VolumeName), "media-%lld", pid); bsnprintf(mr.MediaType, sizeof(mr.MediaType), "type-%lld", pid); @@ -688,7 +689,7 @@ int main (int argc, char *argv[]) /* ---------------------------------------------------------------- */ Pmsg0(0, PLINE "Doing ... tests" PLINE); - + db_close_database(jcr, db); report(); free_pool_memory(buf); diff --git a/bacula/src/tools/dbcheck.c b/bacula/src/tools/dbcheck.c index 60f330155c..5d50e2e8cd 100644 --- a/bacula/src/tools/dbcheck.c +++ b/bacula/src/tools/dbcheck.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2002-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * @@ -24,7 +28,6 @@ #include "bacula.h" #include "cats/cats.h" -#include "cats/sql_glue.h" #include "lib/runscript.h" #include "dird/dird_conf.h" @@ -51,7 +54,7 @@ typedef struct s_name_ctx { */ static bool fix = false; static bool batch = false; -static B_DB *db; +static BDB *db; static ID_LIST id_list; static NAME_LIST name_list; static char buf[20000]; @@ -95,6 +98,8 @@ static int check_idx_handler(void *ctx, int num_fields, char **row); static void usage() { fprintf(stderr, +PROG_COPYRIGHT +"\n%sVersion: %s (%s)\n\n" "Usage: dbcheck [-c config ] [-B] [-C catalog name] [-d debug_level] [] []\n" " -b batch mode\n" " -C catalog name in the director conf file\n" @@ -105,7 +110,9 @@ static void usage() " -f fix inconsistencies\n" " -t test if client library is thread-safe\n" " -v verbose\n" -" -? print this message\n\n"); +" -? print this message\n" +"\n", 2002, "", VERSION, BDATE); + exit(1); } @@ -280,7 +287,7 @@ int main (int argc, char *argv[]) * Open database */ db = db_init_database(NULL, NULL, db_name, user, password, dbhost, dbport, NULL, false, false); - if (!db_open_database(NULL, db)) { + if (!db || !db_open_database(NULL, db)) { Emsg1(M_FATAL, 0, "%s", db_strerror(db)); return 1; } @@ -313,7 +320,7 @@ int main (int argc, char *argv[]) */ drop_tmp_idx("idxPIchk", "File"); - db_close_database(NULL, db); + if (db) db_close_database(NULL, db); close_msg(NULL); term_msg(); lmgr_cleanup_main(); @@ -325,7 +332,7 @@ static void print_catalog_details(CAT *catalog, const char *working_dir) POOLMEM *catalog_details = get_pool_memory(PM_MESSAGE); /* - * Instantiate a B_DB class and see what db_type gets assigned to it. + * Instantiate a BDB class and see what db_type gets assigned to it. */ db = db_init_database(NULL, catalog->db_driver, catalog->db_name, catalog->db_user, catalog->db_password, catalog->db_address, @@ -334,7 +341,7 @@ static void print_catalog_details(CAT *catalog, const char *working_dir) catalog->disable_batch_insert); if (db) { printf("%sdb_type=%s\nworking_dir=%s\n", catalog->display(catalog_details), - db->db_get_type(), working_directory); + db_get_engine_name(db), working_directory); db_close_database(NULL, db); } free_pool_memory(catalog_details); @@ -741,7 +748,7 @@ static void eliminate_duplicate_paths() /* * Get all the Ids of each name */ - db_escape_string(NULL, db, esc_name, name_list.name[i], strlen(name_list.name[i])); + db_escape_string(NULL, db, esc_name, name_list.name[i], strlen(name_list.name[i])); bsnprintf(buf, sizeof(buf), "SELECT PathId FROM Path WHERE Path='%s'", esc_name); if (verbose > 1) { printf("%s\n", buf); @@ -866,9 +873,9 @@ static void eliminate_orphaned_path_records() { db_int64_ctx lctx; lctx.count=0; - db_sql_query(db, "SELECT 1 FROM Job WHERE HasCache=1 LIMIT 1", + db_sql_query(db, "SELECT 1 FROM Job WHERE HasCache=1 LIMIT 1", db_int64_handler, &lctx); - + if (lctx.count == 1) { printf(_("Pruning orphaned Path entries isn't possible when using BVFS.\n")); return; @@ -1294,7 +1301,7 @@ static void repair_bad_paths() * Add trailing slash */ len = pm_strcat(&name, "/"); - db_escape_string(NULL, db, esc_name, name, len); + db_escape_string(NULL, db, esc_name, name, len); bsnprintf(buf, sizeof(buf), "UPDATE Path SET Path='%s' WHERE PathId=%s", esc_name, edit_int64(id_list.Id[i], ed1)); if (verbose > 1) { diff --git a/bacula/src/tools/drivetype.c b/bacula/src/tools/drivetype.c index da061f1693..f62f3f0c89 100644 --- a/bacula/src/tools/drivetype.c +++ b/bacula/src/tools/drivetype.c @@ -1,24 +1,27 @@ /* - * Program for determining drive type - * - * Written by Robert Nelson, June 2006 - * - */ -/* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2006-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ +/* + * Program for determining drive type + * + * Written by Robert Nelson, June 2006 + */ #include "bacula.h" #include "findlib/find.h" @@ -99,7 +102,7 @@ main (int argc, char *const *argv) argv += optind; OSDependentInit(); - + if (argc < 1 && display_all) { /* Try all letters */ for (drive = 'A'; drive <= 'Z'; drive++) { diff --git a/bacula/src/tools/fstype.c b/bacula/src/tools/fstype.c index 3e2e3150a6..150afe65e2 100644 --- a/bacula/src/tools/fstype.c +++ b/bacula/src/tools/fstype.c @@ -1,30 +1,30 @@ /* - * Program for determining file system type - * - * Written by Preben 'Peppe' Guldberg, December MMIV - * - * Version $Id$ - * - */ -/* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2004-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ +/* + * Program for determining file system type + * + * Written by Preben 'Peppe' Guldberg, December MMIV + */ #include "bacula.h" #include "findlib/find.h" -#include "lib/mntent_cache.h" static void usage() { @@ -32,22 +32,70 @@ static void usage() "\n" "Usage: fstype [-v] path ...\n" "\n" -" Print the file system type a given file/directory is on.\n" +" Print the file system type for each file/directory argument given.\n" " The following options are supported:\n" "\n" -" -v print both path and file system type.\n" +" -l print all file system types in mtab.\n" +" -m print full entries in mtab.\n" +" -v print both path and file system type of each argument.\n" " -? print this message.\n" "\n")); exit(1); } +struct mtab_item { + rblink link; + uint64_t dev; + char fstype[1]; +}; + +/* Compare two device types */ +static int compare_mtab_items(void *item1, void *item2) +{ + mtab_item *mtab1, *mtab2; + mtab1 = (mtab_item *)item1; + mtab2 = (mtab_item *)item2; + if (mtab1->dev < mtab2->dev) return -1; + if (mtab1->dev > mtab2->dev) return 1; + return 0; +} + +void print_mtab_item(void *user_ctx, struct stat *st, const char *fstype, + const char *mountpoint, const char *mntopts, + const char *fsname) +{ + fprintf(stderr, "dev=%p fstype=%s mountpoint=%s mntopts=%s\n", + ((void *)st->st_dev), fstype, mountpoint, mntopts); +} -int -main (int argc, char *const *argv) +void add_mtab_item(void *user_ctx, struct stat *st, const char *fstype, + const char *mountpoint, const char *mntopts, + const char *fsname) +{ + rblist *mtab_list = (rblist *)user_ctx; + mtab_item *item, *ritem; + int len = strlen(fstype) + 1; + + item = (mtab_item *)malloc(sizeof(mtab_item) + len); + item->dev = (uint64_t)st->st_dev; + bstrncpy(item->fstype, fstype, len); + //fprintf(stderr, "Add dev=%lx fstype=%s\n", item->dev, item->fstype); + ritem = (mtab_item *)mtab_list->insert((void *)item, compare_mtab_items); + if (ritem != item) { + fprintf(stderr, "Problem!! Returned item not equal added item\n"); + } + //fprintf(stderr, "dev=%p fstype=%s mountpoint=%s mntopts=%s\n", + // ((void *)st->st_dev), fstype, mountpoint, mntopts); +} + + +int main (int argc, char *const *argv) { char fs[1000]; - int verbose = 0; + bool verbose = false; + bool list = false; + bool mtab = false; int status = 0; int ch, i; @@ -55,10 +103,16 @@ main (int argc, char *const *argv) bindtextdomain("bacula", LOCALEDIR); textdomain("bacula"); - while ((ch = getopt(argc, argv, "v?")) != -1) { + while ((ch = getopt(argc, argv, "lmv?")) != -1) { switch (ch) { + case 'l': + list = true; + break; + case 'm': + mtab = true; /* list mtab */ + break; case 'v': - verbose = 1; + verbose = true; break; case '?': default: @@ -69,26 +123,51 @@ main (int argc, char *const *argv) argc -= optind; argv += optind; - if (argc < 1) { - usage(); - } OSDependentInit(); + if (mtab) { + read_mtab(print_mtab_item, NULL); + status = 1; + goto get_out; + } + if (list) { + rblist *mtab_list; + mtab_item *item; + mtab_list = New(rblist()); + read_mtab(add_mtab_item, mtab_list); + fprintf(stderr, "Size of mtab=%d\n", mtab_list->size()); + foreach_rblist(item, mtab_list) { + fprintf(stderr, "Found dev=%lx fstype=%s\n", item->dev, item->fstype); + } + delete mtab_list; + goto get_out; + } + + if (argc < 1) { + usage(); + } for (i = 0; i < argc; --argc, ++argv) { - if (fstype(*argv, fs, sizeof(fs))) { + FF_PKT ff_pkt; + memset(&ff_pkt, 0, sizeof(ff_pkt)); + ff_pkt.fname = ff_pkt.link = *argv; + if (lstat(ff_pkt.fname, &ff_pkt.statp) != 0) { + fprintf(stderr, "lstat of %s failed.\n", ff_pkt.fname); + status = 1; + break; + } + if (fstype(&ff_pkt, fs, sizeof(fs))) { if (verbose) { printf("%s: %s\n", *argv, fs); } else { puts(fs); } } else { - fprintf(stderr, _("%s: unknown\n"), *argv); + fprintf(stderr, _("%s: unknown file system type\n"), *argv); status = 1; } } - flush_mntent_cache(); - +get_out: exit(status); } diff --git a/bacula/src/tools/testfind.c b/bacula/src/tools/testfind.c index d19a82a852..bcd67a514d 100644 --- a/bacula/src/tools/testfind.c +++ b/bacula/src/tools/testfind.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Test program for find files @@ -23,7 +27,6 @@ #include "bacula.h" #include "dird/dird.h" #include "findlib/find.h" -#include "lib/mntent_cache.h" #include "ch.h" #if defined(HAVE_WIN32) @@ -144,7 +147,7 @@ main (int argc, char *const *argv) FILESET *var; fprintf(stderr, "Valid FileSets:\n"); - + foreach_res(var, R_FILESET) { fprintf(stderr, " %s\n", var->hdr.name); } @@ -153,7 +156,7 @@ main (int argc, char *const *argv) } ff = init_find_files(); - + copy_fileset(ff, jcr); find_files(jcr, ff, print_file, NULL); @@ -164,7 +167,7 @@ main (int argc, char *const *argv) free(config); config = NULL; } - + term_last_jobs_list(); /* Clean up fileset */ @@ -229,8 +232,6 @@ main (int argc, char *const *argv) num_files, max_file_len, max_path_len, trunc_fname, trunc_path, hard_links); - flush_mntent_cache(); - term_msg(); close_memory_pool(); @@ -239,7 +240,7 @@ main (int argc, char *const *argv) exit(0); } -static int print_file(JCR *jcr, FF_PKT *ff, bool top_level) +static int print_file(JCR *jcr, FF_PKT *ff, bool top_level) { switch (ff->type) { diff --git a/bacula/src/tools/testls.c b/bacula/src/tools/testls.c index ebf1bb3adc..65fa99a0cb 100644 --- a/bacula/src/tools/testls.c +++ b/bacula/src/tools/testls.c @@ -1,17 +1,21 @@ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution + Copyright (C) 2000-2015 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. + This notice must be preserved when any source code is + conveyed and/or propagated. + + Bacula(R) is a registered trademark of Kern Sibbald. */ /* * Test program for listing files during regression testing @@ -184,7 +188,7 @@ static int count_files(JCR *jcr, FF_PKT *ff, bool top_level) return 1; } -static int print_file(JCR *jcr, FF_PKT *ff, bool top_level) +static int print_file(JCR *jcr, FF_PKT *ff, bool top_level) { switch (ff->type) { diff --git a/bacula/src/tools/timelimit.c b/bacula/src/tools/timelimit.c index c337a18251..d1f03fd514 100644 --- a/bacula/src/tools/timelimit.c +++ b/bacula/src/tools/timelimit.c @@ -25,6 +25,8 @@ */ +#include "../config.h" + /* we hope all OS's have those..*/ #include #include @@ -68,11 +70,15 @@ #endif /* HAVE_SYSEXITS_H */ #ifndef __unused -#ifdef __GNUC__ -#define __unused __attribute__((unused)) -#else /* __GNUC__ */ -#define __unused -#endif /* __GNUC__ */ +# ifdef __GNUC__ +# if GCC_VERSION >= 3004 +# define __unused __attribute__((unused)) +# else +# define __unused +# endif +# else /* __GNUC__ */ +# define __unused +# endif /* __GNUC__ */ #endif /* __unused */ #ifndef __dead2 diff --git a/bacula/src/version.h b/bacula/src/version.h index 80829b1f36..f05b5aabb5 100644 --- a/bacula/src/version.h +++ b/bacula/src/version.h @@ -1,55 +1,49 @@ - +#ifndef VERSION_H +#define VERSION_H #undef VERSION -#define VERSION "7.0.6" -#define BDATE "21 November 2014" -#define LSMDATE "21Nov14" -#define PROG_COPYRIGHT "Copyright (C) %d-2014 Free Software Foundation Europe e.V.\n" -#define BYEAR "2014" /* year for copyright messages in progs */ +#define COMMUNITY 1 /* Define to create a Windows community binary */ -/* - * Versions of packages needed to build Bacula components - */ -#define DEPKGS_QT_VERSION "01Jan13" -#define DEPKGS_VERSION "29Feb12" -#define BQT4_VERSION "4.8.4" +/* Note: there can be only *one* VERSION in this file */ +#define VERSION "7.2.0" +#define BDATE "12 August 2015" +#define LSMDATE "02Aug15" + +#define RELEASE 1 /* Use ONLY in rpms */ +#define PROG_COPYRIGHT "Copyright (C) %d-2015 Kern Sibbald.\n" +#define BYEAR "2015" /* year for copyright messages in progs */ /* - Bacula® - The Network Backup Solution + Bacula(R) - The Network Backup Solution - Copyright (C) 2000-2014 Free Software Foundation Europe e.V. + Copyright (C) 2000-2015 Kern Sibbald + Copyright (C) 2000-2015 Free Software Foundation Europe e.V. - The main author of Bacula is Kern Sibbald, with contributions from many - others, a complete list can be found in the file AUTHORS. + The original author of Bacula is Kern Sibbald, with contributions + from many others, a complete list can be found in the file AUTHORS. You may use this file and others of this release according to the license defined in the LICENSE file, which includes the Affero General Public License, v3.0 ("AGPLv3") and some additional permissions and terms pursuant to its AGPLv3 Section 7. - Bacula® is a registered trademark of Kern Sibbald. -*/ - -/* Shared object library versions */ - -/* Uncomment to overwrite default value from VERSION */ -/* #define LIBBAC_LT_RELEASE "5.1.0" */ -/* #define LIBBACCFG_LT_RELEASE "5.1.0" */ -/* #define LIBBACPY_LT_RELEASE "5.1.0" */ -/* #define LIBBACSQL_LT_RELEASE "5.1.0" */ -/* #define LIBBACCATS_LT_RELEASE "5.1.0" */ -/* #define LIBBACFIND_LT_RELEASE "5.1.0" */ + This notice must be preserved when any source code is + conveyed and/or propagated. + Bacula(R) is a registered trademark of Kern Sibbald. +*/ /* Debug flags */ #undef DEBUG #define DEBUG 1 #define TRACEBACK 1 #define TRACE_FILE 1 +#define ENTER_LEAVE 1 +//#define FORCE_ALIGNED 1 /* If this is set stdout will not be closed on startup */ -/* #define DEVELOPER 1 */ +#define DEVELOPER 1 /* adjust DEVELOPER_MODE for status command */ #ifdef DEVELOPER @@ -67,6 +61,8 @@ # define SMCHECK #endif +#define BEEF 0 + /* * _USE_LOCKMGR does lock/unlock mutex tracking (dead lock) * it can always be turned on, but we advise to use it only @@ -119,7 +115,7 @@ * for more safety, but is 30 times slower than above */ #define SQLITE3_INIT_QUERY "PRAGMA synchronous = NORMAL" - + /* * This should always be on. It enables data encryption code * providing it is configured. @@ -140,7 +136,6 @@ /* #define DEBUG_MEMSET 1 */ /* #define DEBUG_MUTEX 1 */ /* #define DEBUG_BLOCK_CHECKSUM 1 */ -#define BEEF 0 /* * Set SMALLOC_SANITY_CHECK to zero to turn off, otherwise @@ -190,3 +185,5 @@ * eliminate the comm time sending to the SD. */ /* #define FD_NO_SEND_TEST 1 */ + +#endif /* VERSION_H */ diff --git a/bacula/updatedb/update_bacula_tables.in b/bacula/updatedb/update_bacula_tables.in new file mode 100755 index 0000000000..1249077f96 --- /dev/null +++ b/bacula/updatedb/update_bacula_tables.in @@ -0,0 +1,50 @@ +#!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# +# This routine alters the appropriately configured +# Bacula tables for PostgreSQL, Ingres, MySQL, or SQLite. +# + +# can be used to change the current user with su +pre_command="sh -c" + +default_db_type=@DEFAULT_DB_TYPE@ + +# +# See if the first argument is a valid backend name. +# If so the user overrides the default database backend. +# +if [ $# -gt 0 ]; then + case $1 in + sqlite3) + db_type=$1 + shift + ;; + mysql) + db_type=$1 + shift + ;; + postgresql) + db_type=$1 + shift + ;; + *) + ;; + esac +fi + +# +# If no new db_type is gives use the default db_type. +# +if [ -z "${db_type}" ]; then + db_type="${default_db_type}" +fi + +if [ $db_type = postgresql -a "$UID" = 0 ]; then + pre_command="su - postgres -c" +fi + +echo "Altering ${db_type} tables" +$pre_command "@scriptdir@/update_${db_type}_tables $*" diff --git a/bacula/updatedb/update_bdb_tables_8_to_9 b/bacula/updatedb/update_bdb_tables_8_to_9 deleted file mode 100755 index 833f9d9c93..0000000000 --- a/bacula/updatedb/update_bdb_tables_8_to_9 +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -# -# Shell script to update bdb tables -# Nothing to do here. -# -echo " " -bindir=/usr/bin - -exit 0 diff --git a/bacula/updatedb/update_mysql_tables.in b/bacula/updatedb/update_mysql_tables.in new file mode 100644 index 0000000000..a80001108f --- /dev/null +++ b/bacula/updatedb/update_mysql_tables.in @@ -0,0 +1,149 @@ +#!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# +# Shell script to update MySQL tables from Bacula Community version +# 5.0.x, 5.2.x, 7.0.x +# +echo " " +echo "This script will update a Bacula MySQL database from version 12-14 to 15" +echo " " +echo "Depending on the current version of your catalog, you may have to run this script" +echo " multiple times" +echo " " + +bindir=@MYSQL_BINDIR@ +PATH="$bindir:$PATH" +db_name=@db_name@ + +ARGS=$* + +getVersion() +{ + mysql $ARGS -D ${db_name} -e "select VersionId from Version LIMIT 1\G" >/tmp/$$ + DBVERSION=`sed -n -e 's/^VersionId: \(.*\)$/\1/p' /tmp/$$` +} + +getVersion + +if [ "x$DBVERSION" = x ]; then + echo + echo "Unable to detect database version, you can specify connection information" + echo "on the command line." + echo "Error. Cannot upgrade this database." + exit 1 +fi + +if [ "$DBVERSION" -lt 12 -o "$DBVERSION" -gt 14 ] ; then + echo " " + echo "The existing database is version $DBVERSION !!" + echo "This script can only update an existing version 12-14 version 15." + echo "Error. Cannot upgrade this database." + echo " " + exit 1 +fi + +# For all versions, we need to create the Index on Media(StorageId) +# It may fail, but it's not a big problem +# mysql $* -f </dev/null 2> /dev/null +# CREATE INDEX media_storageid_idx ON Media (StorageId); +# END-OF-DATA + +if [ "$DBVERSION" -eq 12 ] ; then + if mysql $* -f </tmp/$$ +mysql $* -D ${db_name} -e "select VersionId from Version\G" >/tmp/$$ DBVERSION=`sed -n -e 's/^VersionId: \(.*\)$/\1/p' /tmp/$$` if [ $DBVERSION != 11 ] ; then echo " " @@ -21,7 +24,9 @@ if [ $DBVERSION != 11 ] ; then exit 1 fi -if mysql -D ${db_name} $* -f </tmp/$$ +DBVERSION=`sed -n -e 's/^VersionId: \(.*\)$/\1/p' /tmp/$$` +if [ $DBVERSION != 12 ] ; then + echo " " + echo "The existing database is version $DBVERSION !!" + echo "This script can only update an existing version 12 database to version 13." + echo "Error. Cannot upgrade this database." + echo " " + exit 1 +fi + +if mysql $* -f </tmp/$$ -DBVERSION=`sed -n -e 's/^VersionId: \(.*\)$/\1/p' /tmp/$$` -if [ $DBVERSION != 12 ] ; then - echo " " - echo "The existing database is version $DBVERSION !!" - echo "This script can only update an existing version 12 database to version 14." - echo "Error. Cannot upgrade this database." - echo " " - exit 1 -fi - -if mysql -D ${db_name} $* -f </tmp/$$ +DBVERSION=`sed -n -e 's/^VersionId: \(.*\)$/\1/p' /tmp/$$` +if [ $DBVERSION != 13 ] ; then + echo " " + echo "The existing database is version $DBVERSION !!" + echo "This script can only update an existing version 13 database to version 14." + echo "Error. Cannot upgrade this database." + echo " " + exit 1 +fi + +if mysql $* -f <test.out -hostname >>test.out -echo " " >>test.out +git status >>test.out 2>&1 cat build/config.out >>test.out echo " " >>test.out echo "Test results" >>test.out @@ -18,6 +22,6 @@ echo " " echo "End do_all tests" echo "End do_all tests" >>test.out scripts/cleanup -hostname >>test.out cat test.out ./endtime +date diff --git a/regress/do_dev b/regress/do_dev index 5c928531f9..292f0907db 100755 --- a/regress/do_dev +++ b/regress/do_dev @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Relatively small quick regression for developers to test # before committing diff --git a/regress/do_disk b/regress/do_disk index 9bb975f79b..2cbd12aa40 100755 --- a/regress/do_disk +++ b/regress/do_disk @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + nice make setup echo " " >test.out cat build/config.out >>test.out diff --git a/regress/do_disk_no_setup b/regress/do_disk_no_setup index ec8a9bddb1..a90dca0395 100755 --- a/regress/do_disk_no_setup +++ b/regress/do_disk_no_setup @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + echo " " >test.out cat build/config.out >>test.out echo " " >>test.out diff --git a/regress/do_tape b/regress/do_tape index e8f2a94a20..e695c9c2a4 100755 --- a/regress/do_tape +++ b/regress/do_tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # /home/kern/bacula/bin/startmysql nice make setup echo " " >test.out diff --git a/regress/endtime b/regress/endtime index 0502fec376..66fd57bcb0 100755 --- a/regress/endtime +++ b/regress/endtime @@ -1,4 +1,8 @@ #!/usr/bin/env python +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# from time import time as now t = now() diff --git a/regress/experimental-all b/regress/experimental-all index bf4a41dbc3..743035b59c 100755 --- a/regress/experimental-all +++ b/regress/experimental-all @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # test only the disk based regression scripts # diff --git a/regress/experimental-disk b/regress/experimental-disk index 39476df9de..9590e9e780 100755 --- a/regress/experimental-disk +++ b/regress/experimental-disk @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # test only the disk based regression scripts # diff --git a/regress/experimental-disk-and-tape b/regress/experimental-disk-and-tape index b1bd2a0f77..5d8739eea4 100755 --- a/regress/experimental-disk-and-tape +++ b/regress/experimental-disk-and-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # test only the disk based regression scripts # diff --git a/regress/experimental-tape b/regress/experimental-tape index c12edf4d7e..618d3701fc 100755 --- a/regress/experimental-tape +++ b/regress/experimental-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # test only the disk based regression scripts # diff --git a/regress/freebsd.conf b/regress/freebsd.conf new file mode 100644 index 0000000000..7b8c2c37a5 --- /dev/null +++ b/regress/freebsd.conf @@ -0,0 +1,42 @@ +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# +# Where to get the source to be tested +# BACULA_SOURCE="${HOME}/bacula/branch-1.36.2" +BACULA_SOURCE="${HOME}/bacula/k" + +# Where to send email !!!!! Change me !!!!!!! +EMAIL=xxxx@domain.com +SMTP_HOST="machine.domain.com" + +# Full "default" path where to find sqlite (no quotes!) +SQLITE3_DIR=${HOME}/bacula/depkgs/sqlite3 +SQLITE_DIR=${HOME}/bacula/depkgs/sqlite + +TAPE_DRIVE="/dev/nsa0" +# if you don't have an autochanger set AUTOCHANGER to /dev/null +AUTOCHANGER="/dev/sg0" +# For two drive tests -- set to /dev/null if you do not have it +TAPE_DRIVE1="/dev/null" + +# This must be the path to the autochanger including its name +AUTOCHANGER_PATH="/usr/local/sbin/mtx" + +# Set your database here +#WHICHDB="--with-sqlite=${SQLITE_DIR}" +#WHICHDB="--with-sqlite3=${SQLITE3_DIR}" +WHICHDB="--with-mysql" +#WHICHDB="--with-postgresql" + +# Set this to "--with-tcp-wrappers" or "--without-tcp-wrappers" +TCPWRAPPERS="--with-tcp-wrappers" + +# Set this to "" to disable OpenSSL support, "--with-openssl=yes" +# to enable it, or provide the path to the OpenSSL installation, +# eg "--with-openssl=/usr/local" +# +# Note, you can also add any other (as many as you want) special +# Bacula configuration options here, such as --disable-batch-insert +# +OPENSSL="" diff --git a/regress/make-ctest-adds b/regress/make-ctest-adds index 67b3ab011b..11becaf3e8 100755 --- a/regress/make-ctest-adds +++ b/regress/make-ctest-adds @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # This script automatically builds the ADD_TEST commands by # searching for them in the old files diff --git a/regress/nightly-all b/regress/nightly-all index 28651ec3e5..28fedae945 100755 --- a/regress/nightly-all +++ b/regress/nightly-all @@ -1,11 +1,15 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # run both the disk and the tape based regression tests. # # Include full output LANG=C echo "Begin nightly-all `date`" -save_debug=${REGRESS_DEBUG} REGRESS_DEBUG=1 export REGRESS_DEBUG rm -rf Testing @@ -27,5 +31,4 @@ while [ $i -le 5 ]; do rtn=$? i=`expr $i + 1` done -REGRESS_DEBUG=${save_debug} echo "End nightly-all `date`" diff --git a/regress/nightly-disk b/regress/nightly-disk index 08bec77003..5229d02d78 100755 --- a/regress/nightly-disk +++ b/regress/nightly-disk @@ -1,16 +1,19 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # test only the disk based regression scripts # # Include full output LANG=C echo "Begin nightly-disk `date`" -save_debug=${REGRESS_DEBUG} REGRESS_DEBUG=1 export REGRESS_DEBUG rm -rf Testing rm -f dumps/* -#git checkout master git pull # # Temp switch to branch Branch-5.0 NB this leaves you on a headless @@ -37,5 +40,4 @@ while [ $i -le 5 ]; do rtn=$? i=`expr $i + 1` done -REGRESS_DEBUG=${save_debug} echo "End nightly-disk `date`" diff --git a/regress/nightly-disk-and-tape b/regress/nightly-disk-and-tape index 9a96c6185a..35907da739 100755 --- a/regress/nightly-disk-and-tape +++ b/regress/nightly-disk-and-tape @@ -1,11 +1,15 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # test only the disk based regression scripts # # Include full output LANG=C echo "Begin nightly-disk-and-tape `date`" -save_debug=${REGRESS_DEBUG} REGRESS_DEBUG=1 export REGRESS_DEBUG rm -rf Testing @@ -27,5 +31,4 @@ while [ $i -le 5 ]; do rtn=$? i=`expr $i + 1` done -REGRESS_DEBUG=${save_debug} echo "End nightly-disk-and-tape `date`" diff --git a/regress/nightly-tape b/regress/nightly-tape index d8a1890a2e..e0624741b0 100755 --- a/regress/nightly-tape +++ b/regress/nightly-tape @@ -1,11 +1,15 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # test only the disk based regression scripts # # Include full output LANG=C echo "Begin nightly-tape `date`" -save_debug=${REGRESS_DEBUG} REGRESS_DEBUG=1 export REGRESS_DEBUG rm -rf Testing @@ -27,5 +31,4 @@ while [ $i -le 5 ]; do rtn=$? i=`expr $i + 1` done -REGRESS_DEBUG=${save_debug} echo "End nightly-tape `date`" diff --git a/regress/prototype.conf b/regress/prototype.conf index 418ac8efc3..a12afa0450 100644 --- a/regress/prototype.conf +++ b/regress/prototype.conf @@ -1,27 +1,46 @@ +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # Set this to the make option (usually -j3 or higher) -MAKEOPT= +MAKEOPT="-j3" +USE_VTAPE=yes +#USE_SHSTORE=yes +#FORCE_ALIGNED=yes +#FORCE_DEDUP=yes +#FORCE_SDCALLS=yes + +#BAT="--enable-bat" +BAT= # Where to get the source to be tested BACULA_SOURCE="${HOME}/bacula/bacula" # Where to send email !!!!! Change me !!!!!!! EMAIL=my-name@domain.com +# if you don't have any SMTP, set "dummy" or empty to use dummy_bsmtp SMTP_HOST="localhost" +# You may put your real host name here, but localhost is valid also +# and it has the advantage that it works on a non-newtworked machine +HOST="127.0.0.1" + # Full "default" path where to find sqlite (no quotes!) +# if the right packages (sqlite3 & libsqlite3-dev for ubuntu) are installed +# just use WHICHDB="--with-sqlite3" below SQLITE3_DIR=${HOME}/bacula/depkgs/sqlite3 -# Set what backend to use "postresql" "mysql" or "sqlite3" -DBTYPE="postgresql" - # Set your database here -#WHICHDB="--with-${DBTYPE}=${SQLITE3_DIR}" -WHICHDB="--with-${DBTYPE}" +#WHICHDB="--with-sqlite3=${SQLITE3_DIR}" +#WHICHDB="--with-postgresql" +WHICHDB="--with-mysql" # set to /dev/null if you do not have a tape drive # Note this is used for both the tape tests and the # autochanger TAPE_DRIVE="/dev/nst0" +# set to scsi control for shared storage +TAPE_CONTROL="/dev/null" # if you don't have an autochanger set AUTOCHANGER to /dev/null AUTOCHANGER="/dev/sg0" @@ -40,9 +59,8 @@ SLOT2=2 # For two drive tests -- set to /dev/null if you do not have it TAPE_DRIVE1="/dev/null" - -# Set this if you are using fake tape driver -#USE_VTAPE=yes +# Set to second drive scsi control +TAPE_CONTROL1="/dev/null" # Change this to use disk-changer with vtape AUTOCHANGER_SCRIPT=mtx-changer @@ -55,10 +73,6 @@ db_name="regress" db_user="regress" db_password="" -# Set this if you use libdbi framework -#LIBDBI="dbdriver = "dbi:postgresql"; dbaddress = 127.0.0.1; dbport = 5432" -#LIBDBI="dbdriver = "dbi:sqlite"; dbaddress = 127.0.0.1; dbport = 0" - # Set this to "--with-tcp-wrappers" or "--without-tcp-wrappers" TCPWRAPPERS="--with-tcp-wrappers" @@ -69,11 +83,45 @@ TCPWRAPPERS="--with-tcp-wrappers" # Note, you can also add any other (as many as you want) special # Bacula configuration options here, such as --disable-batch-insert # -OPENSSL="--with-openssl" +OPENSSL="--with-openssl $BAT" -# You may put your real host name here, but localhost is valid also -# and it has the advantage that it works on a non-newtworked machine -HOST="127.0.0.1" +# Point RSYNC variable where your librsync 0.9.7b is installed +# you can compile librsync with +# ./configure --with-pic --prefix=$HOME/dev/depkgs-rsync +# make +# make install +# +# Then use the following RSYNC variable in your regress config file +#RSYNC=--with-rsync=$HOME/dev/depkgs-rsync +RSYNC= + +# Point TOKYOCABINET variable where your tokyocabinet is installed +# you can compile tokyocabinet with +# ./configure --with-pic --prefix=$HOME/dev/depkgs-tokyocabinet +# make +# make install +# +# Then use the following TOKYOCABINET variable in your regress config file +# don't forget to update LD_LIBRARY_PATH or /etc/ld.so.conf, +#TOKYOCABINET=--with-tokyocabinet=$HOME/dev/depkgs-tokyocabinet +TOKYOCABINET= + +# DEDUP allows to disable deduplication on the SD +# If you don't have TokyoCabinet +#DEDUP=--disable-sd-dedup +DEDUP= + +# Use DEDUP device +#FORCE_DEDUP=yes|no + +# Configure FileSet { Include { Options { Dedup = }}} +#DEDUP_FS_OPTION=bothsides|storage|none + +# Use a client side cache +#DEDUP_FD_CACHE=yes|no + +# enable USEA control library +#USEA=--enable-usea # see --with-base-port at # http://www.bacula.org/rel-manual/Installing_Bacula.html @@ -124,6 +172,18 @@ WIN32_USER=Administrator # Admin password WIN32_PASS=PasswordWin +# +# Testing remote SD +# +# IP address of remote SD +REMOTE_HOST_ADDR= + +# Name of this Director which will be validated remotely +# If we are the Director, you must put xxxx below. +# Only on the remote director do you put the name +# of this director in the HOST environment variable +REMOTE_DIR_NAME="xxxxx" + # # Testing remote FD # @@ -136,7 +196,7 @@ REMOTE_ADDR="yyyy" # in the FileSet REMOTE_FILE="/tmp" # Port of Win32 client -REMOTE_PORT=9102 +REMOTE_PORT=8102 # Win32 Client password REMOTE_PASSWORD="zzzzz" # Where the win32 client will have to contact the SD diff --git a/regress/rtest b/regress/rtest index b613b2ff4f..22498eb6c3 100755 --- a/regress/rtest +++ b/regress/rtest @@ -1,9 +1,18 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a regression test script on a remote machine # # called: rtest # +# Since make setup is always called, you probably want +# to execute scripts that do not do the setup. If you do +# it just takes a bit longer, but there is no harm done. +# # Note: expects remote source to be in the same place # as defined in regress/config on your calling machine # Otherwise, you must define BACULA_SOURCE after the @@ -27,8 +36,12 @@ ssh ${host} <>test.out - echo "=== Test $* timed out ===" >>test.out + echo "=== Test $* failed ===" >>test.out echo " " >>test.out + exit 1 fi else nice $* diff --git a/regress/run_bacula_regression b/regress/run_bacula_regression index 0c8dcfd54c..420bd5432b 100755 --- a/regress/run_bacula_regression +++ b/regress/run_bacula_regression @@ -1,4 +1,7 @@ #!/bin/ksh +5B# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # Small wrapper script for doing Bacula regression # You will undoubtedly need to edit this to make it diff --git a/regress/run_bconsole b/regress/run_bconsole index d48e2623c6..7687d6077c 100755 --- a/regress/run_bconsole +++ b/regress/run_bconsole @@ -1,3 +1,8 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + bin/bacula start bin/bconsole -c bin/bconsole.conf diff --git a/regress/run_multiple b/regress/run_multiple index 68f817e24c..1f62edaf11 100755 --- a/regress/run_multiple +++ b/regress/run_multiple @@ -1,9 +1,21 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + +if [ $# != 1 ] ; then + echo " " + echo "Missing test name ..." + echo "./run_multiple test/" + echo " " + exit 1 +fi ./starttime export REGRESS_DEBUG=1 for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ; do echo "$i. Doing $1 at `date +%R:%S`" - nice $1 >1 + nice ./run $1 >1 r=$? if [ $r -ne 0 ] ; then echo "Exit $r" diff --git a/regress/scripts/bacula-dir-win32-tape.conf.in b/regress/scripts/bacula-dir-win32-tape.conf.in deleted file mode 100644 index e0fa99c47f..0000000000 --- a/regress/scripts/bacula-dir-win32-tape.conf.in +++ /dev/null @@ -1,147 +0,0 @@ -# -# Default Bacula Director Configuration file -# -# The only thing that MUST be changed is to add one or more -# file or directory names in the Include directive of the -# FileSet resource. -# -# For Bacula release 1.33 -# -# You might also want to change the default email address -# from root to your address. See the "mail" and "operator" -# directives in the Messages resource. -# - -Director { # define myself - Name = @hostname@-dir - DIRPort = @dirport@ # where we listen for UA connections - QueryFile = "@scriptdir@/query.sql" - WorkingDirectory = "@working_dir@" - PidDirectory = "@piddir@" - Maximum Concurrent Jobs = 4 - Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" - Messages = Daemon -} - -# -# Define the main nightly save backup job -# By default, this job will back up to disk in @tmpdir@ -Job { - Name = "NightlySave" - Type = Backup - Client=@win32_client@ - FileSet="Full Set" - Storage = tape - Messages = Standard - Pool = Default - Write Bootstrap = "@working_dir@/NightlySave.bsr" - Maximum Concurrent Jobs = 4 - SpoolData = yes -} - - -# Standard Restore template, to be changed by Console program -Job { - Name = "RestoreFiles" - Type = Restore - Client=@win32_client@ - FileSet="Full Set" - Storage = tape - Messages = Standard - Pool = Default - Where = @tmpdir@/bacula-restores -} - - -# List of files to be backed up -FileSet { - Name = "Full Set" - Enable VSS = yes - Include { Options { signature=MD5 } - File = "@win32_file@" - } -} - - -# -# When to do the backups, full backup on first sunday of the month, -# differential (i.e. incremental since full) every other sunday, -# and incremental backups other days -Schedule { - Name = "WeeklyCycle" - Run = Full 1st sun at 1:05 - Run = Differential 2nd-5th sun at 1:05 - Run = Incremental mon-sat at 1:05 -} - -# Client (File Services) to backup -Client { - Name = @win32_client@ - Address = @win32_addr@ - FDPort = @win32_port@ - Catalog = MyCatalog - Password = "@win32_password@" - File Retention = 30d # 30 days - Job Retention = 180d # six months - AutoPrune = yes # Prune expired Jobs/Files - Maximum Concurrent Jobs = 4 -} - -# Definition of DDS tape storage device -Storage { - Name = tape - Address = @hostname@-sd # N.B. Use a fully qualified name here - SDPort = @sdport@ - Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" # password for Storage daemon - Device = tape # must be same as Device in Storage daemon - Media Type = tape # must be same as MediaType in Storage daemon - AutoChanger = yes - Maximum Concurrent Jobs = 4 -} - - -# Generic catalog service -Catalog { - Name = MyCatalog - @libdbi@ - dbname = @db_name@; user = @db_user@; password = "@db_password@" -} - -# Reasonable message delivery -- send most everything to email address -# and to the console -Messages { - Name = Standard - mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression Job %j\) %r\" -s \"Regression: %t %e of %c %l\" %r" - operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression Job %j\) %r\" -s \"Regression: Intervention needed for %j\" %r" -# MailOnError = @job_email@ = all, !terminate -# operator = @job_email@ = mount - console = all, !skipped, !terminate, !restored -# -# WARNING! the following will create a file that you must cycle from -# time to time as it will grow indefinitely. However, it will -# also keep all your messages if the scroll off the console. -# - append = "@working_dir@/log" = all, !skipped - catalog = all, !skipped -} - -# -# Message delivery for daemon messages (no job). -Messages { - Name = Daemon - mailcommand = "@sbindir@/bsmtp -h @smtp_host@ -f \"\(Bacula regression\) %r\" -s \"Regression daemon message\" %r" -# mail = @job_email@ = all, !skipped - console = all, !skipped, !saved - append = "@working_dir@/log" = all, !skipped - catalog = all, !skipped -} - - -# Default pool definition -Pool { - Name = Default - Pool Type = Backup - Recycle = yes # Bacula can automatically recycle Volumes - AutoPrune = yes # Prune expired volumes - Volume Retention = 365d # one year -} diff --git a/regress/scripts/bacula-dir.conf.maxruntime.in b/regress/scripts/bacula-dir.conf.maxruntime.in index a6afc96670..e216b2cd10 100644 --- a/regress/scripts/bacula-dir.conf.maxruntime.in +++ b/regress/scripts/bacula-dir.conf.maxruntime.in @@ -87,7 +87,7 @@ Job { Max Full Interval = 28 days Full Max Run Time = 1min Cancel Queued Duplicates = no - + Maximum Bandwidth = 5MB/s } # Client (File Services) to backup diff --git a/regress/scripts/bacula-sd-2disk-drive.conf.in b/regress/scripts/bacula-sd-2disk-drive.conf.in index 2d32e1822d..fdc3ce523f 100644 --- a/regress/scripts/bacula-sd-2disk-drive.conf.in +++ b/regress/scripts/bacula-sd-2disk-drive.conf.in @@ -102,6 +102,81 @@ Device { # Maximum File Size = 1000000 } +Device { + Name = vDrive-Disk-restore + Device Type = File + Media Type = Disk + Archive Device = @tmpdir@ + AutomaticMount = yes; # when device opened, read it + Autochanger = yes + Drive Index = 1 + AlwaysOpen = yes; + RemovableMedia = yes; + Maximum Concurrent Jobs = 3 + Volume Poll Interval = 15 +# Maximum File Size = 1000000 +} + +Autochanger { + Name = Virtual2 + Changer Device = /dev/null + Changer Command ="" + Device = vDrive-3, vDrive-4 +} + +Device { + Name = vDrive-3 + Device Type = File + Media Type = Disk2 + Archive Device = @tmpdir@ + AutomaticMount = yes; # when device opened, read it + Autochanger = yes + Drive Index = 0 + AlwaysOpen = yes; + RemovableMedia = yes; + Maximum Concurrent Jobs = 3 + Volume Poll Interval = 15 +# Maximum File Size = 1000000 +} + +Device { + Name = vDrive-4 + Device Type = File + Media Type = Disk2 + Archive Device = @tmpdir@ + AutomaticMount = yes; # when device opened, read it + Autochanger = yes + Drive Index = 1 + AlwaysOpen = yes; + RemovableMedia = yes; + Maximum Concurrent Jobs = 3 + Volume Poll Interval = 15 +# Maximum File Size = 1000000 +} + +Device { + Name = vDrive-Disk2-restore + Device Type = File + Media Type = Disk2 + Archive Device = @tmpdir@ + AutomaticMount = yes; # when device opened, read it + Autochanger = yes + Drive Index = 1 + AlwaysOpen = yes; + RemovableMedia = yes; + Maximum Concurrent Jobs = 3 + Volume Poll Interval = 15 +# Maximum File Size = 1000000 +} + +Autochanger { + Name = VirtualRestore + Changer Device = /dev/null + Changer Command ="" + Device = vDrive-Disk-restore, vDrive-Disk2-restore +} + + # # Send all messages to the Director, # mount messages also are sent to the email address diff --git a/regress/scripts/bacula-sd-vtape.conf.in b/regress/scripts/bacula-sd-vtape.conf.in index d98871e58a..8b9e3a4345 100644 --- a/regress/scripts/bacula-sd-vtape.conf.in +++ b/regress/scripts/bacula-sd-vtape.conf.in @@ -37,6 +37,7 @@ Device { Name = LTO3_0 Media Type = LTO3 Archive Device = @working_dir@/ach/drive0 + Control Device = @working_dir@/ach/sg0 AutomaticMount = yes; # when device opened, read it Autochanger = yes Drive Index = 0 @@ -54,6 +55,7 @@ Device { Name = LTO3_1 Media Type = LTO3 Archive Device = @working_dir@/ach/drive1 + Control Device = @working_dir@/ach/sg1 AutomaticMount = yes; # when device opened, read it Autochanger = yes Drive Index = 1 @@ -72,6 +74,7 @@ Device { Name = LTO3_2 Media Type = LTO3 Archive Device = @working_dir@/ach/drive2 + Control Device = @working_dir@/ach/sg2 AutomaticMount = yes; # when device opened, read it Autochanger = yes Drive Index = 2 @@ -91,6 +94,7 @@ Device { Name = LTO1_3 Media Type = LTO1 Archive Device = @working_dir@/ach/drive3 + Control Device = @working_dir@/ach/sg3 AutomaticMount = yes; # when device opened, read it Autochanger = yes Drive Index = 3 @@ -109,6 +113,7 @@ Device { Name = LTO1_4 Media Type = LTO1 Archive Device = @working_dir@/ach/drive4 + Control Device = @working_dir@/ach/sg4 AutomaticMount = yes; # when device opened, read it Autochanger = yes Drive Index = 4 @@ -126,6 +131,7 @@ Device { Name = LTO1_5 Media Type = LTO1 Archive Device = @working_dir@/ach/drive5 + Control Device = @working_dir@/ach/sg5 AutomaticMount = yes; # when device opened, read it Autochanger = yes Drive Index = 5 @@ -144,6 +150,7 @@ Device { Name = LTO1-ANSI_6 Media Type = LTO1-ANSI Archive Device = @working_dir@/ach/drive6 + Control Device = @working_dir@/ach/sg6 AutomaticMount = yes; # when device opened, read it Autochanger = yes Drive Index = 6 diff --git a/regress/scripts/check_for_zombie_jobs b/regress/scripts/check_for_zombie_jobs index 2b1802a2e8..c3eeafd1a0 100755 --- a/regress/scripts/check_for_zombie_jobs +++ b/regress/scripts/check_for_zombie_jobs @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Check for zombie jobs (not terminated). # Also scan logs for ERROR messages @@ -31,7 +36,7 @@ if [ $? != 0 ] ; then echo " " echo " !!!! Zombie Jobs in Director !!!!" echo " !!!! Zombie Jobs in Director !!!!" >>test.out - cat ${tmp}/dir.out + if test "$debug" = "1" ; then cat ${tmp}/dir.out; fi echo " " zstat=1 exit 1 @@ -41,7 +46,7 @@ if [ $? != 0 ] ; then echo " " echo " !!!! Zombie Jobs in File daemon !!!!" echo " !!!! Zombie Jobs in File daemon !!!!" >>test.out - cat ${tmp}/fd.out + if test "$debug" = "1" ; then cat ${tmp}/fd.out; fi echo " " zstat=1 exit 1 @@ -51,7 +56,7 @@ if [ $? != 0 ] ; then echo " " echo " !!!! Zombie Jobs in Storage daemon !!!!" echo " !!!! Zombie Jobs in Storage daemon !!!!" >>test.out - cat ${tmp}/sd.out + if test "$debug" = "1" ; then cat ${tmp}/sd.out; fi echo " " zstat=1 exit 1 @@ -61,7 +66,7 @@ if [ $? = 0 ]; then echo " " echo " !!!! Zombie \"Read\" Jobs in Storage daemon !!!!" echo " !!!! Zombie \"Read\" Jobs in Storage daemon !!!!" >>test.out - cat ${tmp}/sd.out + if test "$debug" = "1" ; then cat ${tmp}/sd.out; fi echo " " zstat=1 exit 1 diff --git a/regress/scripts/cleanup b/regress/scripts/cleanup index d29f584733..e7a7add119 100755 --- a/regress/scripts/cleanup +++ b/regress/scripts/cleanup @@ -1,7 +1,8 @@ #!/bin/sh # -# License: LGPLv2 -# Author: Kern Sibbald +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # # Cleanup left over files -- both before and after test run # @@ -24,7 +25,7 @@ find . -name "gigaslam.gif" -exec rm -f {} \; # bin directory does not always exist if [ -d ${bin} ] ; then if [ -f ${bin}/bacula ] ; then - ${bin}/bacula stop 2>&1 >/dev/null + ${bin}/bacula stop -KILL 2>&1 >/dev/null fi cd ${scripts} ./drop_bacula_tables >/dev/null 2>&1 diff --git a/regress/scripts/cleanup-2drive.in b/regress/scripts/cleanup-2drive.in index a0fbd6b08e..6c8eb9382a 100755 --- a/regress/scripts/cleanup-2drive.in +++ b/regress/scripts/cleanup-2drive.in @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Cleanup left over files -- both before and after test run # diff --git a/regress/scripts/cleanup-2tape.in b/regress/scripts/cleanup-2tape.in index 8fa197d4df..f50de94863 100755 --- a/regress/scripts/cleanup-2tape.in +++ b/regress/scripts/cleanup-2tape.in @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Cleanup left over files -- both before and after test run # diff --git a/regress/scripts/cleanup-tape.in b/regress/scripts/cleanup-tape.in index e08b12a854..c0e9061cda 100755 --- a/regress/scripts/cleanup-tape.in +++ b/regress/scripts/cleanup-tape.in @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Cleanup left over files, then load $SLOT1 into drive and # write an EOF on it. diff --git a/regress/scripts/config_dart b/regress/scripts/config_dart index 6414c3f28e..44918c7137 100755 --- a/regress/scripts/config_dart +++ b/regress/scripts/config_dart @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Configure the dart files # diff --git a/regress/scripts/copy-2client-confs b/regress/scripts/copy-2client-confs index e24362ea3f..30e2a16662 100755 --- a/regress/scripts/copy-2client-confs +++ b/regress/scripts/copy-2client-confs @@ -1,10 +1,15 @@ #!/bin/sh -/bin/cp -f scripts/bacula-dir-2client.conf bin/bacula-dir.conf -/bin/cp -f scripts/bacula-sd-2disk-drive.conf bin/bacula-sd.conf -/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf -/bin/cp -f scripts/test-console.conf bin/bconsole.conf -/bin/cp -f scripts/test-console.conf bin/bat.conf +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + +cp -f scripts/bacula-dir-2client.conf ${conf}/bacula-dir.conf +cp -f scripts/bacula-sd-2disk-drive.conf ${conf}/bacula-sd.conf +cp -f scripts/test-bacula-fd.conf ${conf}/bacula-fd.conf +cp -f scripts/test-console.conf ${conf}/bconsole.conf +cp -f scripts/test-console.conf ${conf}/bat.conf outf="tmp/sed_tmp" echo "s%# Autochanger = yes% Autochanger = yes%g" >${outf} -cp bin/bacula-dir.conf tmp/1 -sed -f ${outf} tmp/1 >bin/bacula-dir.conf +cp ${conf}/bacula-dir.conf tmp/1 +sed -f ${outf} tmp/1 >${conf}/bacula-dir.conf diff --git a/regress/scripts/copy-2disk-confs b/regress/scripts/copy-2disk-confs index 9b9aee3668..ab2e60dca3 100755 --- a/regress/scripts/copy-2disk-confs +++ b/regress/scripts/copy-2disk-confs @@ -1,13 +1,18 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Setup for using the Virtual Disk Changer (simulates tape changer) # -/bin/cp -f scripts/bacula-dir-tape.conf bin/bacula-dir.conf -/bin/cp -f scripts/bacula-sd-2disk.conf bin/bacula-sd.conf -/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf -/bin/cp -f scripts/test-console.conf bin/bconsole.conf -/bin/cp -f scripts/test-console.conf bin/bat.conf +cp -f scripts/bacula-dir-tape.conf ${conf}/bacula-dir.conf +cp -f scripts/bacula-sd-2disk.conf ${conf}/bacula-sd.conf +cp -f scripts/test-bacula-fd.conf ${conf}/bacula-fd.conf +cp -f scripts/test-console.conf ${conf}/bconsole.conf +cp -f scripts/test-console.conf ${conf}/bat.conf outf="tmp/sed_tmp" echo "s%# Autochanger = yes% Autochanger = yes%g" >${outf} -cp bin/bacula-dir.conf tmp/1 -sed -f ${outf} tmp/1 >bin/bacula-dir.conf +cp ${conf}/bacula-dir.conf tmp/1 +sed -f ${outf} tmp/1 >${conf}/bacula-dir.conf diff --git a/regress/scripts/copy-2disk-drive-confs b/regress/scripts/copy-2disk-drive-confs index 6fb08807e9..8c2f59bdf1 100755 --- a/regress/scripts/copy-2disk-drive-confs +++ b/regress/scripts/copy-2disk-drive-confs @@ -1,10 +1,15 @@ #!/bin/sh -/bin/cp -f scripts/bacula-dir-tape.conf bin/bacula-dir.conf -/bin/cp -f scripts/bacula-sd-2disk-drive.conf bin/bacula-sd.conf -/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf -/bin/cp -f scripts/test-console.conf bin/bconsole.conf -/bin/cp -f scripts/test-console.conf bin/bat.conf +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + +cp -f scripts/bacula-dir-tape.conf ${conf}/bacula-dir.conf +cp -f scripts/bacula-sd-2disk-drive.conf ${conf}/bacula-sd.conf +cp -f scripts/test-bacula-fd.conf ${conf}/bacula-fd.conf +cp -f scripts/test-console.conf ${conf}/bconsole.conf +cp -f scripts/test-console.conf ${conf}/bat.conf outf="tmp/sed_tmp" echo "s%# Autochanger = yes% Autochanger = yes%g" >${outf} -cp bin/bacula-dir.conf tmp/1 -sed -f ${outf} tmp/1 >bin/bacula-dir.conf +cp ${conf}/bacula-dir.conf tmp/1 +sed -f ${outf} tmp/1 >${conf}/bacula-dir.conf diff --git a/regress/scripts/copy-2drive-confs b/regress/scripts/copy-2drive-confs index 5f81b7dd41..1f7db20c97 100755 --- a/regress/scripts/copy-2drive-confs +++ b/regress/scripts/copy-2drive-confs @@ -1,12 +1,17 @@ #!/bin/sh -/bin/cp -f scripts/bacula-dir-tape.conf bin/bacula-dir.conf -/bin/cp -f scripts/bacula-sd-2drive.conf bin/bacula-sd.conf -/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf -/bin/cp -f scripts/test-console.conf bin/bconsole.conf -/bin/cp -f scripts/test-console.conf bin/bat.conf +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + +cp -f scripts/bacula-dir-tape.conf ${conf}/bacula-dir.conf +cp -f scripts/bacula-sd-2drive.conf ${conf}/bacula-sd.conf +cp -f scripts/test-bacula-fd.conf ${conf}/bacula-fd.conf +cp -f scripts/test-console.conf ${conf}/bconsole.conf +cp -f scripts/test-console.conf ${conf}/bat.conf outf="tmp/sed_tmp" echo "s%# Autochanger = yes% Autochanger = yes%g" >${outf} -cp bin/bacula-dir.conf tmp/1 -sed -f ${outf} tmp/1 >bin/bacula-dir.conf +cp ${conf}/bacula-dir.conf tmp/1 +sed -f ${outf} tmp/1 >${conf}/bacula-dir.conf scripts/set_tape_options diff --git a/regress/scripts/copy-2tape-confs b/regress/scripts/copy-2tape-confs index 871a473315..689d664154 100755 --- a/regress/scripts/copy-2tape-confs +++ b/regress/scripts/copy-2tape-confs @@ -1,12 +1,17 @@ #!/bin/sh -/bin/cp -f scripts/bacula-dir-tape.conf bin/bacula-dir.conf -/bin/cp -f scripts/bacula-sd-2tape.conf bin/bacula-sd.conf -/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf -/bin/cp -f scripts/test-console.conf bin/bconsole.conf -/bin/cp -f scripts/test-console.conf bin/bat.conf +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + +cp -f scripts/bacula-dir-tape.conf ${conf}/bacula-dir.conf +cp -f scripts/bacula-sd-2tape.conf ${conf}/bacula-sd.conf +cp -f scripts/test-bacula-fd.conf ${conf}/bacula-fd.conf +cp -f scripts/test-console.conf ${conf}/bconsole.conf +cp -f scripts/test-console.conf ${conf}/bat.conf outf="tmp/sed_tmp" echo "s%# Autochanger = yes% Autochanger = yes%g" >${outf} -cp bin/bacula-dir.conf tmp/1 -sed -f ${outf} tmp/1 >bin/bacula-dir.conf +cp ${conf}/bacula-dir.conf tmp/1 +sed -f ${outf} tmp/1 >${conf}/bacula-dir.conf scripts/set_tape_options diff --git a/regress/scripts/copy-btape-confs b/regress/scripts/copy-btape-confs index b1bec0fc2d..699ef339c9 100755 --- a/regress/scripts/copy-btape-confs +++ b/regress/scripts/copy-btape-confs @@ -1,8 +1,13 @@ #!/bin/sh -/bin/cp -f ${rscripts}/bacula-dir-tape.conf ${scripts}/bacula-dir.conf -/bin/cp -f ${rscripts}/bacula-sd-btape.conf ${scripts}/bacula-sd.conf -/bin/cp -f ${rscripts}/test-bacula-fd.conf ${scripts}/bacula-fd.conf -/bin/cp -f ${rscripts}/test-console.conf ${scripts}/bconsole.conf -/bin/cp -f ${rscripts}/test-console.conf ${scripts}/bat.conf +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + +/bin/cp -f ${rscripts}/bacula-dir-tape.conf ${conf}/bacula-dir.conf +/bin/cp -f ${rscripts}/bacula-sd-btape.conf ${conf}/bacula-sd.conf +/bin/cp -f ${rscripts}/test-bacula-fd.conf ${conf}/bacula-fd.conf +/bin/cp -f ${rscripts}/test-console.conf ${conf}/bconsole.conf +/bin/cp -f ${rscripts}/test-console.conf ${conf}/bat.conf ${rscripts}/set_tape_options diff --git a/regress/scripts/copy-confs b/regress/scripts/copy-confs index 88906ab142..fc67b6d451 100755 --- a/regress/scripts/copy-confs +++ b/regress/scripts/copy-confs @@ -1,9 +1,14 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + . scripts/functions -/bin/cp -f ${rscripts}/bacula-dir.conf ${scripts}/bacula-dir.conf -/bin/cp -f ${rscripts}/bacula-sd.conf ${scripts}/bacula-sd.conf -/bin/cp -f ${rscripts}/bacula-fd.conf ${scripts}/bacula-fd.conf -/bin/cp -f ${rscripts}/bconsole.conf ${scripts}/bconsole.conf -/bin/cp -f ${rscripts}/bconsole.conf ${scripts}/bat.conf +/bin/cp -f ${rscripts}/bacula-dir.conf ${conf}/bacula-dir.conf +/bin/cp -f ${rscripts}/bacula-sd.conf ${conf}/bacula-sd.conf +/bin/cp -f ${rscripts}/bacula-fd.conf ${conf}/bacula-fd.conf +/bin/cp -f ${rscripts}/bconsole.conf ${conf}/bconsole.conf +/bin/cp -f ${rscripts}/bconsole.conf ${conf}/bat.conf ${rscripts}/set_tape_options diff --git a/regress/scripts/copy-crypto-confs b/regress/scripts/copy-crypto-confs index df75519d0d..f59699afc9 100755 --- a/regress/scripts/copy-crypto-confs +++ b/regress/scripts/copy-crypto-confs @@ -1,8 +1,13 @@ #!/bin/sh -/bin/cp -f scripts/new-test-bacula-dir.conf bin/bacula-dir.conf -/bin/cp -f scripts/test-bacula-sd.conf bin/bacula-sd.conf -/bin/cp -f scripts/crypto-bacula-fd.conf bin/bacula-fd.conf -/bin/cp -f scripts/test-console.conf bin/bconsole.conf -/bin/cp -f scripts/test-console.conf bin/bat.conf -/bin/cp -f scripts/cryptokeypair.pem bin/cryptokeypair.pem -/bin/cp -f scripts/master2048.cert bin/master2048.cert +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + +cp -f scripts/new-test-bacula-dir.conf ${conf}/bacula-dir.conf +cp -f scripts/test-bacula-sd.conf ${conf}/bacula-sd.conf +cp -f scripts/crypto-bacula-fd.conf ${conf}/bacula-fd.conf +cp -f scripts/test-console.conf ${conf}/bconsole.conf +cp -f scripts/test-console.conf ${conf}/bat.conf +cp -f scripts/cryptokeypair.pem ${conf}/cryptokeypair.pem +cp -f scripts/master2048.cert ${conf}/master2048.cert diff --git a/regress/scripts/copy-fifo-confs b/regress/scripts/copy-fifo-confs index d41b253d59..e3eae01df3 100755 --- a/regress/scripts/copy-fifo-confs +++ b/regress/scripts/copy-fifo-confs @@ -1,8 +1,13 @@ #!/bin/sh -/bin/cp -f scripts/bacula-dir-fifo.conf bin/bacula-dir.conf -/bin/cp -f scripts/bacula-sd-fifo.conf bin/bacula-sd.conf -/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf -/bin/cp -f scripts/test-console.conf bin/bconsole.conf -/bin/cp -f scripts/test-console.conf bin/bat.conf +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + +cp -f scripts/bacula-dir-fifo.conf ${conf}/bacula-dir.conf +cp -f scripts/bacula-sd-fifo.conf ${conf}/bacula-sd.conf +cp -f scripts/test-bacula-fd.conf ${conf}/bacula-fd.conf +cp -f scripts/test-console.conf ${conf}/bconsole.conf +cp -f scripts/test-console.conf ${conf}/bat.conf scripts/set_tape_options diff --git a/regress/scripts/copy-migration-confs b/regress/scripts/copy-migration-confs index 3add9a67b0..cc2d38b06d 100755 --- a/regress/scripts/copy-migration-confs +++ b/regress/scripts/copy-migration-confs @@ -1,9 +1,14 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Setup for using the Virtual Disk Changer (simulates tape changer) # -/bin/cp -f scripts/bacula-dir-migration.conf bin/bacula-dir.conf -/bin/cp -f scripts/bacula-sd-migration.conf bin/bacula-sd.conf -/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf -/bin/cp -f scripts/test-console.conf bin/bconsole.conf -/bin/cp -f scripts/test-console.conf bin/bat.conf +cp -f scripts/bacula-dir-migration.conf ${conf}/bacula-dir.conf +cp -f scripts/bacula-sd-migration.conf ${conf}/bacula-sd.conf +cp -f scripts/test-bacula-fd.conf ${conf}/bacula-fd.conf +cp -f scripts/test-console.conf ${conf}/bconsole.conf +cp -f scripts/test-console.conf ${conf}/bat.conf diff --git a/regress/scripts/copy-plugin-confs b/regress/scripts/copy-plugin-confs deleted file mode 100755 index 81102c966a..0000000000 --- a/regress/scripts/copy-plugin-confs +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -/bin/cp -f scripts/plugin-test-bacula-dir.conf bin/bacula-dir.conf -/bin/cp -f scripts/test-bacula-sd.conf bin/bacula-sd.conf -/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf -/bin/cp -f scripts/test-console.conf bin/bconsole.conf -/bin/cp -f scripts/test-console.conf bin/bat.conf - -scripts/set_tape_options diff --git a/regress/scripts/copy-strip-confs b/regress/scripts/copy-strip-confs index 97cf1a4f89..34d28877da 100755 --- a/regress/scripts/copy-strip-confs +++ b/regress/scripts/copy-strip-confs @@ -1,8 +1,13 @@ #!/bin/sh -/bin/cp -f scripts/bacula-dir-strip.conf bin/bacula-dir.conf -/bin/cp -f scripts/test-bacula-sd.conf bin/bacula-sd.conf -/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf -/bin/cp -f scripts/test-console.conf bin/bconsole.conf -/bin/cp -f scripts/test-console.conf bin/bat.conf +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + +cp -f scripts/bacula-dir-strip.conf ${conf}/bacula-dir.conf +cp -f scripts/test-bacula-sd.conf ${conf}/bacula-sd.conf +cp -f scripts/test-bacula-fd.conf ${conf}/bacula-fd.conf +cp -f scripts/test-console.conf ${conf}/bconsole.conf +cp -f scripts/test-console.conf ${conf}/bat.conf scripts/set_tape_options diff --git a/regress/scripts/copy-tape-confs b/regress/scripts/copy-tape-confs index 7e04edd2a9..d76c9e17d3 100755 --- a/regress/scripts/copy-tape-confs +++ b/regress/scripts/copy-tape-confs @@ -1,8 +1,13 @@ #!/bin/sh -/bin/cp -f ${rscripts}/bacula-dir-tape.conf ${scripts}/bacula-dir.conf -/bin/cp -f ${rscripts}/bacula-sd-tape.conf ${scripts}/bacula-sd.conf -/bin/cp -f ${rscripts}/test-bacula-fd.conf ${scripts}/bacula-fd.conf -/bin/cp -f ${rscripts}/test-console.conf ${scripts}/bconsole.conf -/bin/cp -f ${rscripts}/test-console.conf ${scripts}/bat.conf +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + +/bin/cp -f ${rscripts}/bacula-dir-tape.conf ${conf}/bacula-dir.conf +/bin/cp -f ${rscripts}/bacula-sd-tape.conf ${conf}/bacula-sd.conf +/bin/cp -f ${rscripts}/test-bacula-fd.conf ${conf}/bacula-fd.conf +/bin/cp -f ${rscripts}/test-console.conf ${conf}/bconsole.conf +/bin/cp -f ${rscripts}/test-console.conf ${conf}/bat.conf ${rscripts}/set_tape_options diff --git a/regress/scripts/copy-test-confs b/regress/scripts/copy-test-confs index c063abe74c..d2d8b49193 100755 --- a/regress/scripts/copy-test-confs +++ b/regress/scripts/copy-test-confs @@ -1,8 +1,13 @@ #!/bin/sh -/bin/cp -f ${rscripts}/new-test-bacula-dir.conf ${conf}/bacula-dir.conf -/bin/cp -f ${rscripts}/test-bacula-sd.conf ${conf}/bacula-sd.conf -/bin/cp -f ${rscripts}/test-bacula-fd.conf ${conf}/bacula-fd.conf -/bin/cp -f ${rscripts}/test-console.conf ${conf}/bconsole.conf -/bin/cp -f ${rscripts}/test-console.conf ${conf}/bat.conf +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + +cp -f ${rscripts}/new-test-bacula-dir.conf ${conf}/bacula-dir.conf +cp -f ${rscripts}/test-bacula-sd.conf ${conf}/bacula-sd.conf +cp -f ${rscripts}/test-bacula-fd.conf ${conf}/bacula-fd.conf +cp -f ${rscripts}/test-console.conf ${conf}/bconsole.conf +cp -f ${rscripts}/test-console.conf ${conf}/bat.conf ${rscripts}/set_tape_options diff --git a/regress/scripts/copy-testa-confs b/regress/scripts/copy-testa-confs index 8b42652778..5046238bcf 100755 --- a/regress/scripts/copy-testa-confs +++ b/regress/scripts/copy-testa-confs @@ -1,8 +1,13 @@ #!/bin/sh -/bin/cp -f scripts/testa-bacula-dir.conf bin/bacula-dir.conf -/bin/cp -f scripts/test-bacula-sd.conf bin/bacula-sd.conf -/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf -/bin/cp -f scripts/test-console.conf bin/bconsole.conf -/bin/cp -f scripts/test-console.conf bin/bat.conf +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + +cp -f scripts/testa-bacula-dir.conf ${conf}/bacula-dir.conf +cp -f scripts/test-bacula-sd.conf ${conf}/bacula-sd.conf +cp -f scripts/test-bacula-fd.conf ${conf}/bacula-fd.conf +cp -f scripts/test-console.conf ${conf}/bconsole.conf +cp -f scripts/test-console.conf ${conf}/bat.conf scripts/set_tape_options diff --git a/regress/scripts/copy-tls-auth-conf b/regress/scripts/copy-tls-auth-conf index 1a6d790498..549bca71df 100755 --- a/regress/scripts/copy-tls-auth-conf +++ b/regress/scripts/copy-tls-auth-conf @@ -1,9 +1,14 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# -/bin/cp -f scripts/tls-auth-bacula-dir.conf bin/bacula-dir.conf -/bin/cp -f scripts/tls-auth-bacula-sd.conf bin/bacula-sd.conf -/bin/cp -f scripts/tls-auth-bacula-fd.conf bin/bacula-fd.conf -/bin/cp -f scripts/test-console.conf bin/bconsole.conf -/bin/cp -f scripts/test-console.conf bin/bat.conf -/bin/cp -f scripts/tls-CA.pem bin/tls-CA.pem -/bin/cp -f scripts/tls-cert.pem bin/tls-cert.pem + +cp -f scripts/tls-auth-bacula-dir.conf ${conf}/bacula-dir.conf +cp -f scripts/tls-auth-bacula-sd.conf ${conf}/bacula-sd.conf +cp -f scripts/tls-auth-bacula-fd.conf ${conf}/bacula-fd.conf +cp -f scripts/test-console.conf ${conf}/bconsole.conf +cp -f scripts/test-console.conf ${conf}/bat.conf +cp -f scripts/tls-CA.pem ${conf}/tls-CA.pem +cp -f scripts/tls-cert.pem ${conf}/tls-cert.pem diff --git a/regress/scripts/copy-tls-confs b/regress/scripts/copy-tls-confs index 16129a8200..6a3f5b3733 100755 --- a/regress/scripts/copy-tls-confs +++ b/regress/scripts/copy-tls-confs @@ -1,9 +1,14 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# -/bin/cp -f scripts/tls-bacula-dir.conf bin/bacula-dir.conf -/bin/cp -f scripts/tls-bacula-sd.conf bin/bacula-sd.conf -/bin/cp -f scripts/tls-bacula-fd.conf bin/bacula-fd.conf -/bin/cp -f scripts/test-console.conf bin/bconsole.conf -/bin/cp -f scripts/test-console.conf bin/bat.conf -/bin/cp -f scripts/tls-CA.pem bin/tls-CA.pem -/bin/cp -f scripts/tls-cert.pem bin/tls-cert.pem + +cp -f scripts/tls-bacula-dir.conf ${conf}/bacula-dir.conf +cp -f scripts/tls-bacula-sd.conf ${conf}/bacula-sd.conf +cp -f scripts/tls-bacula-fd.conf ${conf}/bacula-fd.conf +cp -f scripts/test-console.conf ${conf}/bconsole.conf +cp -f scripts/test-console.conf ${conf}/bat.conf +cp -f scripts/tls-CA.pem ${conf}/tls-CA.pem +cp -f scripts/tls-cert.pem ${conf}/tls-cert.pem diff --git a/regress/scripts/copy-virtual-confs b/regress/scripts/copy-virtual-confs index 177ec5280e..f2a81b4e20 100755 --- a/regress/scripts/copy-virtual-confs +++ b/regress/scripts/copy-virtual-confs @@ -1,9 +1,14 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Setup for using the Virtual Disk Changer (simulates tape changer) # -/bin/cp -f scripts/bacula-dir-virtual.conf bin/bacula-dir.conf -/bin/cp -f scripts/bacula-sd-virtual.conf bin/bacula-sd.conf -/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf -/bin/cp -f scripts/test-console.conf bin/bconsole.conf -/bin/cp -f scripts/test-console.conf bin/bat.conf +cp -f scripts/bacula-dir-virtual.conf ${conf}/bacula-dir.conf +cp -f scripts/bacula-sd-virtual.conf ${conf}/bacula-sd.conf +cp -f scripts/test-bacula-fd.conf ${conf}/bacula-fd.conf +cp -f scripts/test-console.conf ${conf}/bconsole.conf +cp -f scripts/test-console.conf ${conf}/bat.conf diff --git a/regress/scripts/copy-win32-confs b/regress/scripts/copy-win32-confs deleted file mode 100755 index 019c9cd3e7..0000000000 --- a/regress/scripts/copy-win32-confs +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -/bin/cp -f scripts/win32-bacula-dir-tape.conf bin/bacula-dir.conf -/bin/cp -f scripts/win32-bacula-sd-tape.conf bin/bacula-sd.conf -/bin/cp -f scripts/win32-bacula-fd.conf bin/bacula-fd.conf -/bin/cp -f scripts/test-console.conf bin/bconsole.conf -/bin/cp -f scripts/test-console.conf bin/bat.conf - -scripts/set_tape_options diff --git a/regress/scripts/create_sed b/regress/scripts/create_sed index 3cbf690e73..7adcc237ca 100755 --- a/regress/scripts/create_sed +++ b/regress/scripts/create_sed @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Create the sed file for configuring everything # diff --git a/regress/scripts/diff.pl b/regress/scripts/diff.pl index 7e72349c66..a18ad9f3c6 100755 --- a/regress/scripts/diff.pl +++ b/regress/scripts/diff.pl @@ -1,4 +1,8 @@ #!/usr/bin/perl -w +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# =head1 NAME diff --git a/regress/scripts/do_sed b/regress/scripts/do_sed index 1cf9043b3f..049624d533 100755 --- a/regress/scripts/do_sed +++ b/regress/scripts/do_sed @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # cwd=`pwd` . scripts/functions @@ -16,13 +21,12 @@ sed -f ${out} ${rscripts}/bacula-dir.conf.regexwhere.in >${rscripts}/bacula-dir. sed -f ${out} ${rscripts}/bacula-dir.conf.maxtime.in >${rscripts}/bacula-dir.conf.maxtime sed -f ${out} ${rscripts}/bacula-dir.conf.maxruntime.in >${rscripts}/bacula-dir.conf.maxruntime sed -f ${out} ${rscripts}/new-test-bacula-dir.conf.in >${rscripts}/new-test-bacula-dir.conf -sed -f ${out} ${rscripts}/plugin-test-bacula-dir.conf.in >${rscripts}/plugin-test-bacula-dir.conf sed -f ${out} ${rscripts}/testa-bacula-dir.conf.in >${rscripts}/testa-bacula-dir.conf sed -f ${out} ${rscripts}/testb-bacula-dir.conf.in >${rscripts}/testb-bacula-dir.conf sed -f ${out} ${rscripts}/test-bacula-fd.conf.in >${rscripts}/test-bacula-fd.conf sed -f ${out} ${rscripts}/test-bacula-sd.conf.in >${rscripts}/test-bacula-sd.conf -sed -f ${out} ${rscripts}/test-console.conf.in >${rscripts}/test-console.conf sed -f ${out} ${rscripts}/virtualfull-extreme-bacula-dir.conf.in >${rscripts}/virtualfull-extreme-bacula-dir.conf +sed -f ${out} ${rscripts}/test-console.conf.in >${rscripts}/test-console.conf sed -f ${out} ${rscripts}/crypto-bacula-fd.conf.in >${rscripts}/crypto-bacula-fd.conf sed -f ${out} ${rscripts}/bacula-dir-tape.conf.in >${rscripts}/bacula-dir-tape.conf sed -f ${out} ${rscripts}/bacula-dir-2client.conf.in >${rscripts}/bacula-dir-2client.conf @@ -30,8 +34,6 @@ sed -f ${out} ${rscripts}/bacula-dir-fifo.conf.in >${rscripts}/bacula-dir-fifo.c sed -f ${out} ${rscripts}/bacula-dir-strip.conf.in >${rscripts}/bacula-dir-strip.conf sed -f ${out} ${rscripts}/bacula-dir-migration.conf.in >${rscripts}/bacula-dir-migration.conf sed -f ${out} ${rscripts}/bacula-dir-virtual.conf.in >${rscripts}/bacula-dir-virtual.conf -sed -f ${out} ${rscripts}/win32-bacula-dir-tape.conf.in >${rscripts}/win32-bacula-dir-tape.conf -sed -f ${out} ${rscripts}/win32-bacula-dir.conf.in >${rscripts}/win32-bacula-dir.conf sed -f ${out} ${rscripts}/bacula-sd-tape.conf.in >${rscripts}/bacula-sd-tape.conf sed -f ${out} ${rscripts}/bacula-sd-btape.conf.in >${rscripts}/bacula-sd-btape.conf sed -f ${out} ${rscripts}/ansi-sd-tape.conf.in >${rscripts}/ansi-sd-tape.conf @@ -70,10 +72,6 @@ sed -f ${out} ${rscripts}/regress-config.in >${rscripts}/regress-config chmod 755 ${rscripts}/regress-config -# These files have no fancy sed stuff, so we just copy them over -cp ${rscripts}/win32-bacula-sd-tape.conf.in ${rscripts}/win32-bacula-sd-tape.conf -cp ${rscripts}/win32-bacula-fd.conf.in ${rscripts}/win32-bacula-fd.conf - if test -f ${conf}/bacula-sd.conf ; then cp ${conf}/bacula-sd.conf ${tmp}/bac$$ sed "s% /tmp%${tmp}%g" ${tmp}/bac$$ >${conf}/bacula-sd.conf diff --git a/regress/scripts/dummy_bsmtp b/regress/scripts/dummy_bsmtp new file mode 100755 index 0000000000..2ec7d9fa38 --- /dev/null +++ b/regress/scripts/dummy_bsmtp @@ -0,0 +1,14 @@ +#!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + + +while test 1 ; do + read a + if test $? != 0; then + exit 0 + fi +done +exit 0 diff --git a/regress/scripts/functions b/regress/scripts/functions index af5686f7a4..9a21653ee4 100644 --- a/regress/scripts/functions +++ b/regress/scripts/functions @@ -5,8 +5,7 @@ check_encoding() { - ${bin}/bacula-dir -d50 -t -c ${conf}/bacula-dir.conf 2>&1 | grep 'Wanted SQL_ASCII, got UTF8' >/dev/null - if [ $? = 0 ]; then + if ${bin}/bacula-dir -d50 -t -c ${conf}/bacula-dir.conf 2>&1 | grep 'Wanted SQL_ASCII, got UTF8' >/dev/null ; then echo "Found database encoding problem, please modify the database encoding (SQL_ASCII)" exit 1 fi @@ -16,20 +15,25 @@ start_test() { check_encoding rm -rf ${working}/@* - # Turn off email - outf="${tmp}/sed_tmp" - echo "s% mail =%# mail = %g" >${outf} - echo "s% operator =%# operator =%g" >>${outf} - cp ${conf}/bacula-dir.conf ${tmp}/1 - sed -f ${outf} ${tmp}/1 > ${conf}/bacula-dir.conf - if [ x$FORCE_SDCALLS = xyes ]; then - $bperl -e 'add_attribute("$conf/bacula-dir.conf", "SD Calls Client", "yes", "Client")' - fi + variant_name="" + + # If no or dummy smtp_host, use dummy email handler + if [ x${SMTP_HOST} = x -o x${SMTP_HOST} = xdummy ]; then + cp scripts/dummy_bsmtp bin/bsmtp + chmod 755 bin/bsmtp + else + # Deactivate all email + outf="${tmp}/sed_tmp" + echo "s% mail =%# mail = %g" >${outf} + echo "s% operator =%# operator =%g" >>${outf} + cp ${conf}/bacula-dir.conf ${tmp}/1 + sed -f ${outf} ${tmp}/1 > ${conf}/bacula-dir.conf + fi ./test_starttime echo " " echo " " - echo " === Starting $TestName at `date +%R:%S` ===" - echo " === Starting $TestName at `date +%R:%S` ===" >> ${working}/log + echo " === Starting $TestName ${variant_name} at `date +%R:%S` ===" + echo " === Starting $TestName ${variant_name} at `date +%R:%S` ===" >> ${working}/log echo " " export TestName export zstat @@ -155,12 +159,12 @@ get_duration() check_duration() { LOG=$1 - $2 - OP=${3-gt} + TIME=$2 + OP=${3:-gt} get_duration $LOG if [ "$RET" -$OP "$TIME" ]; then - print_debug "Expect $OP than $TIME sec, get $RET" + print_debug "Error, got $RET $OP $TIME sec on $LOG" bstat=2 fi } @@ -265,6 +269,14 @@ check_two_logs() if test $? -eq 0; then bstat=2 fi + # Do not check for restart jobs in restart tests + echo "$TestName" | grep restart.*-test > /dev/null + if [ $? -ne 0 ]; then + grep "^ Termination: .*Backup failed" ${tmp}/log1.out 2>&1 >/dev/null + if test $? -eq 0; then + bstat=3 + fi + fi grep "^ Termination: *Restore OK" ${tmp}/log2.out 2>&1 >/dev/null rstat=${rstat:-$?} grep "^ Termination: .*Restore Error" ${tmp}/log2.out 2>&1 >/dev/null @@ -286,10 +298,35 @@ check_two_logs() fi grep "Orphaned buffer" ${tmp}/log1.out ${tmp}/log2.out if test $? -eq 0; then + print_debug "Found orphaned buffers" estat=1 fi } +dtitle() +{ + if test "$debug" -eq 1 ; then + echo "============================================================" + echo $* + echo "============================================================" + fi +} + +dmsg() +{ + test "$debug" -eq 1 && echo $* +} + +check_size_interval() +{ + # if mi == -1 then then ignore mi (idem for ma) + mi=$1 + value=$2 + ma=$3 + + test \( -1 -eq $mi -o $mi -le $value \) -a \( -1 -eq $ma -o $value -le $ma \) +} + check_restore_diff() { if test "$debug" -eq 1 ; then @@ -407,7 +444,7 @@ end_test() echo " !!!!! $TestName failed!!! $t $d !!!!! " echo " Status: zombie=$zstat backup=$bstat restore=$rstat diff=$dstat" echo " " >>test.out - echo " !!!!! $TestName failed!!! $t %d !!!!! " >>test.out + echo " !!!!! $TestName failed!!! $t $d !!!!! " >>test.out echo " Status: zombie=$zstat backup=$bstat restore=$rstat diff=$dstat" >>test.out if [ $bstat != 0 -o $rstat != 0 ] ; then echo " !!! Bad termination status !!! " diff --git a/regress/scripts/functions.pm b/regress/scripts/functions.pm index 9964538375..57f63816c3 100644 --- a/regress/scripts/functions.pm +++ b/regress/scripts/functions.pm @@ -3,23 +3,24 @@ use strict; =head1 LICENSE - Bacula® - The Network Backup Solution + Bacula® - The Network Backup Solution - Copyright (C) 2000-2014 Free Software Foundation Europe e.V. + Copyright (C) 2008-2014 Bacula Systems SA The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. - You may use this file and others of this release according to the - license defined in the LICENSE file, which includes the Affero General - Public License, v3.0 ("AGPLv3") and some additional permissions and - terms pursuant to its AGPLv3 Section 7. + Licensees holding a valid Bacula Systems SA license may use this file + and others of this release in accordance with the proprietary license + agreement provided in the LICENSE file. Redistribution of any part of + this release is not permitted. Bacula® is a registered trademark of Kern Sibbald. =cut package scripts::functions; +use File::Basename qw/basename/; # Export all functions needed to be used by a simple # perl -Mscripts::functions -e '' script use Exporter; @@ -27,22 +28,28 @@ our @ISA = qw(Exporter); our @EXPORT = qw(update_some_files create_many_files check_multiple_copies update_client $HOST $BASEPORT add_to_backup_list - check_volume_size create_many_dirs cleanup start_bacula + run_bconsole run_bacula start_test end_test create_bconcmds + create_many_dirs cleanup start_bacula + get_dirname stop_bacula get_resource set_maximum_concurrent_jobs get_time add_attribute check_prune_list check_min_volume_size + init_delta update_delta check_max_backup_size comment_out + create_many_files_size $plugins debug p check_max_volume_size $estat $bstat $rstat $zstat $cwd $bin $scripts $conf $rscripts $tmp $working $dstat extract_resource - $db_name $db_user $db_password $src $tmpsrc - remote_init remote_config remote_stop remote_diff ); + $db_name $db_user $db_password $src $tmpsrc $out $CLIENT docmd + set_global_maximum_concurrent_jobs check_volumes update_some_files_rep + remote_init remote_config remote_stop remote_diff remote_check + get_field_size get_field_ratio create_binfile ); use File::Copy qw/copy/; our ($cwd, $bin, $scripts, $conf, $rscripts, $tmp, $working, $estat, $dstat, - $bstat, $zstat, $rstat, $debug, + $plugins, $bstat, $zstat, $rstat, $debug, $out, $TestName, $REMOTE_CLIENT, $REMOTE_ADDR, $REMOTE_FILE, $REMOTE_PORT, $REMOTE_PASSWORD, - $REMOTE_STORE_ADDR, $REGRESS_DEBUG, - $db_name, $db_user, $db_password, $src, $tmpsrc, $HOST, $BASEPORT); + $REMOTE_STORE_ADDR, $REGRESS_DEBUG, $REMOTE_USER, $start_time, $end_time, + $db_name, $db_user, $db_password, $src, $tmpsrc, $HOST, $BASEPORT, $CLIENT); END { if ($estat || $rstat || $zstat || $bstat || $dstat) { @@ -80,6 +87,7 @@ BEGIN { $ENV{src} = $src = $ENV{src} || "$cwd/src"; $ENV{conf} = $conf = $ENV{conf} || $bin; $ENV{scripts} = $scripts = $ENV{scripts} || $bin; + $ENV{plugins} = $plugins = $ENV{plugins} || "$bin/plugins"; $ENV{tmpsrc} = $tmpsrc = $ENV{tmpsrc} || "$cwd/tmp/build"; $ENV{working} = $working = $ENV{working} || "$cwd/working"; $ENV{rscripts} = $rscripts = $ENV{rscripts} || "$cwd/scripts"; @@ -92,8 +100,36 @@ BEGIN { $ENV{REMOTE_PORT} = $REMOTE_PORT = $ENV{REMOTE_PORT} || 9102; $ENV{REMOTE_PASSWORD} = $REMOTE_PASSWORD = $ENV{REMOTE_PASSWORD} || "xxx"; $ENV{REMOTE_STORE_ADDR}=$REMOTE_STORE_ADDR=$ENV{REMOTE_STORE_ADDR} || undef; - - $estat = $rstat = $bstat = $zstat = 0; + $ENV{REMOTE_USER} = $REMOTE_USER = $ENV{REMOTE_USER} || undef; + $ENV{CLIENT} = $CLIENT = $ENV{CLIENT} || "$HOST-fd"; + $ENV{LANG} = 'C'; + $out = ($debug) ? '@tee' : '@out'; + + $TestName = basename($0); + + $dstat = $estat = $rstat = $bstat = $zstat = 0; +} + +# execute bconsole session +sub run_bconsole +{ + my $script = shift || "$tmp/bconcmds"; + return docmd("cat $script | $bin/bconsole -c $conf/bconsole.conf"); +} + +# create a file-list for many tests using +# <$cwd/tmp/file-list as fileset +sub add_to_backup_list +{ + open(FP, ">$tmp/file-list") or die "ERROR: Unable to open $tmp/file-list $@"; + foreach my $l (@_) { + if ($l =~ /\n$/) { + print FP $l; + } else { + print FP $l, "\n"; + } + } + close(FP); } sub cleanup @@ -102,24 +138,84 @@ sub cleanup return $? == 0; } +sub start_test +{ + $start_time = time(); + my $d = strftime('%R:%S', localtime($start_time)); + print "\n\n === Starting $TestName at $d ===\n"; +} + +sub end_test +{ + $end_time = time(); + my $t = strftime('%R:%S', localtime($end_time)); + my $d = strftime('%H:%M:%S', gmtime($end_time - $start_time)); + + if ( -f "$tmp/err.log") { + system("cat $tmp/err.log"); + } + + if ($estat != 0 || $zstat != 0 || $dstat != 0 || $bstat != 0 ) { + print " + !!!!! $TestName failed!!! $t $d !!!!! + Status: estat=$estat zombie=$zstat backup=$bstat restore=$rstat diff=$dstat\n"; + + if ($bstat != 0 || $rstat != 0) { + print " !!! Bad termination status !!!\n"; + } else { + print " !!! Restored files differ !!!\n"; + } + print " Status: backup=$bstat restore=$rstat diff=$dstat\n"; + print " Test owner of $ENV{SITE_NAME} is $ENV{EMAIL}\n"; + } else { + print "\n\n === Ending $TestName at $t ($d) ===\n\n"; + } +} + +# create a console command file, can handle a list +sub create_bconcmds +{ + open(FP, ">$tmp/bconcmds"); + map { print FP "$_\n"; } @_; + close(FP); +} + +# run a command +sub docmd +{ + my $cmd = shift; + system("sh -c '$cmd " . (($debug)?"":" >/dev/null") . "'"); + return $? == 0; +} + sub start_bacula { my $ret; - $ENV{LANG}='C'; - system("$bin/bacula start"); - $ret = $? == 0; - open(FP, ">$tmp/bcmd"); - print FP "sql\ntruncate client_group;\ntruncate client_group_member;\nupdate Media set LocationId=0;\ntruncate location;\n\n"; - close(FP); - system("cat $tmp/bcmd | $bin/bconsole >/dev/null"); + $ret = docmd("$bin/bacula start"); + + # cleanup bweb stuff + create_bconcmds('@out /dev/null', + 'sql', + 'truncate client_group;', + 'truncate client_group_member;', + 'update Media set LocationId=0;', + 'truncate location;', + ''); + run_bconsole(); return $ret; } sub stop_bacula { - $ENV{LANG}='C'; - system("$bin/bacula stop"); - return $? == 0; + return docmd("$bin/bacula stop"); +} + +sub get_dirname +{ + my $ret = `$bin/bdirjson -c $conf/bacula-dir.conf -l Name -r Director`; + if ($ret =~ /"Name": "(.+?)"/) { + print "$1\n"; + } } sub get_resource @@ -129,7 +225,7 @@ sub get_resource open(FP, $file) or die "Can't open $file"; my $content = join("", ); - if ($content =~ m/(^$type {[^}]+?Name\s*=\s*"?$name"?[^}]+?^})/ms) { + if ($content =~ m/(^$type \{[^}]+?Name\s*=\s*"?$name"?[^}]+?^\})/ms) { $ret = $1; } @@ -145,6 +241,83 @@ sub extract_resource } } +sub get_field_size +{ + my ($file, $field) = @_; + my $size=0; + + my $pattern=$field."\\s*([\\d,]+)"; + open(FP, $file) or die "ERROR: Can't open $file"; + + while () { + if (/$pattern/) { + $size=$1; + } + } + + close(FP); + + $size =~ s/,//g; + + print $size."\n"; +} + +sub get_field_ratio +{ + my ($file, $field) = @_; + my $ret=0; + my $ratio=0; + + my $pattern=$field."\\s*[\\d.]+%\\s+([\\d]+)\.[\\d]*:1"; # stop at the '.' + my $pattern2=$field."\\s*None"; + open(FP, $file) or die "ERROR: Can't open $file"; + + while () { + if (/$pattern/) { + $ratio=$1; + } + if (/$pattern2/) { + $ratio="None"; + } + } + + close(FP); + + $ratio =~ s/,//g; + + print $ratio."\n"; +} + + + +sub check_max_backup_size +{ + my ($file, $size) = @_; + my $ret=0; + my $s=0; + + open(FP, $file) or die "ERROR: Can't open $file"; + + while () { + + if (/FD Bytes Written: +([\d,]+)/) { + $s=$1; + } + } + + close(FP); + + $size =~ s/,//g; + + if ($s > $size) { + print "ERROR: backup too big ($s > $size)\n"; + $ret++; + } else { + print "OK\n"; + } + return $ret; +} + sub check_min_volume_size { my ($size, @vol) = @_; @@ -165,6 +338,37 @@ sub check_min_volume_size return $ret; } +# check_volumes("tmp/log1.out", "tmp/log2.out", ...) +sub check_volumes +{ + my @files = @_; + my %done; + unlink("$tmp/check_volumes.out"); + + foreach my $f (@files) { + open(FP, $f) or next; + while (my $f = ) + { + if ($f =~ /Wrote label to prelabeled Volume "(.+?)" on file device "(.+?)" \((.+?)\)/) { + if (!$done{$1}) { + $done{$1} = 1; + if (-f "$3/$1") { + system("$bin/bls -c $conf/bacula-sd.conf -j -E -V \"$1\" \"$2\" &>> $tmp/check_volumes.out"); + if ($? != 0) { + debug("Found problems for $1, traces are in $tmp/check_volumes.out"); + $estat = 1; + } + } + } + } + } + close(FP); + } + return $estat; +} + +# check if a volume is too big +# check_max_backup_size(10000, "vol1", "vol3"); sub check_max_volume_size { my ($size, @vol) = @_; @@ -185,13 +389,6 @@ sub check_max_volume_size return $ret; } -sub add_to_backup_list -{ - open(FP, ">>$tmp/file-list") or die "Can't open $tmp/file-list for update $!"; - print FP join("\n", @_); - close(FP); -} - # update client definition for the current test # it permits to test remote client sub update_client @@ -202,7 +399,7 @@ sub update_client open(FP, "$conf/bacula-dir.conf") or die "can't open source $!"; open(NEW, ">$tmp/bacula-dir.conf.$$") or die "can't open dest $!"; while (my $l = ) { - if (!$in_client && $l =~ /^Client {/) { + if (!$in_client && $l =~ /^Client \{/) { $in_client=1; } @@ -218,7 +415,7 @@ sub update_client $l = "Password = \"$new_passwd\"\n"; } - if ($in_client && $l =~ /^}/) { + if ($in_client && $l =~ /^\}/) { $in_client=0; } print NEW $l; @@ -230,6 +427,63 @@ sub update_client return $ret; } +# if you want to run this function more than 100 times, please, update this number +my $last_update = 100; + +# open a directory and update all files +sub update_some_files_rep +{ + my ($dest, $nbupdate)=@_; + my $t=rand(); + my $f; + my $nb=0; + my $nbdel=0; + my $total=0; + + if ($nbupdate) { + $last_update = $nbupdate; + unlink("$tmp/last_update"); + + } elsif (-f "$tmp/last_update") { + $last_update = `cat $tmp/last_update`; + chomp($last_update); + $last_update--; + if ($last_update == 0) { + $last_update = 100; + } + } + my $base = chr($last_update % 26 + 65); # We use a base directory A-Z + + system("sh -c 'echo $last_update > $tmp/last_update'"); + print "Update files in $dest\n"; + opendir(DIR, "$dest/$base") || die "$!"; + map { + $f = "$dest/$base/$_"; + if (($total++ % $last_update) == 0) { + if (-f $f) { + # We delete some of them, and we replace them later + if ((($nb + $nbdel) % 11) == 0) { + unlink($f); + $nbdel++; + + open(FP, ">$dest/$base/$last_update-$nbdel.txt") or die "$f $!"; + seek(FP, $last_update * 4000, 0); + print FP "$t update $f\n"; + close(FP); + + } else { + open(FP, ">>$f") or die "$f $!"; + print FP "$t update $f\n"; + close(FP); + $nb++; + } + } + } + } sort readdir(DIR); + closedir DIR; + print "$nb files updated, $nbdel deleted/created\n"; +} + # open a directory and update all files sub update_some_files { @@ -257,24 +511,27 @@ sub update_some_files # nb number of file to create # Example: # perl -Mscripts::functions -e 'create_many_files("$cwd/files", 100000)' +# perl -Mscripts::functions -e 'create_many_files("$cwd/files", 100000, 32000)' sub create_many_files { - my ($dest, $nb) = @_; + my ($dest, $nb, $sparse_size) = @_; my $base; my $dir=$dest; + $nb = $nb / 2; # We create 2 files per loop $nb = $nb || 750000; + $sparse_size = $sparse_size | 0; mkdir $dest; $base = chr($nb % 26 + 65); # We use a base directory A-Z # already done if (-f "$dest/$base/a${base}a${nb}aaa${base}") { - print "Files already created\n"; + debug("Files already created\n"); return; } # auto flush stdout for dots $| = 1; - print "Create $nb files into $dest\n"; + print "Create ", $nb * 2, " files into $dest\n"; for(my $i=0; $i < 26; $i++) { $base = chr($i + 65); mkdir("$dest/$base") if (! -d "$dest/$base"); @@ -282,10 +539,13 @@ sub create_many_files for(my $i=0; $i<=$nb; $i++) { $base = chr($i % 26 + 65); open(FP, ">$dest/$base/a${base}a${i}aaa$base") or die "$dest/$base $!"; + if ($sparse_size) { + seek(FP, $sparse_size + $i, 0); + } print FP "$i\n"; close(FP); - open(FP, ">$dir/b${base}a${i}csq$base") or die "$dir $!"; + open(FP, ">>$dir/b${base}a${i}csq$base") or die "$dir $!"; print FP "$base $i\n"; close(FP); @@ -298,6 +558,45 @@ sub create_many_files print "\n"; } +# BEEF +# create big number of files in a given directory +# Inputs: dest destination directory +# nb number of file to create +# Example: +# perl -Mscripts::functions -e 'create_many_files_size("$cwd/files", 100000)' +sub create_many_files_size +{ + my ($dest, $nb) = @_; + my $base; + my $dir=$dest; + $nb = $nb || 750000; + mkdir $dest; + $base = chr($nb % 26 + 65); # We use a base directory A-Z + + # already done + if (-f "$dest/$base/a${base}a${nb}aaa${base}") { + debug("Files already created\n"); + return; + } + + # auto flush stdout for dots + $| = 1; + print "Create $nb files into $dest\n"; + for(my $i=0; $i < 26; $i++) { + $base = chr($i + 65); + mkdir("$dest/$base") if (! -d "$dest/$base"); + } + for(my $i=0; $i<=$nb; $i++) { + $base = chr($i % 26 + 65); + open(FP, ">$dest/$base/a${base}a${i}aaa$base") or die "$dest/$base $!"; + print FP "$base" x $i; + close(FP); + + print "." if (!($i % 10000)); + } + print "\n"; +} + # create big number of dirs in a given directory # Inputs: dest destination directory # nb number of dirs to create @@ -314,7 +613,7 @@ sub create_many_dirs $base2 = chr(($nb+10) % 26 + 65); # already done if (-d "$dest/$base/$base2/$base/a${base}a${nb}aaa${base}") { - print "Files already created\n"; + debug("Files already created\n"); return; } @@ -350,6 +649,18 @@ sub check_encoding } } +sub set_global_maximum_concurrent_jobs +{ + my ($nb) = @_; + add_attribute("$conf/bacula-dir.conf", "MaximumConcurrentJobs", $nb, "Job"); + add_attribute("$conf/bacula-dir.conf", "MaximumConcurrentJobs", $nb, "Client"); + add_attribute("$conf/bacula-dir.conf", "MaximumConcurrentJobs", $nb, "Director"); + add_attribute("$conf/bacula-dir.conf", "MaximumConcurrentJobs", $nb, "Storage"); + add_attribute("$conf/bacula-sd.conf", "MaximumConcurrentJobs", $nb, "Storage"); + add_attribute("$conf/bacula-sd.conf", "MaximumConcurrentJobs", $nb, "Device"); + add_attribute("$conf/bacula-fd.conf", "MaximumConcurrentJobs", $nb, "FileDaemon"); +} + # You can change the maximum concurrent jobs for any config file # If specified, you can change only one Resource or one type of # resource at the time (optional) @@ -366,6 +677,47 @@ sub set_maximum_concurrent_jobs add_attribute($file, "Maximum Concurrent Jobs", $nb, $obj, $name); } +# You can comment out a directive +# comment_out('$conf/bacula-dir.conf', 'FDTimeout', 'Job', 'test'); +# comment_out('$conf/bacula-dir.conf', 'FDTimeout'); +sub comment_out +{ + my ($file, $attr, $obj, $name) = @_; + my ($cur_obj, $cur_name, $done); + + open(FP, ">$tmp/1.$$") or die "Can't write to $tmp/1.$$"; + open(SRC, $file) or die "Can't open $file"; + while (my $l = ) + { + if ($l =~ /^#/) { + print FP $l; + next; + } + + if ($l =~ /^(\w+) \{/) { + $cur_obj = $1; + $done=0; + } + + if ($l =~ /^\s*\Q$attr\E/i) { + if (!$obj || $cur_obj eq $obj) { + if (!$name || $cur_name eq $name) { + $l =~ s/^/##/; + $done=1 + } + } + } + + if ($l =~ /^\s*Name\s*=\s*"?([\w\d\.-]+)"?/i) { + $cur_name = $1; + } + print FP $l; + } + close(SRC); + close(FP); + copy("$tmp/1.$$", $file) or die "Can't copy $tmp/1.$$ to $file"; +} + # You can add option to a resource # add_attribute('$conf/bacula-dir.conf', 'FDTimeout', 1600, 'Director'); # add_attribute('$conf/bacula-dir.conf', 'FDTimeout', 1600, 'Storage', 'FileStorage'); @@ -374,6 +726,7 @@ sub add_attribute my ($file, $attr, $value, $obj, $name) = @_; my ($cur_obj, $cur_name, $done); + my $is_options = $obj && $obj eq 'Options'; open(FP, ">$tmp/1.$$") or die "Can't write to $tmp/1.$$"; open(SRC, $file) or die "Can't open $file"; while (my $l = ) @@ -383,7 +736,7 @@ sub add_attribute next; } - if ($l =~ /^(\w+) {/) { + if ($l =~ /^(\w+) \{/ || ($is_options && $l =~ /\s+(Options)\s*\{/)) { $cur_obj = $1; $done=0; } @@ -401,11 +754,20 @@ sub add_attribute $cur_name = $1; } - if ($l =~ /^}/) { + my $add_missing = 0; + if ($is_options) { + if ($l =~ /\}/) { + $add_missing = 1; + } + } elsif ($l =~ /^\}/) { + $add_missing = 1; + } + + if ($add_missing) { if (!$done) { - if ($cur_obj eq $obj) { + if ($cur_obj && $cur_obj eq $obj) { if (!$name || $cur_name eq $name) { - $l = " $attr = $value\n$l"; + $l =~ s/\}/\n $attr = $value\n\}/; } } } @@ -558,10 +920,56 @@ sub debug } } +sub p +{ + debug("\n################################################################", + @_, + "################################################################\n"); +} + +# check if binaries are OK +sub remote_check +{ + my $ret = 0; + my $path = "/opt/bacula/bin"; + print "INFO: check binaries\n"; + foreach my $b (qw/bacula-fd bacula-dir bconsole bdirjson bsdjson + bfdjson bbconsjson bacula-sd/) + { + if (-x "$path/$b") { + my $out = `$path/$b -? 2>&1`; + if ($out !~ /Version:/g) { + print "ERROR: with $b -?\n"; + system("$path/$b -?"); + $ret++; + } + } + } + foreach my $b (qw/bacula-sd/) + { + if (-r "$path/$b") { + my $libs = `ldd $path/$b`; + if ($libs !~ /tokyocabinet/g) { + print "ERROR: unable to find tokyocabinet for $b\n"; + print $libs; + $ret++; + } + } + } + + return $ret; +} + sub remote_config { open(FP, ">$REMOTE_FILE/bacula-fd.conf") or die "ERROR: Can't open $REMOTE_FILE/bacula-fd.conf $!"; + + my $plugins = '/opt/bacula/bin'; + if (-d '/opt/bacula/plugins') { + $plugins = '/opt/bacula/plugins'; + } + print FP " Director { Name = $HOST-dir @@ -572,6 +980,7 @@ FileDaemon { FDport = $REMOTE_PORT WorkingDirectory = $REMOTE_FILE/working Pid Directory = $REMOTE_FILE/working + Plugin Directory = $plugins Maximum Concurrent Jobs = 20 } Messages { @@ -603,6 +1012,9 @@ Messages { chmod $r++, $d; chown $<, $g, $d++; } + + # create a sparse file of 2MB + init_delta("$REMOTE_FILE/save", 2000000); # create a simple script to execute open(FP, ">test.sh") or die "Can't open test.sh $!"; @@ -633,25 +1045,108 @@ Messages { sub remote_diff { debug("Doing diff between save and restore"); - system("ssh $REMOTE_ADDR " . + system("ssh $REMOTE_USER$REMOTE_ADDR " . "$REMOTE_FILE/scripts/diff.pl -s $REMOTE_FILE/save -d $REMOTE_FILE/restore/$REMOTE_FILE/save"); $dstat = ($? != 0); } sub remote_stop { - debug("Kill remote bacula-fd"); - system("ssh $REMOTE_ADDR " . + debug("Kill remote bacula-fd $REMOTE_ADDR"); + system("ssh $REMOTE_USER$REMOTE_ADDR " . "'test -f $REMOTE_FILE/working/bacula-fd.$REMOTE_PORT.pid && " . "kill `cat $REMOTE_FILE/working/bacula-fd.$REMOTE_PORT.pid`'"); } sub remote_init { - system("ssh $REMOTE_ADDR mkdir -p '$REMOTE_FILE/scripts/'"); - system("scp -q scripts/functions.pm scripts/diff.pl $REMOTE_ADDR:$REMOTE_FILE/scripts/"); - system("scp -q config $REMOTE_ADDR:$REMOTE_FILE/"); + system("ssh $REMOTE_USER$REMOTE_ADDR mkdir -p '$REMOTE_FILE/scripts/'"); + system("scp -q scripts/functions.pm scripts/diff.pl $REMOTE_USER$REMOTE_ADDR:$REMOTE_FILE/scripts/"); + system("scp -q config $REMOTE_USER$REMOTE_ADDR:$REMOTE_FILE/"); debug("INFO: Configuring remote client"); - system("ssh $REMOTE_ADDR 'cd $REMOTE_FILE && perl -Mscripts::functions -e remote_config'"); + system("ssh $REMOTE_USER$REMOTE_ADDR 'cd $REMOTE_FILE && perl -Mscripts::functions -e remote_config'"); + system("ssh $REMOTE_USER$REMOTE_ADDR 'cd $REMOTE_FILE && perl -Mscripts::functions -e remote_check'"); +} + +sub create_binfile +{ + my ($file, $nb) = @_; + $nb |= 10; + + if (!open(FP, ">$file")) { + print "ERR\nCan't create txt $file $@\n"; + exit 1; + } + for (my $i = 0; $i < $nb ; $i++) { + foreach my $c ('a'..'z') { + my $l = ($c x 1024); + print FP $l; + } + } + close(FP); +} + +my $c = "a"; + +sub init_delta +{ + my ($source, $sparse_size) = @_; + + $sparse_size = $sparse_size || 100000000; + + # Create $source if needed + system("mkdir -p '$source'"); + + if (!chdir($source)) { + print "ERR\nCan't access to $source $!\n"; + exit 1; + } + + open(FP, ">text.txt") or return "ERR\nCan't create txt file $@\n"; + my $l = ($c x 80) . "\n"; + print FP $l x 40000; + close(FP); + + open(FP, ">prev"); + print FP $c, "\n"; + close(FP); + + open(FP, ">sparse.dat") or return "ERR\nCan't create sparse $@\n"; + seek(FP, $sparse_size, 0); + print FP $l; + close(FP); } + +sub update_delta +{ + my ($source) = shift; + + if (!chdir($source)) { + return "ERR\nCan't access to $source $!\n"; + } + + $c = `cat prev`; + chomp($c); + + open(FP, "+>text.txt") or return "ERR\nCan't update txt file $@\n"; + $c++; + my $l = ($c x 80) . "\n"; + print FP $l x 40000; + close(FP); + + open(FP, ">prev"); + print FP $c, "\n"; + close(FP); + + return "OK\n"; +} + 1; diff --git a/regress/scripts/get-os b/regress/scripts/get-os index b14b788022..a50cfc97c4 100755 --- a/regress/scripts/get-os +++ b/regress/scripts/get-os @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + SHELL=${SHELL:-/bin/sh} ac_aux_dir=scripts diff --git a/regress/scripts/new-test-bacula-dir.conf.in b/regress/scripts/new-test-bacula-dir.conf.in index 82e6030a1f..7ecb324b59 100644 --- a/regress/scripts/new-test-bacula-dir.conf.in +++ b/regress/scripts/new-test-bacula-dir.conf.in @@ -43,9 +43,24 @@ Job { Max Run Time = 30min Reschedule On Error = no Reschedule Interval = 10 - Reschedule Times = 1 + Reschedule Times = 5 } +Job { + Name = "Simple" + Type = Backup + Client=@hostname@-fd + FileSet="SimpleSet" + Storage = File + Messages = Standard + Pool = Default + Maximum Concurrent Jobs = 10 + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Max Run Time = 30min +# SpoolData=yes +} + + Job { Name = "MonsterSave" Type = Backup @@ -104,6 +119,19 @@ Job { Maximum Concurrent Jobs = 10 } +Job { + Name = "DeltaTest" + Type = Backup + Client=@hostname@-fd + FileSet="DeltaSet" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Max Run Time = 30min + Maximum Concurrent Jobs = 10 +} + Job { Name = "CompressedTest" Type = Backup @@ -132,6 +160,19 @@ Job { Maximum Concurrent Jobs = 10 } +Job { + Name = "vSphereTest" + Type = Backup + Client=@hostname@-fd + FileSet="vSphereSet" + Storage = File + Messages = Standard + Pool = Default + Maximum Concurrent Jobs = 10 + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Max Run Time = 30min +} + Job { Name = "LZOTest" Type = Backup @@ -245,6 +286,38 @@ FileSet { } } +FileSet { + Name = "SimpleSet" + Include { + Options { signature=MD5 } + File = <@tmpdir@/file-list + } +} + + +FileSet { + Name = vSphereSet + Include { + Options { + signature=MD5 + compression = GZIP1 + } + Plugin = "vsphere: host=@VSPHERE_HOST1@" + } +} + +FileSet { + Name = vSphereSet2 + Include { + Options { + signature=MD5 + compression = GZIP1 + } + Plugin = "vsphere: host=@VSPHERE_HOST1@" + Plugin = "vsphere: host=@VSPHERE_HOST2@" + } +} + FileSet { Name = "SparseSet" Include { @@ -261,7 +334,8 @@ FileSet { Include { Options { signature=MD5 - compression=GZIP + compression=GZIP + onefs=no } File = <@tmpdir@/file-list } @@ -278,6 +352,17 @@ FileSet { } } +FileSet { + Name = "DeltaSet" + Include { + Options { + signature=MD5 + plugin = delta + } + File = <@tmpdir@/file-list + } +} + FileSet { Name = "FIFOSet" Include { @@ -483,6 +568,16 @@ Storage { Heartbeat Interval = 330 } +Storage { + Name = File2 + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" + Device = FileStorage2 + Media Type = File + Maximum Concurrent Jobs = 10 + Heartbeat Interval = 330 +} # Definition of DLT tape storage device #Storage { @@ -564,5 +659,5 @@ Pool { # Label Format = "TEST-${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}:${NumVols}" # Simple Label Format = "Backup-" # Maximum Volume Jobs = 1 -# Maximum Volume Bytes = 512000 +# Maximum Volume Bytes = 1500000 } diff --git a/regress/scripts/plugin-test-bacula-dir.conf.in b/regress/scripts/plugin-test-bacula-dir.conf.in deleted file mode 100644 index db1badd96f..0000000000 --- a/regress/scripts/plugin-test-bacula-dir.conf.in +++ /dev/null @@ -1,514 +0,0 @@ -# -# Default Bacula Director Configuration file -# -# The only thing that MUST be changed is to add one or more -# file or directory names in the Include directive of the -# FileSet resource. -# -# For Bacula release 1.39 or later -# -# You might also want to change the default email address -# from root to your address. See the "mail" and "operator" -# directives in the Messages resource. -# - -Director { # define myself - Name = @hostname@-dir - DIRPort = @dirport@ # where we listen for UA connections - QueryFile = "@scriptdir@/query.sql" - WorkingDirectory = "@working_dir@" - PidDirectory = "@piddir@" - SubSysDirectory = "@subsysdir@" - PluginDirectory = "@sbindir@/plugins" - Maximum Concurrent Jobs = 4 - Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" # Console password - Messages = Standard -} - -# -# Define the main nightly save backup job -# By default, this job will back up to disk in @tmpdir@ -Job { - Name = "NightlySave" - Type = Backup - Client=@hostname@-fd - FileSet="Full Set" - Storage = File - Messages = Standard - Pool = Default - Write Bootstrap = "@working_dir@/NightlySave.bsr" - Maximum Concurrent Jobs = 4 - SpoolData=yes -} - -Job { - Name = "MonsterSave" - Type = Backup - Client=@hostname@-fd - FileSet="Full Set" - Storage = File1 - Messages = Standard - Pool = Default - Write Bootstrap = "@working_dir@/NightlySave.bsr" -} - -Job { - Name = "MonsterFileSet" - Type = Backup - Client=@hostname@-fd - FileSet="MonsterFileSet" - Storage = File - Messages = Standard - Pool = Default - Maximum Concurrent Jobs = 4 - Write Bootstrap = "@working_dir@/NightlySave.bsr" -} - - - -Job { - Name = "VerifyVolume" - Type = Verify - Level = VolumeToCatalog - Client=@hostname@-fd - FileSet="Full Set" - Storage = File - Messages = Standard - Pool = Default - Write Bootstrap = "@working_dir@/NightlySave.bsr" -} - - -Job { - Name = "SparseTest" - Type = Backup - Client=@hostname@-fd - FileSet="SparseSet" - Storage = File - Messages = Standard - Pool = Default - Write Bootstrap = "@working_dir@/NightlySave.bsr" -} - -Job { - Name = "CompressedTest" - Type = Backup - Client=@hostname@-fd - FileSet="CompressedSet" - Storage = File - Messages = Standard - Pool = Default - Maximum Concurrent Jobs = 4 - Write Bootstrap = "@working_dir@/NightlySave.bsr" -} - -Job { - Name = "SparseCompressedTest" - Type = Backup - Client=@hostname@-fd - FileSet="SparseCompressedSet" - Storage = File - Messages = Standard - Pool = Default - Write Bootstrap = "@working_dir@/NightlySave.bsr" -} - -Job { - Name = "pluginTest" - Type = Backup - Client=@hostname@-fd - FileSet="pluginSet" - Storage = File - Messages = Standard - Pool = Default - Write Bootstrap = "@working_dir@/NightlySave.bsr" -} - -Job { - Name = "TestPluginTest" - Type = Backup - Client=@hostname@-fd - FileSet="TestPluginSet" - Storage = File - Messages = Standard - Pool = Default - Write Bootstrap = "@working_dir@/NightlySave.bsr" -} - - -# Backup the catalog database (after the nightly save) -Job { - Name = "BackupCatalog" - Type = Backup - Client=@hostname@-fd - FileSet="Catalog" -# Schedule = "WeeklyCycleAfterBackup" - Storage = File - Messages = Standard - Pool = Default - # This creates an ASCII copy of the catalog - RunBeforeJob = "@sbindir@/make_catalog_backup -u regress" - # This deletes the copy of the catalog - RunAfterJob = "@sbindir@/delete_catalog_backup" - Write Bootstrap = "@working_dir@/BackupCatalog.bsr" -} - -JobDefs { - Name = "BackupJob" - Type = Backup - Pool = Default - Storage = File - Messages = Standard - Priority = 10 -} - -Job { - JobDefs = "BackupJob" - Name = "bug621-job-1" - Client = @hostname@-fd - FileSet="Full Set" - ClientRunBeforeJob = "sleep 5" -} - -Job { - JobDefs = "BackupJob" - Name = "bug621-job-2" - Client = @hostname@-fd - FileSet = "Full Set" - Max Run Time = 30 - Priority = 15 -} - - -# Standard Restore template, to be changed by Console program -Job { - Name = "RestoreFiles" - Type = Restore - Client=@hostname@-fd - FileSet="Full Set" - Storage = File - Messages = Standard - Pool = Default - Where = @tmpdir@/bacula-restores -} - - -# List of files to be backed up -FileSet { - Name = "Full Set" - Include { - Options { signature=MD5; sparse=yes } - File = <@tmpdir@/file-list - } -} - -FileSet { - Name = "SparseSet" - Include { - Options { - signature=MD5 - sparse=yes - } - File = <@tmpdir@/file-list - } -} - -FileSet { - Name = "CompressedSet" - Include { - Options { - signature=MD5 - compression=GZIP - } - File = <@tmpdir@/file-list - } -} - -FileSet { - Name = "pluginSet" - Include { - Options { - readfifo = yes - signature=MD5 - } - File = <@tmpdir@/file-list - Plugin = "bpipe:/@bpipe@/encrypt-bug.jpg:cat @builddir@/../encrypt-bug.jpg:cat >@tmpdir@/encrypt-bug.jpg" - Plugin = "bpipe:/@bpipe@/Makefile:cat @builddir@/../Makefile:cat >@tmpdir@/Makefile" - } -} - -FileSet { - Name = "TestPluginSet" - Include { - Options { - readfifo = yes - signature=MD5 - } - File = <@tmpdir@/file-list - Plugin = "test-plugin:/@test-plugin@/encrypt-bug.jpg:cat @builddir@/../encrypt-bug.jpg:cat >@tmpdir@/encrypt-bug.jpg" - Plugin = "test-plugin:/@test-plugin@/Makefile:cat @builddir@/../Makefile:cat >@tmpdir@/Makefile" - } -} - - - -FileSet { - Name = "SparseCompressedSet" - Include { - Options { - signature=MD5 - compression=GZIP - sparse=yes - } - File = <@tmpdir@/file-list - } -} - -FileSet { - Name = "MonsterFileSet" - Include { - Options { - signature = MD5 - noatime = yes - ignore case = yes - Exclude = yes - RegexDir = "Cache" - RegexDir = "Windows Defender" - RegexDir = "Temporary Internet Files" - RegexDir = "bacula" - RegexDir = "Temp" - - RegexDir = "ATI Technologies" - - RegexDir = "wmdownloads" - RegexDir = "My Music" - RegexDir = "iTunes" - RegexDir = "Cookies" - - RegexFile = "desktop.ini" - RegexFile = "thumbs.db" - RegexFile = "acrobat7.exe" - RegexFile = "acr6win.exe" - RegexFile = "AdbeRdr70_enu_full.exe" - RegexFile = "antivirus10_1_5.exe" - #thunderbird lock file - RegexFile = "parent.lock" - - RegexDir = "Retrospect Restore Points" - - #exclude i386 director of windows installer files - WildDir = "[A-Z]:/i386" - - # Exclude Mozilla-based programs' file caches - WildDir = "[A-Z]:/Documents and Settings/*/Application Data/*/Profiles/*/*/ImapMail" - WildDir = "[A-Z]:/Users/*/Application Data/*/Profiles/*/*/ImapMail" - - # Exclude user's registry files - they're always in use anyway. - WildFile = "[A-Z]:/Documents and Settings/*/Local Settings/Application Data/Microsoft/Windows/usrclass.*" - WildFile = "[A-Z]:/Users/*/Local Settings/Application Data/Microsoft/Windows/usrclass.*" - WildFile = "[A-Z]:/Documents and Settings/*/ntuser.*" - WildFile = "[A-Z]:/Users/*/ntuser.*" - - WildDir = "[A-Z]:/Documents and Settings/*/Recent" - WildDir = "[A-Z]:/Users/*/Recent" - - WildDir = "[A-Z]:/Documents and Settings/*/Local Settings/History" - WildDir = "[A-Z]:/Users/*/Local Settings/History" - - # These are always open and unable to be backed up - WildFile = "[A-Z]:/Documents and Settings/All Users/Application Data/Microsoft/Network/Downloader/qmgr[01].dat" - WildFile = "[A-Z]:/Users/All Users/Application Data/Microsoft/Network/Downloader/qmgr[01].dat" - - #Exclude all of Windows... - WildDir = "[A-Z]:/windows" - WildDir = "[A-Z]:/winnt" - WildDir = "[A-Z]:/winxp" - WildDir = "[A-Z]:/win" - - #symantec antivirus app stuff - WildDir = "[A-Z]:/*/Symantec*" - - #system volume information - WildDir = "[A-Z]:/System Volume Information" - - WildFile = "*.tmp" - # ghost image and spanning files - WildFile = "*.gho" - WildFile = "*.ghs" - - # Recycle bins - WildDir = "[A-Z]:/RECYCLER" - WildDir = "[A-Z]:/RECYCLER" - WildDir = "[A-Z]:/RECYCLED" - WildDir = "[A-Z]:/$RECYCLE.BIN" - - # Swap files - WildFile = "[A-Z]:/pagefile.sys" - - # These are programs and are easier to reinstall than restore from - # backup - WildDir = "[A-Z]:/cygwin" - WildDir = "[A-Z]:/Program Files/Adobe/Acrobat 7.0" - WildDir = "[A-Z]:/Program Files/Adobe/Acrobat 8.0" - - WildDir = "[A-Z]:/Program Files/Common Files/Software Center" - WildDir = "[A-Z]:/Software Center" - - WildDir = "[A-Z]:/Program Files/Grisoft" - WildDir = "[A-Z]:/Program Files/Java" - WildDir = "[A-Z]:/Program Files/Java Web Start" - WildDir = "[A-Z]:/Program Files/JavaSoft" - WildDir = "[A-Z]:/Program Files/Microsoft Office" - WildDir = "[A-Z]:/Program Files/Mozilla Firefox" - WildDir = "[A-Z]:/Program Files/Mozilla Thunderbird" - WildDir = "[A-Z]:/Program Files/mozilla.org" - WildDir = "[A-Z]:/Program Files/OpenOffice*" - } - File = <@tmpdir@/file-list - } -} - - -# -# When to do the backups, full backup on first sunday of the month, -# differential (i.e. incremental since full) every other sunday, -# and incremental backups other days -Schedule { - Name = "WeeklyCycle" - Run = Level=Full 1st sun at 1:05 - Run = Level=Differential 2nd-5th sun at 1:05 - Run = Level=Incremental mon-sat at 1:05 -} - -# This schedule does the catalog. It starts after the WeeklyCycle -Schedule { - Name = "WeeklyCycleAfterBackup" - Run = Level=Full sun-sat at 1:10 -} - -# This is the backup of the catalog -FileSet { - Name = "Catalog" - Include { - Options { - signature=MD5 - } - File = /home/kern/bacula/regress/bin/working/bacula.sql - } -} - -# Client (File Services) to backup -Client { - Name = @hostname@-fd - Address = @hostname@ - FDPort = @fdport@ - Catalog = MyCatalog - Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" # password for FileDaemon - File Retention = 30d # 30 days - Job Retention = 180d # six months - AutoPrune = yes # Prune expired Jobs/Files - Maximum Concurrent Jobs = 4 -} - -# Definiton of file storage device -Storage { - Name = File - Address = @hostname@ # N.B. Use a fully qualified name here - SDPort = @sdport@ - Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" - Device = FileStorage - Media Type = File - Maximum Concurrent Jobs = 4 -} - -Storage { - Name = File1 - Address = @hostname@ # N.B. Use a fully qualified name here - SDPort = @sdport@ - Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" - Device = FileStorage1 - Media Type = File1 - Maximum Concurrent Jobs = 4 -} - - -# Definition of DLT tape storage device -#Storage { -# Name = DLTDrive -# Address = @hostname@ # N.B. Use a fully qualified name here -# SDPort = @sdport@ -# Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" # password for Storage daemon -# Device = "HP DLT 80" # must be same as Device in Storage daemon -# Media Type = DLT8000 # must be same as MediaType in Storage daemon -#} - -# Definition of DDS tape storage device -#Storage { -# Name = SDT-10000 -# Address = @hostname@ # N.B. Use a fully qualified name here -# SDPort = @sdport@ -# Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" # password for Storage daemon -# Device = SDT-10000 # must be same as Device in Storage daemon -# Media Type = tape # must be same as MediaType in Storage daemon -#} - -# Definition of 8mm tape storage device -#Storage { -# Name = "8mmDrive" -# Address = @hostname@ # N.B. Use a fully qualified name here -# SDPort = @sdport@ -# Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" -# Device = "Exabyte 8mm" -# MediaType = "8mm" -#} - - -# Generic catalog service -Catalog { - Name = MyCatalog - @libdbi@ - dbname = @db_name@; user = @db_user@; password = "@db_password@" -} - -# Reasonable message delivery -- send most everything to email address -# and to the console -Messages { - Name = Standard - mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: %t %e of %c %l\" %r" - operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: Intervention needed for %j\" %r" -# MailOnError = @job_email@ = all -# operator = @job_email@ = mount - console = all, !skipped, !terminate, !restored -# -# WARNING! the following will create a file that you must cycle from -# time to time as it will grow indefinitely. However, it will -# also keep all your messages if the scroll off the console. -# - append = "@working_dir@/log" = all, !skipped - catalog = all, !skipped -} - -Messages { - Name = NoEmail - mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: %t %e of %c %l\" %r" - console = all, !skipped, !terminate -# -# WARNING! the following will create a file that you must cycle from -# time to time as it will grow indefinitely. However, it will -# also keep all your messages if the scroll off the console. -# - append = "@working_dir@/log" = all, !skipped - catalog = all, !skipped -} - - -# Default pool definition -Pool { - Name = Default - Pool Type = Backup - Recycle = yes # Bacula can automatically recycle Volumes - AutoPrune = yes # Prune expired volumes - Volume Retention = 365d # one year -# Label Format = "TEST-${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}:${NumVols}" -# Maximum Volume Jobs = 1 -} diff --git a/regress/scripts/prepare-disk-changer b/regress/scripts/prepare-disk-changer index d0cce463ac..8985539d3f 100755 --- a/regress/scripts/prepare-disk-changer +++ b/regress/scripts/prepare-disk-changer @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Create fresh virtual disk changer directory # diff --git a/regress/scripts/prepare-fake-autochanger.in b/regress/scripts/prepare-fake-autochanger.in index f272635142..9bf81443ba 100644 --- a/regress/scripts/prepare-fake-autochanger.in +++ b/regress/scripts/prepare-fake-autochanger.in @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # This script will prepare a big dummy autochanger # diff --git a/regress/scripts/prepare-other-loc b/regress/scripts/prepare-other-loc index fddd355e93..e70b6e6b1e 100755 --- a/regress/scripts/prepare-other-loc +++ b/regress/scripts/prepare-other-loc @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + . scripts/functions @@ -11,4 +16,8 @@ sed "s:BACFDBIN=$cwd/bin:BACFDBIN=$bin:" $SCR-fd > tmp/1 mv tmp/1 $SCR-fd chmod -x $cwd/bin/bacula-fd $cwd/bin/bacula-sd $cwd/bin/bacula-dir $cwd/bin/bconsole chmod +x $SCR-* +if [ x$plugins != x ]; then + mv $cwd/bin/plugins $cwd/bin/plugins.org + ln -s $plugins $cwd/bin/plugins +fi diff --git a/regress/scripts/prepare-two-tapes.in b/regress/scripts/prepare-two-tapes.in index 5d06bdca46..c91864a7d8 100755 --- a/regress/scripts/prepare-two-tapes.in +++ b/regress/scripts/prepare-two-tapes.in @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Cleanup left over files -- both before and after test run # diff --git a/regress/scripts/pretest b/regress/scripts/pretest index 08f2423828..06c1ebe575 100755 --- a/regress/scripts/pretest +++ b/regress/scripts/pretest @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Test if daemons start # diff --git a/regress/scripts/reboot_win32 b/regress/scripts/reboot_win32 deleted file mode 100755 index 4dacee8b02..0000000000 --- a/regress/scripts/reboot_win32 +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh - -. scripts/functions - -URL=http://$WIN32_ADDR:8091 -wget -qO $tmp/start.log "$URL/reboot" - -# we need a way to start the regress-win32.pl at the start -while ! ping -c 1 $WIN32_ADDR > /dev/null; do - sleep 5 -done -echo "Machine $URL supposedly rebooted" - -echo "If the autologon doesn't work, you can double click on c:\\autologon.reg" -i=0 -while ! wget -qO /dev/null $URL/nop; do - sleep 5 - i=`expr $i + 1` - if [ $i -ge 12 ]; then # print message every minute - i=0 - echo "== `date +%T` Waiting for reboot and autologin to $URL, you can also login and start regress-win32.pl by hand" - fi -done diff --git a/regress/scripts/regress-config.in b/regress/scripts/regress-config.in index 066d23a367..d31cd0e60d 100755 --- a/regress/scripts/regress-config.in +++ b/regress/scripts/regress-config.in @@ -1,7 +1,7 @@ #!/bin/sh # -# License: LGPLv2 -# Author: Kern Sibbald +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # # This is the configuration script for regression testing # diff --git a/regress/scripts/regress-win32.pl b/regress/scripts/regress-win32.pl deleted file mode 100644 index 6efdb3d651..0000000000 --- a/regress/scripts/regress-win32.pl +++ /dev/null @@ -1,1054 +0,0 @@ -#!/usr/bin/perl -w - -=head1 NAME - - regress-win32.pl -- Helper for Windows regression tests - -=head2 DESCRIPTION - - This perl script permits to run test Bacula Client Daemon on Windows. - It allows to: - - stop/start/upgrade the Bacula Client Daemon - - compare to subtree with checksums, attribs and ACL - - create test environments - -=head2 USAGE - - X:\> regress-win32.pl [-b basedir] [-i ip_address] [-p c:/bacula] - or - X:\> perl regress-win32.pl ... - - -b|--base=path Where to find regress and bacula directories - -i|--ip=ip Restrict access to this tool to this ip address - -p|--prefix=path Path to the windows installation - -h|--help Print this help - -=head2 EXAMPLE - - regress-win32.pl -b z:/git # will find z:/git/regress z:/git/bacula - - regress-win32.pl -i 192.168.0.1 -b z: - -=head2 INSTALL - - This perl script needs a Perl distribution on the Windows Client - (http://strawberryperl.com) - - You need to have the following subtree on x: - x:/ - bacula/ - regress/ - - This script requires perl to work (http://strawberryperl.com), and by default - it assumes that Bacula is installed in the standard location. Once it's - started on the windows, you can do remote commands like: - - start the service - - stop the service - - edit the bacula-fd.conf to change the director and password setting - - install a new binary version (not tested, no plugin support) - - create weird files and directories - - create files with windows attributes - - compare two directories (with md5) - - - To test it, you can follow this procedure - On the windows box: - - install perl from http://strawberryperl.com on windows - - copy or export regress directory somewhere on your windows - You can use a network share to your regress directory on linux - Then, copy a link to this script to your desktop - And double-click on it, and always open .pl file with perl.exe - - - If you export the regress directory to your windows box and you - make windows binaries available, this script can update bacula version. - You need to put your binaries on: - regress/release32 and regress/release64 - or - regress/build/src/win32/release32 and regress/build/src/win32/release64 - - - start the regress/scripts/regress-win32.pl (open it with perl.exe) - - create $WIN32_FILE - - make sure that the firewall is well configured or just disabled (needs - bacula and 8091/tcp) - - On Linux box: - - edit config file to fill the following variables - - WIN32_CLIENT="win2008-fd" - # Client FQDN or IP address - WIN32_ADDR="192.168.0.6" - # File or Directory to backup. This is put in the "File" directive - # in the FileSet - WIN32_FILE="c:/tmp" - # Port of Win32 client - WIN32_PORT=9102 - # Win32 Client password - WIN32_PASSWORD="xxx" - # will be the ip address of the linux box - WIN32_STORE_ADDR="192.168.0.1" - # set for autologon - WIN32_USER=Administrator - WIN32_PASS=password - # set for MSSQL - WIN32_MSSQL_USER=sa - WIN32_MSSQL_PASS=pass - - type make setup - - run ./tests/backup-bacula-test to be sure that everything is ok - - start ./tests/win32-fd-test - - I'm not very happy with this script, but it works :) - -=cut - -use strict; -use HTTP::Daemon; -use HTTP::Status; -use HTTP::Response; -use HTTP::Headers; -use File::Copy; -use Pod::Usage; -use Cwd 'chdir'; -use File::Find; -use Digest::MD5; -use Getopt::Long ; -use POSIX; -use File::Basename qw/dirname/; - -my $base = 'x:'; -my $src_ip = ''; -my $help; -my $bacula_prefix="c:/Program Files/Bacula"; -my $conf = "C:/Documents and Settings/All Users/Application Data/Bacula"; -GetOptions("base=s" => \$base, - "help" => \$help, - "prefix=s" => \$bacula_prefix, - "ip=s" => \$src_ip); - -if ($help) { - pod2usage(-verbose => 2, - -exitval => 0); -} - -if (! -d $bacula_prefix) { - print "regress-win32.pl: Could not find Bacula installation dir $bacula_prefix\n"; - print "regress-win32.pl: Won't be able to upgrade the version or modify the configuration\n"; -} - -if (-f "$bacula_prefix/bacula-fd.conf" and -f "$conf/bacula-fd.conf") { - print "regress-win32.pl: Unable to determine bacula-fd location $bacula_prefix or $conf ?\n"; - -} elsif (-f "$bacula_prefix/bacula-fd.conf") { - $conf = $bacula_prefix; -} - -#if (! -d "$base/bacula" || ! -d "$base/regress") { -# pod2usage(-verbose => 2, -# -exitval => 1, -# -message => "Can't find bacula or regress dir on $base\n"); -#} - -# stop the fd service -sub stop_fd -{ - return `net stop bacula-fd`; -} - -my $arch; -my $bin_path; -sub find_binaries -{ - if ($_ =~ /bacula-fd.exe/i) { - if ($File::Find::dir =~ /release$arch/) { - $bin_path = $File::Find::dir; - } - } -} - -# copy binaries for a new fd -# to work, you need to mount the regress directory -sub install_fd -{ - my ($r) = shift; - if ($r->url !~ m!^/install$!) { - return "ERR\nIncorrect url: " . $r->url . "\n"; - } - - if (-d "c:/Program Files (x86)") { - $arch = "64"; - } else { - $arch = "32"; - } - - # X:/regress/scripts/regress-win32.pl - # X:/scripts/regress-win32.pl - # perl script location - - my $dir = dirname(dirname($0)); - print "searching bacula-fd.exe in $dir\n"; - find(\&find_binaries, ("$dir\\build\\src\\win32\\release$arch", - "$dir\\release$arch")); - - if (!$bin_path) { - return "ERR\nCan't find bacula-fd.exe in $dir\n"; - } - - print "Found binaries in $bin_path\n"; - - stop_fd(); - - system("del \"c:\\Program Files\\bacula\\bacula.dll\""); - system("del \"c:\\Program Files\\bacula\\bacula-fd.exe\""); - system("del \"c:\\Program Files\\bacula\\plugins\\vss-fd.dll\""); - - my $ret="Ok\n"; - - copy("$bin_path/bacula-fd.exe", - "c:/Program Files/bacula/bacula-fd.exe") or $ret="ERR\n$!\n"; - - copy("$bin_path/bacula.dll", - "c:/Program Files/bacula/bacula.dll") or $ret="ERR\n$!\n"; - - copy("$bin_path/vss-fd.dll", - "c:/Program Files/bacula/plugins/vss-fd.dll") or $ret="ERR\n$!\n"; - - start_fd(); - return "OK\n"; -} - -# start the fd service -sub start_fd -{ - return `net start bacula-fd`; -} - -# initialize the weird directory for runscript test -sub init_weird_runscript_test -{ - my ($r) = shift; - - if ($r->url !~ m!^/init_weird_runscript_test\?source=(\w:/[\w\d\-\./]+)$!) { - return "ERR\nIncorrect url: ". $r->url . "\n"; - } - my $source = $1; - - # Create $source if needed - my $tmp = $source; - $tmp =~ s:/:\\:g; - system("mkdir $tmp"); - - if (!chdir($source)) { - return "ERR\nCan't access to $source $!\n"; - } - - if (-d "weird_runscript") { - system("rmdir /Q /S weird_runscript"); - } - - mkdir("weird_runscript"); - if (!chdir("weird_runscript")) { - return "ERR\nCan't access to $source $!\n"; - } - - open(FP, ">test.bat") or return "ERR\n"; - print FP "\@echo off\n"; - print FP "echo hello \%1\n"; - close(FP); - - copy("test.bat", "test space.bat") or return "ERR\n"; - copy("test.bat", "test2 space.bat") or return "ERR\n"; - copy("test.bat", "testé.bat") or return "ERR\n"; - - mkdir("dir space") or return "ERR\n"; - copy("test.bat", "dir space") or return "ERR\n"; - copy("testé.bat","dir space") or return "ERR\n"; - copy("test2 space.bat", "dir space") or return "ERR\n"; - - mkdir("Évoilà") or return "ERR\n"; - copy("test.bat", "Évoilà") or return "ERR\n"; - copy("testé.bat","Évoilà") or return "ERR\n"; - copy("test2 space.bat", "Évoilà") or return "ERR\n"; - - mkdir("Éwith space") or return "ERR\n"; - copy("test.bat", "Éwith space") or return "ERR\n"; - copy("testé.bat","Éwith space") or return "ERR\n"; - copy("test2 space.bat", "Éwith space") or return "ERR\n"; - mkdir("a"x200); - copy("test.bat", "a"x200); - system("mklink /J junc " . "a"x200); # TODO: need something for win2003 - link("test.bat", "link.bat"); - return "OK\n"; -} - -# init the Attrib test by creating some files and settings attributes -sub init_attrib_test -{ - my ($r) = shift; - - if ($r->url !~ m!^/init_attrib_test\?source=(\w:/[\w/]+)$!) { - return "ERR\nIncorrect url: " . $r->url . "\n"; - } - - my $source = $1; - system("mkdir $source"); - - if (!chdir($source)) { - return "ERR\nCan't access to $source $!\n"; - } - - # cleanup the old directory if any - if (-d "attrib_test") { - system("rmdir /Q /S attrib_test"); - } - - mkdir("attrib_test"); - chdir("attrib_test"); - - mkdir("hidden"); - mkdir("hidden/something"); - system("attrib +H hidden"); - - mkdir("readonly"); - mkdir("readonly/something"); - system("attrib +R readonly"); - - mkdir("normal"); - mkdir("normal/something"); - system("attrib -R -H -S normal"); - - mkdir("system"); - mkdir("system/something"); - system("attrib +S system"); - - mkdir("readonly_hidden"); - mkdir("readonly_hidden/something"); - system("attrib +R +H readonly_hidden"); - - my $ret = `attrib /S /D`; - $ret = strip_base($ret, $source); - - return "OK\n$ret\n"; -} - -sub md5sum -{ - my $file = shift; - open(FILE, $file) or return "Can't open $file $!"; - binmode(FILE); - return Digest::MD5->new->addfile(*FILE)->hexdigest; -} - -# set $src and $dst before using Find call -my ($src, $dst); -my $error=""; -sub wanted -{ - my $f = $File::Find::name; - $f =~ s!^\Q$src\E/?!!i; - - if (-f "$src/$f") { - if (! -f "$dst/$f") { - $error .= "$dst/$f is missing\n"; - } else { - my $a = md5sum("$src/$f"); - my $b = md5sum("$dst/$f"); - if ($a ne $b) { - $error .= "$src/$f $a\n$dst/$f $b\n"; - } - } - } -} - -sub create_schedtask -{ - my ($r) = shift; - if ($r->url !~ m!^/create_schedtask\?name=([\w\d\-.]+)$!) { - return "ERR\nIncorrect url: " . $r->url . "\n"; - } - my $ret=''; - my ($task,$pass) = ($1, $2); - my (undef, undef, $version, undef) = POSIX::uname(); - if ($version < 6) { # win2003 - $ret = `echo pass | SCHTASKS /Create /TN $task /SC ONLOGON /TR C:\\windows\\system32\\calc.exe /F 2>&1`; - } else { - $ret=`SCHTASKS /Create /TN $task /SC ONLOGON /F /TR C:\\windows\\system32\\calc.exe`; - } - - if ($ret =~ /SUCCESS|has been created/) { - return "OK\n$ret"; - } else { - return "ERR\n$ret"; - } -# -# SCHTASKS /Create [/S system [/U username [/P [password]]]] -# [/RU username [/RP password]] /SC schedule [/MO modifier] [/D day] -# [/M months] [/I idletime] /TN taskname /TR taskrun [/ST starttime] -# [/RI interval] [ {/ET endtime | /DU duration} [/K] [/XML xmlfile] [/V1]] -# [/SD startdate] [/ED enddate] [/IT | /NP] [/Z] [/F] -} - -sub del_schedtask -{ - my ($r) = shift; - if ($r->url !~ m!^/del_schedtask\?name=([\w\d\-.]+)$!) { - return "ERR\nIncorrect url: " . $r->url . "\n"; - } - my ($task) = ($1); - my $ret=`SCHTASKS /Delete /TN $task /F`; - - if ($ret =~ /SUCCESS/) { - return "OK\n$ret"; - } else { - return "ERR\n$ret"; - } -} - -sub check_schedtask -{ - my ($r) = shift; - if ($r->url !~ m!^/check_schedtask\?name=([\w\d\-.]+)$!) { - return "ERR\nIncorrect url: " . $r->url . "\n"; - } - - my ($task) = ($1); - my (undef, undef, $version, undef) = POSIX::uname(); - my $ret; - if ($version < 6) { # win2003 - $ret=`SCHTASKS /Query`; - } else { - $ret=`SCHTASKS /Query /TN $task`; - } - - if ($ret =~ /^($task .+)$/m) { - return "OK\n$1\n"; - } else { - return "ERR\n$ret"; - } -} - -sub set_director_name -{ - my ($r) = shift; - - if ($r->url !~ m!^/set_director_name\?name=([\w\d\.\-]+);pass=([\w\d+\-\.*]+)$!) - { - return "ERR\nIncorrect url: " . $r->url . "\n"; - } - - my ($name, $pass) = ($1, $2); - - open(ORG, "$conf/bacula-fd.conf") or return "ERR\nORG $!\n"; - open(NEW, ">$conf/bacula-fd.conf.new") or return "ERR\nNEW $!\n"; - - my $in_dir=0; # don't use monitoring section - my $nb_dir=""; - while (my $l = ) - { - if ($l =~ /^\s*Director\s+{/i) { - print NEW $l; - $in_dir = 1; - } elsif ($l =~ /^(\s*)Name\s*=/ and $in_dir) { - print NEW "${1}Name=$name$nb_dir\n"; - } elsif ($l =~ /^(\s*)Password\s*=/ and $in_dir) { - print NEW "${1}Password=$pass\n"; - } elsif ($l =~ /#(\s*Plugin.*)$/) { - print NEW $1; - } elsif ($l =~ /\s*}/ and $in_dir) { - print NEW $l; - $in_dir = 0; - $nb_dir++; - } else { - print NEW $l; - } - } - - close(ORG); - close(NEW); - move("$conf/bacula-fd.conf.new", "$conf/bacula-fd.conf") - and return "OK\n"; - - return "ERR\nCan't set the director name\n"; -} - -# convert \ to / and strip the path -sub strip_base -{ - my ($data, $path) = @_; - $data =~ s!\\!/!sg; - $data =~ s!\Q$path!!sig; - return $data; -} - -# Compare two directories, make checksums, compare attribs and ACLs -sub compare -{ - my ($r) = shift; - - if ($r->url !~ m!^/compare\?source=(\w:/[\w/]+);dest=(\w:/[\w/]+)$!) { - return "ERR\nIncorrect url: " . $r->url . "\n"; - } - - my ($source, $dest) = ($1, $2); - - if (!Cwd::chdir($source)) { - return "ERR\nCan't access to $source $!\n"; - } - - my $src_attrib = `attrib /D /S`; - $src_attrib = strip_base($src_attrib, $source); - - if (!Cwd::chdir($dest)) { - return "ERR\nCan't access to $dest $!\n"; - } - - my $dest_attrib = `attrib /D /S`; - $dest_attrib = strip_base($dest_attrib, $dest); - - if (lc($src_attrib) ne lc($dest_attrib)) { - print "ERR\n$src_attrib\n=========\n$dest_attrib\n"; - return "ERR\n$src_attrib\n=========\n$dest_attrib\n"; - } - - ($src, $dst, $error) = ($source, $dest, ''); - find(\&wanted, $source); - if ($error) { - return "ERR\n$error"; - } else { - return "OK\n"; - } -} - -sub cleandir -{ - my ($r) = shift; - - if ($r->url !~ m!^/cleandir\?source=(\w:/[\w/]+)/restore$!) { - return "ERR\nIncorrect url: " . $r->url . "\n"; - } - - my $source = $1; - - if (! -d "$source/restore") { - return "ERR\nIncorrect path\n"; - } - - if (!chdir($source)) { - return "ERR\nCan't access to $source $!\n"; - } - - system("rmdir /Q /S restore"); - - return "OK\n"; -} - -sub reboot -{ - Win32::InitiateSystemShutdown('', "\nSystem will now Reboot\!", 2, 0, 1 ); - exit 0; -} - -# boot disabled auto -sub set_service -{ - my ($r) = shift; - - if ($r->url !~ m!^/set_service\?srv=([\w-]+);action=(\w+)$!) { - return "ERR\nIncorrect url: " . $r->url . "\n"; - } - my $out = `sc config $1 start= $2`; - if ($out !~ /SUCCESS/) { - return "ERR\n$out"; - } - return "OK\n"; -} - -# RUNNING, STOPPED -sub get_service -{ - my ($r) = shift; - - if ($r->url !~ m!^/get_service\?srv=([\w-]+);state=(\w+)$!) { - return "ERR\nIncorrect url: " . $r->url . "\n"; - } - my $out = `sc query $1`; - if ($out !~ /$2/) { - return "ERR\n$out"; - } - return "OK\n"; -} - -sub add_registry_key -{ - my ($r) = shift; - if ($r->url !~ m!^/add_registry_key\?key=(\w+);val=(\w+)$!) { - return "ERR\nIncorrect url: " . $r->url . "\n"; - } - my ($k, $v) = ($1,$2); - my $ret = "ERR"; - open(FP, ">tmp.reg") - or return "ERR\nCan't open tmp.reg $!\n"; - - print FP "Windows Registry Editor Version 5.00 - -[HKEY_LOCAL_MACHINE\\SOFTWARE\\Bacula] -\"$k\"=\"$v\" - -"; - close(FP); - system("regedit /s tmp.reg"); - - unlink("tmp2.reg"); - system("regedit /e tmp2.reg HKEY_LOCAL_MACHINE\\SOFTWARE\\Bacula"); - - open(FP, "<:encoding(UTF-16LE)", "tmp2.reg") - or return "ERR\nCan't open tmp2.reg $!\n"; - while (my $l = ) { - if ($l =~ /"$k"="$v"/) { - $ret = "OK"; - } - } - close(FP); - unlink("tmp.reg"); - unlink("tmp2.reg"); - return "$ret\n"; -} - -sub set_auto_logon -{ - my ($r) = shift; - my $self = $0; # perl script location - $self =~ s/\\/\\\\/g; - my $p = $^X; # perl.exe location - $p =~ s/\\/\\\\/g; - if ($r->url !~ m!^/set_auto_logon\?user=([\w\d\-+\.]+);pass=([\w\d\.\,:*+%\-]*)$!) { - return "ERR\nIncorrect url: " . $r->url . "\n"; - } - my $k = $1; - my $v = $2 || ''; # password can be empty - my $ret = "ERR\nCan't find AutoAdminLogon key\n"; - open(FP, ">c:/autologon.reg") - or return "ERR\nCan't open autologon.reg $!\n"; - print FP "Windows Registry Editor Version 5.00 - -[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon] -\"DefaultUserName\"=\"$k\" -\"DefaultPassword\"=\"$v\" -\"AutoAdminLogon\"=\"1\" - -[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run] -\"regress\"=\"$p $self\" - -[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Reliability] -\"ShutdownReasonUI\"=dword:00000000 - -[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows NT\\Reliability] -\"ShutdownReasonOn\"=dword:00000000 -"; - close(FP); - system("regedit /s c:\\autologon.reg"); - - unlink("tmp2.reg"); - system("regedit /e tmp2.reg \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\""); - - open(FP, "<:encoding(UTF-16LE)", "tmp2.reg") - or return "ERR\nCan't open tmp2.reg $!\n"; - while (my $l = ) { - if ($l =~ /"AutoAdminLogon"="1"/) { - $ret = "OK\n"; - } - } - close(FP); - unlink("tmp2.reg"); - return $ret; -} - -sub del_registry_key -{ - my ($r) = shift; - if ($r->url !~ m!^/del_registry_key\?key=(\w+)$!) { - return "ERR\nIncorrect url: " . $r->url . "\n"; - } - my $k = $1; - my $ret = "OK\n"; - - unlink("tmp2.reg"); - open(FP, ">tmp.reg") - or return "ERR\nCan't open tmp.reg $!\n"; - print FP "Windows Registry Editor Version 5.00 - -[HKEY_LOCAL_MACHINE\\SOFTWARE\\Bacula] -\"$k\"=- - -"; - close(FP); - system("regedit /s tmp.reg"); - system("regedit /e tmp2.reg HKEY_LOCAL_MACHINE\\SOFTWARE\\Bacula"); - - open(FP, "<:encoding(UTF-16LE)", "tmp2.reg") - or return "ERR\nCan't open tmp2.reg $!\n"; - while (my $l = ) { - if ($l =~ /"$k"=/) { - $ret = "ERR\nThe key $k is still present\n"; - } - } - close(FP); - unlink("tmp.reg"); - unlink("tmp2.reg"); - return $ret; -} - -sub get_registry_key -{ - my ($r) = shift; - if ($r->url !~ m!^/get_registry_key\?key=(\w+);val=(\w+)$!) { - return "ERR\nIncorrect url: " . $r->url . "\n"; - } - my ($k, $v) = ($1, $2); - my $ret = "ERR\nCan't get or verify registry key $k\n"; - - unlink("tmp2.reg"); - system("regedit /e tmp2.reg HKEY_LOCAL_MACHINE\\SOFTWARE\\Bacula"); - open(FP, "<:encoding(UTF-16LE)", "tmp2.reg") - or return "ERR\nCan't open tmp2.reg $!\n"; - while (my $l = ) { - if ($l =~ /"$k"="$v"/) { - $ret = "OK\n"; - } - } - close(FP); - unlink("tmp2.reg"); - - return $ret; -} - -my $mssql_user; -my $mssql_pass; -my $mssql_cred; -my $mssql_bin; -sub find_mssql -{ - if ($_ =~ /sqlcmd.exe/i) { - $mssql_bin = $File::Find::name; - } -} - -# Verify that we can use SQLCMD.exe -sub check_mssql -{ - my ($r) = shift; - my $ret = "ERR"; - if ($r->url !~ m!^/check_mssql\?user=(\w*);pass=(.*)$!) { - return "ERR\nIncorrect url: " . $r->url . "\n"; - } - ($mssql_user, $mssql_pass) = ($1, $2); - - unless ($mssql_bin) { - find(\&find_mssql, 'c:/program files/microsoft sql server/'); - } - unless ($mssql_bin) { - find(\&find_mssql, 'c:/program files (x86)/microsoft sql server/'); - } - - if (!$mssql_bin) { - return "ERR\nCan't find SQLCMD.exe in c:/program files\n"; - } - - print $mssql_bin, "\n"; - $mssql_cred = ($mssql_user)?"-U $mssql_user -P $mssql_pass":""; - my $res = `"$mssql_bin" $mssql_cred -Q "SELECT 'OK';"`; - if ($res !~ /OK/) { - return "ERR\nCan't verify the SQLCMD result\n" . - "Please verify that MSSQL is accepting connection:\n" . - "$mssql_bin $mssql_cred -Q \"SELECT 1;\"\n"; - } - return "OK\n"; -} - -# Create simple DB, a table and some information in -sub setup_mssql_db -{ - my ($r) = shift; - my $ret = "ERR"; - if ($r->url !~ m!^/setup_mssql_db\?db=([\w\d]+)$!) { - return "ERR\nIncorrect url: " . $r->url . "\n"; - } - my $db = $1; - - unless ($mssql_bin) { - return "ERR\nCan't find mssql bin (run check_mssql first)\n"; - } - - my $res = `"$mssql_bin" $mssql_cred -Q "CREATE DATABASE $db;"`; - $res = `"$mssql_bin" $mssql_cred -d $db -Q "CREATE TABLE table1 (a int, b int);"`; - $res = `"$mssql_bin" $mssql_cred -d $db -Q "INSERT INTO table1 (a, b) VALUES (1,1);"`; - $res = `"$mssql_bin" $mssql_cred -d $db -Q "SELECT 'OK' FROM table1;"`; - - if ($res !~ /OK/) { - return "ERR\nCan't verify the SQLCMD result\n" . - "Please verify that MSSQL is accepting connection:\n" . - "$mssql_bin $mssql_cred -Q \"SELECT 1;\"\n"; - } - return "OK\n"; -} - -# drop database -sub cleanup_mssql_db -{ - my ($r) = shift; - my $ret = "ERR"; - if ($r->url !~ m!^/cleanup_mssql_db\?db=([\w\d]+)$!) { - return "ERR\nIncorrect url: " . $r->url . "\n"; - } - my $db = $1; - - unless ($mssql_bin) { - return "ERR\nCan't find mssql bin\n"; - } - - my $res = `"$mssql_bin" $mssql_cred -Q "DROP DATABASE $db;"`; - - return "OK\n"; -} - -# truncate the table that is in database -sub truncate_mssql_table -{ - my ($r) = shift; - my $ret = "ERR"; - if ($r->url !~ m!^/truncate_mssql_table\?db=([\w\d]+)$!) { - return "ERR\nIncorrect url: " . $r->url . "\n"; - } - my $db = $1; - - unless ($mssql_bin) { - return "ERR\nCan't find mssql bin\n"; - } - - my $res = `"$mssql_bin" $mssql_cred -d $db -Q "TRUNCATE TABLE table1;"`; - $res = `"$mssql_bin" $mssql_cred -d $db -Q "SELECT 'OK' FROM table1;"`; - - if ($res =~ /OK/) { - return "ERR\nCan't truncate $db.table1\n"; - } - return "OK\n"; -} - -# test that table1 contains some rows -sub test_mssql_content -{ - my ($r) = shift; - my $ret = "ERR"; - if ($r->url !~ m!^/test_mssql_content\?db=([\w\d]+)$!) { - return "ERR\nIncorrect url: " . $r->url . "\n"; - } - my $db = $1; - - unless ($mssql_bin) { - return "ERR\nCan't find mssql bin\n"; - } - - my $res = `"$mssql_bin" $mssql_cred -d $db -Q "SELECT 'OK' FROM table1;"`; - - if ($res !~ /OK/) { - return "ERR\nNo content from $mssql_bin\n$res\n"; - } - return "OK\n"; -} - -my $mssql_mdf; -my $mdf_to_find; -sub find_mdf -{ - if ($_ =~ /$mdf_to_find/i) { - $mssql_mdf = $File::Find::dir; - } -} - -# put a mdf online -sub online_mssql_db -{ - my ($r) = shift; - if ($r->url !~ m!^/online_mssql_db\?mdf=([\w\d]+);db=([\w\d]+)$!) { - return "ERR\nIncorrect url: " . $r->url . "\n"; - } - my ($mdf, $db) = ($1, $2); - $mdf_to_find = "$mdf.mdf"; - - find(\&find_mdf, 'c:/program files/microsoft sql server/'); - unless ($mssql_mdf) { - find(\&find_mssql, 'c:/program files (x86)/microsoft sql server/'); - } - unless ($mssql_mdf) { - return "ERR\nCan't find $mdf.mdf in c:/program files\n"; - } - $mssql_mdf =~ s:/:\\:g; - - open(FP, ">c:/mssql.sql"); - print FP " -USE [master] -GO -CREATE DATABASE [$db] ON -( FILENAME = N'$mssql_mdf\\$mdf.mdf' ), -( FILENAME = N'$mssql_mdf\\${mdf}_log.LDF' ) - FOR ATTACH -GO -USE [$db] -GO -SELECT 'OK' FROM table1 -GO -"; - close(FP); - my $res = `"$mssql_bin" $mssql_cred -i c:\\mssql.sql`; - #unlink("c:/mssql.sql"); - if ($res !~ /OK/) { - return "ERR\nNo content from $mssql_bin\n"; - } - return "OK\n"; -} - -# create a script c:/del.cmd to delete protected files with runscript -sub remove_dir -{ - my ($r) = shift; - if ($r->url !~ m!^/remove_dir\?file=([\w\d:\/\.\-+*]+);dest=([\w\d\.:\/]+)$!) { - return "ERR\nIncorrect url: " . $r->url . "\n"; - } - my ($file, $cmd) = ($1, $2); - $file =~ s:/:\\:g; - - open(FP, ">$cmd") or return "ERR\nCan't open $file $!\n"; - print FP "DEL /F /S /Q $file\n"; - close(FP); - return "OK\n"; -} - -sub get_traces -{ - my ($file) = <"c:/program files/bacula/working/*.trace">; - if (!$file || ! -f $file) { - return "ERR\n$!\n"; - } - return $file; -} - -sub truncate_traces -{ - my $f = get_traces(); - unlink($f) or return "ERR\n$!\n"; - return "OK\n"; -} - -# When adding an action, fill this hash with the right function -my %action_list = ( - nop => sub { return "OK\n"; }, - stop => \&stop_fd, - start => \&start_fd, - install => \&install_fd, - compare => \&compare, - init_attrib_test => \&init_attrib_test, - init_weird_runscript_test => \&init_weird_runscript_test, - set_director_name => \&set_director_name, - cleandir => \&cleandir, - add_registry_key => \&add_registry_key, - del_registry_key => \&del_registry_key, - get_registry_key => \&get_registry_key, - quit => sub { exit 0; }, - reboot => \&reboot, - set_service => \&set_service, - get_service => \&get_service, - set_auto_logon => \&set_auto_logon, - remove_dir => \&remove_dir, - reload => \&reload, - create_schedtask => \&create_schedtask, - del_schedtask => \&del_schedtask, - check_schedtask => \&check_schedtask, - get_traces => \&get_traces, - truncate_traces => \&truncate_traces, - - check_mssql => \&check_mssql, - setup_mssql_db => \&setup_mssql_db, - cleanup_mssql_db => \&cleanup_mssql_db, - truncate_mssql_table => \&truncate_mssql_table, - test_mssql_content => \&test_mssql_content, - online_mssql_db => \&online_mssql_db, - ); - -my $reload=0; -sub reload -{ - $reload=1; - return "OK\n"; -} - -# handle client request -sub handle_client -{ - my ($c, $ip) = @_ ; - my $action; - my $r = $c->get_request ; - - if (!$r) { - $c->send_error(RC_FORBIDDEN) ; - return; - } - if ($r->url->path !~ m!^/(\w+)!) { - $c->send_error(RC_NOT_FOUND) ; - return; - } - $action = $1; - - if (($r->method eq 'GET') - and $action_list{$action}) - { - print "Exec $action:\n"; - - my $ret = $action_list{$action}($r); - if ($action eq 'get_traces' && $ret !~ /ERR/) { - print "Sending $ret\n"; - $c->send_file_response($ret); - - } else { - my $h = HTTP::Headers->new('Content-Type' => 'text/plain') ; - my $r = HTTP::Response->new(HTTP::Status::RC_OK, - 'OK', $h, $ret) ; - print $ret; - $c->send_response($r) ; - } - } else { - print "$action not found, probably a version problem\n"; - $c->send_error(RC_NOT_FOUND) ; - } - - $c->close; -} - -print "Starting regress-win32.pl daemon...\n"; -my $d = HTTP::Daemon->new ( LocalPort => 8091, - ReuseAddr => 1) - || die "Error: Can't bind $!" ; - -my $olddir = Cwd::cwd(); -while (1) { - my $c = $d->accept ; - my $ip = $c->peerhost; - if (!$ip) { - $c->send_error(RC_FORBIDDEN) ; - } elsif ($src_ip && $ip ne $src_ip) { - $c->send_error(RC_FORBIDDEN) ; - } elsif ($c) { - handle_client($c, $ip) ; - } else { - $c->send_error(RC_FORBIDDEN) ; - } - close($c) ; - undef $c; - chdir($olddir); - - # When we have the reload command, just close the http daemon - # and exec ourself - if ($reload) { - $d->close(); - undef $d; - - exec("$^X $0"); - } -} diff --git a/regress/scripts/setup b/regress/scripts/setup index 8f075f59e5..a36f303d27 100755 --- a/regress/scripts/setup +++ b/regress/scripts/setup @@ -1,11 +1,10 @@ #!/bin/sh # -# Script to setup running Bacula regression tests +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # -# Author: Kern Sibbald, 2003 -# License: LGPLv3 +# Script to setup running Bacula regression tests # - check_exit_code() { if [ $? != 0 ] ; then @@ -31,6 +30,7 @@ rm -rf build bin # Copy new source echo "Copying source from ${BACULA_SOURCE}" cp -rp ${BACULA_SOURCE} build +check_exit_code which git >/dev/null 2>/dev/null if [ $? = 0 ] ; then git show HEAD | grep -m 1 commit | awk '{print $2}' > build/git-version @@ -78,7 +78,7 @@ make installall check_exit_code cd ${cwd} -bin/bacula stop +bin/bacula stop -KILL mkdir -p working cd bin @@ -95,3 +95,4 @@ bin/bacula stop # Save Bacula default conf files for later use # cp -f bin/*.conf scripts +check_exit_code diff --git a/regress/scripts/setup_win32 b/regress/scripts/setup_win32 deleted file mode 100755 index a6fe8c69ba..0000000000 --- a/regress/scripts/setup_win32 +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash -# -# Setup windows box -# -. scripts/functions - -echo "Trying to setup $WIN32_ADDR" -URL=http://$WIN32_ADDR:8091 - -echo "Stopping bacula-fd service" -wget -qO /dev/null "$URL/stop" - -echo -en "Set director name:\t\t" -wget -qO - "$URL/set_director_name?name=$HOST-dir;pass=$WIN32_PASSWORD" - -if [ x$WIN32_USER != x ]; then - echo -en "Setting auto_logon:\t\t" - wget -qO - "$URL/set_auto_logon?user=$WIN32_USER;pass=$WIN32_PASS" -fi - -update_win32 - -echo "Starting bacula-fd service" -wget -qO /dev/null "$URL/start" - -echo -ne "Reloading regress-win32.pl:\t" -wget -qO - "$URL/reload" - -i=0 -while ! wget -qO /dev/null $URL/nop; do - sleep 5 - i=`expr $i + 1` - if [ $i -ge 12 ]; then # print message every minute - i=0 - echo "== `date +%T` Waiting for script to reload" - fi -done diff --git a/regress/scripts/test-bacula-sd.conf.in b/regress/scripts/test-bacula-sd.conf.in index 7bb3b89dbe..0a54d72bc1 100644 --- a/regress/scripts/test-bacula-sd.conf.in +++ b/regress/scripts/test-bacula-sd.conf.in @@ -16,6 +16,8 @@ Storage { # definition of myself WorkingDirectory = "@working_dir@" Pid Directory = "@piddir@" Subsys Directory = "@subsysdir@" + Plugin Directory = "@sbindir@/plugins" + Maximum Concurrent Jobs = 100 } # diff --git a/regress/scripts/update-ctest.in b/regress/scripts/update-ctest.in index 2dee0cb109..3d2cb68d2e 100644 --- a/regress/scripts/update-ctest.in +++ b/regress/scripts/update-ctest.in @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + cd @regressdir@ diff --git a/regress/scripts/win32-bacula-dir-systemstate.conf.in b/regress/scripts/win32-bacula-dir-systemstate.conf.in deleted file mode 100644 index 1247499239..0000000000 --- a/regress/scripts/win32-bacula-dir-systemstate.conf.in +++ /dev/null @@ -1,205 +0,0 @@ -# -# Default Bacula Director Configuration file -# -# The only thing that MUST be changed is to add one or more -# file or directory names in the Include directive of the -# FileSet resource. -# -# -# - -Director { # define myself - Name = @hostname@-dir - DIRPort = @dirport@ # where we listen for UA connections - QueryFile = "@scriptdir@/query.sql" - WorkingDirectory = "@working_dir@" - PidDirectory = "@piddir@" - Maximum Concurrent Jobs = 100 - Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" - Messages = Daemon - FD Connect Timeout = 2min -} - -# -# Define the main nightly save backup job -# By default, this job will back up to disk in /home/kern/bacula/k/regress/tmp -Job { - Name = "SystemstateJob" - Accurate = yes - Type = Backup - Level = Incremental - Client = @win32_client@ - FileSet = "SystemState Set" - Storage = File - Messages = Standard - Pool = Default - Write Bootstrap = "@working_dir@/NightlySave.bsr" - Maximum Concurrent Jobs = 4 -} - -Job { - Name = "MSSQLJob" - Type = Backup - Level = Incremental - Client = @win32_client@ - FileSet = "MSSQL Set" - Storage = File - Messages = Standard - Pool = Default - Write Bootstrap = "@working_dir@/NightlySave.bsr" - Maximum Concurrent Jobs = 4 -} - -Job { - Name = "SS_SQLJob" - Accurate = yes - Type = Backup - Level = Incremental - Client = @win32_client@ - FileSet = "SS_SQL Set" - Storage = File - Messages = Standard - Pool = Default - Write Bootstrap = "@working_dir@/NightlySave.bsr" - Maximum Concurrent Jobs = 4 -} - - - -# Standard Restore template, to be changed by Console program -Job { - Name = "RestoreFiles" - Type = Restore - Client = @win32_client@ - FileSet="SystemState Set" - Storage = File - Messages = Standard - Pool = Default -# Where = /home/kern/bacula/k/regress/tmp/bacula-restores -} - - -# List of files to be backed up -FileSet { - Name = "SystemState Set" - Enable VSS = yes - Include { - Options { - signature=MD5; portable=no -# compression=GZIP - } - File = "@win32_file@" - Plugin = "vss:/@SYSTEMSTATE/" - } -} - -# List of files to be backed up -FileSet { - Name = "MSSQL Set" - Enable VSS = yes - Include { - Options { - signature=MD5; portable=no -# compression=GZIP - } - File = "@win32_file@" - Plugin = "vss:/@MSSQL/" - } -} - -FileSet { - Name = "SS_SQL Set" - Enable VSS = yes - Include { - Options { - signature=MD5; portable=no - } - File = "@win32_file@" - Plugin = "vss:/@SYSTEMSTATE/" - Plugin = "vss:/@MSSQL/" - } -} - - -# -# When to do the backups, full backup on first sunday of the month, -# differential (i.e. incremental since full) every other sunday, -# and incremental backups other days -Schedule { - Name = "WeeklyCycle" - Run = Full 1st sun at 1:05 - Run = Differential 2nd-5th sun at 1:05 - Run = Incremental mon-sat at 1:05 -} - -# Client (File Services) to backup -Client { - Name = @win32_client@ - Address = @win32_addr@ - FDPort = @win32_port@ - Catalog = MyCatalog - Password = "@win32_password@" - File Retention = 30d # 30 days - Job Retention = 180d # six months - AutoPrune = yes # Prune expired Jobs/Files - Maximum Concurrent Jobs = 4 -} - -# Definition of File storage device -Storage { - Name = File - Address = @win32_store_addr@ # N.B. Use a fully qualified name here - SDPort = @sdport@ - - Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" # password for Storage daemon - Device = FileStorage # must be same as Device in Storage daemon - Media Type = File # must be same as MediaType in Storage daemon -# AutoChanger = yes - Maximum Concurrent Jobs = 4 -} - - -# Generic catalog service -Catalog { - Name = MyCatalog - dbname = @db_name@; user = @db_user@; password = "@db_password@" -} - -# Reasonable message delivery -- send most everything to email address -# and to the console -Messages { - Name = Standard - mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: %t %e of %c %l\" %r" -# operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: Intervention needed for %j\" %r" -# MailOnError = kern@sibbald.com = all, !terminate -# operator = kern@sibbald.com = mount - console = all, !skipped, !terminate, !restored -# -# WARNING! the following will create a file that you must cycle from -# time to time as it will grow indefinitely. However, it will -# also keep all your messages if the scroll off the console. -# - append = "@working_dir@/log" = all, !skipped - catalog = all, !skipped -} - -# -# Message delivery for daemon messages (no job). -Messages { - Name = Daemon - mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression daemon message\" %r" -# mail = kern@sibbald.com = all, !skipped - console = all, !skipped, !saved - append = "@working_dir@/log" = all, !skipped - catalog = all, !skipped -} - - -# Default pool definition -Pool { - Name = Default - Pool Type = Backup - Recycle = yes # Bacula can automatically recycle Volumes - AutoPrune = yes # Prune expired volumes - Volume Retention = 365d # one year -} diff --git a/regress/scripts/win32-bacula-dir-tape.conf.in b/regress/scripts/win32-bacula-dir-tape.conf.in deleted file mode 100644 index 9086d5b29d..0000000000 --- a/regress/scripts/win32-bacula-dir-tape.conf.in +++ /dev/null @@ -1,161 +0,0 @@ -# -# Default Bacula Director Configuration file -# -# The only thing that MUST be changed is to add one or more -# file or directory names in the Include directive of the -# FileSet resource. -# -# For Bacula release 1.39.23 -# -# You might also want to change the default email address -# from root to your address. See the "mail" and "operator" -# directives in the Messages resource. -# - -Director { # define myself - Name = @hostname@-dir - DIRPort = @dirport@ # where we listen for UA connections - QueryFile = "@scriptdir@/query.sql" - WorkingDirectory = "@working_dir@" - PidDirectory = "@piddir@" - Maximum Concurrent Jobs = 4 - Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" - Messages = Daemon -} - -# -# Define the main nightly save backup job -# By default, this job will back up to disk in @tmpdir@ -Job { - Name = "NightlySave" - Type = Backup - Client=@win32_client@ - FileSet="Full Set" - Storage = tape - Messages = Standard - Pool = Default - Write Bootstrap = "@working_dir@/NightlySave.bsr" - Maximum Concurrent Jobs = 4 - SpoolData = yes -} - - -# Standard Restore template, to be changed by Console program -Job { - Name = "RestoreFiles" - Type = Restore - Client=@win32_client@ - FileSet="Full Set" - Storage = tape - Messages = Standard - Pool = Default - Where = @tmpdir@/bacula-restores -} - - -# List of files to be backed up -FileSet { - Name = "Full Set" - Enable VSS = yes - Include { Options { signature=MD5; portable=no - compression=GZIP } - File = "@win32_file@" - } -} - - -# -# When to do the backups, full backup on first sunday of the month, -# differential (i.e. incremental since full) every other sunday, -# and incremental backups other days -Schedule { - Name = "WeeklyCycle" - Run = Full 1st sun at 1:05 - Run = Differential 2nd-5th sun at 1:05 - Run = Incremental mon-sat at 1:05 -} - -# Client (File Services) to backup -Client { - Name = @win32_client@ - Address = @win32_addr@ - FDPort = @win32_port@ - Catalog = MyCatalog - Password = "@win32_password@" - File Retention = 30d # 30 days - Job Retention = 180d # six months - AutoPrune = yes # Prune expired Jobs/Files - Maximum Concurrent Jobs = 4 -} - -Client { - Name = localhost-fd - Address = localhost - FDPort = @fdport@ - Catalog = MyCatalog - Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" - File Retention = 30d # 30 days - Job Retention = 180d # six months - AutoPrune = yes # Prune expired Jobs/Files - Maximum Concurrent Jobs = 4 -} - - -# Definition of DDS tape storage device -Storage { - Name = tape - Address = @hostname@-sd # N.B. Use a fully qualified name here - SDPort = @sdport@ - Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" # password for Storage daemon - Device = tape # must be same as Device in Storage daemon - Media Type = tape # must be same as MediaType in Storage daemon - AutoChanger = yes - Maximum Concurrent Jobs = 4 -} - - -# Generic catalog service -Catalog { - Name = MyCatalog - @libdbi@ - dbname = @db_name@; user = @db_user@; password = "@db_password@" -} - -# Reasonable message delivery -- send most everything to email address -# and to the console -Messages { - Name = Standard - mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: %t %e of %c %l\" %r" -# operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: Intervention needed for %j\" %r" -# MailOnError = @job_email@ = all, !terminate -# operator = @job_email@ = mount - console = all, !skipped, !terminate, !restored -# -# WARNING! the following will create a file that you must cycle from -# time to time as it will grow indefinitely. However, it will -# also keep all your messages if the scroll off the console. -# - append = "@working_dir@/log" = all, !skipped - catalog = all, !skipped -} - -# -# Message delivery for daemon messages (no job). -Messages { - Name = Daemon - mailcommand = "@sbindir@/bsmtp -h @smtp_host@ -f \"\(Bacula regression\) %r\" -s \"Regression daemon message\" %r" -# mail = @job_email@ = all, !skipped - console = all, !skipped, !saved - append = "@working_dir@/log" = all, !skipped - catalog = all, !skipped -} - - -# Default pool definition -Pool { - Name = Default - Pool Type = Backup - Recycle = yes # Bacula can automatically recycle Volumes - AutoPrune = yes # Prune expired volumes - Volume Retention = 365d # one year -} diff --git a/regress/scripts/win32-bacula-dir.conf.in b/regress/scripts/win32-bacula-dir.conf.in deleted file mode 100644 index 9e10c25a91..0000000000 --- a/regress/scripts/win32-bacula-dir.conf.in +++ /dev/null @@ -1,227 +0,0 @@ -# -# Default Bacula Director Configuration file -# -# The only thing that MUST be changed is to add one or more -# file or directory names in the Include directive of the -# FileSet resource. -# -# -# - -Director { # define myself - Name = @hostname@-dir - DIRPort = @dirport@ # where we listen for UA connections - QueryFile = "@scriptdir@/query.sql" - WorkingDirectory = "@working_dir@" - PidDirectory = "@piddir@" - Maximum Concurrent Jobs = 4 - Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" - Messages = Daemon -} - -# -# Define the main nightly save backup job -# By default, this job will back up to disk in @tmpdir@ -Job { - Name = "NightlySave" - Type = Backup - Client = @win32_client@ - FileSet = "Full Set" - Storage = File - Messages = Standard - Pool = Default - Write Bootstrap = "@working_dir@/NightlySave.bsr" - Maximum Concurrent Jobs = 4 - SpoolData = yes -} - -# -# Define the main nightly save backup job -# By default, this job will back up to disk in @tmpdir@ -Job { - Name = "SystemstateJob" - Type = Backup - Client = @win32_client@ - FileSet = "SystemState Set" - Storage = File - Messages = Standard - Pool = Default - Write Bootstrap = "@working_dir@/NightlySave.bsr" - Maximum Concurrent Jobs = 4 -} - -Job { - Name = "AccurateJob" - Type = Backup - Client = @win32_client@ - FileSet = "Full Set" - Storage = File - Messages = Standard - Pool = Default - Accurate = yes - Write Bootstrap = "@working_dir@/NightlySave.bsr" - Maximum Concurrent Jobs = 4 - SpoolData = yes -} - -Job { - Name = "RunScript" - Type = Backup - Client = @win32_client@ - FileSet = "Full Set" - Storage = File - Messages = Standard - Pool = Default - Write Bootstrap = "@working_dir@/NightlySave.bsr" - Maximum Concurrent Jobs = 4 - SpoolData = yes - - RunScript { - Command = "c:\\tmp\\weird_runscript\\test.bat" # ok | ok | ok - Command = "c:/tmp/weird_runscript/test.bat" # ok | ok | ok - Command = "\"c:/tmp/weird_runscript/dir space/test.bat\"" # ok | ok | ok - Command = "\"c:/tmp/weird_runscript/dir space/test2 space.bat\"" # ok|ok|ok - Command = "c:/tmp/weird_runscript/testé.bat" # ok | ok | ok - Command = "c:\\tmp\\weird_runscript\\testé.bat" # ok | ok | ok - Command = "\"c:\\tmp\\weird_runscript\\test space.bat\"" # ok | ok | ok - RunsWhen = AfterVSS - FailJobOnError = no - } -} - -# Standard Restore template, to be changed by Console program -Job { - Name = "RestoreFiles" - Type = Restore - Client = @win32_client@ - FileSet="Full Set" - Storage = File - Messages = Standard - Pool = Default - Where = @tmpdir@/bacula-restores -} - - -# List of files to be backed up -FileSet { - Name = "Full Set" - Enable VSS = yes - Include { - Options { - signature=MD5; portable=no -# compression=GZIP - } - File = "@win32_file@" - } -} -# List of files to be backed up -FileSet { - Name = "SystemState Set" - Enable VSS = yes - Include { - Options { - signature=MD5; portable=no -# compression=GZIP - } - File = "@win32_file@" - Plugin = "systemstate:/@SYSTEMSTATE/" - } -} - -# List of files to be backed up -FileSet { - Name = "Plugin Set" - Enable VSS = yes - Include { - Options { - signature=MD5; portable=no -# compression=GZIP - } - File = "@win32_file@" - Plugin = "systemstate:/@SYSTEMSTATE/" - } -} - -# -# When to do the backups, full backup on first sunday of the month, -# differential (i.e. incremental since full) every other sunday, -# and incremental backups other days -Schedule { - Name = "WeeklyCycle" - Run = Full 1st sun at 1:05 - Run = Differential 2nd-5th sun at 1:05 - Run = Incremental mon-sat at 1:05 -} - -# Client (File Services) to backup -Client { - Name = @win32_client@ - Address = @win32_addr@ - FDPort = @win32_port@ - Catalog = MyCatalog - Password = "@win32_password@" - File Retention = 30d # 30 days - Job Retention = 180d # six months - AutoPrune = yes # Prune expired Jobs/Files - Maximum Concurrent Jobs = 4 -} - - -# Definition of File storage device -Storage { - Name = File - Address = @win32_store_addr@ # N.B. Use a fully qualified name here - SDPort = @sdport@ - Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" # password for Storage daemon - Device = FileStorage # must be same as Device in Storage daemon - Media Type = File # must be same as MediaType in Storage daemon -# AutoChanger = yes - Maximum Concurrent Jobs = 4 -} - - -# Generic catalog service -Catalog { - Name = MyCatalog - @libdbi@ - dbname = @db_name@; user = @db_user@; password = "@db_password@" -} - -# Reasonable message delivery -- send most everything to email address -# and to the console -Messages { - Name = Standard - mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: %t %e of %c %l\" %r" -# operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: Intervention needed for %j\" %r" -# MailOnError = @job_email@ = all, !terminate -# operator = @job_email@ = mount - console = all, !skipped, !terminate, !restored -# -# WARNING! the following will create a file that you must cycle from -# time to time as it will grow indefinitely. However, it will -# also keep all your messages if the scroll off the console. -# - append = "@working_dir@/log" = all, !skipped - catalog = all, !skipped -} - -# -# Message delivery for daemon messages (no job). -Messages { - Name = Daemon - mailcommand = "@sbindir@/bsmtp -h @smtp_host@ -f \"\(Bacula regression\) %r\" -s \"Regression daemon message\" %r" -# mail = @job_email@ = all, !skipped - console = all, !skipped, !saved - append = "@working_dir@/log" = all, !skipped - catalog = all, !skipped -} - - -# Default pool definition -Pool { - Name = Default - Pool Type = Backup - Recycle = yes # Bacula can automatically recycle Volumes - AutoPrune = yes # Prune expired volumes - Volume Retention = 365d # one year -} diff --git a/regress/scripts/win32-bacula-fd.conf.in b/regress/scripts/win32-bacula-fd.conf.in deleted file mode 100644 index 2d834e0f91..0000000000 --- a/regress/scripts/win32-bacula-fd.conf.in +++ /dev/null @@ -1,33 +0,0 @@ -# -# Default Bacula File Daemon Configuration file -# -# For Bacula release 1.33 -# -# There is not much to change here except perhaps the -# File daemon Name to -# - -# -# List Directors who are permitted to contact this File daemon -# -Director { - Name = rufus-dir - Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" -} - -# -# "Global" File daemon configuration specifications -# -FileDaemon { # this is me - Name = localhost-fd - FDport = 8102 # where we listen for the director - WorkingDirectory = "/home/kern/bacula/regress/working" - Pid Directory = "/home/kern/bacula/regress/working" - SubSys Directory = "/home/kern/bacula/regress/working" -} - -# Send all messages except skipped files back to Director -Messages { - Name = Standard - director = rufus-dir = all, !terminate, !restored -} diff --git a/regress/scripts/win32-bacula-sd-tape.conf.in b/regress/scripts/win32-bacula-sd-tape.conf.in deleted file mode 100644 index ac8d8dedd9..0000000000 --- a/regress/scripts/win32-bacula-sd-tape.conf.in +++ /dev/null @@ -1,54 +0,0 @@ -# -# Default Bacula Storage Daemon Configuration file -# -# For Bacula release 1.39.23 -# -# You may need to change the name of your tape drive -# on the "Archive Device" directive in the Device -# resource. If you change the Name and/or the -# "Media Type" in the Device resource, please ensure -# that dird.conf has corresponding changes. -# - -Storage { # definition of myself - Name = @hostname@-sd - SDPort = 8103 # Director's port - WorkingDirectory = "/home/kern/bacula/regress/working" - Pid Directory = "/home/kern/bacula/regress/working" - Subsys Directory = "/home/kern/bacula/regress/working" -} - -# -# List Directors who are permitted to contact Storage daemon -# -Director { - Name = @hostname@-dir - Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" -} - -# -# Devices supported by this Storage daemon -# To connect, the Director's bacula-dir.conf must have the -# same Name and MediaType. -# - -Device { - Name = tape # - Media Type = tape - Archive Device = @tape_drive@ - AutomaticMount = yes; # when device opened, read it - AlwaysOpen = yes; - RemovableMedia = yes; - @@sbindir@/tape_options -# Maximum File Size = 1000000 -# MaximumVolumeSize = 100M -} - -# -# Send all messages to the Director, -# mount messages also are sent to the email address -# -Messages { - Name = Standard - director = rufus-dir = all, !terminate -} diff --git a/regress/startover_libdbi.sh b/regress/startover_libdbi.sh index 9a252172f9..6ddd51ef15 100755 --- a/regress/startover_libdbi.sh +++ b/regress/startover_libdbi.sh @@ -1,5 +1,8 @@ #!/bin/sh - +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# # Run tests using differents catalog databases PWD=`pwd` diff --git a/regress/starttime b/regress/starttime index e6aa3ea6a9..56c40e0b8e 100755 --- a/regress/starttime +++ b/regress/starttime @@ -1,4 +1,8 @@ #!/usr/bin/env python +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# from time import time as now fn = open('time.out', 'w+') diff --git a/regress/tape b/regress/tape index 718cefe7d5..0e3890416c 100755 --- a/regress/tape +++ b/regress/tape @@ -1,2 +1,7 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + ./all-non-root-tape-tests diff --git a/regress/test_duration b/regress/test_duration index 6a48ad60ea..b2352a0aaf 100755 --- a/regress/test_duration +++ b/regress/test_duration @@ -1,4 +1,8 @@ #!/usr/bin/env python2 +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# from time import time as now t = now() diff --git a/regress/test_starttime b/regress/test_starttime index 266b724c47..4c744ac429 100755 --- a/regress/test_starttime +++ b/regress/test_starttime @@ -1,4 +1,8 @@ #!/usr/bin/env python +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# from time import time as now fn = open('testtime.out', 'w+') diff --git a/regress/tests/2drive-2disk b/regress/tests/2drive-2disk index 20e2b478fd..f590f37981 100755 --- a/regress/tests/2drive-2disk +++ b/regress/tests/2drive-2disk @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then create some # new files, do an Incremental and restore those two files. diff --git a/regress/tests/2drive-2job-test b/regress/tests/2drive-2job-test index 9e7ebd14b9..689c8226ac 100755 --- a/regress/tests/2drive-2job-test +++ b/regress/tests/2drive-2job-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Set prefer mounted volumes to no to try to force use of # the drive swap code. @@ -29,7 +34,7 @@ sed -f ${outf} ${cwd}/tmp/1 >${cwd}/bin/bacula-dir.conf # Write out bconsole commands cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=tape volume=TestVolume001 slot=2 Pool=Default drive=0 @@ -56,7 +61,7 @@ END_OF_DATA run_bacula cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @# now do a restore @# diff --git a/regress/tests/2drive-3pool-test b/regress/tests/2drive-3pool-test index 9693cf1696..17ec8dc108 100755 --- a/regress/tests/2drive-3pool-test +++ b/regress/tests/2drive-3pool-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory. Create three # tapes, each in a different pool, then run some jobs asking for the @@ -7,7 +12,7 @@ # # This script uses the virtual disk autochanger and two drives # -TestName="2drive-3pool-disk" +TestName="2drive-3pool-test" JobName="2dr3pooldisk" . scripts/functions @@ -19,6 +24,7 @@ CLIENT=2drive2disk echo "${cwd}/build" >${cwd}/tmp/file-list change_jobname NightlySave $JobName start_test +rm -f working/disk-changer.log # Turn off Prefer Mounted Volumes so we use 2 drives # outf="tmp/sed_tmp" @@ -30,18 +36,19 @@ start_test # Write out bconsole commands cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out -setdebug level=51 storage=tape +@#setdebug level=51 storage=tape label storage=tape volume=TestVolume001 slot=1 Pool=Default drive=0 label storage=tape volume=TestVolume002 slot=2 Pool=Full drive=1 @#label storage=tape volume=TestVolume003 slot=3 Pool=Inc drive=2 status storage=tape @#run job=$JobName level=Full Pool=Inc yes +setdebug level=15 storage=tape +@#setdebug level=50 dir run job=$JobName level=Full Pool=Full yes run job=$JobName level=Full Pool=Default yes -setdebug level=200 storage=tape run job=$JobName level=Full Pool=Default yes run job=$JobName level=Full Pool=Default yes @sleep 10 @@ -65,6 +72,8 @@ messages @# now do a restore @# @$out ${cwd}/tmp/log2.out +setdebug level=0 storage=tape +setdebug level=0 dir restore where=${cwd}/tmp/bacula-restores select all storage=tape done yes wait diff --git a/regress/tests/2drive-concurrent-test b/regress/tests/2drive-concurrent-test index 716b4c8f79..fa962e4585 100755 --- a/regress/tests/2drive-concurrent-test +++ b/regress/tests/2drive-concurrent-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run four jobs at the same time, with two Volumes. # Set max Vol bytes of first volume diff --git a/regress/tests/2drive-incremental-2disk b/regress/tests/2drive-incremental-2disk index 504bd06e41..0c8c67ea0e 100755 --- a/regress/tests/2drive-incremental-2disk +++ b/regress/tests/2drive-incremental-2disk @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then create some # new files, do an Incremental and restore those two files. diff --git a/regress/tests/2drive-incremental-changer b/regress/tests/2drive-incremental-changer index 681aecea13..76d4d61ba8 100755 --- a/regress/tests/2drive-incremental-changer +++ b/regress/tests/2drive-incremental-changer @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then create some # new files, do an Incremental and restore those two files. diff --git a/regress/tests/2drive-offline-test b/regress/tests/2drive-offline-test index 461f3a702d..498154f270 100755 --- a/regress/tests/2drive-offline-test +++ b/regress/tests/2drive-offline-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Set prefer mounted volumes to no to try to force use of # the drive swap code. diff --git a/regress/tests/2drive-swap-test b/regress/tests/2drive-swap-test index c6a7773be0..39ead781c1 100755 --- a/regress/tests/2drive-swap-test +++ b/regress/tests/2drive-swap-test @@ -1,11 +1,16 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Set prefer mounted volumes to no to try to force use of # the drive swap code. # # This script uses the virtual disk autochanger and two drives # -TestName="2drive-swap" +TestName="2drive-swap-test" JobName="2drive-swap" . scripts/functions diff --git a/regress/tests/accurate-test b/regress/tests/accurate-test index 89357a4b26..096254458f 100755 --- a/regress/tests/accurate-test +++ b/regress/tests/accurate-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # TODO: # - test bextract @@ -167,12 +172,6 @@ rm -rf ${cwd}/tmp/bacula-restores p Check with bls ################################################################ -$bin/bls -c $conf/bacula-sd.conf -V 'TestVolume001' FileStorage > $tmp/bls.out -grep -- '----' $tmp/bls.out | grep xxx > /dev/null -if [ $? != 0 ] ; then - print_debug "ERROR: Should find deleted files into $tmp/bls.out" - bstat=2 -fi ################################################################ p Now do a backup after making few changes @@ -292,7 +291,14 @@ echo "volume=TestVolume001" >tmp/bscan.bsr bscan_libdbi -$bin/bscan -c $conf/bacula-sd.conf $BSCANLIBDBI -n "$db_name" -u "$db_user" -m -s -b $tmp/bscan.bsr FileStorage 2>&1 > $tmp/bscan.log +# If the database has a password pass it to bscan +if test "x${db_password}" = "x"; then + PASSWD= +else + PASSWD="-P ${db_password}" +fi + +$bin/bscan -c $conf/bacula-sd.conf $BSCANLIBDBI $PASSWD -n "$db_name" -u "$db_user" -m -s -b $tmp/bscan.bsr FileStorage 2>&1 > $tmp/bscan.log cat <${cwd}/tmp/bconcmds @$out ${cwd}/tmp/log1.out diff --git a/regress/tests/acl-xattr-test b/regress/tests/acl-xattr-test index 9e0dfcafc1..ce68f1d671 100755 --- a/regress/tests/acl-xattr-test +++ b/regress/tests/acl-xattr-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a backup of the Bacula build directory with some acls then restore it. # @@ -205,13 +210,13 @@ change_jobname BackupClient1 $JobName start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label volume=TestVolume001 storage=File1 pool=File slot=1 drive=0 -setdebug level=400 trace=1 client -setdebug level=300 trace=1 director -setdebug level=300 trace=1 storage=File1 +@#setdebug level=400 trace=1 client +@#setdebug level=300 trace=1 director +@#setdebug level=300 trace=1 storage=File1 run job=$JobName yes wait messages diff --git a/regress/tests/action-on-purge-test b/regress/tests/action-on-purge-test index 5c4422f1f7..c288a32422 100755 --- a/regress/tests/action-on-purge-test +++ b/regress/tests/action-on-purge-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # TestName="action-on-purge-test" diff --git a/regress/tests/allowcompress-test b/regress/tests/allowcompress-test index 68afbbaeed..e69bca6a87 100755 --- a/regress/tests/allowcompress-test +++ b/regress/tests/allowcompress-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory using the compressed option # then restore it. Then do the same against the second storage, File1, which @@ -26,6 +31,7 @@ messages @$out ${cwd}/tmp/log1.out messages label storage=File volume=TestVolume001 +setdebug level=4 storage=File run level=Full job=$JobName storage=File yes wait messages @@ -43,6 +49,7 @@ messages @$out ${cwd}/tmp/log3.out messages label storage=File1 volume=TestVolume002 +setdebug level=4 storage=File run level=Full job=$JobName storage=File1 yes wait messages @@ -56,6 +63,7 @@ mark * done yes wait +messages quit END_OF_DATA diff --git a/regress/tests/ansi-label-tape b/regress/tests/ansi-label-tape index ad9ab44515..08af0683e7 100755 --- a/regress/tests/ansi-label-tape +++ b/regress/tests/ansi-label-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Test of ANSI labeled tapes # diff --git a/regress/tests/auto-label-test b/regress/tests/auto-label-test index 2de6f101cc..30c3b7992c 100755 --- a/regress/tests/auto-label-test +++ b/regress/tests/auto-label-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Test if Bacula can automatically create a Volume label. # diff --git a/regress/tests/backup-bacula-tape b/regress/tests/backup-bacula-tape index f24979535b..ef197a8ffd 100755 --- a/regress/tests/backup-bacula-tape +++ b/regress/tests/backup-bacula-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # to a tape then restore it, we do that twice to ensure that diff --git a/regress/tests/backup-bacula-test b/regress/tests/backup-bacula-test index d856ff6e22..7c115eec57 100755 --- a/regress/tests/backup-bacula-test +++ b/regress/tests/backup-bacula-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # then restore it. @@ -26,33 +31,36 @@ cat <$tmp/bconcmds @$out /dev/null messages @$out $tmp/log1.out -setdebug level=100 storage=File -label volume=TestVolume001 storage=File pool=File +setdebug level=4 storage=File1 +label volume=TestVolume001 storage=File1 pool=File slot=1 drive=0 +show job=$JobName +show jobs run job=$JobName yes -status storage=File -status storage=File -status storage=File -status storage=File -status storage=File -status storage=File +status storage=File1 +status storage=File1 +status storage=File1 +status storage=File1 +status storage=File1 +status storage=File1 @sleep 1 -status storage=File -status storage=File -status storage=File -status storage=File -status storage=File +status storage=File1 +status storage=File1 +status storage=File1 +status storage=File1 +status storage=File1 @sleep 1 -status storage=File -status storage=File -status storage=File -status storage=File -status storage=File +status storage=File1 +status storage=File1 +status storage=File1 +status storage=File1 +status storage=File1 wait messages @# @# now do a restore @# @$out $tmp/log2.out +setdebug level=4 storage=File1 restore where=$tmp/bacula-restores select all done yes wait @@ -61,14 +69,14 @@ quit END_OF_DATA run_bacula -check_for_zombie_jobs storage=File +check_for_zombie_jobs storage=File1 stop_bacula cat <$tmp/bconcmds @$out /dev/null messages @$out $tmp/log1.out -@#setdebug level=100 storage=File +setdebug level=4 storage=File1 run job=$JobName yes wait messages @@ -76,6 +84,8 @@ messages @# now do a restore @# @$out $tmp/log2.out +#setbandwidth client=$CLIENT limit=100 +setdebug level=4 storage=File1 restore where=$tmp/bacula-restores select all done yes wait @@ -86,12 +96,12 @@ END_OF_DATA # # Now do a second backup after making a few changes # -touch ${cwd}/build/src/dird/*.c +touch ${cwd}/build/src/dird/*.o echo "test test" > ${cwd}/build/src/dird/xxx # run_bacula -check_for_zombie_jobs storage=File +check_for_zombie_jobs storage=File1 stop_bacula check_two_logs diff --git a/regress/tests/backup-to-null b/regress/tests/backup-to-null index 7540d2fbbe..afc948ac32 100755 --- a/regress/tests/backup-to-null +++ b/regress/tests/backup-to-null @@ -1,13 +1,17 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory -# to a tape then restore it, we do that twice to ensure that -# we can correctly append to a tape. -# We also use the purge and the relabel commands as -# well as a pile of status storage commands. +# to /dev/null Of course, it's not possible to restore ;-) # TestName="backup-to-null" JobName=backuptonull + + . scripts/functions scripts/cleanup diff --git a/regress/tests/backup-win32-tape b/regress/tests/backup-win32-tape index f101da942c..86613e4425 100755 --- a/regress/tests/backup-win32-tape +++ b/regress/tests/backup-win32-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # to a tape then restore it, we do that twice to ensure that diff --git a/regress/tests/bad-label-changer b/regress/tests/bad-label-changer index f8bdc405c0..6a1aae8be5 100755 --- a/regress/tests/bad-label-changer +++ b/regress/tests/bad-label-changer @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Label two tapes, write to the first, then recycle it and destroy # the header. Bacula should discover that, mark the tape in diff --git a/regress/tests/base-job-test b/regress/tests/base-job-test index 2104b1095d..07ef5ba92b 100755 --- a/regress/tests/base-job-test +++ b/regress/tests/base-job-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a basejob backup of the Bacula build directory # then restore it. diff --git a/regress/tests/bconsole-test b/regress/tests/bconsole-test index 83b5487261..4405e89997 100755 --- a/regress/tests/bconsole-test +++ b/regress/tests/bconsole-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a couple of tests with bconsole # @@ -27,7 +32,7 @@ run_bacula print_debug "Test bconsole -l and -D with a single director definition" -$bin/bconsole -c $conf/bconsole.conf -l > $tmp/1 +$bin/bconsole -c $conf/bconsole.conf -l > $tmp/1 < /dev/null if [ $? -ne 0 ]; then print_debug "Bconsole doesn't support -l option" estat=1 @@ -63,13 +68,13 @@ perl -Mscripts::functions \ sed "s/$HOST-dir/bconsole-test-dir/" $tmp/1 >> $conf/bconsole.conf -$bin/bconsole -t -c $conf/bconsole.conf > $tmp/1 +$bin/bconsole -t -c $conf/bconsole.conf > $tmp/1 < /dev/null if [ $? -ne 0 ]; then print_debug "configuration tweak failed" estat=6 fi -$bin/bconsole -c $conf/bconsole.conf -l > $tmp/1 +$bin/bconsole -c $conf/bconsole.conf -l > $tmp/1 < /dev/null if [ $? -ne 0 ]; then print_debug "Bconsole doesn't support -l option" estat=7 @@ -111,6 +116,8 @@ if [ $? -ne 0 ]; then estat=13 fi +# Do not try to check jobmedia with this test +export CHECK_JOBMEDIA=0 stop_bacula end_test diff --git a/regress/tests/bextract-test b/regress/tests/bextract-test index fa603e99df..e43c641e0d 100755 --- a/regress/tests/bextract-test +++ b/regress/tests/bextract-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory but # split the archive into two volumes, then build a BSR with @@ -23,7 +28,7 @@ label storage=File1 volume=TestVolume001 pool=Default label storage=File1 volume=TestVolume002 pool=Default update Volume=TestVolume001 MaxVolBytes=3000000 @#setdebug level=400 dir -setdebug level=400 storage=File1 +@#setdebug level=400 storage=File1 run job=$JobName storage=File1 yes wait messages @@ -41,6 +46,7 @@ END_OF_DATA run_bacula check_for_zombie_jobs storage=File1 stop_bacula +sleep 1 mkdir -p ${cwd}/tmp/bacula-restores if test "$debug" -eq 1 ; then diff --git a/regress/tests/big-files-test b/regress/tests/big-files-test index 1f8ae60990..c9c942dda4 100755 --- a/regress/tests/big-files-test +++ b/regress/tests/big-files-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Test if Bacula can handle big fileset # This test create 2M files on a directory and @@ -28,9 +33,6 @@ sed 's%# Label Format% Label Format%' ${cwd}/bin/bacula-dir.conf > ${cwd}/tmp/1 # sed 's%Type = Backup%Type = Backup; Accurate = yes%' ${cwd}/tmp/1 > ${cwd}/bin/bacula-dir.conf sed 's%Type = Backup%Type = Backup%' ${cwd}/tmp/1 > ${cwd}/bin/bacula-dir.conf -$bperl -e "add_attribute('$conf/bacula-dir.conf', 'Max Run Time', '90min', 'Job')" -$bperl -e "add_attribute('$conf/bacula-dir.conf', 'SpoolData', 'no', 'Job')" - change_jobname MonsterFileSet $JobName start_test @@ -43,7 +45,7 @@ status all list pools messages @#setdebug level=110 storage=File -run job=$JobName spooldata=no storage=File yes +run job=$JobName storage=File yes list pools list volumes wait @@ -54,7 +56,7 @@ where Client.Name = 'localhost-fd' group by JobId, Level, StartTime, JobFiles order by JobId desc ; messages -run job=$JobName spooldata=no storage=File yes +run job=$JobName storage=File yes wait messages @# @@ -62,7 +64,7 @@ messages @# @$out ${cwd}/tmp/log2.out @#setdebug level=400 storage=File -restore where=${cwd}/many-files/bacula-restores select storage=File +restore where=${cwd}/tmp/bacula-restores select storage=File unmark * mark * count diff --git a/regress/tests/big-fileset-test b/regress/tests/big-fileset-test index b0028eeabc..1167bf4049 100755 --- a/regress/tests/big-fileset-test +++ b/regress/tests/big-fileset-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Test if Bacula can handle big fileset # diff --git a/regress/tests/big-virtual-changer-test b/regress/tests/big-virtual-changer-test index 97ae4362ba..144c683b5d 100755 --- a/regress/tests/big-virtual-changer-test +++ b/regress/tests/big-virtual-changer-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory. Create three # tapes, each in a different pool, then run two jobs both of which diff --git a/regress/tests/big-vol-test b/regress/tests/big-vol-test index fafbe55fd5..f842853dab 100755 --- a/regress/tests/big-vol-test +++ b/regress/tests/big-vol-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Create a big Volume > 5 GB and backup to it to test disk # seeking on big volumes. We cheat and artifically grow diff --git a/regress/tests/broken-media-bug-2-test b/regress/tests/broken-media-bug-2-test index a735ba7dfd..dcdc8f07b0 100755 --- a/regress/tests/broken-media-bug-2-test +++ b/regress/tests/broken-media-bug-2-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Show the broken media bug(s) again. Test by Graham Keeling. # diff --git a/regress/tests/broken-media-bug-test b/regress/tests/broken-media-bug-test index 3e6aa51a45..0c6530e5fa 100644 --- a/regress/tests/broken-media-bug-test +++ b/regress/tests/broken-media-bug-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Show the broken media bug. Test by Graham Keeling. # diff --git a/regress/tests/bscan-fast-tape b/regress/tests/bscan-fast-tape index 7c68a78a3a..ba8991889d 100755 --- a/regress/tests/bscan-fast-tape +++ b/regress/tests/bscan-fast-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory using the compressed option # then backup four times, each with incremental then diff --git a/regress/tests/bscan-tape b/regress/tests/bscan-tape index 419fd24e9d..797444a5e3 100755 --- a/regress/tests/bscan-tape +++ b/regress/tests/bscan-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory using the compressed option # then backup four times, each with incremental then diff --git a/regress/tests/bscan-test b/regress/tests/bscan-test index 49e3acf36d..81a07de274 100755 --- a/regress/tests/bscan-test +++ b/regress/tests/bscan-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory but # split the archive into two volumes then bscan it diff --git a/regress/tests/bsr-opt-test b/regress/tests/bsr-opt-test index d76e773657..a5dcb25f75 100755 --- a/regress/tests/bsr-opt-test +++ b/regress/tests/bsr-opt-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory but # split the archive into two volumes, then restore @@ -17,13 +22,14 @@ echo "${cwd}/build" >${cwd}/tmp/file-list change_jobname NightlySave $JobName start_test +MaxVolBytes=3000000 cat <${cwd}/tmp/bconcmds @$out /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File1 volume=TestVolume001 label storage=File1 volume=TestVolume002 -update Volume=TestVolume001 MaxVolBytes=3000000 +update Volume=TestVolume001 MaxVolBytes=$MaxVolBytes run job=$JobName storage=File1 yes wait messages diff --git a/regress/tests/bsr-read-test b/regress/tests/bsr-read-test index d8df4715ec..cd607b0fff 100755 --- a/regress/tests/bsr-read-test +++ b/regress/tests/bsr-read-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a backup of a small file, then do several other backups # to expand the size of a volume. Then do a restore of the first diff --git a/regress/tests/btape-fill-full-changer b/regress/tests/btape-fill-full-changer index e778c68fb2..b678e8114b 100755 --- a/regress/tests/btape-fill-full-changer +++ b/regress/tests/btape-fill-full-changer @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Test the fill command in btape # diff --git a/regress/tests/btape-fill-full-tape b/regress/tests/btape-fill-full-tape index bfa0b0d463..46cee5c736 100755 --- a/regress/tests/btape-fill-full-tape +++ b/regress/tests/btape-fill-full-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Test the fill command in btape # diff --git a/regress/tests/btape-test-changer b/regress/tests/btape-test-changer index fe240ed6e9..435a82d901 100755 --- a/regress/tests/btape-test-changer +++ b/regress/tests/btape-test-changer @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Test the test command in btape # diff --git a/regress/tests/btape-test-tape b/regress/tests/btape-test-tape index 5e91e61f20..e4f4f72569 100755 --- a/regress/tests/btape-test-tape +++ b/regress/tests/btape-test-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Test the test command in btape # diff --git a/regress/tests/bug-1227 b/regress/tests/bug-1227 index d70221a82c..54e8e098fb 100755 --- a/regress/tests/bug-1227 +++ b/regress/tests/bug-1227 @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Test that reproduce bug 1227 # diff --git a/regress/tests/bug-897 b/regress/tests/bug-897 index 4b9de5438b..f81fc0f39f 100755 --- a/regress/tests/bug-897 +++ b/regress/tests/bug-897 @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Test bug 897 # diff --git a/regress/tests/bug-fatal-test b/regress/tests/bug-fatal-test index 0677657810..911d3cbd67 100755 --- a/regress/tests/bug-fatal-test +++ b/regress/tests/bug-fatal-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Test RunScript # diff --git a/regress/tests/bvfs-test b/regress/tests/bvfs-test index aabd9a3645..17195eec6b 100755 --- a/regress/tests/bvfs-test +++ b/regress/tests/bvfs-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then create some # new files, do an Incremental and restore those two files. @@ -26,6 +31,9 @@ start_test cat <${tmp}/bconcmds @$out /dev/null messages +sql +SELECT pg_catalog.setval('file_fileid_seq', 21474836471, false); + @$out ${tmp}/log1.out label storage=File volume=TestVolume001 label storage=File volume=TestVolume002 @@ -156,6 +164,8 @@ messages .bvfs_lsfile path=$tmpsrc/ jobid=1,2,3,4,5,6,7,8 @$out ${tmp}/log31.out .bvfs_lsfile path=$tmpsrc/ jobid=1,2,3,4,5,6,7 +@$out ${tmp}/log32.out +.bvfs_lsfile path=$tmpsrc/ jobid=1,2,3,4,5,6,7,8 filename=ficheriro1.txt quit END_OF_DATA @@ -182,7 +192,7 @@ END_OF_DATA run_bconsole -diff $tmpsrc/ficheriro1.txt $tmp/bacula-restores/$tmpsrc/ficheriro1.txt &>> $tmp/d1 +diff $tmpsrc/ficheriro1.txt $tmp/bacula-restores/$tmpsrc/ficheriro1.txt > $tmp/d1 2>&1 if [ $? != 0 ]; then print_debug "ERROR: ficheriro1.txt is different" rstat=1 @@ -281,6 +291,13 @@ if [ $? != 0 ]; then estat=1 fi +awk '/\tficheriro1.txt/ { print "ok"} ' $tmp/log32.out | grep ok > /dev/null +if [ $? != 0 ]; then + print_debug "ERROR: Should find ficheriro1.txt in bvfs_lsfiles output $tmp/log32.out" + estat=1 +fi + + # # Delete .c files because we will only restored the txt files # diff --git a/regress/tests/bweb-test.pl b/regress/tests/bweb-test.pl deleted file mode 100755 index 6020b17aeb..0000000000 --- a/regress/tests/bweb-test.pl +++ /dev/null @@ -1,699 +0,0 @@ -#!/usr/bin/perl -w -use strict; - -=head1 LICENSE - - Bweb - A Bacula web interface - Bacula® - The Network Backup Solution - - Copyright (C) 2000-2010 Free Software Foundation Europe e.V. - - The main author of Bweb is Eric Bollengier. - The main author of Bacula is Kern Sibbald, with contributions from - many others, a complete list can be found in the file AUTHORS. - - This program is Free Software; you can redistribute it and/or - modify it under the terms of version two of the GNU General Public - License as published by the Free Software Foundation plus additions - that are listed in the file LICENSE. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. - - Bacula® is a registered trademark of Kern Sibbald. - The licensor of Bacula is the Free Software Foundation Europe - (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zurich, - Switzerland, email:ftf@fsfeurope.org. - -=head1 USAGE - - - You need to be in a X session - - Install Selenium IDE addon from http://seleniumhq.org/ - - Install through CPAN WWW::Selenium - $ perl -e 'install WWW::Selenium' -MCPAN - - Download Selenium RC (remote control) from http://seleniumhq.org/ - - unzip the archive, and start the Selenium server (require java >= 1.5) - $ java -jar selenium-server.jar - - Load bweb sql file - - run backup-bacula-test - - Start the test - $ ./tests/bweb-test.pl - -=cut - -use warnings; -use Time::HiRes qw(sleep); -use Test::WWW::Selenium; -use Test::More "no_plan"; -use Test::Exception; -use Getopt::Long; -use scripts::functions; -use File::Copy qw/copy move/; - -my ($login, $pass, $verbose, %part, @part, $noclean, $client, $multi); -my $url = "http://localhost:9180"; -my @available = qw/client group location run missingjob media overview config/; - -GetOptions ("login=s" => \$login, - "passwd=s" => \$pass, - "url|u=s" => \$url, - "module=s@" => \@part, - "verbose" => \$verbose, - "nocleanup" => \$noclean, - "client=s" => \$client, - "dirs" => \$multi, - ); - -die "Usage: $0 --url http://.../cgi-bin/bweb/bweb.pl [-m module] [-n]" - unless ($url); - -if (scalar(@part)) { - %part = map { $_ => 1 } @part; -} else { - %part = map { $_ => 1 } @available; -} - -if ($multi) { - $part{multidir} = 1; -} - -if (!$noclean) { - cleanup(); - `scripts/copy-confs`; - `sed -i 's/# Sched/ Sched/' $conf/bacula-dir.conf`; - start_bacula(); -} - -my $sel = Test::WWW::Selenium->new( host => "localhost", - port => 4444, - browser => "*firefox", - browser_url => $url ); - -$sel->open_ok("/cgi-bin/bweb/bweb.pl?"); -$sel->set_speed(100); - -if ($part{multidir}) { - # if the current bconsole.conf doesn't contain two sections, we - # create it - if (!get_resource("$conf/bconsole.conf", "Director", "bweb-dir")) { - copy("$conf/bconsole.conf", "$tmp/bconsole.conf.$$"); - my $r = get_resource("$conf/bconsole.conf", "Director", ".+?"); - open(FP, ">>$conf/bconsole.conf"); - $r =~ s/Name = .+$/Name = bweb1-dir/m; - print FP $r; - $r =~ s/Name = .+$/Name = bweb2-dir/m; - print FP $r; - close(FP); - } - $sel->open_ok("/cgi-bin/bweb/bweb.pl"); - $sel->click_ok("link=Configuration"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("Main Configuration"); - - # create subconf - $sel->click_ok("//button[\@name='action' and \@value='add_conf']"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("Unnamed"); - - $sel->type_ok("name", "MyBweb"); - $sel->type_ok("new_dir", "bweb1-dir"); - - $sel->type_ok("stat_job_table", "JobHisto"); - $sel->click_ok("//button[\@name='action' and \@value='apply_conf']"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("MyBweb"); - $sel->is_text_present_ok("bweb1-dir"); - - $sel->click_ok("link=Main"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("Directors"); - $sel->click_ok("link=MyBweb"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("Informations on MyBweb"); -} - -if ($part{client}) { -# test client - $sel->click_ok("link=Main"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("Running Jobs"); - - $sel->click_ok("link=Clients"); - $sel->wait_for_page_to_load_ok("30000"); - $client = $sel->get_text("//tr[\@id='even_row']/td[1]"); - - $sel->click_ok("//input[\@name='client']"); # click the first client - $sel->click_ok("//button[\@name='action' and \@value='client_status']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("Command output"); - $sel->click_ok("link=Clients"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("Running Jobs"); # This message is in client status -} - -if ($part{media}) { -# add media - $sel->click_ok("link=Main"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("Running Jobs"); - - $sel->click_ok("link=Add Media"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->select_ok("pool", "label=Scratch"); - $sel->select_ok("storage", "label=File"); - $sel->type_ok("nb", "10"); - $sel->click_ok("//button[\@name='action']"); # create 10 volumes - $sel->wait_for_page_to_load_ok("30000"); - - WAIT: { - for (1..60) { - if (eval { $sel->is_text_present("Select") }) { pass; last WAIT } - sleep(1); - } - fail("timeout"); -} - $sel->click_ok("link=All Media"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("Vol0001"); - $sel->is_text_present_ok("Vol0010"); - $sel->select_ok("mediatype", "label=File"); - $sel->select_ok("volstatus", "label=Append"); - $sel->select_ok("pool", "label=Scratch"); - $sel->click_ok("//button[\@name='action']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("Vol0001"); - $sel->click_ok("media"); - $sel->click_ok("//button[\@name='action' and \@value='update_media']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->select_ok("volstatus", "label=Archive"); - $sel->select_ok("enabled", "label=no"); - $sel->click_ok("//button[\@name='action']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("arrow_0"); - $sel->is_text_present_ok("New Volume status is: Archive"); - $sel->click_ok("link=All Media"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("Archive"); - $sel->select_ok("volstatus", "label=Append"); - $sel->click_ok("//button[\@name='action']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("media"); - $sel->click_ok("//button[\@name='action' and \@value='media_zoom']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("Volume Infos"); - - $sel->click_ok("//button[\@name='action' and \@value='prune']"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("The current Volume retention period"); - - $sel->go_back_ok(); - $sel->is_text_present_ok("Volume Infos"); - $sel->click_ok("//button[\@name='action' and \@value='purge']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("Marking it purged"); -} - -if ($part{missingjob}) { -# view missing jobs - $sel->click_ok("link=Main"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("Running Jobs"); - - $sel->click_ok("link=Missing Jobs"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("BackupClient1"); - $sel->is_text_present_ok("BackupCatalog"); - $sel->click_ok("job"); - $sel->click_ok("//input[\@name='job' and \@value='BackupCatalog']"); - $sel->click_ok("//button[\@name='action' and \@value='job']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->body_text_isnt("BackupCatalog"); -} - -if ($part{run}) { -# run a new job - $sel->click_ok("link=Main"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("Running Jobs"); - - $sel->click_ok("link=Defined Jobs"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->select_ok("job", "label=BackupClient1"); - $sel->is_text_present_ok("BackupClient1"); - $sel->click_ok("//button[\@name='action' and \@value='run_job_mod']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("Default"); - $sel->is_text_present_ok("Full Set"); - $sel->is_text_present_ok("Incremental"); - $sel->click_ok("//button[\@name='action']"); - $sel->wait_for_page_to_load_ok("30000"); - - WAIT: { - for (1..60) { - if (eval { $sel->is_text_present("Start Backup JobId") }) { pass; last WAIT } - sleep(1); - } - fail("timeout"); - } - $sel->is_text_present_ok("Log: BackupClient1 on"); - $sel->click_ok("//button[\@name='action']"); - $sel->wait_for_page_to_load_ok("30000"); - - WAIT: { - for (1..60) { - if (eval { $sel->is_text_present("Termination: Backup OK") }) { pass; last WAIT } - sleep(1); - } - fail("timeout"); - } - my $volume = $sel->get_text("//tr[\@id='even_row']/td[12]"); - $sel->click_ok("//button[\@name='action' and \@value='media']"); - $sel->wait_for_page_to_load_ok("30000"); - - my $volume_found = $sel->get_text("//tr[\@id='even_row']/td[1]"); - $sel->click_ok("media"); - $sel->text_is("//tr[\@id='even_row']/td[5]", "Append"); - $sel->click_ok("//button[\@name='action' and \@value='media_zoom']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("Volume Infos"); - $sel->click_ok("//img[\@title='terminated normally']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("//button[\@name='action' and \@value='fileset_view']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("FileSet Full Set"); - $sel->is_text_present_ok("What is included:"); - $sel->is_text_present_ok("/regress/build"); - $sel->go_back_ok(); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("//button[\@name='action' and \@value='run_job_mod']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_element_present_ok("level"); - $sel->selected_value_is("name=level", "Full"); - $sel->selected_label_is("name=fileset", "Full Set"); - $sel->selected_label_is("name=job", "BackupClient1"); - $sel->click_ok("//button[\@name='action' and \@value='fileset_view']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("FileSet Full Set"); - $sel->is_text_present_ok("/regress/build"); -} - -if ($part{group}) { -# test group - $sel->click_ok("link=Main"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("Running Jobs"); - - $sel->click_ok("link=Groups"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->text_is("//h1", "Groups"); - $sel->click_ok("//button[\@name='action' and \@value='groups_edit']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->type_ok("newgroup", "All"); - $sel->select_ok("name=client", "index=0"); - $sel->click_ok("//button[\@name='action' and \@value='groups_save']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("All"); - $sel->click_ok("//input [\@name='client_group' and \@value='All']"); - $sel->click_ok("//button[3]"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("Group: 'All'"); - $sel->selected_index_is("name=client", "0"); - $sel->click_ok("//button[\@name='action' and \@value='groups_save']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("//input[\@name='client_group' and \@value='All']"); - $sel->click_ok("//button[4]"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("//input[\@name='client']"); - $sel->click_ok("//button[\@name='action' and \@value='client_edit']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("All"); - $sel->click_ok("link=Groups"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("//button[\@name='action' and \@value='groups_edit']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->type_ok("newgroup", "Empty"); - $sel->click_ok("//button[\@name='action']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("client_group"); - $sel->is_text_present_ok("Empty"); - $sel->click_ok("//button[\@name='action' and \@value='client']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("//input[\@name='client']"); - $sel->click_ok("//button[\@name='action' and \@value='client_edit']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("link=Groups"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("//input[\@name='client_group' and \@value='Empty']"); - $sel->click_ok("//button[\@name='action' and \@value='groups_del']"); - ok($sel->get_confirmation() =~ /^Do you want to delete this group[\s\S]$/); - $sel->click_ok("link=Groups"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("//button[\@name='action']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->type_ok("newgroup", "Empty"); - $sel->click_ok("//button[\@name='action']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("Empty"); - $sel->click_ok("//input[\@name='client_group' and \@value='All']"); - $sel->click_ok("//button[\@name='action' and \@value='client']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("//input[\@name='client']"); - $sel->click_ok("//button[\@name='action' and \@value='client_edit']"); - $sel->wait_for_page_to_load_ok("30000"); - - ok(not $sel->is_checked("//input[\@name='client_group' and \@value='Empty']")); - - # click on Statistics -> Groups - $sel->click_ok("//ul[\@id='menu']/li[6]/ul/li[3]/a"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("All"); - $sel->is_text_present_ok("Empty"); - $sel->click_ok("link=Groups"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("//input[\@name='client_group' and \@value='Empty']"); - $sel->click_ok("document.forms[1].elements[4]"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->type_ok("newgroup", "EmptyGroup"); - $sel->click_ok("//button[\@name='action']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("EmptyGroup"); -} - -if ($part{location}) { -# test location - $sel->click_ok("link=Main"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("Running Jobs"); - - $sel->click_ok("link=Locations"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("//button[\@name='action' and \@value='location_add']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->type_ok("location", "Bank"); - $sel->click_ok("//button[\@name='action']"); # save - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("Bank"); - $sel->click_ok("location"); - $sel->click_ok("//button[\@name='action' and \@value='location_edit']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->type_ok("cost", "100"); - $sel->is_text_present_ok("Location: Bank"); - $sel->click_ok("//button[\@name='action']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("100"); - $sel->is_element_present_ok("//img[\@src='/bweb/inflag1.png']"); - $sel->click_ok("location"); - $sel->click_ok("//button[\@name='action' and \@value='location_edit']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->select_ok("enabled", "label=no"); - $sel->click_ok("//button[\@name='action']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_element_present_ok("//img[\@src='/bweb/inflag0.png']"); - $sel->click_ok("location"); - $sel->click_ok("//button[\@name='action' and \@value='location_edit']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->select_ok("enabled", "label=archived"); - $sel->click_ok("//button[\@name='action']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_element_present_ok("//img[\@src='/bweb/inflag2.png']"); - $sel->click_ok("location"); - $sel->click_ok("//button[\@name='action' and \@value='location_edit']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->type_ok("newlocation", "Office"); - $sel->click_ok("//button[\@name='action']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("Office"); - $sel->click_ok("link=All Media"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("media"); - $sel->click_ok("//button[\@name='action' and \@value='update_media']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->select_ok("location", "label=Office"); - $sel->click_ok("//button[\@name='action']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->selected_value_is("location", "Office"); - $sel->click_ok("//button[\@name='action' and \@value='media']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->select_ok("location", "label=Office"); - $sel->click_ok("//button[\@name='action']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->body_text_isnt("Vol0010"); - $sel->click_ok("link=Locations"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("location"); - $sel->click_ok("//button[\@name='action' and \@value='location_del']"); - ok($sel->get_confirmation() =~ /^Do you want to remove this location[\s\S]$/); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("Sorry, the location must be empty"); - $sel->click_ok("link=Locations"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("//button[\@name='action']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->type_ok("location", "OtherPlace"); - $sel->click_ok("//button[\@name='action']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("location"); - $sel->click_ok("//button[\@name='action' and \@value='media']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("media"); - $sel->click_ok("//button[\@name='action' and \@value='update_media']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->select_ok("location", "label=OtherPlace"); - $sel->click_ok("//button[\@name='action']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("link=Locations"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("location"); - $sel->click_ok("//button[\@name='action' and \@value='location_del']"); - ok($sel->get_confirmation() =~ /^Do you want to remove this location[\s\S]$/); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->body_text_isnt("Office"); -} - -if ($part{overview}) { - unless ($client) { - $sel->click_ok("link=Clients"); - $sel->wait_for_page_to_load_ok("30000"); - $client = $sel->get_text("//tr[\@id='even_row']/td[1]"); - } - $sel->click_ok("link=Main"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("Running Jobs"); - - $sel->click_ok("link=Jobs overview"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("All"); - $sel->click_ok("link=All"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("link=$client"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("BackupClient1"); - $sel->is_text_present_ok("Full Set"); -} - -if ($part{config}) { - my ($dbi, $user, $pass, $histo); - $sel->open_ok("/cgi-bin/bweb/bweb.pl"); - $sel->click_ok("link=Configuration"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("SQL Connection"); - - $sel->click_ok("//button[\@name='action' and \@value='edit_conf']"); - $sel->wait_for_page_to_load_ok("30000"); - $dbi = $sel->get_value("dbi"); - $user = $sel->get_value("user"); - $pass = $sel->get_value("password"); - $histo = $sel->get_value("stat_job_table"); - - $sel->type_ok("dbi", "dbi:Pg:database=dbi1"); - $sel->type_ok("user", "user1"); - $sel->type_ok("password", "password1"); - - $sel->type_ok("stat_job_table", ($histo eq 'Job')?"JobHisto":"Job"); - - $sel->click_ok("//button[\@name='action' and \@value='apply_conf']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->click_ok("//button[\@name='action' and \@value='edit_conf']"); - $sel->wait_for_page_to_load_ok("30000"); - - is($sel->get_value("dbi"), "dbi:Pg:database=dbi1", "verify dbi"); - is($sel->get_value("user"), "user1", "verify user"); - is($sel->get_value("password"), "password1", "verify passwd"); - - $sel->type_ok("dbi", $dbi); - $sel->type_ok("user", $user); - $sel->type_ok("password", $pass); - $sel->click_ok("//button[\@name='action' and \@value='apply_conf']"); - $sel->wait_for_page_to_load_ok("30000"); - - $sel->is_text_present_ok("SQL Connection"); - - if(0) { # not used for now - # test create conf - $sel->click_ok("//button[\@name='action' and \@value='add_conf']"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("Unnamed"); - - $sel->type_ok("name", "MyBweb2"); - $sel->type_ok("new_dir", "bweb2-dir"); - - $sel->type_ok("dbi", $dbi); - $sel->type_ok("user", $user); - $sel->type_ok("password", $pass); - - $sel->type_ok("stat_job_table", "JobHisto"); - $sel->click_ok("//button[\@name='action' and \@value='apply_conf']"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("MyBweb2"); - $sel->is_text_present_ok("bweb2-dir"); - - # test create other conf - $sel->click_ok("//button[\@name='action' and \@value='view_main_conf']"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("Main Configuration"); - - $sel->click_ok("//button[\@name='action' and \@value='add_conf']"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("Unnamed"); - - $sel->type_ok("name", "MyBweb3"); - $sel->type_ok("new_dir", "bweb3-dir"); - $sel->type_ok("user", "test"); - - $sel->click_ok("//button[\@name='action' and \@value='apply_conf']"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("MyBweb3"); - - $sel->click_ok("//button[\@name='action' and \@value='view_main_conf']"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("Main Configuration"); - $sel->is_text_present_ok("MyBweb3"); - $sel->is_text_present_ok("MyBweb2"); - - # test rename - $sel->click_ok("//input[\@name='dir' and \@value='bweb2-dir']"); - $sel->click_ok("//button[\@name='action' and \@value='view_conf']"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("MyBweb2"); - $sel->click_ok("//button[\@name='action' and \@value='edit_conf']"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("MyBweb2"); - $sel->type_ok("new_dir", "bweb-dir"); - $sel->click_ok("//button[\@name='action' and \@value='apply_conf']"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("MyBweb2"); - $sel->is_text_present_ok("bweb-dir"); - - # test delete - $sel->click_ok("//button[\@name='action' and \@value='view_main_conf']"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->is_text_present_ok("MyBweb3"); - - $sel->click_ok("//input[\@name='dir' and \@value='bweb3-dir']"); - $sel->click_ok("//button[\@name='action' and \@value='del_conf']"); - ok($sel->get_confirmation() =~ /^Do you really want to remove this Director[\s\S]$/); - $sel->wait_for_page_to_load_ok("30000"); - $sel->body_text_isnt("MyBweb3"); - $sel->is_text_present_ok("MyBweb2"); - - $sel->click_ok("//input[\@name='dir' and \@value='bweb-dir']"); - $sel->click_ok("//button[\@name='action' and \@value='del_conf']"); - ok($sel->get_confirmation() =~ /^Do you really want to remove this Director[\s\S]$/); - $sel->wait_for_page_to_load_ok("30000"); - $sel->body_text_isnt("MyBweb2"); - } -} - -if ($part{multidir}) { - # cleanup - $sel->click_ok("link=Configuration"); - $sel->wait_for_page_to_load_ok("30000"); - $sel->click_ok("//input[\@name='dir' and \@value='bweb1-dir']"); - $sel->click_ok("//button[\@name='action' and \@value='del_conf']"); - ok($sel->get_confirmation() =~ /^Do you really want to remove this Director[\s\S]$/); - $sel->wait_for_page_to_load_ok("30000"); - $sel->body_text_isnt("MyBweb"); - - if (-f "$tmp/bconsole.conf.$$") { - move("$tmp/bconsole.conf.$$", "$bin/bconsole.conf"); - } -} diff --git a/regress/tests/cancel-multiple-test b/regress/tests/cancel-multiple-test index 3ee21b2820..f20281a6a2 100755 --- a/regress/tests/cancel-multiple-test +++ b/regress/tests/cancel-multiple-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run four concurrent jobs and then cancel 2 of them # @@ -32,12 +37,11 @@ cat <>${cwd}/bin/bacula-dir.conf JobDefs { Name = "DefaultJob" Type = Backup - Client=rufus-fd + Client=${HOST}-fd FileSet="Full Set" Storage = File Messages = Standard Pool = Default - Write Bootstrap = "/home/kern/bacula/k/regress/working/NightlySave.bsr" Maximum Concurrent Jobs = 10 SpoolData=yes Max Run Time = 30min @@ -85,7 +89,12 @@ done yes wait messages -@output +@$out $tmp/log3.out +run job=RUN4 level=Full yes +@# it will cancel the jobid 6 even if jobid 1 is requested +cancel jobid=1 yes +wait +messages quit END_OF_DATA @@ -96,4 +105,12 @@ stop_bacula check_two_logs diff ${cwd}/tmp/largefile ${cwd}/tmp/bacula-restores${cwd}/tmp/largefile 2>&1 >/dev/null dstat=$? + +grep "Backup Canceled" $tmp/log3.out > /dev/null +if [ $? -eq 0 ]; then + print_debug "ERROR: 'cancel jobid=1 yes' command should not cancel an other job" + estat=1 +fi + + end_test diff --git a/regress/tests/cancel-test b/regress/tests/cancel-test index f6167d6a00..106e0ddf22 100755 --- a/regress/tests/cancel-test +++ b/regress/tests/cancel-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Test different cancel cases # Can be quite long @@ -20,6 +25,8 @@ echo "s% Schedule =%# Schedule =%g" >$outf cp ${cwd}/bin/bacula-dir.conf ${cwd}/tmp/1 sed -f ${outf} ${cwd}/tmp/1 >${cwd}/bin/bacula-dir.conf +MAXVOLBYTES=1MB + touch tmp/log1.out # Add some jobs and fileset for this test @@ -48,9 +55,10 @@ Job { } Job { Name = RUN_ERR3 - ClientRunBeforeJob="sleep 10" + ClientRunBeforeJob="/bin/sleep 10" RunScript { - Command = "sleep 600" + Command = "/bin/sleep 600" + Command = "touch $tmp/RUN_ERR3.after.%i" RunsWhen = After RunsOnFailure = Yes } @@ -58,9 +66,10 @@ Job { } Job { Name = RUN_ERR4 - ClientRunBeforeJob="sleep 10" + ClientRunBeforeJob="/bin/sleep 10" RunScript { - Command = "sleep 40" + Command = "touch $tmp/RUN_ERR4.after" + Command = "/bin/sleep 40" RunsWhen = After RunsOnFailure = Yes } @@ -74,8 +83,9 @@ start_test when=`perl -MPOSIX -e "print strftime('%F %T', localtime(time+6000))"` cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages +setbandwidth limit=500 client @$out ${cwd}/tmp/logfile1.out @################################################################ @# run a first test without volume @@ -93,8 +103,8 @@ messages @# run test with a small volume @# Expect: duration < 60 @################################################################ -label volume=TestVolume001 storage=File pool=Default -update volume=TestVolume001 MaxVolBytes=1MB +label volume=TestVolume001 storage=File1 drive=0 slot=0 pool=Default +update volume=TestVolume001 MaxVolBytes=$MAXVOLBYTES run job=$JobName yes @sleep 5 messages @@ -109,7 +119,7 @@ messages @# expect that the second job don't stay in the list @# Expect: Job2 not present at the end @################################################################ -label volume=TestVolume002 storage=File pool=Default +label volume=TestVolume002 storage=File1 drive=0 slot=0 pool=Default run job=$JobName yes @sleep 1 messages @@ -201,7 +211,7 @@ messages @# print sleep 600 @################################################################ update volume=TestVolume002 volstatus=Used -label volume=TestVolume003 storage=File pool=Default +label volume=TestVolume003 storage=File1 drive=0 slot=0 pool=Default update volume=TestVolume003 MaxVolBytes=1MB run job=RUN_ERR3 yes @sleep 20 @@ -221,7 +231,7 @@ messages @# Expect: print sleep 40 @################################################################ update volume=TestVolume003 volstatus=Used -label volume=TestVolume004 storage=File pool=Default +label volume=TestVolume004 storage=File1 drive=0 slot=0 pool=Default update volume=TestVolume004 MaxVolBytes=1MB run job=RUN_ERR4 yes @sleep 20 @@ -241,7 +251,7 @@ messages @# Test to cancel the job immediately @# Expect: duration < 30 @################################################################ -label volume=TestVolume005 storage=File pool=Default +label volume=TestVolume005 storage=File1 drive=0 slot=0 pool=Default run job=$JobName yes time cancel @@ -277,7 +287,7 @@ messages @# Expect: duration < 400 @################################################################ update volume=TestVolume005 volstatus=Used -label volume=TestVolume006 storage=File pool=Default +label volume=TestVolume006 storage=File1 drive=0 slot=0 pool=Default update volume=TestVolume006 MaxVolBytes=1MB run job=$JobName yes @sleep 5 @@ -289,7 +299,8 @@ run_bacula print_debug "Stopping FD" # stop the bacula-fd and cancel the job -kill -STOP $(pidof bacula-fd) +pid=`cat $working/bacula-fd.*.pid` +kill -STOP $pid cat <${cwd}/tmp/bconcmds @$out ${cwd}/tmp/logfile20.out @@ -306,39 +317,54 @@ END_OF_DATA run_bconsole -kill -CONT $(pidof bacula-fd) +kill -CONT $pid -check_for_zombie_jobs storage=File +check_for_zombie_jobs storage=File1 stop_bacula # A fileset or runscript error goes fast -check_duration ${cwd}/tmp/logfile1.out 30 -check_duration ${cwd}/tmp/logfile3.out 30 -check_duration ${cwd}/tmp/logfile4.out 30 -check_duration ${cwd}/tmp/logfile5.out 30 -check_duration ${cwd}/tmp/logfile6.out 30 +check_duration $tmp/logfile1.out 30 +check_duration $tmp/logfile3.out 30 +check_duration $tmp/logfile4.out 30 +check_duration $tmp/logfile5.out 30 +check_duration $tmp/logfile6.out 30 -check_duration ${cwd}/tmp/logfile8.out 550 lt -grep 'ClientAfterJob "sleep 600"' tmp/logfile8.out >/dev/null +check_duration $tmp/logfile8.out 550 lt +grep 'ClientAfterJob "/bin/sleep 600"' $tmp/logfile8.out >/dev/null if [ $? -ne 0 ]; then - print_debug "Can't find ClientAfterJob" - bstat=2 + print_debug "Can't find ClientAfterJob in $tmp/logfile8.out" + if [ -f $tmp/RUN_ERR3.after.9 ]; then + print_debug "No log found, but the $tmp/RUN_ERR3.after.9 was created" + else + print_debug "ERROR: No log found, AND the $tmp/RUN_ERR3.after.9 was not created" + fi + estat=2 fi -check_duration ${cwd}/tmp/logfile9.out 550 lt -grep 'ClientAfterJob "sleep 600"' tmp/logfile9.out >/dev/null +check_duration $tmp/logfile9.out 550 lt +grep 'ClientAfterJob "/bin/sleep 600"' $tmp/logfile9.out >/dev/null if [ $? -ne 0 ]; then - print_debug "Can't find ClientAfterJob" - bstat=2 + print_debug "Can't find ClientAfterJob in $tmp/logfile9.out" + if [ -f $tmp/RUN_ERR3.after.10 ]; then + print_debug "No log found, but the $tmp/RUN_ERR3.after.10 was created" + else + print_debug "ERROR: No log found, AND the $tmp/RUN_ERR3.after.10 was not created" + fi + estat=2 fi -grep 'ClientAfterJob "sleep 40"' tmp/logfile10.out >/dev/null +grep 'ClientAfterJob "/bin/sleep 40"' $tmp/logfile10.out >/dev/null if [ $? -ne 0 ]; then - print_debug "Can't find ClientAfterJob" - bstat=2 + print_debug "Can't find ClientAfterJob in $tmp/logfile10.out" + if [ -f $tmp/RUN_ERR4.after ]; then + print_debug "No log found, but the $tmp/RUN_ERR4.after was created" + else + print_debug "ERROR: No log found, AND the $tmp/RUN_ERR4.after was not created..." + fi + estat=2 fi # Verify the broken connection -check_duration ${cwd}/tmp/logfile20.out 400 lt +check_duration $tmp/logfile20.out 400 lt end_test diff --git a/regress/tests/comment-test b/regress/tests/comment-test index 887e7f5e7d..8a986e14e9 100755 --- a/regress/tests/comment-test +++ b/regress/tests/comment-test @@ -1,9 +1,13 @@ #!/bin/sh # -# Run a simple backup of the Bacula build directory then create some -# new files, do an Incremental and restore those two files. +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS # -TestName="incremental-test" + +# +# Test the "comment" option of "run" command +# +TestName="comment-test" JobName=Incremental . scripts/functions @@ -21,7 +25,7 @@ change_jobname CompressedTest $JobName start_test cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out run comment="This is a comment for $JobName" job=$JobName yes @@ -49,7 +53,7 @@ echo "ficheriro1.txt" >${tmpsrc}/ficheriro1.txt cp -f ${tmpsrc}/dird.c ${tmpsrc}/ficheriro2.txt cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out @# Force Incremental on the second Volume @@ -71,7 +75,7 @@ END_OF_DATA run_bconsole cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log2.out @# diff --git a/regress/tests/compress-encrypt-test b/regress/tests/compress-encrypt-test index e0924ee8d6..ffc0c03dc7 100755 --- a/regress/tests/compress-encrypt-test +++ b/regress/tests/compress-encrypt-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup with encryption and compression of the Bacula build directory # then verify the signatures. @@ -14,7 +19,7 @@ echo "${cwd}/build" >${cwd}/tmp/file-list start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File volume=TestVolume001 diff --git a/regress/tests/compressed-test b/regress/tests/compressed-test index c85c403999..3f9eeb6dd8 100755 --- a/regress/tests/compressed-test +++ b/regress/tests/compressed-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory using the compressed option # then restore it. @@ -15,7 +20,7 @@ change_jobname CompressedTest $JobName start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out status all diff --git a/regress/tests/copy-job-test b/regress/tests/copy-job-test index 5e6b2f2864..49b2783895 100755 --- a/regress/tests/copy-job-test +++ b/regress/tests/copy-job-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then copy it # to another device. @@ -46,6 +51,7 @@ list volumes @#setdebug level=100 dir @# should copy two jobs @#setdebug level=51 storage=DiskChanger +@#setdebug level=100 storage=File tags=dedup,asx,network options=h run job=copy-job yes wait messages diff --git a/regress/tests/copy-jobspan-test b/regress/tests/copy-jobspan-test index f06566e11c..827e8282dc 100755 --- a/regress/tests/copy-jobspan-test +++ b/regress/tests/copy-jobspan-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then migrate it # to another device. @@ -32,7 +37,7 @@ start_test # Write out bconsole commands cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out @#setdebug level=10 dir @@ -61,6 +66,11 @@ wait @# @# now do a restore @# +@# Check if JobMedia OK (run under Aligned) +sql +select jobid, mediaid, firstindex,lastindex,volindex from JobMedia order by jobid,volindex; +select * from JobMedia order by jobid,volindex; + @$out ${cwd}/tmp/log2.out restore where=${cwd}/tmp/bacula-restores select storage=DiskChanger unmark * diff --git a/regress/tests/copy-time-test b/regress/tests/copy-time-test index f5d926024f..1f31292cf0 100755 --- a/regress/tests/copy-time-test +++ b/regress/tests/copy-time-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then copy it # to another device. @@ -28,7 +33,7 @@ start_test # Write out bconsole commands cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File volume=FileVolume001 Pool=Default diff --git a/regress/tests/copy-uncopied-test b/regress/tests/copy-uncopied-test index 966349b150..10dd619a6c 100755 --- a/regress/tests/copy-uncopied-test +++ b/regress/tests/copy-uncopied-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a backup of the Bacula build directory on two Volumes # then copy it to another device. @@ -36,7 +41,7 @@ start_test # Write out bconsole commands cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File volume=FileVolume001 Pool=Default diff --git a/regress/tests/copy-upgrade-test b/regress/tests/copy-upgrade-test index c6b42897e7..2f3e2ea4af 100755 --- a/regress/tests/copy-upgrade-test +++ b/regress/tests/copy-upgrade-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then copy it # to another device. We test that when the original job is purged diff --git a/regress/tests/copy-volume-test b/regress/tests/copy-volume-test index e6bff27345..d82ede8f41 100755 --- a/regress/tests/copy-volume-test +++ b/regress/tests/copy-volume-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a backup of the Bacula build directory on two Volumes # then copy it to another device. diff --git a/regress/tests/data-encrypt-test b/regress/tests/data-encrypt-test index 8ef59c367f..e23e9abb6a 100755 --- a/regress/tests/data-encrypt-test +++ b/regress/tests/data-encrypt-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup with encryption and no other options # (i.e. no compression and no sparse handling) of the @@ -16,7 +21,7 @@ change_jobname NightlySave $JobName start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File volume=TestVolume001 @@ -44,8 +49,8 @@ sleep 2 check_for_zombie_jobs storage=File stop_bacula -du -s build -du -s ${cwd}/tmp/bacula-restores/ +du -s build >${cwd}/tmp/log2.out +du -s ${cwd}/tmp/bacula-restores/ >${cwd}/tmp/log2.out check_two_logs check_restore_diff diff --git a/regress/tests/debug-test b/regress/tests/debug-test index 92fecc3dc3..df39ac83ac 100755 --- a/regress/tests/debug-test +++ b/regress/tests/debug-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Attempt to backup and restore a file with the bpipe plugin # @@ -14,7 +19,7 @@ rm -f ${cwd}/working/*trace* start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File1 volume=TestVolume001 @@ -29,11 +34,11 @@ run_bacula killall -SEGV bacula-dir bacula-sd bacula-fd -test -f working/*dir*bactrace +test -f working/*dir*lockdump dstat=$? -test -f working/*fd*bactrace +test -f working/*fd*lockdump dstat=`expr $dstat + $?` -test -f working/*sd*bactrace +test -f working/*sd*lockdump dstat=`expr $dstat + $?` test -f working/*dir*traceback dstat=`expr $dstat + $?` @@ -42,11 +47,11 @@ dstat=`expr $dstat + $?` test -f working/*sd*traceback dstat=`expr $dstat + $?` -grep $JobName working/*dir*bactrace > /dev/null 2>&1 +grep $JobName working/*dir*lockdump > /dev/null 2>&1 dstat=`expr $dstat + $?` -grep bpipe-fd.so working/*fd*bactrace > /dev/null 2>&1 +grep bpipe-fd.so working/*fd*lockdump > /dev/null 2>&1 dstat=`expr $dstat + $?` -grep $JobName working/*fd*bactrace > /dev/null 2>&1 +grep $JobName working/*fd*lockdump > /dev/null 2>&1 dstat=`expr $dstat + $?` bstat=0 diff --git a/regress/tests/delete-test b/regress/tests/delete-test index 4a7aa43806..bd526152a2 100755 --- a/regress/tests/delete-test +++ b/regress/tests/delete-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # This script will test object deletion # @@ -15,7 +20,7 @@ start_test echo $PWD/build/po > tmp/file-list cat < ${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out $tmp/log1.out label storage=File volume=TestVolume001 diff --git a/regress/tests/delta-test b/regress/tests/delta-test deleted file mode 100755 index 19ee993ec8..0000000000 --- a/regress/tests/delta-test +++ /dev/null @@ -1,111 +0,0 @@ -#!/bin/sh -# -# Attempt to backup and restore a file with the delta plugin -# - -TestName="delta-test" -JobName=pluginTest -. scripts/functions - -scripts/cleanup -scripts/copy-plugin-confs - -cat << EOF >> $conf/bacula-dir.conf -FileSet { - Name = "FS_DELTA" - Include { - Options { - signature=MD5 - } - Plugin = "delta-test" - } -} -EOF - -$bperl -e 'add_attribute("$conf/bacula-dir.conf", "FileSet", "FS_DELTA", "Job", "pluginTest")' -$bperl -e 'add_attribute("$conf/bacula-dir.conf", "Accurate", "yes", "Job", "pluginTest")' - -# install the delta plugin -make -C build/src/plugins/fd install-test-plugin >/dev/null - -start_test - -cat <${cwd}/tmp/bconcmds -@$out /dev/null -messages -@$out ${cwd}/tmp/log1.out -label storage=File volume=TestVolume001 -setdebug level=150 client=$CLIENT -estimate job=$JobName level=Full -setdebug level=50 client=$CLIENT -run job=$JobName comment="read 400 bytes of passwd" yes -wait -status client=$CLIENT -messages -run job=$JobName comment="read 100 bytes of group" level=Incremental yes -wait -messages -run job=$JobName comment="read 100 bytes of hosts" level=Incremental yes -wait -messages -run job=$JobName comment="read 100 bytes of services" level=Incremental yes -wait -messages -status client=$CLIENT -quit -END_OF_DATA - -run_bacula - -cat <${cwd}/tmp/bconcmds -messages -@# -@# now do a restore -@# -@$out ${cwd}/tmp/log2.out -setdebug level=50 client=$CLIENT -restore where=$tmp select all done -yes -wait -messages -@exec "mv $tmp/delta.txt $tmp/delta.OK.txt" -restore where=$tmp jobid=1 -m * -done -yes -wait -messages -@$out ${cwd}/tmp/log3.out -status client -setdebug level=0 client=$CLIENT -quit -END_OF_DATA - -run_bconsole - -check_two_logs - -stop_bacula - -head -c 50 /etc/passwd > $tmp/source -head -c 50 /etc/group >> $tmp/source -head -c 50 /etc/hosts >> $tmp/source -head -c 100 /etc/services >> $tmp/source -head -c 400 /etc/passwd | tail -c 150 >> $tmp/source - -diff -u $tmp/source $tmp/delta.OK.txt > $tmp/d -if [ $? -ne 0 ]; then - print_debug "ERROR: delta.OK.txt and source are different, restore failed" - dstat=1 -fi - -head -c 400 /etc/passwd > $tmp/source2 -diff -u $tmp/source2 $tmp/delta.txt > $tmp/d -if [ $? -ne 0 ]; then - print_debug "ERROR: delta.txt and source2 are different, restore failed" - dstat=1 -fi - - - -end_test diff --git a/regress/tests/dev-test-root b/regress/tests/dev-test-root index 838d5d1028..e5ad77e4bf 100755 --- a/regress/tests/dev-test-root +++ b/regress/tests/dev-test-root @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # then restore it. diff --git a/regress/tests/differential-test b/regress/tests/differential-test index 9fa6504c98..fb2125239d 100755 --- a/regress/tests/differential-test +++ b/regress/tests/differential-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then create some # new files, do a differential and restore those two files. diff --git a/regress/tests/disk-changer-test b/regress/tests/disk-changer-test index 0ae1e8fea3..37f6cfa9b3 100755 --- a/regress/tests/disk-changer-test +++ b/regress/tests/disk-changer-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + . scripts/functions scripts/cleanup scripts/copy-2disk-confs diff --git a/regress/tests/dummy-test b/regress/tests/dummy-test index de8572ffd1..6c76e98dc3 100755 --- a/regress/tests/dummy-test +++ b/regress/tests/dummy-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # This is a simple dummy test (copied from incremental-test), which # simply runs some jobs then does not clean up at the end. @@ -23,7 +28,7 @@ change_jobname CompressedTest $JobName start_test cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out @#setdebug level=100 storage=File @@ -48,7 +53,7 @@ echo "ficheriro1.txt" >${tmpsrc}/ficheriro1.txt cp -f ${tmpsrc}/dird.c ${tmpsrc}/ficheriro2.txt cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out @# Force Incremental on the second Volume @@ -66,7 +71,7 @@ touch ${tmpsrc}/ficheriro1.txt touch ${tmpsrc}/ficheriro2.txt cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out run level=Incremental job=$JobName yes @@ -84,7 +89,7 @@ sed "s%a%b%g" 1 >ficheriro2.txt rm -f 1 cd ${cwd} cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out run level=Differential job=$JobName yes @@ -99,7 +104,7 @@ sleep 1 touch ${tmpsrc}/ficheriro1.txt touch ${tmpsrc}/ficheriro2.txt cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out run level=Incremental job=$JobName yes @@ -114,7 +119,7 @@ sleep 1 touch ${tmpsrc}/ficheriro1.txt touch ${tmpsrc}/ficheriro2.txt cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out run level=Incremental job=$JobName yes @@ -129,7 +134,7 @@ sleep 1 touch ${tmpsrc}/ficheriro1.txt touch ${tmpsrc}/ficheriro2.txt cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out run level=Incremental job=$JobName yes @@ -144,7 +149,7 @@ touch ${tmpsrc}/ficheriro1.txt touch ${tmpsrc}/ficheriro2.txt cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out setdebug level=200 storage=File diff --git a/regress/tests/duplicate-job-test b/regress/tests/duplicate-job-test index e72a5a6a27..2405ecf3e3 100755 --- a/regress/tests/duplicate-job-test +++ b/regress/tests/duplicate-job-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # TestName="duplicate-job-test" @@ -6,7 +11,9 @@ TestName="duplicate-job-test" scripts/cleanup scripts/copy-test-confs -echo "${cwd}/build/technotes" >${cwd}/tmp/file-list + + +echo "${cwd}/build/ChangeLog" >${cwd}/tmp/file-list # increase the maximum concurrent jobs for FD, SD and DIR perl -Mscripts::functions -e 'set_maximum_concurrent_jobs("$conf/bacula-dir.conf",100)' @@ -45,11 +52,11 @@ when=`perl -Mscripts::functions -e "get_time(300)"` start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out messages -label storage=File volume=TestVolume001 +label storage=File volume=TestVolume001 slot=1 drive=0 @#setdebug level=100 storage=File @############################################## @# AllowDuplicates = Yes, both jobs should work diff --git a/regress/tests/eighty-simultaneous-jobs-tape b/regress/tests/eighty-simultaneous-jobs-tape index 4d1c92edcc..bbb7fb0532 100755 --- a/regress/tests/eighty-simultaneous-jobs-tape +++ b/regress/tests/eighty-simultaneous-jobs-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run eighty jobs at the same time # diff --git a/regress/tests/encrypt-bug-test b/regress/tests/encrypt-bug-test index c357188f5f..c6c810b31c 100755 --- a/regress/tests/encrypt-bug-test +++ b/regress/tests/encrypt-bug-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of untitled15.jpg that fails to # restore properly in bug #763 @@ -25,7 +30,7 @@ change_jobname NightlySave $JobName start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File volume=TestVolume001 diff --git a/regress/tests/eot-fail-tape b/regress/tests/eot-fail-tape index aad6658c3c..2fcb09b1ed 100755 --- a/regress/tests/eot-fail-tape +++ b/regress/tests/eot-fail-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # TestName="eot-fail-tape" diff --git a/regress/tests/errors-test b/regress/tests/errors-test index 0b9865e4dd..66df41a1c3 100755 --- a/regress/tests/errors-test +++ b/regress/tests/errors-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Test errors # @@ -18,7 +23,7 @@ echo "${cwd}/build/po" >${cwd}/tmp/file-list start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/LOCAL_INC_ERR.log label storage=File volume=TestVolume001 diff --git a/regress/tests/estimate-test b/regress/tests/estimate-test index 8fd5e5996b..390d8a4332 100755 --- a/regress/tests/estimate-test +++ b/regress/tests/estimate-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # then restore it. diff --git a/regress/tests/etc-test-root b/regress/tests/etc-test-root index 9ba0b1105c..4d7c9f7b1a 100755 --- a/regress/tests/etc-test-root +++ b/regress/tests/etc-test-root @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # then restore it. diff --git a/regress/tests/exclude-dir-test b/regress/tests/exclude-dir-test index 233d688bcf..6f3f6b1f1f 100755 --- a/regress/tests/exclude-dir-test +++ b/regress/tests/exclude-dir-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Author: Eric Bollengier, 2009 # License: AGPLv3 @@ -46,7 +51,7 @@ touch ${cwd}/build/src/xxtestdir/.nobkp cp ${cwd}/build/src/dird/*.c ${cwd}/build/src/xxtestdir cat >tmp/bconcmds <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out @#setdebug level=150 storage=tape @@ -56,7 +61,7 @@ list volumes list jobs status storage=tape messages -setdebug level=200 storage=tape +@#setdebug level=200 storage=tape @#setdebug level=200 client restore where=${cwd}/tmp/bacula-restores select all storage=tape done yes diff --git a/regress/tests/fifo-test b/regress/tests/fifo-test index dffdf67797..5803b0077a 100755 --- a/regress/tests/fifo-test +++ b/regress/tests/fifo-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Attempt to backup from a fifo and restore to a fifo # @@ -19,13 +24,18 @@ cat ${file} >${cwd}/tmp/bfifo& start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out -label storage=File1 volume=TestVolume001 +label storage=File1 volume=TestVolume001 slot=1 drive=0 +setdebug level=10 storage=File1 run job=$JobName storage=File1 yes wait messages +list volumes +sql +select jobid,mediaid,startblock,endblock from JobMedia; + quit END_OF_DATA @@ -33,7 +43,7 @@ END_OF_DATA run_bacula cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @# @# now do a restore @@ -54,7 +64,12 @@ run_bconsole check_for_zombie_jobs storage=File1 stop_bacula +if [ "$debug" = 1 ] ; then + $bin/bls -d 50 -v -c $conf/bacula-sd.conf -V 'TestVolume001' FileStorage1 + ls -l ${cwd}/tmp/TestVolume* +fi + check_two_logs -diff ${file} ${cwd}/tmp/${file} +diff ${file} ${cwd}/tmp/${file} >/dev/null 2>&1 dstat=$? end_test diff --git a/regress/tests/fileregexp-test b/regress/tests/fileregexp-test index 7a0ed090d8..d94de1ab4f 100755 --- a/regress/tests/fileregexp-test +++ b/regress/tests/fileregexp-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # prune file records, then restore only README files. diff --git a/regress/tests/fixed-block-size-tape b/regress/tests/fixed-block-size-tape index 79ec0c0088..c62dc542a5 100755 --- a/regress/tests/fixed-block-size-tape +++ b/regress/tests/fixed-block-size-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # to a tape where we set the minimum and maximum block diff --git a/regress/tests/four-concurrent-jobs-tape b/regress/tests/four-concurrent-jobs-tape index cf31406593..3dba6b0aea 100755 --- a/regress/tests/four-concurrent-jobs-tape +++ b/regress/tests/four-concurrent-jobs-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run four jobs at the same time # diff --git a/regress/tests/four-concurrent-jobs-test b/regress/tests/four-concurrent-jobs-test index ace393f34b..8e47b1720c 100755 --- a/regress/tests/four-concurrent-jobs-test +++ b/regress/tests/four-concurrent-jobs-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run four jobs at the same time, with two Volumes. # Set max Vol bytes of first volume @@ -17,7 +22,7 @@ change_jobname NightlySave $JobName start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File1 diff --git a/regress/tests/four-jobs-tape b/regress/tests/four-jobs-tape index 86c44b8c31..924518e06b 100755 --- a/regress/tests/four-jobs-tape +++ b/regress/tests/four-jobs-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory using the compressed option # then backup four times, each with incremental then finally restore. diff --git a/regress/tests/four-jobs-test b/regress/tests/four-jobs-test index c57d38c774..6cdf0988d0 100755 --- a/regress/tests/four-jobs-test +++ b/regress/tests/four-jobs-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory using the compressed option # then backup four times, each with incremental then finally restore. @@ -16,7 +21,7 @@ change_jobname CompressedTest $JobName start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null estimate job=$JobName listing estimate job=$JobName estimate job=$JobName @@ -39,7 +44,7 @@ touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o # run a second job # cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out run job=$JobName yes @@ -57,7 +62,7 @@ touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o # run a third job # cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out run job=$JobName yes @@ -75,7 +80,7 @@ touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o # run a fourth job # cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out run job=$JobName yes @@ -91,7 +96,7 @@ check_for_zombie_jobs storage=File # now do several restores to ensure we cleanup between jobs # cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null restore where=${cwd}/tmp/bacula-restores select all storage=File done yes wait diff --git a/regress/tests/full-tape-tests b/regress/tests/full-tape-tests index 493ce0f780..3fdd9367ac 100755 --- a/regress/tests/full-tape-tests +++ b/regress/tests/full-tape-tests @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run full tape tests assumes you have an autochanger # diff --git a/regress/tests/gigaslam-sparse-test b/regress/tests/gigaslam-sparse-test index b7b9d1c8ce..c8c877965c 100755 --- a/regress/tests/gigaslam-sparse-test +++ b/regress/tests/gigaslam-sparse-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory using the Sparse option # then restore it. @@ -22,7 +27,7 @@ cd ${cwd} start_test cat >${cwd}/tmp/bconcmds <>${cwd}/tmp/file-list start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File diff --git a/regress/tests/incremental-2disk b/regress/tests/incremental-2disk index b4bf8292d0..79ba41f131 100755 --- a/regress/tests/incremental-2disk +++ b/regress/tests/incremental-2disk @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then create some # new files, do an Incremental and restore those two files. diff --git a/regress/tests/incremental-2media b/regress/tests/incremental-2media index 9e301c8feb..9417c7d079 100755 --- a/regress/tests/incremental-2media +++ b/regress/tests/incremental-2media @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then create some # new files, do an Incremental onto a different medium diff --git a/regress/tests/incremental-2media-tape b/regress/tests/incremental-2media-tape index 0c3f1ca732..ff4c0f0577 100755 --- a/regress/tests/incremental-2media-tape +++ b/regress/tests/incremental-2media-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then create some # new files, do an Incremental onto a different medium diff --git a/regress/tests/incremental-changer b/regress/tests/incremental-changer index 6eb5a5b959..8d4a5c6a7c 100755 --- a/regress/tests/incremental-changer +++ b/regress/tests/incremental-changer @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then create some # new files, do an Incremental and restore those two files. diff --git a/regress/tests/incremental-tape b/regress/tests/incremental-tape index 198834f6e5..5b5fe23c05 100755 --- a/regress/tests/incremental-tape +++ b/regress/tests/incremental-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then create some # new files, do an Incremental and restore those two files. diff --git a/regress/tests/incremental-test b/regress/tests/incremental-test index d7fc56ef1b..dd9a456368 100755 --- a/regress/tests/incremental-test +++ b/regress/tests/incremental-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then create some # new files, do an Incremental and restore those two files. @@ -21,10 +26,10 @@ change_jobname CompressedTest $JobName start_test cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out -@#setdebug level=100 storage=File +setdebug level=4 storage=File @#setdebug level=200 client @#setdebug level=100 director label storage=File volume=TestVolume001 @@ -46,10 +51,11 @@ echo "ficheriro1.txt" >${tmpsrc}/ficheriro1.txt cp -f ${tmpsrc}/dird.c ${tmpsrc}/ficheriro2.txt cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out @# Force Incremental on the second Volume +setdebug level=4 storage=File update volume=TestVolume001 VolStatus=Used run level=Differential job=$JobName yes wait @@ -64,9 +70,10 @@ touch ${tmpsrc}/ficheriro1.txt touch ${tmpsrc}/ficheriro2.txt cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out +setdebug level=4 storage=File run level=Incremental job=$JobName yes wait messages @@ -82,9 +89,10 @@ sed "s%a%b%g" 1 >ficheriro2.txt rm -f 1 cd ${cwd} cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out +setdebug level=4 storage=File run level=Differential job=$JobName yes wait messages @@ -97,9 +105,10 @@ sleep 1 touch ${tmpsrc}/ficheriro1.txt touch ${tmpsrc}/ficheriro2.txt cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out +setdebug level=4 storage=File run level=Incremental job=$JobName yes wait messages @@ -112,9 +121,10 @@ sleep 1 touch ${tmpsrc}/ficheriro1.txt touch ${tmpsrc}/ficheriro2.txt cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out +setdebug level=4 storage=File run level=Incremental job=$JobName yes wait messages @@ -127,9 +137,10 @@ sleep 1 touch ${tmpsrc}/ficheriro1.txt touch ${tmpsrc}/ficheriro2.txt cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out +setdebug level=4 storage=File run level=Incremental job=$JobName yes wait messages @@ -142,10 +153,10 @@ touch ${tmpsrc}/ficheriro1.txt touch ${tmpsrc}/ficheriro2.txt cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out -setdebug level=200 storage=File +setdebug level=4 storage=File run level=Incremental job=$JobName yes wait messages diff --git a/regress/tests/lib-tape-root b/regress/tests/lib-tape-root index c7a97cca8c..af06ec5a5b 100755 --- a/regress/tests/lib-tape-root +++ b/regress/tests/lib-tape-root @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the /lib directory # then restore it. diff --git a/regress/tests/lib-test-root b/regress/tests/lib-test-root index 48067b2557..e05dc1f7ff 100755 --- a/regress/tests/lib-test-root +++ b/regress/tests/lib-test-root @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # then restore it. diff --git a/regress/tests/lockmgr-test b/regress/tests/lockmgr-test index cab94bb3b1..a88d9afbec 100755 --- a/regress/tests/lockmgr-test +++ b/regress/tests/lockmgr-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Test lockmanager # @@ -40,10 +45,14 @@ if [ "$debug" = 1 ]; then fi cat <$tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out $tmp/log1.out -.die deadlock storage +setdebug level=15 dir +setdebug level=15 storage=File1 +status dir +status storage=File1 +.die deadlock storage=File1 .die deadlock dir quit END_OF_DATA @@ -51,7 +60,7 @@ END_OF_DATA run_bacula stop_bacula -nb=`ls $working/*.traceback $working/*.bactrace | wc -l` +nb=`ls $working/*.traceback $working/*.lockdump | wc -l` if [ $nb != 4 ]; then print_debug "ERROR: Should find 4 traces, not $nb" estat=1 diff --git a/regress/tests/lzo-encrypt-test b/regress/tests/lzo-encrypt-test index d2414718ba..f058d443c2 100755 --- a/regress/tests/lzo-encrypt-test +++ b/regress/tests/lzo-encrypt-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup with encryption and compression of the Bacula build directory # then verify the signatures. @@ -14,7 +19,7 @@ echo "${cwd}/build" >${cwd}/tmp/file-list start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File volume=TestVolume001 diff --git a/regress/tests/lzo-test b/regress/tests/lzo-test index 96a8dab552..2c278485c1 100755 --- a/regress/tests/lzo-test +++ b/regress/tests/lzo-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory using the compressed option # then restore it. @@ -14,7 +19,7 @@ echo "${cwd}/build" >${cwd}/tmp/file-list start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out status all diff --git a/regress/tests/manual-two-vol-tape b/regress/tests/manual-two-vol-tape index 9d7d52dbaf..6e46b3930a 100755 --- a/regress/tests/manual-two-vol-tape +++ b/regress/tests/manual-two-vol-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a job with a limited tape size so that the tape fills up. # Then manually unload the tape and load a new one, label diff --git a/regress/tests/maxbw-test b/regress/tests/maxbw-test new file mode 100755 index 0000000000..87ecc7961d --- /dev/null +++ b/regress/tests/maxbw-test @@ -0,0 +1,117 @@ +#!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + +# +# Verify Maximum Bandwidth FD parameter +# + +TestName="maxbw-test" +JobName=NightlySave +. scripts/functions + +scripts/cleanup +scripts/copy-test-confs + +$bperl -e 'add_attribute("$conf/bacula-fd.conf", "CommCompression", "no", "FileDaemon")' +$bperl -e 'add_attribute("$conf/bacula-dir.conf", "CommCompression", "no", "Director")' +$bperl -e 'add_attribute("$conf/bacula-sd.conf", "CommCompression", "no", "Storage")' +$bperl -e 'add_attribute("$conf/bacula-fd.conf", "MaximumBandwidthPerJob", "3MB/s", "FileDaemon")' + +echo $cwd/build > $tmp/file-list + +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=File volume=TestVolume001 +run level=full job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bacula + +cat <${cwd}/tmp/bconcmds +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=$tmp select all done +yes +wait +messages +quit +END_OF_DATA + +run_bconsole + +stop_bacula + +awk '/Rate:/ { if ($2 > 2500 && $2 < 3500) { print "OK" } + else { print "ERROR " $0 "(> 2500 && < 3500)" }}' $tmp/log1.out > $tmp/res + +awk '/Rate:/ { if ($2 > 2500 && $2 < 3500) { print "OK" } + else { print "ERROR" $0 "(> 2500 && < 3500)" }}' $tmp/log2.out >> $tmp/res + +a=`grep OK $tmp/res | wc -l` +if [ $a -ne 2 ]; then + print_debug "ERROR: problem with backup or restore speed on bacula-fd.conf" + cat $tmp/res + estat=1 +fi + +sed 's/MaximumBandwidth.*//g' $conf/bacula-fd.conf >$conf/bacula-fd.conf.tmp +mv -f $conf/bacula-fd.conf.tmp $conf/bacula-fd.conf + +$bperl -e 'add_attribute("$conf/bacula-dir.conf", "MaximumBandwidth", "3MB/s", "Job", "$JobName")' + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +run level=full job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bacula + +cat <${cwd}/tmp/bconcmds +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=$tmp select all done +yes +wait +messages +quit +END_OF_DATA + +run_bconsole + +stop_bacula + +check_two_logs + +awk '/Rate:/ { if ($2 > 2500 && $2 < 3500) { print "OK" } + else { print "ERROR" $0 "(> 2500 && < 3500)" }}' $tmp/log1.out > $tmp/res + +awk '/Rate:/ { if ($2 > 2500 && $2 < 3500) { print "OK" } + else { print "ERROR" $0 "(>2500 && < 3500)" }}' $tmp/log2.out >> $tmp/res + +a=`grep OK $tmp/res | wc -l` +if [ $a -ne 3 ]; then + print_debug "ERROR: problem with backup or restore speed on bacula-dir.conf" + cat $tmp/res + estat=2 +fi + +end_test diff --git a/regress/tests/maxbytes-test b/regress/tests/maxbytes-test index 8b9ea83f4b..b3c1a7555e 100755 --- a/regress/tests/maxbytes-test +++ b/regress/tests/maxbytes-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a job with small Maximum Volume Bytes. It should # create a lot of volumes. The test stresses auto-creation of @@ -23,10 +28,10 @@ change_jobname NightlySave $JobName start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out -@#setdebug level=100 Storage=File1 +setdebug level=50 Storage=File1 run job=$JobName level=Full Storage=File1 yes wait list volumes diff --git a/regress/tests/maxdev-test b/regress/tests/maxdev-test index 981019fa6a..b24d4bbe8a 100755 --- a/regress/tests/maxdev-test +++ b/regress/tests/maxdev-test @@ -1,4 +1,4 @@ -#!/bin/sh + #!/bin/sh # # Run backups with dummy tape driver # This test setups an Autochanger with 80 slots @@ -135,4 +135,3 @@ if [ $? -ne 0 ]; then estat=1 fi end_test - diff --git a/regress/tests/maxruntime-test b/regress/tests/maxruntime-test index 0381095a4f..e0847df9d2 100755 --- a/regress/tests/maxruntime-test +++ b/regress/tests/maxruntime-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Test MaxRunTime # Note: this test doesn't really do anything yet. It is used in helping @@ -16,7 +21,7 @@ rm -f ${cwd}/tmp/RUN*log cp -f ${cwd}/scripts/bacula-dir.conf.maxruntime ${cwd}/bin/bacula-dir.conf WHEN=`date '+%Y-%m-%d %H:%M:%S'` -echo "${cwd}/build/po" >${cwd}/tmp/file-list +echo "${cwd}/build" >${cwd}/tmp/file-list start_test @@ -30,6 +35,7 @@ wait messages setdebug level=60 dir run job=RUN_MAXRUNTIME pool=PoolA yes +run job=RUN_MAXRUNTIME fileset=FS_TESTJOB pool=PoolA yes wait messages st dir @@ -60,4 +66,13 @@ else bstat=1 fi +nb=`grep -e ': Fatal error: Max run time exceeded. Job canceled.' ${cwd}/tmp/log1.out | wc -l` +if [ $nb -eq 1 ] +then + [ "$debug" = 1 ] && echo MAXRUNTIME ok +else + echo "MAXRUNTIME in error, should not cancel the second job" + bstat=1 +fi + end_test diff --git a/regress/tests/maxtime-test b/regress/tests/maxtime-test index 6f1c521615..14715fec8a 100755 --- a/regress/tests/maxtime-test +++ b/regress/tests/maxtime-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Test MaxWaitTime, MaxRunTime and MaxStartDelay # @@ -19,18 +24,21 @@ echo "${cwd}/build/po" >${cwd}/tmp/file-list start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label volume=TestVolume001 pool=PoolA @$out ${cwd}/tmp/RUN_MAXTIME.log @# no media => have to wait +@# JobId 1 run job=RUN_MAXWAITTIME comment="Should fail" pool=Default yes @sleep 2 @# storage is used by RUN_MAXWAITTIME => have to wait +@# JobId 2 run job=RUN_MAXSTARTDELAY comment="Should fail" pool=PoolA when="$WHEN" yes @sleep 2 @# storage is used by the first MAXWAITTIME, but should work +@# JobId 3 run job=RUN_MAXWAITTIME comment="Should work" pool=PoolA yes @sleep 60 label volume=TestVolume002 pool=Default @@ -39,10 +47,13 @@ mount mount wait messages +@# JobId 4 run job=RUN_MAXRUNTIME comment="Should fail" pool=PoolA yes wait messages -st dir +status dir +status client +@sleep 2 quit END_OF_DATA diff --git a/regress/tests/maxuseduration-test b/regress/tests/maxuseduration-test index ab552a8f57..5cde51a0aa 100755 --- a/regress/tests/maxuseduration-test +++ b/regress/tests/maxuseduration-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run four jobs at the same time, with four Volumes, but set # Maximum Job Volumes = 1 on each of the Volumes. Note, @@ -17,7 +22,7 @@ change_jobname NightlySave $JobName start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File1 volume=TestVolume001 diff --git a/regress/tests/maxvol-test b/regress/tests/maxvol-test index 0b33c7813f..2dec710988 100755 --- a/regress/tests/maxvol-test +++ b/regress/tests/maxvol-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run four jobs at the same time, with four Volumes, but set # Maximum Job Volumes = 1 on each of the Volumes. Note, @@ -21,7 +26,7 @@ change_jobname NightlySave $JobName start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File1 volume=TestVolume001 diff --git a/regress/tests/maxvol2-test b/regress/tests/maxvol2-test index 1bb3bcd6f9..7c25fa5b51 100755 --- a/regress/tests/maxvol2-test +++ b/regress/tests/maxvol2-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory but # create three volumes and do six backups causing the @@ -17,7 +22,7 @@ change_jobname NightlySave $JobName start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File1 volume=TestVolume001 @@ -30,7 +35,7 @@ update Volume=TestVolume002 maxvoljobs=1 update Volume=TestVolume003 volretention=10s update Volume=TestVolume003 maxvoljobs=1 list volumes -setdebug level=200 storage=File1 +@#setdebug level=200 storage=File1 run job=$JobName storage=File1 level=full yes run job=$JobName storage=File1 level=full yes run job=$JobName storage=File1 level=full yes @@ -62,6 +67,7 @@ wait messages list volumes @sleep 11 +@#setdebug level=40 storage run job=$JobName storage=File1 level=full yes run job=$JobName storage=File1 level=full yes run job=$JobName storage=File1 level=full yes diff --git a/regress/tests/memory-bug-tape b/regress/tests/memory-bug-tape index 680061e659..4729486b3c 100755 --- a/regress/tests/memory-bug-tape +++ b/regress/tests/memory-bug-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Do a whole lot of select commands. This test is one where the # Director should be run under valgrind. This exercises SQL a bit diff --git a/regress/tests/messages-test b/regress/tests/messages-test index ea83b6b4a3..fb6715a56e 100755 --- a/regress/tests/messages-test +++ b/regress/tests/messages-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # then restore it. @@ -36,7 +41,7 @@ sed -f ${outf} $tmp/1 >$scripts/bacula-dir.conf cat <$tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out $tmp/log1.out @#setdebug level=100 storage=File diff --git a/regress/tests/migration-job-purge-test b/regress/tests/migration-job-purge-test index c7db6bd1bf..2bb3a7e018 100755 --- a/regress/tests/migration-job-purge-test +++ b/regress/tests/migration-job-purge-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then migrate it # to another device, and see if PurgeMigrationJob works as expected. diff --git a/regress/tests/migration-job-test b/regress/tests/migration-job-test index b9e4f28b5e..7e6d076106 100755 --- a/regress/tests/migration-job-test +++ b/regress/tests/migration-job-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then migrate it # to another device. diff --git a/regress/tests/migration-jobspan-test b/regress/tests/migration-jobspan-test index e90227ef3d..b14456383d 100755 --- a/regress/tests/migration-jobspan-test +++ b/regress/tests/migration-jobspan-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then migrate it # to another device. diff --git a/regress/tests/migration-occupancy-test b/regress/tests/migration-occupancy-test index d74f9f15a6..f4f7f29828 100755 --- a/regress/tests/migration-occupancy-test +++ b/regress/tests/migration-occupancy-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then migrate it # to another device. diff --git a/regress/tests/migration-time-test b/regress/tests/migration-time-test index 5a124ffa52..9758f3c377 100755 --- a/regress/tests/migration-time-test +++ b/regress/tests/migration-time-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then migrate it # to another device. diff --git a/regress/tests/migration-volume-test b/regress/tests/migration-volume-test index e2c19b8319..7b14f8d8dc 100755 --- a/regress/tests/migration-volume-test +++ b/regress/tests/migration-volume-test @@ -1,4 +1,9 @@ - #!/bin/sh +#!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a backup of the Bacula build directory on two Volumes # then migrate it to another device. diff --git a/regress/tests/multi-client-test b/regress/tests/multi-client-test index d0884cb13d..c26eaf1f44 100755 --- a/regress/tests/multi-client-test +++ b/regress/tests/multi-client-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run four jobs at the same time, with two Volumes. # Set max Vol bytes of first volume @@ -17,7 +22,7 @@ change_jobname NightlySave $JobName start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out @# Make sure we can contact all clients diff --git a/regress/tests/multi-drive-group-test b/regress/tests/multi-drive-group-test index 22cb4bee91..60aa4506ba 100755 --- a/regress/tests/multi-drive-group-test +++ b/regress/tests/multi-drive-group-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # This script is used to test multiple devices grouped in # the director configuration @@ -35,7 +40,7 @@ for i in 2 3 4; do sed "s/FileStorage/FileStorage$i/" $tmp/2 >> $conf/bacula-sd.conf done -disable_pluguins +disable_plugins echo "$cwd/build" >${cwd}/tmp/file-list echo "$tmp/fifo" >>${cwd}/tmp/file-list diff --git a/regress/tests/multi-drive-test b/regress/tests/multi-drive-test index 2cb648e0f6..fd00fe01ee 100755 --- a/regress/tests/multi-drive-test +++ b/regress/tests/multi-drive-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # This script is used to test multiple devices grouped in # the director configuration @@ -25,7 +30,7 @@ for i in 2 3 4; do sed "s/FileStorage/FileStorage$i/" $tmp/2 >> $conf/bacula-sd.conf done -disable_pluguins +disable_plugins echo "$cwd/build" >${cwd}/tmp/file-list echo "$tmp/fifo" >>${cwd}/tmp/file-list @@ -41,7 +46,7 @@ start_test # # Write out bconsole commands cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out run level=full job=backup storage=File pool=Default yes diff --git a/regress/tests/multi-drive1-test b/regress/tests/multi-drive1-test index c9ea2723f3..071e500405 100755 --- a/regress/tests/multi-drive1-test +++ b/regress/tests/multi-drive1-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # This script is used to test multiple devices grouped in # the director configuration @@ -32,7 +37,7 @@ for i in 2 3 4; do sed "s/FileStorage/FileStorage$i/" $tmp/2 >> $conf/bacula-sd.conf done -disable_pluguins +disable_plugins echo "$cwd/build" >${cwd}/tmp/file-list echo "$tmp/fifo" >>${cwd}/tmp/file-list diff --git a/regress/tests/multi-storage-test b/regress/tests/multi-storage-test index 7486eebd4d..f7d3982a24 100755 --- a/regress/tests/multi-storage-test +++ b/regress/tests/multi-storage-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # This script uses the virtual disk autochanger # @@ -42,7 +47,7 @@ start_test # Write out bconsole commands cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=tape volume=TestVolume001 Pool=Default slot=1 drive=0 @@ -61,7 +66,7 @@ echo "ficheriro2.txt" >${cwd}/build/po/ficheriro2.txt cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out @# Force Incremental on the second Volume diff --git a/regress/tests/multi2-storage-test b/regress/tests/multi2-storage-test index ec55cf51c1..8178e22377 100755 --- a/regress/tests/multi2-storage-test +++ b/regress/tests/multi2-storage-test @@ -1,11 +1,18 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # This script uses the virtual disk autochanger # TestName="multi-storage-test" -JobName=backup +JobName=NightlySave . scripts/functions +export REGRESS_CHECK_CORRUPTION=no + scripts/cleanup scripts/copy-2disk-confs scripts/prepare-disk-changer @@ -39,7 +46,7 @@ print; ' $conf/bacula-dir.conf > $tmp/1 cp $tmp/1 $conf/bacula-dir.conf -disable_pluguins +disable_plugins echo "${cwd}/build" >${cwd}/tmp/file-list @@ -147,7 +154,7 @@ status storage=File3 @# setdebug trace=1 level=110 client setdebug trace=1 level=110 director -restore where=${cwd}/tmp/bacula-restores select all done yes +restore where=${cwd}/tmp/bacula-restores1 select all done yes @sleep 10 messages status dir @@ -160,6 +167,10 @@ sql select * FROM Storage; select VolumeName, Name, StorageId, MediaType FROM Media JOIN Storage USING (StorageId); +@$out ${cwd}/tmp/log24.out +restore where=${cwd}/tmp/bacula-restores select all done yes +wait +messages quit END_OF_DATA @@ -181,6 +192,8 @@ cp $tmp/log22.out $tmp/log2.out check_two_logs cp $tmp/log23.out $tmp/log2.out check_two_logs +cp $tmp/log24.out $tmp/log2.out +check_two_logs check_restore_diff diff --git a/regress/tests/next-vol-test b/regress/tests/next-vol-test index 5ce035252c..f65e427270 100755 --- a/regress/tests/next-vol-test +++ b/regress/tests/next-vol-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # This script will test next vol algo with # vtape @@ -9,6 +14,10 @@ # Test with recycle=no # Track scratch usage # +# Please do not write any more tests with so many Jobs and combinations, +# because when something goes wrong it is very hard and time consuming +# to know what caused the failure. +# . scripts/functions TestName="next-vol-test" @@ -67,24 +76,28 @@ cat < ${cwd}/tmp/bconcmds @$out ${cwd}/tmp/log2.out @# Must choose vol56 @# Pool + Append + Enabled + InChanger +@# JobId=1 run level=full pool=Test NightlySave yes wait message list volumes @# Must choose vol58 @# Pool + Recycled + Enabled + InChanger +@# JobId=2 run level=full pool=Test NightlySave yes wait message list volume @# Must choose vol46 @# Pool + Purged + Enabled + InChanger +@# JobId=3 run level=full pool=Test NightlySave yes wait message list volumes @# Must choose vol55 @# Pool + Full + Recycle + Enabled + InChanger +@# JobId=4 run level=full pool=Test NightlySave yes wait message @@ -93,29 +106,35 @@ list volumes @# No more in Test pool, get from scratch @# vol52 is Append, but have 1 job and MaxJob @# Scratch + Recycle + Enabled + InChanger +@# JobId=5 run level=full pool=Test NightlySave yes wait message list volume @# Must choose vol52 @# Scratch + Purged + Enabled + InChanger + LastW -run level=full pool=Test NightlySave yes +@# JobId=6 +run level=Full pool=Test NightlySave yes wait message list volume @# Must choose vol57 @# Scratch + Purged + Enabled + InChanger + LastW +@# JobId=7 run level=full pool=Test NightlySave yes wait message list volumes @# Must choose vol53 @# Scratch + Purged + Enabled + InChanger + LastW +@# JobId=8 run level=full pool=Test NightlySave yes wait messages list volumes +@# JobId=9 restore fileset="Full Set" pool=Test where=${cwd}/tmp/bacula-restores select all done +1 yes wait messages @@ -180,30 +199,35 @@ list volume messages @# Must choose file1 @# Pool + Append + Lowest MediaId +@# JobId=10 run level=full pool=Test storage=File NightlySave yes wait message list volume @# Must choose file5 @# Pool + Append + Lowest MediaId (only once) +@# JobId=11 run level=full pool=Test storage=File NightlySave yes wait message list volume @# Must choose file8 @# Pool + Append + Lowest MediaId +@# JobId=12 run level=full pool=Test storage=File NightlySave yes wait message list volume @# Must choose file3 @# Pool + Recycle +@# JobId=13 run level=full pool=Test storage=File NightlySave yes wait message list volume @# Must choose file11 @# Pool + Purged +@# JobId=14 run level=full pool=Test storage=File NightlySave yes wait message @@ -211,6 +235,7 @@ list volume @# Must choose file6 @# Pool + Full (prunable) setdebug level=50 director +@# JobId=15 run level=full pool=Test storage=File NightlySave yes wait message @@ -219,6 +244,7 @@ list volume @sleep 5 @# Must choose file8 @# Pool + Full (prunable) +@# JobId=16 run level=full pool=Test storage=File NightlySave yes wait message @@ -226,12 +252,14 @@ update volume=file8 enabled=no list volume @# Must choose file10 @# (no more Pool) Scratch + Append +@# JobId=17 run level=full pool=Test storage=File NightlySave yes wait message list volume @# Must choose file9 @# (no more Pool) Scratch + Recycle +@# JobId=18 run level=full pool=Test storage=File NightlySave yes wait message @@ -239,6 +267,7 @@ list volume @sleep 10 @# Must choose file6 @# Used (prunable) + Pool +@# JobId=19 run level=full pool=Test storage=File NightlySave yes wait message @@ -251,6 +280,7 @@ message list volume @# Must choose file7 @# Used (prunable) + oldest + Scratch +@# JobId=20 run level=full pool=Test storage=File NightlySave yes wait message @@ -291,6 +321,7 @@ update Media SET FirstWritten='2005-01-01 01:00:00', LastWritten='2005-01-01 01: WHERE VolumeName IN ('vol47', 'vol48', 'vol49'); list volume +@# JobId=21 run level=full pool=Test NightlySave yes wait messages diff --git a/regress/tests/no-chksum-test b/regress/tests/no-chksum-test index faedfd5b7a..251186b06a 100755 --- a/regress/tests/no-chksum-test +++ b/regress/tests/no-chksum-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory without # md5 signature then restore it. @@ -24,7 +29,7 @@ change_jobname BackupClient1 $JobName start_test cat <$tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out $tmp/log1.out label volume=TestVolume001 storage=File pool=File @@ -57,7 +62,7 @@ run_bconsole rm -f $cwd/build/bigfile cat <$tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out $tmp/log1.out @# don't restore the bigfile, and try to see if it reads the whole volume diff --git a/regress/tests/plugin-test b/regress/tests/plugin-test index 25d11732a9..df2c7e7556 100755 --- a/regress/tests/plugin-test +++ b/regress/tests/plugin-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Attempt to backup and restore a file with the bpipe plugin # @@ -17,7 +22,7 @@ echo "${cwd}/README" >${cwd}/tmp/file-list start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File1 volume=TestVolume001 @@ -31,6 +36,8 @@ messages setdebug level=50 trace=1 client=$CLIENT run job=TestPluginTest storage=File1 yes wait +run job=$JobName fileset=TestPluginSetAcceptFile1 storage=File1 yes +wait status client=$CLIENT messages setdebug level=50 trace=0 client=$CLIENT @@ -40,6 +47,23 @@ END_OF_DATA run_bacula +cat <${cwd}/tmp/bconcmds +@$out $tmp/list +llist pluginrestoreconf jobid=2 +@$out $tmp/conf +llist pluginrestoreconf jobid=2 id=2 +END_OF_DATA + +run_bconsole + +grep string1 $tmp/conf + +cat <$tmp/obj +string1="My string" +string2="My other string" +ok=no +EOF + cat <${cwd}/tmp/bconcmds messages @# @@ -85,6 +109,30 @@ END_OF_DATA run_bacula -d50 run_bconsole +cat <${cwd}/tmp/bconcmds +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log3.out +setdebug level=50 client=$CLIENT trace=1 +@putfile obj1 $tmp/obj +restore pluginrestoreconf="2:obj1" fileset=TestPluginSet where=${cwd}/tmp select all storage=File1 done +yes +wait +setdebug level=0 client=$CLIENT trace=0 +messages +quit +END_OF_DATA + +run_bconsole + +grep "My other string" $working/*trace > /dev/null +if [ $? != 0 ]; then + print_debug "ERROR: Should find plugin restore conf" + estat=1 +fi + cat <${cwd}/tmp/bconcmds messages @# @@ -93,6 +141,12 @@ messages @$out ${cwd}/tmp/log3.out setdebug level=50 client=$CLIENT trace=1 restore fileset=TestPluginSet where=${cwd}/tmp select all storage=File1 done +mod +13 +mod +1 +My new string +yes yes wait setdebug level=0 client=$CLIENT trace=0 @@ -102,6 +156,12 @@ END_OF_DATA run_bconsole +grep "My new string" $working/*trace > /dev/null +if [ $? != 0 ]; then + print_debug "ERROR: Should find second plugin restore conf" + estat=1 +fi + check_for_zombie_jobs storage=File1 stop_bacula # @@ -116,6 +176,32 @@ check_two_logs diff ${cwd}/${file} ${cwd}/tmp/${file} dstat=$? +diff $working/restore.0 $working/torestore.0 +if [ $? != 0 ]; then + print_debug "ERROR: Restore object difference found" + dstat=$? +fi + +# Look if bRC_OK = 0, bRC_Skip = 7 +grep "AcceptFile=takeme.h = 0" $working/*trace > /dev/null +if [ $? != 0 ]; then + print_debug "ERROR: AcceptFile API problem, look at takeme.h" + estat=1 +fi + +grep "excludeme.o = 7" $working/*trace > /dev/null +if [ $? != 0 ]; then + print_debug "ERROR: AcceptFile API problem, look at excludeme.o" + estat=1 +fi + +grep "excludeme.c = 7" $working/*trace > /dev/null +if [ $? != 0 ]; then + print_debug "ERROR: AcceptFile API problem, look at excludeme.c" + estat=1 +fi + + # the test-plugin should create a RestoreObject, just check # compare restore object before/after perl -ne ' diff --git a/regress/tests/prune-base-job-test b/regress/tests/prune-base-job-test index 33d09587d3..cc0e934564 100755 --- a/regress/tests/prune-base-job-test +++ b/regress/tests/prune-base-job-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a basejob backup of the Bacula build directory # then restore it. diff --git a/regress/tests/prune-config-test b/regress/tests/prune-config-test index fed9527751..d47e3eb047 100755 --- a/regress/tests/prune-config-test +++ b/regress/tests/prune-config-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Author: Eric Bollengier, 2010 # License: AGPLv3 diff --git a/regress/tests/prune-copy-test b/regress/tests/prune-copy-test index fe0f3bc444..a52a07c84d 100755 --- a/regress/tests/prune-copy-test +++ b/regress/tests/prune-copy-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # Not yet working # # Run a simple backup of the Bacula build directory then copy it @@ -39,7 +44,7 @@ label storage=DiskChanger volume=ChangerVolume001 slot=1 Pool=Full drive=0 label storage=DiskChanger volume=ChangerVolume002 slot=2 Pool=Full drive=0 @# run two jobs (both will be copied) run job=$JobName level=Full yes -@sleep 5 +wait run job=$JobName level=Full yes wait list jobs diff --git a/regress/tests/prune-migration-test b/regress/tests/prune-migration-test index 0d9d2f41c3..98102cb24c 100755 --- a/regress/tests/prune-migration-test +++ b/regress/tests/prune-migration-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then migrate it # to another device, then see how prune code handle that @@ -39,38 +44,41 @@ label storage=DiskChanger volume=ChangerVolume001 slot=1 Pool=Full drive=0 label storage=DiskChanger volume=ChangerVolume002 slot=2 Pool=Full drive=0 @# run two jobs (both will be migrated) run job=$JobName yes -@sleep 2 +@sleep 4 +wait +@sleep 3 run job=$JobName yes -@sleep 2 wait +@sleep 5 list jobs @# should migrate two jobs -setdebug level=150 storage=File +setdebug level=1 storage=File run job=migrate-job yes +@sleep 3 run job=migrate-job yes wait messages list jobs wait -@sleep 2 +@sleep 3 @# @# Now do another backup, but level Incremental @# run job=$JobName level=Incremental yes wait messages -@sleep 2 +@sleep 3 @################################################################ @$out $cwd/tmp/log10.out setdebug level=1 director sql -SELECT JobId, JobTDate, StartTime, EndTime FROM Job; +SELECT JobId, JobTDate, StartTime, EndTime, Type FROM Job; list jobs prune jobs yes list jobs sql -SELECT JobId, JobTDate, StartTime, EndTime FROM Job; +SELECT JobId, JobTDate, StartTime, EndTime, Type FROM Job; @################################################################ @# now do a restore @@ -102,7 +110,10 @@ check_restore_diff # anymore. See scripts/functions.pm for details. # M M g g F F I0 -> F -$bperl -e "check_prune_list('$tmp/log10.out',1,2,3,4,5,7)" +# Note, for some strange reason, we end either with JobId=5 or +# with JobId=8. Why it changes, I do not know, so we permit +# both of them below (absence of 5 and 8 in the list). +$bperl -e "check_prune_list('$tmp/log10.out',1,2,3,4,7,9)" estat=$(($estat + $?)) end_test diff --git a/regress/tests/prune-test b/regress/tests/prune-test index 27a58b1df0..f677dd4f9a 100755 --- a/regress/tests/prune-test +++ b/regress/tests/prune-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # This script will test prune algo # @@ -10,6 +15,7 @@ JobName=NightlySave scripts/cleanup scripts/copy-test-confs + start_test echo $PWD/build/po > tmp/file-list diff --git a/regress/tests/query-test b/regress/tests/query-test index e7d268d829..2c0fd89e73 100755 --- a/regress/tests/query-test +++ b/regress/tests/query-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then create some # new files, do a Differental then a bunch of query commands @@ -32,7 +37,7 @@ change_jobname CompressedTest $JobName start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File volume=TestVolume001 @@ -51,7 +56,7 @@ echo "ficheriro1.txt" >${cwd}/tmp/build/ficheriro1.txt echo "ficheriro2.txt" >${cwd}/tmp/build/ficheriro2.txt cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out @# Force differental on the second Volume @@ -67,7 +72,7 @@ stop_bacula echo "ficheriro2.txt" >${cwd}/tmp/build/ficheriro2.txt cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out run level=incremental job=$JobName yes diff --git a/regress/tests/recycle-test b/regress/tests/recycle-test index 0d47661a5d..f952c63818 100755 --- a/regress/tests/recycle-test +++ b/regress/tests/recycle-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory but # create three volumes and do six backups causing the @@ -22,9 +27,10 @@ change_jobname NightlySave $JobName start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out +setdebug level=15 storage=File1 label storage=File1 volume=TestVolume001 label storage=File1 volume=TestVolume002 label storage=File1 volume=TestVolume003 @@ -34,50 +40,82 @@ label storage=File1 volume=TestVolume004 @# In that case, either add another volume, or @# increase the volume capacity a bit. update Volume=TestVolume001 volretention=5s -update Volume=TestVolume001 maxvolbytes=200000000 +update Volume=TestVolume001 maxvolbytes=250000000 update Volume=TestVolume002 volretention=5s -update Volume=TestVolume002 maxvolbytes=200000000 +update Volume=TestVolume002 maxvolbytes=250000000 update Volume=TestVolume003 volretention=5s -update Volume=TestVolume003 maxvolbytes=200000000 +update Volume=TestVolume003 maxvolbytes=250000000 update Volume=TestVolume004 volretention=5s -update Volume=TestVolume004 maxvolbytes=200000000 -list volumes -setdebug level=150 storage=File1 -setdebug level=50 dir +update Volume=TestVolume004 maxvolbytes=250000000 +sql +select mediaid,volumename,volstatus,volbytes,maxvolbytes,voljobs,volretention from Media; +select * from JobMedia; +select VolumeName,FirstWritten,LastWritten,VolBytes from Media; + +@#setdebug level=110 storage=File1 +setdebug level=60 dir run job=$JobName storage=File1 level=full yes run job=$JobName storage=File1 level=full yes run job=$JobName storage=File1 level=full yes +sql +select * from JobMedia; +select VolumeName,FirstWritten,LastWritten,VolStatus,VolBytes from Media; + wait messages -list volumes +sql +select mediaid,volumename,volstatus,volbytes,maxvolbytes,voljobs,volretention from Media; +select * from JobMedia; +select VolumeName,FirstWritten,LastWritten,VolStatus,VolBlocks,VolBytes from Media; + @sleep 12 run job=$JobName storage=File1 level=full yes run job=$JobName storage=File1 level=full yes run job=$JobName storage=File1 level=full yes +sql +select * from JobMedia; +select VolumeName,FirstWritten,LastWritten,VolStatus,VolBlocks,VolBytes from Media; + wait messages -list volumes +sql +select mediaid,volumename,volstatus,volbytes,maxvolbytes,voljobs,volretention from Media; +select * from JobMedia; +select VolumeName,FirstWritten,LastWritten,VolStatus,VolBlocks,VolBytes from Media; + @sleep 12 run job=$JobName storage=File1 level=full yes run job=$JobName storage=File1 level=full yes run job=$JobName storage=File1 level=full yes wait messages -list volumes +sql +select mediaid,volumename,volstatus,volbytes,maxvolbytes,voljobs,volretention from Media; +select * from JobMedia; +select VolumeName,FirstWritten,LastWritten,VolStatus,VolBlocks,VolBytes from Media; + @sleep 12 run job=$JobName storage=File1 level=full yes run job=$JobName storage=File1 level=full yes run job=$JobName storage=File1 level=full yes wait messages -list volumes +sql +select mediaid,volumename,volstatus,volbytes,maxvolbytes,voljobs,volretention from Media; +select * from JobMedia; +select VolumeName,FirstWritten,LastWritten,VolStatus,VolBlocks,VolBytes from Media; + @sleep 12 run job=$JobName storage=File1 level=full yes run job=$JobName storage=File1 level=full yes run job=$JobName storage=File1 level=full yes wait messages -list volumes +sql +select mediaid,volumename,volstatus,volbytes,maxvolbytes,voljobs,volretention from Media; +select * from JobMedia; +select VolumeName,FirstWritten,LastWritten,VolStatus,VolBlocks,VolBytes from Media; + @# @# now do a restore @# diff --git a/regress/tests/regexwhere-test b/regress/tests/regexwhere-test index 6ab02e2cd6..c2fa8ea88f 100755 --- a/regress/tests/regexwhere-test +++ b/regress/tests/regexwhere-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Test file relocation feature # diff --git a/regress/tests/relabel-tape b/regress/tests/relabel-tape index 9ff96c59fa..f1a0a5a12d 100755 --- a/regress/tests/relabel-tape +++ b/regress/tests/relabel-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory using the compressed option # then backup four times, each with incremental then finally restore. diff --git a/regress/tests/reload-test b/regress/tests/reload-test index a49dc8b019..d826445157 100755 --- a/regress/tests/reload-test +++ b/regress/tests/reload-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # test the reload and test command # @@ -18,7 +23,7 @@ detect_error() $bin/bacula-dir -t $conf/bacula-dir.conf 2>&1 >> $tmp/testconf.log if [ $? = 0 ]; then estat=1 - print_debug "Should detect error on bacula-dir.conf" + print_debug "ERROR: Should detect error on bacula-dir.conf" fi } @@ -28,18 +33,18 @@ do_reload() reload messages EOF - cat $tmp/bcons | $bin/bconsole -c $conf/bconsole.conf 2>&1 >>$tmp/reload.log + cat $tmp/bcons | $bin/bconsole -c $conf/bconsole.conf 2>&1 | tee -a $tmp/reload.log ps $pid > /dev/null if [ $? != 0 ]; then estat=1 - print_debug "Bacula shouldn't die with a reload" + print_debug "ERROR: Bacula shouldn't die with a reload" fi ls -l /proc/$pid/fd | grep bacula-dir.conf if [ $? = 0 ]; then estat=1 - print_debug "Should not have bacula-dir.conf open" + print_debug "ERROR: Should not have bacula-dir.conf open" fi } @@ -49,18 +54,20 @@ start_test $bin/bacula-dir -t $conf/bacula-dir.conf if [ $? != 0 ]; then estat=1 - print_debug "Error on bacula-dir.conf" + print_debug "ERROR: Error on bacula-dir.conf" fi $bin/bacula-ctl-dir start >/dev/null pid=`cat $working/bacula-dir.$BASEPORT.pid` -read a + +echo "bacula-dir pid is $pid" + sleep 2 ls -l /proc/$pid/fd | grep bacula-dir.conf if [ $? = 0 ]; then estat=1 - print_debug "Should not have bacula-dir.conf open" + print_debug "ERROR: Should not have bacula-dir.conf open" fi # should work well diff --git a/regress/tests/remote-fd-test b/regress/tests/remote-fd-test deleted file mode 100755 index f99703c59a..0000000000 --- a/regress/tests/remote-fd-test +++ /dev/null @@ -1,116 +0,0 @@ -#!/bin/sh -# -# What to test -# ------------ -# - Normal backup -# - Weird backup -# - Restore -# - Accurate backup -# - Compression -# - Checksum -# - TLS/Encryption -# - compare files -# - runscript -# -# How to use this test -# -------------------- -# -# -TestName="remote-fd-test" -JobName=backup -. scripts/functions - -scripts/cleanup -scripts/copy-test-confs - -change_jobname NightlySave $JobName -change_jobname MonsterSave AccurateTest - -start_test - -echo $REMOTE_FILE/save > $tmp/file-list - -ssh $REMOTE_ADDR test -x /opt/bacula/bin/bacula-fd -if [ $? != 0 ]; then - print_debug "ERROR: Need to install bacula on $REMOTE_ADDR" - echo "ERROR: Need to install bacula on $REMOTE_ADDR" - exit 1 -fi - -$bperl -e remote_stop -$bperl -e remote_init -$bperl -e remote_config -cfg=$conf/bacula-dir.conf -$bperl -e "add_attribute('$cfg', 'clientrunbeforejob', '$REMOTE_FILE/save/test.sh', 'Job', 'CompressedTest')" -$bperl -e "add_attribute('$cfg', 'accurate', 'yes', 'Job', 'AccurateTest')" -$bperl -e "add_attribute('$cfg', 'address', '$REMOTE_ADDR', 'Client')" -$bperl -e "add_attribute('$cfg', 'password', '$REMOTE_PASSWORD', 'Client')" -$bperl -e "add_attribute('$cfg', 'address', '$REMOTE_STORE_ADDR', 'Storage')" - -cat <${cwd}/tmp/bconcmds -@output -messages -@$out ${cwd}/tmp/log4.out -status client -@$out ${cwd}/tmp/log1.out -label storage=File volume=TestVolume001 -run job=$JobName storage=File yes -wait -messages -@# -@# now do a restore -@# -@$out ${cwd}/tmp/log2.out -restore where=$REMOTE_FILE/restore select all done storage=File -yes -wait -messages -@$out ${cwd}/tmp/log3.out -@# -@# make some runscript tests -@# -run job=CompressedTest storage=File yes -wait -messages -@$out ${cwd}/tmp/log1.out -@# -@# make some accurate tests -@# -run job=AccurateTest storage=File yes -wait -messages -run job=AccurateTest storage=File yes -wait -messages -@output -quit -END_OF_DATA - -run_bacula -check_for_zombie_jobs storage=File -stop_bacula - -check_two_logs - -version=`$bin/bacula-dir -? | awk '/Version:/ { print $2 }'` -version_fd=`awk '/Version:/ { print $3 }' $tmp/log4.out` - -if [ "$version" != "$version_fd" ]; then - print_debug "ERROR: client version doesn't match $version ($version_fd)" - estat=1 -fi - -grep 'this is a script' $tmp/log3.out > /dev/null -if [ $? != 0 ]; then - print_debug "ERROR: Can't find runscript output" - bstat=1 -fi - -$bperl -e remote_diff -if [ $? != 0 ]; then - dstat=1 -fi - -$bperl -e remote_stop - -end_test diff --git a/regress/tests/restart-accurate-job-test b/regress/tests/restart-accurate-job-test index e2e5dec6b4..a5ad839bc8 100755 --- a/regress/tests/restart-accurate-job-test +++ b/regress/tests/restart-accurate-job-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a backup of the build directory but force it to have # a comm error, and check that it restarts correctly. @@ -9,6 +14,8 @@ JobName=RestartJob scripts/cleanup scripts/copy-test-confs + + echo "${cwd}/build" >${cwd}/tmp/file-list change_jobname NightlySave $JobName @@ -18,7 +25,7 @@ start_test touch $cwd/build/po/testfile cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File volume=TestVolume001 @@ -38,7 +45,7 @@ run_bacula scripts/check_for_zombie_jobs storage=File cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null @$out ${cwd}/tmp/log1.out setdebug level=0 trace=0 hangup=50 client @exec "sh -c 'touch $cwd/build/po/*'" diff --git a/regress/tests/restart-base-job-test b/regress/tests/restart-base-job-test index 42d6a5894d..72a1b918d5 100755 --- a/regress/tests/restart-base-job-test +++ b/regress/tests/restart-base-job-test @@ -1,8 +1,16 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a backup of the build directory but force it to have # a comm error, and check that it restarts correctly. # +# NOTE!!! This test will always fail, because currently we cannot +# restart a Backup Job that has Base files specified. +# TestName="restart-base-job-test" JobName=RestartJobWithBase . scripts/functions @@ -18,7 +26,7 @@ $bperl -e "add_attribute('$conf/bacula-dir.conf', 'Accurate', 'yes', 'Job', '$Jo start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File volume=TestVolume001 @@ -45,7 +53,7 @@ run_bacula scripts/check_for_zombie_jobs storage=File cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @# @# now do a restore @@ -59,7 +67,7 @@ quit END_OF_DATA run_bconsole -scripts/check_for_zombie_jobs storage=File +scripts/check_for_zombie_jobs storage=File1 stop_bacula check_two_logs @@ -81,4 +89,3 @@ if [ $nb_F -gt 1000000 ]; then estat=2 fi -end_test diff --git a/regress/tests/restart-job-test b/regress/tests/restart-job-test index 4c36734d00..c1ead85e2e 100755 --- a/regress/tests/restart-job-test +++ b/regress/tests/restart-job-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a backup of the build directory but force it to have # a comm error, and check that it restarts correctly. @@ -9,18 +14,20 @@ JobName=RestartJob scripts/cleanup scripts/copy-test-confs + + echo "${cwd}/build" >${cwd}/tmp/file-list change_jobname NightlySave $JobName start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out -setdebug level=0 trace=0 hangup=100 client +setdebug level=0 trace=0 hangup=596 client @#setdebug level=20 dir -label storage=File volume=TestVolume001 +label storage=File volume=TestVolume001 slot=1 drive=0 run job=$JobName yes wait messages @@ -35,7 +42,7 @@ run_bacula scripts/check_for_zombie_jobs storage=File cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @# @# now do a restore diff --git a/regress/tests/restore-by-file-tape b/regress/tests/restore-by-file-tape index 51a9b8f1ca..07dda9addd 100755 --- a/regress/tests/restore-by-file-tape +++ b/regress/tests/restore-by-file-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # to a tape where the maximum tape file size is set to 1M diff --git a/regress/tests/restore-by-file-test b/regress/tests/restore-by-file-test index 18bc7f72c7..9dbeb4c316 100755 --- a/regress/tests/restore-by-file-test +++ b/regress/tests/restore-by-file-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory using the compressed option # then restore it. @@ -24,7 +29,7 @@ change_jobname CompressedTest $JobName start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File volume=TestVolume001 diff --git a/regress/tests/restore-disk-seek-test b/regress/tests/restore-disk-seek-test index 495bb45ca2..d82c67ca81 100755 --- a/regress/tests/restore-disk-seek-test +++ b/regress/tests/restore-disk-seek-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a backup of the full bacula build directory, but with the # Maximum File Size set. Then do a restore of a few files to kick in @@ -49,7 +54,7 @@ change_jobname CompressedTest $JobName start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File volume=TestVolume001 diff --git a/regress/tests/restore-replace-never-test b/regress/tests/restore-replace-never-test index d5542cec86..b06098f4ac 100755 --- a/regress/tests/restore-replace-never-test +++ b/regress/tests/restore-replace-never-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory using the compressed option # then restore it. @@ -10,23 +15,24 @@ JobName=restore-replace-never scripts/cleanup scripts/copy-test-confs + mkdir -p ${cwd}/tmp/dir/dir1 + +# use non usual rights to compare +chmod 711 ${cwd}/tmp/dir/dir1 +GRP=`id -G` # should display the group list +set $GRP # affect $1, $2 to this list +chgrp $2 ${cwd}/tmp/dir/dir1 # the first one is the default, choose the 2nd + touch ${cwd}/tmp/dir/dir1/file1 touch ${cwd}/tmp/dir/dir1/file2 echo ${cwd}/tmp/dir >${cwd}/tmp/file-list -stat ${cwd}/tmp/dir >${cwd}/tmp/1 -stat ${cwd}/tmp/dir/dir1 >>${cwd}/tmp/1 -stat ${cwd}/tmp/dir/dir1/file1 >>${cwd}/tmp/1 -stat ${cwd}/tmp/dir/dir1/file2 >>${cwd}/tmp/1 -# Strip Change: lines -grep -v "Change:" ${cwd}/tmp/1 >${cwd}/tmp/stat-before - change_jobname CompressedTest $JobName start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File volume=TestVolume001 @@ -38,14 +44,12 @@ END_OF_DATA run_bacula -rm -rf ${cwd}/tmp/dir - cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log2.out -restore where=/ storage=File replace=never select all done yes -@#restore where=/ storage=File select all done yes +restore where=$cwd/tmp storage=File replace=never select all done yes +@#restore storage=File select all done yes wait messages quit @@ -53,22 +57,12 @@ END_OF_DATA run_bconsole -stat ${cwd}/tmp/dir >${cwd}/tmp/1 -stat ${cwd}/tmp/dir/dir1 >>${cwd}/tmp/1 -stat ${cwd}/tmp/dir/dir1/file1 >>${cwd}/tmp/1 -stat ${cwd}/tmp/dir/dir1/file2 >>${cwd}/tmp/1 -# Strip Change: lines -grep -v "Change:" ${cwd}/tmp/1 >${cwd}/tmp/stat-after - check_for_zombie_jobs storage=File stop_bacula check_two_logs -if test "$debug" -eq 1 ; then - diff -u ${cwd}/tmp/stat-before ${cwd}/tmp/stat-after -else - diff -u ${cwd}/tmp/stat-before ${cwd}/tmp/stat-after 2>&1 >/dev/null -fi + +scripts/diff.pl -s ${cwd}/tmp/dir -d ${cwd}/tmp/$cwd/tmp/dir if [ $? != 0 ]; then dstat=1 fi diff --git a/regress/tests/restore-seek-tape b/regress/tests/restore-seek-tape index 53bf6de6d2..48473233fe 100755 --- a/regress/tests/restore-seek-tape +++ b/regress/tests/restore-seek-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # to a tape where the maximum tape file size is set to 1M diff --git a/regress/tests/restore2-by-file-test b/regress/tests/restore2-by-file-test index 7b3c2ecee0..e4391bea51 100755 --- a/regress/tests/restore2-by-file-test +++ b/regress/tests/restore2-by-file-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory using the compressed option # then restore a few selected files. @@ -15,7 +20,7 @@ change_jobname CompressedTest $JobName start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File volume=TestVolume001 diff --git a/regress/tests/runscript-test b/regress/tests/runscript-test index ef024c21fd..7d87172430 100755 --- a/regress/tests/runscript-test +++ b/regress/tests/runscript-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Test RunScript # @@ -21,7 +26,7 @@ echo "${cwd}/build/po" >${cwd}/tmp/file-list start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages label volume=TestVolume001 pool=Scratch setdebug dir level=200 diff --git a/regress/tests/scratch-pool-test b/regress/tests/scratch-pool-test index 01723d1537..17274e1648 100755 --- a/regress/tests/scratch-pool-test +++ b/regress/tests/scratch-pool-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # to two tapes where the maximum tape file size is set to 1M @@ -36,7 +41,7 @@ start_test # Write out bconsole commands cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=tape volume=TestVolume001 slot=1 pool=Scratch drive=0 @@ -54,6 +59,11 @@ llist volume=TestVolume001 @# @# now do a restore @# +@# Check if JobMedia OK (run under Aligned) +sql +select jobid, mediaid, firstindex,lastindex,volindex from JobMedia order by jobid,volindex; +select * from JobMedia order by jobid,volindex; + @$out ${cwd}/tmp/log2.out restore where=${cwd}/tmp/bacula-restores select all storage=tape done yes diff --git a/regress/tests/scratchpool-pool-test b/regress/tests/scratchpool-pool-test index 194a19eb6f..401b8f7772 100755 --- a/regress/tests/scratchpool-pool-test +++ b/regress/tests/scratchpool-pool-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # to two tapes where the maximum tape file size is set to 1M @@ -15,7 +20,7 @@ JobName=scratchpool-pool . scripts/functions # This test hangs so disable it -exit +#exit cwd=`pwd` scripts/cleanup @@ -34,12 +39,13 @@ start_test # Write out bconsole commands cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=tape volume=TestVolume001 slot=1 pool=SpecialScratch drive=0 label storage=tape volume=TestVolume002 slot=2 pool=SpecialScratch drive=0 -label storage=tape volume=TestVolume003 slot=3 pool=Scratch drive=0 +@#label storage=tape volume=TestVolume003 slot=3 pool=SpecialScratch drive=0 +label storage=tape volume=TestVolume004 slot=4 pool=Scratch drive=0 show pool=Default show pool=Special @######################## @@ -61,9 +67,13 @@ messages @######################## @# no more volume in SpecialScratch (but Scrach have one) run job=$JobName pool=Special level=Full yes -wait mount -@sleep 1 +@# Wait mount seems to be broken so use sleep instead +@#wait mount +@sleep 10 +@# At this point jobid=3 should be blocked waiting for +@# the sysop to create a new Volume, so cancel the job cancel jobid=3 +wait messages @$out ${cwd}/tmp/log4.out list volume pool=Special @@ -113,7 +123,7 @@ if [ $? -ne 0 ]; then dstat=2 fi -grep 'Backup Error' tmp/log3.out > /dev/null +grep 'Backup Canceled' tmp/log3.out > /dev/null if [ $? -ne 0 ]; then print_debug "Job 3 should be in error" dstat=2 diff --git a/regress/tests/short-incremental-test b/regress/tests/short-incremental-test index 2fe51dd101..7556e4a0e6 100755 --- a/regress/tests/short-incremental-test +++ b/regress/tests/short-incremental-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then create some # new files, do an Incremental and restore those two files. @@ -21,11 +26,11 @@ change_jobname CompressedTest $JobName start_test cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out -@#setdebug level=100 storage=File -@#setdebug level=200 client +setdebug level=200 storage=File +setdebug level=200 client @#setdebug level=100 director label storage=File volume=TestVolume001 label storage=File volume=TestVolume002 @@ -46,11 +51,13 @@ echo "ficheriro1.txt" >${tmpsrc}/ficheriro1.txt cp -f ${tmpsrc}/dird.c ${tmpsrc}/ficheriro2.txt cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out @# Force Incremental on the second Volume -update volume=TestVolume001 VolStatus=Used +@#update volume=TestVolume001 VolStatus=Used +setdebug level=4 storage=File +setdebug level=4 client run level=Differential job=$JobName yes wait messages @@ -60,10 +67,10 @@ END_OF_DATA run_bconsole cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out -setdebug level=200 storage=File +setdebug level=4 storage=File run level=Incremental job=$JobName yes wait messages diff --git a/regress/tests/six-vol-test b/regress/tests/six-vol-test index 3bc11d2607..32b8a27df3 100755 --- a/regress/tests/six-vol-test +++ b/regress/tests/six-vol-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Create a 60MB file with random bytes. Back it up to 6 Volumes # each constrained to 10MB using the automatic labeling feature. @@ -27,10 +32,10 @@ change_jobname MultiVol $JobName start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out -setdebug level=150 storage=File +setdebug level=50 storage=File run job=$JobName storage=File yes run job=$JobName storage=File yes run job=$JobName storage=File yes @@ -47,7 +52,7 @@ sql select * from JobMedia where JobId=4; select * from JobMedia where JobId=5; -setdebug level=150 storage=File +setdebug level=50 storage=File restore where=${cwd}/tmp/bacula-restores select storage=File unmark * mark * @@ -63,6 +68,7 @@ check_for_zombie_jobs storage=File stop_bacula check_two_logs -diff ${cwd}/tmp/largefile ${cwd}/tmp/bacula-restores${cwd}/tmp/largefile 2>&1 >/dev/null +#diff ${cwd}/tmp/largefile ${cwd}/tmp/bacula-restores${cwd}/tmp/largefile 2>&1 >/dev/null +diff ${cwd}/tmp/largefile ${cwd}/tmp/bacula-restores${cwd}/tmp/largefile dstat=$? end_test diff --git a/regress/tests/slow-test b/regress/tests/slow-test index d33ed91f68..d33a586c9a 100755 --- a/regress/tests/slow-test +++ b/regress/tests/slow-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Create a very slow job so that I can stop jobs cancel # jobs and restart jobs for testing. @@ -15,14 +20,14 @@ change_jobname CompressedTest $JobName start_test cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out -@#setdebug level=100 storage=File +@#setdebug level=100 storage=File1 @#setdebug level=200 client @#setdebug level=100 director -label storage=File volume=TestVolume001 -label storage=File volume=TestVolume002 +label storage=File1 volume=TestVolume001 slot=1 drive=0 +label storage=File1 volume=TestVolume002 slot=1 drive=0 setbandwidth client=$CLIENT limit=100 run job=$JobName yes status client @@ -34,7 +39,7 @@ END_OF_DATA run_bacula -check_for_zombie_jobs storage=File +check_for_zombie_jobs storage=File1 #stop_bacula check_two_logs diff --git a/regress/tests/small-file-size-tape b/regress/tests/small-file-size-tape index 2e1dc65e1d..68faeee704 100755 --- a/regress/tests/small-file-size-tape +++ b/regress/tests/small-file-size-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # to a tape where the maximum tape file size is set to 1M @@ -26,6 +31,11 @@ messages label storage=tape volume=TestVolume001 slot=0 pool=Default setdebug level=2 storage=tape run job=$JobName yes +run level=Full job=$JobName yes +run level=Full job=$JobName yes +@exec "sh -c 'touch ${cwd}/build/*.o +run job=$JobName yes +@exec "sh -c 'touch ${cwd}/build/*.o wait messages @# diff --git a/regress/tests/source-addr-test b/regress/tests/source-addr-test index 800c5b813e..48c746ff9a 100755 --- a/regress/tests/source-addr-test +++ b/regress/tests/source-addr-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # then restore it. diff --git a/regress/tests/span-vol-test b/regress/tests/span-vol-test index 4f3cdd8ab9..a5c7df543e 100755 --- a/regress/tests/span-vol-test +++ b/regress/tests/span-vol-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory but # split the archive into four volumes, two of which are @@ -17,7 +22,7 @@ change_jobname NightlySave $JobName start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File1 volume=TestVolume004 diff --git a/regress/tests/sparse-compressed-test b/regress/tests/sparse-compressed-test index 8226371a13..0c8b75a85f 100755 --- a/regress/tests/sparse-compressed-test +++ b/regress/tests/sparse-compressed-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory using the Sparse option # then restore it. @@ -15,7 +20,7 @@ echo "${cwd}/build" >${cwd}/tmp/file-list start_test cat >${cwd}/tmp/bconcmds <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File volume=TestVolume001 diff --git a/regress/tests/sparse-lzo-test b/regress/tests/sparse-lzo-test index 343f0936db..999d3f7970 100755 --- a/regress/tests/sparse-lzo-test +++ b/regress/tests/sparse-lzo-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory using the Sparse option # then restore it. @@ -15,7 +20,7 @@ echo "${cwd}/build" >${cwd}/tmp/file-list start_test cat >${cwd}/tmp/bconcmds <${cwd}/tmp/file-list start_test cat >${cwd}/tmp/bconcmds <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out label storage=File volume=TestVolume001 @@ -62,7 +67,7 @@ run_bacula check_for_zombie_jobs storage=File cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${tmp}/log1.out END_OF_DATA @@ -98,7 +103,7 @@ do done cat <${tmp}/bconcmds -@$out /dev/null +@output /dev/null messages @# @# now do a restore diff --git a/regress/tests/stats-test b/regress/tests/stats-test index 51b6c3192d..00771dd0c6 100755 --- a/regress/tests/stats-test +++ b/regress/tests/stats-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Do some tests with statistics commands # diff --git a/regress/tests/storageid-test-changer b/regress/tests/storageid-test-changer deleted file mode 100755 index bcb1ebf2d8..0000000000 --- a/regress/tests/storageid-test-changer +++ /dev/null @@ -1,162 +0,0 @@ -#!/bin/sh -# -# Run backups with dummy tape driver -# This test setups an Autochanger with 80 slots -# and 5 drives (3 LTO3 and 2 LTO1) -# -# TAPE_DRIVE="$cwd/working/ach/drive0" -# TAPE_DRIVE1="$cwd/working/ach/drive0" -# AUTOCHANGER="$cwd/working/ach/conf" -# USE_VTAPE=yes -# AUTOCHANGER_SCRIPT=disk-changer -# - -TestName="storageid-test-changer" -JobName=backup -. scripts/functions - -require_vtape - -scripts/cleanup -scripts/copy-tape-confs -cp $rscripts/bacula-dir-vtape.conf $conf/bacula-dir.conf -cp $rscripts/bacula-sd-vtape.conf $conf/bacula-sd.conf -scripts/prepare-fake-autochanger - -echo "${cwd}/build" >${cwd}/tmp/file-list - -start_test - -when1=`perl -MPOSIX -e "print strftime('%F %T', localtime(time+30))"` -when2=`perl -MPOSIX -e "print strftime('%F %T', localtime(time+45))"` - -clientname=`awk '/Name = .*-fd/ { if (!ok) { print $3 ; ok=1 } }' bin/bacula-dir.conf` - -# Catalog record for cleaning tape "CLN01" successfully created. -# CLN01 | Cleaning - -# Write out bconsole commands -cat <${cwd}/tmp/bconcmds -@$out /dev/null -messages -@$out ${cwd}/tmp/log6.out -@#setdebug level=200 storage=LTO1 -label barcodes pool=Scratch slots=1-4 storage=LTO1-ANSI_6 drive=6 -yes -label barcodes pool=Scratch slots=15-25 storage=LTO1 drive=3 -yes -messages -list volumes -END_OF_DATA - -run_bacula - -cat <${cwd}/tmp/bconcmds -@$out ${cwd}/tmp/log7.out -label barcodes pool=Scratch slots=41-50 storage=LTO3 drive=0 -yes -sql -SELECT Storage.Name, VolumeName, Slot, InChanger, Pool.Name - FROM Media JOIN Storage USING (StorageId) JOIN Pool USING (PoolId); - -messages -list volumes -@$out ${cwd}/tmp/log1.out -run storage=LTO3_0 job=NightlySave pool=Inc yes -wait -messages -run storage=LTO3_0 job=NightlySave2 pool=Full yes -wait -messages -@$out ${cwd}/tmp/log4.out -setdebug level=51 trace=1 dir -@exec "touch $cwd/build/po/fr.po" -run storage=LTO3_1 job=NightlySave pool=Inc yes -wait -setdebug level=0 trace=0 dir -messages -@$out ${cwd}/tmp/log1.out -run storage=LTO1_4 job=NightlySave pool=Inc yes -wait -messages -sql -SELECT Storage.Name, MediaType, VolumeName, Slot, InChanger, Pool.Name - FROM Media JOIN Storage USING (StorageId) JOIN Pool USING (PoolId); - -@$out ${cwd}/tmp/log2.out -restore storage=LTO3_1 client=$clientname -3 -1,2,3 -m * -done -yes -wait -messages -quit -END_OF_DATA - -run_bconsole -check_for_zombie_jobs storage=LTO1 client=$clientname - -grep 'Volume ".*" previously written, moving' $cwd/tmp/log4.out > /dev/null -if [ $? -ne 0 ]; then - print_debug "ERROR: Job 3 should re-use a volume" - estat=1 -fi - -grep "Call prune_volumes" $working/*trace > /dev/null -if [ $? -eq 0 ]; then - print_debug "ERROR: Job 3 should re-use a volume, not try to prune one" - estat=1 -fi - -grep "after get scratch volume ok=" $working/*trace > /dev/null -if [ $? -eq 0 ]; then - print_debug "ERROR: Job 3 should re-use a volume, not try to get a scratch one" - estat=1 -fi - -# remove volume vol20 from autochanger -grep -v vol20 ${cwd}/working/ach/barcodes > ${cwd}/tmp/1 -cp ${cwd}/tmp/1 ${cwd}/working/ach/barcodes - -cat <${cwd}/tmp/bconcmds -@$out ${cwd}/tmp/log3.out -list volume=vol20 -update slots slots=5-40 storage=LTO1 drive=3 -list volume=vol20 -sql -SELECT Storage.Name, VolumeName, Slot, InChanger, Pool.Name - FROM Media JOIN Storage USING (StorageId) JOIN Pool USING (PoolId); - -END_OF_DATA - -run_bconsole - -stop_bacula - -touch ${cwd}/tmp/log2.out -check_two_logs -check_restore_diff - -# get InChanger flag -RES=`awk -F'|' '/vol20.+Append/ { print $11 }' ${cwd}/tmp/log3.out` -set "$RES" -if [ "$1" = "$2" ]; then - echo "Error in update slots" - bstat=1 -fi - -grep LTO1_5 tmp/log1.out > /dev/null -if test $? = 0; then - echo "AutoSelect option broken" - bstat=1 -fi - -grep 'Error: Re-read' tmp/log1.out > /dev/null -if test $? = 0; then - echo "Found Re-read errors" - bstat=1 -fi - -end_test diff --git a/regress/tests/strip-test b/regress/tests/strip-test index cadac49f6d..869969ac7c 100755 --- a/regress/tests/strip-test +++ b/regress/tests/strip-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Attempt to strip the path # @@ -25,7 +30,7 @@ change_jobname NightlySave $JobName start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @# @# Do a backup @@ -47,7 +52,7 @@ run_bacula rm -rf ${cwd}/tmp/bacula-restores cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @# @# now do a restore diff --git a/regress/tests/test-plugin-test b/regress/tests/test-plugin-test index 60cdf9d301..7c21a7f94e 100755 --- a/regress/tests/test-plugin-test +++ b/regress/tests/test-plugin-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run test-plugin-fd. Note, this plugin is for testing # new features and probably should not be run in normal @@ -8,22 +13,22 @@ TestName="test-plugin-test" JobName=TestPluginTest . scripts/functions -# Build and install the test plugin -cd ${cwd}/build/src/plugins/fd -make -make install-test-plugin -cd ${cwd} - scripts/cleanup scripts/copy-plugin-confs file=encrypt-bug.jpg rm -rf ${cwd}/tmp/* echo "${cwd}/build/src" >${cwd}/tmp/file-list +# Build and install the test plugin +cd ${cwd}/build/src/plugins/fd +make +make install-test-plugin +cd ${cwd} + start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out label storage=File1 volume=TestVolume001 diff --git a/regress/tests/test0 b/regress/tests/test0 index 0d0edd0b85..fd4d3b652d 100755 --- a/regress/tests/test0 +++ b/regress/tests/test0 @@ -1,3 +1,8 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + echo " " >test.out rm -f bin/working/* diff --git a/regress/tests/three-pool-recycle-test b/regress/tests/three-pool-recycle-test deleted file mode 100755 index 2a145a1211..0000000000 --- a/regress/tests/three-pool-recycle-test +++ /dev/null @@ -1,105 +0,0 @@ -#!/bin/sh -# -# This is Arno's test. It uses three pools, three tapes, and -# an autochanger. Note, the Director has four Pools in its -# conf: Default, Full, Inc, and Scratch. Default is used in the -# NightlySave job by default. What is backed up is what -# is in ${cwd}/tmp/file-list, which is by default the Bacula -# source code (i.e. the build directory). -# -# Note, we use the virtual disk autochanger. -# -TestName="three-pool-recycle-test" -JobName=Three-pool-recycle -. scripts/functions - -cwd=`pwd` -scripts/cleanup -scripts/copy-2disk-confs -scripts/prepare-disk-changer - -# remove Client Run Before Job -cp ${cwd}/bin/bacula-dir.conf ${cwd}/tmp/1 -sed "s%Client Run Before Job%#Client Run Before Job%" ${cwd}/tmp/1 >${cwd}/bin/bacula-dir.conf - -echo "${cwd}/build" >${cwd}/tmp/file-list - -start_test - -# Write out bconsole commands to a file -cat <${cwd}/tmp/bconcmds -@$out /dev/null -messages -@$out ${cwd}/tmp/log1.out -@#setdebug level=150 storage=tape -label storage=tape volume=TestVolume001 slot=1 pool=Full drive=0 -label storage=tape volume=TestVolume002 slot=2 pool=Default drive=0 -label storage=tape volume=TestVolume003 slot=3 pool=Scratch drive=0 -update Volume=TestVolume001 maxvoljobs=1 -update Volume=TestVolume002 maxvoljobs=1 -update Volume=TestVolume003 volretention=7s -update Volume=TestVolume003 maxvoljobs=1 -list volumes -llist volume=TestVolume003 -@# should pull Scratch volume -run job=NightlySave1 level=Full pool=Inc yes -wait -update Volume=TestVolume003 volretention=7s -update Volume=TestVolume003 maxvoljobs=1 -messages -list volumes -llist volume=TestVolume003 -run job=NightlySave1 level=Full pool=Default yes -wait -messages -list volumes -llist volume=TestVolume003 -run job=NightlySave1 level=Full pool=Full yes -wait -@sleep 10 -messages -list volumes -llist volume=TestVolume003 -@# should recycle Scratch pool -run job=NightlySave2 level=Full pool=Inc yes -wait -update Volume=TestVolume003 volretention=7s -update Volume=TestVolume003 maxvoljobs=1 -@sleep 10 -messages -list volumes -@# should recycle Scratch pool -llist volume=TestVolume003 -@#setdebug level=50 dir -run job=NightlySave2 level=Full pool=Default yes -wait -update Volume=TestVolume003 volretention=7s -update Volume=TestVolume003 maxvoljobs=1 -@sleep 10 -messages -list volumes -@# should recycle Scratch pool -run job=NightlySave2 level=Full pool=Full yes -status storage=tape -messages -wait -list volumes -messages -@# -@# now do a restore -@# -@$out ${cwd}/tmp/log2.out -restore where=${cwd}/tmp/bacula-restores select all storage=tape done -yes -wait -messages -quit -END_OF_DATA - -run_bacula -check_for_zombie_jobs storage=tape -stop_bacula - -check_two_logs -check_restore_diff -end_test diff --git a/regress/tests/tls-authenticate-test b/regress/tests/tls-authenticate-test index bded674a21..59c7ad18d6 100755 --- a/regress/tests/tls-authenticate-test +++ b/regress/tests/tls-authenticate-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory with TLS # communications code enabled then restore it. @@ -15,7 +20,7 @@ change_jobname CompressedTest $JobName start_test cat <tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out tmp/log1.out setdebug level=100 dir diff --git a/regress/tests/tls-duplicate-job-test b/regress/tests/tls-duplicate-job-test index eca7106f2f..f41faea66a 100755 --- a/regress/tests/tls-duplicate-job-test +++ b/regress/tests/tls-duplicate-job-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # TestName="tls-duplicate-job-test" @@ -6,7 +11,7 @@ TestName="tls-duplicate-job-test" scripts/cleanup scripts/copy-tls-confs -echo "${cwd}/build/technotes" >${cwd}/tmp/file-list +echo "${cwd}/build/ChangeLog" >${cwd}/tmp/file-list # increase the maximum concurrent jobs for FD, SD and DIR perl -Mscripts::functions -e 'set_maximum_concurrent_jobs("$conf/bacula-dir.conf",100)' @@ -45,7 +50,7 @@ when=`perl -Mscripts::functions -e "get_time(300)"` start_test cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out messages @@ -155,22 +160,29 @@ check_two_logs grep '^| *[0-9]' $tmp/log7.out > /dev/null if [ $? = 0 ]; then - print_debug "ERROR: Found errors in $tmp/log7.out" - print_debug `cat $tmp/log7.out` + print_debug "ERROR: Found errors in $tmp/log7.out. Jobs that 'Should fail' are OK (T) and/or Jobs that 'Should work' are in Error (A, a, f, ...)" + if [ "$debug" -eq 1 ]; then + cat $tmp/log7.out + fi estat=1 fi grep '^| *[0-9]' $tmp/log8.out > /dev/null if [ $? = 0 ]; then - print_debug "ERROR: Found errors in $tmp/log8.out" - print_debug `cat $tmp/log8.out` + print_debug "ERROR: Found errors in $tmp/log8.out. Jobs that 'Should fail' are OK (T) and/or Jobs that 'Should work' are in Error (A, a, f, ...)" + if [ "$debug" -eq 1 ]; then + cat $tmp/log8.out + fi estat=1 fi nb=`grep '^| *[0-9]' $tmp/log9.out | wc -l` if [ $nb -lt 10 ]; then - print_debug "ERROR: less than 10 lines of SQL output in $tmp/log9.out" - print_debug `cat $tmp/log9.out` + print_debug "ERROR: less than 10 lines of SQL output in $tmp/log9.out. Jobs that 'Should fail' are OK (T) and/or Jobs that 'Should work' are in Error (A, a, f, ...)" + if [ "$debug" -eq 1 ]; then + cat $tmp/log9.out + fi + estat=1 fi diff --git a/regress/tests/tls-test b/regress/tests/tls-test index f390f2ce57..6973c192da 100755 --- a/regress/tests/tls-test +++ b/regress/tests/tls-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory with TLS # communications code enabled then restore it. diff --git a/regress/tests/truncate-bug-tape b/regress/tests/truncate-bug-tape index 3979c87cc4..d5df7a720b 100755 --- a/regress/tests/truncate-bug-tape +++ b/regress/tests/truncate-bug-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Test for a tape truncation bug. # diff --git a/regress/tests/two-jobs-test b/regress/tests/two-jobs-test index ef88177e9a..c28fb06229 100755 --- a/regress/tests/two-jobs-test +++ b/regress/tests/two-jobs-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory using the compressed option # then backup a second time and finally restore it @@ -12,12 +17,23 @@ scripts/cleanup scripts/copy-test-confs echo "${cwd}/build" >${cwd}/tmp/file-list +#echo "${cwd}/build/src/Makefile" >${cwd}/tmp/file-list +#echo "${cwd}/build/src/Makefile.in" >>${cwd}/tmp/file-list +#echo "${cwd}/build/src/testprogs.tar.gz" >>${cwd}/tmp/file-list +#echo "${cwd}/build/src/dummy" >>${cwd}/tmp/file-list +#echo "${cwd}/build/src/stored" >>${cwd}/tmp/file-list +#echo "${cwd}/build/src/dird" >>${cwd}/tmp/file-list +#echo "${cwd}/build/src/filed" >>${cwd}/tmp/file-list +#echo "${cwd}/build/src/console" >>${cwd}/tmp/file-list +#echo "${cwd}/build/src/qt-console" >>${cwd}/tmp/file-list +#echo "${cwd}/build/src/cats" >>${cwd}/tmp/file-list + change_jobname CompressedTest $JobName start_test cat >tmp/bconcmds <tmp/bconcmds <tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out tmp/log1.out -setdebug level=150 storage=tape +setdebug level=20 storage=tape label storage=tape volume=TestVolume001 slot=1 pool=Full drive=0 label storage=tape volume=TestVolume002 slot=2 pool=Default drive=0 list volumes diff --git a/regress/tests/two-vol-test b/regress/tests/two-vol-test index a6d84ee1f0..a766efe72c 100755 --- a/regress/tests/two-vol-test +++ b/regress/tests/two-vol-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory but # split the archive into two volumes @@ -16,7 +21,7 @@ change_jobname NightlySave $JobName start_test cat <tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out tmp/log1.out label storage=File1 volume=TestVolume002 diff --git a/regress/tests/two-volume-changer b/regress/tests/two-volume-changer index 5e3462570a..6941bcd679 100755 --- a/regress/tests/two-volume-changer +++ b/regress/tests/two-volume-changer @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # to two tapes where the maximum tape file size is set to 1M diff --git a/regress/tests/two-volume-test b/regress/tests/two-volume-test index 00ced3b4a1..fa5a9e24d1 100755 --- a/regress/tests/two-volume-test +++ b/regress/tests/two-volume-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # to two tapes where the maximum tape file size is set to 1M @@ -28,7 +33,7 @@ start_test # Write out bconsole commands cat <tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out tmp/log1.out label storage=tape volume=TestVolume001 slot=1 pool=Default drive=0 @@ -36,17 +41,23 @@ label storage=tape volume=TestVolume002 slot=2 pool=Default drive=0 update Volume=TestVolume001 MaxVolBytes=3000000 pool=Default drive=0 sql select * from Storage; -select VolumeName,InChanger,StorageId from Media; +select VolumeName,InChanger,slot,StorageId from Media; @#setdebug level=1000 client=$CLIENT +list volumes run job=$JobName yes wait +messages +sql +select VolumeName,InChanger,slot,StorageId from Media; + update slots scan storage=tape +messages sql select * from Storage; -select VolumeName,InChanger,StorageId from Media; +select VolumeName,InChanger,slot,StorageId from Media; +select jobid,mediaid,startblock,endblock from JobMedia; -messages @# @# now do a restore @# diff --git a/regress/tests/usr-tape-root b/regress/tests/usr-tape-root index 86f8748ef4..95e764e02b 100755 --- a/regress/tests/usr-tape-root +++ b/regress/tests/usr-tape-root @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the /usr directory # then restore it. diff --git a/regress/tests/verify-cat-test b/regress/tests/verify-cat-test index acbabd5179..f79cb3ad50 100755 --- a/regress/tests/verify-cat-test +++ b/regress/tests/verify-cat-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple Verify InitCatalog, then Verify Catalog # diff --git a/regress/tests/verify-vol-tape b/regress/tests/verify-vol-tape index 91ee840b3b..7acc4bacda 100755 --- a/regress/tests/verify-vol-tape +++ b/regress/tests/verify-vol-tape @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # then verify the catalog. diff --git a/regress/tests/verify-vol-test b/regress/tests/verify-vol-test index 36368e5dac..3509ea6232 100755 --- a/regress/tests/verify-vol-test +++ b/regress/tests/verify-vol-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # then verify the catalog. @@ -22,7 +27,7 @@ change_jobname NightlySave $JobName start_test cat <tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out tmp/log1.out setdebug level=1 storage=File sd diff --git a/regress/tests/verify-voltocat-test b/regress/tests/verify-voltocat-test index 206c65f5e4..fa140833c6 100755 --- a/regress/tests/verify-voltocat-test +++ b/regress/tests/verify-voltocat-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # then verify the Volume to the catalog. @@ -16,7 +21,7 @@ change_jobname NightlySave $JobName start_test cat <tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out tmp/log0.out setdebug level=1 storage=File sd diff --git a/regress/tests/virtual-backup-test b/regress/tests/virtual-backup-test index 800ab152c1..8289be98db 100755 --- a/regress/tests/virtual-backup-test +++ b/regress/tests/virtual-backup-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then do a # Virtual Full backup to another device. @@ -26,7 +31,7 @@ start_test # Write out bconsole commands cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out @#setdebug level=100 storage=File @@ -67,8 +72,8 @@ done yes list volumes @# should Consolidate Full, Differential and Incremental -setdebug level=150 storage=DiskChanger -setdebug level=100 dir +@#setdebug level=150 storage=DiskChanger +@#setdebug level=100 dir run job=$JobName level=VirtualFull yes wait messages diff --git a/regress/tests/virtual-backup2-test b/regress/tests/virtual-backup2-test index fd93c30c1a..f9802e54ca 100755 --- a/regress/tests/virtual-backup2-test +++ b/regress/tests/virtual-backup2-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory then do a # Virtual Full backup to another device. @@ -26,7 +31,7 @@ start_test # Write out bconsole commands cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out setdebug level=150 storage=DiskChanger diff --git a/regress/tests/virtual-changer-test b/regress/tests/virtual-changer-test index a937ddaab6..3111d39981 100755 --- a/regress/tests/virtual-changer-test +++ b/regress/tests/virtual-changer-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory. Create three # tapes, each in a different pool, then run two jobs both of which @@ -42,10 +47,10 @@ sed -f ${outf} ${cwd}/tmp/1 >${cwd}/bin/bacula-dir.conf # Write out bconsole commands cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out ${cwd}/tmp/log1.out -setdebug level=200 storage=Virtual +setdebug level=50 storage=Virtual @#setdebug level=200 client=$CLIENT label storage=Virtual volume=TestVolume001 slot=1 Pool=Default drive=0 label storage=Virtual volume=TestVolume002 slot=2 Pool=Full drive=0 @@ -71,7 +76,7 @@ END_OF_DATA run_bacula cat <${cwd}/tmp/bconcmds -@$out /dev/null +@output /dev/null messages @# @# now do a restore diff --git a/regress/tests/virtualfull-extreme-concurrency-bug-test b/regress/tests/virtualfull-extreme-concurrency-bug-test deleted file mode 100755 index 756f4496d5..0000000000 --- a/regress/tests/virtualfull-extreme-concurrency-bug-test +++ /dev/null @@ -1,258 +0,0 @@ -#!/bin/sh -# -# Test for a bug that causes massively parallel virtual full jobs to -# deadlock. First create a lot of backups, then run -# virtual fulls on them. -# -TestName="virtualfull-extreme-concurrency-bug-test" -. scripts/functions - -# Setup conf files -scripts/cleanup -scripts/copy-test-confs -cp scripts/virtualfull-extreme-bacula-dir.conf bin/bacula-dir.conf -cp scripts/migrate-bacula-sd.conf bin/bacula-sd.conf - -# we have 20 distinct jobs. Each of those is run once at full level, -# then four times incremental, each time adding data so we end up with -# many used volumes. -# We should have jobs where several virtual fulls compete for volumes. - - -# Backup Bacula stored+objects directory -# Backup director -rm -rf ${tmpsrc} -mkdir ${tmpsrc} -echo "${tmpsrc}" >${tmp}/file-list -for i in `ls ${src}/src/stored/*` ; do - cp -p $i ${tmpsrc} -done -# Get path to temp source files to restore - -start_test - -cat <${cwd}/tmp/bconcmds -@output /dev/null -messages -@$out ${cwd}/tmp/log1.out -@# No prelabeled volumes needed since they are automatically created -@#label storage=File slot=0 drive=0 Pool=Hot1 volume=Vol1 -@#list volumes -END_OF_DATA - -# Start Bacula and do label -run_bacula - -cat <${cwd}/tmp/bconcmds -@output /dev/null -messages -@$out ${cwd}/tmp/log0.out -run job=HotV01 level=Full yes -run job=HotV02 level=Full yes -run job=HotV03 level=Full yes -run job=HotV04 level=Full yes -run job=HotV05 level=Full yes -run job=HotV06 level=Full yes -run job=HotV07 level=Full yes -run job=HotV08 level=Full yes -run job=HotV09 level=Full yes -run job=HotV10 level=Full yes -run job=HotV11 level=Full yes -run job=HotV12 level=Full yes -run job=HotV13 level=Full yes -run job=HotV14 level=Full yes -run job=HotV15 level=Full yes -run job=HotV16 level=Full yes -run job=HotV17 level=Full yes -run job=HotV18 level=Full yes -run job=HotV19 level=Full yes -run job=HotV20 level=Full yes -wait -list volumes -messages -END_OF_DATA - -run_bconsole - -cat <${cwd}/tmp/bconcmds -@output /dev/null -messages -END_OF_DATA - -# add more files to backup source, so following incrementals -# have something to back up -for a in wx-console filed lib tools ; do - #echo ">>> adding ${a} to backup" - for i in `ls ${src}/src/${a}/*` ; do - cp -p "$i" ${tmpsrc} >/dev/null 2>&1 - done - #echo "now $(ls ${tmpsrc}|wc -l) files to back up" - - cat <${cwd}/tmp/bconcmds -@$out ${cwd}/tmp/log1.out a -time -run job=HotV01 level=Incremental yes -run job=HotV02 level=Incremental yes -run job=HotV03 level=Incremental yes -run job=HotV04 level=Incremental yes -run job=HotV05 level=Incremental yes -run job=HotV06 level=Incremental yes -run job=HotV07 level=Incremental yes -run job=HotV08 level=Incremental yes -run job=HotV09 level=Incremental yes -run job=HotV10 level=Incremental yes -run job=HotV11 level=Incremental yes -run job=HotV12 level=Incremental yes -run job=HotV13 level=Incremental yes -run job=HotV14 level=Incremental yes -run job=HotV15 level=Incremental yes -run job=HotV16 level=Incremental yes -run job=HotV17 level=Incremental yes -run job=HotV18 level=Incremental yes -run job=HotV19 level=Incremental yes -run job=HotV20 level=Incremental yes -wait -list volumes -messages -END_OF_DATA -# Run Backup Jobs - run_bconsole -done - -# now do the final virtual full levels. -#echo ">>>> Now the 1st VFull" - -cat <${cwd}/tmp/bconcmds -@output /dev/null -messages -@$out ${cwd}/tmp/log1.out a -@#setdebug level=100 storage -run job=HotV01 level=VirtualFull yes -run job=HotV02 level=VirtualFull yes -run job=HotV03 level=VirtualFull yes -run job=HotV04 level=VirtualFull yes -run job=HotV05 level=VirtualFull yes -run job=HotV06 level=VirtualFull yes -run job=HotV07 level=VirtualFull yes -run job=HotV08 level=VirtualFull yes -run job=HotV09 level=VirtualFull yes -run job=HotV10 level=VirtualFull yes -run job=HotV11 level=VirtualFull yes -run job=HotV12 level=VirtualFull yes -run job=HotV13 level=VirtualFull yes -run job=HotV14 level=VirtualFull yes -run job=HotV15 level=VirtualFull yes -run job=HotV16 level=VirtualFull yes -run job=HotV17 level=VirtualFull yes -run job=HotV18 level=VirtualFull yes -run job=HotV19 level=VirtualFull yes -run job=HotV20 level=VirtualFull yes -wait -sql -select pool.name as poolname,volumename,volstatus,volbytes,voljobs,lastwritten from Pool,Media where Pool.PoolId=Media.MediaId order by poolname,volumename; - -list jobs -messages -END_OF_DATA - -# Run Virtual Full Jobs -run_bconsole - -# add more files to backup source, so following incrementals -# have something to back up -for a in `seq 1 12` ; do - #echo ">>> adding files to backup: ${a}" - for b in `seq 1 150` ; do - date > "${tmpsrc}/run${a}-${b}.data" - done - #echo "now $(ls ${tmpsrc}|wc -l) files to back up" - - cat <${cwd}/tmp/bconcmds -@$out ${cwd}/tmp/log1.out a -time -run job=HotV01 level=Incremental yes -run job=HotV02 level=Incremental yes -run job=HotV03 level=Incremental yes -run job=HotV04 level=Incremental yes -run job=HotV05 level=Incremental yes -run job=HotV06 level=Incremental yes -run job=HotV07 level=Incremental yes -run job=HotV08 level=Incremental yes -run job=HotV09 level=Incremental yes -run job=HotV10 level=Incremental yes -run job=HotV11 level=Incremental yes -run job=HotV12 level=Incremental yes -run job=HotV13 level=Incremental yes -run job=HotV14 level=Incremental yes -run job=HotV15 level=Incremental yes -run job=HotV16 level=Incremental yes -run job=HotV17 level=Incremental yes -run job=HotV18 level=Incremental yes -run job=HotV19 level=Incremental yes -run job=HotV20 level=Incremental yes -wait -list volumes -messages -END_OF_DATA -# Run Backup Jobs - run_bconsole -done - -# restore file list -ls ${tmpsrc}/* >${tmp}/restore-list - -# now do the final virtual full levels. -#echo ">>>> Now the 2nd VFull" - -cat <${cwd}/tmp/bconcmds -@output /dev/null -messages -@$out ${cwd}/tmp/log1.out a -@#setdebug level=100 storage -run job=HotV01 level=VirtualFull yes -run job=HotV02 level=VirtualFull yes -run job=HotV03 level=VirtualFull yes -run job=HotV04 level=VirtualFull yes -run job=HotV05 level=VirtualFull yes -run job=HotV06 level=VirtualFull yes -run job=HotV07 level=VirtualFull yes -run job=HotV08 level=VirtualFull yes -run job=HotV09 level=VirtualFull yes -run job=HotV10 level=VirtualFull yes -run job=HotV11 level=VirtualFull yes -run job=HotV12 level=VirtualFull yes -run job=HotV13 level=VirtualFull yes -run job=HotV14 level=VirtualFull yes -run job=HotV15 level=VirtualFull yes -run job=HotV16 level=VirtualFull yes -run job=HotV17 level=VirtualFull yes -run job=HotV18 level=VirtualFull yes -run job=HotV19 level=VirtualFull yes -run job=HotV20 level=VirtualFull yes -wait -sql -select pool.name as poolname,volumename,volstatus,volbytes,voljobs,lastwritten from Pool,Media where Pool.PoolId=Media.MediaId order by poolname,volumename; - -list jobs -messages -END_OF_DATA - -# Run Virtual Full Jobs -run_bconsole -cat <${cwd}/tmp/bconcmds -@output /dev/null -messages -@$out ${cwd}/tmp/log2.out -restore client=HotV20-fd where=$tmp/bacula-restores select all done yes -wait -messages -END_OF_DATA - -# Do restore -run_bconsole -sleep 2 -stop_bacula - -check_two_logs -check_restore_tmp_build_diff -end_test diff --git a/regress/tests/vol-duration-changer b/regress/tests/vol-duration-changer index a27a6c75d8..f02a492197 100755 --- a/regress/tests/vol-duration-changer +++ b/regress/tests/vol-duration-changer @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory but # create two volumes and set a short Volume duration on diff --git a/regress/tests/vtape-big-test-changer b/regress/tests/vtape-big-test-changer index a29b9fd155..80954afb9f 100755 --- a/regress/tests/vtape-big-test-changer +++ b/regress/tests/vtape-big-test-changer @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run backups with dummy tape driver # This test setups an Autochanger with 800 slots @@ -101,15 +106,19 @@ run level=full storage=LTO3 when="$when1" job=NightlySave9 pool=Full yes @#sleep 30 cancel 1 +yes @sleep 1 cancel 1 +yes @sleep 1 cancel 1 +yes @sleep 1 cancel 1 +yes wait messages quit diff --git a/regress/tests/vtape-bug-1288 b/regress/tests/vtape-bug-1288 index ef7eedaf3b..07ffde089d 100755 --- a/regress/tests/vtape-bug-1288 +++ b/regress/tests/vtape-bug-1288 @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run backups with dummy tape driver # This test setups an Autochanger with 80 slots @@ -26,7 +31,7 @@ sed -i 's/Pool {/Pool { LabelFormat = "vol"/' bin/bacula-dir.conf sed -i 's/SpoolData = yes/SpoolData = no/' bin/bacula-dir.conf sed -i 's/Maximum Volume Size = 30M//' bin/bacula-sd.conf sed -i 's/Maximum File Size = 7M//' bin/bacula-sd.conf -sed -i 's!Client Run Before Job = "sleep 2"!!' bin/bacula-dir.conf +sed -i 's!Client Run Before Job = "/bin/sleep 2"!!' bin/bacula-dir.conf scripts/prepare-fake-autochanger echo "${cwd}/build" >${cwd}/tmp/file-list diff --git a/regress/tests/vtape-test-changer b/regress/tests/vtape-test-changer deleted file mode 100755 index ddd4133bfc..0000000000 --- a/regress/tests/vtape-test-changer +++ /dev/null @@ -1,143 +0,0 @@ -#!/bin/sh -# -# Run backups with dummy tape driver -# This test setups an Autochanger with 80 slots -# and 5 drives (3 LTO3 and 2 LTO1) -# -# TAPE_DRIVE="$cwd/working/ach/drive0" -# TAPE_DRIVE1="$cwd/working/ach/drive0" -# AUTOCHANGER="$cwd/working/ach/conf" -# USE_VTAPE=yes -# AUTOCHANGER_SCRIPT=disk-changer -# - -TestName="vtape-test-changer" -JobName=backup -. scripts/functions - -require_vtape - -scripts/cleanup -scripts/copy-tape-confs -cp $rscripts/bacula-dir-vtape.conf $conf/bacula-dir.conf -cp $rscripts/bacula-sd-vtape.conf $conf/bacula-sd.conf -scripts/prepare-fake-autochanger - -echo "${cwd}/build" >${cwd}/tmp/file-list - -start_test - -when1=`perl -MPOSIX -e "print strftime('%F %T', localtime(time+30))"` -when2=`perl -MPOSIX -e "print strftime('%F %T', localtime(time+45))"` - -clientname=`awk '/Name = .*-fd/ { if (!ok) { print $3 ; ok=1 } }' bin/bacula-dir.conf` - -# Catalog record for cleaning tape "CLN01" successfully created. -# CLN01 | Cleaning - -# Write out bconsole commands -cat <${cwd}/tmp/bconcmds -@$out /dev/null -messages -@$out ${cwd}/tmp/log6.out -@#setdebug level=200 storage=LTO1 -label barcodes pool=Scratch slots=1-14 storage=LTO1-ANSI_6 drive=6 -yes -label barcodes pool=Scratch slots=15-40 storage=LTO1 drive=3 -yes -messages -list volumes -END_OF_DATA - -run_bacula - -cat <${cwd}/tmp/bconcmds -@$out ${cwd}/tmp/log7.out -label barcodes pool=Scratch slots=41-80 storage=LTO3 drive=0 -yes -messages -list volumes -@$out ${cwd}/tmp/log1.out -run storage=LTO3 when="$when1" job=NightlySave pool=Inc yes -run storage=LTO3 when="$when1" job=NightlySave2 pool=Full yes -run storage=LTO3 when="$when1" job=NightlySave1 pool=Default yes - -run storage=LTO1 when="$when1" job=NightlySave pool=Inc yes -run storage=LTO1 when="$when1" job=NightlySave2 pool=Full yes -run storage=LTO1 when="$when1" job=NightlySave1 pool=Default yes -run storage=LTO1 when="$when1" job=NightlySave3 pool=Diff yes - -run storage=LTO1-ANSI_6 when="$when2" job=NightlySave pool=Inc yes -wait -messages -quit -END_OF_DATA - -run_bconsole -check_for_zombie_jobs storage=LTO1 client=$clientname -check_for_zombie_jobs storage=LTO3 client=$clientname -check_for_zombie_jobs storage=LTO1-ANSI_6 client=$clientname - -touch ${cwd}/build/po/*.po - -cat <${cwd}/tmp/bconcmds -@$out ${cwd}/tmp/log2.out -run storage=LTO1-ANSI_6 job=NightlySave3 pool=Inc yes -wait -messages -@# -@# now do a restore -@# -restore client=$clientname fileset="Full Set" pool=Diff where=${cwd}/tmp/bacula-restores select all done -yes -wait -messages -wait -messages -END_OF_DATA - -run_bconsole -check_for_zombie_jobs storage=LTO1 client=$clientname -check_for_zombie_jobs storage=LTO3 client=$clientname -check_for_zombie_jobs storage=LTO1-ANSI_6 client=$clientname - -# test update slots -# remove volume vol35 from autochanger -grep -v vol35 ${cwd}/working/ach/barcodes > ${cwd}/tmp/1 -cp ${cwd}/tmp/1 ${cwd}/working/ach/barcodes - -cat <${cwd}/tmp/bconcmds -@$out ${cwd}/tmp/log3.out -list volume=vol35 -update slots slots=15-40 storage=LTO1 drive=3 -list volume=vol35 -END_OF_DATA - -run_bconsole - -stop_bacula - -check_two_logs -check_restore_diff - -# get InChanger flag -RES=`awk -F'|' '/vol35.+Append/ { print $11 }' ${cwd}/tmp/log3.out` -set $RES -if [ $1 -eq $2 ]; then - print_debug "ERROR: Error in update slots" - bstat=1 -fi - -grep LTO1_5 tmp/log1.out > /dev/null -if test $? = 0; then - print_debug "ERROR: AutoSelect option broken" - bstat=1 -fi - -grep 'Error: Re-read' tmp/log1.out > /dev/null -if test $? = 0; then - print_debug "ERROR: Found Re-read errors" - bstat=1 -fi - -end_test diff --git a/regress/tests/weird-files-test b/regress/tests/weird-files-test index 4bc02c675b..416cdc76dd 100755 --- a/regress/tests/weird-files-test +++ b/regress/tests/weird-files-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # then restore it. @@ -34,7 +39,7 @@ cd .. start_test cat <tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out tmp/log1.out label storage=File diff --git a/regress/tests/weird-files2-test b/regress/tests/weird-files2-test index 0dc17aa872..c94629bceb 100755 --- a/regress/tests/weird-files2-test +++ b/regress/tests/weird-files2-test @@ -1,4 +1,9 @@ #!/bin/sh +# +# Copyright (C) 2000-2015 Kern Sibbald +# License: BSD 2-Clause; see file LICENSE-FOSS +# + # # Run a simple backup of the Bacula build directory # then restore it. @@ -25,10 +30,11 @@ cd .. change_jobname NightlySave $JobName start_test -bin/testls weird-files2 | grep -v sock-file >${cwd}/tmp/original +#bin/testls weird-files2 | grep -v sock-file >${cwd}/tmp/original +bin/testls weird-files2 >${cwd}/tmp/original cat <tmp/bconcmds -@$out /dev/null +@output /dev/null messages @$out tmp/log1.out label storage=File volume=TestVolume001 @@ -51,7 +57,7 @@ rm -f soft-file2 ln -s soft-file3 soft-file2 cd ${cwd} cat <tmp/bconcmds -@$out /dev/null +@output /dev/null messages @# @# now do a restore diff --git a/regress/tests/win32-backup-tape b/regress/tests/win32-backup-tape deleted file mode 100755 index ca27fd5006..0000000000 --- a/regress/tests/win32-backup-tape +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/sh -# -# Run a simple backup of the Bacula build directory -# to a tape then restore it, we do that twice to ensure that -# we can correctly append to a tape. -# -TestName="win32-backup-tape" -JobName=win32tape -. scripts/functions - -require_tape_drive - -scripts/copy-win32-confs -scripts/cleanup-tape - -echo "${cwd}/build" >${cwd}/tmp/file-list - -change_jobname $JobName -start_test - -cat <tmp/bconcmds -@$out /dev/null -messages -@$out tmp/log1.out -label storage=tape volume=TestVolume001 slot=0 pool=Default drive=0 -run job=$JobName yes -@sleep 10 -status storage=tape -@sleep 30 -messages -wait -messages -@# -@# now do a restore -@# -@$out tmp/log2.out -restore where=${cwd}/tmp/bacula-restores select all storage=tape done -yes -wait -messages -END_OF_DATA - -run_bacula -check_for_zombie_jobs storage=tape -stop_bacula - -check_two_logs -# no diff for now -dstat=0 -end_test diff --git a/regress/tests/win32-fd-test b/regress/tests/win32-fd-test deleted file mode 100755 index 43f3b8064f..0000000000 --- a/regress/tests/win32-fd-test +++ /dev/null @@ -1,110 +0,0 @@ -#!/bin/sh -# -# How to use this test -# -------------------- -# -# * Get a working Windows OS on your network -# * Set the proper environment variables for WIN32_xx at the end -# of your regress/config file -# * Install strawberry perl version with msi -# http://www.bacula.org/downloads/depkgs-mingw32/strawberry-perl-5.10.1.0.msi -# * Install the latest version of Bacula FD -# * Copy or make accessible (Network share, VirtualBox share) -# regress/scripts/regress-win32.pl -# * Execute the script on the Windows box -# perl regress-win32.pl -# Note, this is a server so the script just waits for Bacula -# to run and connect to it. -# * Create c:\regress\test on the Windows machine -# * Allow ports through the Win firewall for perl 8091 and bacula-fd 9102 -# * If you put bacula binaries in release32 and release64, the script will -# update binaries -# * Run win32-fd-test regression -# -TestName="win32-fd-test" -JobName=win32 -. scripts/functions - -scripts/cleanup -scripts/copy-test-confs -cp scripts/win32-bacula-dir.conf bin/bacula-dir.conf - -change_jobname NightlySave $JobName -start_test - -URL=http://$WIN32_ADDR:8091 -echo "Doing wgets ..." -wget -qO $tmp/stop.log "$URL/stop" -wget -qO $tmp/update.log "$URL/set_director_name?name=$HOST-dir;pass=$WIN32_PASSWORD" -wget -qO $tmp/start.log "$URL/start" - -wget -qO $tmp/init1.log "$URL/init_attrib_test?source=$WIN32_FILE" -wget -qO $tmp/init2.log "$URL/init_weird_runscript_test?source=$WIN32_FILE" -wget -qO $tmp/clean.log "$URL/cleandir?source=$WIN32_FILE/restore" - -# try to upgrade win32 binaries -update_win32 - -cat <${cwd}/tmp/bconcmds -@output -messages -@$out ${cwd}/tmp/log1.out -status client=$WIN32_CLIENT -label storage=File volume=TestVolume001 -run job=$JobName storage=File yes -wait -messages -@# -@# now do a restore -@# -@$out ${cwd}/tmp/log2.out -restore where=$WIN32_FILE/restore select all done storage=File -yes -wait -messages -@$out ${cwd}/tmp/log3.out -@# -@# make some runscript tests -@# -run job=RunScript storage=File yes -wait -messages -@$out ${cwd}/tmp/log4.out -@# -@# make some accurate tests -@# -run job=AccurateJob storage=File yes -wait -messages -@output -quit -END_OF_DATA - -run_bacula -check_for_zombie_jobs storage=File -stop_bacula - -check_two_logs - -DST=`echo $WIN32_FILE | sed 's!:!!'` - -# Compare original and restored directories -wget -qO $tmp/1.log "$URL/compare?source=$WIN32_FILE/attrib_test;dest=$WIN32_FILE/restore/$DST/attrib_test" -print_debug `cat $tmp/1.log` -rstat=0 -grep OK $tmp/1.log > /dev/null -if [ $? != 0 ]; then - rstat=1 -fi - -# Compare with some weird files -wget -qO $tmp/2.log "$URL/compare?source=$WIN32_FILE/weird_runscript;dest=$WIN32_FILE/restore/$DST/weird_runscript" -print_debug `cat $tmp/2.log` - -grep OK $tmp/2.log > /dev/null -if [ $? != 0 ]; then - rstat=2 -fi - -dstat=0 -end_test diff --git a/regress/tests/win32-full-systemstate-test b/regress/tests/win32-full-systemstate-test deleted file mode 100755 index 80c8bca0f3..0000000000 --- a/regress/tests/win32-full-systemstate-test +++ /dev/null @@ -1,265 +0,0 @@ -#!/bin/sh -# -# How to use this test -# -------------------- -# -# * Get a working Windows OS on your network -# * Install strawberry perl version with msi to c:/strawberry -# http://www.bacula.org/downloads/depkgs-mingw32/strawberry-perl-5.10.1.0.msi -# * Install the latest version of Bacula FD -# * Copy or make accessible (Network share, VirtualBox share) -# regress/scripts/regress-win32.pl -# * Execute the script on the Windows box -# perl regress-win32.pl -# Note: port 8091 must be opened in the firewall -# * Run this script with the proper config settings about WIN32 -# * do "make sed" if you want to run the test on an other host -# -# Add user auth info to ./config file to enable autologin -# WIN32_USER=Administrator -# WIN32_PASS=PasswordSecret -# -# Note, once everything is setup, and you have run the above once -# you can simply run the first part of this script prior to the URL= -# to get the proper conf files loaded in bin, then manually -# start bacula, and run the "systemstate" backup job, then -# restore it. -# -TestName="win32-full-systemstate-test" -. scripts/functions - -scripts/cleanup -scripts/copy-test-confs -cp scripts/win32-bacula-dir-systemstate.conf bin/bacula-dir.conf - -URL=http://$WIN32_ADDR:8091 -echo "Connect with Win32 server $URL" -wget -qO $tmp/stop.log "$URL/stop" -if [ $? != 0 ]; then - print_debug "ERROR: Stop Windows Bacula FD daemon failed." -fi -wget -qO $tmp/update.log "$URL/set_director_name?name=$HOST-dir;pass=$WIN32_PASSWORD" -if [ $? != 0 ]; then - print_debug "ERROR: Set Windows Bacula director name, pasword failed" -fi -wget -qO $tmp/start.log "$URL/start" -if [ $? != 0 ]; then - print_debug "ERROR: Restart Windows Bacula FD failed" -fi -if [ x$WIN32_USER != x ]; then - wget -qO - "$URL/set_auto_logon?user=$WIN32_USER;pass=$WIN32_PASS" |grep OK - if [ $? != 0 ]; then - print_debug "ERROR: Set autologin failed" - fi -fi -wget -qO - "$URL/add_registry_key?key=Test$$;val=Val$$" | grep OK > /dev/null -if [ $? != 0 ]; then - print_debug "ERROR: Can't add registry key Test$$" -fi -wget -qO - "$URL/add_registry_key?key=RemovedAtRestore$$;val=Val$$" | grep OK > /dev/null -if [ $? != 0 ]; then - print_debug "ERROR: Can't add registry key RemovedAtRestore$$" -fi - -echo "Start test" -start_test - -cat <${cwd}/tmp/bconcmds -@output -messages -@$out ${cwd}/tmp/log1.out -status client=$WIN32_CLIENT -label storage=File volume=TestVolume001 -run job=SystemstateJob storage=File yes -wait -messages -quit -END_OF_DATA - -echo "Run bacula" -run_bacula - -wget -qO - "$URL/del_registry_key?key=RemovedAtRestore$$" | grep OK > /dev/null -if [ $? -ne 0 ]; then - print_debug "ERROR: can't remove key RemovedAtRestore$$ from registry" - estat=1 -fi - -wget -qO - "$URL/add_registry_key?key=NewTest$$;val=Val$$" |grep OK > /dev/null -if [ $? -ne 0 ]; then - print_debug "ERROR: can't add key NewTest$$ to registry" - estat=1 -fi - -cat <${cwd}/tmp/bconcmds -@$out ${cwd}/tmp/log1.out -run job=SystemstateJob storage=File yes -wait -messages -quit -END_OF_DATA - -run_bconsole - -wget -qO - "$URL/add_registry_key?key=OtherTest$$;val=Val$$" |grep OK > /dev/null -if [ $? -ne 0 ]; then - print_debug "ERROR: can't add key OtherTest$$ to registry" - estat=1 -fi - -run_bconsole - -wget -qO - "$URL/add_registry_key?key=Other$$;val=Val$$" |grep OK > /dev/null -if [ $? -ne 0 ]; then - print_debug "ERROR: can't add key Other$$ to registry" - estat=1 -fi - -run_bconsole - -# choose a random file in winsxs, delete it and see if it's restored at the end -# should work only on win2008, win2003 doesn't include this dir in systemstate -$bperl -e 'add_attribute("$conf/bacula-dir.conf", "ClientRunAfterJob", "c:/del.cmd", "Job", "SystemstateJob")' - -wget -qO - "$URL/remove_dir?file=c:/windows/winsxs/*help*;dest=c:/del.cmd" | grep OK > /dev/null -if [ $? -ne 0 ]; then - print_debug "ERROR: can't create c:/del.cmd" - estat=1 -fi - -# should not backup many things, just run the del.cmd command at the end -cat <${cwd}/tmp/bconcmds -reload -@$out ${cwd}/tmp/log1.out -run job=SystemstateJob storage=File yes -wait -messages -quit -END_OF_DATA - -run_bconsole - -wget -qO - "$URL/del_registry_key?key=NewTest$$" | grep OK > /dev/null -if [ $? -ne 0 ]; then - print_debug "ERROR: can't remove key NewTest$$ from registry" - estat=1 -fi - -cat <${cwd}/tmp/bconcmds -@# -@# now do a restore -@# -@$out ${cwd}/tmp/log2.out -restore where=/ storage=File -5 -cd @SYSTEMSTATE -mark "Registry Writer" -done -yes -wait -messages -quit -END_OF_DATA - -run_bconsole - -wget -qO $tmp/start.log "$URL/reboot" - -# we need a way to start the regress-win32.pl at the start -while ! ping -c 1 $WIN32_ADDR > /dev/null; do - sleep 5 -done -echo "Machine $URL supposedly rebooted" - -echo "If the autologon doesn't work, you can double click on c:\\autologon.reg" -i=0 -while ! wget -qO /dev/null $URL/nop; do - sleep 5 - i=`expr $i + 1` - if [ $i -ge 12 ]; then # print message every minute - i=0 - echo "== `date +%T` Waiting for reboot and autologin to $URL, you can also login and start regress-win32.pl by hand" - fi -done - -wget -qO - "$URL/get_registry_key?key=Test$$;val=Val$$" | grep OK > /dev/null -if [ $? -ne 0 ]; then - print_debug "ERROR: Can't find registry key Test$$" - estat=1 -fi - -wget -qO - "$URL/get_registry_key?key=NewTest$$;val=Val$$" | grep OK > /dev/null -if [ $? -ne 0 ]; then - print_debug "ERROR: Can't find registry key NewTest$$" - estat=1 -fi - -wget -qO - "$URL/get_registry_key?key=RemovedAtRestore$$;val=Val$$" | grep ERR > /dev/null -if [ $? -ne 0 ]; then - print_debug "ERROR: Should not find registry key RemovedAtRestore$$" - estat=1 -fi - -################################################################ -# Do a complete restore - -cat <${cwd}/tmp/bconcmds -@# -@# now do a complete restore -@# -@$out ${cwd}/tmp/log2.out -restore where=/ storage=File -5 -cd @SYSTEMSTATE -mark * -done -yes -wait -messages -quit -END_OF_DATA - -run_bconsole - -check_for_zombie_jobs storage=File -stop_bacula - -check_two_logs - -wget -qO $tmp/start.log "$URL/reboot" - -# we need a way to start the regress-win32.pl at the start -while ! ping -c 1 $WIN32_ADDR > /dev/null; do - sleep 5 -done -echo "Machine $URL supposedly rebooted" - -echo "If the autologon doesn't work, you can double click on c:\\autologon.reg" -while ! wget -qO /dev/null $URL/nop; do - sleep 5 - i=`expr $i + 1` - if [ $i -ge 12 ]; then # print message every minute - i=0 - echo "== `date +%T` Waiting for reboot and autologin to $URL, you can also login and start regress-win32.pl by hand" - fi -done - -wget -qO - "$URL/get_registry_key?key=Test$$;val=Val$$" | grep OK > /dev/null -if [ $? -ne 0 ]; then - print_debug "ERROR: Can't find registry key Test$$" - estat=1 -fi - -wget -qO - "$URL/get_registry_key?key=NewTest$$;val=Val$$" | grep OK > /dev/null -if [ $? -ne 0 ]; then - print_debug "ERROR: Can't find registry key NewTest$$" - estat=1 -fi - -wget -qO - "$URL/get_registry_key?key=RemovedAtRestore$$;val=Val$$" | grep ERR > /dev/null -if [ $? -ne 0 ]; then - print_debug "ERROR: Should not find registry key RemovedAtRestore$$" - estat=1 -fi - -end_test diff --git a/regress/tests/win32-mssql-systemstate-test b/regress/tests/win32-mssql-systemstate-test deleted file mode 100755 index 6c57619ba5..0000000000 --- a/regress/tests/win32-mssql-systemstate-test +++ /dev/null @@ -1,186 +0,0 @@ -#!/bin/sh -# -# How to use this test -# -------------------- -# -# * Get a working Windows OS on your network -# * Install strawberry perl version with msi to c:/strawberry -# http://www.bacula.org/downloads/depkgs-mingw32/strawberry-perl-5.10.1.0.msi -# * Install the latest version of Bacula FD -# * Make accessible (Network share, VirtualBox share) -# regress/scripts/regress-win32.pl -# * Execute the script on the Windows box -# perl regress-win32.pl -# * Run this script with the proper config settings about WIN32 -# see win32-fd-test -# -# * Install MSSQL with default options, put database username in config -# WIN32_MSSQL_USER=sa -# WIN32_MSSQL_PASS=password -# -# Note, once everything is setup, and you have run the above once -# you can simply run the first part of this script prior to the URL= -# to get the proper conf files loaded in bin, then manually -# start bacula, and run the "SS_SQLJob" backup job, then -# restore it. -# -TestName="win32-mssql-systemstate-test" -. scripts/functions - -scripts/cleanup -scripts/copy-test-confs -cp scripts/win32-bacula-dir-systemstate.conf bin/bacula-dir.conf - -scripts/setup_win32 - -URL=http://$WIN32_ADDR:8091 - -wget -qO - "$URL/check_mssql?user=$WIN32_MSSQL_USER;pass=$WIN32_MSSQL_PASS" | grep OK > /dev/null -if [ $? != 0 ]; then - echo "check_msql user=$WIN32_MSSQL_USER pass=$WIN32_MSSQL_PASS failed" -fi -wget -qO - "$URL/setup_mssql_db?db=db$$" | grep OK > /dev/null -if [ $? != 0 ]; then - echo "setup_db failed" -fi - -wget -qO - "$URL/add_registry_key?key=Test$$;val=Val$$" | grep OK > /dev/null -if [ $? != 0 ]; then - print_debug "ERROR: Can't add registry key Test$$" -fi -wget -qO - "$URL/add_registry_key?key=RemovedAtRestore$$;val=Val$$" | grep OK > /dev/null -if [ $? != 0 ]; then - print_debug "ERROR: Can't add registry key RemovedAtRestore$$" -fi - -echo "Start test" -start_test - -cat <${cwd}/tmp/bconcmds -@output -messages -@$out ${cwd}/tmp/log1.out -status client=$WIN32_CLIENT -label storage=File volume=TestVolume001 -run job=SS_SQLJob storage=File yes -wait -messages -quit -END_OF_DATA - -run_bacula - -wget -qO - "$URL/del_registry_key?key=RemovedAtRestore$$" | grep OK > /dev/null -if [ $? -ne 0 ]; then - print_debug "ERROR: can't remove key RemovedAtRestore$$ from registry" - estat=1 -fi - -cat <${cwd}/tmp/bconcmds -@output -@$out ${cwd}/tmp/log1.out -run job=SS_SQLJob storage=File yes -wait -messages -quit -END_OF_DATA - -run_bconsole - -wget -qO - "$URL/del_registry_key?key=Test$$" | grep OK > /dev/null -if [ $? -ne 0 ]; then - print_debug "ERROR: can't remove key Test$$ from registry" - estat=1 -fi - -wget -qO - "$URL/cleanup_mssql_db?db=db$$" | grep OK > /dev/null -if [ $? -ne 0 ]; then - print_debug "ERROR: can't remove mssql db$$" - estat=1 -fi - -# the restore contains the name of the SQLServer instance -cat <${cwd}/tmp/bconcmds -@$out ${cwd}/tmp/log3.out -restore where=/ storage=File -5 -cd @MSSQL/ -cd SqlServerWriter/ -cd MSDEWriter/ -@$out ${cwd}/tmp/host.out -ls -@$out ${cwd}/tmp/log3.out -quit -quit -END_OF_DATA - -run_bconsole - -host=`head -2 ${cwd}/tmp/host.out | tail -1` - -cat <${cwd}/tmp/bconcmds -@# -@# now do a restore -@# -@$out ${cwd}/tmp/log2.out -restore where=/ storage=File -5 -cd @SYSTEMSTATE/ -mark Reg* -cd .. -cd @MSSQL/ -cd SqlServerWriter/ -cd MSDEWriter/ -cd $host -m db$$ -done -yes -wait -messages -quit -END_OF_DATA - -run_bconsole - -check_for_zombie_jobs storage=File -stop_bacula - -check_two_logs - -# with SQL 2005, the db is mounted automatically -wget -qO - "$URL/test_mssql_content?db=db$$" | grep OK > /dev/null -if [ $? -ne 0 ]; then - - wget -qO - "$URL/online_mssql_db?mdf=db$$;db=restoredb$$" | grep OK > /dev/null - if [ $? -ne 0 ]; then - print_debug "ERROR: can't put db$$ online" - estat=1 - fi - - wget -qO - "$URL/test_mssql_content?db=restoredb$$" | grep OK > /dev/null - if [ $? -ne 0 ]; then - print_debug "ERROR: can't get content of restoredb$$" - estat=1 - fi - - wget -qO $tmp/cleanup.log "$URL/cleanup_mssql_db?db=restoredb$$" - -else - wget -qO $tmp/cleanup.log "$URL/cleanup_mssql_db?db=db$$" -fi - -scripts/reboot_win32 - -wget -qO - "$URL/get_registry_key?key=RemovedAtRestore$$;val=Val$$" | grep ERR > /dev/null -if [ $? -ne 0 ]; then - print_debug "ERROR: Should not find registry key RemovedAtRestore$$" - estat=1 -fi - -wget -qO - "$URL/get_registry_key?key=Test$$;val=Val$$" | grep OK > /dev/null -if [ $? -ne 0 ]; then - print_debug "ERROR: Can't find registry key Test$$" - estat=1 -fi - -end_test diff --git a/regress/tests/win32-mssql-test b/regress/tests/win32-mssql-test deleted file mode 100755 index 2e0eace541..0000000000 --- a/regress/tests/win32-mssql-test +++ /dev/null @@ -1,106 +0,0 @@ -#!/bin/sh -# -# How to use this test -# -------------------- -# -# * Get a working Windows OS on your network -# * Install strawberry perl version with msi to c:/strawberry -# http://www.bacula.org/downloads/depkgs-mingw32/strawberry-perl-5.10.1.0.msi -# * Install the latest version of Bacula FD -# * Copy or make accessible (Network share, VirtualBox share) -# regress/scripts/regress-win32.pl -# * Execute the script on the Windows box -# perl regress-win32.pl -# * Run this script with the proper config settings about WIN32 -# see win32-fd-test -# -# * Install MSSQL with default options, put database username in config -# WIN32_MSSQL_USER=sa -# WIN32_MSSQL_PASS=password -# -# Note, once everything is setup, and you have run the above once -# you can simply run the first part of this script prior to the URL= -# to get the proper conf files loaded in bin, then manually -# start bacula, and run the "MSSQLJob" backup job, then -# restore it. -# -TestName="win32-mssql-test" -. scripts/functions - -scripts/cleanup -scripts/copy-test-confs -cp scripts/win32-bacula-dir-systemstate.conf bin/bacula-dir.conf - -echo "Connect with Win32 server" -URL=http://$WIN32_ADDR:8091 -wget -qO $tmp/stop.log "$URL/stop" -wget -qO $tmp/update.log "$URL/set_director_name?name=$HOST-dir;pass=$WIN32_PASSWORD" -wget -qO $tmp/start.log "$URL/start" -set -e -wget -qO - "$URL/check_mssql?user=$WIN32_MSSQL_USER;pass=$WIN32_MSSQL_PASS" | grep OK -wget -qO - "$URL/setup_mssql_db?db=db$$" | grep OK -set +e - -echo "Start test" -start_test - -cat <${cwd}/tmp/bconcmds -@output -messages -@$out ${cwd}/tmp/log1.out -status client=$WIN32_CLIENT -label storage=File volume=TestVolume001 -run job=MSSQLJob storage=File yes -wait -messages -quit -END_OF_DATA - -run_bacula - -wget -qO - "$URL/cleanup_mssql_db?db=db$$" | grep OK > /dev/null -if [ $? -ne 0 ]; then - print_debug "ERROR: can't remove mssql db$$" - estat=1 -fi - -cat <${cwd}/tmp/bconcmds -@# -@# now do a restore -@# -@$out ${cwd}/tmp/log2.out -restore where=/ storage=File -5 -cd @MSSQL/ -cd SqlServerWriter/ -cd WIN2003/ -m db$$ -done -yes -wait -messages -quit -END_OF_DATA - -run_bconsole - -check_for_zombie_jobs storage=File -stop_bacula - -check_two_logs - -wget -qO - "$URL/online_mssql_db?mdf=db$$;db=restoredb$$" | grep OK > /dev/null -if [ $? -ne 0 ]; then - print_debug "ERROR: can't put db$$ online" - estat=1 -fi - -wget -qO - "$URL/test_mssql_content?db=restoredb$$" | grep OK > /dev/null -if [ $? -ne 0 ]; then - print_debug "ERROR: can't get content of restoredb$$" - estat=1 -fi - -wget -qO $tmp/cleanup.log "$URL/cleanup_mssql_db?db=restoredb$$" - -end_test diff --git a/regress/tests/win32-systemstate-test b/regress/tests/win32-systemstate-test deleted file mode 100755 index 47498800d5..0000000000 --- a/regress/tests/win32-systemstate-test +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/sh -# -# How to use this test -# -------------------- -# -# * Get a working Windows OS on your network -# * Install strawberry perl version with msi -# http://www.bacula.org/downloads/depkgs-mingw32/strawberry-perl-5.10.1.0.msi -# * Install the latest version of Bacula FD -# * Copy or make accessible (Network share, VirtualBox share) -# regress/scripts/regress-win32.pl -# * Execute the script on the Windows box -# perl regress-win32.pl -# * Run this script with the proper config settings about WIN32 -# -TestName="win32-systemstate-test" -. scripts/functions - -scripts/cleanup -scripts/copy-test-confs -cp scripts/win32-bacula-dir.conf bin/bacula-dir.conf - -URL=http://$WIN32_ADDR:8091 -wget -qO $tmp/stop.log "$URL/stop" -wget -qO $tmp/update.log "$URL/set_director_name?name=$HOST-dir;pass=$WIN32_PASSWORD" -wget -qO $tmp/start.log "$URL/start" - -start_test - -cat <${cwd}/tmp/bconcmds -@output -messages -@$out ${cwd}/tmp/log1.out -status client=$WIN32_CLIENT -label storage=File volume=TestVolume001 -run job=SystemstateJob storage=File yes -wait -messages -@# -@# now do a restore -@# -@$out ${cwd}/tmp/log2.out -restore where=/ storage=File -cd @SYSTEMSTATE -m Reg* -done -yes -wait -messages -quit -END_OF_DATA - -run_bacula -check_for_zombie_jobs storage=File -stop_bacula - -check_two_logs -end_test diff --git a/regress/tests/win32-test b/regress/tests/win32-test deleted file mode 100755 index 9f1568b62c..0000000000 --- a/regress/tests/win32-test +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/sh -# -# Run a simple backup of the Bacula build directory using the compressed option -# then restore it. -# -TestName="win32-test" -JobName=win32 -. scripts/functions - -scripts/cleanup -scripts/copy-test-confs -cp scripts/win32-bacula-dir.conf bin/bacula-dir.conf - -change_jobname NightlySave $JobName -start_test - -cat <${cwd}/tmp/bconcmds -@output -messages -@$out ${cwd}/tmp/log1.out -status all -status all -messages -label storage=File volume=TestVolume001 -setdebug level=100 dir -run job=$JobName storage=File yes -wait -messages -@# -@# now do a restore -@# -@$out ${cwd}/tmp/log2.out -setdebug level=400 trace=1 client=Tibs -restore where=c:/tmp/xxx select storage=File -unmark * -mark * -done -yes -wait -messages -@output -quit -END_OF_DATA - -run_bacula -check_for_zombie_jobs storage=File -stop_bacula - -check_two_logs -# check_restore_diff -dstat=0 -end_test diff --git a/regress/tests/win32-to-linux-tape b/regress/tests/win32-to-linux-tape deleted file mode 100755 index 743945f4a7..0000000000 --- a/regress/tests/win32-to-linux-tape +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/sh -# -# Run a simple backup of the Bacula build directory -# to a tape then restore it, we do that twice to ensure that -# we can correctly append to a tape. -# -TestName="win32-to-linux-tape" -JobName=AutoLabel -. scripts/functions - -require_tape_drive - -scripts/copy-win32-confs -scripts/cleanup-tape - -echo "${cwd}/build" >${cwd}/tmp/file-list - -change_job $JobName -start_test - -cat <tmp/bconcmds -@$out /dev/null -messages -@$out tmp/log1.out -label storage=tape volume=TestVolume001 slot=0 pool=Default drive=0 -run job=NightlySave yes -@sleep 10 -status storage=tape -@sleep 30 -messages -wait -messages -@# -@# now do a restore -@# -@$out tmp/log2.out -restore where=${cwd}/tmp/bacula-restores client=Tibs select all storage=tape done -yes -wait -messages -END_OF_DATA - -run_bacula -check_for_zombie_jobs storage=tape -stop_bacula - -check_two_logs -# No diff for the moment -dstat=0 -end_test